diff --git a/.gitignore b/.gitignore index 0af0cb2b..fb82b3e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,11 @@ -dist/ -build/ .idea/ -.tox/ *__pycache__* *egg-info/ + +docs/.sass-cache/* +docs/_site/* + +Gemfile.lock + +/docs/.jekyll-metadata +/docs/djongocs/assets/* diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..4f305e96 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,14 @@ + +#### One line description of the issue + +#### Python script + + + +```python + + +``` + +#### Traceback + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..b54e9aa7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2018, nesdis + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..6c676983 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +

djongo

+ +[![Build Status](https://travis-ci.com/nesdis/djongo.svg?branch=master)](https://travis-ci.com/nesdis/djongo) +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) +PyPI version + + ## The only connector that lets you use Django with MongoDB *without* changing the Django ORM + +Use MongoDB as a backend database for your Django project, without changing the Django ORM. +Use the Django Admin GUI to add and modify documents in MongoDB. + +## Usage: +
    +
  1. Install djongo: + +``` +pip install djongo +``` +
  2. +
  3. Into settings.py file of your project, add: + +```python +DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + 'CLIENT': { + 'host': 'your-db-host', + } + } +} +``` +
  4. +
  5. Run manage.py makemigrations <app_name> followed by manage.py migrate (ONLY the first time to create collections in mongoDB)
  6. +
  7. YOUR ARE SET! HAVE FUN!
  8. +
+ +## Requirements: + + 1. Python 3.6 or higher. + 2. MongoDB 3.4 or higher. + 3. If your models use nested queries or sub querysets like: + + ```python + inner_qs = Blog.objects.filter(name__contains='Ch').values('name') + entries = Entry.objects.filter(blog__name__in=inner_qs) + ``` + MongoDB 3.6 or higher is required. + +## How it works + +djongo is a SQL to mongodb query compiler. It translates a SQL query string into a mongoDB query document. +As a result, all Django features, models etc. work as is. + + Django contrib modules: +
  
+'django.contrib.admin',
+'django.contrib.auth',    
+'django.contrib.sessions',
+
+
+ and others... fully supported. + +## Features + + * Use Django Admin GUI to access MongoDB. + * Embedded Model. + * Embedded Array. + * Embedded Form Fields. + + Read the [full documentation](https://www.djongomapper.com/) + +## Contribute + +If you think djongo is useful, **please share it** with the world! + +You can contribute to the source code or the documentation by creating a simple pull request! +You may want to refer to the design documentation to get +an idea on how [Django MongoDB connector](https://www.djongomapper.com/djongo/django-mongodb-connector-design-document/) +is implemented. + +Add a star, show some love :) + +## Questions and Discussion + + * [Djongo groups](https://groups.google.com/d/forum/djongo) is where you can watch for new release announcements, suggest improvements, and discuss topics pertaining to Django and MongoDB. + * Issues, where things are not working as expected, please raise a git-hub issue ticket. + * For questions and clarifications regarding usage, please put it up on stackoverflow instead. + diff --git a/docs/.well-known/apple-developer-merchantid-domain-association b/docs/.well-known/apple-developer-merchantid-domain-association new file mode 100755 index 00000000..2ff95c96 --- /dev/null +++ b/docs/.well-known/apple-developer-merchantid-domain-association @@ -0,0 +1 @@ +7B227073704964223A2239373943394538343346343131343044463144313834343232393232313734313034353044314339464446394437384337313531303944334643463542433731222C2276657273696F6E223A312C22637265617465644F6E223A313536363233343735303036312C227369676E6174757265223A22333038303036303932613836343838366637306430313037303261303830333038303032303130313331306633303064303630393630383634383031363530333034303230313035303033303830303630393261383634383836663730643031303730313030303061303830333038323033653333303832303338386130303330323031303230323038346333303431343935313964353433363330306130363038326138363438636533643034303330323330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333031653137306433313339333033353331333833303331333333323335333735613137306433323334333033353331333633303331333333323335333735613330356633313235333032333036303335353034303330633163363536333633326437333664373032643632373236663662363537323264373336393637366535663535343333343264353035323466343433313134333031323036303335353034306230633062363934663533323035333739373337343635366437333331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333035393330313330363037326138363438636533643032303130363038326138363438636533643033303130373033343230303034633231353737656465626436633762323231386636386464373039306131323138646337623062643666326332383364383436303935643934616634613534313162383334323065643831316633343037653833333331663163353463336637656233323230643662616435643465666634393238393839336537633066313361333832303231313330383230323064333030633036303335353164313330313031666630343032333030303330316630363033353531643233303431383330313638303134323366323439633434663933653465663237653663346636323836633366613262626664326534623330343530363038326230363031303530353037303130313034333933303337333033353036303832623036303130353035303733303031383632393638373437343730336132663266366636333733373032653631373037303663363532653633366636643266366636333733373033303334326436313730373036633635363136393633363133333330333233303832303131643036303335353164323030343832303131343330383230313130333038323031306330363039326138363438383666373633363430353031333038316665333038316333303630383262303630313035303530373032303233303831623630633831623335323635366336393631366536333635323036663665323037343638363937333230363336353732373436393636363936333631373436353230363237393230363136653739323037303631373237343739323036313733373337353664363537333230363136333633363537303734363136653633363532303666363632303734363836353230373436383635366532303631373037303663363936333631363236633635323037333734363136653634363137323634323037343635373236643733323036313665363432303633366636653634363937343639366636653733323036663636323037353733363532633230363336353732373436393636363936333631373436353230373036663663363936333739323036313665363432303633363537323734363936363639363336313734363936663665323037303732363136333734363936333635323037333734363137343635366436353665373437333265333033363036303832623036303130353035303730323031313632613638373437343730336132663266373737373737326536313730373036633635326536333666366432663633363537323734363936363639363336313734363536313735373436383666373236393734373932663330333430363033353531643166303432643330326233303239613032376130323538363233363837343734373033613266326636333732366332653631373037303663363532653633366636643266363137303730366336353631363936333631333332653633373236633330316430363033353531643065303431363034313439343537646236666435373438313836383938393736326637653537383530376537396235383234333030653036303335353164306630313031666630343034303330323037383033303066303630393261383634383836663736333634303631643034303230353030333030613036303832613836343863653364303430333032303334393030333034363032323130306265303935373166653731653165373335623535653561666163623463373266656234343566333031383532323263373235313030326236316562643666353530323231303064313862333530613564643664643665623137343630333562313165623263653837636661336536616636636264383338303839306463383263646461613633333038323032656533303832303237356130303330323031303230323038343936643266626633613938646139373330306130363038326138363438636533643034303330323330363733313162333031393036303335353034303330633132343137303730366336353230353236663666373432303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330316531373064333133343330333533303336333233333334333633333330356131373064333233393330333533303336333233333334333633333330356133303761333132653330326330363033353530343033306332353431373037303663363532303431373037303663363936333631373436393666366532303439366537343635363737323631373436393666366532303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346630313731313834313964373634383564353161356532353831303737366538383061326566646537626165346465303864666334623933653133333536643536363562333561653232643039373736306432323465376262613038666437363137636538386362373662623636373062656338653832393834666635343435613338316637333038316634333034363036303832623036303130353035303730313031303433613330333833303336303630383262303630313035303530373330303138363261363837343734373033613266326636663633373337303265363137303730366336353265363336663664326636663633373337303330333432643631373037303663363537323666366637343633363136373333333031643036303335353164306530343136303431343233663234396334346639336534656632376536633466363238366333666132626266643265346233303066303630333535316431333031303166663034303533303033303130316666333031663036303335353164323330343138333031363830313462626230646561313538333338383961613438613939646562656264656261666461636232346162333033373036303335353164316630343330333032653330326361303261613032383836323636383734373437303361326632663633373236633265363137303730366336353265363336663664326636313730373036633635373236663666373436333631363733333265363337323663333030653036303335353164306630313031666630343034303330323031303633303130303630613261383634383836663736333634303630323065303430323035303033303061303630383261383634386365336430343033303230333637303033303634303233303361636637323833353131363939623138366662333563333536636136326266663431376564643930663735346461323865626566313963383135653432623738396638393866373962353939663938643534313064386639646539633266653032333033323264643534343231623061333035373736633564663333383362393036376664313737633263323136643936346663363732363938323132366635346638376137643162393963623962303938393231363130363939306630393932316430303030333138323031386233303832303138373032303130313330383138363330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533303230383463333034313439353139643534333633303064303630393630383634383031363530333034303230313035303061303831393533303138303630393261383634383836663730643031303930333331306230363039326138363438383666373064303130373031333031633036303932613836343838366637306430313039303533313066313730643331333933303338333133393331333733313332333333303561333032613036303932613836343838366637306430313039333433313164333031623330306430363039363038363438303136353033303430323031303530306131306130363038326138363438636533643034303330323330326630363039326138363438383666373064303130393034333132323034323062303731303365313430613462386231376262613230316130336163643036396234653431366232613263383066383661383338313435633239373566633131333030613036303832613836343863653364303430333032303434363330343430323230343639306264636637626461663833636466343934396534633035313039656463663334373665303564373261313264376335666538633033303033343464663032323032363764353863393365626233353031333836363062353730373938613064643731313734316262353864626436613138363633353038353431656565393035303030303030303030303030227D \ No newline at end of file diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 00000000..d89038bd --- /dev/null +++ b/docs/404.html @@ -0,0 +1,50 @@ + + + DjongoFE + + + + + + + +
+
+
+ +
+
+
+
+
+

Page not found

+
+
+ + + \ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 00000000..84d83f3d --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +www.djongomapper.com \ No newline at end of file diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..9f46078c --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,11 @@ +source 'https://rubygems.org' + +# gem stripe +# run locally + gem 'github-pages', group: :jekyll_plugins + gem "jekyll-include-cache" + +# run server + gem "minimal-mistakes-jekyll" +# gem "jekyll", "~> 3.5" +# gem 'wdm' diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..b5252013 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,184 @@ +remote_theme: "mmistakes/minimal-mistakes" + +#theme: minimal-mistakes-jekyll + +minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" + +# Site Settings +locale : "en-US" +title_separator : "-" +name : "Doableware AB" +title : "Djongo" +subtitle : "" +description : "Djongo is a smarter approach to database querying. It maps python objects to MongoDB documents. + It is popularly referred to as an Object Document Mapper or ODM. It is an extension to the traditional + Django object relational modeling framework. Use Django Admin to directly add and modify + documents stored in MongoDB. Use other contrib modules such as Auth and Sessions without any changes." +url : "https://www.djongomapper.com" +baseurl : "" +repository : "nesdis/djongo" +teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" +# breadcrumbs : false # true, false (default) +logo : "/assets/images/djongo-symbol-small.png" +words_per_minute : 200 +comments: + provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "staticman_v2" "custom" + disqus: + shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname- + discourse: + server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org + facebook: + # https://developers.facebook.com/docs/plugins/comments + appid : + num_posts : # 5 (default) + colorscheme : # "light" (default), "dark" + +#footer: +# links: +# - label: By continuing to use this site, you consent to our use of cookies for tracking site usage. +# url: "/privacy-policy" + +# SEO Related +google_site_verification : "tFNu7Nc9hzKF9v7f6kYaoMbBCNyGREchcKMVdxJuyJo" +bing_site_verification : +yandex_site_verification : +naver_site_verification : + +# Analytics +analytics: + provider : "google-universal" # false (default), "google", "google-universal", "custom" + google: + tracking_id : "UA-75159067-1" + +#footer_scripts: +# - /assets/js/jquery.easing.min.js +# - /assets/js/jquery.touchSwipe.min.js +# - /assets/js/jquery.liquid-slider.min.js - "https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js" + +head_scripts: + - "https://js.stripe.com/v3/" + - "https://code.jquery.com/jquery-3.5.1.slim.min.js" + - "https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js" +# - "/assets/js/cookie-consent.js" + +# Reading Files +include: [_static, _sources, .well-known] + +exclude: + - "*.sublime-project" + - "*.sublime-workspace" + - vendor + - .asset-cache + - .bundle + - .jekyll-assets-cache + - .sass-cache + - assets/js/plugins + - assets/js/_main.js + - assets/js/vendor + - Capfile + - CHANGELOG + - config + - Gemfile + - Gruntfile.js + - gulpfile.js + - LICENSE + - log + - node_modules + - package.json + - Rakefile + - README + - tmp + +keep_files: + - .git + - .svn + + +encoding: "utf-8" +markdown_ext: "markdown,mkdown,mkdn,mkd,md" + + +# Conversion +markdown: kramdown +highlighter: rouge +lsi: false +excerpt_separator: "\n\n" +incremental: false + + +# Markdown Processing +kramdown: + input: GFM + hard_wrap: false + auto_ids: true + footnote_nr: 1 + entity_output: as_char + toc_levels: 1..6 + smart_quotes: lsquo,rsquo,ldquo,rdquo + enable_coderay: false + + +# Sass/SCSS +sass: + sass_dir: _sass + style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style + + +# Outputting +#permalink: /:categories/:title/ +#paginate_path: /blog/page:num/ +#paginate: 5 # amount of posts to show +timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + + +# Plugins (previously gems:) +plugins: +# - jekyll-paginate + - jekyll-sitemap + - jekyll-gist + - jemoji + - jekyll-include-cache + - jekyll-redirect-from + +# mimic GitHub Pages with --safe +whitelist: +# - jekyll-paginate + - jekyll-sitemap + - jekyll-gist + - jemoji + + +# HTML Compression +# - http://jch.penibelst.de/ +compress_html: + clippings: all + ignore: + envs: development + +# Defaults +defaults: + - scope: + path: "markdown/documentation" + type: pages + values: + notice: + not_ready: "Parts of this feature are still under development.\n{: .notice--warning}" + _support: "If you are an enterprise that uses Djongo in your products, contact us for long term support and [licensing options](/support/).\n{: .notice--danger}" + not_standard: "Features under development in this section come preinstalled on DjongoCS. Visit the [support page](/support/) for more information.\n{: .notice--danger}" + layout: single + read_time: false + author_profile: false + share: false + comments: false + toc: true + toc_sticky: false + debug: false + sidebar: + nav: "docs" + - scope: + path: "markdown/legal" + type: pages + values: + toc: true + toc_sticky: false + diff --git a/docs/_data/home.yml b/docs/_data/home.yml new file mode 100644 index 00000000..f92cada1 --- /dev/null +++ b/docs/_data/home.yml @@ -0,0 +1,87 @@ +punchline: + - excerpt: Django App Hosting for MongoDB and SQL Databases + +first_row: + + - image_path: /assets/images/home/query-green-own.png + alt: "Simplify Query Creation" + title: "Simplify Query Creation" + excerpt: "Writing query documents can get out of control. Djongo does the heavy lifting of creating query documents for you." + url: "#query-creation" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-query" + + - image_path: /assets/images/home/noSql.png + alt: "SQL <> No SQL" + title: "SQL <=> No SQL" + excerpt: "Switch between MongoDB and other SQL databases. Limit the impact to your Models and business logic." + url: "/integrating-django-with-mongodb/#how-it-works" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-no-sql" + + - image_path: /assets/images/home/security-green.png + alt: "Security" + title: "Security" + excerpt: "Directly saving raw `JSON` into the database is scary. Djongo secures and validates the `JSON` document before saving." + url: "#security-and-integrity-checks" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-security" + + - image_path: /assets/images/home/support-new.png + alt: "Support" + title: "Support" + excerpt: "Phone, Chat and Email support. Including commercial licensing for enterprises." + url: /support/ + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-support" + + - image_path: /assets/images/home/rapid.png + alt: "Rapid Prototyping" + title: "Rapid Prototyping" + excerpt: "Speed up app development and execution with schema free models. Enforce levels of + schema protection with data evolution." + url: "#rapid-prototyping" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-rapid-prototyping" + + - image_path: /assets/images/home/webpage.png + alt: "Web Interface" + title: "Web Interface" + excerpt: "Access and modify MongoDB through the web browser." + url: /integrating-django-with-mongodb/#use-django-admin-to-add-documents + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-webpage" + + - image_path: /assets/images/home/third-party-thin.png + alt: "Admin MongoDB" + title: "Third Party Packages" + excerpt: "Modules that help interface your MongoDB data with other popular packages." + hidden: true + +djongonxt_row: + - image_path: /assets/images/home/djongo-Nxt-v1.png + alt: "Djongo Next" + title: "Djongo Next" + excerpt: "The advanced modeling framework. Ships with extra features for professional usage." + url: /support/ + btn_label: "Learn More" + btn_class: "btn--primary" + + +advert_row: + - image_path: /assets/images/home/e2e.png + alt: "Admin MongoDB" + image_link: http://www.e2eprojects.com/ + + - image_path: /assets/images/white.jpg + alt: "Admin MongoDB" + + - image_path: /assets/images/home/sumeru.png + alt: "Admin MongoDB" + image_link: https://www.sumerusolutions.com/ diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml new file mode 100644 index 00000000..af0e751e --- /dev/null +++ b/docs/_data/navigation.yml @@ -0,0 +1,69 @@ +# main links +main: + - title: "Create Account" + url: /djongocs/create-account/ + id: 'nav-create-account' + - title: "Services" + url: /app-development/ + - title: "Products" + url: /djongocs/products/ + id: 'nav-login' + - title: "Docs" + url: /get-started/ + id: 'nav-docs' + +# - title: "Source" +# url: https://github.com/doableware/djongo + +docs: + - title: "Djongo" + children: + - title: "Get Started" + url: /get-started/ + - title: "Django with MongoDB" + url: /integrating-django-with-mongodb/ + - title: "Embedded Field" + url: /using-django-with-mongodb-data-fields/ + - title: "Array Field" + url: /using-django-with-mongodb-array-field/ + - title: "Array Reference Field" + url: /using-django-with-mongodb-array-reference-field/ + - title: "Other fields" + url: /using-django-with-other-fields/ + + - title: "DjongoCS" +# url: /djongonxt/ + children: + - title: "Indexes" + url: /indexes/ + - title: "Model Query" + url: /model-query/ + - title: "Model Creation" + url: /model-creation/ + - title: "Model Update" + url: /model-update/ + - title: "Database Transactions" + url: /database-transactions/ +# - title: "Aggregation" +# url: /djongonxt-aggregation/ +# - title: "Contact" +# url: /djongonxt-more-info/ + + - title: "Side stuff" + children: + - title: "Djongo vs Others" + url: /djongo-comparison/ + - title: "Djongo Design" + url: /django-mongodb-connector-design-document/ +# - title: "Roadmap" +# url: /roadmap/ + +# - title: "Donate" +# url: /donate/ +# thumbnail: /assets/images/heart.png + +server: + - title: "Info" + url: /djongocs/ + - title: "Control" + url: /djongocs/control \ No newline at end of file diff --git a/docs/_data/server.yml b/docs/_data/server.yml new file mode 100644 index 00000000..5282f46c --- /dev/null +++ b/docs/_data/server.yml @@ -0,0 +1,31 @@ +forms: + login: + subject: server-login + next: "/support/request-success" + classes: + - form--splash + fields: + - type: input + label: "User Name" + attr: + type: text + name: userName + required: '' + autocomplete: username + title: 'Only alphanumeric characters' + pattern: '[a-z0-9]{4,8}' + + - type: input + label: "Password" + attr: + type: password + name: password + required: '' + autocomplete: current-password + + - type: input + attr: + type: submit + value: Login + class: "btn btn--primary btn--large" + diff --git a/docs/_data/ui-text.yml b/docs/_data/ui-text.yml new file mode 100644 index 00000000..d6932ced --- /dev/null +++ b/docs/_data/ui-text.yml @@ -0,0 +1,983 @@ +# User interface text and labels + +# English (default) +# ----------------- +en: &DEFAULT_EN + page : "Page" + pagination_previous : "Previous" + pagination_next : "Next" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Toggle Menu" + toc_label : "On This Page" + ext_link_label : "Direct Link" + less_than : "less than" + minute_read : "minute read" + share_on_label : "Share on" + meta_label : + tags_label : "Tags:" + categories_label : "Categories:" + date_label : "Updated:" + comments_label : "Leave a Comment" + comments_title : "Comments" + more_label : "Learn More" + related_label : "You May Also Enjoy" +# follow_label : "Follow:" +# feed_label : "" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Recent Posts" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "Your email address will not be published. Required fields are marked" + comment_form_comment_label : "Comment" + comment_form_md_info : "Markdown is supported." + comment_form_name_label : "Name" + comment_form_email_label : "Email address" + comment_form_website_label : "Website (optional)" + comment_btn_submit : "Submit Comment" + comment_btn_submitted : "Submitted" + comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved." + comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." + loading_label : "Loading..." + search_placeholder_text : "Enter your search term..." + results_found : "Result(s) found" +en-US: + <<: *DEFAULT_EN +en-CA: + <<: *DEFAULT_EN +en-GB: + <<: *DEFAULT_EN +en-AU: + <<: *DEFAULT_EN + +# Spanish +# -------------- +es: &DEFAULT_ES + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Siguiente" + breadcrumb_home_label : "Inicio" + breadcrumb_separator : "/" + menu_label : + toc_label : "Contenidos" + ext_link_label : "Enlace" + less_than : "menos de" + minute_read : "minuto de lectura" + share_on_label : "Compartir" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorías:" + date_label : "Actualizado:" + comments_label : "Comentar" + comments_title : + more_label : "Ver más" + related_label : "Podrías ver también" + follow_label : "Seguir:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Sitio web" + email_label : "Email" + recent_posts : "Entradas recientes" + undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml" + comment_form_info : "Su dirección de correo no será publicada. Se han resaltado los campos requeridos" + comment_form_comment_label : "Comentario" + comment_form_md_info : "Markdown está soportado." + comment_form_name_label : "Nombre" + comment_form_email_label : "Dirección de E-mail" + comment_form_website_label : "Sitio web (opcional)" + comment_btn_submit : "Enviar Commentario" + comment_btn_submitted : "Enviado" + comment_success_msg : "Gracias por su comentario!, Este se visualizará en el sitio una vez haya sido aprobado" + comment_error_msg : "Lo sentimos, ha ocurrido un error al enviar su comentario. Por favor asegurese que todos los campos han sido diligenciados e intente de nuevo" + loading_label : "Cargando..." +es-ES: + <<: *DEFAULT_ES +es-CO: + <<: *DEFAULT_ES + +# French +# ----------------- +fr: &DEFAULT_FR + page : "Page" + pagination_previous : "Précédent" + pagination_next : "Suivant" + breadcrumb_home_label : "Accueil" + breadcrumb_separator : "/" + menu_label : + toc_label : "Sur cette page" + ext_link_label : "Lien direct" + less_than : "moins de" + minute_read : "minute de lecture" + share_on_label : "Partager sur" + meta_label : + tags_label : "Tags :" + categories_label : "Catégories :" + date_label : "Mis à jour :" + comments_label : "Laisser un commentaire" + comments_title : + more_label : "Lire plus" + related_label : "Vous pourriez aimer aussi" + follow_label : "Contact" + feed_label : "Flux" + powered_by : "Propulsé par" + website_label : "Site" + email_label : "Email" + recent_posts : "Posts récents" + undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml" + comments_title : "Commentaires" + comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués" + comment_form_comment_label : "Commentaire" + comment_form_md_info : "Markdown est supporté." + comment_form_name_label : "Nom" + comment_form_email_label : "Adresse mail" + comment_form_website_label : "Site web (optionnel)" + comment_btn_submit : "Envoyer" + comment_btn_submitted : "Envoyé" + comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé." + comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez." + loading_label : "Chargement..." +fr-FR: + <<: *DEFAULT_FR +fr-BE: + <<: *DEFAULT_FR +fr-CH: + <<: *DEFAULT_FR + +# Turkish +# ----------------- +tr: &DEFAULT_TR + page : "Sayfa" + pagination_previous : "Önceki" + pagination_next : "Sonraki" + breadcrumb_home_label : "Ana Sayfa" + breadcrumb_separator : "/" + menu_label : + toc_label : "İçindekiler" + ext_link_label : "Doğrudan Bağlantı" + less_than : "Şu süreden az: " + minute_read : "dakika tahmini okuma süresi" + share_on_label : "Paylaş" + meta_label : + tags_label : "Etiketler:" + categories_label : "Kategoriler:" + date_label : "Güncelleme tarihi:" + comments_label : "Yorum yapın" + comments_title : "Yorumlar" + more_label : "Daha fazlasını öğrenin" + related_label : "Bunlar ilginizi çekebilir:" + follow_label : "Takip et:" + feed_label : "RSS" + powered_by : "Emeği geçenler: " + website_label : "Web sayfası" + email_label : "E-posta" + recent_posts : "Son yazılar" + undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi" + comment_form_info : "Email adresiniz gösterilmeyecektir. Zorunlu alanlar işaretlenmiştir" + comment_form_comment_label : "Yorumunuz" + comment_form_md_info : "Markdown desteklenmektedir." + comment_form_name_label : "Adınız" + comment_form_email_label : "Email adresiniz" + comment_form_website_label : "Websiteniz (opsiyonel)" + comment_btn_submit : "Yorum Yap" + comment_btn_submitted : "Gönderildi" + comment_success_msg : "Yorumunuz için teşekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir." + comment_error_msg : "Maalesef bir hata oluştu. Lütfen zorunlu olan tüm alanları doldurduğunuzdan emin olun ve sonrasında tekrar deneyin." + loading_label : "Yükleniyor..." +tr-TR: + <<: *DEFAULT_TR + +# Portuguese +pt: &DEFAULT_PT + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Seguinte" + breadcrumb_home_label : "Início" + breadcrumb_separator : "/" + menu_label : + toc_label : "Nesta Página" + ext_link_label : "Link Direto" + less_than : "menos de" + minute_read : "minutos de leitura" + share_on_label : "Partilhar no" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorias:" + date_label : "Atualizado:" + comments_label : "Deixe um Comentário" + comments_title : "Comentários" + more_label : "Saber mais" + related_label : "Também pode gostar de" + follow_label : "Siga:" + feed_label : "Feed" + powered_by : "Feito com" + website_label : "Site" + email_label : "Email" + recent_posts : "Artigos Recentes" + undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml" + comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Markdown é suportado." + comment_form_name_label : "Nome" + comment_form_email_label : "Endereço Email" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Sumbeter Comentário" + comment_btn_submitted : "Submetido" + comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado." + comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente." + loading_label : "A carregar..." +pt-PT: + <<: *DEFAULT_PT + +# Brazilian Portuguese +pt-BR: + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Próxima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Nesta página" + ext_link_label : "Link direto" + less_than : "menos que" + minute_read : "minuto(s) de leitura" + share_on_label : "Compartilhe em" + meta_label : + tags_label : "Tags:" + categories_label : "Categorias:" + date_label : "Atualizado em:" + comments_label : "Deixe um comentário" + comments_title : + more_label : "Aprenda mais" + related_label : "Talvez você goste também" + follow_label : "Acompanhe em" + feed_label : "Feed" + powered_by : "Feito com" + website_label : "Site" + email_label : "Email" + recent_posts : "Postagens recentes" + undefined_wpm : "Parâmetro indefinido em words_per_minute no _config.yml" + comment_form_info : "Seu email não será publicado. Os campos obrigatórios estão marcados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Markdown é suportado." + comment_form_name_label : "Nome" + comment_form_email_label : "Email" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Enviar Comentário" + comment_btn_submitted : "Enviado" + comment_success_msg : "Obrigado pelo seu comentário! Ele aparecerá no site assim que for aprovado." + comment_error_msg : "Desculpe, ocorreu um erro no envio. Por favor verifique se todos os campos obrigatórios foram preenchidos e tente novamente." + loading_label : "Carregando..." + +# Italian +# ----------------- +it: &DEFAULT_IT + page : "Pagina" + pagination_previous : "Precedente" + pagination_next : "Prossima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Indice della pagina" + ext_link_label : "Link" + less_than : "meno di" + minute_read : "minuto/i di lettura" + share_on_label : "Condividi" + meta_label : + tags_label : "Tags:" + categories_label : "Categorie:" + date_label : "Aggiornato:" + comments_label : "Scrivi un commento" + comments_title : + more_label : "Scopri di più" + related_label : "Potrebbe Piacerti Anche" + follow_label : "Segui:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Articoli Recenti" + undefined_wpm : "Parametro words_per_minute non definito in _config.yml" + comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori" + comment_form_comment_label : "Commenta" + comment_form_md_info : "Il linguaggio Markdown è supportato" + comment_form_name_label : "Nome" + comment_form_email_label : "Indirizzo email" + comment_form_website_label : "Sito Web (opzionale)" + comment_btn_submit : "Invia commento" + comment_btn_submitted : "Inviato" + comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato." + comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova." + loading_label : "Caricamento..." +it-IT: + <<: *DEFAULT_IT + +# Chinese (zh-CN Chinese - China) +# ----------------- +zh: &DEFAULT_ZH_HANS + page : "页面" + pagination_previous : "向前" + pagination_next : "向后" + breadcrumb_home_label : "首页" + breadcrumb_separator : "/" + menu_label : "切换菜单" + toc_label : "在本页上" + ext_link_label : "直接链接" + less_than : "少于" + minute_read : "分钟读完" + share_on_label : "分享" + meta_label : + tags_label : "标签:" + categories_label : "分类:" + date_label : "更新时间:" + comments_label : "留下评论" + comments_title : "评论" + more_label : "了解更多" + related_label : "猜您还喜欢" + follow_label : "关注:" + feed_label : "Feed" + powered_by : "技术来自于" + website_label : "网站" + email_label : "电子邮箱" + recent_posts : "最新文章" + undefined_wpm : "_config.yml配置中words_per_minute字段未定义" + comment_form_info : "您的电子邮箱地址并不会被展示。请填写标记为必须的字段。" + comment_form_comment_label : "评论" + comment_form_md_info : "Markdown语法已支持。" + comment_form_name_label : "姓名" + comment_form_email_label : "电子邮箱" + comment_form_website_label : "网站(可选)" + comment_btn_submit : "提交评论" + comment_btn_submitted : "已提交" + comment_success_msg : "感谢您的评论!被批准后它会立即在此站点展示。" + comment_error_msg : "很抱歉,您的提交存在错误。请确保所有必填字段都已填写正确,然后再试一次。" + loading_label : "正在加载..." +zh-CN: + <<: *DEFAULT_ZH_HANS +zh-SG: + <<: *DEFAULT_ZH_HANS +# Taiwan (Traditional Chinese) +zh-TW: &DEFAULT_ZH_HANT + page : "頁面" + pagination_previous : "較舊" + pagination_next : "較新" + breadcrumb_home_label : "首頁" + breadcrumb_separator : "/" + menu_label : "切換選單" + toc_label : "本頁" + ext_link_label : "外部連結" + less_than : "少於" + minute_read : "分鐘閱讀" + share_on_label : "分享到" + meta_label : + tags_label : "標籤:" + categories_label : "分類:" + date_label : "更新時間:" + comments_label : "留言" + comments_title : "留言內容" + more_label : "了解更多" + related_label : "猜您有與趣" + follow_label : "追蹤:" + feed_label : "RSS Feed" + powered_by : "Powered by" + website_label : "網站" + email_label : "電子信箱" + recent_posts : "最新文章" + undefined_wpm : "_config.yml 中未定義 words_per_minute" + comment_form_info : "您的電子信箱不會被公開. 必填部份已標記" + comment_form_comment_label : "留言內容" + comment_form_md_info : "支援Markdown語法。" + comment_form_name_label : "名字" + comment_form_email_label : "電子信箱帳號" + comment_form_website_label : "網頁 (可選填)" + comment_btn_submit : "送出留言" + comment_btn_submitted : "已送出" + comment_success_msg : "感謝您的留言! 審核後將會顯示在站上。" + comment_error_msg : "抱歉,部份資料輸入有問題。請確認資料填寫正確後再試一次。" + loading_label : "載入中..." +zh-HK: + <<: *DEFAULT_ZH_HANT +# German / Deutsch +# ----------------- +de: &DEFAULT_DE + page : "Seite" + pagination_previous : "Vorherige" + pagination_next : "Nächste" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Auf dieser Seite" + ext_link_label : "Direkter Link" + less_than : "weniger als" + minute_read : "Minuten zum lesen" + share_on_label : "Teilen auf" + meta_label : + tags_label : "Tags:" + categories_label : "Kategorien:" + date_label : "Aktualisiert:" + comments_label : "Hinterlassen sie einen Kommentar" + comments_title : "Kommentare" + more_label : "Mehr anzeigen" + related_label : "Ihnen gefällt vielleicht auch" + follow_label : "Folgen:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Webseite" + email_label : "E-Mail" + recent_posts : "Aktuelle Beiträge" + undefined_wpm : "Undefinierter Parameter words_per_minute in _config.yml" + comment_form_info : "Ihre E-Mail Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown wird unterstützt." + comment_form_name_label : "Name" + comment_form_email_label : "E-Mail Addresse" + comment_form_website_label : "Webseite (optional)" + comment_btn_submit : "Kommentar absenden" + comment_btn_submitted : "Versendet" + comment_success_msg : "Danke für ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde." + comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen sie alle benötigten Felder aus und versuchen sie es erneut." + loading_label : "Lade..." +de-DE: + <<: *DEFAULT_DE +de-AT: + <<: *DEFAULT_DE +de-CH: + <<: *DEFAULT_DE +de-BE: + <<: *DEFAULT_DE +de-LI: + <<: *DEFAULT_DE +de-LU: + <<: *DEFAULT_DE + +# Nepali (Nepal) +# ----------------- +ne: &DEFAULT_NE + page : "पृष्‍ठ" + pagination_previous : "अघिल्लो" + pagination_next : "अर्को" + breadcrumb_home_label : "गृह" + breadcrumb_separator : "/" + menu_label : "टगल मेनु" + toc_label : "यो पृष्‍ठमा" + ext_link_label : "सिधा सम्पर्क" + less_than : "कम्तिमा" + minute_read : "मिनेट पढ्नुहोस्" + share_on_label : "शेयर गर्नुहोस्" + meta_label : + tags_label : "ट्यागहरू:" + categories_label : "वर्गहरु:" + date_label : "अद्यावधिक:" + comments_label : "टिप्पणी दिनुहोस्" + comments_title : "टिप्पणीहरू" + more_label : "अझै सिक्नुहोस्" + related_label : "तपाईं रुचाउन सक्नुहुन्छ " + follow_label : "पछ्याउनुहोस्:" + feed_label : "फिड" + powered_by : "Powered by" + website_label : "वेबसाइट" + email_label : "इमेल" + recent_posts : "ताजा लेखहरु" + undefined_wpm : "अपरिभाषित प्यारामिटर शब्दहरू_प्रति_मिनेट at _config.yml" + comment_form_info : "तपाइँको इमेल ठेगाना प्रकाशित गरिने छैन।आवश्यक जानकारीहरुमा चिन्ह लगाइको छ" + comment_form_comment_label : "टिप्पणी" + comment_form_md_info : "मार्कडाउन समर्थित छ।" + comment_form_name_label : "नाम" + comment_form_email_label : "इमेल ठेगाना" + comment_form_website_label : "वेबसाइट (वैकल्पिक)" + comment_btn_submit : "टिप्पणी दिनुहोस् " + comment_btn_submitted : "टिप्पणी भयो" + comment_success_msg : "तपाईंको टिप्पणीको लागि धन्यवाद! एक पटक यो अनुमोदन गरेपछी यो साइटमा देखाउनेछ।" + comment_error_msg : "माफ गर्नुहोस्, तपाईंको टिप्पणी त्रुटि थियो।सबै आवश्यक जानकारीहरु पूरा गरिएको छ भने निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।" + loading_label : "लोड हुँदैछ ..." +ne-NP: + <<: *DEFAULT_NE + +# Korean +# -------------- +ko: &DEFAULT_KO + page : "페이지" + pagination_previous : "이전" + pagination_next : "다음" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "토글 메뉴" + toc_label : "On This Page" + ext_link_label : "직접 링크" + less_than : "최대" + minute_read : "분 소요" + share_on_label : "공유하기" + meta_label : + tags_label : "태그:" + categories_label : "카테고리:" + date_label : "업데이트:" + comments_label : "댓글남기기" + comments_title : "댓글" + more_label : "더 보기" + related_label : "참고" + follow_label : "팔로우:" + feed_label : "피드" + powered_by : "Powered by" + website_label : "웹사이트" + email_label : "이메일" + recent_posts : "최근 포스트" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "이메일은 공개되지 않습니다. 작성 필요 필드:" + comment_form_comment_label : "댓글" + comment_form_md_info : "마크다운을 지원합니다." + comment_form_name_label : "이름" + comment_form_email_label : "이메일" + comment_form_website_label : "웹사이트(선택사항)" + comment_btn_submit : "댓글 등록" + comment_btn_submitted : "등록됨" + comment_success_msg : "감사합니다! 댓글이 머지된 후 확인하실 수 있습니다." + comment_error_msg : "댓글 등록에 문제가 있습니다. 필요 필드를 작성했는지 확인하고 다시 시도하세요." + loading_label : "로딩중..." +ko-KR: + <<: *DEFAULT_KO + +# Russian / Русский +# ----------------- +ru: &DEFAULT_RU + page : "Страница" + pagination_previous : "Предыдущая" + pagination_next : "Следующая" + breadcrumb_home_label : "Главная" + breadcrumb_separator : "/" + menu_label : "Выпадающее меню" + toc_label : "Содержание" + ext_link_label : "Прямая ссылка" + less_than : "менее" + minute_read : "мин на чтение" + share_on_label : "Поделиться" + meta_label : + tags_label : "Метки:" + categories_label : "Разделы:" + date_label : "Дата изменения:" + comments_label : "Оставить комментарий" + comments_title : "Комментарии" + more_label : "Читать далее" + related_label : "Вам также может понравиться" + follow_label : "Связаться со мной:" + feed_label : "RSS-лента" + powered_by : "Сайт работает на" + website_label : "Сайт" + email_label : "Электронная почта" + recent_posts : "Свежие записи" + undefined_wpm : "Не определён параметр words_per_minute в _config.yml" + comment_form_info : "Ваш адрес электронной почты не будет опубликован. Обязательные поля помечены" + comment_form_comment_label : "Комментарий" + comment_form_md_info : "Поддерживается синтаксис Markdown." + comment_form_name_label : "Имя" + comment_form_email_label : "Электронная почта" + comment_form_website_label : "Ссылка на сайт (необязательно)" + comment_btn_submit : "Оставить комментарий" + comment_btn_submitted : "Отправлено" + comment_success_msg : "Спасибо за Ваш комментарий! Он будет опубликован на сайте после проверки." + comment_error_msg : "К сожалению, произошла ошибка с отправкой комментария. Пожалуйста, убедитесь, что все обязательные поля заполнены и попытайтесь снова." + loading_label : "Отправка..." + search_placeholder_text : "Введите поисковый запрос..." + results_found : "Найдено" +ru-RU: + <<: *DEFAULT_RU + +# Lithuanian / Lietuviškai +# ----------------- +lt: &DEFAULT_LT + page : "Puslapis" + pagination_previous : "Ankstesnis" + pagination_next : "Sekantis" + breadcrumb_home_label : "Pagrindinis" + breadcrumb_separator : "/" + menu_label : "Meniu rodymas" + toc_label : "Turinys" + ext_link_label : "Tiesioginė nuoroda" + less_than : "mažiau nei" + minute_read : "min. skaitymo" + share_on_label : "Pasidalinti" + meta_label : + tags_label : "Žymės:" + categories_label : "Kategorijos:" + date_label : "Atnaujinta:" + comments_label : "Palikti komentarą" + comments_title : "Komentaras" + more_label : "Skaityti daugiau" + related_label : "Taip pat turėtų patikti" + follow_label : "Sekti:" + feed_label : "Šaltinis" + powered_by : "Sukurta su" + website_label : "Tinklapis" + email_label : "El. paštas" + recent_posts : "Naujausi įrašai" + undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml" + comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti." + comment_form_comment_label : "Komentaras" + comment_form_md_info : "Markdown palaikomas." + comment_form_name_label : "Vardas" + comment_form_email_label : "El. paštas" + comment_form_website_label : "Tinklapis (nebūtina)" + comment_btn_submit : "Komentuoti" + comment_btn_submitted : "Įrašytas" + comment_success_msg : "Ačiū už komentarą! Jis bus parodytas kai bus patvirtintas." + comment_error_msg : "Atleiskite, įvyko netikėta klaida įrašant komentarą. Pasitikrinkite ar užpildėte visus būtinus laukus ir pamėginkite dar kartą." + loading_label : "Kraunama..." +lt-LT: + <<: *DEFAULT_LT + +# Greek +# -------------- +gr: &DEFAULT_GR + page : "Σελίδα" + pagination_previous : "Προηγούμενo" + pagination_next : "Επόμενo" + breadcrumb_home_label : "Αρχική" + breadcrumb_separator : "/" + menu_label : "Μενού" + toc_label : "Περιεχόμενα" + ext_link_label : "Εξωτερικός Σύνδεσμος" + less_than : "Λιγότερο από" + minute_read : "λεπτά ανάγνωσης" + share_on_label : "Μοιραστείτε το" + meta_label : + tags_label : "Ετικέτες:" + categories_label : "Κατηγορίες:" + date_label : "Ενημερώθηκε:" + comments_label : "Αφήστε ένα σχόλιο" + comments_title : "Σχόλια" + more_label : "Διάβαστε περισσότερα" + related_label : "Σχετικές αναρτήσεις" + follow_label : "Ακολουθήστε:" + feed_label : "RSS Feed" + powered_by : "Δημιουργήθηκε με" + website_label : "Ιστοσελίδα" + email_label : "Email" + recent_posts : "Τελευταίες αναρτήσεις" + undefined_wpm : "Δεν έχει οριστεί η παράμετρος words_per_minute στο αρχείο _config.yml" + comment_form_info : "Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα απαιτούμενα πεδία εμφανίζονται με αστερίσκο" + comment_form_comment_label : "Σχόλιο" + comment_form_md_info : "Το πεδίο υποστηρίζει Markdown." + comment_form_name_label : "Όνομα" + comment_form_email_label : "Διεύθυνση email" + comment_form_website_label : "Ιστοσελίδα (προαιρετικό)" + comment_btn_submit : "Υπόβαλε ένα σχόλιο" + comment_btn_submitted : "Έχει υποβληθεί" + comment_success_msg : "Ευχαριστούμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα αφού εγκριθεί." + comment_error_msg : "Λυπούμαστε, παρουσιάστηκε σφάλμα με την υποβολή σας. Παρακαλούμε βεβαιωθείτε ότι έχετε όλα τα απαιτούμενα πεδία συμπληρωμένα και δοκιμάστε ξανά." + loading_label : "Φόρτωση..." + search_placeholder_text : "Εισάγετε όρο αναζήτησης..." + results_found : "Αποτελέσματα" +gr-GR: + <<: *DEFAULT_GR + +# Swedish +# ----------------- +sv: &DEFAULT_SV + page : "Sidan" + pagination_previous : "Föregående" + pagination_next : "Nästa" + breadcrumb_home_label : "Hem" + breadcrumb_separator : "/" + menu_label : "Meny ridå" + toc_label : "På denna sida" + ext_link_label : "Direkt länk" + less_than : "mindre än" + minute_read : "minut läsning" + share_on_label : "Dela på" + meta_label : + tags_label : "Taggar:" + categories_label : "Kategorier:" + date_label : "Uppdaterades:" + comments_label : "Lämna en kommentar" + comments_title : "Kommentarer" + more_label : "Lär dig mer" + related_label : "Du kanske vill även läsa:" + follow_label : "Följ:" + feed_label : "Flöde" + powered_by : "Framställd med" + website_label : "Webbsida" + email_label : "E-post" + recent_posts : "Senaste inlägg" + undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml" + comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade." + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Använd Markdown för text-formateringen." + comment_form_name_label : "Namn" + comment_form_email_label : "E-post adress" + comment_form_website_label : "Webdsida (valfritt)" + comment_btn_submit : "Skicka en kommentar" + comment_btn_submitted : "Kommentaren har tagits emot" + comment_success_msg : "Tack för din kommentar! Den kommer att visas på sidan så fort den har godkännts." + comment_error_msg : "Tyvärr det har blivit något fel i en av fälten, se till att du fyller i alla rutor och försök igen." + loading_label : "Laddar..." +sv-SE: + <<: *DEFAULT_SV +sv-FI: + <<: *DEFAULT_SV + +# Dutch +# ----------------- +nl: &DEFAULT_NL + page : "Pagina" + pagination_previous : "Vorige" + pagination_next : "Volgende" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Wissel Menu" + toc_label : "Op deze pagina" + ext_link_label : "Directe Link" + less_than : "minder dan" + minute_read : "minuut gelezen" + share_on_label : "Deel op" + meta_label : + tags_label : "Labels:" + categories_label : "Categorieën:" + date_label : "Bijgewerkt:" + comments_label : "Laat een reactie achter" + comments_title : "Commentaren" + more_label : "Meer informatie" + related_label : "Bekijk ook eens" + follow_label : "Volg:" + feed_label : "Feed" + powered_by : "Aangedreven door" + website_label : "Website" + email_label : "Email" + recent_posts : "Recente berichten" + undefined_wpm : "Niet gedefinieerde parameter words_per_minute bij _config.yml" + comment_form_info : "Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd" + comment_form_comment_label : "Commentaar" + comment_form_md_info : "Markdown wordt ondersteund." + comment_form_name_label : "Naam" + comment_form_email_label : "E-mailadres" + comment_form_website_label : "Website (optioneel)" + comment_btn_submit : "Commentaar toevoegen" + comment_btn_submitted : "Toegevoegd" + comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd." + comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw." + loading_label : "Laden..." +nl-BE: + <<: *DEFAULT_NL +nl-NL: + <<: *DEFAULT_NL + +# Indonesian +# ----------------- +id: &DEFAULT_ID + page : "Halaman" + pagination_previous : "Kembali" + pagination_next : "Maju" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Menu Toggle" + toc_label : "Pada Halaman Ini" + ext_link_label : "Link langsung" + less_than : "Kurang dari" + minute_read : "Waktu baca" + share_on_label : "Berbagi di" + meta_label : + tags_label : "Golongan:" + categories_label : "Kategori:" + date_label : "Diupdate:" + comments_label : "Tinggalkan komentar" + comments_title : "Komentar" + more_label : "Pelajari lagi" + related_label : "Anda juga akan suka" + follow_label : "Ikuti:" + feed_label : "Feed" + powered_by : "Didukung oleh" + website_label : "Website" + email_label : "Email" + recent_posts : "Posting terbaru" + undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml" + comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai" + comment_form_comment_label : "Komentar" + comment_form_md_info : "Markdown disupport." + comment_form_name_label : "Nama" + comment_form_email_label : "Alamat email" + comment_form_website_label : "Website (opsional)" + comment_btn_submit : "Submit Komentar" + comment_btn_submitted : "Telah disubmit" + comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui." + comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali." + loading_label : "Sedang meload..." +id-ID: + <<: *DEFAULT_ID + +# Vietnamese +# ----------------- +vi: &DEFAULT_VI + page : "Trang" + pagination_previous : "Trước" + pagination_next : "Sau" + breadcrumb_home_label : "Trang chủ" + breadcrumb_separator : "/" + menu_label : "Menu" + toc_label : "Tại trang này" + ext_link_label : "Đường dẫn trực tiếp" + less_than : "nhỏ hơn" + minute_read : "phút đọc" + share_on_label : "Chia sẻ tại" + meta_label : + tags_label : "Nhãn:" + categories_label : "Chủ đề:" + date_label : "Cập nhật:" + comments_label : "Để lại bình luận" + comments_title : "Bình luận" + more_label : "Mở rộng" + related_label : "Có thể bạn cũng thích" + follow_label : "Theo dõi:" + feed_label : "Feed" + powered_by : "Được hỗ trợ bởi" + website_label : "Website" + email_label : "Email" + recent_posts : "Bài viết mới" + undefined_wpm : "Chưa định nghĩa thông số words_per_minute tại _config.yml" + comment_form_info : "Email của bạn sẽ được giữ bí mật. Các phần bắt buộc được đánh dấu." + comment_form_comment_label : "Bình luận" + comment_form_md_info : "Hỗ trợ Markdown." + comment_form_name_label : "Tên" + comment_form_email_label : "Địa chỉ email" + comment_form_website_label : "Website (không bắt buộc)" + comment_btn_submit : "Gửi bình luận" + comment_btn_submitted : "Đã được gửi" + comment_success_msg : "Cảm ơn bạn đã bình luận! Bình luận sẽ xuất hiện sau khi được duyệt." + comment_error_msg : "Rất tiếc, có lỗi trong việc gửi bình luận. Hãy đảm bảo toàn bộ các phần bắt buộc đã được điền đầy đủ và thử lại." + loading_label : "Đang tải..." +vi-VN: + <<: *DEFAULT_VI + +# Danish +# ------ +da: &DEFAULT_DA + page : "Side" + pagination_previous : "Forrige" + pagination_next : "Næste" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Vis/skjul menu" + toc_label : "På denne side" + ext_link_label : "Direkte link" + less_than : "mindre end" + minute_read : "minutters læsning" + share_on_label : "Del på" + meta_label : + tags_label : "Nøgleord:" + categories_label : "Kategorier:" + date_label : "Opdateret:" + comments_label : "Skriv en kommentar" + comments_title : "Kommentarer" + more_label : "Lær mere" + related_label : "Måske kan du også lide" + follow_label : "Følg:" + feed_label : "Feed" + powered_by : "Drives af" + website_label : "Website" + email_label : "E-mail" + recent_posts : "Seneste indlæg" + undefined_wpm : "Parameteren words_per_minute er ikke defineret i _config.yml" + comment_form_info : "Din e-mail bliver ikke offentliggjort. Obligatoriske felter er markeret" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown er understøttet." + comment_form_name_label : "Navn" + comment_form_email_label : "E-mail" + comment_form_website_label : "Website (frivillig)" + comment_btn_submit : "Send kommentar" + comment_btn_submitted : "Sendt" + comment_success_msg : "Tak for din kommentar! Den bliver vist på siden, så snart den er godkendt." + comment_error_msg : "Desværre skete der en fejl. Prøv igen, mens du sørger for at alle obligatoriske felter er udfyldt." + loading_label : "Indlæser..." + search_placeholder_text : "Hvad leder du efter..." + results_found : "Resultat(er) fundet" +da-DK: + <<: *DEFAULT_DA + +# Polish +# ------ +pl: &DEFAULT_PL + page : "Strona" + pagination_previous : "Poprzednia" + pagination_next : "Następna" + breadcrumb_home_label : "Strona główna" + breadcrumb_separator : "/" + menu_label : "Przełącz menu" + toc_label : "Spis treści" + ext_link_label : "Link bezpośredni" + less_than : "mniej niż" + minute_read : "minut(y)" + share_on_label : "Udostępnij" + meta_label : + tags_label : "Tagi:" + categories_label : "Kategorie:" + date_label : "Ostatnia aktualizacja:" + comments_label : "Zostaw komentarz" + comments_title : "Komentarze" + more_label : "Dowiedz się więcej" + related_label : "Także może Ci się spodobać" + follow_label : "Śledź:" + feed_label : "Feed" + powered_by : "Powstało dzięki" + website_label : "Strona" + email_label : "Email" + recent_posts : "Najnowsze wpisy" + undefined_wpm : "Parametr words_per_minute nie został zdefiniowany w _config.yml." + comment_form_info : "Twój adres email nie będzie udostępiony. Wymagane pola są oznaczone." + comment_form_comment_label : "Skomentuj" + comment_form_md_info : "Markdown jest wspierany" + comment_form_name_label : "Imię" + comment_form_email_label : "Adres email" + comment_form_website_label : "Strona www (opcjonalna)" + comment_btn_submit : "Skomentuj" + comment_btn_submitted : "Komentarz dodany" + comment_success_msg : "Dziękuję za Twój komentarz! Zostanie dodany po akceptacji." + comment_error_msg : "Niestety wystąpił błąd. Proszę upewnij się, że wszystkie wymagane pola zostały wypełnione i spróbuj ponownie." + loading_label : "Trwa ładowanie strony..." +da-PL: + <<: *DEFAULT_PL + +# Japanese +# ----------------- +ja: &DEFAULT_JA + page : "ページ" + pagination_previous : "前へ" + pagination_next : "次へ" + breadcrumb_home_label : "ホーム" + breadcrumb_separator : "/" + menu_label : "メニュー" + toc_label : "目次" + ext_link_label : "リンク" + less_than : + minute_read : + share_on_label : "共有" + meta_label : + tags_label : "タグ:" + categories_label : "カテゴリー:" + date_label : "更新日時:" + comments_label : "コメントする" + comments_title : "コメント" + more_label : "さらに詳しく" + related_label : "関連記事" + follow_label : "フォロー" + feed_label : + powered_by : + website_label : + email_label : + recent_posts : "最近の投稿" + undefined_wpm : "パラメータ words_per_minute が _config.yml で定義されていません" + comment_form_info : "メールアドレスが公開されることはありません。次の印のある項目は必ず入力してください:" + comment_form_comment_label : "コメント" + comment_form_md_info : "Markdown を使用できます" + comment_form_name_label : "名前" + comment_form_email_label : "メールアドレス" + comment_form_website_label : "URL (任意)" + comment_btn_submit : "コメントを送信する" + comment_btn_submitted : "送信しました" + comment_success_msg : "コメントありがとうございます! コメントは承認されるとページに表示されます。" + comment_error_msg : "送信エラーです。必須項目がすべて入力されていることを確認して再送信してください。" + loading_label : "読み込み中..." + search_placeholder_text : "検索キーワードを入力してください..." + results_found : "件" +ja-JP: + <<: *DEFAULT_JA + +# Another locale +# -------------- +# diff --git a/docs/_drafts/todo.txt b/docs/_drafts/todo.txt new file mode 100644 index 00000000..f1af7efa --- /dev/null +++ b/docs/_drafts/todo.txt @@ -0,0 +1,10 @@ +TODOs: + +Development road map: + 1. Some features in admin not fully working + 2. Doc string model.py + 2. improve test coverage + 3. support of db-name, port etc in settings + convert from printf to debug. + Better code structuring. + [comment](Providing 'rollback' and 'transaction' support for Django) diff --git a/docs/_includes/advert_row b/docs/_includes/advert_row new file mode 100644 index 00000000..ded5193b --- /dev/null +++ b/docs/_includes/advert_row @@ -0,0 +1,27 @@ + +
+ + {% for f in page.advert_row %} +
+
+ {% if f.image_path %} +
+ {% if f.image_link %} + + {% if f.alt %}{{ f.alt }}{% endif %} + + {% else %} + {% if f.alt %}{{ f.alt }}{% endif %} + {% endif %} + {% if f.image_caption %} + {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
+ {% endif %} +
+ {% endif %} +
+
+ {% endfor %} + +
diff --git a/docs/_includes/feature_id_row b/docs/_includes/feature_id_row new file mode 100644 index 00000000..407a8a05 --- /dev/null +++ b/docs/_includes/feature_id_row @@ -0,0 +1,43 @@ + +{% assign feature_row = include.row %} + +
+ + {% for f in feature_row %} + {% unless f.hidden %} +
+
+ {% if f.image_path %} +
+ {% if f.alt %}{{ f.alt }}{% endif %} + {% if f.image_caption %} + {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
+ {% endif %} +
+ {% endif %} + +
+ {% if f.title %} +

{{ f.title }}

+ {% endif %} + + {% if f.excerpt %} +
+ {{ f.excerpt | markdownify }} +
+ {% endif %} + + {% if f.url %} +

+ {{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

+ {% endif %} +
+
+
+ {% endunless %} + {% endfor %} + +
diff --git a/docs/_includes/feedback.html b/docs/_includes/feedback.html new file mode 100644 index 00000000..aef922f6 --- /dev/null +++ b/docs/_includes/feedback.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html new file mode 100644 index 00000000..ac9b0671 --- /dev/null +++ b/docs/_includes/footer.html @@ -0,0 +1,20 @@ + + + diff --git a/docs/_includes/footer/cookie-notice.html b/docs/_includes/footer/cookie-notice.html new file mode 100644 index 00000000..fef7d746 --- /dev/null +++ b/docs/_includes/footer/cookie-notice.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/docs/_includes/footer/custom.html b/docs/_includes/footer/custom.html new file mode 100644 index 00000000..e36434cd --- /dev/null +++ b/docs/_includes/footer/custom.html @@ -0,0 +1,3 @@ + +{% include footer/cookie-notice.html %} + \ No newline at end of file diff --git a/docs/_includes/form.html b/docs/_includes/form.html new file mode 100644 index 00000000..5d38e183 --- /dev/null +++ b/docs/_includes/form.html @@ -0,0 +1,49 @@ +{% if include.subject %} + {% assign subject = include.subject %} +{% else %} + {% assign subject = include.form.subject %} +{% endif %} + +{% if include.next %} + {% assign next = include.next %} +{% else %} + {% assign next = include.form.next %} +{% endif %} + +
+ {% for field in include.form.fields %} + {% if field.type == 'select' %} + + + {% elsif field.type == 'textarea' %} + + + {% elsif field.type == 'input' %} + {% if field.label %}{% endif %} + {% endif %} + {% endfor %} + + +
\ No newline at end of file diff --git a/docs/_includes/head/custom.html b/docs/_includes/head/custom.html new file mode 100644 index 00000000..b36f8fc1 --- /dev/null +++ b/docs/_includes/head/custom.html @@ -0,0 +1,7 @@ + + + +{% include vendors/google-tag-manager.html %} +{% include vendors/hotjar.html %} + + \ No newline at end of file diff --git a/docs/_includes/links b/docs/_includes/links new file mode 100644 index 00000000..d3105f2d --- /dev/null +++ b/docs/_includes/links @@ -0,0 +1,2 @@ +[support_page]: https://www.djongomapper.com/support/ + diff --git a/docs/_includes/pizza.html b/docs/_includes/pizza.html new file mode 100644 index 00000000..363a9fab --- /dev/null +++ b/docs/_includes/pizza.html @@ -0,0 +1,6 @@ +{% if page.pizza %} + +{% endif %} \ No newline at end of file diff --git a/docs/_includes/vendors/google-tag-manager.html b/docs/_includes/vendors/google-tag-manager.html new file mode 100644 index 00000000..2caea24e --- /dev/null +++ b/docs/_includes/vendors/google-tag-manager.html @@ -0,0 +1,7 @@ + + + diff --git a/docs/_includes/vendors/hotjar.html b/docs/_includes/vendors/hotjar.html new file mode 100644 index 00000000..531a5fa9 --- /dev/null +++ b/docs/_includes/vendors/hotjar.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/docs/_includes/vendors/stripe.html b/docs/_includes/vendors/stripe.html new file mode 100644 index 00000000..037aaa53 --- /dev/null +++ b/docs/_includes/vendors/stripe.html @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html new file mode 100644 index 00000000..0243db37 --- /dev/null +++ b/docs/_layouts/docs.html @@ -0,0 +1,8 @@ +--- +layout: single +classes: + - l-docs +--- + +{{ content }} + diff --git a/docs/_layouts/server.html b/docs/_layouts/server.html new file mode 100644 index 00000000..18e02de1 --- /dev/null +++ b/docs/_layouts/server.html @@ -0,0 +1,8 @@ +--- +layout: docs +--- + +{{ page.notice.not_standard | markdownify }} + +{{ content }} + diff --git a/docs/_layouts/support-contact.html b/docs/_layouts/support-contact.html new file mode 100644 index 00000000..2d3f8f4b --- /dev/null +++ b/docs/_layouts/support-contact.html @@ -0,0 +1,11 @@ +--- +title: Djongo Support +layout: splash +classes: + - empty-banner + - l-splash +--- + +

Help us with some information

+ +{{ content }} \ No newline at end of file diff --git a/docs/app-development/index.html b/docs/app-development/index.html new file mode 100644 index 00000000..795c7c08 --- /dev/null +++ b/docs/app-development/index.html @@ -0,0 +1,344 @@ + + + + + + Django App Development - App Development Services for Enterprises. + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+

+ Choose Right +

+
+
+ + + + + + +

+ Optimized database programming +

+

+ Let our team of expert database programmers create the perfect django app for you. Utilizing our vast experience with different databases we design apps with the right data on database architecture. +

+
+
+ + + + + + +

+ SQL to NoSql migration expertise +

+

+ Create the right transition plan to move from a sql to a nosql database. We create data models that accurately map relational data onto a nonrelational database. +

+
+
+ + + + + + +

+ Utilization analytics +

+

+ Use the auto generated analytics logs to monitor how moving from a sql to a nosql data representation has improved your query performance. +

+
+
+
+
+
+
+

+ Tech Expertise +

+
+
+ + + + + + +

+ RESTful development +

+

+ Using Django Resf Framework for data serialization, viewsets, and generic views. Our RESTful APIs are secure and robust. +

+
+
+ + + + + + +

+ Web interface design +

+

+ We use Angular to create web interfaces. Our Frontend design has intutive navigation, responsive layouts, and reusable widgets. +

+
+
+ + + + + + +

+ Payment gateway integration +

+

+ We offer payment gateway integration for eCommerce and mCommerce stores. +

+
+
+ +
+
+
+
+ +
+
+
+
+

+ Services +

+
+
+ + + + + + +

+ Staff augmentation +

+

+ Ideal for businesses with existing development teams that want to accelerate timelines using our specialized talent. Our developers will integrate seamlessly with your in-house team. We will work together to increase productivity and deliver your software faster. +

+
+
+ + + + + + +

+ Software development teams +

+

+ We deliver teams of developers having cross functional expertise in areas such as QA, DevOps, frontend and backend. These professionals will work with your in-house project manager or scrum master. +

+
+
+ + + + + + +

+ Software outsourcing +

+

+ When you need both the delivery of a product and the management of development to be taken care of, software outsourcing is the way to go. We handle the development process from start to finish allowing you to focus on your core business. Get access to the top Django talent, while keeping your costs low and productivity high. +

+
+
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 00000000..5678c141 --- /dev/null +++ b/docs/assets/css/custom.css @@ -0,0 +1 @@ +.l-fixed-content,.fp-right .pitch-content,.form-right .pitch-content,.code-right .pitch-content,.img-right .pitch-content{max-width:1280px;margin:auto;padding-left:1em;padding-right:1em}.l-fixed-content p,.fp-right .pitch-content p,.form-right .pitch-content p,.code-right .pitch-content p,.img-right .pitch-content p{margin-bottom:1.3rem}.l-docs #main{max-width:1880px}.l-splash-full #main{max-width:100%;padding:0}.l-splash-full #main p{margin-top:0}.l-fixed-notice{position:fixed;bottom:0;left:0;color:#646769;background-color:#f2f3f3;width:100%}.l-fixed-notice p{margin:1.3em auto;text-align:center}.l-fixed-notice button{margin-left:.5em}.empty-banner .masthead{margin-bottom:3em}.seamless{border-bottom:none}.visible-links{align-items:baseline}.pitch>section,.pitch-white>section,.pitch-grey>section{padding:5.318rem 0}.pitch>section::after,.pitch-white>section::after,.pitch-grey>section::after{content:"";display:block;clear:both}.pitch h3,.pitch-white h3,.pitch-grey h3{font-size:.84em;font-weight:normal}.pitch h2,.pitch-white h2,.pitch-grey h2,.pitch h3,.pitch-white h3,.pitch-grey h3,.pitch h4,.pitch-white h4,.pitch-grey h4{margin:0 0 2.7rem;text-align:center}.pitch a:not(.btn,.cta),.pitch-white a:not(.btn,.cta),.pitch-grey a:not(.btn,.cta){text-decoration:none;color:#457d5b}.pitch a:not(.btn,.cta):hover,.pitch-white a:not(.btn,.cta):hover,.pitch-grey a:not(.btn,.cta):hover{color:#09411f}.pitch-grey>section:nth-child(odd){background-color:#f2f3f3}.pitch-white>section:nth-child(even){background-color:#f2f3f3}.sz-short{overflow:auto;min-height:0}.btn--theme{color:#fff;background-color:#09411f}.btn--theme:visited{background-color:#09411f;color:#fff}.btn--theme:hover{background-color:#457d5b;color:#fff}.float,.float-right,.fp-right,.form-right,.code-right,.img-right,.float-left,.fp-left,.code-left,.img-left{display:block}.float-left,.fp-left,.code-left,.img-left{float:left}@media(max-width: 600px){.float-left,.fp-left,.code-left,.img-left{float:none}}.float-right,.fp-right,.form-right,.code-right,.img-right{float:right}@media(max-width: 600px){.float-right,.fp-right,.form-right,.code-right,.img-right{float:none}}.top-align{margin-top:0.25em}.pos-right,.fp-right,.form-right,.code-right,.img-right{margin-left:2rem}@media(max-width: 600px){.pos-right,.fp-right,.form-right,.code-right,.img-right{margin-left:0}}.pos-left,.fp-left,.code-left,.img-left{margin-right:2rem}@media(max-width: 600px){.pos-left,.fp-left,.code-left,.img-left{margin-right:0}}.pos-twice.pos-left,.pos-twice.fp-left,.pos-twice.code-left,.pos-twice.img-left{margin-right:1rem}@media(max-width: 600px){.pos-twice.pos-left,.pos-twice.fp-left,.pos-twice.code-left,.pos-twice.img-left{margin-right:0}}.pos-twice.pos-right,.pos-twice.fp-right,.pos-twice.form-right,.pos-twice.code-right,.pos-twice.img-right{margin-left:1rem}@media(max-width: 600px){.pos-twice.pos-right,.pos-twice.fp-right,.pos-twice.form-right,.pos-twice.code-right,.pos-twice.img-right{margin-left:0}}.sz-sm,.form-right{max-width:31.3%}@media(max-width: 600px){.sz-sm,.form-right{max-width:100%}}.sz-hf{width:calc(50% - 1rem)}@media(max-width: 768px){.sz-hf{width:100%}}@media(max-width: 768px){.sz-short.reset{height:auto}}.img,.img-left,.img-right{margin-bottom:1em}@media(max-width: 600px){.img,.img-left,.img-right{margin-bottom:2em}}.code,.code-left,.code-right{margin-bottom:0}@media(max-width: 600px){.code,.code-left,.code-right{margin-bottom:1em}}.form-right{padding:0;margin-left:2.5em}.flex{display:flex;justify-content:space-between}.flex>div{margin:0 1em 0}@media(max-width: 600px){.flex{flex-direction:column}}.is-hidden{display:none}h2.reset-border{border-bottom:none}h2.is-subtitled{margin-bottom:1.3rem}h3.is-subtitled{margin-bottom:2.7rem}.l-grid{display:grid;font-size:.8em;column-gap:1rem;grid-template-columns:repeat(3, 1fr)}.l-grid>div{display:grid;grid-template-rows:subgrid;margin-bottom:1rem}.l-grid.is-titled{padding-top:1rem}@media(max-width: 900px){.l-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 600px){.l-grid{grid-template-columns:repeat(1, 1fr)}}.grid-2-row{grid-area:span 2}.grid-3-row{grid-area:span 3}.grid-4-row{grid-area:span 4}.grid-5-col{grid-template-columns:repeat(5, 1fr)}@media(max-width: 1024px){.grid-5-col{grid-template-columns:repeat(4, 1fr)}}@media(max-width: 900px){.grid-5-col{grid-template-columns:repeat(3, 1fr)}}@media(max-width: 600px){.grid-5-col{grid-template-columns:repeat(2, 1fr)}}.banner{padding:0;clear:both;background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.banner.banner-dark{margin-bottom:0}.banner-text{padding:3em 3em 3em 1em;color:#fff;margin-left:calc((100% - 1280px)/2);max-width:980px}@media(max-width: 80em){.banner-text{margin-left:0;width:900px}}@media(max-width: 900px){.banner-text{width:100%}}.banner-text h1{margin-top:0;font-size:2.441em}@media(max-width: 37.5em){.banner-text h1{font-size:1.953em}}.banner-text-dark{color:#000}.banner-text-dark .btn{color:#fff;background-color:#000;border:1px solid #000}.banner-text-dark .btn:hover{background-color:rgba(0,0,0,0);color:#000}.banner-text-hero{background-image:linear-gradient(to left, rgba(255, 255, 255, 0) 0em, rgb(9, 65, 31) 2.5em, rgb(9, 65, 31) calc(100% - 2.5em), rgba(255, 255, 255, 0))}.banner-text-hero .btn{background-color:#fff;color:#09411f;border:1px solid #fff}.banner-text-hero .btn:hover{background-color:rgba(0,0,0,0);color:#fff}.banner-lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Helvetica Neue","Lucida Grande",Arial,sans-serif;font-size:1.25em;max-width:768px}.masthead{position:sticky;top:0;background-color:#fff}.masthead__inner-wrap{padding:.5em}.masthead__menu-item:first-of-type a{margin-right:1rem;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Helvetica Neue","Lucida Grande",Arial,sans-serif;font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;background-color:#ee5f5b;color:#fff}.masthead__menu-item:first-of-type a:before{background:none}.masthead__menu-item:first-of-type a:visited{background-color:#ee5f5b}.masthead__menu-item:first-of-type a:hover{background-color:#b2231f}.l-tire{display:flex;justify-content:space-evenly;flex-direction:row;flex-wrap:wrap}@media(max-width: 768px){.l-tire-full{flex-direction:column;align-content:center}}.tire-content{text-align:center;background-color:#fff;border:1px solid #f2f3f3;border-radius:4px;padding:1em}.tire-content.is-grey{background-color:#f2f3f3}.tire-content ul{text-align:left;list-style:none}.tire-content li::before{content:"";display:inline-block;height:.75em;width:.97em;background-image:url("/assets/images/tick.svg");background-repeat:no-repeat;background-position:left center;background-size:1em;margin-right:.3em}.tire-content form{text-align:left;width:100%}.tire-content form input[type=submit]{text-align:center;margin:0 auto 1.75em auto;display:block}.tire-benefits{font-size:.8em;display:grid;margin-left:1em;margin-right:1em;grid-template-columns:1em 1fr;gap:.7em;text-align:left}.tire-col{margin-bottom:2em}.tire-3-col-fixed,.tire-2-col-fixed{width:16em}.tire-3-col-full{width:calc(33.3333333333% - (1em));margin-left:.5em;margin-right:.5em;margin-bottom:2em}@media(max-width: 38em){.tire-3-col-full{width:calc(50% - (1em))}}@media(max-width: 20em){.tire-3-col-full{width:calc(100% - (1em))}}@media(max-width: 768px){.tire-3-col-full{width:100%}}.tire-2-col-full{width:calc(50% - (1em));margin-left:.5em;margin-right:.5em;margin-bottom:2em}@media(max-width: 20em){.tire-2-col-full{width:calc(100% - (1em))}}@media(max-width: 768px){.tire-2-col-full{width:100%}}.tire-title{font-weight:bold;margin-bottom:2.7rem}.tire-cta{margin-bottom:2.7rem}.tire-price{font-weight:bold;font-size:2.5em}.tire-period{font-size:.9em;font-weight:lighter;margin-bottom:1em}.l-tire-switcher{display:flex;align-items:stretch;justify-content:space-around}.l-tire-switcher svg:hover{cursor:pointer}.l-tire-switcher .svg-box{display:flex;align-items:center}.switcher-title{font-weight:bold;margin-left:10px;margin-right:10px;font-size:1.5em}.pc,.pc-img-right{display:flex;gap:2rem}.pc>img,.pc-img-right>img,.pc div,.pc-img-right div{flex:50%}@media(max-width: 900px){.pc,.pc-img-right{flex-direction:column;align-items:center}}.pc-img-right{flex-direction:row-reverse}@media(max-width: 768px){.pc-img-right{flex-direction:column-reverse}}.punchline{font-size:.8em;text-align:center}.punchline>p{margin-bottom:0}.punchline:not(:first-child){margin-top:5.318rem}.cta-btn{text-align:center;margin:2.6rem 0 1.3rem}.cta-btn:last-child{margin-bottom:0}a.cta{text-decoration:none;color:#09411f;position:relative;width:fit-content}a.cta:before{content:"";position:absolute;background:#09411f;bottom:0;height:2px;left:0;transform:scaleX(0) translate3d(0, 0, 0);transition:all .2s ease-in-out;width:100%}a.cta:after{content:"→"}a.cta:hover:before{transform:scaleX(1)}.l-tiles>div{box-shadow:0 5px 15px rgba(0,0,0,.35);padding:1.5em;border-radius:5px;background-color:#fff}.l-tiles img{height:5em;display:block;margin:0 auto 1.3rem}.l-grid-text h1{text-align:left;margin-bottom:1em}.l-grid-text svg{margin-bottom:1em}.grid-logo{grid-gap:3em}.grid-logo img{margin:auto;max-height:123px}.query{display:flex;flex-flow:row wrap;gap:2rem}.query>div:nth-child(1){flex:0 1 min-content;overflow:scroll;width:min-content;max-height:13.5em}.query>div:nth-child(2){flex:1 1 min-content}.query .highlighter-rouge{margin-bottom:0}.query .btn{margin-bottom:0}.query .btn:hover{cursor:default}@media(max-width: 900px){.query{flex-flow:column wrap}}.query-right-box{display:grid;grid-template-columns:min-content 10px min-content auto;grid-template-rows:min-content 2rem min-content 1.3rem min-content}.query-right-box>div:nth-child(1){grid-area:1/1/2/5;width:min-content}.query-right-box>div:nth-child(2){grid-area:3/1/4/2}.query-right-box>div:nth-child(3){grid-area:3/3/4/4}.query-right-box>div:nth-child(4){grid-area:5/1/6/5}@media(max-width: 900px){.query-right-box>div:nth-child(1){grid-area:3/1/4/5;max-width:90vw;overflow:scroll}.query-right-box>div:nth-child(2){grid-area:1/1/2/2}.query-right-box>div:nth-child(3){grid-area:1/3/2/4}}.chart{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto auto}.chart p{margin-bottom:0}.x-axis{transform:rotate(-90deg);align-self:center;grid-area:1/1/2/2}.y-axis{margin:1em 0 2.4rem;text-align:center;grid-area:2/2/3/3}.chart>.cta{grid-area:3/2/4/3}.chart-grid{grid-area:1/2/2/3;display:grid;grid-template-columns:2rem auto 2rem auto 2rem auto;grid-template-rows:min-content min-content min-content max-content 2rem;border-bottom:1px solid #000;border-left:1px solid #000}@media(max-width: 900px){.chart-grid{grid-template-columns:10px auto 10px;grid-template-rows:min-content min-content 2rem min-content min-content 2rem min-content min-content 2rem}}.c1-title,.c2-title,.c3-title{border-bottom:2px solid #b6b7b7;border-radius:5px 5px 0 0;padding:.6em 1.2em}.c1-content,.c2-content,.c3-content{border-radius:0 0 5px 5px;padding:1.2em}.c1-title,.c2-title,.c3-title,.c1-content,.c2-content,.c3-content{background-color:#fff}.c1-title{grid-area:3/2/4/3}@media(max-width: 900px){.c1-title{grid-area:7/2/8/3}}.c1-content{grid-area:4/2/5/3}@media(max-width: 900px){.c1-content{grid-area:8/2/9/3}}.c2-title{grid-area:2/4/3/5}@media(max-width: 900px){.c2-title{grid-area:4/2/5/3}}.c2-content{grid-area:3/4/5/5}@media(max-width: 900px){.c2-content{grid-area:5/2/6/3}}.c3-title{grid-area:1/6/2/7}@media(max-width: 900px){.c3-title{grid-area:1/2/2/3}}.c3-content{grid-area:2/6/5/7}@media(max-width: 900px){.c3-content{grid-area:2/2/3/3}}table.products{font-size:1em;display:table}@media(max-width: 768px){table.products{overflow:scroll;max-width:90vw;display:block}}table.products th:first-child{background-color:#fff}table.products td:first-child{background-color:#f2f3f3}table.products th:first-child,table.products td:first-child{width:49%;padding:.7em 1em}table.products th:nth-child(n+2),table.products td:nth-child(n+2){width:17%;text-align:center}table.products td,table.products th{padding:.7em .5em}table.products .btn{margin-bottom:0}table.products img{max-height:1em} diff --git a/docs/assets/images/banner-rand-dark-many7.png b/docs/assets/images/banner-rand-dark-many7.png new file mode 100755 index 00000000..fee0fe48 Binary files /dev/null and b/docs/assets/images/banner-rand-dark-many7.png differ diff --git a/docs/assets/images/broadcom.svg b/docs/assets/images/broadcom.svg new file mode 100755 index 00000000..b2cdc083 --- /dev/null +++ b/docs/assets/images/broadcom.svg @@ -0,0 +1,117 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/cloud-tiles.png b/docs/assets/images/cloud-tiles.png new file mode 100755 index 00000000..df786c41 Binary files /dev/null and b/docs/assets/images/cloud-tiles.png differ diff --git a/docs/assets/images/containers.svg b/docs/assets/images/containers.svg new file mode 100755 index 00000000..3940f785 --- /dev/null +++ b/docs/assets/images/containers.svg @@ -0,0 +1,412 @@ + +image/svg+xmlContainersDeploy frustration free Djongo containers on Google Cloud PlatformCreate and deploy a preset Ubuntu, Apache, MongoDB, PostgreSQL and Djongo instance on GCP. Choose between shared and dedicated VM instances. +Create AccountFocus on developing the models.py and views.py. Let djongo cloud services automate the rest. Manage access keys, modify subscription plans, and request support using the dashboard.Create AccountDjongoCSSourceDjongo5.4/20 GB370/500 MBConfigValueURLOSConnectionsStorageMemorySSH Keyhttps://api.djongomapper.com/usernameUbuntu 20.04; Apache 2.4.50MongoDB 5.0.8; PostgreSQL 14.4Upload diff --git a/docs/assets/images/cross.svg b/docs/assets/images/cross.svg new file mode 100755 index 00000000..ff7c4b8a --- /dev/null +++ b/docs/assets/images/cross.svg @@ -0,0 +1,228 @@ + +image/svg+xmlProductsDjango MongoDB connectorVirtualized containersCommercial licenseDjongoDjongoCSEnterpriseCreate AccountEnquire diff --git a/docs/assets/images/deploy.svg b/docs/assets/images/deploy.svg new file mode 100755 index 00000000..d7d2a25d --- /dev/null +++ b/docs/assets/images/deploy.svg @@ -0,0 +1,108 @@ + +image/svg+xml diff --git a/docs/assets/images/djongo-name-logo.png b/docs/assets/images/djongo-name-logo.png new file mode 100755 index 00000000..07f9880c Binary files /dev/null and b/docs/assets/images/djongo-name-logo.png differ diff --git a/docs/assets/images/djongo-symbol-small.png b/docs/assets/images/djongo-symbol-small.png new file mode 100755 index 00000000..c2d6fe5e Binary files /dev/null and b/docs/assets/images/djongo-symbol-small.png differ diff --git a/docs/assets/images/e2e.svg b/docs/assets/images/e2e.svg new file mode 100755 index 00000000..541c51dd --- /dev/null +++ b/docs/assets/images/e2e.svg @@ -0,0 +1,24 @@ + + + + diff --git a/docs/assets/images/favicon.ico b/docs/assets/images/favicon.ico new file mode 100755 index 00000000..16b405f1 Binary files /dev/null and b/docs/assets/images/favicon.ico differ diff --git a/docs/assets/images/hulu.svg b/docs/assets/images/hulu.svg new file mode 100755 index 00000000..b81855f5 --- /dev/null +++ b/docs/assets/images/hulu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/images/layers.png b/docs/assets/images/layers.png new file mode 100755 index 00000000..3db2e131 Binary files /dev/null and b/docs/assets/images/layers.png differ diff --git a/docs/assets/images/mediakind.svg b/docs/assets/images/mediakind.svg new file mode 100755 index 00000000..45e948b7 --- /dev/null +++ b/docs/assets/images/mediakind.svg @@ -0,0 +1,52 @@ + + + + diff --git a/docs/assets/images/modify.svg b/docs/assets/images/modify.svg new file mode 100755 index 00000000..a61a3824 --- /dev/null +++ b/docs/assets/images/modify.svg @@ -0,0 +1,95 @@ + +image/svg+xml diff --git a/docs/assets/images/noSql.png b/docs/assets/images/noSql.png new file mode 100755 index 00000000..4f3b428c Binary files /dev/null and b/docs/assets/images/noSql.png differ diff --git a/docs/assets/images/orm2odm.png b/docs/assets/images/orm2odm.png new file mode 100755 index 00000000..988a148c Binary files /dev/null and b/docs/assets/images/orm2odm.png differ diff --git a/docs/assets/images/query-green-own.png b/docs/assets/images/query-green-own.png new file mode 100755 index 00000000..16258661 Binary files /dev/null and b/docs/assets/images/query-green-own.png differ diff --git a/docs/assets/images/rapid.png b/docs/assets/images/rapid.png new file mode 100755 index 00000000..ff8d42a3 Binary files /dev/null and b/docs/assets/images/rapid.png differ diff --git a/docs/assets/images/rapid.svg b/docs/assets/images/rapid.svg new file mode 100755 index 00000000..ff22a2f6 --- /dev/null +++ b/docs/assets/images/rapid.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/redistribute.svg b/docs/assets/images/redistribute.svg new file mode 100755 index 00000000..9cbd0d9b --- /dev/null +++ b/docs/assets/images/redistribute.svg @@ -0,0 +1,112 @@ + +image/svg+xml diff --git a/docs/assets/images/security-green.png b/docs/assets/images/security-green.png new file mode 100755 index 00000000..ff0330ec Binary files /dev/null and b/docs/assets/images/security-green.png differ diff --git a/docs/assets/images/security.svg b/docs/assets/images/security.svg new file mode 100755 index 00000000..c9295269 --- /dev/null +++ b/docs/assets/images/security.svg @@ -0,0 +1,99 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/sql2mongodb.png b/docs/assets/images/sql2mongodb.png new file mode 100755 index 00000000..5fd515e6 Binary files /dev/null and b/docs/assets/images/sql2mongodb.png differ diff --git a/docs/assets/images/sumeru.svg b/docs/assets/images/sumeru.svg new file mode 100755 index 00000000..b1e4ab71 --- /dev/null +++ b/docs/assets/images/sumeru.svg @@ -0,0 +1,24 @@ + + + + diff --git a/docs/assets/images/support-new.svg b/docs/assets/images/support-new.svg new file mode 100755 index 00000000..bbf88402 --- /dev/null +++ b/docs/assets/images/support-new.svg @@ -0,0 +1,90 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/docs/assets/images/tick.svg b/docs/assets/images/tick.svg new file mode 100755 index 00000000..e9176a77 --- /dev/null +++ b/docs/assets/images/tick.svg @@ -0,0 +1,49 @@ + +image/svg+xml diff --git a/docs/assets/images/webpage.png b/docs/assets/images/webpage.png new file mode 100755 index 00000000..42ed09c7 Binary files /dev/null and b/docs/assets/images/webpage.png differ diff --git a/docs/assets/js/cookie-consent.js b/docs/assets/js/cookie-consent.js new file mode 100644 index 00000000..1a8007f3 --- /dev/null +++ b/docs/assets/js/cookie-consent.js @@ -0,0 +1,14 @@ +// A $( document ).ready() block. +$( document ).ready(function() { + const cookieName = 'user-cookie-consent'; + let hasConsented = Cookies.get(cookieName); + + if(hasConsented === 'true') { + $(".cookie-notice").css('display', 'none'); + } + + $("#cookie-accept").click(function () { + $(".cookie-notice").css('display', 'none'); + Cookies.set(cookieName, 'true'); + }) +}); \ No newline at end of file diff --git a/docs/assets/js/create-account.js b/docs/assets/js/create-account.js new file mode 100644 index 00000000..0139b37f --- /dev/null +++ b/docs/assets/js/create-account.js @@ -0,0 +1,17 @@ +import {API_BASE} from "./utils.js"; +import {CreateAccountPage} from "./create-account.page.js"; + +(() => { + const form = document.querySelector("form"); + const page = new CreateAccountPage(); + page.form.addEventListener( + 'submit', + evt => { + evt.preventDefault(); + document.querySelector('input[type="submit"]').disabled = true; + page.show('loader'); + page.sendToBackend(API_BASE); + }, + false) + +})() diff --git a/docs/assets/js/create-account.page.js b/docs/assets/js/create-account.page.js new file mode 100644 index 00000000..aa99a114 --- /dev/null +++ b/docs/assets/js/create-account.page.js @@ -0,0 +1,34 @@ +import {API_BASE, Page} from "./utils.js"; + +class CreateAccountPage extends Page { + constructor() { + let els = { + ok: document.getElementById('ok'), + userExists: document.getElementById('user-exists'), + loader: document.getElementById('loader') + } + super(els); + this.form = document.querySelector("form"); + } + + sendToBackend(API_BASE) { + let data = new FormData(this.form); + fetch(API_BASE + 'create-account/', + { method: 'POST', + body: data, + mode: 'cors' + }).then(resp => { + resp.json().then(result => { + this.hide('loader'); + if (result.status === 'OK') { + this.show('ok'); + } + else if (result.status === 'USER_EXISTS') { + this.show('userExists'); + } + }); + }) + } +} + +export {CreateAccountPage} diff --git a/docs/assets/js/dashboard.js b/docs/assets/js/dashboard.js new file mode 100644 index 00000000..40c5fb2f --- /dev/null +++ b/docs/assets/js/dashboard.js @@ -0,0 +1,21 @@ +import {Cookie, API_BASE} from "./utils.js"; + +(() => { + const loginRedirect = '/djongocs/login/' + + if (!Cookie.has('UserId')) { + window.location.href = loginRedirect; + return; + } + fetch(API_BASE + 'user-info/').then(resp => { + resp.json().then(user => { + if (user['status'] === "LOGIN_REQUIRED") { + window.location.href = loginRedirect; + } else if (user['status'] === 'OK') { + + } + }) + }, reason => { + //No error handling + }) +})() \ No newline at end of file diff --git a/docs/assets/js/dashboard.page.js b/docs/assets/js/dashboard.page.js new file mode 100644 index 00000000..40c5fb2f --- /dev/null +++ b/docs/assets/js/dashboard.page.js @@ -0,0 +1,21 @@ +import {Cookie, API_BASE} from "./utils.js"; + +(() => { + const loginRedirect = '/djongocs/login/' + + if (!Cookie.has('UserId')) { + window.location.href = loginRedirect; + return; + } + fetch(API_BASE + 'user-info/').then(resp => { + resp.json().then(user => { + if (user['status'] === "LOGIN_REQUIRED") { + window.location.href = loginRedirect; + } else if (user['status'] === 'OK') { + + } + }) + }, reason => { + //No error handling + }) +})() \ No newline at end of file diff --git a/djongo/sql2mongo/__init__.py b/docs/assets/js/login.js similarity index 100% rename from djongo/sql2mongo/__init__.py rename to docs/assets/js/login.js diff --git a/docs/assets/js/stripe-elements.js b/docs/assets/js/stripe-elements.js new file mode 100644 index 00000000..7a322547 --- /dev/null +++ b/docs/assets/js/stripe-elements.js @@ -0,0 +1,2 @@ +var stripe = Stripe('pk_test_XXXXXXXXXXXXXXXXX'); // use your test publishable key +var elements = stripe.elements(); diff --git a/docs/assets/js/test/create-account.js b/docs/assets/js/test/create-account.js new file mode 100644 index 00000000..b19c6c98 --- /dev/null +++ b/docs/assets/js/test/create-account.js @@ -0,0 +1,17 @@ +import {CreateAccountPage} from "../create-account.page.js"; +const API_BASE = 'http://127.0.0.1:8000/'; + +(() => { + const page = new CreateAccountPage(); + const form = document.querySelector("form"); + page.show('ok'); + + page.form.addEventListener( + 'submit', + evt => { + evt.preventDefault(); + document.querySelector('input[type="submit"]').disabled = true; + page.show('ok'); + }, false + ) +})() diff --git a/docs/assets/js/test/test.js b/docs/assets/js/test/test.js new file mode 100644 index 00000000..72887686 --- /dev/null +++ b/docs/assets/js/test/test.js @@ -0,0 +1 @@ +const TEST_API_BASE = 'http://127.0.0.1:8000/'; diff --git a/docs/assets/js/utils.js b/docs/assets/js/utils.js new file mode 100644 index 00000000..1472eb91 --- /dev/null +++ b/docs/assets/js/utils.js @@ -0,0 +1,55 @@ +const API_BASE = 'https://api.djongomapper.com/mapper/'; + +class Cookie { + constructor() { + } + + static has(key) { + return document.cookie.split(';'). + some(itm => itm.trim().startsWith(key + '=')) + } + + static get(key) { + let cookie = document.cookie.split(';'). + find(itm => itm.trim().startsWith(key + '=')); + if(cookie) { + return cookie.trim().split('=')[1]; + } + } + + static set(key, val) { + document.cookie = key + '=' + val + ';' + 'Secure'; + } +} + +class Page { + constructor(els) { + this.els = els; + } + + show(name) { + this.els[name].classList.remove('is-hidden'); + } + + hide(name) { + this.els[name].classList.add('is-hidden'); + } + + hideAll() { + for (const name in this.els){ + this.hide(name); + } + } + + showAll() { + for (const name in this.els){ + this.show(name); + } + } +} + +export { + Cookie, + API_BASE, + Page +} \ No newline at end of file diff --git a/docs/djongocs/3rdpartylicenses.txt b/docs/djongocs/3rdpartylicenses.txt new file mode 100644 index 00000000..5f611b96 --- /dev/null +++ b/docs/djongocs/3rdpartylicenses.txt @@ -0,0 +1,244 @@ +@angular/common +MIT + +@angular/core +MIT + +@angular/forms +MIT + +@angular/platform-browser +MIT + +@angular/router +MIT + +rxjs +Apache-2.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +zone.js +MIT +The MIT License + +Copyright (c) 2010-2022 Google LLC. https://angular.io/license + +Permission 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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE 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. diff --git a/docs/djongocs/campaign/index.html b/docs/djongocs/campaign/index.html new file mode 100644 index 00000000..1deb512a --- /dev/null +++ b/docs/djongocs/campaign/index.html @@ -0,0 +1,472 @@ + + + + + + Djongo - Enterprise Commercial License - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ Simplify Query Creation +

+ Autogenerated Queries +

+

+ Writing query documents can get out of control. Djongo does the heavy lifting of creating query documents for you. +

+ + More + +
+
+ Switch DBs instantly +

+ Database Abstraction +

+

+ Switch between MongoDB and other SQL databases. Limit the impact to your Models and business logic. +

+ + More + +
+
+ Security +

+ Security +

+

+ Directly saving raw + + JSON + + into the database is scary. Djongo secures and validates the + + JSON + + document before saving. +

+ + More + +
+
+ Cloud Services +

+ Container Integration +

+

+ Managed DBs, Storage, Kubernetes, Compute and Virtual Private Cloud (VPC) Integration +

+ + More + +
+
+ Rapid Prototyping +

+ Rapid Prototyping +

+

+ Speed up development with schema free models. Enforce protection with evolution. +

+ + More + +
+
+ Web Interface +

+ Web Interface +

+

+ Access and modify MongoDB through the dashboard, CLI or API +

+ + More + +
+
+
+
+
+
+

+ Queries +

+
+
+
+
self.db['entry'].aggregate(
+  [{
+    '$match': {
+      'author_id': {
+        '$ne': None,
+        '$exists': True
+       }
+     }
+    },
+    {
+      '$lookup': {
+        'from': 'author',
+        'localField': 'author_id',
+        'foreignField': 'id',
+        'as': 'author'
+      }
+    },
+    {
+      '$unwind': '$author'
+    },
+    {
+      '$lookup': {
+        'from': 'blog',
+        'localField': 'blog_id',
+        'foreignField': 'id',
+        'as': 'blog'
+      }
+    },
+    {
+      '$unwind': {
+        'path': '$blog',
+        'preserveNullAndEmptyArrays': True
+      }
+    },
+    {
+      '$addFields': {
+        'blog': {
+          '$ifNull': ['$blog', {
+            'id': None,
+            'title': None
+          }]
+        }
+      }
+    },
+    {
+      '$match': {
+        'author.name': {
+          '$eq': 'Paul'
+        }
+      }
+    }, 
+    {
+      '$project': {
+        'id': True,
+        'blog_id': True,
+        'author_id': True,
+        'content': True,
+        'blog.id': True,
+        'blog.title': True
+      }
+    }]
+
+
+
+
+
+
+
qs = Entry.objects.filter(author__name='Paul').select_related('blog')
+
+
+
+
+
+ PyMongo +
+
+
+
+ Djongo +
+
+
+

+ Djongo generates complex, error free, aggregation queries automatically. +

+

+ It takes the query on the top and + + automatically + + generates the pymongo query document as the output. +

+
+
+
+
+
+
+
+

+ Djongo Commercial License +

+
+
+ Deploy +

+ Deploy +

+

+ Host closed source applications that use the Djongo package. +

+
+
+ Modify +

+ Modify +

+

+ Modify the djongo source code without requiring to open source your modifications. +

+ + Sample License + +
+
+ Redistribute +

+ Redistribute +

+

+ Include and redistribute the djongo package without having to open source your own code. +

+
+
+
+

+ The + + Djongo commercial license + + gives you the freedom to create Django apps with no restrictions. +

+
+
+
+
+
+

+ Prototyping +

+
+
+ Security +
+
+
+ JSONField +
+
+ Represents documents with no structure, and no validations. +
+
+ EmbeddedField +
+
+ Used to describe the data structure that triggers automatic validations at the application level. +
+
+ Settings.py +
+
+

+ Set enforce_schema to True in settings.py to enable schema checks at the database level. +

+
+
+
+ Lines of code +
+ +
+
+
+
+
+
+

+ Our flexible pricing and licensing terms are guaranteed to satisfy your organizational needs completely. +

+
+ +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/contact-us/index.html b/docs/djongocs/contact-us/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/contact-us/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/create-account/create-access/index.html b/docs/djongocs/create-account/create-access/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/create-account/create-access/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/create-account/index.html b/docs/djongocs/create-account/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/create-account/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/dashboard/index.html b/docs/djongocs/dashboard/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/dashboard/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/enterprise/index.html b/docs/djongocs/enterprise/index.html new file mode 100644 index 00000000..dc2b2548 --- /dev/null +++ b/docs/djongocs/enterprise/index.html @@ -0,0 +1,346 @@ + + + + + + Djongo Commercial License - Restriction free licenses for enterprises. + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ Deploy +

+ Deploy +

+

+ Host closed source applications that use the Djongo package. +

+
+
+ Modify +

+ Modify +

+

+ Modify the djongo source code without requiring to open source your modifications. +

+ + Sample License + +
+
+ Redistribute +

+ Redistribute +

+

+ Include and redistribute the djongo package without having to open source your own code. +

+
+
+
+

+ The + + Djongo commercial license + + gives you the freedom to create Django apps with no restrictions. +

+
+
+
+
+
+

+ Built for Enterprises +

+
+
+ First Access +

+ First Access +

+

+ Djongo packages released to enterprises are compatible with newer versions of Django and MongoDB. +

+
+
+ Support +

+ Support +

+

+ As an enterprise customer, your queries and change requests take top priority. +

+
+
+ Redistribute +

+ Secure +

+

+ Djongo source is open and viewed by hundreds of developers everyday. Reported security vulnerabilities, bugs are rectified and continuously integrated. +

+
+
+
+
+
+
+
+

+ Our flexible pricing and licensing terms are guaranteed to satisfy your organizational needs completely. +

+
+ +
+
+
+
+

+ Flexible Licensing +

+
+
+

+ Perpetual +

+

+ Use current and future versions of the djongo package for commercial purposes perpetually. +

+
+
+

+ Subscription +

+

+ Use the djongo package for commercial purposes for a limited time period. +

+
+
+

+ Fallback +

+

+ Use a specific version of the djongo package for commercial purposes perpetually. +

+
+
+
+
+
+
+

+ Services +

+
+
+

+ Consulting +

+

+ Help on choosing the right database solution for your use-cases. +

+
+
+

+ Migrations +

+

+ We move data from SQL to MongoDB. +

+
+
+

+ App development +

+

+ Build and deploy Django Apps on MongoDB. +

+
+
+ +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/index.html b/docs/djongocs/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/login/index.html b/docs/djongocs/login/index.html new file mode 100644 index 00000000..fef35463 --- /dev/null +++ b/docs/djongocs/login/index.html @@ -0,0 +1,161 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/main.400ad2f91b6fbde4.js b/docs/djongocs/main.400ad2f91b6fbde4.js new file mode 100644 index 00000000..66cc0b15 --- /dev/null +++ b/docs/djongocs/main.400ad2f91b6fbde4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[179],{26:()=>{function le(e){return"function"==typeof e}function No(e){const n=e(r=>{Error.call(r),r.stack=(new Error).stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}const rs=No(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription:\n${n.map((r,o)=>`${o+1}) ${r.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=n});function Fo(e,t){if(e){const n=e.indexOf(t);0<=n&&e.splice(n,1)}}class Mt{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;const{_parentage:n}=this;if(n)if(this._parentage=null,Array.isArray(n))for(const i of n)i.remove(this);else n.remove(this);const{initialTeardown:r}=this;if(le(r))try{r()}catch(i){t=i instanceof rs?i.errors:[i]}const{_finalizers:o}=this;if(o){this._finalizers=null;for(const i of o)try{nh(i)}catch(s){t=t??[],s instanceof rs?t=[...t,...s.errors]:t.push(s)}}if(t)throw new rs(t)}}add(t){var n;if(t&&t!==this)if(this.closed)nh(t);else{if(t instanceof Mt){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}}_hasParent(t){const{_parentage:n}=this;return n===t||Array.isArray(n)&&n.includes(t)}_addParent(t){const{_parentage:n}=this;this._parentage=Array.isArray(n)?(n.push(t),n):n?[n,t]:t}_removeParent(t){const{_parentage:n}=this;n===t?this._parentage=null:Array.isArray(n)&&Fo(n,t)}remove(t){const{_finalizers:n}=this;n&&Fo(n,t),t instanceof Mt&&t._removeParent(this)}}Mt.EMPTY=(()=>{const e=new Mt;return e.closed=!0,e})();const eh=Mt.EMPTY;function th(e){return e instanceof Mt||e&&"closed"in e&&le(e.remove)&&le(e.add)&&le(e.unsubscribe)}function nh(e){le(e)?e():e.unsubscribe()}const tr={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},os={setTimeout(e,t,...n){const{delegate:r}=os;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){const{delegate:t}=os;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function rh(e){os.setTimeout(()=>{const{onUnhandledError:t}=tr;if(!t)throw e;t(e)})}function oh(){}const Zw=Cl("C",void 0,void 0);function Cl(e,t,n){return{kind:e,value:t,error:n}}let nr=null;function is(e){if(tr.useDeprecatedSynchronousErrorHandling){const t=!nr;if(t&&(nr={errorThrown:!1,error:null}),e(),t){const{errorThrown:n,error:r}=nr;if(nr=null,n)throw r}}else e()}class wl extends Mt{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,th(t)&&t.add(this)):this.destination=nb}static create(t,n,r){return new Oo(t,n,r)}next(t){this.isStopped?El(function Yw(e){return Cl("N",e,void 0)}(t),this):this._next(t)}error(t){this.isStopped?El(function Qw(e){return Cl("E",void 0,e)}(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?El(Zw,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(t){this.destination.next(t)}_error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}}const Xw=Function.prototype.bind;function bl(e,t){return Xw.call(e,t)}class eb{constructor(t){this.partialObserver=t}next(t){const{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){ss(r)}}error(t){const{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){ss(r)}else ss(t)}complete(){const{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){ss(n)}}}class Oo extends wl{constructor(t,n,r){let o;if(super(),le(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&tr.useDeprecatedNextContext?(i=Object.create(t),i.unsubscribe=()=>this.unsubscribe(),o={next:t.next&&bl(t.next,i),error:t.error&&bl(t.error,i),complete:t.complete&&bl(t.complete,i)}):o=t}this.destination=new eb(o)}}function ss(e){tr.useDeprecatedSynchronousErrorHandling?function Jw(e){tr.useDeprecatedSynchronousErrorHandling&&nr&&(nr.errorThrown=!0,nr.error=e)}(e):rh(e)}function El(e,t){const{onStoppedNotification:n}=tr;n&&os.setTimeout(()=>n(e,t))}const nb={closed:!0,next:oh,error:function tb(e){throw e},complete:oh},Ml="function"==typeof Symbol&&Symbol.observable||"@@observable";function rr(e){return e}function ih(e){return 0===e.length?rr:1===e.length?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}let Ce=(()=>{class e{constructor(n){n&&(this._subscribe=n)}lift(n){const r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){const i=function ib(e){return e&&e instanceof wl||function ob(e){return e&&le(e.next)&&le(e.error)&&le(e.complete)}(e)&&th(e)}(n)?n:new Oo(n,r,o);return is(()=>{const{operator:s,source:a}=this;i.add(s?s.call(i,a):a?this._subscribe(i):this._trySubscribe(i))}),i}_trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}forEach(n,r){return new(r=sh(r))((o,i)=>{const s=new Oo({next:a=>{try{n(a)}catch(l){i(l),s.unsubscribe()}},error:i,complete:o});this.subscribe(s)})}_subscribe(n){var r;return null===(r=this.source)||void 0===r?void 0:r.subscribe(n)}[Ml](){return this}pipe(...n){return ih(n)(this)}toPromise(n){return new(n=sh(n))((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function sh(e){var t;return null!==(t=e??tr.Promise)&&void 0!==t?t:Promise}const sb=No(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});let Yt=(()=>{class e extends Ce{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(n){const r=new ah(this,this);return r.operator=n,r}_throwIfClosed(){if(this.closed)throw new sb}next(n){is(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(const r of this.currentObservers)r.next(n)}})}error(n){is(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=n;const{observers:r}=this;for(;r.length;)r.shift().error(n)}})}complete(){is(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:n}=this;for(;n.length;)n.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var n;return(null===(n=this.observers)||void 0===n?void 0:n.length)>0}_trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}_subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)}_innerSubscribe(n){const{hasError:r,isStopped:o,observers:i}=this;return r||o?eh:(this.currentObservers=null,i.push(n),new Mt(()=>{this.currentObservers=null,Fo(i,n)}))}_checkFinalizedStatuses(n){const{hasError:r,thrownError:o,isStopped:i}=this;r?n.error(o):i&&n.complete()}asObservable(){const n=new Ce;return n.source=this,n}}return e.create=(t,n)=>new ah(t,n),e})();class ah extends Yt{constructor(t,n){super(),this.destination=t,this.source=n}next(t){var n,r;null===(r=null===(n=this.destination)||void 0===n?void 0:n.next)||void 0===r||r.call(n,t)}error(t){var n,r;null===(r=null===(n=this.destination)||void 0===n?void 0:n.error)||void 0===r||r.call(n,t)}complete(){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.complete)||void 0===n||n.call(t)}_subscribe(t){var n,r;return null!==(r=null===(n=this.source)||void 0===n?void 0:n.subscribe(t))&&void 0!==r?r:eh}}function lh(e){return le(e?.lift)}function Ve(e){return t=>{if(lh(t))return t.lift(function(n){try{return e(n,this)}catch(r){this.error(r)}});throw new TypeError("Unable to lift unknown Observable type")}}function Re(e,t,n,r,o){return new ab(e,t,n,r,o)}class ab extends wl{constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscribe=s,this._next=n?function(a){try{n(a)}catch(l){t.error(l)}}:super._next,this._error=o?function(a){try{o(a)}catch(l){t.error(l)}finally{this.unsubscribe()}}:super._error,this._complete=r?function(){try{r()}catch(a){t.error(a)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){const{closed:n}=this;super.unsubscribe(),!n&&(null===(t=this.onFinalize)||void 0===t||t.call(this))}}}function q(e,t){return Ve((n,r)=>{let o=0;n.subscribe(Re(r,i=>{r.next(e.call(t,i,o++))}))})}function kn(e){return this instanceof kn?(this.v=e,this):new kn(e)}function dh(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o,r=n.apply(e,t||[]),i=[];return o={},s("next"),s("throw"),s("return"),o[Symbol.asyncIterator]=function(){return this},o;function s(f){r[f]&&(o[f]=function(h){return new Promise(function(p,g){i.push([f,h,p,g])>1||a(f,h)})})}function a(f,h){try{!function l(f){f.value instanceof kn?Promise.resolve(f.value.v).then(u,c):d(i[0][2],f)}(r[f](h))}catch(p){d(i[0][3],p)}}function u(f){a("next",f)}function c(f){a("throw",f)}function d(f,h){f(h),i.shift(),i.length&&a(i[0][0],i[0][1])}}function fh(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n,t=e[Symbol.asyncIterator];return t?t.call(e):(e=function Tl(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}(e),n={},r("next"),r("throw"),r("return"),n[Symbol.asyncIterator]=function(){return this},n);function r(i){n[i]=e[i]&&function(s){return new Promise(function(a,l){!function o(i,s,a,l){Promise.resolve(l).then(function(u){i({value:u,done:a})},s)}(a,l,(s=e[i](s)).done,s.value)})}}}"function"==typeof SuppressedError&&SuppressedError;const hh=e=>e&&"number"==typeof e.length&&"function"!=typeof e;function ph(e){return le(e?.then)}function gh(e){return le(e[Ml])}function mh(e){return Symbol.asyncIterator&&le(e?.[Symbol.asyncIterator])}function yh(e){return new TypeError(`You provided ${null!==e&&"object"==typeof e?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}const vh=function Tb(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}();function _h(e){return le(e?.[vh])}function Dh(e){return dh(this,arguments,function*(){const n=e.getReader();try{for(;;){const{value:r,done:o}=yield kn(n.read());if(o)return yield kn(void 0);yield yield kn(r)}}finally{n.releaseLock()}})}function Ch(e){return le(e?.getReader)}function Pt(e){if(e instanceof Ce)return e;if(null!=e){if(gh(e))return function xb(e){return new Ce(t=>{const n=e[Ml]();if(le(n.subscribe))return n.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}(e);if(hh(e))return function Rb(e){return new Ce(t=>{for(let n=0;n{e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,rh)})}(e);if(mh(e))return wh(e);if(_h(e))return function Fb(e){return new Ce(t=>{for(const n of e)if(t.next(n),t.closed)return;t.complete()})}(e);if(Ch(e))return function Ob(e){return wh(Dh(e))}(e)}throw yh(e)}function wh(e){return new Ce(t=>{(function Pb(e,t){var n,r,o,i;return function uh(e,t,n,r){return new(n||(n=Promise))(function(i,s){function a(c){try{u(r.next(c))}catch(d){s(d)}}function l(c){try{u(r.throw(c))}catch(d){s(d)}}function u(c){c.done?i(c.value):function o(i){return i instanceof n?i:new n(function(s){s(i)})}(c.value).then(a,l)}u((r=r.apply(e,t||[])).next())})}(this,void 0,void 0,function*(){try{for(n=fh(e);!(r=yield n.next()).done;)if(t.next(r.value),t.closed)return}catch(s){o={error:s}}finally{try{r&&!r.done&&(i=n.return)&&(yield i.call(n))}finally{if(o)throw o.error}}t.complete()})})(e,t).catch(n=>t.error(n))})}function gn(e,t,n,r=0,o=!1){const i=t.schedule(function(){n(),o?e.add(this.schedule(null,r)):this.unsubscribe()},r);if(e.add(i),!o)return i}function Ue(e,t,n=1/0){return le(t)?Ue((r,o)=>q((i,s)=>t(r,i,o,s))(Pt(e(r,o))),n):("number"==typeof t&&(n=t),Ve((r,o)=>function kb(e,t,n,r,o,i,s,a){const l=[];let u=0,c=0,d=!1;const f=()=>{d&&!l.length&&!u&&t.complete()},h=g=>u{i&&t.next(g),u++;let m=!1;Pt(n(g,c++)).subscribe(Re(t,v=>{o?.(v),i?h(v):t.next(v)},()=>{m=!0},void 0,()=>{if(m)try{for(u--;l.length&&up(v)):p(v)}f()}catch(v){t.error(v)}}))};return e.subscribe(Re(t,h,()=>{d=!0,f()})),()=>{a?.()}}(r,o,e,n)))}function xr(e=1/0){return Ue(rr,e)}const mn=new Ce(e=>e.complete());function xl(e){return e[e.length-1]}function bh(e){return le(xl(e))?e.pop():void 0}function Po(e){return function Vb(e){return e&&le(e.schedule)}(xl(e))?e.pop():void 0}function Eh(e,t=0){return Ve((n,r)=>{n.subscribe(Re(r,o=>gn(r,e,()=>r.next(o),t),()=>gn(r,e,()=>r.complete(),t),o=>gn(r,e,()=>r.error(o),t)))})}function Mh(e,t=0){return Ve((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),t))})}function Sh(e,t){if(!e)throw new Error("Iterable cannot be null");return new Ce(n=>{gn(n,t,()=>{const r=e[Symbol.asyncIterator]();gn(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function Me(e,t){return t?function zb(e,t){if(null!=e){if(gh(e))return function Bb(e,t){return Pt(e).pipe(Mh(t),Eh(t))}(e,t);if(hh(e))return function $b(e,t){return new Ce(n=>{let r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}(e,t);if(ph(e))return function Ub(e,t){return Pt(e).pipe(Mh(t),Eh(t))}(e,t);if(mh(e))return Sh(e,t);if(_h(e))return function Hb(e,t){return new Ce(n=>{let r;return gn(n,t,()=>{r=e[vh](),gn(n,t,()=>{let o,i;try{({value:o,done:i}=r.next())}catch(s){return void n.error(s)}i?n.complete():n.next(o)},0,!0)}),()=>le(r?.return)&&r.return()})}(e,t);if(Ch(e))return function Gb(e,t){return Sh(Dh(e),t)}(e,t)}throw yh(e)}(e,t):Pt(e)}function Rl(e,t,...n){if(!0===t)return void e();if(!1===t)return;const r=new Oo({next:()=>{r.unsubscribe(),e()}});return t(...n).subscribe(r)}function ie(e){for(let t in e)if(e[t]===ie)return t;throw Error("Could not find renamed property on target object.")}function Nl(e,t){for(const n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function se(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(se).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const t=e.toString();if(null==t)return""+t;const n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function Fl(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}const Kb=ie({__forward_ref__:ie});function ue(e){return e.__forward_ref__=ue,e.toString=function(){return se(this())},e}function k(e){return Ol(e)?e():e}function Ol(e){return"function"==typeof e&&e.hasOwnProperty(Kb)&&e.__forward_ref__===ue}class w extends Error{constructor(t,n){super(function as(e,t){return`NG0${Math.abs(e)}${t?": "+t.trim():""}`}(t,n)),this.code=t}}function U(e){return"string"==typeof e?e:null==e?"":String(e)}function ls(e,t){throw new w(-201,!1)}function dt(e,t){null==e&&function ee(e,t,n,r){throw new Error(`ASSERTION ERROR: ${e}`+(null==r?"":` [Expected=> ${n} ${r} ${t} <=Actual]`))}(t,e,null,"!=")}function L(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ft(e){return{providers:e.providers||[],imports:e.imports||[]}}function us(e){return Ih(e,cs)||Ih(e,Th)}function Ih(e,t){return e.hasOwnProperty(t)?e[t]:null}function Ah(e){return e&&(e.hasOwnProperty(Pl)||e.hasOwnProperty(rE))?e[Pl]:null}const cs=ie({\u0275prov:ie}),Pl=ie({\u0275inj:ie}),Th=ie({ngInjectableDef:ie}),rE=ie({ngInjectorDef:ie});var O=(()=>((O=O||{})[O.Default=0]="Default",O[O.Host=1]="Host",O[O.Self=2]="Self",O[O.SkipSelf=4]="SkipSelf",O[O.Optional=8]="Optional",O))();let kl;function St(e){const t=kl;return kl=e,t}function xh(e,t,n){const r=us(e);return r&&"root"==r.providedIn?void 0===r.value?r.value=r.factory():r.value:n&O.Optional?null:void 0!==t?t:void ls(se(e))}function Ln(e){return{toString:e}.toString()}var kt=(()=>((kt=kt||{})[kt.OnPush=0]="OnPush",kt[kt.Default=1]="Default",kt))(),Jt=(()=>{return(e=Jt||(Jt={}))[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom",Jt;var e})();const ce=(()=>typeof globalThis<"u"&&globalThis||typeof global<"u"&&global||typeof window<"u"&&window||typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&self)(),Rr={},X=[],ds=ie({\u0275cmp:ie}),Ll=ie({\u0275dir:ie}),Vl=ie({\u0275pipe:ie}),Rh=ie({\u0275mod:ie}),vn=ie({\u0275fac:ie}),ko=ie({__NG_ELEMENT_ID__:ie});let iE=0;function ht(e){return Ln(()=>{const n=!0===e.standalone,r={},o={type:e.type,providersResolver:null,decls:e.decls,vars:e.vars,factory:null,template:e.template||null,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:r,inputs:null,outputs:null,exportAs:e.exportAs||null,onPush:e.changeDetection===kt.OnPush,directiveDefs:null,pipeDefs:null,standalone:n,dependencies:n&&e.dependencies||null,getStandaloneInjector:null,selectors:e.selectors||X,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||Jt.Emulated,id:"c"+iE++,styles:e.styles||X,_:null,setInput:null,schemas:e.schemas||null,tView:null},i=e.dependencies,s=e.features;return o.inputs=Oh(e.inputs,r),o.outputs=Oh(e.outputs),s&&s.forEach(a=>a(o)),o.directiveDefs=i?()=>("function"==typeof i?i():i).map(Nh).filter(Fh):null,o.pipeDefs=i?()=>("function"==typeof i?i():i).map(Je).filter(Fh):null,o})}function Nh(e){return re(e)||Ye(e)}function Fh(e){return null!==e}function It(e){return Ln(()=>({type:e.type,bootstrap:e.bootstrap||X,declarations:e.declarations||X,imports:e.imports||X,exports:e.exports||X,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function Oh(e,t){if(null==e)return Rr;const n={};for(const r in e)if(e.hasOwnProperty(r)){let o=e[r],i=o;Array.isArray(o)&&(i=o[1],o=o[0]),n[o]=r,t&&(t[o]=i)}return n}const V=ht;function st(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,standalone:!0===e.standalone,onDestroy:e.type.prototype.ngOnDestroy||null}}function re(e){return e[ds]||null}function Ye(e){return e[Ll]||null}function Je(e){return e[Vl]||null}function pt(e,t){const n=e[Rh]||null;if(!n&&!0===t)throw new Error(`Type ${se(e)} does not have '\u0275mod' property.`);return n}const G=11;function at(e){return Array.isArray(e)&&"object"==typeof e[1]}function Vt(e){return Array.isArray(e)&&!0===e[1]}function Ul(e){return 0!=(8&e.flags)}function gs(e){return 2==(2&e.flags)}function ms(e){return 1==(1&e.flags)}function jt(e){return null!==e.template}function dE(e){return 0!=(256&e[2])}function lr(e,t){return e.hasOwnProperty(vn)?e[vn]:null}class pE{constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}}function mt(){return Lh}function Lh(e){return e.type.prototype.ngOnChanges&&(e.setInput=mE),gE}function gE(){const e=jh(this),t=e?.current;if(t){const n=e.previous;if(n===Rr)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function mE(e,t,n,r){const o=jh(e)||function yE(e,t){return e[Vh]=t}(e,{previous:Rr,current:null}),i=o.current||(o.current={}),s=o.previous,a=this.declaredInputs[n],l=s[a];i[a]=new pE(l&&l.currentValue,t,s===Rr),e[r]=t}mt.ngInherit=!0;const Vh="__ngSimpleChanges__";function jh(e){return e[Vh]||null}function Se(e){for(;Array.isArray(e);)e=e[0];return e}function ys(e,t){return Se(t[e])}function yt(e,t){return Se(t[e.index])}function Wl(e,t){return e.data[t]}function kr(e,t){return e[t]}function vt(e,t){const n=t[e];return at(n)?n:n[0]}function vs(e){return 64==(64&e[2])}function Vn(e,t){return null==t?null:e[t]}function Bh(e){e[18]=0}function ql(e,t){e[5]+=t;let n=e,r=e[3];for(;null!==r&&(1===t&&1===n[5]||-1===t&&0===n[5]);)r[5]+=t,n=r,r=r[3]}const B={lFrame:Qh(null),bindingsEnabled:!0};function $h(){return B.bindingsEnabled}function _(){return B.lFrame.lView}function Q(){return B.lFrame.tView}function Bt(e){return B.lFrame.contextLView=e,e[8]}function Ut(e){return B.lFrame.contextLView=null,e}function Ne(){let e=Hh();for(;null!==e&&64===e.type;)e=e.parent;return e}function Hh(){return B.lFrame.currentTNode}function Xt(e,t){const n=B.lFrame;n.currentTNode=e,n.isParent=t}function Kl(){return B.lFrame.isParent}function Zl(){B.lFrame.isParent=!1}function Lr(){return B.lFrame.bindingIndex++}function Dn(e){const t=B.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function NE(e,t){const n=B.lFrame;n.bindingIndex=n.bindingRootIndex=e,Ql(t)}function Ql(e){B.lFrame.currentDirectiveIndex=e}function qh(){return B.lFrame.currentQueryIndex}function Jl(e){B.lFrame.currentQueryIndex=e}function OE(e){const t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function Kh(e,t,n){if(n&O.SkipSelf){let o=t,i=e;for(;!(o=o.parent,null!==o||n&O.Host||(o=OE(i),null===o||(i=i[15],10&o.type))););if(null===o)return!1;t=o,e=i}const r=B.lFrame=Zh();return r.currentTNode=t,r.lView=e,!0}function Xl(e){const t=Zh(),n=e[1];B.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function Zh(){const e=B.lFrame,t=null===e?null:e.child;return null===t?Qh(e):t}function Qh(e){const t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=t),t}function Yh(){const e=B.lFrame;return B.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const Jh=Yh;function eu(){const e=Yh();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function et(){return B.lFrame.selectedIndex}function jn(e){B.lFrame.selectedIndex=e}function me(){const e=B.lFrame;return Wl(e.tView,e.selectedIndex)}function _s(){B.lFrame.currentNamespace="svg"}function tu(){!function VE(){B.lFrame.currentNamespace=null}()}function Ds(e,t){for(let n=t.directiveStart,r=t.directiveEnd;n=r)break}else t[l]<0&&(e[18]+=65536),(a>11>16&&(3&e[2])===t){e[2]+=2048;try{i.call(a)}finally{}}}else try{i.call(a)}finally{}}class $o{constructor(t,n,r){this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=r}}function bs(e,t,n){let r=0;for(;rt){s=i-1;break}}}for(;i>16}(e),r=t;for(;n>0;)r=r[15],n--;return r}let ou=!0;function Ms(e){const t=ou;return ou=e,t}let qE=0;const en={};function Go(e,t){const n=su(e,t);if(-1!==n)return n;const r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,iu(r.data,e),iu(t,null),iu(r.blueprint,null));const o=Ss(e,t),i=e.injectorIndex;if(rp(o)){const s=Vr(o),a=jr(o,t),l=a[1].data;for(let u=0;u<8;u++)t[i+u]=a[s+u]|l[s+u]}return t[i+8]=o,i}function iu(e,t){e.push(0,0,0,0,0,0,0,0,t)}function su(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function Ss(e,t){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;null!==o;){if(r=fp(o),null===r)return-1;if(n++,o=o[15],-1!==r.injectorIndex)return r.injectorIndex|n<<16}return-1}function Is(e,t,n){!function KE(e,t,n){let r;"string"==typeof n?r=n.charCodeAt(0)||0:n.hasOwnProperty(ko)&&(r=n[ko]),null==r&&(r=n[ko]=qE++);const o=255&r;t.data[e+(o>>5)]|=1<=0?255&t:JE:t}(n);if("function"==typeof i){if(!Kh(t,e,r))return r&O.Host?sp(o,0,r):ap(t,n,r,o);try{const s=i(r);if(null!=s||r&O.Optional)return s;ls()}finally{Jh()}}else if("number"==typeof i){let s=null,a=su(e,t),l=-1,u=r&O.Host?t[16][6]:null;for((-1===a||r&O.SkipSelf)&&(l=-1===a?Ss(e,t):t[a+8],-1!==l&&dp(r,!1)?(s=t[1],a=Vr(l),t=jr(l,t)):a=-1);-1!==a;){const c=t[1];if(cp(i,a,c.data)){const d=QE(a,t,n,s,r,u);if(d!==en)return d}l=t[a+8],-1!==l&&dp(r,t[1].data[a+8]===u)&&cp(i,a,t)?(s=c,a=Vr(l),t=jr(l,t)):a=-1}}return o}function QE(e,t,n,r,o,i){const s=t[1],a=s.data[e+8],c=As(a,s,n,null==r?gs(a)&&ou:r!=s&&0!=(3&a.type),o&O.Host&&i===a);return null!==c?zo(t,s,c,a):en}function As(e,t,n,r,o){const i=e.providerIndexes,s=t.data,a=1048575&i,l=e.directiveStart,c=i>>20,f=o?a+c:e.directiveEnd;for(let h=r?a:a+c;h=l&&p.type===n)return h}if(o){const h=s[l];if(h&&jt(h)&&h.type===n)return l}return null}function zo(e,t,n,r){let o=e[n];const i=t.data;if(function $E(e){return e instanceof $o}(o)){const s=o;s.resolving&&function Zb(e,t){const n=t?`. Dependency path: ${t.join(" > ")} > ${e}`:"";throw new w(-200,`Circular dependency in DI detected for ${e}${n}`)}(function J(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():U(e)}(i[n]));const a=Ms(s.canSeeViewProviders);s.resolving=!0;const l=s.injectImpl?St(s.injectImpl):null;Kh(e,r,O.Default);try{o=e[n]=s.factory(void 0,i,e,r),t.firstCreatePass&&n>=r.directiveStart&&function BE(e,t,n){const{ngOnChanges:r,ngOnInit:o,ngDoCheck:i}=t.type.prototype;if(r){const s=Lh(t);(n.preOrderHooks||(n.preOrderHooks=[])).push(e,s),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,s)}o&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-e,o),i&&((n.preOrderHooks||(n.preOrderHooks=[])).push(e,i),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,i))}(n,i[n],t)}finally{null!==l&&St(l),Ms(a),s.resolving=!1,Jh()}}return o}function cp(e,t,n){return!!(n[t+(e>>5)]&1<{const t=e.prototype.constructor,n=t[vn]||au(t),r=Object.prototype;let o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){const i=o[vn]||au(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function au(e){return Ol(e)?()=>{const t=au(k(e));return t&&t()}:lr(e)}function fp(e){const t=e[1],n=t.type;return 2===n?t.declTNode:1===n?e[6]:null}function Wo(e){return function ZE(e,t){if("class"===t)return e.classes;if("style"===t)return e.styles;const n=e.attrs;if(n){const r=n.length;let o=0;for(;o{const r=function lu(e){return function(...n){if(e){const r=e(...n);for(const o in r)this[o]=r[o]}}}(t);function o(...i){if(this instanceof o)return r.apply(this,i),this;const s=new o(...i);return a.annotation=s,a;function a(l,u,c){const d=l.hasOwnProperty($r)?l[$r]:Object.defineProperty(l,$r,{value:[]})[$r];for(;d.length<=c;)d.push(null);return(d[c]=d[c]||[]).push(s),l}}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=e,o.annotationCls=o,o})}class R{constructor(t,n){this._desc=t,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof n?this.__NG_ELEMENT_ID__=n:void 0!==n&&(this.\u0275prov=L({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}}function _t(e,t){void 0===t&&(t=e);for(let n=0;nArray.isArray(n)?Cn(n,t):t(n))}function pp(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Ts(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function Dt(e,t,n){let r=zr(e,t);return r>=0?e[1|r]=n:(r=~r,function r0(e,t,n,r){let o=e.length;if(o==t)e.push(n,r);else if(1===o)e.push(r,e[0]),e[0]=n;else{for(o--,e.push(e[o-1],e[o]);o>t;)e[o]=e[o-2],o--;e[t]=n,e[t+1]=r}}(e,r,t,n)),r}function cu(e,t){const n=zr(e,t);if(n>=0)return e[1|n]}function zr(e,t){return function yp(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){const i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o<((lt=lt||{})[lt.Important=1]="Important",lt[lt.DashCase=2]="DashCase",lt))();const vu=new Map;let F0=0;const Du="__ngContext__";function We(e,t){at(t)?(e[Du]=t[20],function P0(e){vu.set(e[20],e)}(t)):e[Du]=t}function wu(e,t){return undefined(e,t)}function oi(e){const t=e[3];return Vt(t)?t[3]:t}function bu(e){return jp(e[13])}function Eu(e){return jp(e[4])}function jp(e){for(;null!==e&&!Vt(e);)e=e[4];return e}function Kr(e,t,n,r,o){if(null!=r){let i,s=!1;Vt(r)?i=r:at(r)&&(s=!0,r=r[0]);const a=Se(r);0===e&&null!==n?null==o?zp(t,n,a):ur(t,n,a,o||null,!0):1===e&&null!==n?ur(t,n,a,o||null,!0):2===e?function Ru(e,t,n){const r=Os(e,t);r&&function rM(e,t,n,r){e.removeChild(t,n,r)}(e,r,t,n)}(t,a,s):3===e&&t.destroyNode(a),null!=i&&function sM(e,t,n,r,o){const i=n[7];i!==Se(n)&&Kr(t,e,r,i,o);for(let a=10;a0&&(e[n-1][4]=r[4]);const i=Ts(e,10+t);!function Z0(e,t){ii(e,t,t[G],2,null,null),t[0]=null,t[6]=null}(r[1],r);const s=i[19];null!==s&&s.detachView(i[1]),r[3]=null,r[4]=null,r[2]&=-65}return r}function $p(e,t){if(!(128&t[2])){const n=t[G];n.destroyNode&&ii(e,t,n,3,null,null),function J0(e){let t=e[13];if(!t)return Au(e[1],e);for(;t;){let n=null;if(at(t))n=t[13];else{const r=t[10];r&&(n=r)}if(!n){for(;t&&!t[4]&&t!==e;)at(t)&&Au(t[1],t),t=t[3];null===t&&(t=e),at(t)&&Au(t[1],t),n=t&&t[4]}t=n}}(t)}}function Au(e,t){if(!(128&t[2])){t[2]&=-65,t[2]|=128,function nM(e,t){let n;if(null!=e&&null!=(n=e.destroyHooks))for(let r=0;r=0?r[o=u]():r[o=-u].unsubscribe(),i+=2}else{const s=r[o=n[i+1]];n[i].call(s)}if(null!==r){for(let i=o+1;ie,createScript:e=>e,createScriptURL:e=>e})}catch{}return Ls}()?.createHTML(e)||e}function tg(e){return function ku(){if(void 0===Vs&&(Vs=null,ce.trustedTypes))try{Vs=ce.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch{}return Vs}()?.createHTML(e)||e}class og{constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see https://g.co/ng/security#xss)`}}function Un(e){return e instanceof og?e.changingThisBreaksApplicationSecurity:e}class vM{constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=""+t;try{const n=(new window.DOMParser).parseFromString(cr(t),"text/html").body;return null===n?this.inertDocumentHelper.getInertBodyElement(t):(n.removeChild(n.firstChild),n)}catch{return null}}}class _M{constructor(t){if(this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),null==this.inertDocument.body){const n=this.inertDocument.createElement("html");this.inertDocument.appendChild(n);const r=this.inertDocument.createElement("body");n.appendChild(r)}}getInertBodyElement(t){const n=this.inertDocument.createElement("template");if("content"in n)return n.innerHTML=cr(t),n;const r=this.inertDocument.createElement("body");return r.innerHTML=cr(t),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(r),r}stripCustomNsAttrs(t){const n=t.attributes;for(let o=n.length-1;0"),!0}endElement(t){const n=t.nodeName.toLowerCase();Vu.hasOwnProperty(n)&&!sg.hasOwnProperty(n)&&(this.buf.push(""))}chars(t){this.buf.push(cg(t))}checkClobberedElement(t,n){if(n&&(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error(`Failed to sanitize html because the element is clobbered: ${t.outerHTML}`);return n}}const EM=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,MM=/([^\#-~ |!])/g;function cg(e){return e.replace(/&/g,"&").replace(EM,function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"}).replace(MM,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}let js;function Bu(e){return"content"in e&&function IM(e){return e.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===e.nodeName}(e)?e.content:null}var Ie=(()=>((Ie=Ie||{})[Ie.NONE=0]="NONE",Ie[Ie.HTML=1]="HTML",Ie[Ie.STYLE=2]="STYLE",Ie[Ie.SCRIPT=3]="SCRIPT",Ie[Ie.URL=4]="URL",Ie[Ie.RESOURCE_URL=5]="RESOURCE_URL",Ie))();function dg(e){const t=function li(){const e=_();return e&&e[12]}();return t?tg(t.sanitize(Ie.HTML,e)||""):function si(e,t){const n=function yM(e){return e instanceof og&&e.getTypeName()||null}(e);if(null!=n&&n!==t){if("ResourceURL"===n&&"URL"===t)return!0;throw new Error(`Required a safe ${t}, got a ${n} (see https://g.co/ng/security#xss)`)}return n===t}(e,"HTML")?tg(Un(e)):function SM(e,t){let n=null;try{js=js||function ig(e){const t=new _M(e);return function DM(){try{return!!(new window.DOMParser).parseFromString(cr(""),"text/html")}catch{return!1}}()?new vM(t):t}(e);let r=t?String(t):"";n=js.getInertBodyElement(r);let o=5,i=r;do{if(0===o)throw new Error("Failed to sanitize html because the input is unstable");o--,r=i,i=n.innerHTML,n=js.getInertBodyElement(r)}while(r!==i);return cr((new bM).sanitizeChildren(Bu(n)||n))}finally{if(n){const r=Bu(n)||n;for(;r.firstChild;)r.removeChild(r.firstChild)}}}(function eg(){return void 0!==Pu?Pu:typeof document<"u"?document:void 0}(),U(e))}const $u=new R("ENVIRONMENT_INITIALIZER"),hg=new R("INJECTOR",-1),pg=new R("INJECTOR_DEF_TYPES");class gg{get(t,n=Qo){if(n===Qo){const r=new Error(`NullInjectorError: No provider for ${se(t)}!`);throw r.name="NullInjectorError",r}return n}}function OM(...e){return{\u0275providers:mg(0,e)}}function mg(e,...t){const n=[],r=new Set;let o;return Cn(t,i=>{const s=i;Hu(s,n,[],r)&&(o||(o=[]),o.push(s))}),void 0!==o&&yg(o,n),n}function yg(e,t){for(let n=0;n{t.push(i)})}}function Hu(e,t,n,r){if(!(e=k(e)))return!1;let o=null,i=Ah(e);const s=!i&&re(e);if(i||s){if(s&&!s.standalone)return!1;o=e}else{const l=e.ngModule;if(i=Ah(l),!i)return!1;o=l}const a=r.has(o);if(s){if(a)return!1;if(r.add(o),s.dependencies){const l="function"==typeof s.dependencies?s.dependencies():s.dependencies;for(const u of l)Hu(u,t,n,r)}}else{if(!i)return!1;{if(null!=i.imports&&!a){let u;r.add(o);try{Cn(i.imports,c=>{Hu(c,t,n,r)&&(u||(u=[]),u.push(c))})}finally{}void 0!==u&&yg(u,t)}if(!a){const u=lr(o)||(()=>new o);t.push({provide:o,useFactory:u,deps:X},{provide:pg,useValue:o,multi:!0},{provide:$u,useValue:()=>I(o),multi:!0})}const l=i.providers;null==l||a||Cn(l,c=>{t.push(c)})}}return o!==e&&void 0!==e.providers}const PM=ie({provide:String,useValue:ie});function Gu(e){return null!==e&&"object"==typeof e&&PM in e}function dr(e){return"function"==typeof e}const zu=new R("Set Injector scope."),Bs={},LM={};let Wu;function Us(){return void 0===Wu&&(Wu=new gg),Wu}class $n{}class Dg extends $n{constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,this.records=new Map,this._ngOnDestroyHooks=new Set,this._onDestroyHooks=[],this._destroyed=!1,Ku(t,s=>this.processProvider(s)),this.records.set(hg,Zr(void 0,this)),o.has("environment")&&this.records.set($n,Zr(void 0,this));const i=this.records.get(zu);null!=i&&"string"==typeof i.value&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(pg.multi,X,O.Self))}get destroyed(){return this._destroyed}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{for(const t of this._ngOnDestroyHooks)t.ngOnDestroy();for(const t of this._onDestroyHooks)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),this._onDestroyHooks.length=0}}onDestroy(t){this._onDestroyHooks.push(t)}runInContext(t){this.assertNotDestroyed();const n=Wr(this),r=St(void 0);try{return t()}finally{Wr(n),St(r)}}get(t,n=Qo,r=O.Default){this.assertNotDestroyed();const o=Wr(this),i=St(void 0);try{if(!(r&O.SkipSelf)){let a=this.records.get(t);if(void 0===a){const l=function $M(e){return"function"==typeof e||"object"==typeof e&&e instanceof R}(t)&&us(t);a=l&&this.injectableDefInScope(l)?Zr(qu(t),Bs):null,this.records.set(t,a)}if(null!=a)return this.hydrate(t,a)}return(r&O.Self?Us():this.parent).get(t,n=r&O.Optional&&n===Qo?null:n)}catch(s){if("NullInjectorError"===s.name){if((s[Rs]=s[Rs]||[]).unshift(se(t)),o)throw s;return function m0(e,t,n,r){const o=e[Rs];throw t[vp]&&o.unshift(t[vp]),e.message=function y0(e,t,n,r=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let o=se(t);if(Array.isArray(t))o=t.map(se).join(" -> ");else if("object"==typeof t){let i=[];for(let s in t)if(t.hasOwnProperty(s)){let a=t[s];i.push(s+":"+("string"==typeof a?JSON.stringify(a):se(a)))}o=`{${i.join(", ")}}`}return`${n}${r?"("+r+")":""}[${o}]: ${e.replace(f0,"\n ")}`}("\n"+e.message,o,n,r),e.ngTokenPath=o,e[Rs]=null,e}(s,t,"R3InjectorError",this.source)}throw s}finally{St(i),Wr(o)}}resolveInjectorInitializers(){const t=Wr(this),n=St(void 0);try{const r=this.get($u.multi,X,O.Self);for(const o of r)o()}finally{Wr(t),St(n)}}toString(){const t=[],n=this.records;for(const r of n.keys())t.push(se(r));return`R3Injector[${t.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new w(205,!1)}processProvider(t){let n=dr(t=k(t))?t:k(t&&t.provide);const r=function jM(e){return Gu(e)?Zr(void 0,e.useValue):Zr(Cg(e),Bs)}(t);if(dr(t)||!0!==t.multi)this.records.get(n);else{let o=this.records.get(n);o||(o=Zr(void 0,Bs,!0),o.factory=()=>hu(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n){return n.value===Bs&&(n.value=LM,n.value=n.factory()),"object"==typeof n.value&&n.value&&function UM(e){return null!==e&&"object"==typeof e&&"function"==typeof e.ngOnDestroy}(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}injectableDefInScope(t){if(!t.providedIn)return!1;const n=k(t.providedIn);return"string"==typeof n?"any"===n||this.scopes.has(n):this.injectorDefTypes.has(n)}}function qu(e){const t=us(e),n=null!==t?t.factory:lr(e);if(null!==n)return n;if(e instanceof R)throw new w(204,!1);if(e instanceof Function)return function VM(e){const t=e.length;if(t>0)throw function Zo(e,t){const n=[];for(let r=0;rn.factory(e):()=>new e}(e);throw new w(204,!1)}function Cg(e,t,n){let r;if(dr(e)){const o=k(e);return lr(o)||qu(o)}if(Gu(e))r=()=>k(e.useValue);else if(function _g(e){return!(!e||!e.useFactory)}(e))r=()=>e.useFactory(...hu(e.deps||[]));else if(function vg(e){return!(!e||!e.useExisting)}(e))r=()=>I(k(e.useExisting));else{const o=k(e&&(e.useClass||e.provide));if(!function BM(e){return!!e.deps}(e))return lr(o)||qu(o);r=()=>new o(...hu(e.deps))}return r}function Zr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function HM(e){return!!e.\u0275providers}function Ku(e,t){for(const n of e)Array.isArray(n)?Ku(n,t):HM(n)?Ku(n.\u0275providers,t):t(n)}class wg{}class WM{resolveComponentFactory(t){throw function zM(e){const t=Error(`No component factory found for ${se(e)}. Did you add it to @NgModule.entryComponents?`);return t.ngComponent=e,t}(t)}}let ui=(()=>{class e{}return e.NULL=new WM,e})();function qM(){return Qr(Ne(),_())}function Qr(e,t){return new Ct(yt(e,t))}let Ct=(()=>{class e{constructor(n){this.nativeElement=n}}return e.__NG_ELEMENT_ID__=qM,e})();function KM(e){return e instanceof Ct?e.nativeElement:e}class Eg{}let bn=(()=>{class e{}return e.__NG_ELEMENT_ID__=()=>function ZM(){const e=_(),n=vt(Ne().index,e);return(at(n)?n:e)[G]}(),e})(),QM=(()=>{class e{}return e.\u0275prov=L({token:e,providedIn:"root",factory:()=>null}),e})();class ci{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const YM=new ci("14.3.0"),Zu={};function Yu(e){return e.ngOriginalError}class Yr{constructor(){this._console=console}handleError(t){const n=this._findOriginalError(t);this._console.error("ERROR",t),n&&this._console.error("ORIGINAL ERROR",n)}_findOriginalError(t){let n=t&&Yu(t);for(;n&&Yu(n);)n=Yu(n);return n||null}}function En(e){return e instanceof Function?e():e}function Sg(e,t,n){let r=e.length;for(;;){const o=e.indexOf(t,n);if(-1===o)return o;if(0===o||e.charCodeAt(o-1)<=32){const i=t.length;if(o+i===r||e.charCodeAt(o+i)<=32)return o}n=o+1}}const Ig="ng-template";function lS(e,t,n){let r=0;for(;ri?"":o[d+1].toLowerCase();const h=8&r?f:null;if(h&&-1!==Sg(h,u,0)||2&r&&u!==f){if($t(r))return!1;s=!0}}}}else{if(!s&&!$t(r)&&!$t(l))return!1;if(s&&$t(l))continue;s=!1,r=l|1&r}}return $t(r)||s}function $t(e){return 0==(1&e)}function dS(e,t,n,r){if(null===t)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+a+'"':"")+"]"}else 8&r?o+="."+s:4&r&&(o+=" "+s);else""!==o&&!$t(s)&&(t+=xg(i,o),o=""),r=s,i=i||!$t(r);n++}return""!==o&&(t+=xg(i,o)),t}const $={};function A(e){Rg(Q(),_(),et()+e,!1)}function Rg(e,t,n,r){if(!r)if(3==(3&t[2])){const i=e.preOrderCheckHooks;null!==i&&Cs(t,i,n)}else{const i=e.preOrderHooks;null!==i&&ws(t,i,0,n)}jn(n)}function Pg(e,t=null,n=null,r){const o=kg(e,t,n,r);return o.resolveInjectorInitializers(),o}function kg(e,t=null,n=null,r,o=new Set){const i=[n||X,OM(e)];return r=r||("object"==typeof e?void 0:se(e)),new Dg(i,t||Us(),r||null,o)}let wt=(()=>{class e{static create(n,r){if(Array.isArray(n))return Pg({name:""},r,n,"");{const o=n.name??"";return Pg({name:o},n.parent,n.providers,o)}}}return e.THROW_IF_NOT_FOUND=Qo,e.NULL=new gg,e.\u0275prov=L({token:e,providedIn:"any",factory:()=>I(hg)}),e.__NG_ELEMENT_ID__=-1,e})();function D(e,t=O.Default){const n=_();return null===n?I(e,t):lp(Ne(),n,k(e),t)}function nc(){throw new Error("invalid")}function Hs(e,t){return e<<17|t<<2}function Ht(e){return e>>17&32767}function rc(e){return 2|e}function Mn(e){return(131068&e)>>2}function oc(e,t){return-131069&e|t<<2}function ic(e){return 1|e}function Xg(e,t){const n=e.contentQueries;if(null!==n)for(let r=0;r22&&Rg(e,t,22,!1),n(r,o)}finally{jn(i)}}function tm(e,t,n){if(Ul(t)){const o=t.directiveEnd;for(let i=t.directiveStart;i0;){const n=e[--t];if("number"==typeof n&&n<0)return n}return 0})(a)!=l&&a.push(l),a.push(r,o,s)}}function lm(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function um(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function aI(e,t,n){if(n){if(t.exportAs)for(let r=0;r0&&Dc(n)}}function Dc(e){for(let r=bu(e);null!==r;r=Eu(r))for(let o=10;o0&&Dc(i)}const n=e[1].components;if(null!==n)for(let r=0;r0&&Dc(o)}}function pI(e,t){const n=vt(t,e),r=n[1];(function gI(e,t){for(let n=t.length;n-1&&(Iu(t,r),Ts(n,r))}this._attachedToViewContainer=!1}$p(this._lView[1],this._lView)}onDestroy(t){rm(this._lView[1],this._lView,null,t)}markForCheck(){Cc(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-65}reattach(){this._lView[2]|=64}detectChanges(){Zs(this._lView[1],this._lView,this.context)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new w(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null,function Y0(e,t){ii(e,t,t[G],2,null,null)}(this._lView[1],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new w(902,!1);this._appRef=t}}class mI extends di{constructor(t){super(t),this._view=t}detectChanges(){const t=this._view;Zs(t[1],t,t[8],!1)}checkNoChanges(){}get context(){return null}}class Ec extends ui{constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){const n=re(t);return new fi(n,this.ngModule)}}function ym(e){const t=[];for(let n in e)e.hasOwnProperty(n)&&t.push({propName:e[n],templateName:n});return t}class vI{constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){const o=this.injector.get(t,Zu,r);return o!==Zu||n===Zu?o:this.parentInjector.get(t,n,r)}}class fi extends wg{constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=function yS(e){return e.map(mS).join(",")}(t.selectors),this.ngContentSelectors=t.ngContentSelectors?t.ngContentSelectors:[],this.isBoundToModule=!!n}get inputs(){return ym(this.componentDef.inputs)}get outputs(){return ym(this.componentDef.outputs)}create(t,n,r,o){let i=(o=o||this.ngModule)instanceof $n?o:o?.injector;i&&null!==this.componentDef.getStandaloneInjector&&(i=this.componentDef.getStandaloneInjector(i)||i);const s=i?new vI(t,i):t,a=s.get(Eg,null);if(null===a)throw new w(407,!1);const l=s.get(QM,null),u=a.createRenderer(null,this.componentDef),c=this.componentDef.selectors[0][0]||"div",d=r?function YS(e,t,n){return e.selectRootElement(t,n===Jt.ShadowDom)}(u,r,this.componentDef.encapsulation):Su(u,c,function yI(e){const t=e.toLowerCase();return"svg"===t?"svg":"math"===t?"math":null}(c)),f=this.componentDef.onPush?288:272,h=yc(0,null,null,1,0,null,null,null,null,null),p=Ws(null,h,null,f,null,null,a,u,l,s,null);let g,m;Xl(p);try{const v=function CI(e,t,n,r,o,i){const s=n[1];n[22]=e;const l=eo(s,22,2,"#host",null),u=l.mergedAttrs=t.hostAttrs;null!==u&&(Qs(l,u,!0),null!==e&&(bs(o,e,u),null!==l.classes&&Fu(o,e,l.classes),null!==l.styles&&Xp(o,e,l.styles)));const c=r.createRenderer(e,t),d=Ws(n,nm(t),null,t.onPush?32:16,n[22],l,r,c,i||null,null,null);return s.firstCreatePass&&(Is(Go(l,n),s,t.type),um(s,l),cm(l,n.length,1)),Ks(n,d),n[22]=d}(d,this.componentDef,p,a,u);if(d)if(r)bs(u,d,["ng-version",YM.full]);else{const{attrs:b,classes:y}=function vS(e){const t=[],n=[];let r=1,o=2;for(;r0&&Fu(u,d,y.join(" "))}if(m=Wl(h,22),void 0!==n){const b=m.projection=[];for(let y=0;y=0;r--){const o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Es(o.hostAttrs,n=Es(n,o.hostAttrs))}}(r)}function Mc(e){return e===Rr?{}:e===X?[]:e}function MI(e,t){const n=e.viewQuery;e.viewQuery=n?(r,o)=>{t(r,o),n(r,o)}:t}function SI(e,t){const n=e.contentQueries;e.contentQueries=n?(r,o,i)=>{t(r,o,i),n(r,o,i)}:t}function II(e,t){const n=e.hostBindings;e.hostBindings=n?(r,o)=>{t(r,o),n(r,o)}:t}let Js=null;function fr(){if(!Js){const e=ce.Symbol;if(e&&e.iterator)Js=e.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let n=0;na(Se(Y[r.index])):r.index;let x=null;if(!a&&l&&(x=function jI(e,t,n,r){const o=e.cleanup;if(null!=o)for(let i=0;il?a[l]:null}"string"==typeof s&&(i+=2)}return null}(e,t,o,r.index)),null!==x)(x.__ngLastListenerFn__||x).__ngNextListenerFn__=i,x.__ngLastListenerFn__=i,h=!1;else{i=Fm(r,t,d,i,!1);const Y=n.listen(v,o,i);f.push(i,Y),c&&c.push(o,y,b,b+1)}}else i=Fm(r,t,d,i,!1);const p=r.outputs;let g;if(h&&null!==p&&(g=p[o])){const m=g.length;if(m)for(let v=0;v0;)t=t[15],e--;return t}(e,B.lFrame.contextLView))[8]}(e)}function Hm(e,t,n,r,o){const i=e[n+1],s=null===t;let a=r?Ht(i):Mn(i),l=!1;for(;0!==a&&(!1===l||s);){const c=e[a+1];zI(e[a],t)&&(l=!0,e[a+1]=r?ic(c):rc(c)),a=r?Ht(c):Mn(c)}l&&(e[n+1]=r?rc(i):ic(i))}function zI(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&zr(e,t)>=0}function ea(e,t){return function Gt(e,t,n,r){const o=_(),i=Q(),s=Dn(2);i.firstUpdatePass&&function Jm(e,t,n,r){const o=e.data;if(null===o[n+1]){const i=o[et()],s=function Ym(e,t){return t>=e.expandoStartIndex}(e,n);(function ny(e,t){return 0!=(e.flags&(t?16:32))})(i,r)&&null===t&&!s&&(t=!1),t=function eA(e,t,n,r){const o=function Yl(e){const t=B.lFrame.currentDirectiveIndex;return-1===t?null:e[t]}(e);let i=r?t.residualClasses:t.residualStyles;if(null===o)0===(r?t.classBindings:t.styleBindings)&&(n=mi(n=xc(null,e,t,n,r),t.attrs,r),i=null);else{const s=t.directiveStylingLast;if(-1===s||e[s]!==o)if(n=xc(o,e,t,n,r),null===i){let l=function tA(e,t,n){const r=n?t.classBindings:t.styleBindings;if(0!==Mn(r))return e[Ht(r)]}(e,t,r);void 0!==l&&Array.isArray(l)&&(l=xc(null,e,t,l[1],r),l=mi(l,t.attrs,r),function nA(e,t,n,r){e[Ht(n?t.classBindings:t.styleBindings)]=r}(e,t,r,l))}else i=function rA(e,t,n){let r;const o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0)&&(u=!0)}else c=n;if(o)if(0!==l){const f=Ht(e[a+1]);e[r+1]=Hs(f,a),0!==f&&(e[f+1]=oc(e[f+1],r)),e[a+1]=function LS(e,t){return 131071&e|t<<17}(e[a+1],r)}else e[r+1]=Hs(a,0),0!==a&&(e[a+1]=oc(e[a+1],r)),a=r;else e[r+1]=Hs(l,0),0===a?a=r:e[l+1]=oc(e[l+1],r),l=r;u&&(e[r+1]=rc(e[r+1])),Hm(e,c,r,!0),Hm(e,c,r,!1),function GI(e,t,n,r,o){const i=o?e.residualClasses:e.residualStyles;null!=i&&"string"==typeof t&&zr(i,t)>=0&&(n[r+1]=ic(n[r+1]))}(t,c,e,r,i),s=Hs(a,l),i?t.classBindings=s:t.styleBindings=s}(o,i,t,n,s,r)}}(i,e,s,r),t!==$&&qe(o,s,t)&&function ey(e,t,n,r,o,i,s,a){if(!(3&t.type))return;const l=e.data,u=l[a+1];ta(function zg(e){return 1==(1&e)}(u)?ty(l,t,n,o,Mn(u),s):void 0)||(ta(i)||function Gg(e){return 2==(2&e)}(u)&&(i=ty(l,null,n,o,a,s)),function aM(e,t,n,r,o){if(t)o?e.addClass(n,r):e.removeClass(n,r);else{let i=-1===r.indexOf("-")?void 0:lt.DashCase;null==o?e.removeStyle(n,r,i):("string"==typeof o&&o.endsWith("!important")&&(o=o.slice(0,-10),i|=lt.Important),e.setStyle(n,r,o,i))}}(r,s,ys(et(),n),o,i))}(i,i.data[et()],o,o[G],e,o[s+1]=function sA(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=se(Un(e)))),e}(t,n),r,s)}(e,t,null,!0),ea}function xc(e,t,n,r,o){let i=null;const s=n.directiveEnd;let a=n.directiveStylingLast;for(-1===a?a=n.directiveStart:a++;a0;){const l=e[o],u=Array.isArray(l),c=u?l[1]:l,d=null===c;let f=n[o+1];f===$&&(f=d?X:void 0);let h=d?cu(f,r):c===r?f:void 0;if(u&&!ta(h)&&(h=cu(l,r)),ta(h)&&(a=h,s))return a;const p=e[o+1];o=s?Ht(p):Mn(p)}if(null!==t){let l=i?t.residualClasses:t.residualStyles;null!=l&&(a=cu(l,r))}return a}function ta(e){return void 0!==e}function T(e,t=""){const n=_(),r=Q(),o=e+22,i=r.firstCreatePass?eo(r,o,1,t,null):r.data[o],s=n[o]=function Mu(e,t){return e.createText(t)}(n[G],t);Ps(r,n,s,i),Xt(i,!1)}function an(e){return Et("",e,""),an}function Et(e,t,n){const r=_(),o=function ro(e,t,n,r){return qe(e,Lr(),n)?t+U(n)+r:$}(r,e,t,n);return o!==$&&Sn(r,et(),o),Et}function Rc(e,t,n,r,o){const i=_(),s=oo(i,e,t,n,r,o);return s!==$&&Sn(i,et(),s),Rc}const mo="en-US";let by=mo;function Oc(e,t,n,r,o){if(e=k(e),Array.isArray(e))for(let i=0;i>20;if(dr(e)||!e.multi){const h=new $o(l,o,D),p=kc(a,t,o?c:c+f,d);-1===p?(Is(Go(u,s),i,a),Pc(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(h),s.push(h)):(n[p]=h,s[p]=h)}else{const h=kc(a,t,c+f,d),p=kc(a,t,c,c+f),g=h>=0&&n[h],m=p>=0&&n[p];if(o&&!m||!o&&!g){Is(Go(u,s),i,a);const v=function ET(e,t,n,r,o){const i=new $o(e,n,D);return i.multi=[],i.index=t,i.componentProviders=0,Ky(i,o,r&&!n),i}(o?bT:wT,n.length,o,r,l);!o&&m&&(n[p].providerFactory=v),Pc(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(v),s.push(v)}else Pc(i,e,h>-1?h:p,Ky(n[o?p:h],l,!o&&r));!o&&r&&m&&n[p].componentProviders++}}}function Pc(e,t,n,r){const o=dr(t),i=function kM(e){return!!e.useClass}(t);if(o||i){const l=(i?k(t.useClass):t).prototype.ngOnDestroy;if(l){const u=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){const c=u.indexOf(n);-1===c?u.push(n,[r,l]):u[c+1].push(r,l)}else u.push(n,l)}}}function Ky(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function kc(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>function CT(e,t,n){const r=Q();if(r.firstCreatePass){const o=jt(e);Oc(n,r.data,r.blueprint,o,!0),Oc(t,r.data,r.blueprint,o,!1)}}(r,o?o(e):e,t)}}class mr{}class Zy{}class Qy extends mr{constructor(t,n){super(),this._parent=n,this._bootstrapComponents=[],this.destroyCbs=[],this.componentFactoryResolver=new Ec(this);const r=pt(t);this._bootstrapComponents=En(r.bootstrap),this._r3Injector=kg(t,n,[{provide:mr,useValue:this},{provide:ui,useValue:this.componentFactoryResolver}],se(t),new Set(["environment"])),this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(t)}get injector(){return this._r3Injector}destroy(){const t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}}class Vc extends Zy{constructor(t){super(),this.moduleType=t}create(t){return new Qy(this.moduleType,t)}}class ST extends mr{constructor(t,n,r){super(),this.componentFactoryResolver=new Ec(this),this.instance=null;const o=new Dg([...t,{provide:mr,useValue:this},{provide:ui,useValue:this.componentFactoryResolver}],n||Us(),r,new Set(["environment"]));this.injector=o,o.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}}function sa(e,t,n=null){return new ST(e,t,n).injector}let IT=(()=>{class e{constructor(n){this._injector=n,this.cachedInjectors=new Map}getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this.cachedInjectors.has(n.id)){const r=mg(0,n.type),o=r.length>0?sa([r],this._injector,`Standalone[${n.type.name}]`):null;this.cachedInjectors.set(n.id,o)}return this.cachedInjectors.get(n.id)}ngOnDestroy(){try{for(const n of this.cachedInjectors.values())null!==n&&n.destroy()}finally{this.cachedInjectors.clear()}}}return e.\u0275prov=L({token:e,providedIn:"environment",factory:()=>new e(I($n))}),e})();function Yy(e){e.getStandaloneInjector=t=>t.get(IT).getOrCreateStandaloneInjector(e)}function ov(e,t,n,r,o,i){const s=t+n;return qe(e,s,o)?function nn(e,t,n){return e[t]=n}(e,s+1,i?r.call(i,o):r(o)):function wi(e,t){const n=e[t];return n===$?void 0:n}(e,s+1)}function cv(e,t,n){const r=e+22,o=_(),i=kr(o,r);return function bi(e,t){return e[1].data[t].pure}(o,r)?ov(o,function Xe(){const e=B.lFrame;let t=e.bindingRootIndex;return-1===t&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}(),t,i.transform,n,i):i.transform(n)}function Bc(e){return t=>{setTimeout(e,void 0,t)}}const ye=class YT extends Yt{constructor(t=!1){super(),this.__isAsync=t}emit(t){super.next(t)}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&"object"==typeof t){const l=t;o=l.next?.bind(l),i=l.error?.bind(l),s=l.complete?.bind(l)}this.__isAsync&&(i=Bc(i),o&&(o=Bc(o)),s&&(s=Bc(s)));const a=super.subscribe({next:o,error:i,complete:s});return t instanceof Mt&&t.add(a),a}};function JT(){return this._results[fr()]()}class Uc{constructor(t=!1){this._emitDistinctChangesOnly=t,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;const n=fr(),r=Uc.prototype;r[n]||(r[n]=JT)}get changes(){return this._changes||(this._changes=new ye)}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){const r=this;r.dirty=!1;const o=_t(t);(this._changesDetected=!function t0(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r{class e{}return e.__NG_ELEMENT_ID__=tx,e})();const XT=In,ex=class extends XT{constructor(t,n,r){super(),this._declarationLView=t,this._declarationTContainer=n,this.elementRef=r}createEmbeddedView(t,n){const r=this._declarationTContainer.tViews,o=Ws(this._declarationLView,r,t,16,null,r.declTNode,null,null,null,null,n||null);o[17]=this._declarationLView[this._declarationTContainer.index];const s=this._declarationLView[19];return null!==s&&(o[19]=s.createEmbeddedView(r)),pc(r,o,t),new di(o)}};function tx(){return aa(Ne(),_())}function aa(e,t){return 4&e.type?new ex(t,e,Qr(e,t)):null}let Wt=(()=>{class e{}return e.__NG_ELEMENT_ID__=nx,e})();function nx(){return hv(Ne(),_())}const rx=Wt,dv=class extends rx{constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return Qr(this._hostTNode,this._hostLView)}get injector(){return new Br(this._hostTNode,this._hostLView)}get parentInjector(){const t=Ss(this._hostTNode,this._hostLView);if(rp(t)){const n=jr(t,this._hostLView),r=Vr(t);return new Br(n[1].data[r+8],n)}return new Br(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){const n=fv(this._lContainer);return null!==n&&n[t]||null}get length(){return this._lContainer.length-10}createEmbeddedView(t,n,r){let o,i;"number"==typeof r?o=r:null!=r&&(o=r.index,i=r.injector);const s=t.createEmbeddedView(n||{},i);return this.insert(s,o),s}createComponent(t,n,r,o,i){const s=t&&!function Ko(e){return"function"==typeof e}(t);let a;if(s)a=n;else{const d=n||{};a=d.index,r=d.injector,o=d.projectableNodes,i=d.environmentInjector||d.ngModuleRef}const l=s?t:new fi(re(t)),u=r||this.parentInjector;if(!i&&null==l.ngModule){const f=(s?u:this.parentInjector).get($n,null);f&&(i=f)}const c=l.create(u,o,void 0,i);return this.insert(c.hostView,a),c}insert(t,n){const r=t._lView,o=r[1];if(function EE(e){return Vt(e[3])}(r)){const c=this.indexOf(t);if(-1!==c)this.detach(c);else{const d=r[3],f=new dv(d,d[6],d[3]);f.detach(f.indexOf(t))}}const i=this._adjustIndex(n),s=this._lContainer;!function X0(e,t,n,r){const o=10+r,i=n.length;r>0&&(n[o-1][4]=t),r0)r.push(s[a/2]);else{const u=i[a+1],c=t[-l];for(let d=10;d{class e{constructor(n){this.appInits=n,this.resolve=da,this.reject=da,this.initialized=!1,this.done=!1,this.donePromise=new Promise((r,o)=>{this.resolve=r,this.reject=o})}runInitializers(){if(this.initialized)return;const n=[],r=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let o=0;o{i.subscribe({complete:a,error:l})});n.push(s)}}Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),0===n.length&&r(),this.initialized=!0}}return e.\u0275fac=function(n){return new(n||e)(I(fa,8))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Mi=new R("AppId",{providedIn:"root",factory:function jv(){return`${Xc()}${Xc()}${Xc()}`}});function Xc(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const Bv=new R("Platform Initializer"),ed=new R("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),Uv=new R("appBootstrapListener");let Rx=(()=>{class e{log(n){console.log(n)}warn(n){console.warn(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();const An=new R("LocaleId",{providedIn:"root",factory:()=>we(An,O.Optional|O.SkipSelf)||function Nx(){return typeof $localize<"u"&&$localize.locale||mo}()});class Ox{constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}}let td=(()=>{class e{compileModuleSync(n){return new Vc(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){const r=this.compileModuleSync(n),i=En(pt(n).declarations).reduce((s,a)=>{const l=re(a);return l&&s.push(new fi(l)),s},[]);return new Ox(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Lx=(()=>Promise.resolve(0))();function nd(e){typeof Zone>"u"?Lx.then(()=>{e&&e.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",e)}class Pe{constructor({enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new ye(!1),this.onMicrotaskEmpty=new ye(!1),this.onStable=new ye(!1),this.onError=new ye(!1),typeof Zone>"u")throw new w(908,!1);Zone.assertZonePatched();const o=this;if(o._nesting=0,o._outer=o._inner=Zone.current,Zone.AsyncStackTaggingZoneSpec){const i=Zone.AsyncStackTaggingZoneSpec;o._inner=o._inner.fork(new i("Angular"))}Zone.TaskTrackingZoneSpec&&(o._inner=o._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(o._inner=o._inner.fork(Zone.longStackTraceZoneSpec)),o.shouldCoalesceEventChangeDetection=!r&&n,o.shouldCoalesceRunChangeDetection=r,o.lastRequestAnimationFrameId=-1,o.nativeRequestAnimationFrame=function Vx(){let e=ce.requestAnimationFrame,t=ce.cancelAnimationFrame;if(typeof Zone<"u"&&e&&t){const n=e[Zone.__symbol__("OriginalDelegate")];n&&(e=n);const r=t[Zone.__symbol__("OriginalDelegate")];r&&(t=r)}return{nativeRequestAnimationFrame:e,nativeCancelAnimationFrame:t}}().nativeRequestAnimationFrame,function Ux(e){const t=()=>{!function Bx(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(ce,()=>{e.fakeTopEventTask||(e.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{e.lastRequestAnimationFrameId=-1,od(e),e.isCheckStableRunning=!0,rd(e),e.isCheckStableRunning=!1},void 0,()=>{},()=>{})),e.fakeTopEventTask.invoke()}),od(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(n,r,o,i,s,a)=>{try{return Gv(e),n.invokeTask(o,i,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===i.type||e.shouldCoalesceRunChangeDetection)&&t(),zv(e)}},onInvoke:(n,r,o,i,s,a,l)=>{try{return Gv(e),n.invoke(o,i,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&t(),zv(e)}},onHasTask:(n,r,o,i)=>{n.hasTask(o,i),r===o&&("microTask"==i.change?(e._hasPendingMicrotasks=i.microTask,od(e),rd(e)):"macroTask"==i.change&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(n,r,o,i)=>(n.handleError(o,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}(o)}static isInAngularZone(){return typeof Zone<"u"&&!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!Pe.isInAngularZone())throw new w(909,!1)}static assertNotInAngularZone(){if(Pe.isInAngularZone())throw new w(909,!1)}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){const i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,jx,da,da);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}}const jx={};function rd(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function od(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&-1!==e.lastRequestAnimationFrameId)}function Gv(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function zv(e){e._nesting--,rd(e)}class $x{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new ye,this.onMicrotaskEmpty=new ye,this.onStable=new ye,this.onError=new ye}run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}}const Wv=new R(""),pa=new R("");let ad,id=(()=>{class e{constructor(n,r,o){this._ngZone=n,this.registry=r,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,ad||(function Hx(e){ad=e}(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this.taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{Pe.assertNotInAngularZone(),nd(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())nd(()=>{for(;0!==this._callbacks.length;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb(this._didWork)}this._didWork=!1});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>!r.updateCb||!r.updateCb(n)||(clearTimeout(r.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n(this._didWork,this.getPendingTasks())},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}}return e.\u0275fac=function(n){return new(n||e)(I(Pe),I(sd),I(pa))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),sd=(()=>{class e{constructor(){this._applications=new Map}registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return ad?.findTestabilityInTree(this,n,r)??null}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})(),zn=null;const qv=new R("AllowMultipleToken"),ld=new R("PlatformDestroyListeners");class Kv{constructor(t,n){this.name=t,this.token=n}}function Qv(e,t,n=[]){const r=`Platform: ${t}`,o=new R(r);return(i=[])=>{let s=ud();if(!s||s.injector.get(qv,!1)){const a=[...n,...i,{provide:o,useValue:!0}];e?e(a):function Wx(e){if(zn&&!zn.get(qv,!1))throw new w(400,!1);zn=e;const t=e.get(Jv);(function Zv(e){const t=e.get(Bv,null);t&&t.forEach(n=>n())})(e)}(function Yv(e=[],t){return wt.create({name:t,providers:[{provide:zu,useValue:"platform"},{provide:ld,useValue:new Set([()=>zn=null])},...e]})}(a,r))}return function Kx(e){const t=ud();if(!t)throw new w(401,!1);return t}()}}function ud(){return zn?.get(Jv)??null}let Jv=(()=>{class e{constructor(n){this._injector=n,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(n,r){const o=function e_(e,t){let n;return n="noop"===e?new $x:("zone.js"===e?void 0:e)||new Pe(t),n}(r?.ngZone,function Xv(e){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:!(!e||!e.ngZoneEventCoalescing)||!1,shouldCoalesceRunChangeDetection:!(!e||!e.ngZoneRunCoalescing)||!1}}(r)),i=[{provide:Pe,useValue:o}];return o.run(()=>{const s=wt.create({providers:i,parent:this.injector,name:n.moduleType.name}),a=n.create(s),l=a.injector.get(Yr,null);if(!l)throw new w(402,!1);return o.runOutsideAngular(()=>{const u=o.onError.subscribe({next:c=>{l.handleError(c)}});a.onDestroy(()=>{ma(this._modules,a),u.unsubscribe()})}),function t_(e,t,n){try{const r=n();return gi(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e.handleError(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e.handleError(r)),r}}(l,o,()=>{const u=a.injector.get(ha);return u.runInitializers(),u.donePromise.then(()=>(function Ey(e){dt(e,"Expected localeId to be defined"),"string"==typeof e&&(by=e.toLowerCase().replace(/_/g,"-"))}(a.injector.get(An,mo)||mo),this._moduleDoBootstrap(a),a))})})}bootstrapModule(n,r=[]){const o=n_({},r);return function Gx(e,t,n){const r=new Vc(n);return Promise.resolve(r)}(0,0,n).then(i=>this.bootstrapModuleFactory(i,o))}_moduleDoBootstrap(n){const r=n.injector.get(ga);if(n._bootstrapComponents.length>0)n._bootstrapComponents.forEach(o=>r.bootstrap(o));else{if(!n.instance.ngDoBootstrap)throw new w(403,!1);n.instance.ngDoBootstrap(r)}this._modules.push(n)}onDestroy(n){this._destroyListeners.push(n)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new w(404,!1);this._modules.slice().forEach(r=>r.destroy()),this._destroyListeners.forEach(r=>r());const n=this._injector.get(ld,null);n&&(n.forEach(r=>r()),n.clear()),this._destroyed=!0}get destroyed(){return this._destroyed}}return e.\u0275fac=function(n){return new(n||e)(I(wt))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();function n_(e,t){return Array.isArray(t)?t.reduce(n_,e):{...e,...t}}let ga=(()=>{class e{constructor(n,r,o){this._zone=n,this._injector=r,this._exceptionHandler=o,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this._destroyed=!1,this._destroyListeners=[],this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const i=new Ce(a=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{a.next(this._stable),a.complete()})}),s=new Ce(a=>{let l;this._zone.runOutsideAngular(()=>{l=this._zone.onStable.subscribe(()=>{Pe.assertNotInAngularZone(),nd(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,a.next(!0))})})});const u=this._zone.onUnstable.subscribe(()=>{Pe.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{a.next(!1)}))});return()=>{l.unsubscribe(),u.unsubscribe()}});this.isStable=function Wb(...e){const t=Po(e),n=function jb(e,t){return"number"==typeof xl(e)?e.pop():t}(e,1/0),r=e;return r.length?1===r.length?Pt(r[0]):xr(n)(Me(r,t)):mn}(i,s.pipe(function qb(e={}){const{connector:t=(()=>new Yt),resetOnError:n=!0,resetOnComplete:r=!0,resetOnRefCountZero:o=!0}=e;return i=>{let s,a,l,u=0,c=!1,d=!1;const f=()=>{a?.unsubscribe(),a=void 0},h=()=>{f(),s=l=void 0,c=d=!1},p=()=>{const g=s;h(),g?.unsubscribe()};return Ve((g,m)=>{u++,!d&&!c&&f();const v=l=l??t();m.add(()=>{u--,0===u&&!d&&!c&&(a=Rl(p,o))}),v.subscribe(m),!s&&u>0&&(s=new Oo({next:b=>v.next(b),error:b=>{d=!0,f(),a=Rl(h,n,b),v.error(b)},complete:()=>{c=!0,f(),a=Rl(h,r),v.complete()}}),Pt(g).subscribe(s))})(i)}}()))}get destroyed(){return this._destroyed}get injector(){return this._injector}bootstrap(n,r){const o=n instanceof wg;if(!this._injector.get(ha).done)throw!o&&function Nr(e){const t=re(e)||Ye(e)||Je(e);return null!==t&&t.standalone}(n),new w(405,false);let s;s=o?n:this._injector.get(ui).resolveComponentFactory(n),this.componentTypes.push(s.componentType);const a=function zx(e){return e.isBoundToModule}(s)?void 0:this._injector.get(mr),u=s.create(wt.NULL,[],r||s.selector,a),c=u.location.nativeElement,d=u.injector.get(Wv,null);return d?.registerApplication(c),u.onDestroy(()=>{this.detachView(u.hostView),ma(this.components,u),d?.unregisterApplication(c)}),this._loadComponent(u),u}tick(){if(this._runningTick)throw new w(101,!1);try{this._runningTick=!0;for(let n of this._views)n.detectChanges()}catch(n){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(n))}finally{this._runningTick=!1}}attachView(n){const r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){const r=n;ma(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(Uv,[]).concat(this._bootstrapListeners).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy()),this._onMicrotaskEmptySubscription.unsubscribe()}finally{this._destroyed=!0,this._views=[],this._bootstrapListeners=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>ma(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new w(406,!1);const n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}warnIfDestroyed(){}}return e.\u0275fac=function(n){return new(n||e)(I(Pe),I($n),I(Yr))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();function ma(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}let o_=!0,ya=(()=>{class e{}return e.__NG_ELEMENT_ID__=Yx,e})();function Yx(e){return function Jx(e,t,n){if(gs(e)&&!n){const r=vt(e.index,t);return new di(r,r)}return 47&e.type?new di(t[16],t):null}(Ne(),_(),16==(16&e))}class u_{constructor(){}supports(t){return hi(t)}create(t){return new o1(t)}}const r1=(e,t)=>t;class o1{constructor(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||r1}forEachItem(t){let n;for(n=this._itHead;null!==n;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){const s=!r||n&&n.currentIndex{s=this._trackByFn(o,a),null!==n&&Object.is(n.trackById,s)?(r&&(n=this._verifyReinsertion(n,a,s,o)),Object.is(n.item,a)||this._addIdentityChange(n,a)):(n=this._mismatch(n,a,s,o),r=!0),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;null!==t;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;null!==t;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return null===t?i=this._itTail:(i=t._prev,this._remove(t)),null!==(t=null===this._unlinkedRecords?null:this._unlinkedRecords.get(r,null))?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):null!==(t=null===this._linkedRecords?null:this._linkedRecords.get(r,o))?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new i1(n,r),i,o),t}_verifyReinsertion(t,n,r,o){let i=null===this._unlinkedRecords?null:this._unlinkedRecords.get(r,null);return null!==i?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;null!==t;){const n=t._next;this._addToRemovals(this._unlink(t)),t=n}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(t);const o=t._prevRemoved,i=t._nextRemoved;return null===o?this._removalsHead=i:o._nextRemoved=i,null===i?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail=null===this._additionsTail?this._additionsHead=t:this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){const o=null===n?this._itHead:n._next;return t._next=o,t._prev=n,null===o?this._itTail=t:o._prev=t,null===n?this._itHead=t:n._next=t,null===this._linkedRecords&&(this._linkedRecords=new c_),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){null!==this._linkedRecords&&this._linkedRecords.remove(t);const n=t._prev,r=t._next;return null===n?this._itHead=r:n._next=r,null===r?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail=null===this._movesTail?this._movesHead=t:this._movesTail._nextMoved=t),t}_addToRemovals(t){return null===this._unlinkedRecords&&(this._unlinkedRecords=new c_),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=t:this._identityChangesTail._nextIdentityChange=t,t}}class i1{constructor(t,n){this.item=t,this.trackById=n,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class s1{constructor(){this._head=null,this._tail=null}add(t){null===this._head?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;null!==r;r=r._nextDup)if((null===n||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){const n=t._prevDup,r=t._nextDup;return null===n?this._head=r:n._nextDup=r,null===r?this._tail=n:r._prevDup=n,null===this._head}}class c_{constructor(){this.map=new Map}put(t){const n=t.trackById;let r=this.map.get(n);r||(r=new s1,this.map.set(n,r)),r.add(t)}get(t,n){const o=this.map.get(t);return o?o.get(t,n):null}remove(t){const n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function d_(e,t,n){const r=e.previousIndex;if(null===r)return r;let o=0;return n&&r{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{const i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;null!==r;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){const r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){const o=this._records.get(t);this._maybeAddToChanges(o,n);const i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}const r=new l1(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;null!==t;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;null!=t;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){null===this._additionsHead?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){null===this._changesHead?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}}class l1{constructor(t){this.key=t,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function h_(){return new Da([new u_])}let Da=(()=>{class e{constructor(n){this.factories=n}static create(n,r){if(null!=r){const o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:r=>e.create(n,r||h_()),deps:[[e,new ei,new Xo]]}}find(n){const r=this.factories.find(o=>o.supports(n));if(null!=r)return r;throw new w(901,!1)}}return e.\u0275prov=L({token:e,providedIn:"root",factory:h_}),e})();function p_(){return new Si([new f_])}let Si=(()=>{class e{constructor(n){this.factories=n}static create(n,r){if(r){const o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:r=>e.create(n,r||p_()),deps:[[e,new ei,new Xo]]}}find(n){const r=this.factories.find(o=>o.supports(n));if(r)return r;throw new w(901,!1)}}return e.\u0275prov=L({token:e,providedIn:"root",factory:p_}),e})();const d1=Qv(null,"core",[]);let f1=(()=>{class e{constructor(n){}}return e.\u0275fac=function(n){return new(n||e)(I(ga))},e.\u0275mod=It({type:e}),e.\u0275inj=ft({}),e})();function xn(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}let Ca=null;function ln(){return Ca}const ot=new R("DocumentToken");let pd=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return function m1(){return I(g_)}()},providedIn:"platform"}),e})();const y1=new R("Location Initialized");let g_=(()=>{class e extends pd{constructor(n){super(),this._doc=n,this._init()}_init(){this.location=window.location,this._history=window.history}getBaseHrefFromDOM(){return ln().getBaseHref(this._doc)}onPopState(n){const r=ln().getGlobalEventTarget(this._doc,"window");return r.addEventListener("popstate",n,!1),()=>r.removeEventListener("popstate",n)}onHashChange(n){const r=ln().getGlobalEventTarget(this._doc,"window");return r.addEventListener("hashchange",n,!1),()=>r.removeEventListener("hashchange",n)}get href(){return this.location.href}get protocol(){return this.location.protocol}get hostname(){return this.location.hostname}get port(){return this.location.port}get pathname(){return this.location.pathname}get search(){return this.location.search}get hash(){return this.location.hash}set pathname(n){this.location.pathname=n}pushState(n,r,o){m_()?this._history.pushState(n,r,o):this.location.hash=o}replaceState(n,r,o){m_()?this._history.replaceState(n,r,o):this.location.hash=o}forward(){this._history.forward()}back(){this._history.back()}historyGo(n=0){this._history.go(n)}getState(){return this._history.state}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:function(){return function v1(){return new g_(I(ot))}()},providedIn:"platform"}),e})();function m_(){return!!window.history.pushState}function gd(e,t){if(0==e.length)return t;if(0==t.length)return e;let n=0;return e.endsWith("/")&&n++,t.startsWith("/")&&n++,2==n?e+t.substring(1):1==n?e+t:e+"/"+t}function y_(e){const t=e.match(/#|\?|$/),n=t&&t.index||e.length;return e.slice(0,n-("/"===e[n-1]?1:0))+e.slice(n)}function Rn(e){return e&&"?"!==e[0]?"?"+e:e}let vr=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return we(__)},providedIn:"root"}),e})();const v_=new R("appBaseHref");let __=(()=>{class e extends vr{constructor(n,r){super(),this._platformLocation=n,this._removeListenerFns=[],this._baseHref=r??this._platformLocation.getBaseHrefFromDOM()??we(ot).location?.origin??""}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}prepareExternalUrl(n){return gd(this._baseHref,n)}path(n=!1){const r=this._platformLocation.pathname+Rn(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){const s=this.prepareExternalUrl(o+Rn(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){const s=this.prepareExternalUrl(o+Rn(i));this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}}return e.\u0275fac=function(n){return new(n||e)(I(pd),I(v_,8))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})(),_1=(()=>{class e extends vr{constructor(n,r){super(),this._platformLocation=n,this._baseHref="",this._removeListenerFns=[],null!=r&&(this._baseHref=r)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}path(n=!1){let r=this._platformLocation.hash;return null==r&&(r="#"),r.length>0?r.substring(1):r}prepareExternalUrl(n){const r=gd(this._baseHref,n);return r.length>0?"#"+r:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+Rn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+Rn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}}return e.\u0275fac=function(n){return new(n||e)(I(pd),I(v_,8))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),md=(()=>{class e{constructor(n){this._subject=new ye,this._urlChangeListeners=[],this._urlChangeSubscription=null,this._locationStrategy=n;const r=this._locationStrategy.getBaseHref();this._baseHref=y_(D_(r)),this._locationStrategy.onPopState(o=>{this._subject.emit({url:this.path(!0),pop:!0,state:o.state,type:o.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(n=!1){return this.normalize(this._locationStrategy.path(n))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(n,r=""){return this.path()==this.normalize(n+Rn(r))}normalize(n){return e.stripTrailingSlash(function C1(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,D_(n)))}prepareExternalUrl(n){return n&&"/"!==n[0]&&(n="/"+n),this._locationStrategy.prepareExternalUrl(n)}go(n,r="",o=null){this._locationStrategy.pushState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+Rn(r)),o)}replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+Rn(r)),o)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(n=0){this._locationStrategy.historyGo?.(n)}onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(r=>{this._notifyUrlChangeListeners(r.url,r.state)})),()=>{const r=this._urlChangeListeners.indexOf(n);this._urlChangeListeners.splice(r,1),0===this._urlChangeListeners.length&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(n="",r){this._urlChangeListeners.forEach(o=>o(n,r))}subscribe(n,r,o){return this._subject.subscribe({next:n,error:r,complete:o})}}return e.normalizeQueryParams=Rn,e.joinWithSlash=gd,e.stripTrailingSlash=y_,e.\u0275fac=function(n){return new(n||e)(I(vr))},e.\u0275prov=L({token:e,factory:function(){return function D1(){return new md(I(vr))}()},providedIn:"root"}),e})();function D_(e){return e.replace(/\/index.html$/,"")}function T_(e,t){t=encodeURIComponent(t);for(const n of e.split(";")){const r=n.indexOf("="),[o,i]=-1==r?[n,""]:[n.slice(0,r),n.slice(r+1)];if(o.trim()===t)return decodeURIComponent(i)}return null}let x_=(()=>{class e{constructor(n,r,o,i){this._iterableDiffers=n,this._keyValueDiffers=r,this._ngEl=o,this._renderer=i,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}set klass(n){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof n?n.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}set ngClass(n){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof n?n.split(/\s+/):n,this._rawClass&&(hi(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}ngDoCheck(){if(this._iterableDiffer){const n=this._iterableDiffer.diff(this._rawClass);n&&this._applyIterableChanges(n)}else if(this._keyValueDiffer){const n=this._keyValueDiffer.diff(this._rawClass);n&&this._applyKeyValueChanges(n)}}_applyKeyValueChanges(n){n.forEachAddedItem(r=>this._toggleClass(r.key,r.currentValue)),n.forEachChangedItem(r=>this._toggleClass(r.key,r.currentValue)),n.forEachRemovedItem(r=>{r.previousValue&&this._toggleClass(r.key,!1)})}_applyIterableChanges(n){n.forEachAddedItem(r=>{if("string"!=typeof r.item)throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${se(r.item)}`);this._toggleClass(r.item,!0)}),n.forEachRemovedItem(r=>this._toggleClass(r.item,!1))}_applyClasses(n){n&&(Array.isArray(n)||n instanceof Set?n.forEach(r=>this._toggleClass(r,!0)):Object.keys(n).forEach(r=>this._toggleClass(r,!!n[r])))}_removeClasses(n){n&&(Array.isArray(n)||n instanceof Set?n.forEach(r=>this._toggleClass(r,!1)):Object.keys(n).forEach(r=>this._toggleClass(r,!1)))}_toggleClass(n,r){(n=n.trim())&&n.split(/\s+/g).forEach(o=>{r?this._renderer.addClass(this._ngEl.nativeElement,o):this._renderer.removeClass(this._ngEl.nativeElement,o)})}}return e.\u0275fac=function(n){return new(n||e)(D(Da),D(Si),D(Ct),D(bn))},e.\u0275dir=V({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"},standalone:!0}),e})();class iR{constructor(t,n,r,o){this.$implicit=t,this.ngForOf=n,this.index=r,this.count=o}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let Sd=(()=>{class e{constructor(n,r,o){this._viewContainer=n,this._template=r,this._differs=o,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}set ngForTrackBy(n){this._trackByFn=n}get ngForTrackBy(){return this._trackByFn}set ngForTemplate(n){n&&(this._template=n)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const n=this._ngForOf;!this._differ&&n&&(this._differ=this._differs.find(n).create(this.ngForTrackBy))}if(this._differ){const n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}_applyChanges(n){const r=this._viewContainer;n.forEachOperation((o,i,s)=>{if(null==o.previousIndex)r.createEmbeddedView(this._template,new iR(o.item,this._ngForOf,-1,-1),null===s?void 0:s);else if(null==s)r.remove(null===i?void 0:i);else if(null!==i){const a=r.get(i);r.move(a,s),F_(a,o)}});for(let o=0,i=r.length;o{F_(r.get(o.currentIndex),o)})}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(D(Wt),D(In),D(Da))},e.\u0275dir=V({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"},standalone:!0}),e})();function F_(e,t){e.context.$implicit=t.item}let _r=(()=>{class e{constructor(n,r){this._viewContainer=n,this._context=new aR,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=r}set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateView()}set ngIfThen(n){O_("ngIfThen",n),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){O_("ngIfElse",n),this._elseTemplateRef=n,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(D(Wt),D(In))},e.\u0275dir=V({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"},standalone:!0}),e})();class aR{constructor(){this.$implicit=null,this.ngIf=null}}function O_(e,t){if(t&&!t.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${se(t)}'.`)}let k_=(()=>{class e{constructor(n){this.differs=n,this.keyValues=[],this.compareFn=L_}transform(n,r=L_){if(!n||!(n instanceof Map)&&"object"!=typeof n)return null;this.differ||(this.differ=this.differs.find(n).create());const o=this.differ.diff(n),i=r!==this.compareFn;return o&&(this.keyValues=[],o.forEachItem(s=>{this.keyValues.push(function AR(e,t){return{key:e,value:t}}(s.key,s.currentValue))})),(o||i)&&(this.keyValues.sort(r),this.compareFn=r),this.keyValues}}return e.\u0275fac=function(n){return new(n||e)(D(Si,16))},e.\u0275pipe=st({name:"keyvalue",type:e,pure:!1,standalone:!0}),e})();function L_(e,t){const n=e.key,r=t.key;if(n===r)return 0;if(void 0===n)return 1;if(void 0===r)return-1;if(null===n)return 1;if(null===r)return-1;if("string"==typeof n&&"string"==typeof r)return n{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({}),e})();let LR=(()=>{class e{}return e.\u0275prov=L({token:e,providedIn:"root",factory:()=>new VR(I(ot),window)}),e})();class VR{constructor(t,n){this.document=t,this.window=n,this.offset=()=>[0,0]}setOffset(t){this.offset=Array.isArray(t)?()=>t:t}getScrollPosition(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}scrollToPosition(t){this.supportsScrolling()&&this.window.scrollTo(t[0],t[1])}scrollToAnchor(t){if(!this.supportsScrolling())return;const n=function jR(e,t){const n=e.getElementById(t)||e.getElementsByName(t)[0];if(n)return n;if("function"==typeof e.createTreeWalker&&e.body&&(e.body.createShadowRoot||e.body.attachShadow)){const r=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT);let o=r.currentNode;for(;o;){const i=o.shadowRoot;if(i){const s=i.getElementById(t)||i.querySelector(`[name="${t}"]`);if(s)return s}o=r.nextNode()}}return null}(this.document,t);n&&(this.scrollToElement(n),n.focus())}setHistoryScrollRestoration(t){if(this.supportScrollRestoration()){const n=this.window.history;n&&n.scrollRestoration&&(n.scrollRestoration=t)}}scrollToElement(t){const n=t.getBoundingClientRect(),r=n.left+this.window.pageXOffset,o=n.top+this.window.pageYOffset,i=this.offset();this.window.scrollTo(r-i[0],o-i[1])}supportScrollRestoration(){try{if(!this.supportsScrolling())return!1;const t=j_(this.window.history)||j_(Object.getPrototypeOf(this.window.history));return!(!t||!t.writable&&!t.set)}catch{return!1}}supportsScrolling(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch{return!1}}}function j_(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}class B_{}class Fd extends class fN extends class g1{}{constructor(){super(...arguments),this.supportsDOMEvents=!0}}{static makeCurrent(){!function p1(e){Ca||(Ca=e)}(new Fd)}onAndCancel(t,n,r){return t.addEventListener(n,r,!1),()=>{t.removeEventListener(n,r,!1)}}dispatchEvent(t,n){t.dispatchEvent(n)}remove(t){t.parentNode&&t.parentNode.removeChild(t)}createElement(t,n){return(n=n||this.getDefaultDocument()).createElement(t)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}isShadowRoot(t){return t instanceof DocumentFragment}getGlobalEventTarget(t,n){return"window"===n?window:"document"===n?t:"body"===n?t.body:null}getBaseHref(t){const n=function hN(){return xi=xi||document.querySelector("base"),xi?xi.getAttribute("href"):null}();return null==n?null:function pN(e){Fa=Fa||document.createElement("a"),Fa.setAttribute("href",e);const t=Fa.pathname;return"/"===t.charAt(0)?t:`/${t}`}(n)}resetBaseElement(){xi=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return T_(document.cookie,t)}}let Fa,xi=null;const z_=new R("TRANSITION_ID"),mN=[{provide:fa,useFactory:function gN(e,t,n){return()=>{n.get(ha).donePromise.then(()=>{const r=ln(),o=t.querySelectorAll(`style[ng-transition="${e}"]`);for(let i=0;i{class e{build(){return new XMLHttpRequest}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const Oa=new R("EventManagerPlugins");let Pa=(()=>{class e{constructor(n,r){this._zone=r,this._eventNameToPlugin=new Map,n.forEach(o=>o.manager=this),this._plugins=n.slice().reverse()}addEventListener(n,r,o){return this._findPluginFor(r).addEventListener(n,r,o)}addGlobalEventListener(n,r,o){return this._findPluginFor(r).addGlobalEventListener(n,r,o)}getZone(){return this._zone}_findPluginFor(n){const r=this._eventNameToPlugin.get(n);if(r)return r;const o=this._plugins;for(let i=0;i{class e{constructor(){this._stylesSet=new Set}addStyles(n){const r=new Set;n.forEach(o=>{this._stylesSet.has(o)||(this._stylesSet.add(o),r.add(o))}),this.onStylesAdded(r)}onStylesAdded(n){}getAllStyles(){return Array.from(this._stylesSet)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),Ri=(()=>{class e extends q_{constructor(n){super(),this._doc=n,this._hostNodes=new Map,this._hostNodes.set(n.head,[])}_addStylesToHost(n,r,o){n.forEach(i=>{const s=this._doc.createElement("style");s.textContent=i,o.push(r.appendChild(s))})}addHost(n){const r=[];this._addStylesToHost(this._stylesSet,n,r),this._hostNodes.set(n,r)}removeHost(n){const r=this._hostNodes.get(n);r&&r.forEach(K_),this._hostNodes.delete(n)}onStylesAdded(n){this._hostNodes.forEach((r,o)=>{this._addStylesToHost(n,o,r)})}ngOnDestroy(){this._hostNodes.forEach(n=>n.forEach(K_))}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();function K_(e){ln().remove(e)}const Od={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/MathML/"},Pd=/%COMP%/g;function ka(e,t,n){for(let r=0;r{if("__ngUnwrap__"===t)return e;!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}let kd=(()=>{class e{constructor(n,r,o){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.rendererByCompId=new Map,this.defaultRenderer=new Ld(n)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;switch(r.encapsulation){case Jt.Emulated:{let o=this.rendererByCompId.get(r.id);return o||(o=new EN(this.eventManager,this.sharedStylesHost,r,this.appId),this.rendererByCompId.set(r.id,o)),o.applyToHost(n),o}case 1:case Jt.ShadowDom:return new MN(this.eventManager,this.sharedStylesHost,n,r);default:if(!this.rendererByCompId.has(r.id)){const o=ka(r.id,r.styles,[]);this.sharedStylesHost.addStyles(o),this.rendererByCompId.set(r.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}return e.\u0275fac=function(n){return new(n||e)(I(Pa),I(Ri),I(Mi))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();class Ld{constructor(t){this.eventManager=t,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(t,n){return n?document.createElementNS(Od[n]||n,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,n){(X_(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(X_(t)?t.content:t).insertBefore(n,r)}removeChild(t,n){t&&t.removeChild(n)}selectRootElement(t,n){let r="string"==typeof t?document.querySelector(t):t;if(!r)throw new Error(`The selector "${t}" did not match any elements`);return n||(r.textContent=""),r}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,n,r,o){if(o){n=o+":"+n;const i=Od[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){const o=Od[r];o?t.removeAttributeNS(o,n):t.removeAttribute(`${r}:${n}`)}else t.removeAttribute(n)}addClass(t,n){t.classList.add(n)}removeClass(t,n){t.classList.remove(n)}setStyle(t,n,r,o){o&(lt.DashCase|lt.Important)?t.style.setProperty(n,r,o<.Important?"important":""):t.style[n]=r}removeStyle(t,n,r){r<.DashCase?t.style.removeProperty(n):t.style[n]=""}setProperty(t,n,r){t[n]=r}setValue(t,n){t.nodeValue=n}listen(t,n,r){return"string"==typeof t?this.eventManager.addGlobalEventListener(t,n,Y_(r)):this.eventManager.addEventListener(t,n,Y_(r))}}function X_(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class EN extends Ld{constructor(t,n,r,o){super(t),this.component=r;const i=ka(o+"-"+r.id,r.styles,[]);n.addStyles(i),this.contentAttr=function CN(e){return"_ngcontent-%COMP%".replace(Pd,e)}(o+"-"+r.id),this.hostAttr=function wN(e){return"_nghost-%COMP%".replace(Pd,e)}(o+"-"+r.id)}applyToHost(t){super.setAttribute(t,this.hostAttr,"")}createElement(t,n){const r=super.createElement(t,n);return super.setAttribute(r,this.contentAttr,""),r}}class MN extends Ld{constructor(t,n,r,o){super(t),this.sharedStylesHost=n,this.hostEl=r,this.shadowRoot=r.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const i=ka(o.id,o.styles,[]);for(let s=0;s{class e extends W_{constructor(n){super(n)}supports(n){return!0}addEventListener(n,r,o){return n.addEventListener(r,o,!1),()=>this.removeEventListener(n,r,o)}removeEventListener(n,r,o){return n.removeEventListener(r,o)}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const eD=["alt","control","meta","shift"],IN={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},AN={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let TN=(()=>{class e extends W_{constructor(n){super(n)}supports(n){return null!=e.parseEventName(n)}addEventListener(n,r,o){const i=e.parseEventName(r),s=e.eventCallback(i.fullKey,o,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>ln().onAndCancel(n,i.domEventName,s))}static parseEventName(n){const r=n.toLowerCase().split("."),o=r.shift();if(0===r.length||"keydown"!==o&&"keyup"!==o)return null;const i=e._normalizeKey(r.pop());let s="",a=r.indexOf("code");if(a>-1&&(r.splice(a,1),s="code."),eD.forEach(u=>{const c=r.indexOf(u);c>-1&&(r.splice(c,1),s+=u+".")}),s+=i,0!=r.length||0===i.length)return null;const l={};return l.domEventName=o,l.fullKey=s,l}static matchEventFullKeyCode(n,r){let o=IN[n.key]||n.key,i="";return r.indexOf("code.")>-1&&(o=n.code,i="code."),!(null==o||!o)&&(o=o.toLowerCase()," "===o?o="space":"."===o&&(o="dot"),eD.forEach(s=>{s!==o&&(0,AN[s])(n)&&(i+=s+".")}),i+=o,i===r)}static eventCallback(n,r,o){return i=>{e.matchEventFullKeyCode(i,n)&&o.runGuarded(()=>r(i))}}static _normalizeKey(n){return"esc"===n?"escape":n}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const FN=Qv(d1,"browser",[{provide:ed,useValue:"browser"},{provide:Bv,useValue:function xN(){Fd.makeCurrent()},multi:!0},{provide:ot,useFactory:function NN(){return function dM(e){Pu=e}(document),document},deps:[]}]),rD=new R(""),oD=[{provide:pa,useClass:class yN{addToWindow(t){ce.getAngularTestability=(r,o=!0)=>{const i=t.findTestabilityInTree(r,o);if(null==i)throw new Error("Could not find testability for element.");return i},ce.getAllAngularTestabilities=()=>t.getAllTestabilities(),ce.getAllAngularRootElements=()=>t.getAllRootElements(),ce.frameworkStabilizers||(ce.frameworkStabilizers=[]),ce.frameworkStabilizers.push(r=>{const o=ce.getAllAngularTestabilities();let i=o.length,s=!1;const a=function(l){s=s||l,i--,0==i&&r(s)};o.forEach(function(l){l.whenStable(a)})})}findTestabilityInTree(t,n,r){return null==n?null:t.getTestability(n)??(r?ln().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null)}},deps:[]},{provide:Wv,useClass:id,deps:[Pe,sd,pa]},{provide:id,useClass:id,deps:[Pe,sd,pa]}],iD=[{provide:zu,useValue:"root"},{provide:Yr,useFactory:function RN(){return new Yr},deps:[]},{provide:Oa,useClass:SN,multi:!0,deps:[ot,Pe,ed]},{provide:Oa,useClass:TN,multi:!0,deps:[ot]},{provide:kd,useClass:kd,deps:[Pa,Ri,Mi]},{provide:Eg,useExisting:kd},{provide:q_,useExisting:Ri},{provide:Ri,useClass:Ri,deps:[ot]},{provide:Pa,useClass:Pa,deps:[Oa,Pe]},{provide:B_,useClass:vN,deps:[]},[]];let ON=(()=>{class e{constructor(n){}static withServerTransition(n){return{ngModule:e,providers:[{provide:Mi,useValue:n.appId},{provide:z_,useExisting:Mi},mN]}}}return e.\u0275fac=function(n){return new(n||e)(I(rD,12))},e.\u0275mod=It({type:e}),e.\u0275inj=ft({providers:[...iD,...oD],imports:[FR,f1]}),e})(),sD=(()=>{class e{constructor(n){this._doc=n}getTitle(){return this._doc.title}setTitle(n){this._doc.title=n||""}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:function(n){let r=null;return r=n?new n:function kN(){return new sD(I(ot))}(),r},providedIn:"root"}),e})();function N(...e){return Me(e,Po(e))}typeof window<"u"&&window;class Qt extends Yt{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){const n=super._subscribe(t);return!n.closed&&t.next(this._value),n}getValue(){const{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;return this._throwIfClosed(),r}next(t){super.next(this._value=t)}}const La=No(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"}),{isArray:GN}=Array,{getPrototypeOf:zN,prototype:WN,keys:qN}=Object;function uD(e){if(1===e.length){const t=e[0];if(GN(t))return{args:t,keys:null};if(function KN(e){return e&&"object"==typeof e&&zN(e)===WN}(t)){const n=qN(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}const{isArray:ZN}=Array;function cD(e){return q(t=>function QN(e,t){return ZN(t)?e(...t):e(t)}(e,t))}function dD(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function fD(...e){const t=Po(e),n=bh(e),{args:r,keys:o}=uD(e);if(0===r.length)return Me([],t);const i=new Ce(function YN(e,t,n=rr){return r=>{hD(t,()=>{const{length:o}=e,i=new Array(o);let s=o,a=o;for(let l=0;l{const u=Me(e[l],t);let c=!1;u.subscribe(Re(r,d=>{i[l]=d,c||(c=!0,a--),a||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}(r,t,o?s=>dD(o,s):rr));return n?i.pipe(cD(n)):i}function hD(e,t,n){e?gn(n,e,t):t()}function Bd(...e){return function JN(){return xr(1)}()(Me(e,Po(e)))}function pD(e){return new Ce(t=>{Pt(e()).subscribe(t)})}function Ni(e,t){const n=le(e)?e:()=>e,r=o=>o.error(n());return new Ce(t?o=>t.schedule(r,0,o):r)}function Ud(){return Ve((e,t)=>{let n=null;e._refCount++;const r=Re(t,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount)return void(n=null);const o=e._connection,i=n;n=null,o&&(!i||o===i)&&o.unsubscribe(),t.unsubscribe()});e.subscribe(r),r.closed||(n=e.connect())})}class gD extends Ce{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subject=null,this._refCount=0,this._connection=null,lh(t)&&(this.lift=t.lift)}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;const{_connection:t}=this;this._subject=this._connection=null,t?.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new Mt;const n=this.getSubject();t.add(this.source.subscribe(Re(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=Mt.EMPTY)}return t}refCount(){return Ud()(this)}}function un(e,t){return Ve((n,r)=>{let o=null,i=0,s=!1;const a=()=>s&&!o&&r.complete();n.subscribe(Re(r,l=>{o?.unsubscribe();let u=0;const c=i++;Pt(e(l,c)).subscribe(o=Re(r,d=>r.next(t?t(l,d,c,u++):d),()=>{o=null,a()}))},()=>{s=!0,a()}))})}function Fi(e){return e<=0?()=>mn:Ve((t,n)=>{let r=0;t.subscribe(Re(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function Fn(e,t){return Ve((n,r)=>{let o=0;n.subscribe(Re(r,i=>e.call(t,i,o++)&&r.next(i)))})}function Va(e){return Ve((t,n)=>{let r=!1;t.subscribe(Re(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function mD(e=eF){return Ve((t,n)=>{let r=!1;t.subscribe(Re(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function eF(){return new La}function qn(e,t){const n=arguments.length>=2;return r=>r.pipe(e?Fn((o,i)=>e(o,i,r)):rr,Fi(1),n?Va(t):mD(()=>new La))}function Kn(e,t){return le(t)?Ue(e,t,1):Ue(e,1)}function Ze(e,t,n){const r=le(e)||t||n?{next:e,error:t,complete:n}:e;return r?Ve((o,i)=>{var s;null===(s=r.subscribe)||void 0===s||s.call(r);let a=!0;o.subscribe(Re(i,l=>{var u;null===(u=r.next)||void 0===u||u.call(r,l),i.next(l)},()=>{var l;a=!1,null===(l=r.complete)||void 0===l||l.call(r),i.complete()},l=>{var u;a=!1,null===(u=r.error)||void 0===u||u.call(r,l),i.error(l)},()=>{var l,u;a&&(null===(l=r.unsubscribe)||void 0===l||l.call(r)),null===(u=r.finalize)||void 0===u||u.call(r)}))}):rr}function Zn(e){return Ve((t,n)=>{let i,r=null,o=!1;r=t.subscribe(Re(n,void 0,void 0,s=>{i=Pt(e(s,Zn(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function tF(e,t,n,r,o){return(i,s)=>{let a=n,l=t,u=0;i.subscribe(Re(s,c=>{const d=u++;l=a?e(l,c,d):(a=!0,c),r&&s.next(l)},o&&(()=>{a&&s.next(l),s.complete()})))}}function yD(e,t){return Ve(tF(e,t,arguments.length>=2,!0))}function $d(e){return e<=0?()=>mn:Ve((t,n)=>{let r=[];t.subscribe(Re(n,o=>{r.push(o),e{for(const o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function vD(e,t){const n=arguments.length>=2;return r=>r.pipe(e?Fn((o,i)=>e(o,i,r)):rr,$d(1),n?Va(t):mD(()=>new La))}function Hd(e){return Ve((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}const W="primary",Oi=Symbol("RouteTitle");class oF{constructor(t){this.params=t||{}}has(t){return Object.prototype.hasOwnProperty.call(this.params,t)}get(t){if(this.has(t)){const n=this.params[t];return Array.isArray(n)?n[0]:n}return null}getAll(t){if(this.has(t)){const n=this.params[t];return Array.isArray(n)?n:[n]}return[]}get keys(){return Object.keys(this.params)}}function _o(e){return new oF(e)}function iF(e,t,n){const r=n.path.split("/");if(r.length>e.length||"full"===n.pathMatch&&(t.hasChildren()||r.lengthr[i]===o)}return e===t}function DD(e){return Array.prototype.concat.apply([],e)}function CD(e){return e.length>0?e[e.length-1]:null}function $e(e,t){for(const n in e)e.hasOwnProperty(n)&&t(e[n],n)}function Qn(e){return Ac(e)?e:gi(e)?Me(Promise.resolve(e)):N(e)}const lF={exact:function ED(e,t,n){if(!Cr(e.segments,t.segments)||!ja(e.segments,t.segments,n)||e.numberOfChildren!==t.numberOfChildren)return!1;for(const r in t.children)if(!e.children[r]||!ED(e.children[r],t.children[r],n))return!1;return!0},subset:MD},wD={exact:function uF(e,t){return cn(e,t)},subset:function cF(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(n=>_D(e[n],t[n]))},ignored:()=>!0};function bD(e,t,n){return lF[n.paths](e.root,t.root,n.matrixParams)&&wD[n.queryParams](e.queryParams,t.queryParams)&&!("exact"===n.fragment&&e.fragment!==t.fragment)}function MD(e,t,n){return SD(e,t,t.segments,n)}function SD(e,t,n,r){if(e.segments.length>n.length){const o=e.segments.slice(0,n.length);return!(!Cr(o,n)||t.hasChildren()||!ja(o,n,r))}if(e.segments.length===n.length){if(!Cr(e.segments,n)||!ja(e.segments,n,r))return!1;for(const o in t.children)if(!e.children[o]||!MD(e.children[o],t.children[o],r))return!1;return!0}{const o=n.slice(0,e.segments.length),i=n.slice(e.segments.length);return!!(Cr(e.segments,o)&&ja(e.segments,o,r)&&e.children[W])&&SD(e.children[W],t,i,r)}}function ja(e,t,n){return t.every((r,o)=>wD[n](e[o].parameters,r.parameters))}class Dr{constructor(t,n,r){this.root=t,this.queryParams=n,this.fragment=r}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=_o(this.queryParams)),this._queryParamMap}toString(){return hF.serialize(this)}}class K{constructor(t,n){this.segments=t,this.children=n,this.parent=null,$e(n,(r,o)=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Ba(this)}}class Pi{constructor(t,n){this.path=t,this.parameters=n}get parameterMap(){return this._parameterMap||(this._parameterMap=_o(this.parameters)),this._parameterMap}toString(){return xD(this)}}function Cr(e,t){return e.length===t.length&&e.every((n,r)=>n.path===t[r].path)}let ID=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return new zd},providedIn:"root"}),e})();class zd{parse(t){const n=new wF(t);return new Dr(n.parseRootSegment(),n.parseQueryParams(),n.parseFragment())}serialize(t){const n=`/${ki(t.root,!0)}`,r=function mF(e){const t=Object.keys(e).map(n=>{const r=e[n];return Array.isArray(r)?r.map(o=>`${Ua(n)}=${Ua(o)}`).join("&"):`${Ua(n)}=${Ua(r)}`}).filter(n=>!!n);return t.length?`?${t.join("&")}`:""}(t.queryParams);return`${n}${r}${"string"==typeof t.fragment?`#${function pF(e){return encodeURI(e)}(t.fragment)}`:""}`}}const hF=new zd;function Ba(e){return e.segments.map(t=>xD(t)).join("/")}function ki(e,t){if(!e.hasChildren())return Ba(e);if(t){const n=e.children[W]?ki(e.children[W],!1):"",r=[];return $e(e.children,(o,i)=>{i!==W&&r.push(`${i}:${ki(o,!1)}`)}),r.length>0?`${n}(${r.join("//")})`:n}{const n=function fF(e,t){let n=[];return $e(e.children,(r,o)=>{o===W&&(n=n.concat(t(r,o)))}),$e(e.children,(r,o)=>{o!==W&&(n=n.concat(t(r,o)))}),n}(e,(r,o)=>o===W?[ki(e.children[W],!1)]:[`${o}:${ki(r,!1)}`]);return 1===Object.keys(e.children).length&&null!=e.children[W]?`${Ba(e)}/${n[0]}`:`${Ba(e)}/(${n.join("//")})`}}function AD(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Ua(e){return AD(e).replace(/%3B/gi,";")}function Wd(e){return AD(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function $a(e){return decodeURIComponent(e)}function TD(e){return $a(e.replace(/\+/g,"%20"))}function xD(e){return`${Wd(e.path)}${function gF(e){return Object.keys(e).map(t=>`;${Wd(t)}=${Wd(e[t])}`).join("")}(e.parameters)}`}const yF=/^[^\/()?;=#]+/;function Ha(e){const t=e.match(yF);return t?t[0]:""}const vF=/^[^=?&#]+/,DF=/^[^&#]+/;class wF{constructor(t){this.url=t,this.remaining=t}parseRootSegment(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new K([],{}):new K([],this.parseChildren())}parseQueryParams(){const t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(""===this.remaining)return{};this.consumeOptional("/");const t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());let n={};this.peekStartsWith("/(")&&(this.capture("/"),n=this.parseParens(!0));let r={};return this.peekStartsWith("(")&&(r=this.parseParens(!1)),(t.length>0||Object.keys(n).length>0)&&(r[W]=new K(t,n)),r}parseSegment(){const t=Ha(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new w(4009,!1);return this.capture(t),new Pi($a(t),this.parseMatrixParams())}parseMatrixParams(){const t={};for(;this.consumeOptional(";");)this.parseParam(t);return t}parseParam(t){const n=Ha(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const o=Ha(this.remaining);o&&(r=o,this.capture(r))}t[$a(n)]=$a(r)}parseQueryParam(t){const n=function _F(e){const t=e.match(vF);return t?t[0]:""}(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const s=function CF(e){const t=e.match(DF);return t?t[0]:""}(this.remaining);s&&(r=s,this.capture(r))}const o=TD(n),i=TD(r);if(t.hasOwnProperty(o)){let s=t[o];Array.isArray(s)||(s=[s],t[o]=s),s.push(i)}else t[o]=i}parseParens(t){const n={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){const r=Ha(this.remaining),o=this.remaining[r.length];if("/"!==o&&")"!==o&&";"!==o)throw new w(4010,!1);let i;r.indexOf(":")>-1?(i=r.slice(0,r.indexOf(":")),this.capture(i),this.capture(":")):t&&(i=W);const s=this.parseChildren();n[i]=1===Object.keys(s).length?s[W]:new K([],s),this.consumeOptional("//")}return n}peekStartsWith(t){return this.remaining.startsWith(t)}consumeOptional(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)}capture(t){if(!this.consumeOptional(t))throw new w(4011,!1)}}function qd(e){return e.segments.length>0?new K([],{[W]:e}):e}function Ga(e){const t={};for(const r of Object.keys(e.children)){const i=Ga(e.children[r]);(i.segments.length>0||i.hasChildren())&&(t[r]=i)}return function bF(e){if(1===e.numberOfChildren&&e.children[W]){const t=e.children[W];return new K(e.segments.concat(t.segments),t.children)}return e}(new K(e.segments,t))}function wr(e){return e instanceof Dr}function SF(e,t,n,r,o){if(0===n.length)return Do(t.root,t.root,t.root,r,o);const i=function FD(e){if("string"==typeof e[0]&&1===e.length&&"/"===e[0])return new ND(!0,0,e);let t=0,n=!1;const r=e.reduce((o,i,s)=>{if("object"==typeof i&&null!=i){if(i.outlets){const a={};return $e(i.outlets,(l,u)=>{a[u]="string"==typeof l?l.split("/"):l}),[...o,{outlets:a}]}if(i.segmentPath)return[...o,i.segmentPath]}return"string"!=typeof i?[...o,i]:0===s?(i.split("/").forEach((a,l)=>{0==l&&"."===a||(0==l&&""===a?n=!0:".."===a?t++:""!=a&&o.push(a))}),o):[...o,i]},[]);return new ND(n,t,r)}(n);return i.toRoot()?Do(t.root,t.root,new K([],{}),r,o):function s(l){const u=function AF(e,t,n,r){if(e.isAbsolute)return new Co(t.root,!0,0);if(-1===r)return new Co(n,n===t.root,0);return function OD(e,t,n){let r=e,o=t,i=n;for(;i>o;){if(i-=o,r=r.parent,!r)throw new w(4005,!1);o=r.segments.length}return new Co(r,!1,o-i)}(n,r+(Li(e.commands[0])?0:1),e.numberOfDoubleDots)}(i,t,e.snapshot?._urlSegment,l),c=u.processChildren?ji(u.segmentGroup,u.index,i.commands):Zd(u.segmentGroup,u.index,i.commands);return Do(t.root,u.segmentGroup,c,r,o)}(e.snapshot?._lastPathIndex)}function Li(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function Vi(e){return"object"==typeof e&&null!=e&&e.outlets}function Do(e,t,n,r,o){let s,i={};r&&$e(r,(l,u)=>{i[u]=Array.isArray(l)?l.map(c=>`${c}`):`${l}`}),s=e===t?n:RD(e,t,n);const a=qd(Ga(s));return new Dr(a,i,o)}function RD(e,t,n){const r={};return $e(e.children,(o,i)=>{r[i]=o===t?n:RD(o,t,n)}),new K(e.segments,r)}class ND{constructor(t,n,r){if(this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=r,t&&r.length>0&&Li(r[0]))throw new w(4003,!1);const o=r.find(Vi);if(o&&o!==CD(r))throw new w(4004,!1)}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class Co{constructor(t,n,r){this.segmentGroup=t,this.processChildren=n,this.index=r}}function Zd(e,t,n){if(e||(e=new K([],{})),0===e.segments.length&&e.hasChildren())return ji(e,t,n);const r=function xF(e,t,n){let r=0,o=t;const i={match:!1,pathIndex:0,commandIndex:0};for(;o=n.length)return i;const s=e.segments[o],a=n[r];if(Vi(a))break;const l=`${a}`,u=r0&&void 0===l)break;if(l&&u&&"object"==typeof u&&void 0===u.outlets){if(!kD(l,u,s))return i;r+=2}else{if(!kD(l,{},s))return i;r++}o++}return{match:!0,pathIndex:o,commandIndex:r}}(e,t,n),o=n.slice(r.commandIndex);if(r.match&&r.pathIndex{"string"==typeof i&&(i=[i]),null!==i&&(o[s]=Zd(e.children[s],t,i))}),$e(e.children,(i,s)=>{void 0===r[s]&&(o[s]=i)}),new K(e.segments,o)}}function Qd(e,t,n){const r=e.segments.slice(0,t);let o=0;for(;o{"string"==typeof n&&(n=[n]),null!==n&&(t[r]=Qd(new K([],{}),0,n))}),t}function PD(e){const t={};return $e(e,(n,r)=>t[r]=`${n}`),t}function kD(e,t,n){return e==n.path&&cn(t,n.parameters)}class On{constructor(t,n){this.id=t,this.url=n}}class Yd extends On{constructor(t,n,r="imperative",o=null){super(t,n),this.type=0,this.navigationTrigger=r,this.restoredState=o}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}}class br extends On{constructor(t,n,r){super(t,n),this.urlAfterRedirects=r,this.type=1}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}}class za extends On{constructor(t,n,r,o){super(t,n),this.reason=r,this.code=o,this.type=2}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}}class LD extends On{constructor(t,n,r,o){super(t,n),this.error=r,this.target=o,this.type=3}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}}class NF extends On{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=4}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class FF extends On{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=7}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class OF extends On{constructor(t,n,r,o,i){super(t,n),this.urlAfterRedirects=r,this.state=o,this.shouldActivate=i,this.type=8}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}}class PF extends On{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=5}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class kF extends On{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=6}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class LF{constructor(t){this.route=t,this.type=9}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class VF{constructor(t){this.route=t,this.type=10}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class jF{constructor(t){this.snapshot=t,this.type=11}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class BF{constructor(t){this.snapshot=t,this.type=12}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class UF{constructor(t){this.snapshot=t,this.type=13}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class $F{constructor(t){this.snapshot=t,this.type=14}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class VD{constructor(t,n,r){this.routerEvent=t,this.position=n,this.anchor=r,this.type=15}toString(){return`Scroll(anchor: '${this.anchor}', position: '${this.position?`${this.position[0]}, ${this.position[1]}`:null}')`}}class jD{constructor(t){this._root=t}get root(){return this._root.value}parent(t){const n=this.pathFromRoot(t);return n.length>1?n[n.length-2]:null}children(t){const n=Jd(t,this._root);return n?n.children.map(r=>r.value):[]}firstChild(t){const n=Jd(t,this._root);return n&&n.children.length>0?n.children[0].value:null}siblings(t){const n=Xd(t,this._root);return n.length<2?[]:n[n.length-2].children.map(o=>o.value).filter(o=>o!==t)}pathFromRoot(t){return Xd(t,this._root).map(n=>n.value)}}function Jd(e,t){if(e===t.value)return t;for(const n of t.children){const r=Jd(e,n);if(r)return r}return null}function Xd(e,t){if(e===t.value)return[t];for(const n of t.children){const r=Xd(e,n);if(r.length)return r.unshift(t),r}return[]}class Pn{constructor(t,n){this.value=t,this.children=n}toString(){return`TreeNode(${this.value})`}}function wo(e){const t={};return e&&e.children.forEach(n=>t[n.value.outlet]=n),t}class BD extends jD{constructor(t,n){super(t),this.snapshot=n,ef(this,t)}toString(){return this.snapshot.toString()}}function UD(e,t){const n=function GF(e,t){const s=new Wa([],{},{},"",{},W,t,null,e.root,-1,{});return new HD("",new Pn(s,[]))}(e,t),r=new Qt([new Pi("",{})]),o=new Qt({}),i=new Qt({}),s=new Qt({}),a=new Qt(""),l=new Yn(r,o,s,a,i,W,t,n.root);return l.snapshot=n.root,new BD(new Pn(l,[]),n)}class Yn{constructor(t,n,r,o,i,s,a,l){this.url=t,this.params=n,this.queryParams=r,this.fragment=o,this.data=i,this.outlet=s,this.component=a,this.title=this.data?.pipe(q(u=>u[Oi]))??N(void 0),this._futureSnapshot=l}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=this.params.pipe(q(t=>_o(t)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(q(t=>_o(t)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function $D(e,t="emptyOnly"){const n=e.pathFromRoot;let r=0;if("always"!==t)for(r=n.length-1;r>=1;){const o=n[r],i=n[r-1];if(o.routeConfig&&""===o.routeConfig.path)r--;else{if(i.component)break;r--}}return function zF(e){return e.reduce((t,n)=>({params:{...t.params,...n.params},data:{...t.data,...n.data},resolve:{...n.data,...t.resolve,...n.routeConfig?.data,...n._resolvedData}}),{params:{},data:{},resolve:{}})}(n.slice(r))}class Wa{constructor(t,n,r,o,i,s,a,l,u,c,d,f){this.url=t,this.params=n,this.queryParams=r,this.fragment=o,this.data=i,this.outlet=s,this.component=a,this.title=this.data?.[Oi],this.routeConfig=l,this._urlSegment=u,this._lastPathIndex=c,this._correctedLastPathIndex=f??c,this._resolve=d}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=_o(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=_o(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class HD extends jD{constructor(t,n){super(n),this.url=t,ef(this,n)}toString(){return GD(this._root)}}function ef(e,t){t.value._routerState=e,t.children.forEach(n=>ef(e,n))}function GD(e){const t=e.children.length>0?` { ${e.children.map(GD).join(", ")} } `:"";return`${e.value}${t}`}function tf(e){if(e.snapshot){const t=e.snapshot,n=e._futureSnapshot;e.snapshot=n,cn(t.queryParams,n.queryParams)||e.queryParams.next(n.queryParams),t.fragment!==n.fragment&&e.fragment.next(n.fragment),cn(t.params,n.params)||e.params.next(n.params),function sF(e,t){if(e.length!==t.length)return!1;for(let n=0;ncn(n.parameters,t[r].parameters))}(e.url,t.url);return n&&!(!e.parent!=!t.parent)&&(!e.parent||nf(e.parent,t.parent))}function Bi(e,t,n){if(n&&e.shouldReuseRoute(t.value,n.value.snapshot)){const r=n.value;r._futureSnapshot=t.value;const o=function qF(e,t,n){return t.children.map(r=>{for(const o of n.children)if(e.shouldReuseRoute(r.value,o.value.snapshot))return Bi(e,r,o);return Bi(e,r)})}(e,t,n);return new Pn(r,o)}{if(e.shouldAttach(t.value)){const i=e.retrieve(t.value);if(null!==i){const s=i.route;return s.value._futureSnapshot=t.value,s.children=t.children.map(a=>Bi(e,a)),s}}const r=function KF(e){return new Yn(new Qt(e.url),new Qt(e.params),new Qt(e.queryParams),new Qt(e.fragment),new Qt(e.data),e.outlet,e.component,e)}(t.value),o=t.children.map(i=>Bi(e,i));return new Pn(r,o)}}const rf="ngNavigationCancelingError";function zD(e,t){const{redirectTo:n,navigationBehaviorOptions:r}=wr(t)?{redirectTo:t,navigationBehaviorOptions:void 0}:t,o=WD(!1,0,t);return o.url=n,o.navigationBehaviorOptions=r,o}function WD(e,t,n){const r=new Error("NavigationCancelingError: "+(e||""));return r[rf]=!0,r.cancellationCode=t,n&&(r.url=n),r}function qD(e){return KD(e)&&wr(e.url)}function KD(e){return e&&e[rf]}class ZF{constructor(){this.outlet=null,this.route=null,this.resolver=null,this.injector=null,this.children=new Ui,this.attachRef=null}}let Ui=(()=>{class e{constructor(){this.contexts=new Map}onChildOutletCreated(n,r){const o=this.getOrCreateContext(n);o.outlet=r,this.contexts.set(n,o)}onChildOutletDestroyed(n){const r=this.getContext(n);r&&(r.outlet=null,r.attachRef=null)}onOutletDeactivated(){const n=this.contexts;return this.contexts=new Map,n}onOutletReAttached(n){this.contexts=n}getOrCreateContext(n){let r=this.getContext(n);return r||(r=new ZF,this.contexts.set(n,r)),r}getContext(n){return this.contexts.get(n)||null}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const qa=!1;let sf=(()=>{class e{constructor(n,r,o,i,s){this.parentContexts=n,this.location=r,this.changeDetector=i,this.environmentInjector=s,this.activated=null,this._activatedRoute=null,this.activateEvents=new ye,this.deactivateEvents=new ye,this.attachEvents=new ye,this.detachEvents=new ye,this.name=o||W,n.onChildOutletCreated(this.name,this)}ngOnDestroy(){this.parentContexts.getContext(this.name)?.outlet===this&&this.parentContexts.onChildOutletDestroyed(this.name)}ngOnInit(){if(!this.activated){const n=this.parentContexts.getContext(this.name);n&&n.route&&(n.attachRef?this.attach(n.attachRef,n.route):this.activateWith(n.route,n.injector))}}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new w(4012,qa);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new w(4012,qa);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new w(4012,qa);this.location.detach();const n=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(n.instance),n}attach(n,r){this.activated=n,this._activatedRoute=r,this.location.insert(n.hostView),this.attachEvents.emit(n.instance)}deactivate(){if(this.activated){const n=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(n)}}activateWith(n,r){if(this.isActivated)throw new w(4013,qa);this._activatedRoute=n;const o=this.location,s=n._futureSnapshot.component,a=this.parentContexts.getOrCreateContext(this.name).children,l=new QF(n,a,o.injector);if(r&&function YF(e){return!!e.resolveComponentFactory}(r)){const u=r.resolveComponentFactory(s);this.activated=o.createComponent(u,o.length,l)}else this.activated=o.createComponent(s,{index:o.length,injector:l,environmentInjector:r??this.environmentInjector});this.changeDetector.markForCheck(),this.activateEvents.emit(this.activated.instance)}}return e.\u0275fac=function(n){return new(n||e)(D(Ui),D(Wt),Wo("name"),D(ya),D($n))},e.\u0275dir=V({type:e,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],standalone:!0}),e})();class QF{constructor(t,n,r){this.route=t,this.childContexts=n,this.parent=r}get(t,n){return t===Yn?this.route:t===Ui?this.childContexts:this.parent.get(t,n)}}let af=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["ng-component"]],standalone:!0,features:[Yy],decls:1,vars:0,template:function(n,r){1&n&&Ke(0,"router-outlet")},dependencies:[sf],encapsulation:2}),e})();function ZD(e,t){return e.providers&&!e._injector&&(e._injector=sa(e.providers,t,`Route: ${e.path}`)),e._injector??t}function uf(e){const t=e.children&&e.children.map(uf),n=t?{...e,children:t}:{...e};return!n.component&&!n.loadComponent&&(t||n.loadChildren)&&n.outlet&&n.outlet!==W&&(n.component=af),n}function Ot(e){return e.outlet||W}function QD(e,t){const n=e.filter(r=>Ot(r)===t);return n.push(...e.filter(r=>Ot(r)!==t)),n}function $i(e){if(!e)return null;if(e.routeConfig?._injector)return e.routeConfig._injector;for(let t=e.parent;t;t=t.parent){const n=t.routeConfig;if(n?._loadedInjector)return n._loadedInjector;if(n?._injector)return n._injector}return null}class nO{constructor(t,n,r,o){this.routeReuseStrategy=t,this.futureState=n,this.currState=r,this.forwardEvent=o}activate(t){const n=this.futureState._root,r=this.currState?this.currState._root:null;this.deactivateChildRoutes(n,r,t),tf(this.futureState.root),this.activateChildRoutes(n,r,t)}deactivateChildRoutes(t,n,r){const o=wo(n);t.children.forEach(i=>{const s=i.value.outlet;this.deactivateRoutes(i,o[s],r),delete o[s]}),$e(o,(i,s)=>{this.deactivateRouteAndItsChildren(i,r)})}deactivateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(o===i)if(o.component){const s=r.getContext(o.outlet);s&&this.deactivateChildRoutes(t,n,s.children)}else this.deactivateChildRoutes(t,n,r);else i&&this.deactivateRouteAndItsChildren(n,r)}deactivateRouteAndItsChildren(t,n){t.value.component&&this.routeReuseStrategy.shouldDetach(t.value.snapshot)?this.detachAndStoreRouteSubtree(t,n):this.deactivateRouteAndOutlet(t,n)}detachAndStoreRouteSubtree(t,n){const r=n.getContext(t.value.outlet),o=r&&t.value.component?r.children:n,i=wo(t);for(const s of Object.keys(i))this.deactivateRouteAndItsChildren(i[s],o);if(r&&r.outlet){const s=r.outlet.detach(),a=r.children.onOutletDeactivated();this.routeReuseStrategy.store(t.value.snapshot,{componentRef:s,route:t,contexts:a})}}deactivateRouteAndOutlet(t,n){const r=n.getContext(t.value.outlet),o=r&&t.value.component?r.children:n,i=wo(t);for(const s of Object.keys(i))this.deactivateRouteAndItsChildren(i[s],o);r&&r.outlet&&(r.outlet.deactivate(),r.children.onOutletDeactivated(),r.attachRef=null,r.resolver=null,r.route=null)}activateChildRoutes(t,n,r){const o=wo(n);t.children.forEach(i=>{this.activateRoutes(i,o[i.value.outlet],r),this.forwardEvent(new $F(i.value.snapshot))}),t.children.length&&this.forwardEvent(new BF(t.value.snapshot))}activateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(tf(o),o===i)if(o.component){const s=r.getOrCreateContext(o.outlet);this.activateChildRoutes(t,n,s.children)}else this.activateChildRoutes(t,n,r);else if(o.component){const s=r.getOrCreateContext(o.outlet);if(this.routeReuseStrategy.shouldAttach(o.snapshot)){const a=this.routeReuseStrategy.retrieve(o.snapshot);this.routeReuseStrategy.store(o.snapshot,null),s.children.onOutletReAttached(a.contexts),s.attachRef=a.componentRef,s.route=a.route.value,s.outlet&&s.outlet.attach(a.componentRef,a.route.value),tf(a.route.value),this.activateChildRoutes(t,null,s.children)}else{const a=$i(o.snapshot),l=a?.get(ui)??null;s.attachRef=null,s.route=o,s.resolver=l,s.injector=a,s.outlet&&s.outlet.activateWith(o,s.injector),this.activateChildRoutes(t,null,s.children)}}else this.activateChildRoutes(t,null,r)}}class YD{constructor(t){this.path=t,this.route=this.path[this.path.length-1]}}class Ka{constructor(t,n){this.component=t,this.route=n}}function rO(e,t,n){const r=e._root;return Hi(r,t?t._root:null,n,[r.value])}function bo(e,t){const n=Symbol(),r=t.get(e,n);return r===n?"function"!=typeof e||function eE(e){return null!==us(e)}(e)?t.get(e):e:r}function Hi(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=wo(t);return e.children.forEach(s=>{(function iO(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=e.value,s=t?t.value:null,a=n?n.getContext(e.value.outlet):null;if(s&&i.routeConfig===s.routeConfig){const l=function sO(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!Cr(e.url,t.url);case"pathParamsOrQueryParamsChange":return!Cr(e.url,t.url)||!cn(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!nf(e,t)||!cn(e.queryParams,t.queryParams);default:return!nf(e,t)}}(s,i,i.routeConfig.runGuardsAndResolvers);l?o.canActivateChecks.push(new YD(r)):(i.data=s.data,i._resolvedData=s._resolvedData),Hi(e,t,i.component?a?a.children:null:n,r,o),l&&a&&a.outlet&&a.outlet.isActivated&&o.canDeactivateChecks.push(new Ka(a.outlet.component,s))}else s&&Gi(t,a,o),o.canActivateChecks.push(new YD(r)),Hi(e,null,i.component?a?a.children:null:n,r,o)})(s,i[s.value.outlet],n,r.concat([s.value]),o),delete i[s.value.outlet]}),$e(i,(s,a)=>Gi(s,n.getContext(a),o)),o}function Gi(e,t,n){const r=wo(e),o=e.value;$e(r,(i,s)=>{Gi(i,o.component?t?t.children.getContext(s):null:t,n)}),n.canDeactivateChecks.push(new Ka(o.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,o))}function zi(e){return"function"==typeof e}function cf(e){return e instanceof La||"EmptyError"===e?.name}const Za=Symbol("INITIAL_VALUE");function Eo(){return un(e=>fD(e.map(t=>t.pipe(Fi(1),function XN(...e){const t=Po(e);return Ve((n,r)=>{(t?Bd(e,n,t):Bd(e,n)).subscribe(r)})}(Za)))).pipe(q(t=>{for(const n of t)if(!0!==n){if(n===Za)return Za;if(!1===n||n instanceof Dr)return n}return!0}),Fn(t=>t!==Za),Fi(1)))}function JD(e){return function rb(...e){return ih(e)}(Ze(t=>{if(wr(t))throw zD(0,t)}),q(t=>!0===t))}const df={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function XD(e,t,n,r,o){const i=ff(e,t,n);return i.matched?function bO(e,t,n,r){const o=t.canMatch;return o&&0!==o.length?N(o.map(s=>{const a=bo(s,e);return Qn(function fO(e){return e&&zi(e.canMatch)}(a)?a.canMatch(t,n):e.runInContext(()=>a(t,n)))})).pipe(Eo(),JD()):N(!0)}(r=ZD(t,r),t,n).pipe(q(s=>!0===s?i:{...df})):N(i)}function ff(e,t,n){if(""===t.path)return"full"===t.pathMatch&&(e.hasChildren()||n.length>0)?{...df}:{matched:!0,consumedSegments:[],remainingSegments:n,parameters:{},positionalParamSegments:{}};const o=(t.matcher||iF)(n,e,t);if(!o)return{...df};const i={};$e(o.posParams,(a,l)=>{i[l]=a.path});const s=o.consumed.length>0?{...i,...o.consumed[o.consumed.length-1].parameters}:i;return{matched:!0,consumedSegments:o.consumed,remainingSegments:n.slice(o.consumed.length),parameters:s,positionalParamSegments:o.posParams??{}}}function Qa(e,t,n,r,o="corrected"){if(n.length>0&&function SO(e,t,n){return n.some(r=>Ya(e,t,r)&&Ot(r)!==W)}(e,n,r)){const s=new K(t,function MO(e,t,n,r){const o={};o[W]=r,r._sourceSegment=e,r._segmentIndexShift=t.length;for(const i of n)if(""===i.path&&Ot(i)!==W){const s=new K([],{});s._sourceSegment=e,s._segmentIndexShift=t.length,o[Ot(i)]=s}return o}(e,t,r,new K(n,e.children)));return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:[]}}if(0===n.length&&function IO(e,t,n){return n.some(r=>Ya(e,t,r))}(e,n,r)){const s=new K(e.segments,function EO(e,t,n,r,o,i){const s={};for(const a of r)if(Ya(e,n,a)&&!o[Ot(a)]){const l=new K([],{});l._sourceSegment=e,l._segmentIndexShift="legacy"===i?e.segments.length:t.length,s[Ot(a)]=l}return{...o,...s}}(e,t,n,r,e.children,o));return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:n}}const i=new K(e.segments,e.children);return i._sourceSegment=e,i._segmentIndexShift=t.length,{segmentGroup:i,slicedSegments:n}}function Ya(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function eC(e,t,n,r){return!!(Ot(e)===r||r!==W&&Ya(t,n,e))&&("**"===e.path||ff(t,e,n).matched)}function tC(e,t,n){return 0===t.length&&!e.children[n]}const Ja=!1;class Xa{constructor(t){this.segmentGroup=t||null}}class nC{constructor(t){this.urlTree=t}}function Wi(e){return Ni(new Xa(e))}function rC(e){return Ni(new nC(e))}class RO{constructor(t,n,r,o,i){this.injector=t,this.configLoader=n,this.urlSerializer=r,this.urlTree=o,this.config=i,this.allowRedirects=!0}apply(){const t=Qa(this.urlTree.root,[],[],this.config).segmentGroup,n=new K(t.segments,t.children);return this.expandSegmentGroup(this.injector,this.config,n,W).pipe(q(i=>this.createUrlTree(Ga(i),this.urlTree.queryParams,this.urlTree.fragment))).pipe(Zn(i=>{if(i instanceof nC)return this.allowRedirects=!1,this.match(i.urlTree);throw i instanceof Xa?this.noMatchError(i):i}))}match(t){return this.expandSegmentGroup(this.injector,this.config,t.root,W).pipe(q(o=>this.createUrlTree(Ga(o),t.queryParams,t.fragment))).pipe(Zn(o=>{throw o instanceof Xa?this.noMatchError(o):o}))}noMatchError(t){return new w(4002,Ja)}createUrlTree(t,n,r){const o=qd(t);return new Dr(o,n,r)}expandSegmentGroup(t,n,r,o){return 0===r.segments.length&&r.hasChildren()?this.expandChildren(t,n,r).pipe(q(i=>new K([],i))):this.expandSegment(t,r,n,r.segments,o,!0)}expandChildren(t,n,r){const o=[];for(const i of Object.keys(r.children))"primary"===i?o.unshift(i):o.push(i);return Me(o).pipe(Kn(i=>{const s=r.children[i],a=QD(n,i);return this.expandSegmentGroup(t,a,s,i).pipe(q(l=>({segment:l,outlet:i})))}),yD((i,s)=>(i[s.outlet]=s.segment,i),{}),vD())}expandSegment(t,n,r,o,i,s){return Me(r).pipe(Kn(a=>this.expandSegmentAgainstRoute(t,n,r,a,o,i,s).pipe(Zn(u=>{if(u instanceof Xa)return N(null);throw u}))),qn(a=>!!a),Zn((a,l)=>{if(cf(a))return tC(n,o,i)?N(new K([],{})):Wi(n);throw a}))}expandSegmentAgainstRoute(t,n,r,o,i,s,a){return eC(o,n,i,s)?void 0===o.redirectTo?this.matchSegmentAgainstRoute(t,n,o,i,s):a&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s):Wi(n):Wi(n)}expandSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s){return"**"===o.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,r,o,s):this.expandRegularSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s)}expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,r,o){const i=this.applyRedirectCommands([],r.redirectTo,{});return r.redirectTo.startsWith("/")?rC(i):this.lineralizeSegments(r,i).pipe(Ue(s=>{const a=new K(s,{});return this.expandSegment(t,a,n,s,o,!1)}))}expandRegularSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s){const{matched:a,consumedSegments:l,remainingSegments:u,positionalParamSegments:c}=ff(n,o,i);if(!a)return Wi(n);const d=this.applyRedirectCommands(l,o.redirectTo,c);return o.redirectTo.startsWith("/")?rC(d):this.lineralizeSegments(o,d).pipe(Ue(f=>this.expandSegment(t,n,r,f.concat(u),s,!1)))}matchSegmentAgainstRoute(t,n,r,o,i){return"**"===r.path?(t=ZD(r,t),r.loadChildren?(r._loadedRoutes?N({routes:r._loadedRoutes,injector:r._loadedInjector}):this.configLoader.loadChildren(t,r)).pipe(q(a=>(r._loadedRoutes=a.routes,r._loadedInjector=a.injector,new K(o,{})))):N(new K(o,{}))):XD(n,r,o,t).pipe(un(({matched:s,consumedSegments:a,remainingSegments:l})=>s?this.getChildConfig(t=r._injector??t,r,o).pipe(Ue(c=>{const d=c.injector??t,f=c.routes,{segmentGroup:h,slicedSegments:p}=Qa(n,a,l,f),g=new K(h.segments,h.children);if(0===p.length&&g.hasChildren())return this.expandChildren(d,f,g).pipe(q(y=>new K(a,y)));if(0===f.length&&0===p.length)return N(new K(a,{}));const m=Ot(r)===i;return this.expandSegment(d,g,f,p,m?W:i,!0).pipe(q(b=>new K(a.concat(b.segments),b.children)))})):Wi(n)))}getChildConfig(t,n,r){return n.children?N({routes:n.children,injector:t}):n.loadChildren?void 0!==n._loadedRoutes?N({routes:n._loadedRoutes,injector:n._loadedInjector}):function wO(e,t,n,r){const o=t.canLoad;return void 0===o||0===o.length?N(!0):N(o.map(s=>{const a=bo(s,e);return Qn(function lO(e){return e&&zi(e.canLoad)}(a)?a.canLoad(t,n):e.runInContext(()=>a(t,n)))})).pipe(Eo(),JD())}(t,n,r).pipe(Ue(o=>o?this.configLoader.loadChildren(t,n).pipe(Ze(i=>{n._loadedRoutes=i.routes,n._loadedInjector=i.injector})):function TO(e){return Ni(WD(Ja,3))}())):N({routes:[],injector:t})}lineralizeSegments(t,n){let r=[],o=n.root;for(;;){if(r=r.concat(o.segments),0===o.numberOfChildren)return N(r);if(o.numberOfChildren>1||!o.children[W])return Ni(new w(4e3,Ja));o=o.children[W]}}applyRedirectCommands(t,n,r){return this.applyRedirectCreateUrlTree(n,this.urlSerializer.parse(n),t,r)}applyRedirectCreateUrlTree(t,n,r,o){const i=this.createSegmentGroup(t,n.root,r,o);return new Dr(i,this.createQueryParams(n.queryParams,this.urlTree.queryParams),n.fragment)}createQueryParams(t,n){const r={};return $e(t,(o,i)=>{if("string"==typeof o&&o.startsWith(":")){const a=o.substring(1);r[i]=n[a]}else r[i]=o}),r}createSegmentGroup(t,n,r,o){const i=this.createSegments(t,n.segments,r,o);let s={};return $e(n.children,(a,l)=>{s[l]=this.createSegmentGroup(t,a,r,o)}),new K(i,s)}createSegments(t,n,r,o){return n.map(i=>i.path.startsWith(":")?this.findPosParam(t,i,o):this.findOrReturn(i,r))}findPosParam(t,n,r){const o=r[n.path.substring(1)];if(!o)throw new w(4001,Ja);return o}findOrReturn(t,n){let r=0;for(const o of n){if(o.path===t.path)return n.splice(r),o;r++}return t}}class FO{}class kO{constructor(t,n,r,o,i,s,a,l){this.injector=t,this.rootComponentType=n,this.config=r,this.urlTree=o,this.url=i,this.paramsInheritanceStrategy=s,this.relativeLinkResolution=a,this.urlSerializer=l}recognize(){const t=Qa(this.urlTree.root,[],[],this.config.filter(n=>void 0===n.redirectTo),this.relativeLinkResolution).segmentGroup;return this.processSegmentGroup(this.injector,this.config,t,W).pipe(q(n=>{if(null===n)return null;const r=new Wa([],Object.freeze({}),Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,{},W,this.rootComponentType,null,this.urlTree.root,-1,{}),o=new Pn(r,n),i=new HD(this.url,o);return this.inheritParamsAndData(i._root),i}))}inheritParamsAndData(t){const n=t.value,r=$D(n,this.paramsInheritanceStrategy);n.params=Object.freeze(r.params),n.data=Object.freeze(r.data),t.children.forEach(o=>this.inheritParamsAndData(o))}processSegmentGroup(t,n,r,o){return 0===r.segments.length&&r.hasChildren()?this.processChildren(t,n,r):this.processSegment(t,n,r,r.segments,o)}processChildren(t,n,r){return Me(Object.keys(r.children)).pipe(Kn(o=>{const i=r.children[o],s=QD(n,o);return this.processSegmentGroup(t,s,i,o)}),yD((o,i)=>o&&i?(o.push(...i),o):null),function nF(e,t=!1){return Ve((n,r)=>{let o=0;n.subscribe(Re(r,i=>{const s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}(o=>null!==o),Va(null),vD(),q(o=>{if(null===o)return null;const i=oC(o);return function LO(e){e.sort((t,n)=>t.value.outlet===W?-1:n.value.outlet===W?1:t.value.outlet.localeCompare(n.value.outlet))}(i),i}))}processSegment(t,n,r,o,i){return Me(n).pipe(Kn(s=>this.processSegmentAgainstRoute(s._injector??t,s,r,o,i)),qn(s=>!!s),Zn(s=>{if(cf(s))return tC(r,o,i)?N([]):N(null);throw s}))}processSegmentAgainstRoute(t,n,r,o,i){if(n.redirectTo||!eC(n,r,o,i))return N(null);let s;if("**"===n.path){const a=o.length>0?CD(o).parameters:{},l=sC(r)+o.length;s=N({snapshot:new Wa(o,a,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,lC(n),Ot(n),n.component??n._loadedComponent??null,n,iC(r),l,uC(n),l),consumedSegments:[],remainingSegments:[]})}else s=XD(r,n,o,t).pipe(q(({matched:a,consumedSegments:l,remainingSegments:u,parameters:c})=>{if(!a)return null;const d=sC(r)+l.length;return{snapshot:new Wa(l,c,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,lC(n),Ot(n),n.component??n._loadedComponent??null,n,iC(r),d,uC(n),d),consumedSegments:l,remainingSegments:u}}));return s.pipe(un(a=>{if(null===a)return N(null);const{snapshot:l,consumedSegments:u,remainingSegments:c}=a;t=n._injector??t;const d=n._loadedInjector??t,f=function VO(e){return e.children?e.children:e.loadChildren?e._loadedRoutes:[]}(n),{segmentGroup:h,slicedSegments:p}=Qa(r,u,c,f.filter(m=>void 0===m.redirectTo),this.relativeLinkResolution);if(0===p.length&&h.hasChildren())return this.processChildren(d,f,h).pipe(q(m=>null===m?null:[new Pn(l,m)]));if(0===f.length&&0===p.length)return N([new Pn(l,[])]);const g=Ot(n)===i;return this.processSegment(d,f,h,p,g?W:i).pipe(q(m=>null===m?null:[new Pn(l,m)]))}))}}function jO(e){const t=e.value.routeConfig;return t&&""===t.path&&void 0===t.redirectTo}function oC(e){const t=[],n=new Set;for(const r of e){if(!jO(r)){t.push(r);continue}const o=t.find(i=>r.value.routeConfig===i.value.routeConfig);void 0!==o?(o.children.push(...r.children),n.add(o)):t.push(r)}for(const r of n){const o=oC(r.children);t.push(new Pn(r.value,o))}return t.filter(r=>!n.has(r))}function iC(e){let t=e;for(;t._sourceSegment;)t=t._sourceSegment;return t}function sC(e){let t=e,n=t._segmentIndexShift??0;for(;t._sourceSegment;)t=t._sourceSegment,n+=t._segmentIndexShift??0;return n-1}function lC(e){return e.data||{}}function uC(e){return e.resolve||{}}function cC(e){return"string"==typeof e.title||null===e.title}function hf(e){return un(t=>{const n=e(t);return n?Me(n).pipe(q(()=>t)):N(t)})}let dC=(()=>{class e{buildTitle(n){let r,o=n.root;for(;void 0!==o;)r=this.getResolvedTitleForRoute(o)??r,o=o.children.find(i=>i.outlet===W);return r}getResolvedTitleForRoute(n){return n.data[Oi]}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return we(fC)},providedIn:"root"}),e})(),fC=(()=>{class e extends dC{constructor(n){super(),this.title=n}updateTitle(n){const r=this.buildTitle(n);void 0!==r&&this.title.setTitle(r)}}return e.\u0275fac=function(n){return new(n||e)(I(sD))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class qO{}class ZO extends class KO{shouldDetach(t){return!1}store(t,n){}shouldAttach(t){return!1}retrieve(t){return null}shouldReuseRoute(t,n){return t.routeConfig===n.routeConfig}}{}const tl=new R("",{providedIn:"root",factory:()=>({})}),pf=new R("ROUTES");let gf=(()=>{class e{constructor(n,r){this.injector=n,this.compiler=r,this.componentLoaders=new WeakMap,this.childrenLoaders=new WeakMap}loadComponent(n){if(this.componentLoaders.get(n))return this.componentLoaders.get(n);if(n._loadedComponent)return N(n._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(n);const r=Qn(n.loadComponent()).pipe(Ze(i=>{this.onLoadEndListener&&this.onLoadEndListener(n),n._loadedComponent=i}),Hd(()=>{this.componentLoaders.delete(n)})),o=new gD(r,()=>new Yt).pipe(Ud());return this.componentLoaders.set(n,o),o}loadChildren(n,r){if(this.childrenLoaders.get(r))return this.childrenLoaders.get(r);if(r._loadedRoutes)return N({routes:r._loadedRoutes,injector:r._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(r);const i=this.loadModuleFactoryOrRoutes(r.loadChildren).pipe(q(a=>{this.onLoadEndListener&&this.onLoadEndListener(r);let l,u,c=!1;Array.isArray(a)?u=a:(l=a.create(n).injector,u=DD(l.get(pf,[],O.Self|O.Optional)));return{routes:u.map(uf),injector:l}}),Hd(()=>{this.childrenLoaders.delete(r)})),s=new gD(i,()=>new Yt).pipe(Ud());return this.childrenLoaders.set(r,s),s}loadModuleFactoryOrRoutes(n){return Qn(n()).pipe(Ue(r=>r instanceof Zy||Array.isArray(r)?N(r):Me(this.compiler.compileModuleAsync(r))))}}return e.\u0275fac=function(n){return new(n||e)(I(wt),I(td))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class YO{}class JO{shouldProcessUrl(t){return!0}extract(t){return t}merge(t,n){return t}}function XO(e){throw e}function eP(e,t,n){return t.parse("/")}const tP={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},nP={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function pC(){const e=we(ID),t=we(Ui),n=we(md),r=we(wt),o=we(td),i=we(pf,{optional:!0})??[],s=we(tl,{optional:!0})??{},a=we(fC),l=we(dC,{optional:!0}),u=we(YO,{optional:!0}),c=we(qO,{optional:!0}),d=new Le(null,e,t,n,r,o,DD(i));return u&&(d.urlHandlingStrategy=u),c&&(d.routeReuseStrategy=c),d.titleStrategy=l??a,function rP(e,t){e.errorHandler&&(t.errorHandler=e.errorHandler),e.malformedUriErrorHandler&&(t.malformedUriErrorHandler=e.malformedUriErrorHandler),e.onSameUrlNavigation&&(t.onSameUrlNavigation=e.onSameUrlNavigation),e.paramsInheritanceStrategy&&(t.paramsInheritanceStrategy=e.paramsInheritanceStrategy),e.relativeLinkResolution&&(t.relativeLinkResolution=e.relativeLinkResolution),e.urlUpdateStrategy&&(t.urlUpdateStrategy=e.urlUpdateStrategy),e.canceledNavigationResolution&&(t.canceledNavigationResolution=e.canceledNavigationResolution)}(s,d),d}let Le=(()=>{class e{constructor(n,r,o,i,s,a,l){this.rootComponentType=n,this.urlSerializer=r,this.rootContexts=o,this.location=i,this.config=l,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.disposed=!1,this.navigationId=0,this.currentPageId=0,this.isNgZoneEnabled=!1,this.events=new Yt,this.errorHandler=XO,this.malformedUriErrorHandler=eP,this.navigated=!1,this.lastSuccessfulId=-1,this.afterPreactivation=()=>N(void 0),this.urlHandlingStrategy=new JO,this.routeReuseStrategy=new ZO,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.configLoader=s.get(gf),this.configLoader.onLoadEndListener=f=>this.triggerEvent(new VF(f)),this.configLoader.onLoadStartListener=f=>this.triggerEvent(new LF(f)),this.ngModule=s.get(mr),this.console=s.get(Rx);const d=s.get(Pe);this.isNgZoneEnabled=d instanceof Pe&&Pe.isInAngularZone(),this.resetConfig(l),this.currentUrlTree=function aF(){return new Dr(new K([],{}),{},null)}(),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.routerState=UD(this.currentUrlTree,this.rootComponentType),this.transitions=new Qt({id:0,targetPageId:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}get browserPageId(){return this.location.getState()?.\u0275routerPageId}setupNavigations(n){const r=this.events;return n.pipe(Fn(o=>0!==o.id),q(o=>({...o,extractedUrl:this.urlHandlingStrategy.extract(o.rawUrl)})),un(o=>{let i=!1,s=!1;return N(o).pipe(Ze(a=>{this.currentNavigation={id:a.id,initialUrl:a.rawUrl,extractedUrl:a.extractedUrl,trigger:a.source,extras:a.extras,previousNavigation:this.lastSuccessfulNavigation?{...this.lastSuccessfulNavigation,previousNavigation:null}:null}}),un(a=>{const l=this.browserUrlTree.toString(),u=!this.navigated||a.extractedUrl.toString()!==l||l!==this.currentUrlTree.toString();if(("reload"===this.onSameUrlNavigation||u)&&this.urlHandlingStrategy.shouldProcessUrl(a.rawUrl))return gC(a.source)&&(this.browserUrlTree=a.extractedUrl),N(a).pipe(un(d=>{const f=this.transitions.getValue();return r.next(new Yd(d.id,this.serializeUrl(d.extractedUrl),d.source,d.restoredState)),f!==this.transitions.getValue()?mn:Promise.resolve(d)}),function NO(e,t,n,r){return un(o=>function xO(e,t,n,r,o){return new RO(e,t,n,r,o).apply()}(e,t,n,o.extractedUrl,r).pipe(q(i=>({...o,urlAfterRedirects:i}))))}(this.ngModule.injector,this.configLoader,this.urlSerializer,this.config),Ze(d=>{this.currentNavigation={...this.currentNavigation,finalUrl:d.urlAfterRedirects},o.urlAfterRedirects=d.urlAfterRedirects}),function UO(e,t,n,r,o,i){return Ue(s=>function PO(e,t,n,r,o,i,s="emptyOnly",a="legacy"){return new kO(e,t,n,r,o,s,a,i).recognize().pipe(un(l=>null===l?function OO(e){return new Ce(t=>t.error(e))}(new FO):N(l)))}(e,t,n,s.urlAfterRedirects,r.serialize(s.urlAfterRedirects),r,o,i).pipe(q(a=>({...s,targetSnapshot:a}))))}(this.ngModule.injector,this.rootComponentType,this.config,this.urlSerializer,this.paramsInheritanceStrategy,this.relativeLinkResolution),Ze(d=>{if(o.targetSnapshot=d.targetSnapshot,"eager"===this.urlUpdateStrategy){if(!d.extras.skipLocationChange){const h=this.urlHandlingStrategy.merge(d.urlAfterRedirects,d.rawUrl);this.setBrowserUrl(h,d)}this.browserUrlTree=d.urlAfterRedirects}const f=new NF(d.id,this.serializeUrl(d.extractedUrl),this.serializeUrl(d.urlAfterRedirects),d.targetSnapshot);r.next(f)}));if(u&&this.rawUrlTree&&this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)){const{id:f,extractedUrl:h,source:p,restoredState:g,extras:m}=a,v=new Yd(f,this.serializeUrl(h),p,g);r.next(v);const b=UD(h,this.rootComponentType).snapshot;return N(o={...a,targetSnapshot:b,urlAfterRedirects:h,extras:{...m,skipLocationChange:!1,replaceUrl:!1}})}return this.rawUrlTree=a.rawUrl,a.resolve(null),mn}),Ze(a=>{const l=new FF(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot);this.triggerEvent(l)}),q(a=>o={...a,guards:rO(a.targetSnapshot,a.currentSnapshot,this.rootContexts)}),function pO(e,t){return Ue(n=>{const{targetSnapshot:r,currentSnapshot:o,guards:{canActivateChecks:i,canDeactivateChecks:s}}=n;return 0===s.length&&0===i.length?N({...n,guardsResult:!0}):function gO(e,t,n,r){return Me(e).pipe(Ue(o=>function CO(e,t,n,r,o){const i=t&&t.routeConfig?t.routeConfig.canDeactivate:null;return i&&0!==i.length?N(i.map(a=>{const l=$i(t)??o,u=bo(a,l);return Qn(function dO(e){return e&&zi(e.canDeactivate)}(u)?u.canDeactivate(e,t,n,r):l.runInContext(()=>u(e,t,n,r))).pipe(qn())})).pipe(Eo()):N(!0)}(o.component,o.route,n,t,r)),qn(o=>!0!==o,!0))}(s,r,o,e).pipe(Ue(a=>a&&function aO(e){return"boolean"==typeof e}(a)?function mO(e,t,n,r){return Me(t).pipe(Kn(o=>Bd(function vO(e,t){return null!==e&&t&&t(new jF(e)),N(!0)}(o.route.parent,r),function yO(e,t){return null!==e&&t&&t(new UF(e)),N(!0)}(o.route,r),function DO(e,t,n){const r=t[t.length-1],i=t.slice(0,t.length-1).reverse().map(s=>function oO(e){const t=e.routeConfig?e.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:e,guards:t}:null}(s)).filter(s=>null!==s).map(s=>pD(()=>N(s.guards.map(l=>{const u=$i(s.node)??n,c=bo(l,u);return Qn(function cO(e){return e&&zi(e.canActivateChild)}(c)?c.canActivateChild(r,e):u.runInContext(()=>c(r,e))).pipe(qn())})).pipe(Eo())));return N(i).pipe(Eo())}(e,o.path,n),function _O(e,t,n){const r=t.routeConfig?t.routeConfig.canActivate:null;if(!r||0===r.length)return N(!0);const o=r.map(i=>pD(()=>{const s=$i(t)??n,a=bo(i,s);return Qn(function uO(e){return e&&zi(e.canActivate)}(a)?a.canActivate(t,e):s.runInContext(()=>a(t,e))).pipe(qn())}));return N(o).pipe(Eo())}(e,o.route,n))),qn(o=>!0!==o,!0))}(r,i,e,t):N(a)),q(a=>({...n,guardsResult:a})))})}(this.ngModule.injector,a=>this.triggerEvent(a)),Ze(a=>{if(o.guardsResult=a.guardsResult,wr(a.guardsResult))throw zD(0,a.guardsResult);const l=new OF(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);this.triggerEvent(l)}),Fn(a=>!!a.guardsResult||(this.restoreHistory(a),this.cancelNavigationTransition(a,"",3),!1)),hf(a=>{if(a.guards.canActivateChecks.length)return N(a).pipe(Ze(l=>{const u=new PF(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}),un(l=>{let u=!1;return N(l).pipe(function $O(e,t){return Ue(n=>{const{targetSnapshot:r,guards:{canActivateChecks:o}}=n;if(!o.length)return N(n);let i=0;return Me(o).pipe(Kn(s=>function HO(e,t,n,r){const o=e.routeConfig,i=e._resolve;return void 0!==o?.title&&!cC(o)&&(i[Oi]=o.title),function GO(e,t,n,r){const o=function zO(e){return[...Object.keys(e),...Object.getOwnPropertySymbols(e)]}(e);if(0===o.length)return N({});const i={};return Me(o).pipe(Ue(s=>function WO(e,t,n,r){const o=$i(t)??r,i=bo(e,o);return Qn(i.resolve?i.resolve(t,n):o.runInContext(()=>i(t,n)))}(e[s],t,n,r).pipe(qn(),Ze(a=>{i[s]=a}))),$d(1),function rF(e){return q(()=>e)}(i),Zn(s=>cf(s)?mn:Ni(s)))}(i,e,t,r).pipe(q(s=>(e._resolvedData=s,e.data=$D(e,n).resolve,o&&cC(o)&&(e.data[Oi]=o.title),null)))}(s.route,r,e,t)),Ze(()=>i++),$d(1),Ue(s=>i===o.length?N(n):mn))})}(this.paramsInheritanceStrategy,this.ngModule.injector),Ze({next:()=>u=!0,complete:()=>{u||(this.restoreHistory(l),this.cancelNavigationTransition(l,"",2))}}))}),Ze(l=>{const u=new kF(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}))}),hf(a=>{const l=u=>{const c=[];u.routeConfig?.loadComponent&&!u.routeConfig._loadedComponent&&c.push(this.configLoader.loadComponent(u.routeConfig).pipe(Ze(d=>{u.component=d}),q(()=>{})));for(const d of u.children)c.push(...l(d));return c};return fD(l(a.targetSnapshot.root)).pipe(Va(),Fi(1))}),hf(()=>this.afterPreactivation()),q(a=>{const l=function WF(e,t,n){const r=Bi(e,t._root,n?n._root:void 0);return new BD(r,t)}(this.routeReuseStrategy,a.targetSnapshot,a.currentRouterState);return o={...a,targetRouterState:l}}),Ze(a=>{this.currentUrlTree=a.urlAfterRedirects,this.rawUrlTree=this.urlHandlingStrategy.merge(a.urlAfterRedirects,a.rawUrl),this.routerState=a.targetRouterState,"deferred"===this.urlUpdateStrategy&&(a.extras.skipLocationChange||this.setBrowserUrl(this.rawUrlTree,a),this.browserUrlTree=a.urlAfterRedirects)}),((e,t,n)=>q(r=>(new nO(t,r.targetRouterState,r.currentRouterState,n).activate(e),r)))(this.rootContexts,this.routeReuseStrategy,a=>this.triggerEvent(a)),Ze({next(){i=!0},complete(){i=!0}}),Hd(()=>{i||s||this.cancelNavigationTransition(o,"",1),this.currentNavigation?.id===o.id&&(this.currentNavigation=null)}),Zn(a=>{if(s=!0,KD(a)){qD(a)||(this.navigated=!0,this.restoreHistory(o,!0));const l=new za(o.id,this.serializeUrl(o.extractedUrl),a.message,a.cancellationCode);if(r.next(l),qD(a)){const u=this.urlHandlingStrategy.merge(a.url,this.rawUrlTree),c={skipLocationChange:o.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||gC(o.source)};this.scheduleNavigation(u,"imperative",null,c,{resolve:o.resolve,reject:o.reject,promise:o.promise})}else o.resolve(!1)}else{this.restoreHistory(o,!0);const l=new LD(o.id,this.serializeUrl(o.extractedUrl),a,o.targetSnapshot??void 0);r.next(l);try{o.resolve(this.errorHandler(a))}catch(u){o.reject(u)}}return mn}))}))}resetRootComponentType(n){this.rootComponentType=n,this.routerState.root.component=this.rootComponentType}setTransition(n){this.transitions.next({...this.transitions.value,...n})}initialNavigation(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}setUpLocationChangeListener(){this.locationSubscription||(this.locationSubscription=this.location.subscribe(n=>{const r="popstate"===n.type?"popstate":"hashchange";"popstate"===r&&setTimeout(()=>{const o={replaceUrl:!0},i=n.state?.navigationId?n.state:null;if(i){const a={...i};delete a.navigationId,delete a.\u0275routerPageId,0!==Object.keys(a).length&&(o.state=a)}const s=this.parseUrl(n.url);this.scheduleNavigation(s,r,i,o)},0)}))}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.currentNavigation}triggerEvent(n){this.events.next(n)}resetConfig(n){this.config=n.map(uf),this.navigated=!1,this.lastSuccessfulId=-1}ngOnDestroy(){this.dispose()}dispose(){this.transitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0}createUrlTree(n,r={}){const{relativeTo:o,queryParams:i,fragment:s,queryParamsHandling:a,preserveFragment:l}=r,u=o||this.routerState.root,c=l?this.currentUrlTree.fragment:s;let d=null;switch(a){case"merge":d={...this.currentUrlTree.queryParams,...i};break;case"preserve":d=this.currentUrlTree.queryParams;break;default:d=i||null}return null!==d&&(d=this.removeEmptyProps(d)),SF(u,this.currentUrlTree,n,d,c??null)}navigateByUrl(n,r={skipLocationChange:!1}){const o=wr(n)?n:this.parseUrl(n),i=this.urlHandlingStrategy.merge(o,this.rawUrlTree);return this.scheduleNavigation(i,"imperative",null,r)}navigate(n,r={skipLocationChange:!1}){return function oP(e){for(let t=0;t{const i=n[o];return null!=i&&(r[o]=i),r},{})}processNavigations(){this.navigations.subscribe(n=>{this.navigated=!0,this.lastSuccessfulId=n.id,this.currentPageId=n.targetPageId,this.events.next(new br(n.id,this.serializeUrl(n.extractedUrl),this.serializeUrl(this.currentUrlTree))),this.lastSuccessfulNavigation=this.currentNavigation,this.titleStrategy?.updateTitle(this.routerState.snapshot),n.resolve(!0)},n=>{this.console.warn(`Unhandled Navigation Error: ${n}`)})}scheduleNavigation(n,r,o,i,s){if(this.disposed)return Promise.resolve(!1);let a,l,u;s?(a=s.resolve,l=s.reject,u=s.promise):u=new Promise((f,h)=>{a=f,l=h});const c=++this.navigationId;let d;return"computed"===this.canceledNavigationResolution?(0===this.currentPageId&&(o=this.location.getState()),d=o&&o.\u0275routerPageId?o.\u0275routerPageId:i.replaceUrl||i.skipLocationChange?this.browserPageId??0:(this.browserPageId??0)+1):d=0,this.setTransition({id:c,targetPageId:d,source:r,restoredState:o,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:n,extras:i,resolve:a,reject:l,promise:u,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),u.catch(f=>Promise.reject(f))}setBrowserUrl(n,r){const o=this.urlSerializer.serialize(n),i={...r.extras.state,...this.generateNgRouterState(r.id,r.targetPageId)};this.location.isCurrentPathEqualTo(o)||r.extras.replaceUrl?this.location.replaceState(o,"",i):this.location.go(o,"",i)}restoreHistory(n,r=!1){if("computed"===this.canceledNavigationResolution){const o=this.currentPageId-n.targetPageId;"popstate"!==n.source&&"eager"!==this.urlUpdateStrategy&&this.currentUrlTree!==this.currentNavigation?.finalUrl||0===o?this.currentUrlTree===this.currentNavigation?.finalUrl&&0===o&&(this.resetState(n),this.browserUrlTree=n.currentUrlTree,this.resetUrlToCurrentUrlTree()):this.location.historyGo(o)}else"replace"===this.canceledNavigationResolution&&(r&&this.resetState(n),this.resetUrlToCurrentUrlTree())}resetState(n){this.routerState=n.currentRouterState,this.currentUrlTree=n.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,n.rawUrl)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}cancelNavigationTransition(n,r,o){const i=new za(n.id,this.serializeUrl(n.extractedUrl),r,o);this.triggerEvent(i),n.resolve(!1)}generateNgRouterState(n,r){return"computed"===this.canceledNavigationResolution?{navigationId:n,\u0275routerPageId:r}:{navigationId:n}}}return e.\u0275fac=function(n){nc()},e.\u0275prov=L({token:e,factory:function(){return pC()},providedIn:"root"}),e})();function gC(e){return"imperative"!==e}let rl=(()=>{class e{constructor(n,r,o,i,s){this.router=n,this.route=r,this.tabIndexAttribute=o,this.renderer=i,this.el=s,this._preserveFragment=!1,this._skipLocationChange=!1,this._replaceUrl=!1,this.commands=null,this.onChanges=new Yt,this.setTabIndexIfNotOnNativeEl("0")}set preserveFragment(n){this._preserveFragment=xn(n)}get preserveFragment(){return this._preserveFragment}set skipLocationChange(n){this._skipLocationChange=xn(n)}get skipLocationChange(){return this._skipLocationChange}set replaceUrl(n){this._replaceUrl=xn(n)}get replaceUrl(){return this._replaceUrl}setTabIndexIfNotOnNativeEl(n){if(null!=this.tabIndexAttribute)return;const r=this.renderer,o=this.el.nativeElement;null!==n?r.setAttribute(o,"tabindex",n):r.removeAttribute(o,"tabindex")}ngOnChanges(n){this.onChanges.next(this)}set routerLink(n){null!=n?(this.commands=Array.isArray(n)?n:[n],this.setTabIndexIfNotOnNativeEl("0")):(this.commands=null,this.setTabIndexIfNotOnNativeEl(null))}onClick(){return null===this.urlTree||this.router.navigateByUrl(this.urlTree,{skipLocationChange:this.skipLocationChange,replaceUrl:this.replaceUrl,state:this.state}),!0}get urlTree(){return null===this.commands?null:this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:this.preserveFragment})}}return e.\u0275fac=function(n){return new(n||e)(D(Le),D(Yn),Wo("tabindex"),D(bn),D(Ct))},e.\u0275dir=V({type:e,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(n,r){1&n&&te("click",function(){return r.onClick()})},inputs:{queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",state:"state",relativeTo:"relativeTo",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",routerLink:"routerLink"},standalone:!0,features:[mt]}),e})();class mC{}let aP=(()=>{class e{constructor(n,r,o,i,s){this.router=n,this.injector=o,this.preloadingStrategy=i,this.loader=s}setUpPreloading(){this.subscription=this.router.events.pipe(Fn(n=>n instanceof br),Kn(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(n,r){const o=[];for(const i of r){i.providers&&!i._injector&&(i._injector=sa(i.providers,n,`Route: ${i.path}`));const s=i._injector??n,a=i._loadedInjector??s;i.loadChildren&&!i._loadedRoutes&&void 0===i.canLoad||i.loadComponent&&!i._loadedComponent?o.push(this.preloadConfig(s,i)):(i.children||i._loadedRoutes)&&o.push(this.processRoutes(a,i.children??i._loadedRoutes))}return Me(o).pipe(xr())}preloadConfig(n,r){return this.preloadingStrategy.preload(r,()=>{let o;o=r.loadChildren&&void 0===r.canLoad?this.loader.loadChildren(n,r):N(null);const i=o.pipe(Ue(s=>null===s?N(void 0):(r._loadedRoutes=s.routes,r._loadedInjector=s.injector,this.processRoutes(s.injector??n,s.routes))));return r.loadComponent&&!r._loadedComponent?Me([i,this.loader.loadComponent(r)]).pipe(xr()):i})}}return e.\u0275fac=function(n){return new(n||e)(I(Le),I(td),I($n),I(mC),I(gf))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const yf=new R("");let yC=(()=>{class e{constructor(n,r,o={}){this.router=n,this.viewportScroller=r,this.options=o,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},o.scrollPositionRestoration=o.scrollPositionRestoration||"disabled",o.anchorScrolling=o.anchorScrolling||"disabled"}init(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.router.events.subscribe(n=>{n instanceof Yd?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=n.navigationTrigger,this.restoredId=n.restoredState?n.restoredState.navigationId:0):n instanceof br&&(this.lastId=n.id,this.scheduleScrollEvent(n,this.router.parseUrl(n.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(n=>{n instanceof VD&&(n.position?"top"===this.options.scrollPositionRestoration?this.viewportScroller.scrollToPosition([0,0]):"enabled"===this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition(n.position):n.anchor&&"enabled"===this.options.anchorScrolling?this.viewportScroller.scrollToAnchor(n.anchor):"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(n,r){this.router.triggerEvent(new VD(n,"popstate"===this.lastSource?this.store[this.restoredId]:null,r))}ngOnDestroy(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}return e.\u0275fac=function(n){nc()},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();function Mo(e,t){return{\u0275kind:e,\u0275providers:t}}function vf(e){return[{provide:pf,multi:!0,useValue:e}]}function _C(){const e=we(wt);return t=>{const n=e.get(ga);if(t!==n.components[0])return;const r=e.get(Le),o=e.get(DC);1===e.get(_f)&&r.initialNavigation(),e.get(CC,null,O.Optional)?.setUpPreloading(),e.get(yf,null,O.Optional)?.init(),r.resetRootComponentType(n.componentTypes[0]),o.closed||(o.next(),o.unsubscribe())}}const DC=new R("",{factory:()=>new Yt}),_f=new R("",{providedIn:"root",factory:()=>1});const CC=new R("");function dP(e){return Mo(0,[{provide:CC,useExisting:aP},{provide:mC,useExisting:e}])}const wC=new R("ROUTER_FORROOT_GUARD"),fP=[md,{provide:ID,useClass:zd},{provide:Le,useFactory:pC},Ui,{provide:Yn,useFactory:function vC(e){return e.routerState.root},deps:[Le]},gf];function hP(){return new Kv("Router",Le)}let bC=(()=>{class e{constructor(n){}static forRoot(n,r){return{ngModule:e,providers:[fP,[],vf(n),{provide:wC,useFactory:yP,deps:[[Le,new Xo,new ei]]},{provide:tl,useValue:r||{}},r?.useHash?{provide:vr,useClass:_1}:{provide:vr,useClass:__},{provide:yf,useFactory:()=>{const e=we(Le),t=we(LR),n=we(tl);return n.scrollOffset&&t.setOffset(n.scrollOffset),new yC(e,t,n)}},r?.preloadingStrategy?dP(r.preloadingStrategy).\u0275providers:[],{provide:Kv,multi:!0,useFactory:hP},r?.initialNavigation?vP(r):[],[{provide:EC,useFactory:_C},{provide:Uv,multi:!0,useExisting:EC}]]}}static forChild(n){return{ngModule:e,providers:[vf(n)]}}}return e.\u0275fac=function(n){return new(n||e)(I(wC,8))},e.\u0275mod=It({type:e}),e.\u0275inj=ft({imports:[af]}),e})();function yP(e){return"guarded"}function vP(e){return["disabled"===e.initialNavigation?Mo(3,[{provide:fa,multi:!0,useFactory:()=>{const t=we(Le);return()=>{t.setUpLocationChangeListener()}}},{provide:_f,useValue:2}]).\u0275providers:[],"enabledBlocking"===e.initialNavigation?Mo(2,[{provide:_f,useValue:0},{provide:fa,multi:!0,deps:[wt],useFactory:t=>{const n=t.get(y1,Promise.resolve());let r=!1;return()=>n.then(()=>new Promise(i=>{const s=t.get(Le),a=t.get(DC);(function o(i){t.get(Le).events.pipe(Fn(a=>a instanceof br||a instanceof za||a instanceof LD),q(a=>a instanceof br||a instanceof za&&(0===a.code||1===a.code)&&null),Fn(a=>null!==a),Fi(1)).subscribe(()=>{i()})})(()=>{i(!0),r=!0}),s.afterPreactivation=()=>(i(!0),r||a.closed?N(void 0):a),s.initialNavigation()}))}}]).\u0275providers:[]]}const EC=new R("");let DP=(()=>{class e{constructor(){this.title="djongo-FE"}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-root"]],decls:1,vars:0,template:function(n,r){1&n&&Ke(0,"router-outlet")},dependencies:[sf]}),e})();var Be=(()=>{return(e=Be||(Be={})).createAccount="create-account/",e.login="login/",e.dashboard="dashboard/",e.enterprise="enterprise/",e.contactUs="contact-us/",Be;var e})(),qi=(()=>{return(e=qi||(qi={})).intention="intention/",e.payment="payment/",qi;var e})(),So=(()=>{return(e=So||(So={}))[e.OK=0]="OK",e[e.STRIPE_REJ=1]="STRIPE_REJ",e[e.OTHER=2]="OTHER",So;var e})();class MC{}class SC{}class dn{constructor(t){this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?()=>{this.headers=new Map,t.split("\n").forEach(n=>{const r=n.indexOf(":");if(r>0){const o=n.slice(0,r),i=o.toLowerCase(),s=n.slice(r+1).trim();this.maybeSetNormalizedName(o,i),this.headers.has(i)?this.headers.get(i).push(s):this.headers.set(i,[s])}})}:()=>{this.headers=new Map,Object.keys(t).forEach(n=>{let r=t[n];const o=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(this.headers.set(o,r),this.maybeSetNormalizedName(n,o))})}:this.headers=new Map}has(t){return this.init(),this.headers.has(t.toLowerCase())}get(t){this.init();const n=this.headers.get(t.toLowerCase());return n&&n.length>0?n[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(t){return this.init(),this.headers.get(t.toLowerCase())||null}append(t,n){return this.clone({name:t,value:n,op:"a"})}set(t,n){return this.clone({name:t,value:n,op:"s"})}delete(t,n){return this.clone({name:t,value:n,op:"d"})}maybeSetNormalizedName(t,n){this.normalizedNames.has(n)||this.normalizedNames.set(n,t)}init(){this.lazyInit&&(this.lazyInit instanceof dn?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(t=>this.applyUpdate(t)),this.lazyUpdate=null))}copyFrom(t){t.init(),Array.from(t.headers.keys()).forEach(n=>{this.headers.set(n,t.headers.get(n)),this.normalizedNames.set(n,t.normalizedNames.get(n))})}clone(t){const n=new dn;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof dn?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}applyUpdate(t){const n=t.name.toLowerCase();switch(t.op){case"a":case"s":let r=t.value;if("string"==typeof r&&(r=[r]),0===r.length)return;this.maybeSetNormalizedName(t.name,n);const o=("a"===t.op?this.headers.get(n):void 0)||[];o.push(...r),this.headers.set(n,o);break;case"d":const i=t.value;if(i){let s=this.headers.get(n);if(!s)return;s=s.filter(a=>-1===i.indexOf(a)),0===s.length?(this.headers.delete(n),this.normalizedNames.delete(n)):this.headers.set(n,s)}else this.headers.delete(n),this.normalizedNames.delete(n)}}forEach(t){this.init(),Array.from(this.normalizedNames.keys()).forEach(n=>t(this.normalizedNames.get(n),this.headers.get(n)))}}class CP{encodeKey(t){return IC(t)}encodeValue(t){return IC(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}}const bP=/%(\d[a-f0-9])/gi,EP={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function IC(e){return encodeURIComponent(e).replace(bP,(t,n)=>EP[n]??t)}function sl(e){return`${e}`}class fn{constructor(t={}){if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new CP,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function wP(e,t){const n=new Map;return e.length>0&&e.replace(/^\?/,"").split("&").forEach(o=>{const i=o.indexOf("="),[s,a]=-1==i?[t.decodeKey(o),""]:[t.decodeKey(o.slice(0,i)),t.decodeValue(o.slice(i+1))],l=n.get(s)||[];l.push(a),n.set(s,l)}),n}(t.fromString,this.encoder)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(n=>{const r=t.fromObject[n],o=Array.isArray(r)?r.map(sl):[sl(r)];this.map.set(n,o)})):this.map=null}has(t){return this.init(),this.map.has(t)}get(t){this.init();const n=this.map.get(t);return n?n[0]:null}getAll(t){return this.init(),this.map.get(t)||null}keys(){return this.init(),Array.from(this.map.keys())}append(t,n){return this.clone({param:t,value:n,op:"a"})}appendAll(t){const n=[];return Object.keys(t).forEach(r=>{const o=t[r];Array.isArray(o)?o.forEach(i=>{n.push({param:r,value:i,op:"a"})}):n.push({param:r,value:o,op:"a"})}),this.clone(n)}set(t,n){return this.clone({param:t,value:n,op:"s"})}delete(t,n){return this.clone({param:t,value:n,op:"d"})}toString(){return this.init(),this.keys().map(t=>{const n=this.encoder.encodeKey(t);return this.map.get(t).map(r=>n+"="+this.encoder.encodeValue(r)).join("&")}).filter(t=>""!==t).join("&")}clone(t){const n=new fn({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat(t),n}init(){null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(t=>this.map.set(t,this.cloneFrom.map.get(t))),this.updates.forEach(t=>{switch(t.op){case"a":case"s":const n=("a"===t.op?this.map.get(t.param):void 0)||[];n.push(sl(t.value)),this.map.set(t.param,n);break;case"d":if(void 0===t.value){this.map.delete(t.param);break}{let r=this.map.get(t.param)||[];const o=r.indexOf(sl(t.value));-1!==o&&r.splice(o,1),r.length>0?this.map.set(t.param,r):this.map.delete(t.param)}}}),this.cloneFrom=this.updates=null)}}class MP{constructor(){this.map=new Map}set(t,n){return this.map.set(t,n),this}get(t){return this.map.has(t)||this.map.set(t,t.defaultValue()),this.map.get(t)}delete(t){return this.map.delete(t),this}has(t){return this.map.has(t)}keys(){return this.map.keys()}}function AC(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function TC(e){return typeof Blob<"u"&&e instanceof Blob}function xC(e){return typeof FormData<"u"&&e instanceof FormData}class Ki{constructor(t,n,r,o){let i;if(this.url=n,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function SP(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||o?(this.body=void 0!==r?r:null,i=o):i=r,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.context&&(this.context=i.context),i.params&&(this.params=i.params)),this.headers||(this.headers=new dn),this.context||(this.context=new MP),this.params){const s=this.params.toString();if(0===s.length)this.urlWithParams=n;else{const a=n.indexOf("?");this.urlWithParams=n+(-1===a?"?":ad.set(f,t.setHeaders[f]),l)),t.setParams&&(u=Object.keys(t.setParams).reduce((d,f)=>d.set(f,t.setParams[f]),u)),new Ki(n,r,i,{params:u,headers:l,context:c,reportProgress:a,responseType:o,withCredentials:s})}}var xe=(()=>((xe=xe||{})[xe.Sent=0]="Sent",xe[xe.UploadProgress=1]="UploadProgress",xe[xe.ResponseHeader=2]="ResponseHeader",xe[xe.DownloadProgress=3]="DownloadProgress",xe[xe.Response=4]="Response",xe[xe.User=5]="User",xe))();class Df{constructor(t,n=200,r="OK"){this.headers=t.headers||new dn,this.status=void 0!==t.status?t.status:n,this.statusText=t.statusText||r,this.url=t.url||null,this.ok=this.status>=200&&this.status<300}}class Cf extends Df{constructor(t={}){super(t),this.type=xe.ResponseHeader}clone(t={}){return new Cf({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}class al extends Df{constructor(t={}){super(t),this.type=xe.Response,this.body=void 0!==t.body?t.body:null}clone(t={}){return new al({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}class RC extends Df{constructor(t){super(t,0,"Unknown Error"),this.name="HttpErrorResponse",this.ok=!1,this.message=this.status>=200&&this.status<300?`Http failure during parsing for ${t.url||"(unknown url)"}`:`Http failure response for ${t.url||"(unknown url)"}: ${t.status} ${t.statusText}`,this.error=t.error||null}}function wf(e,t){return{body:t,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}let NC=(()=>{class e{constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof Ki)i=n;else{let l,u;l=o.headers instanceof dn?o.headers:new dn(o.headers),o.params&&(u=o.params instanceof fn?o.params:new fn({fromObject:o.params})),i=new Ki(n,r,void 0!==o.body?o.body:null,{headers:l,context:o.context,params:u,reportProgress:o.reportProgress,responseType:o.responseType||"json",withCredentials:o.withCredentials})}const s=N(i).pipe(Kn(l=>this.handler.handle(l)));if(n instanceof Ki||"events"===o.observe)return s;const a=s.pipe(Fn(l=>l instanceof al));switch(o.observe||"body"){case"body":switch(i.responseType){case"arraybuffer":return a.pipe(q(l=>{if(null!==l.body&&!(l.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return l.body}));case"blob":return a.pipe(q(l=>{if(null!==l.body&&!(l.body instanceof Blob))throw new Error("Response is not a Blob.");return l.body}));case"text":return a.pipe(q(l=>{if(null!==l.body&&"string"!=typeof l.body)throw new Error("Response is not a string.");return l.body}));default:return a.pipe(q(l=>l.body))}case"response":return a;default:throw new Error(`Unreachable: unhandled observe type ${o.observe}}`)}}delete(n,r={}){return this.request("DELETE",n,r)}get(n,r={}){return this.request("GET",n,r)}head(n,r={}){return this.request("HEAD",n,r)}jsonp(n,r){return this.request("JSONP",n,{params:(new fn).append(r,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(n,r={}){return this.request("OPTIONS",n,r)}patch(n,r,o={}){return this.request("PATCH",n,wf(o,r))}post(n,r,o={}){return this.request("POST",n,wf(o,r))}put(n,r,o={}){return this.request("PUT",n,wf(o,r))}}return e.\u0275fac=function(n){return new(n||e)(I(MC))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();class FC{constructor(t,n){this.next=t,this.interceptor=n}handle(t){return this.interceptor.intercept(t,this.next)}}const OC=new R("HTTP_INTERCEPTORS");let AP=(()=>{class e{intercept(n,r){return r.handle(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const TP=/^\)\]\}',?\n/;let PC=(()=>{class e{constructor(n){this.xhrFactory=n}handle(n){if("JSONP"===n.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new Ce(r=>{const o=this.xhrFactory.build();if(o.open(n.method,n.urlWithParams),n.withCredentials&&(o.withCredentials=!0),n.headers.forEach((h,p)=>o.setRequestHeader(h,p.join(","))),n.headers.has("Accept")||o.setRequestHeader("Accept","application/json, text/plain, */*"),!n.headers.has("Content-Type")){const h=n.detectContentTypeHeader();null!==h&&o.setRequestHeader("Content-Type",h)}if(n.responseType){const h=n.responseType.toLowerCase();o.responseType="json"!==h?h:"text"}const i=n.serializeBody();let s=null;const a=()=>{if(null!==s)return s;const h=o.statusText||"OK",p=new dn(o.getAllResponseHeaders()),g=function xP(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(o)||n.url;return s=new Cf({headers:p,status:o.status,statusText:h,url:g}),s},l=()=>{let{headers:h,status:p,statusText:g,url:m}=a(),v=null;204!==p&&(v=typeof o.response>"u"?o.responseText:o.response),0===p&&(p=v?200:0);let b=p>=200&&p<300;if("json"===n.responseType&&"string"==typeof v){const y=v;v=v.replace(TP,"");try{v=""!==v?JSON.parse(v):null}catch(x){v=y,b&&(b=!1,v={error:x,text:v})}}b?(r.next(new al({body:v,headers:h,status:p,statusText:g,url:m||void 0})),r.complete()):r.error(new RC({error:v,headers:h,status:p,statusText:g,url:m||void 0}))},u=h=>{const{url:p}=a(),g=new RC({error:h,status:o.status||0,statusText:o.statusText||"Unknown Error",url:p||void 0});r.error(g)};let c=!1;const d=h=>{c||(r.next(a()),c=!0);let p={type:xe.DownloadProgress,loaded:h.loaded};h.lengthComputable&&(p.total=h.total),"text"===n.responseType&&!!o.responseText&&(p.partialText=o.responseText),r.next(p)},f=h=>{let p={type:xe.UploadProgress,loaded:h.loaded};h.lengthComputable&&(p.total=h.total),r.next(p)};return o.addEventListener("load",l),o.addEventListener("error",u),o.addEventListener("timeout",u),o.addEventListener("abort",u),n.reportProgress&&(o.addEventListener("progress",d),null!==i&&o.upload&&o.upload.addEventListener("progress",f)),o.send(i),r.next({type:xe.Sent}),()=>{o.removeEventListener("error",u),o.removeEventListener("abort",u),o.removeEventListener("load",l),o.removeEventListener("timeout",u),n.reportProgress&&(o.removeEventListener("progress",d),null!==i&&o.upload&&o.upload.removeEventListener("progress",f)),o.readyState!==o.DONE&&o.abort()}})}}return e.\u0275fac=function(n){return new(n||e)(I(B_))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const bf=new R("XSRF_COOKIE_NAME"),Ef=new R("XSRF_HEADER_NAME");class kC{}let RP=(()=>{class e{constructor(n,r,o){this.doc=n,this.platform=r,this.cookieName=o,this.lastCookieString="",this.lastToken=null,this.parseCount=0}getToken(){if("server"===this.platform)return null;const n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=T_(n,this.cookieName),this.lastCookieString=n),this.lastToken}}return e.\u0275fac=function(n){return new(n||e)(I(ot),I(ed),I(bf))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),Mf=(()=>{class e{constructor(n,r){this.tokenService=n,this.headerName=r}intercept(n,r){const o=n.url.toLowerCase();if("GET"===n.method||"HEAD"===n.method||o.startsWith("http://")||o.startsWith("https://"))return r.handle(n);const i=this.tokenService.getToken();return null!==i&&!n.headers.has(this.headerName)&&(n=n.clone({headers:n.headers.set(this.headerName,i)})),r.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(I(kC),I(Ef))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),NP=(()=>{class e{constructor(n,r){this.backend=n,this.injector=r,this.chain=null}handle(n){if(null===this.chain){const r=this.injector.get(OC,[]);this.chain=r.reduceRight((o,i)=>new FC(o,i),this.backend)}return this.chain.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(I(SC),I(wt))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),FP=(()=>{class e{static disable(){return{ngModule:e,providers:[{provide:Mf,useClass:AP}]}}static withOptions(n={}){return{ngModule:e,providers:[n.cookieName?{provide:bf,useValue:n.cookieName}:[],n.headerName?{provide:Ef,useValue:n.headerName}:[]]}}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({providers:[Mf,{provide:OC,useExisting:Mf,multi:!0},{provide:kC,useClass:RP},{provide:bf,useValue:"XSRF-TOKEN"},{provide:Ef,useValue:"X-XSRF-TOKEN"}]}),e})(),OP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({providers:[NC,{provide:MC,useClass:NP},PC,{provide:SC,useExisting:PC}],imports:[FP.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]}),e})();const Zi_baseUrl="https://api.djongomapper.com/mapper/";class LC{constructor(){}static has(t){return document.cookie.split(";").some(n=>n.trim().startsWith(t+"="))}static get(t){let n=document.cookie.split(";").find(r=>r.trim().startsWith(t+"="));if(n)return n.trim().split("=")[1]}static set(t,n){document.cookie=t+"="+n+";Secure"}}let hn=(()=>{class e{constructor(n){this.http=n}post(n,r){let o={"Content-Type":"text/plain"},i=LC.get("csrftoken");i&&(o["X-CSRFTOKEN"]=i);let s={withCredentials:!0};return s.headers=new dn(o),this.http.post(Zi_baseUrl+n,r,s)}postForm(n,r){let o=new fn({fromObject:r}),i=LC.get("csrftoken");return i&&(o=o.set("csrfmiddlewaretoken",i)),this.http.post(Zi_baseUrl+n,o,{withCredentials:!0})}get(n,r){let o={withCredentials:!0};return r&&(o.params=new fn({fromObject:r})),this.http.get(Zi_baseUrl+n,o)}}return e.\u0275fac=function(n){return new(n||e)(I(NC))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Sf={dashboard:[{provide:hn,useClass:hn}],createAccount:[{provide:hn,useClass:hn}],contactUs:[{provide:hn,useClass:hn}]};class If{constructor(t){this.name=t.name,this.id=t.id,this.required=t.required,this.ngClass=t.ngClass}}class Io extends If{constructor(t){super(t),this.type=t.type,this.autocomplete=t.autocomplete,this.title=t.title,this.pattern=t.pattern,this.placeholder=t.placeholder}}class VC extends Io{constructor(t){t.required=!0,t.type="password",super(t)}}class PP extends Io{constructor(t){t.required=!0,t.type="email",t.pattern="^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$",t.autocomplete="email",super(t)}}class jC{constructor(t){this.type=t.type,this.label=t.label,this.attr=t.attr,this.errors=t.errors||{},this.show=t.show??!0}onChange(t){}}class Er extends jC{constructor(t){t.type="input",super(t)}}class BC extends jC{constructor(t){t.type="select",super(t),this.options=t.options}}let UC=(()=>{class e{constructor(n,r){this._renderer=n,this._elementRef=r,this.onChange=o=>{},this.onTouched=()=>{}}setProperty(n,r){this._renderer.setProperty(this._elementRef.nativeElement,n,r)}registerOnTouched(n){this.onTouched=n}registerOnChange(n){this.onChange=n}setDisabledState(n){this.setProperty("disabled",n)}}return e.\u0275fac=function(n){return new(n||e)(D(bn),D(Ct))},e.\u0275dir=V({type:e}),e})(),Mr=(()=>{class e extends UC{}return e.\u0275fac=function(){let t;return function(r){return(t||(t=ze(e)))(r||e)}}(),e.\u0275dir=V({type:e,features:[oe]}),e})();const pn=new R("NgValueAccessor"),VP={provide:pn,useExisting:ue(()=>Sr),multi:!0},BP=new R("CompositionEventMode");let Sr=(()=>{class e extends UC{constructor(n,r,o){super(n,r),this._compositionMode=o,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function jP(){const e=ln()?ln().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}writeValue(n){this.setProperty("value",n??"")}_handleInput(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)}_compositionStart(){this._composing=!0}_compositionEnd(n){this._composing=!1,this._compositionMode&&this.onChange(n)}}return e.\u0275fac=function(n){return new(n||e)(D(bn),D(Ct),D(BP,8))},e.\u0275dir=V({type:e,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(n,r){1&n&&te("input",function(i){return r._handleInput(i.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(i){return r._compositionEnd(i.target.value)})},features:[ae([VP]),oe]}),e})();function Jn(e){return null==e||("string"==typeof e||Array.isArray(e))&&0===e.length}const Qe=new R("NgValidators"),Xn=new R("NgAsyncValidators");function WC(e){return Jn(e.value)?{required:!0}:null}function ll(e){return null}function JC(e){return null!=e}function XC(e){return gi(e)?Me(e):e}function ew(e){let t={};return e.forEach(n=>{t=null!=n?{...t,...n}:t}),0===Object.keys(t).length?null:t}function tw(e,t){return t.map(n=>n(e))}function nw(e){return e.map(t=>function HP(e){return!e.validate}(t)?t:n=>t.validate(n))}function Af(e){return null!=e?function rw(e){if(!e)return null;const t=e.filter(JC);return 0==t.length?null:function(n){return ew(tw(n,t))}}(nw(e)):null}function Tf(e){return null!=e?function ow(e){if(!e)return null;const t=e.filter(JC);return 0==t.length?null:function(n){return function kP(...e){const t=bh(e),{args:n,keys:r}=uD(e),o=new Ce(i=>{const{length:s}=n;if(!s)return void i.complete();const a=new Array(s);let l=s,u=s;for(let c=0;c{d||(d=!0,u--),a[c]=f},()=>l--,void 0,()=>{(!l||!d)&&(u||i.next(r?dD(r,a):a),i.complete())}))}});return t?o.pipe(cD(t)):o}(tw(n,t).map(XC)).pipe(q(ew))}}(nw(e)):null}function iw(e,t){return null===e?[t]:Array.isArray(e)?[...e,t]:[e,t]}function xf(e){return e?Array.isArray(e)?e:[e]:[]}function ul(e,t){return Array.isArray(e)?e.includes(t):e===t}function lw(e,t){const n=xf(t);return xf(e).forEach(o=>{ul(n,o)||n.push(o)}),n}function uw(e,t){return xf(t).filter(n=>!ul(e,n))}class cw{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(t){this._rawValidators=t||[],this._composedValidatorFn=Af(this._rawValidators)}_setAsyncValidators(t){this._rawAsyncValidators=t||[],this._composedAsyncValidatorFn=Tf(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(t){this._onDestroyCallbacks.push(t)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(t=>t()),this._onDestroyCallbacks=[]}reset(t){this.control&&this.control.reset(t)}hasError(t,n){return!!this.control&&this.control.hasError(t,n)}getError(t,n){return this.control?this.control.getError(t,n):null}}class it extends cw{get formDirective(){return null}get path(){return null}}class er extends cw{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class dw{constructor(t){this._cd=t}get isTouched(){return!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return!!this._cd?.submitted}}let Qi=(()=>{class e extends dw{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(D(er,2))},e.\u0275dir=V({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(n,r){2&n&&ea("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},features:[oe]}),e})(),Yi=(()=>{class e extends dw{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(D(it,10))},e.\u0275dir=V({type:e,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(n,r){2&n&&ea("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)("ng-submitted",r.isSubmitted)},features:[oe]}),e})();const Ji="VALID",dl="INVALID",Ao="PENDING",Xi="DISABLED";function Of(e){return(fl(e)?e.validators:e)||null}function hw(e){return Array.isArray(e)?Af(e):e||null}function Pf(e,t){return(fl(t)?t.asyncValidators:e)||null}function pw(e){return Array.isArray(e)?Tf(e):e||null}function fl(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class yw{constructor(t,n){this._pendingDirty=!1,this._hasOwnPendingAsyncValidator=!1,this._pendingTouched=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=t,this._rawAsyncValidators=n,this._composedValidatorFn=hw(this._rawValidators),this._composedAsyncValidatorFn=pw(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn}set validator(t){this._rawValidators=this._composedValidatorFn=t}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(t){this._rawAsyncValidators=this._composedAsyncValidatorFn=t}get parent(){return this._parent}get valid(){return this.status===Ji}get invalid(){return this.status===dl}get pending(){return this.status==Ao}get disabled(){return this.status===Xi}get enabled(){return this.status!==Xi}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(t){this._rawValidators=t,this._composedValidatorFn=hw(t)}setAsyncValidators(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=pw(t)}addValidators(t){this.setValidators(lw(t,this._rawValidators))}addAsyncValidators(t){this.setAsyncValidators(lw(t,this._rawAsyncValidators))}removeValidators(t){this.setValidators(uw(t,this._rawValidators))}removeAsyncValidators(t){this.setAsyncValidators(uw(t,this._rawAsyncValidators))}hasValidator(t){return ul(this._rawValidators,t)}hasAsyncValidator(t){return ul(this._rawAsyncValidators,t)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(t={}){this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(t=>t.markAllAsTouched())}markAsUntouched(t={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}markAsDirty(t={}){this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)}markAsPristine(t={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(n=>{n.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}markAsPending(t={}){this.status=Ao,!1!==t.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!t.onlySelf&&this._parent.markAsPending(t)}disable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=Xi,this.errors=null,this._forEachChild(r=>{r.disable({...t,onlySelf:!0})}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors({...t,skipPristineCheck:n}),this._onDisabledChange.forEach(r=>r(!0))}enable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=Ji,this._forEachChild(r=>{r.enable({...t,onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors({...t,skipPristineCheck:n}),this._onDisabledChange.forEach(r=>r(!1))}_updateAncestors(t){this._parent&&!t.onlySelf&&(this._parent.updateValueAndValidity(t),t.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(t){this._parent=t}getRawValue(){return this.value}updateValueAndValidity(t={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Ji||this.status===Ao)&&this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)}_updateTreeValidity(t={emitEvent:!0}){this._forEachChild(n=>n._updateTreeValidity(t)),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?Xi:Ji}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(t){if(this.asyncValidator){this.status=Ao,this._hasOwnPendingAsyncValidator=!0;const n=XC(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(r=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(r,{emitEvent:t})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(t,n={}){this.errors=t,this._updateControlsErrors(!1!==n.emitEvent)}get(t){let n=t;return null==n||(Array.isArray(n)||(n=n.split(".")),0===n.length)?null:n.reduce((r,o)=>r&&r._find(o),this)}getError(t,n){const r=n?this.get(n):this;return r&&r.errors?r.errors[t]:null}hasError(t,n){return!!this.getError(t,n)}get root(){let t=this;for(;t._parent;)t=t._parent;return t}_updateControlsErrors(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)}_initObservables(){this.valueChanges=new ye,this.statusChanges=new ye}_calculateStatus(){return this._allControlsDisabled()?Xi:this.errors?dl:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Ao)?Ao:this._anyControlsHaveStatus(dl)?dl:Ji}_anyControlsHaveStatus(t){return this._anyControls(n=>n.status===t)}_anyControlsDirty(){return this._anyControls(t=>t.dirty)}_anyControlsTouched(){return this._anyControls(t=>t.touched)}_updatePristine(t={}){this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}_updateTouched(t={}){this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}_registerOnCollectionChange(t){this._onCollectionChange=t}_setUpdateStrategy(t){fl(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)}_parentMarkedDirty(t){return!t&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}_find(t){return null}}class kf extends yw{constructor(t,n,r){super(Of(n),Pf(r,n)),this.controls=t,this._initObservables(),this._setUpdateStrategy(n),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(t,n){return this.controls[t]?this.controls[t]:(this.controls[t]=n,n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange),n)}addControl(t,n,r={}){this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}removeControl(t,n={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}setControl(t,n,r={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],n&&this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}contains(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled}setValue(t,n={}){(function mw(e,t,n){e._forEachChild((r,o)=>{if(void 0===n[o])throw new w(1002,"")})})(this,0,t),Object.keys(t).forEach(r=>{(function gw(e,t,n){const r=e.controls;if(!(t?Object.keys(r):r).length)throw new w(1e3,"");if(!r[n])throw new w(1001,"")})(this,!0,r),this.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}patchValue(t,n={}){null!=t&&(Object.keys(t).forEach(r=>{const o=this.controls[r];o&&o.patchValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}reset(t={},n={}){this._forEachChild((r,o)=>{r.reset(t[o],{onlySelf:!0,emitEvent:n.emitEvent})}),this._updatePristine(n),this._updateTouched(n),this.updateValueAndValidity(n)}getRawValue(){return this._reduceChildren({},(t,n,r)=>(t[r]=n.getRawValue(),t))}_syncPendingControls(){let t=this._reduceChildren(!1,(n,r)=>!!r._syncPendingControls()||n);return t&&this.updateValueAndValidity({onlySelf:!0}),t}_forEachChild(t){Object.keys(this.controls).forEach(n=>{const r=this.controls[n];r&&t(r,n)})}_setUpControls(){this._forEachChild(t=>{t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(t){for(const[n,r]of Object.entries(this.controls))if(this.contains(n)&&t(r))return!0;return!1}_reduceValue(){return this._reduceChildren({},(n,r,o)=>((r.enabled||this.disabled)&&(n[o]=r.value),n))}_reduceChildren(t,n){let r=t;return this._forEachChild((o,i)=>{r=n(r,o,i)}),r}_allControlsDisabled(){for(const t of Object.keys(this.controls))if(this.controls[t].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(t){return this.controls.hasOwnProperty(t)?this.controls[t]:null}}function es(e,t){Lf(e,t),t.valueAccessor.writeValue(e.value),e.disabled&&t.valueAccessor.setDisabledState?.(!0),function JP(e,t){t.valueAccessor.registerOnChange(n=>{e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&vw(e,t)})}(e,t),function ek(e,t){const n=(r,o)=>{t.valueAccessor.writeValue(r),o&&t.viewToModelUpdate(r)};e.registerOnChange(n),t._registerOnDestroy(()=>{e._unregisterOnChange(n)})}(e,t),function XP(e,t){t.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&vw(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function YP(e,t){if(t.valueAccessor.setDisabledState){const n=r=>{t.valueAccessor.setDisabledState(r)};e.registerOnDisabledChange(n),t._registerOnDestroy(()=>{e._unregisterOnDisabledChange(n)})}}(e,t)}function gl(e,t){e.forEach(n=>{n.registerOnValidatorChange&&n.registerOnValidatorChange(t)})}function Lf(e,t){const n=function sw(e){return e._rawValidators}(e);null!==t.validator?e.setValidators(iw(n,t.validator)):"function"==typeof n&&e.setValidators([n]);const r=function aw(e){return e._rawAsyncValidators}(e);null!==t.asyncValidator?e.setAsyncValidators(iw(r,t.asyncValidator)):"function"==typeof r&&e.setAsyncValidators([r]);const o=()=>e.updateValueAndValidity();gl(t._rawValidators,o),gl(t._rawAsyncValidators,o)}function vw(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}const ik={provide:it,useExisting:ue(()=>Ir)},ts=(()=>Promise.resolve())();let Ir=(()=>{class e extends it{constructor(n,r){super(),this.submitted=!1,this._directives=new Set,this.ngSubmit=new ye,this.form=new kf({},Af(n),Tf(r))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(n){ts.then(()=>{const r=this._findContainer(n.path);n.control=r.registerControl(n.name,n.control),es(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(n)})}getControl(n){return this.form.get(n.path)}removeControl(n){ts.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name),this._directives.delete(n)})}addFormGroup(n){ts.then(()=>{const r=this._findContainer(n.path),o=new kf({});(function _w(e,t){Lf(e,t)})(o,n),r.registerControl(n.name,o),o.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(n){ts.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name)})}getFormGroup(n){return this.form.get(n.path)}updateModel(n,r){ts.then(()=>{this.form.get(n.path).setValue(r)})}setValue(n){this.control.setValue(n)}onSubmit(n){return this.submitted=!0,function Cw(e,t){e._syncPendingControls(),t.forEach(n=>{const r=n.control;"submit"===r.updateOn&&r._pendingChange&&(n.viewToModelUpdate(r._pendingValue),r._pendingChange=!1)})}(this.form,this._directives),this.ngSubmit.emit(n),"dialog"===n?.target?.method}onReset(){this.resetForm()}resetForm(n){this.form.reset(n),this.submitted=!1}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}_findContainer(n){return n.pop(),n.length?this.form.get(n):this.form}}return e.\u0275fac=function(n){return new(n||e)(D(Qe,10),D(Xn,10))},e.\u0275dir=V({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(n,r){1&n&&te("submit",function(i){return r.onSubmit(i)})("reset",function(){return r.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[ae([ik]),oe]}),e})();function ww(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}function bw(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}const Ew=class extends yw{constructor(t=null,n,r){super(Of(n),Pf(r,n)),this.defaultValue=null,this._onChange=[],this._pendingChange=!1,this._applyFormState(t),this._setUpdateStrategy(n),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),fl(n)&&(n.nonNullable||n.initialValueIsDefault)&&(this.defaultValue=bw(t)?t.value:t)}setValue(t,n={}){this.value=this._pendingValue=t,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach(r=>r(this.value,!1!==n.emitViewToModelChange)),this.updateValueAndValidity(n)}patchValue(t,n={}){this.setValue(t,n)}reset(t=this.defaultValue,n={}){this._applyFormState(t),this.markAsPristine(n),this.markAsUntouched(n),this.setValue(this.value,n),this._pendingChange=!1}_updateValue(){}_anyControls(t){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(t){this._onChange.push(t)}_unregisterOnChange(t){ww(this._onChange,t)}registerOnDisabledChange(t){this._onDisabledChange.push(t)}_unregisterOnDisabledChange(t){ww(this._onDisabledChange,t)}_forEachChild(t){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(t){bw(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t}},lk={provide:er,useExisting:ue(()=>To)},Iw=(()=>Promise.resolve())();let To=(()=>{class e extends er{constructor(n,r,o,i,s){super(),this._changeDetectorRef=s,this.control=new Ew,this._registered=!1,this.update=new ye,this._parent=n,this._setValidators(r),this._setAsyncValidators(o),this.valueAccessor=function jf(e,t){if(!t)return null;let n,r,o;return Array.isArray(t),t.forEach(i=>{i.constructor===Sr?n=i:function rk(e){return Object.getPrototypeOf(e.constructor)===Mr}(i)?r=i:o=i}),o||r||n||null}(0,i)}ngOnChanges(n){if(this._checkForErrors(),!this._registered||"name"in n){if(this._registered&&(this._checkName(),this.formDirective)){const r=n.name.previousValue;this.formDirective.removeControl({name:r,path:this._getPath(r)})}this._setUpControl()}"isDisabled"in n&&this._updateDisabled(n),function Vf(e,t){if(!e.hasOwnProperty("model"))return!1;const n=e.model;return!!n.isFirstChange()||!Object.is(t,n.currentValue)}(n,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(n){this.viewModel=n,this.update.emit(n)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){es(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(n){Iw.then(()=>{this.control.setValue(n,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(n){const r=n.isDisabled.currentValue,o=0!==r&&xn(r);Iw.then(()=>{o&&!this.control.disabled?this.control.disable():!o&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(n){return this._parent?function hl(e,t){return[...t.path,e]}(n,this._parent):[n]}}return e.\u0275fac=function(n){return new(n||e)(D(it,9),D(Qe,10),D(Xn,10),D(pn,10),D(ya,8))},e.\u0275dir=V({type:e,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[ae([lk]),oe,mt]}),e})(),yl=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275dir=V({type:e,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),e})(),Tw=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({}),e})();const vk={provide:pn,useExisting:ue(()=>vl),multi:!0};function kw(e,t){return null==e?`${t}`:(t&&"object"==typeof t&&(t="Object"),`${e}: ${t}`.slice(0,50))}let vl=(()=>{class e extends Mr{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(n){this._compareWith=n}writeValue(n){this.value=n;const o=kw(this._getOptionId(n),n);this.setProperty("value",o)}registerOnChange(n){this.onChange=r=>{this.value=this._getOptionValue(r),n(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(n){for(const r of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(r),n))return r;return null}_getOptionValue(n){const r=function _k(e){return e.split(":")[0]}(n);return this._optionMap.has(r)?this._optionMap.get(r):n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=ze(e)))(r||e)}}(),e.\u0275dir=V({type:e,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(n,r){1&n&&te("change",function(i){return r.onChange(i.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},features:[ae([vk]),oe]}),e})(),Lw=(()=>{class e{constructor(n,r,o){this._element=n,this._renderer=r,this._select=o,this._select&&(this.id=this._select._registerOption())}set ngValue(n){null!=this._select&&(this._select._optionMap.set(this.id,n),this._setElementValue(kw(this.id,n)),this._select.writeValue(this._select.value))}set value(n){this._setElementValue(n),this._select&&this._select.writeValue(this._select.value)}_setElementValue(n){this._renderer.setProperty(this._element.nativeElement,"value",n)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return e.\u0275fac=function(n){return new(n||e)(D(Ct),D(bn),D(vl,9))},e.\u0275dir=V({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})();const Dk={provide:pn,useExisting:ue(()=>Hf),multi:!0};function Vw(e,t){return null==e?`${t}`:("string"==typeof t&&(t=`'${t}'`),t&&"object"==typeof t&&(t="Object"),`${e}: ${t}`.slice(0,50))}let Hf=(()=>{class e extends Mr{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(n){this._compareWith=n}writeValue(n){let r;if(this.value=n,Array.isArray(n)){const o=n.map(i=>this._getOptionId(i));r=(i,s)=>{i._setSelected(o.indexOf(s.toString())>-1)}}else r=(o,i)=>{o._setSelected(!1)};this._optionMap.forEach(r)}registerOnChange(n){this.onChange=r=>{const o=[],i=r.selectedOptions;if(void 0!==i){const s=i;for(let a=0;a{class e{constructor(n,r,o){this._element=n,this._renderer=r,this._select=o,this._select&&(this.id=this._select._registerOption(this))}set ngValue(n){null!=this._select&&(this._value=n,this._setElementValue(Vw(this.id,n)),this._select.writeValue(this._select.value))}set value(n){this._select?(this._value=n,this._setElementValue(Vw(this.id,n)),this._select.writeValue(this._select.value)):this._setElementValue(n)}_setElementValue(n){this._renderer.setProperty(this._element.nativeElement,"value",n)}_setSelected(n){this._renderer.setProperty(this._element.nativeElement,"selected",n)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return e.\u0275fac=function(n){return new(n||e)(D(Ct),D(bn),D(Hf,9))},e.\u0275dir=V({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})(),Ar=(()=>{class e{constructor(){this._validator=ll}ngOnChanges(n){if(this.inputName in n){const r=this.normalizeInput(n[this.inputName].currentValue);this._enabled=this.enabled(r),this._validator=this._enabled?this.createValidator(r):ll,this._onChange&&this._onChange()}}validate(n){return this._validator(n)}registerOnValidatorChange(n){this._onChange=n}enabled(n){return null!=n}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275dir=V({type:e,features:[mt]}),e})();const Ek={provide:Qe,useExisting:ue(()=>xo),multi:!0};let xo=(()=>{class e extends Ar{constructor(){super(...arguments),this.inputName="required",this.normalizeInput=xn,this.createValidator=n=>WC}enabled(n){return n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=ze(e)))(r||e)}}(),e.\u0275dir=V({type:e,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(n,r){2&n&&Rt("required",r._enabled?"":null)},inputs:{required:"required"},features:[ae([Ek]),oe]}),e})();const Tk={provide:Qe,useExisting:ue(()=>ns),multi:!0};let ns=(()=>{class e extends Ar{constructor(){super(...arguments),this.inputName="pattern",this.normalizeInput=n=>n,this.createValidator=n=>function YC(e){if(!e)return ll;let t,n;return"string"==typeof e?(n="","^"!==e.charAt(0)&&(n+="^"),n+=e,"$"!==e.charAt(e.length-1)&&(n+="$"),t=new RegExp(n)):(n=e.toString(),t=e),r=>{if(Jn(r.value))return null;const o=r.value;return t.test(o)?null:{pattern:{requiredPattern:n,actualValue:o}}}}(n)}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=ze(e)))(r||e)}}(),e.\u0275dir=V({type:e,selectors:[["","pattern","","formControlName",""],["","pattern","","formControl",""],["","pattern","","ngModel",""]],hostVars:1,hostBindings:function(n,r){2&n&&Rt("pattern",r._enabled?r.pattern:null)},inputs:{pattern:"pattern"},features:[ae([Tk]),oe]}),e})(),xk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({imports:[Tw]}),e})(),Rk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({imports:[xk]}),e})(),Gf=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-spinner"]],decls:12,vars:0,consts:[["width","1.9em","height","1.9em","viewBox","0 0 38 38","xmlns","http://www.w3.org/2000/svg"],["x1","8.042%","y1","0%","x2","65.682%","y2","23.865%","id","a"],["stop-color","#000","stop-opacity","0","offset","0%"],["stop-color","#000","stop-opacity",".631","offset","63.146%"],["stop-color","#000","offset","100%"],["fill","none","fill-rule","evenodd"],["transform","translate(1 1)"],["d","M36 18c0-9.94-8.06-18-18-18","id","Oval-2","stroke","url(#a)","stroke-width","2"],["attributeName","transform","type","rotate","from","0 18 18","to","360 18 18","dur","0.9s","repeatCount","indefinite"],["fill","#fff","cx","36","cy","18","r","1"]],template:function(n,r){1&n&&(_s(),C(0,"svg",0)(1,"defs")(2,"linearGradient",1),Ke(3,"stop",2)(4,"stop",3)(5,"stop",4),E()(),C(6,"g",5)(7,"g",6)(8,"path",7),Ke(9,"animateTransform",8),E(),C(10,"circle",9),Ke(11,"animateTransform",8),E()()()())}}),e})();function Fk(e,t){if(1&e&&(C(0,"div",10),T(1),E()),2&e){const n=ne().$implicit;A(1),Et(" ",n.value.msg," ")}}function Ok(e,t){if(1&e&&(fo(0),he(1,Fk,2,1,"div",9),ho()),2&e){const n=t.$implicit;ne(3);const r=rn(1);A(1),j("ngIf",r.submitted&&n.value.show)}}function Pk(e,t){if(1&e&&(C(0,"div",10),T(1),E()),2&e){const n=ne(3).$implicit;A(1),Et("",n.label," is required")}}function kk(e,t){if(1&e&&(C(0,"div",10),T(1),E()),2&e){const n=ne(3).$implicit;A(1),Et("",n.label," is invalid")}}function Lk(e,t){if(1&e){const n=pr();C(0,"div"),he(1,Pk,2,1,"div",9),he(2,kk,2,1,"div",9),C(3,"input",11,12),te("ngModelChange",function(o){return Bt(n),Ut(ne(2).$implicit.value=o)})("ngModelChange",function(o){return Bt(n),Ut(ne(2).$implicit.onChange(o))}),E()()}if(2&e){const n=rn(4),r=ne(2).$implicit;ne();const o=rn(1);A(1),j("ngIf",o.submitted&&(null==n.errors?null:n.errors.required)),A(1),j("ngIf",o.submitted&&(null==n.errors?null:n.errors.pattern)),A(1),j("type",r.attr.type)("name",r.attr.name)("autocomplete",r.attr.autocomplete)("required",r.attr.required)("ngClass",r.attr.ngClass)("pattern",r.attr.pattern)("ngModel",r.value),Rt("id",r.attr.id)("title",r.attr.title)("placeholder",r.attr.placeholder)}}function Vk(e,t){if(1&e&&(C(0,"div",10),T(1),E()),2&e){const n=ne(3).$implicit;A(1),Et("",n.label," is required")}}function jk(e,t){if(1&e&&(C(0,"option",15),T(1),E()),2&e){const n=t.$implicit;j("value",n.value),A(1),Et(" ",n.label," ")}}function Bk(e,t){if(1&e){const n=pr();C(0,"div"),he(1,Vk,2,1,"div",9),C(2,"select",13,12),te("ngModelChange",function(o){return Bt(n),Ut(ne(2).$implicit.value=o)})("ngModelChange",function(o){return Bt(n),Ut(ne(2).$implicit.onChange(o))}),he(4,jk,2,2,"option",14),E()()}if(2&e){const n=rn(3),r=ne(2).$implicit;ne();const o=rn(1);A(1),j("ngIf",(null==n.errors?null:n.errors.required)&&o.submitted),A(1),j("name",r.attr.name)("required",r.attr.required)("ngClass",r.attr.ngClass)("ngModel",r.value),Rt("id",r.attr.id),A(2),j("ngForOf",r.options)}}function Uk(e,t){if(1&e){const n=pr();C(0,"textarea",16,12),te("ngModelChange",function(o){return Bt(n),Ut(ne(2).$implicit.value=o)}),T(2,"\n "),E()}2&e&&j("ngModel",ne(2).$implicit.value)}function $k(e,t){if(1&e&&(C(0,"label"),T(1),he(2,Ok,2,1,"ng-container",3),function uv(e,t){const n=Q();let r;const o=e+22;n.firstCreatePass?(r=function WT(e,t){if(t)for(let n=t.length-1;n>=0;n--){const r=t[n];if(e===r.name)return r}}(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks||(n.destroyHooks=[])).push(o,r.onDestroy)):r=n.data[o];const i=r.factory||(r.factory=lr(r.type)),s=St(D);try{const a=Ms(!1),l=i();return Ms(a),function kI(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}(n,_(),o,l),l}finally{St(s)}}(3,"keyvalue"),he(4,Lk,5,12,"div",7),he(5,Bk,5,7,"div",7),C(6,"div"),he(7,Uk,3,1,"textarea",8),E()()),2&e){const n=ne().$implicit;A(1),Et(" ",n.label,": "),A(1),j("ngForOf",cv(3,5,n.errors)),A(2),j("ngIf","input"===n.type),A(1),j("ngIf","select"===n.type),A(2),j("ngIf","textarea"===n.type)}}function Hk(e,t){if(1&e&&(fo(0),he(1,$k,8,7,"label",7),ho()),2&e){const n=t.$implicit;A(1),j("ngIf",n.show)}}function Gk(e,t){1&e&&(C(0,"div",17),Ke(1,"app-spinner"),E())}function zk(e,t){1&e&&Ke(0,"p",18),2&e&&j("innerHTML",ne(2).formDes.footnote,dg)}function Wk(e,t){if(1&e){const n=pr();C(0,"form",1,2),te("ngSubmit",function(){Bt(n);const o=rn(1);return Ut(ne().formDes.onSubmit(o))}),he(2,Hk,2,1,"ng-container",3),C(3,"button",4),T(4),E(),he(5,Gk,2,0,"div",5),he(6,zk,1,1,"p",6),E()}if(2&e){const n=ne();j("ngClass",n.formDes.ngClass),A(2),j("ngForOf",n.formDes.fields),A(1),j("ngClass",n.formDes.button.ngClass),A(1),Et(" ",n.formDes.button.label," "),A(1),j("ngIf",n.formDes.button.show),A(1),j("ngIf",n.formDes.footnote)}}let qk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-form"]],inputs:{formDes:"formDes"},decls:1,vars:1,consts:[[3,"ngClass","ngSubmit",4,"ngIf"],[3,"ngClass","ngSubmit"],["formRef","ngForm"],[4,"ngFor","ngForOf"],["type","submit",3,"ngClass"],["class","spinner",4,"ngIf"],["class","footnote",3,"innerHTML",4,"ngIf"],[4,"ngIf"],[3,"ngModel","ngModelChange",4,"ngIf"],["class","footnote-error",4,"ngIf"],[1,"footnote-error"],[3,"type","name","autocomplete","required","ngClass","pattern","ngModel","ngModelChange"],["modelRef","ngModel"],[2,"width","100%",3,"name","required","ngClass","ngModel","ngModelChange"],[3,"value",4,"ngFor","ngForOf"],[3,"value"],[3,"ngModel","ngModelChange"],[1,"spinner"],[1,"footnote",3,"innerHTML"]],template:function(n,r){1&n&&he(0,Wk,7,6,"form",0),2&n&&j("ngIf",r.formDes.show)},dependencies:[x_,Sd,_r,yl,Lw,jw,Sr,vl,Qi,Yi,xo,ns,To,Ir,Gf,k_],styles:[".footnote[_ngcontent-%COMP%]{font-size:.7em;margin:.75em 0 1em}.footnote-error[_ngcontent-%COMP%]{font-size:.7em;color:red;margin:.5em 0}"]}),e})();function Kk(e,t){if(1&e&&(C(0,"table")(1,"thead")(2,"tr")(3,"th"),T(4,"Description"),E(),C(5,"th"),T(6,"Price($)"),E()()(),C(7,"tbody")(8,"tr")(9,"td"),T(10),E(),C(11,"td"),T(12),E()(),C(13,"tr")(14,"td"),T(15),E(),C(16,"td"),T(17),E()()(),C(18,"tfoot")(19,"tr")(20,"td"),T(21,"Total"),E(),C(22,"td"),T(23),E()()()()),2&e){const n=ne(2).$implicit,r=ne();A(10),an(n.title),A(2),an(n.price),A(3),Et("VAT (",r.vat,"%)"),A(2),an(n.price*r.vat/100),A(6),an(r.total)}}function Zk(e,t){if(1&e){const n=pr();C(0,"div")(1,"div",2)(2,"div",3),_s(),C(3,"svg",4),te("click",function(){return Bt(n),Ut(ne(2).prev())}),C(4,"g",5),Ke(5,"path",6),E()()(),tu(),C(6,"div",7),T(7),E(),C(8,"div",3),_s(),C(9,"svg",4),te("click",function(){return Bt(n),Ut(ne(2).next())}),C(10,"g",5),Ke(11,"path",8),E()()()(),tu(),C(12,"div",9),T(13),E(),C(14,"div",10),T(15," PER MONTH "),E(),he(16,Kk,24,5,"table",1),E()}if(2&e){const n=ne().$implicit,r=ne();A(7),an(n.title),A(6),Et("$",n.price,""),A(3),j("ngIf",r.desc.vat.show)}}function Qk(e,t){if(1&e&&(fo(0),he(1,Zk,17,3,"div",1),ho()),2&e){const n=t.$implicit;A(1),j("ngIf",n.show)}}let Kw=(()=>{class e{constructor(){this.currentIndex=new ye,this.total=0,this.index=0}ngOnInit(){let n=0,r=!1;for(let o of this.desc.tires){if(o.show){r=!0;break}n++}r?this.index=n:this.desc.tires[0].show=!0,this.total=this.desc.tires[0].price*(100+this.vat)/100}ngOnChanges(n){this.recalculate()}prev(){this.desc.tires[this.index].show=!1,this.index=(this.index-1+this.desc.tires.length)%this.desc.tires.length,this.desc.tires[this.index].show=!0,this.currentIndex.emit(this.index),this.recalculate()}next(){this.desc.tires[this.index].show=!1,this.index=(this.index+1+this.desc.tires.length)%this.desc.tires.length,this.desc.tires[this.index].show=!0,this.currentIndex.emit(this.index),this.recalculate()}recalculate(){this.total=this.desc.tires[this.index].price*(100+this.vat)/100}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-features"]],inputs:{desc:"desc",vat:"vat"},outputs:{currentIndex:"currentIndex"},features:[mt],decls:1,vars:1,consts:[[4,"ngFor","ngForOf"],[4,"ngIf"],[1,"l-tire-switcher"],[1,"svg-box"],["width","16","height","20","viewBox","0 0 6.4833 7.9377","xmlns","http://www.w3.org/2000/svg",3,"click"],["transform","translate(-93.567 -111.32)"],["d","m99.77 111.76-5.6634 3.5266 5.6579 3.5106","fill","none","stroke","#c8c8c8","stroke-linejoin","round","stroke-width","1.058"],["itemprop","name",1,"switcher-title"],["d","m93.858 111.76 5.6634 3.5266-5.6579 3.5106","fill","none","stroke","#c8c8c8","stroke-linejoin","round","stroke-width","1.058"],["itemprop","price",1,"tire-price"],["itemprop","eligibleDuration",1,"tire-period"]],template:function(n,r){1&n&&he(0,Qk,2,1,"ng-container",0),2&n&&j("ngForOf",r.desc.tires)},dependencies:[Sd,_r],styles:["table[_ngcontent-%COMP%]{width:100%}td[_ngcontent-%COMP%]:first-child, th[_ngcontent-%COMP%]:first-child{text-align:left;width:100%}tfoot[_ngcontent-%COMP%]{font-weight:700}"]}),e})();const Yk=["cardErrorEl"];function Jk(e,t){1&e&&(C(0,"div",17),Ke(1,"app-spinner"),E())}class Xk{constructor(t){this.onSubmitEvent=t,this.usernameField=new Er({label:"Username",attr:new Io({name:"username",required:!0,type:"text",title:"Lowercase alphanumeric characters: min 4, max 8",pattern:"[a-z0-9]{4,8}"})}),this.passwordField=new Er({label:"Password",attr:new VC({name:"password",autocomplete:"new-password"})}),this.confirmPasswordField=new Er({label:"Confirm Password",attr:new VC({name:"confirmPassword",autocomplete:"new-password"}),errors:{mismatch:{msg:"Passwords do not match",show:!1}}}),this.emailField=new Er({label:"Email",attr:new PP({name:"email"})}),this.formDescription={ngClass:"form-2-col",button:{ngClass:"btn btn--primary btn--large",label:"Create Account"},onSubmit:n=>{this.onSubmit(n)},fields:[this.usernameField,this.passwordField,this.confirmPasswordField,this.emailField],footnote:'By creating an account you agree to our Terms and conditions',show:!1}}onSubmit(t){if(t.valid&&!this.formDescription.button.show){if(this.passwordField.value!=this.confirmPasswordField.value)return void(this.confirmPasswordField.errors.mismatch.show=!0);this.onSubmitEvent(t)}}}class eL{constructor(t,n){this.onSubmitEvent=t,this.onBuyerChangeEvent=n,this.buyer=new BC({label:"Customer",attr:new If({name:"buyer",required:!0}),options:[{value:"individual",label:"Private Individual"},{value:"enterprise",label:"Enterprise"}]}),this.region=new BC({label:"Region",show:!1,attr:new If({name:"region",required:!0}),options:[{value:"eu",label:"EU"},{value:"other",label:"Other"}]}),this.enterpriseName=new Er({label:"Enterprise Name",show:!1,attr:new Io({name:"enterprise",type:"text",required:!0})}),this.website=new Er({label:"Website",show:!1,attr:new Io({name:"website",type:"text",required:!0})}),this.vat=new Er({label:"VAT Registration Number",show:!1,attr:new Io({name:"vat",type:"text",required:!0}),errors:{required:{msg:"This field is required",show:!1}}}),this.formDescription={ngClass:"form-2-col",fields:[this.buyer,this.region,this.enterpriseName,this.website,this.vat],onSubmit:r=>{this.onSubmit(r)},button:{ngClass:"btn btn--primary btn--large",label:"To Payment"}},this.buyer.onChange=r=>{this.region.show=!1,this.enterpriseName.show=!1,this.website.show=!1,this.vat.show=!1,"enterprise"==r?(this.region.show=!0,this.region.attr.required=!0,this.enterpriseName.show=!0,this.enterpriseName.attr.required=!0,this.website.show=!0,this.website.attr.required=!0,this.vat.show=!0,this.vat.attr.required=!0,this.onBuyerChangeEvent("enterprise")):(this.region.show=!1,this.region.attr.required=!1,this.enterpriseName.show=!1,this.enterpriseName.attr.required=!1,this.website.show=!1,this.website.attr.required=!1,this.vat.show=!1,this.vat.attr.required=!1,this.onBuyerChangeEvent("individual"))}}onSubmit(t){!t.valid||this.formDescription.button.show||this.onSubmitEvent(t)}}let tL=(()=>{class e{constructor(n,r){this.backend=n,this.route=r,this.submitted={intention:!1,payment:!1},this.formData={userName:"",password:"",email:"",organisation:"",region:""},this.intentionForm=new Xk(o=>{this.onIntention(o)}),this.regionForm=new eL(o=>{this.onRegion(o)},o=>{this.onBuyerChange(o)}),this.intentionResponse={status:-1,clientSecret:"",stripeCustomerId:""},this.featureVat=0,this.featureDesc={vat:{show:!1},tires:[{title:"Latest Updates",price:9,show:!1},{title:"Extended Features",price:15,show:!1}]},this.currentTireIndex=0,this.stripe={card:void 0,paymentEl:void 0,stripe:void 0,elements:void 0,error:""},this.stripeForm={show:!1,button:{show:!1}}}initStripeCardEl(){let n=this.stripe.stripe.elements();this.stripe.card=n.create("card"),this.stripe.card.mount("#card-element"),this.stripe.card.on("change",r=>{let o=this.cardErrorEl.nativeElement;r.error?(o.hidden=!1,o.textContent=r.error.message):(o.textContent="",o.hidden=!0)})}initStripPaymentEl(n){this.stripe.stripe=Stripe("pk_live_eEfW8XjO4oZUPRFaYASLCWqn");let o=this.stripe.stripe.elements({appearance:{theme:"stripe"},clientSecret:n});this.stripe.elements=o;const s=o.create("payment",{layout:"tabs"});this.stripe.paymentEl=s,s.mount("#payment-element")}ngOnInit(){this.intentionForm.formDescription.show=!0,this.stripeForm.show=!1,this.currentTireIndex=Number(this.route.snapshot.queryParams.tire)|this.currentTireIndex,this.featureDesc.tires[this.currentTireIndex].show=!0}onPayment(){this.stripe.stripe.confirmSetup({elements:this.stripe.elements,confirmParams:{return_url:"http://djongomapper.com/djongocs/create-account/create-access"}}).then(n=>{this.stripe.error=n.message})}onCardPayment(){this.stripe.stripe.confirmCardSetup(this.intentionResponse.clientSecret,{payment_method:{card:this.stripe.card,billing_details:{email:this.formData.email}}}).then(n=>this.onStripeResponse(n))}onTireChange(n){this.currentTireIndex=n}onRegion(n){this.regionForm.formDescription.button.show=!0,this.backend.get(Be.createAccount+qi.intention,{userName:this.intentionForm.usernameField.value,email:this.intentionForm.emailField.value}).subscribe(i=>{this.intentionResponse=i,this.initStripPaymentEl(i.clientSecret),this.regionForm.formDescription.show=!1,this.stripeForm.show=!0},i=>{})}onIntention(n){this.intentionForm.formDescription.show=!1,this.regionForm.formDescription.show=!0}onBuyerChange(n){this.featureDesc.vat.show=!0,this.featureVat="enterprise"==n?0:25}onStripeResponse(n){n.error?(alert(n.error.code+"and code"+n.error.message+"and type"+n.error.type),this.submitted.payment=!1):this.backend.post(Be.createAccount+qi.payment,{status:So.OK,userName:this.formData.userName,email:this.formData.email,password:this.formData.password,stripeCustomerId:this.intentionResponse.stripeCustomerId}).subscribe(i=>{i.status===So.OK||alert("Request failed with status: "+So[i.status])})}}return e.\u0275fac=function(n){return new(n||e)(D(hn),D(Yn))},e.\u0275cmp=ht({type:e,selectors:[["app-create-account"]],viewQuery:function(n,r){if(1&n&&mv(Yk,5),2&n){let o;la(o=function ua(){return function cx(e,t){return e[19].queries[t].queryList}(_(),qh())}())&&(r.cardErrorEl=o.first)}},features:[ae(Sf.createAccount)],decls:24,vars:9,consts:[["id","main","role","main"],[1,"splash","page__content"],[1,"h1-title"],[1,"l-tire","l-tire-full"],[1,"tire-col","tire-2-col-full"],[3,"formDes"],[3,"hidden"],["id","payment-form",1,"form-2-col",3,"ngSubmit"],["id","payment-element",1,"card"],["role","alert",1,"card-err",3,"hidden"],["cardErrorEl",""],["id","submit","type","submit",1,"btn","btn--success","btn--large",3,"disabled"],["class","spinner",4,"ngIf"],[1,"footnote"],["href","https://stripe.com/en-se/privacy"],[1,"tire-col","tire-content","tire-2-col-full"],[3,"desc","vat","currentIndex"],[1,"spinner"]],template:function(n,r){1&n&&(C(0,"div",0)(1,"div",1)(2,"h1",2),T(3,"Create Account "),E(),C(4,"div",3)(5,"div",4),Ke(6,"app-form",5)(7,"app-form",5),C(8,"div",6)(9,"form",7),te("ngSubmit",function(){return r.onPayment()}),Ke(10,"div",8),C(11,"div",9,10),T(13),E(),C(14,"button",11),T(15,"Confirm Payment "),E(),he(16,Jk,2,0,"div",12),C(17,"p",13),T(18," By confirming payment you agree to Stripes "),C(19,"a",14),T(20,"Privacy Policy"),E(),T(21," of collecting your card information. Card numbers are encrypted with AES-256. "),E()()()(),C(22,"div",15)(23,"app-features",16),te("currentIndex",function(i){return r.onTireChange(i)}),E()()()()()),2&n&&(A(6),j("formDes",r.intentionForm.formDescription),A(1),j("formDes",r.regionForm.formDescription),A(1),j("hidden",!r.stripeForm.show),A(3),j("hidden",!r.stripe.error),A(2),an(r.stripe.error),A(1),j("disabled",r.stripeForm.button.show),A(2),j("ngIf",r.stripeForm.button.show),A(7),j("desc",r.featureDesc)("vat",r.featureVat))},dependencies:[_r,yl,Yi,Ir,qk,Gf,Kw],styles:[".h1-message[_ngcontent-%COMP%]{margin:3em auto 0}.card[_ngcontent-%COMP%]{background-color:#fff;padding:10px;margin-bottom:.75em}.card-err[_ngcontent-%COMP%]{margin:.5em 0;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,Roboto,Segoe UI,Helvetica Neue,Lucida Grande,Arial,sans-serif;font-size:.75em!important;text-indent:initial;background-color:#f7e5cd;border-radius:4px;box-shadow:0 1px 1px #d67f0540}.message-placeholder[_ngcontent-%COMP%]{height:4em}.footnote[_ngcontent-%COMP%]{font-size:.7em;margin:.75em 0 1em}"]}),e})();var Ro=(()=>{return(e=Ro||(Ro={}))[e.OK=0]="OK",e[e.LOGIN_REQUIRED=1]="LOGIN_REQUIRED",e[e.VALUE_ERR=2]="VALUE_ERR",Ro;var e})();function nL(e,t){if(1&e&&(C(0,"td"),T(1),E()),2&e){const n=ne(2);A(1),Rc("ssh ",n.body.username,"@api.djongomapper.com -p ",n.body.sshPort,"")}}function rL(e,t){1&e&&(C(0,"td"),T(1,""),E())}function oL(e,t){if(1&e){const n=pr();C(0,"table")(1,"thead")(2,"tr")(3,"th"),T(4,"Property"),E(),C(5,"th"),T(6,"Value"),E()()(),C(7,"tbody")(8,"tr")(9,"td"),T(10,"Username"),E(),C(11,"td"),T(12),E()(),C(13,"tr")(14,"td"),T(15,"Base URL"),E(),C(16,"td"),T(17),E()(),C(18,"tr")(19,"td"),T(20,"Status"),E(),C(21,"td"),T(22),E()(),C(23,"tr")(24,"td"),T(25,"SSH Command"),E(),he(26,nL,2,2,"td",2),he(27,rL,2,0,"ng-template",null,3,Dv),E(),C(29,"tr")(30,"td"),T(31,"SSH Public Key"),E(),C(32,"td")(33,"textarea",4),te("ngModelChange",function(o){return Bt(n),Ut(ne().body.sshPublicKey=o)}),T(34," "),E(),C(35,"button",5),te("click",function(){return Bt(n),Ut(ne().onSubmit())}),T(36,"Update"),E()()()()()}if(2&e){const n=rn(28),r=ne();A(12),an(r.body.username),A(5),Et("https://api.djongomapper.com/",r.body.username,""),A(5),an(r.body.state),A(4),j("ngIf",r.body.sshPort&&r.body.sshPublicKey)("ngIfElse",n),A(7),j("ngModel",r.body.sshPublicKey),A(2),j("disabled","setup"!=r.body.state)}}let iL=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.body={username:"",sshPort:0,sshPublicKey:"",state:""},this.show=!1}ngOnInit(){this.backend.get(Be.dashboard).subscribe(n=>{n.status===Ro.LOGIN_REQUIRED?this.router.navigateByUrl(Be.login.slice(0,-1)):(this.show=!0,this.body=n.body)},n=>{this.router.navigateByUrl(Be.login.slice(0,-1))})}onSubmit(){this.backend.post(Be.dashboard,{sshPublicKey:this.body.sshPublicKey}).subscribe(n=>{n.status===Ro.LOGIN_REQUIRED?this.router.navigateByUrl(Be.login.slice(0,-1)):n.status===Ro.VALUE_ERR&&alert("Oops something went wrong. We are working to fix this. Please contact: support@doableware.com")})}}return e.\u0275fac=function(n){return new(n||e)(D(hn),D(Le))},e.\u0275cmp=ht({type:e,selectors:[["app-dashboard"]],features:[ae(Sf.dashboard)],decls:2,vars:1,consts:[[2,"display","flex"],[4,"ngIf"],[4,"ngIf","ngIfElse"],["elseBlock",""],[3,"ngModel","ngModelChange"],[1,"btn","btn--primary","btn--small",3,"disabled","click"]],template:function(n,r){1&n&&(C(0,"div",0),he(1,oL,37,7,"table",1),E()),2&n&&(A(1),j("ngIf",r.show))},dependencies:[_r,Sr,Qi,To],styles:["td[_ngcontent-%COMP%]:first-child, th[_ngcontent-%COMP%]:first-child{padding-left:1em}table[_ngcontent-%COMP%]{margin:3em auto 1em;display:table}"]}),e})();var _l=(()=>{return(e=_l||(_l={}))[e.OK=0]="OK",e[e.DOES_NOT_EXIST=1]="DOES_NOT_EXIST",_l;var e})();function sL(e,t){1&e&&(C(0,"div",14),Ke(1,"app-spinner"),E())}function aL(e,t){1&e&&(C(0,"div",15)(1,"div",16)(2,"p"),T(3,"Username or Password is incorrect."),E(),C(4,"p"),T(5,"Do not have an endpoint yet? "),C(6,"a",17),T(7,"Create an endpoint."),E()()()())}let lL=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.submitted=!1,this.show={loginFail:!1,buttonSpinner:!1},this.formData={userName:"",password:""}}onSubmit(){this.submitted=!0,this.show.buttonSpinner=!0,this.backend.postForm(Be.login,this.formData).subscribe(n=>{this.show.buttonSpinner=!1,n.status===_l.OK?this.router.navigateByUrl(Be.dashboard.slice(0,-1)):(this.show.loginFail=!0,this.submitted=!1)})}}return e.\u0275fac=function(n){return new(n||e)(D(hn),D(Le))},e.\u0275cmp=ht({type:e,selectors:[["app-login"]],decls:22,vars:5,consts:[["id","main","role","main"],[1,"splash","page__content"],[1,"h1-title"],[1,"l-tire"],[1,"tire-2-col"],[1,"form-2-col",3,"ngSubmit"],["formRef","ngForm"],["type","text","name","userName","required","","autocomplete","username","title","Alphanumeric characters: min 4, max 8","pattern","[a-z0-9]{4,8}",3,"ngModel","ngModelChange"],["type","password","name","password","required","","autocomplete","new-password",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn--primary","btn--large",3,"disabled"],["class","spinner",4,"ngIf"],["class","text-center",4,"ngIf"],[1,"tire-2-col","tire-distinct"],["type","button","routerLink","/create-account",1,"btn","btn--primary","btn--large","align-left"],[1,"spinner"],[1,"text-center"],[1,"message","notice--warning"],["href","/djongocs/create-account/"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"div",1)(2,"h1",2),T(3,"MongoDB Django Hosting Server"),E(),C(4,"div",3)(5,"div",4)(6,"form",5,6),te("ngSubmit",function(){return r.onSubmit()}),C(8,"label"),T(9,"Username: "),C(10,"input",7),te("ngModelChange",function(i){return r.formData.userName=i}),E()(),C(11,"label"),T(12,"Password: "),C(13,"input",8),te("ngModelChange",function(i){return r.formData.password=i}),E()(),C(14,"button",9),T(15," Login "),E(),he(16,sL,2,0,"div",10),E(),he(17,aL,8,0,"div",11),E(),C(18,"div",12),Ke(19,"app-features"),C(20,"button",13),T(21," Create Account "),E()()()()()),2&n){const o=rn(7);A(10),j("ngModel",r.formData.userName),A(3),j("ngModel",r.formData.password),A(1),j("disabled",!o.valid||r.submitted),A(2),j("ngIf",r.show.buttonSpinner),A(1),j("ngIf",r.show.loginFail)}},dependencies:[_r,yl,Sr,Qi,Yi,xo,ns,To,Ir,rl,Gf,Kw]}),e})(),uL=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-not-found"]],decls:2,vars:0,consts:[[1,"h1-title"]],template:function(n,r){1&n&&(C(0,"h1",0),T(1,"Oops! The page you are looking for does not exist"),E())}}),e})();var Dl=(()=>{return(e=Dl||(Dl={}))[e.OK=0]="OK",e[e.OTHER=1]="OTHER",Dl;var e})();function cL(e,t){1&e&&(C(0,"div",10)(1,"div",11)(2,"p")(3,"strong"),T(4,"Thank you!"),E(),T(5," Message received. We will get back soon."),E()()())}let dL=(()=>{class e{constructor(n){this.backend=n,this.formData={name:"",organisation:"",email:"",message:""},this.clicked=!1,this.show={messageReceived:!1}}ngOnInit(){}onSubmit(){this.clicked=!0,this.backend.get(Be.contactUs,this.formData).subscribe(n=>{n.status==Dl.OK&&(this.show.messageReceived=!0),console.log(n.status)},n=>{})}}return e.\u0275fac=function(n){return new(n||e)(D(hn))},e.\u0275cmp=ht({type:e,selectors:[["app-contact-us"]],features:[ae(Sf.contactUs)],decls:18,vars:5,consts:[["id","main","role","main"],[1,"splash","page__content"],[1,"h1-title"],["ngNativeValidate","",1,"form-2-col",3,"ngSubmit"],["formRef","ngForm"],["type","text","name","name","required","",3,"ngModel","ngModelChange"],["type","text","name","organisation","required","",3,"ngModel","ngModelChange"],["type","email","name","email","placeholder","name@org.com","required","","autocomplete","email","pattern","\\w+@\\w+\\.\\w+",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn--primary","btn--large",3,"disabled"],["class","text-center",4,"ngIf"],[1,"text-center"],[1,"message","notice--success"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"div",1)(2,"h1",2),T(3,"Contact Us"),E(),C(4,"form",3,4),te("ngSubmit",function(){return r.onSubmit()}),C(6,"label"),T(7,"Name: "),C(8,"input",5),te("ngModelChange",function(i){return r.formData.name=i}),E()(),C(9,"label"),T(10,"Organisation: "),C(11,"input",6),te("ngModelChange",function(i){return r.formData.organisation=i}),E()(),C(12,"label"),T(13,"Email: "),C(14,"input",7),te("ngModelChange",function(i){return r.formData.email=i}),E()(),C(15,"button",8),T(16," Send "),E(),he(17,cL,6,0,"div",9),E()()()),2&n){const o=rn(5);A(8),j("ngModel",r.formData.name),A(3),j("ngModel",r.formData.organisation),A(3),j("ngModel",r.formData.email),A(1),j("disabled",!o.valid||r.show.messageReceived||r.clicked),A(2),j("ngIf",r.show.messageReceived)}},dependencies:[_r,Sr,Qi,Yi,xo,ns,To,Ir]}),e})(),fL=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=ht({type:e,selectors:[["app-create-access"]],decls:4,vars:0,consts:[[1,"h1-title"]],template:function(n,r){1&n&&(C(0,"h1",0),T(1,"OOPS!"),E(),C(2,"p"),T(3,"We encountered a problem while charging your card. You have not been charged!\nWe are working with the payment vendor to fix this. Please contact support@doableware.com for further support"),E())}}),e})();const hL=[{path:Be.createAccount.slice(0,-1),title:"DjongoCS - Create Account",component:tL},{path:Be.createAccount.slice(0,-1)+"/create-access",title:"DjongoCS - Create Account",component:fL},{path:Be.dashboard.slice(0,-1),title:"DjongoCS - Dashboard",component:iL},{path:Be.login.slice(0,-1),title:"DjongoCS - Login",component:lL},{path:Be.contactUs.slice(0,-1),title:"DjongoCS - Contact Us",component:dL},{path:"**",component:uL}];let pL=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e}),e.\u0275inj=ft({imports:[bC.forRoot(hL),bC]}),e})(),gL=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=It({type:e,bootstrap:[DP]}),e.\u0275inj=ft({imports:[ON,Rk,pL,OP]}),e})();(function Qx(){o_=!1})(),FN().bootstrapModule(gL).catch(e=>console.error(e))}},le=>{le(le.s=26)}]); \ No newline at end of file diff --git a/docs/djongocs/polyfills.b35ec1cdf81a1719.js b/docs/djongocs/polyfills.b35ec1cdf81a1719.js new file mode 100644 index 00000000..ce173464 --- /dev/null +++ b/docs/djongocs/polyfills.b35ec1cdf81a1719.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[429],{435:(ie,Ee,de)=>{de(583)},583:()=>{!function(e){const n=e.performance;function i(M){n&&n.mark&&n.mark(M)}function o(M,E){n&&n.measure&&n.measure(M,E)}i("Zone");const c=e.__Zone_symbol_prefix||"__zone_symbol__";function a(M){return c+M}const y=!0===e[a("forceDuplicateZoneCheck")];if(e.Zone){if(y||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}let d=(()=>{class M{constructor(t,r){this._parent=t,this._name=r?r.name||"unnamed":"",this._properties=r&&r.properties||{},this._zoneDelegate=new v(this,this._parent&&this._parent._zoneDelegate,r)}static assertZonePatched(){if(e.Promise!==oe.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let t=M.current;for(;t.parent;)t=t.parent;return t}static get current(){return U.zone}static get currentTask(){return re}static __load_patch(t,r,k=!1){if(oe.hasOwnProperty(t)){if(!k&&y)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const C="Zone:"+t;i(C),oe[t]=r(e,M,z),o(C,C)}}get parent(){return this._parent}get name(){return this._name}get(t){const r=this.getZoneWith(t);if(r)return r._properties[t]}getZoneWith(t){let r=this;for(;r;){if(r._properties.hasOwnProperty(t))return r;r=r._parent}return null}fork(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)}wrap(t,r){if("function"!=typeof t)throw new Error("Expecting function got: "+t);const k=this._zoneDelegate.intercept(this,t,r),C=this;return function(){return C.runGuarded(k,this,arguments,r)}}run(t,r,k,C){U={parent:U,zone:this};try{return this._zoneDelegate.invoke(this,t,r,k,C)}finally{U=U.parent}}runGuarded(t,r=null,k,C){U={parent:U,zone:this};try{try{return this._zoneDelegate.invoke(this,t,r,k,C)}catch($){if(this._zoneDelegate.handleError(this,$))throw $}}finally{U=U.parent}}runTask(t,r,k){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||K).name+"; Execution: "+this.name+")");if(t.state===x&&(t.type===Q||t.type===w))return;const C=t.state!=p;C&&t._transitionTo(p,j),t.runCount++;const $=re;re=t,U={parent:U,zone:this};try{t.type==w&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,r,k)}catch(l){if(this._zoneDelegate.handleError(this,l))throw l}}finally{t.state!==x&&t.state!==h&&(t.type==Q||t.data&&t.data.isPeriodic?C&&t._transitionTo(j,p):(t.runCount=0,this._updateTaskCount(t,-1),C&&t._transitionTo(x,p,x))),U=U.parent,re=$}}scheduleTask(t){if(t.zone&&t.zone!==this){let k=this;for(;k;){if(k===t.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${t.zone.name}`);k=k.parent}}t._transitionTo(X,x);const r=[];t._zoneDelegates=r,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(k){throw t._transitionTo(h,X,x),this._zoneDelegate.handleError(this,k),k}return t._zoneDelegates===r&&this._updateTaskCount(t,1),t.state==X&&t._transitionTo(j,X),t}scheduleMicroTask(t,r,k,C){return this.scheduleTask(new m(I,t,r,k,C,void 0))}scheduleMacroTask(t,r,k,C,$){return this.scheduleTask(new m(w,t,r,k,C,$))}scheduleEventTask(t,r,k,C,$){return this.scheduleTask(new m(Q,t,r,k,C,$))}cancelTask(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||K).name+"; Execution: "+this.name+")");t._transitionTo(G,j,p);try{this._zoneDelegate.cancelTask(this,t)}catch(r){throw t._transitionTo(h,G),this._zoneDelegate.handleError(this,r),r}return this._updateTaskCount(t,-1),t._transitionTo(x,G),t.runCount=0,t}_updateTaskCount(t,r){const k=t._zoneDelegates;-1==r&&(t._zoneDelegates=null);for(let C=0;CM.hasTask(t,r),onScheduleTask:(M,E,t,r)=>M.scheduleTask(t,r),onInvokeTask:(M,E,t,r,k,C)=>M.invokeTask(t,r,k,C),onCancelTask:(M,E,t,r)=>M.cancelTask(t,r)};class v{constructor(E,t,r){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=E,this._parentDelegate=t,this._forkZS=r&&(r&&r.onFork?r:t._forkZS),this._forkDlgt=r&&(r.onFork?t:t._forkDlgt),this._forkCurrZone=r&&(r.onFork?this.zone:t._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:t._interceptZS),this._interceptDlgt=r&&(r.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:t._invokeZS),this._invokeDlgt=r&&(r.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:t._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:t._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:t._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:t._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const k=r&&r.onHasTask;(k||t&&t._hasTaskZS)&&(this._hasTaskZS=k?r:P,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=E,r.onScheduleTask||(this._scheduleTaskZS=P,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),r.onInvokeTask||(this._invokeTaskZS=P,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),r.onCancelTask||(this._cancelTaskZS=P,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(E,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,E,t):new d(E,t)}intercept(E,t,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,E,t,r):t}invoke(E,t,r,k,C){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,E,t,r,k,C):t.apply(r,k)}handleError(E,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,E,t)}scheduleTask(E,t){let r=t;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,E,t),r||(r=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=I)throw new Error("Task is missing scheduleFn.");R(t)}return r}invokeTask(E,t,r,k){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,E,t,r,k):t.callback.apply(r,k)}cancelTask(E,t){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,E,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");r=t.cancelFn(t)}return r}hasTask(E,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,E,t)}catch(r){this.handleError(E,r)}}_updateTaskCount(E,t){const r=this._taskCounts,k=r[E],C=r[E]=k+t;if(C<0)throw new Error("More tasks executed then were scheduled.");0!=k&&0!=C||this.hasTask(this.zone,{microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:E})}}class m{constructor(E,t,r,k,C,$){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=E,this.source=t,this.data=k,this.scheduleFn=C,this.cancelFn=$,!r)throw new Error("callback is not defined");this.callback=r;const l=this;this.invoke=E===Q&&k&&k.useG?m.invokeTask:function(){return m.invokeTask.call(e,l,this,arguments)}}static invokeTask(E,t,r){E||(E=this),ee++;try{return E.runCount++,E.zone.runTask(E,t,r)}finally{1==ee&&_(),ee--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(x,X)}_transitionTo(E,t,r){if(this._state!==t&&this._state!==r)throw new Error(`${this.type} '${this.source}': can not transition to '${E}', expecting state '${t}'${r?" or '"+r+"'":""}, was '${this._state}'.`);this._state=E,E==x&&(this._zoneDelegates=null)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const L=a("setTimeout"),Z=a("Promise"),N=a("then");let J,B=[],H=!1;function q(M){if(J||e[Z]&&(J=e[Z].resolve(0)),J){let E=J[N];E||(E=J.then),E.call(J,M)}else e[L](M,0)}function R(M){0===ee&&0===B.length&&q(_),M&&B.push(M)}function _(){if(!H){for(H=!0;B.length;){const M=B;B=[];for(let E=0;EU,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:R,showUncaughtError:()=>!d[a("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:q};let U={parent:null,zone:new d(null,null)},re=null,ee=0;function W(){}o("Zone","Zone"),e.Zone=d}(typeof window<"u"&&window||typeof self<"u"&&self||global);const ie=Object.getOwnPropertyDescriptor,Ee=Object.defineProperty,de=Object.getPrototypeOf,ge=Object.create,Ve=Array.prototype.slice,Oe="addEventListener",Se="removeEventListener",Ze=Zone.__symbol__(Oe),Ne=Zone.__symbol__(Se),ce="true",ae="false",ke=Zone.__symbol__("");function Ie(e,n){return Zone.current.wrap(e,n)}function Me(e,n,i,o,c){return Zone.current.scheduleMacroTask(e,n,i,o,c)}const A=Zone.__symbol__,Pe=typeof window<"u",Te=Pe?window:void 0,Y=Pe&&Te||"object"==typeof self&&self||global;function Le(e,n){for(let i=e.length-1;i>=0;i--)"function"==typeof e[i]&&(e[i]=Ie(e[i],n+"_"+i));return e}function Fe(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&typeof e.set>"u")}const Be=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,we=!("nw"in Y)&&typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process),je=!we&&!Be&&!(!Pe||!Te.HTMLElement),Ue=typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process)&&!Be&&!(!Pe||!Te.HTMLElement),Re={},We=function(e){if(!(e=e||Y.event))return;let n=Re[e.type];n||(n=Re[e.type]=A("ON_PROPERTY"+e.type));const i=this||e.target||Y,o=i[n];let c;if(je&&i===Te&&"error"===e.type){const a=e;c=o&&o.call(this,a.message,a.filename,a.lineno,a.colno,a.error),!0===c&&e.preventDefault()}else c=o&&o.apply(this,arguments),null!=c&&!c&&e.preventDefault();return c};function qe(e,n,i){let o=ie(e,n);if(!o&&i&&ie(i,n)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const c=A("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete o.writable,delete o.value;const a=o.get,y=o.set,d=n.slice(2);let P=Re[d];P||(P=Re[d]=A("ON_PROPERTY"+d)),o.set=function(v){let m=this;!m&&e===Y&&(m=Y),m&&("function"==typeof m[P]&&m.removeEventListener(d,We),y&&y.call(m,null),m[P]=v,"function"==typeof v&&m.addEventListener(d,We,!1))},o.get=function(){let v=this;if(!v&&e===Y&&(v=Y),!v)return null;const m=v[P];if(m)return m;if(a){let L=a.call(this);if(L)return o.set.call(this,L),"function"==typeof v.removeAttribute&&v.removeAttribute(n),L}return null},Ee(e,n,o),e[c]=!0}function Xe(e,n,i){if(n)for(let o=0;ofunction(y,d){const P=i(y,d);return P.cbIdx>=0&&"function"==typeof d[P.cbIdx]?Me(P.name,d[P.cbIdx],P,c):a.apply(y,d)})}function ue(e,n){e[A("OriginalDelegate")]=n}let ze=!1,Ae=!1;function ft(){if(ze)return Ae;ze=!0;try{const e=Te.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(Ae=!0)}catch{}return Ae}Zone.__load_patch("ZoneAwarePromise",(e,n,i)=>{const o=Object.getOwnPropertyDescriptor,c=Object.defineProperty,y=i.symbol,d=[],P=!0===e[y("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],v=y("Promise"),m=y("then");i.onUnhandledError=l=>{if(i.showUncaughtError()){const u=l&&l.rejection;u?console.error("Unhandled Promise rejection:",u instanceof Error?u.message:u,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",u,u instanceof Error?u.stack:void 0):console.error(l)}},i.microtaskDrainDone=()=>{for(;d.length;){const l=d.shift();try{l.zone.runGuarded(()=>{throw l.throwOriginal?l.rejection:l})}catch(u){N(u)}}};const Z=y("unhandledPromiseRejectionHandler");function N(l){i.onUnhandledError(l);try{const u=n[Z];"function"==typeof u&&u.call(this,l)}catch{}}function B(l){return l&&l.then}function H(l){return l}function J(l){return t.reject(l)}const q=y("state"),R=y("value"),_=y("finally"),K=y("parentPromiseValue"),x=y("parentPromiseState"),j=null,p=!0,G=!1;function I(l,u){return s=>{try{z(l,u,s)}catch(f){z(l,!1,f)}}}const w=function(){let l=!1;return function(s){return function(){l||(l=!0,s.apply(null,arguments))}}},oe=y("currentTaskTrace");function z(l,u,s){const f=w();if(l===s)throw new TypeError("Promise resolved with itself");if(l[q]===j){let g=null;try{("object"==typeof s||"function"==typeof s)&&(g=s&&s.then)}catch(b){return f(()=>{z(l,!1,b)})(),l}if(u!==G&&s instanceof t&&s.hasOwnProperty(q)&&s.hasOwnProperty(R)&&s[q]!==j)re(s),z(l,s[q],s[R]);else if(u!==G&&"function"==typeof g)try{g.call(s,f(I(l,u)),f(I(l,!1)))}catch(b){f(()=>{z(l,!1,b)})()}else{l[q]=u;const b=l[R];if(l[R]=s,l[_]===_&&u===p&&(l[q]=l[x],l[R]=l[K]),u===G&&s instanceof Error){const T=n.currentTask&&n.currentTask.data&&n.currentTask.data.__creationTrace__;T&&c(s,oe,{configurable:!0,enumerable:!1,writable:!0,value:T})}for(let T=0;T{try{const D=l[R],O=!!s&&_===s[_];O&&(s[K]=D,s[x]=b);const S=u.run(T,void 0,O&&T!==J&&T!==H?[]:[D]);z(s,!0,S)}catch(D){z(s,!1,D)}},s)}const M=function(){},E=e.AggregateError;class t{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(u){return z(new this(null),p,u)}static reject(u){return z(new this(null),G,u)}static any(u){if(!u||"function"!=typeof u[Symbol.iterator])return Promise.reject(new E([],"All promises were rejected"));const s=[];let f=0;try{for(let T of u)f++,s.push(t.resolve(T))}catch{return Promise.reject(new E([],"All promises were rejected"))}if(0===f)return Promise.reject(new E([],"All promises were rejected"));let g=!1;const b=[];return new t((T,D)=>{for(let O=0;O{g||(g=!0,T(S))},S=>{b.push(S),f--,0===f&&(g=!0,D(new E(b,"All promises were rejected")))})})}static race(u){let s,f,g=new this((D,O)=>{s=D,f=O});function b(D){s(D)}function T(D){f(D)}for(let D of u)B(D)||(D=this.resolve(D)),D.then(b,T);return g}static all(u){return t.allWithCallback(u)}static allSettled(u){return(this&&this.prototype instanceof t?this:t).allWithCallback(u,{thenCallback:f=>({status:"fulfilled",value:f}),errorCallback:f=>({status:"rejected",reason:f})})}static allWithCallback(u,s){let f,g,b=new this((S,V)=>{f=S,g=V}),T=2,D=0;const O=[];for(let S of u){B(S)||(S=this.resolve(S));const V=D;try{S.then(F=>{O[V]=s?s.thenCallback(F):F,T--,0===T&&f(O)},F=>{s?(O[V]=s.errorCallback(F),T--,0===T&&f(O)):g(F)})}catch(F){g(F)}T++,D++}return T-=2,0===T&&f(O),b}constructor(u){const s=this;if(!(s instanceof t))throw new Error("Must be an instanceof Promise.");s[q]=j,s[R]=[];try{const f=w();u&&u(f(I(s,p)),f(I(s,G)))}catch(f){z(s,!1,f)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return t}then(u,s){var f;let g=null===(f=this.constructor)||void 0===f?void 0:f[Symbol.species];(!g||"function"!=typeof g)&&(g=this.constructor||t);const b=new g(M),T=n.current;return this[q]==j?this[R].push(T,b,u,s):ee(this,T,b,u,s),b}catch(u){return this.then(null,u)}finally(u){var s;let f=null===(s=this.constructor)||void 0===s?void 0:s[Symbol.species];(!f||"function"!=typeof f)&&(f=t);const g=new f(M);g[_]=_;const b=n.current;return this[q]==j?this[R].push(b,g,u,u):ee(this,b,g,u,u),g}}t.resolve=t.resolve,t.reject=t.reject,t.race=t.race,t.all=t.all;const r=e[v]=e.Promise;e.Promise=t;const k=y("thenPatched");function C(l){const u=l.prototype,s=o(u,"then");if(s&&(!1===s.writable||!s.configurable))return;const f=u.then;u[m]=f,l.prototype.then=function(g,b){return new t((D,O)=>{f.call(this,D,O)}).then(g,b)},l[k]=!0}return i.patchThen=C,r&&(C(r),le(e,"fetch",l=>function $(l){return function(u,s){let f=l.apply(u,s);if(f instanceof t)return f;let g=f.constructor;return g[k]||C(g),f}}(l))),Promise[n.__symbol__("uncaughtPromiseErrors")]=d,t}),Zone.__load_patch("toString",e=>{const n=Function.prototype.toString,i=A("OriginalDelegate"),o=A("Promise"),c=A("Error"),a=function(){if("function"==typeof this){const v=this[i];if(v)return"function"==typeof v?n.call(v):Object.prototype.toString.call(v);if(this===Promise){const m=e[o];if(m)return n.call(m)}if(this===Error){const m=e[c];if(m)return n.call(m)}}return n.call(this)};a[i]=n,Function.prototype.toString=a;const y=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":y.call(this)}});let ye=!1;if(typeof window<"u")try{const e=Object.defineProperty({},"passive",{get:function(){ye=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch{ye=!1}const ht={useG:!0},te={},Ye={},$e=new RegExp("^"+ke+"(\\w+)(true|false)$"),Ke=A("propagationStopped");function Je(e,n){const i=(n?n(e):e)+ae,o=(n?n(e):e)+ce,c=ke+i,a=ke+o;te[e]={},te[e][ae]=c,te[e][ce]=a}function dt(e,n,i,o){const c=o&&o.add||Oe,a=o&&o.rm||Se,y=o&&o.listeners||"eventListeners",d=o&&o.rmAll||"removeAllListeners",P=A(c),v="."+c+":",Z=function(R,_,K){if(R.isRemoved)return;const x=R.callback;let X;"object"==typeof x&&x.handleEvent&&(R.callback=p=>x.handleEvent(p),R.originalDelegate=x);try{R.invoke(R,_,[K])}catch(p){X=p}const j=R.options;return j&&"object"==typeof j&&j.once&&_[a].call(_,K.type,R.originalDelegate?R.originalDelegate:R.callback,j),X};function N(R,_,K){if(!(_=_||e.event))return;const x=R||_.target||e,X=x[te[_.type][K?ce:ae]];if(X){const j=[];if(1===X.length){const p=Z(X[0],x,_);p&&j.push(p)}else{const p=X.slice();for(let G=0;G{throw G})}}}const B=function(R){return N(this,R,!1)},H=function(R){return N(this,R,!0)};function J(R,_){if(!R)return!1;let K=!0;_&&void 0!==_.useG&&(K=_.useG);const x=_&&_.vh;let X=!0;_&&void 0!==_.chkDup&&(X=_.chkDup);let j=!1;_&&void 0!==_.rt&&(j=_.rt);let p=R;for(;p&&!p.hasOwnProperty(c);)p=de(p);if(!p&&R[c]&&(p=R),!p||p[P])return!1;const G=_&&_.eventNameToString,h={},I=p[P]=p[c],w=p[A(a)]=p[a],Q=p[A(y)]=p[y],oe=p[A(d)]=p[d];let z;function U(s,f){return!ye&&"object"==typeof s&&s?!!s.capture:ye&&f?"boolean"==typeof s?{capture:s,passive:!0}:s?"object"==typeof s&&!1!==s.passive?Object.assign(Object.assign({},s),{passive:!0}):s:{passive:!0}:s}_&&_.prepend&&(z=p[A(_.prepend)]=p[_.prepend]);const t=K?function(s){if(!h.isExisting)return I.call(h.target,h.eventName,h.capture?H:B,h.options)}:function(s){return I.call(h.target,h.eventName,s.invoke,h.options)},r=K?function(s){if(!s.isRemoved){const f=te[s.eventName];let g;f&&(g=f[s.capture?ce:ae]);const b=g&&s.target[g];if(b)for(let T=0;Tfunction(c,a){c[Ke]=!0,o&&o.apply(c,a)})}function Et(e,n,i,o,c){const a=Zone.__symbol__(o);if(n[a])return;const y=n[a]=n[o];n[o]=function(d,P,v){return P&&P.prototype&&c.forEach(function(m){const L=`${i}.${o}::`+m,Z=P.prototype;try{if(Z.hasOwnProperty(m)){const N=e.ObjectGetOwnPropertyDescriptor(Z,m);N&&N.value?(N.value=e.wrapWithCurrentZone(N.value,L),e._redefineProperty(P.prototype,m,N)):Z[m]&&(Z[m]=e.wrapWithCurrentZone(Z[m],L))}else Z[m]&&(Z[m]=e.wrapWithCurrentZone(Z[m],L))}catch{}}),y.call(n,d,P,v)},e.attachOriginToPatched(n[o],y)}function et(e,n,i){if(!i||0===i.length)return n;const o=i.filter(a=>a.target===e);if(!o||0===o.length)return n;const c=o[0].ignoreProperties;return n.filter(a=>-1===c.indexOf(a))}function tt(e,n,i,o){e&&Xe(e,et(e,n,i),o)}function He(e){return Object.getOwnPropertyNames(e).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}Zone.__load_patch("util",(e,n,i)=>{const o=He(e);i.patchOnProperties=Xe,i.patchMethod=le,i.bindArguments=Le,i.patchMacroTask=lt;const c=n.__symbol__("BLACK_LISTED_EVENTS"),a=n.__symbol__("UNPATCHED_EVENTS");e[a]&&(e[c]=e[a]),e[c]&&(n[c]=n[a]=e[c]),i.patchEventPrototype=_t,i.patchEventTarget=dt,i.isIEOrEdge=ft,i.ObjectDefineProperty=Ee,i.ObjectGetOwnPropertyDescriptor=ie,i.ObjectCreate=ge,i.ArraySlice=Ve,i.patchClass=ve,i.wrapWithCurrentZone=Ie,i.filterProperties=et,i.attachOriginToPatched=ue,i._redefineProperty=Object.defineProperty,i.patchCallbacks=Et,i.getGlobalObjects=()=>({globalSources:Ye,zoneSymbolEventNames:te,eventNames:o,isBrowser:je,isMix:Ue,isNode:we,TRUE_STR:ce,FALSE_STR:ae,ZONE_SYMBOL_PREFIX:ke,ADD_EVENT_LISTENER_STR:Oe,REMOVE_EVENT_LISTENER_STR:Se})});const Ce=A("zoneTask");function pe(e,n,i,o){let c=null,a=null;i+=o;const y={};function d(v){const m=v.data;return m.args[0]=function(){return v.invoke.apply(this,arguments)},m.handleId=c.apply(e,m.args),v}function P(v){return a.call(e,v.data.handleId)}c=le(e,n+=o,v=>function(m,L){if("function"==typeof L[0]){const Z={isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?L[1]||0:void 0,args:L},N=L[0];L[0]=function(){try{return N.apply(this,arguments)}finally{Z.isPeriodic||("number"==typeof Z.handleId?delete y[Z.handleId]:Z.handleId&&(Z.handleId[Ce]=null))}};const B=Me(n,L[0],Z,d,P);if(!B)return B;const H=B.data.handleId;return"number"==typeof H?y[H]=B:H&&(H[Ce]=B),H&&H.ref&&H.unref&&"function"==typeof H.ref&&"function"==typeof H.unref&&(B.ref=H.ref.bind(H),B.unref=H.unref.bind(H)),"number"==typeof H||H?H:B}return v.apply(e,L)}),a=le(e,i,v=>function(m,L){const Z=L[0];let N;"number"==typeof Z?N=y[Z]:(N=Z&&Z[Ce],N||(N=Z)),N&&"string"==typeof N.type?"notScheduled"!==N.state&&(N.cancelFn&&N.data.isPeriodic||0===N.runCount)&&("number"==typeof Z?delete y[Z]:Z&&(Z[Ce]=null),N.zone.cancelTask(N)):v.apply(e,L)})}Zone.__load_patch("legacy",e=>{const n=e[Zone.__symbol__("legacyPatch")];n&&n()}),Zone.__load_patch("queueMicrotask",(e,n,i)=>{i.patchMethod(e,"queueMicrotask",o=>function(c,a){n.current.scheduleMicroTask("queueMicrotask",a[0])})}),Zone.__load_patch("timers",e=>{const n="set",i="clear";pe(e,n,i,"Timeout"),pe(e,n,i,"Interval"),pe(e,n,i,"Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{pe(e,"request","cancel","AnimationFrame"),pe(e,"mozRequest","mozCancel","AnimationFrame"),pe(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,n)=>{const i=["alert","prompt","confirm"];for(let o=0;ofunction(P,v){return n.current.run(a,e,v,d)})}),Zone.__load_patch("EventTarget",(e,n,i)=>{(function mt(e,n){n.patchEventPrototype(e,n)})(e,i),function pt(e,n){if(Zone[n.symbol("patchEventTarget")])return;const{eventNames:i,zoneSymbolEventNames:o,TRUE_STR:c,FALSE_STR:a,ZONE_SYMBOL_PREFIX:y}=n.getGlobalObjects();for(let P=0;P{ve("MutationObserver"),ve("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",(e,n,i)=>{ve("IntersectionObserver")}),Zone.__load_patch("FileReader",(e,n,i)=>{ve("FileReader")}),Zone.__load_patch("on_property",(e,n,i)=>{!function Tt(e,n){if(we&&!Ue||Zone[e.symbol("patchEvents")])return;const i=n.__Zone_ignore_on_properties;let o=[];if(je){const c=window;o=o.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const a=function ut(){try{const e=Te.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch{}return!1}()?[{target:c,ignoreProperties:["error"]}]:[];tt(c,He(c),i&&i.concat(a),de(c))}o=o.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c{!function yt(e,n){const{isBrowser:i,isMix:o}=n.getGlobalObjects();(i||o)&&e.customElements&&"customElements"in e&&n.patchCallbacks(n,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,i)}),Zone.__load_patch("XHR",(e,n)=>{!function P(v){const m=v.XMLHttpRequest;if(!m)return;const L=m.prototype;let N=L[Ze],B=L[Ne];if(!N){const h=v.XMLHttpRequestEventTarget;if(h){const I=h.prototype;N=I[Ze],B=I[Ne]}}const H="readystatechange",J="scheduled";function q(h){const I=h.data,w=I.target;w[a]=!1,w[d]=!1;const Q=w[c];N||(N=w[Ze],B=w[Ne]),Q&&B.call(w,H,Q);const oe=w[c]=()=>{if(w.readyState===w.DONE)if(!I.aborted&&w[a]&&h.state===J){const U=w[n.__symbol__("loadfalse")];if(0!==w.status&&U&&U.length>0){const re=h.invoke;h.invoke=function(){const ee=w[n.__symbol__("loadfalse")];for(let W=0;Wfunction(h,I){return h[o]=0==I[2],h[y]=I[1],K.apply(h,I)}),X=A("fetchTaskAborting"),j=A("fetchTaskScheduling"),p=le(L,"send",()=>function(h,I){if(!0===n.current[j]||h[o])return p.apply(h,I);{const w={target:h,url:h[y],isPeriodic:!1,args:I,aborted:!1},Q=Me("XMLHttpRequest.send",R,w,q,_);h&&!0===h[d]&&!w.aborted&&Q.state===J&&Q.invoke()}}),G=le(L,"abort",()=>function(h,I){const w=function Z(h){return h[i]}(h);if(w&&"string"==typeof w.type){if(null==w.cancelFn||w.data&&w.data.aborted)return;w.zone.cancelTask(w)}else if(!0===n.current[X])return G.apply(h,I)})}(e);const i=A("xhrTask"),o=A("xhrSync"),c=A("xhrListener"),a=A("xhrScheduled"),y=A("xhrURL"),d=A("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&function at(e,n){const i=e.constructor.name;for(let o=0;o{const P=function(){return d.apply(this,Le(arguments,i+"."+c))};return ue(P,d),P})(a)}}}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,n)=>{function i(o){return function(c){Qe(e,o).forEach(y=>{const d=e.PromiseRejectionEvent;if(d){const P=new d(o,{promise:c.promise,reason:c.rejection});y.invoke(P)}})}}e.PromiseRejectionEvent&&(n[A("unhandledPromiseRejectionHandler")]=i("unhandledrejection"),n[A("rejectionHandledHandler")]=i("rejectionhandled"))})}},ie=>{ie(ie.s=435)}]); \ No newline at end of file diff --git a/docs/djongocs/products/index.html b/docs/djongocs/products/index.html new file mode 100644 index 00000000..bf525bf3 --- /dev/null +++ b/docs/djongocs/products/index.html @@ -0,0 +1,449 @@ + + + + + + Djongo Products - Deploy a Django MongoDB webserver + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ Latest Updates +
+
+ $9 +
+
+ PER MONTH +
+ + Create Account + +
+
+ +
+
+ Access to the Djongo private repository. +
+
+ +
+
+ Supports the latest version of Django, MongoDB. +
+
+ +
+
+ Important bug fixes. +
+
+
+
+
+ Extended Features +
+
+ $15 +
+
+ PER MONTH +
+ + Create Account + +
+
+ +
+
+ Includes Latest updates. +
+
+ +
+
+ MongoDB transactions. +
+
+ +
+
+ Advanced Fields. +
+
+
+
+
+
+
+
+
+

+ DjongoCS +

+
+
+ postcard +
+
+

+ Unleash the full potential of MongoDB with DjongoCS. +

+

+ Djongo Cloud Server is a preset, ready to use, Django MongoDB webserver instance deployed on Google Cloud platform. +

+

+ The Djongo package on DjongoCS supports the latest versions of Django and MongoDB. +It includes several extended features that unleash the full potential of MongoDB. +

+
+
+
+
+
+
+

+ Djongo Commercial License +

+
+
+ Deploy +

+ Deploy +

+

+ Host closed source applications that use the Djongo package. +

+
+
+ Modify +

+ Modify +

+

+ Modify the djongo source code without requiring to open source your modifications. +

+ + Sample License + +
+
+ Redistribute +

+ Redistribute +

+

+ Include and redistribute the djongo package without having to open source your own code. +

+
+
+
+

+ The + + Djongo commercial license + + gives you the freedom to create Django apps with no restrictions. +

+
+
+
+
+
+

+ Built for Enterprises +

+
+
+ First Access +

+ First Access +

+

+ Djongo packages released to enterprises are compatible with newer versions of Django and MongoDB. +

+
+
+ Support +

+ Support +

+

+ As an enterprise customer, your queries and change requests take top priority. +

+
+
+ Redistribute +

+ Secure +

+

+ Djongo source is open and viewed by hundreds of developers everyday. Reported security vulnerabilities, bugs are rectified and continuously integrated. +

+
+
+
+
+
+
+
+

+ Our flexible pricing and licensing terms are guaranteed to satisfy your organizational needs completely. +

+
+ +
+
+
+
+

+ Flexible Licensing +

+
+
+

+ Perpetual +

+

+ Use current and future versions of the djongo package for commercial purposes perpetually. +

+
+
+

+ Subscription +

+

+ Use the djongo package for commercial purposes for a limited time period. +

+
+
+

+ Fallback +

+

+ Use a specific version of the djongo package for commercial purposes perpetually. +

+
+
+
+
+
+
+

+ Services +

+
+
+

+ Consulting +

+

+ Help on choosing the right database solution for your use-cases. +

+
+
+

+ Migrations +

+

+ We move data from SQL to MongoDB. +

+
+
+

+ App development +

+

+ Build and deploy Django Apps on MongoDB. +

+
+
+ +
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/runtime.671c370191d75fbe.js b/docs/djongocs/runtime.671c370191d75fbe.js new file mode 100644 index 00000000..5fb0e1ea --- /dev/null +++ b/docs/djongocs/runtime.671c370191d75fbe.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,_={},d={};function n(e){var a=d[e];if(void 0!==a)return a.exports;var r=d[e]={exports:{}};return _[e](r,r.exports,n),r.exports}n.m=_,e=[],n.O=(a,r,t,o)=>{if(!r){var c=1/0;for(f=0;f=o)&&Object.keys(n.O).every(i=>n.O[i](r[l]))?r.splice(l--,1):(s=!1,o0&&e[f-1][2]>o;f--)e[f]=e[f-1];e[f]=[r,t,o]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a}),a},n.d=(e,a)=>{for(var r in a)n.o(a,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),(()=>{var e={666:0};n.O.j=t=>0===e[t];var a=(t,o)=>{var l,u,[f,c,s]=o,v=0;if(f.some(h=>0!==e[h])){for(l in c)n.o(c,l)&&(n.m[l]=c[l]);if(s)var b=s(n)}for(t&&t(o);vp,.notice--warning>p{margin:0 0 1em}.spinner{display:inline-block;vertical-align:bottom;margin-left:.5em}label:last-of-type input,textarea{margin-bottom:.75em} diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 00000000..1658e5bc Binary files /dev/null and b/docs/favicon.ico differ diff --git a/docs/google1a570be6734e7664.html b/docs/google1a570be6734e7664.html new file mode 100644 index 00000000..810015ce --- /dev/null +++ b/docs/google1a570be6734e7664.html @@ -0,0 +1 @@ +google-site-verification: google1a570be6734e7664.html \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..fc12bb25 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,834 @@ + + + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ Simplify Query Creation +

+ Autogenerated Queries +

+

+ Writing query documents can get out of control. Djongo does the heavy lifting of creating query documents for you. +

+ + More + +
+
+ Switch DBs instantly +

+ Database Abstraction +

+

+ Switch between MongoDB and other SQL databases. Limit the impact to your Models and business logic. +

+ + More + +
+
+ Security +

+ Security +

+

+ Directly saving raw + + JSON + + into the database is scary. Djongo secures and validates the + + JSON + + document before saving. +

+ + More + +
+
+ Cloud Services +

+ Container Integration +

+

+ Managed DBs, Storage, Kubernetes, Compute and Virtual Private Cloud (VPC) Integration +

+ + More + +
+
+ Rapid Prototyping +

+ Rapid Prototyping +

+

+ Speed up development with schema free models. Enforce protection with evolution. +

+ + More + +
+
+ Web Interface +

+ Web Interface +

+

+ Access and modify MongoDB through the dashboard, CLI or API +

+ + More + +
+
+
+
+
+
+

+ Containers +

+

+ Deploy a frustration free Django MongoDB instance on GCP +

+
+
+ postcard +
+
+

+ Create and deploy a preset Ubuntu, Apache, MongoDB, PostgreSQL and Djongo instance on +Google Cloud Platform. +Choose between shared and dedicated VM instances. +

+

+ Focus on developing the models.py and views.py. Let djongo cloud services automate the rest. +Manage access keys, modify subscription plans, and request support using the dashboard. +

+

+ + Create Account + +

+
+
+
+
+
+
+

+ Djongo Commercial License +

+
+
+ Deploy +

+ Deploy +

+

+ Host closed source applications that use the Djongo package. +

+
+
+ Modify +

+ Modify +

+

+ Modify the djongo source code without requiring to open source your modifications. +

+ + Sample License + +
+
+ Redistribute +

+ Redistribute +

+

+ Include and redistribute the djongo package without having to open source your own code. +

+
+
+
+

+ Our flexible pricing and licensing terms are guaranteed to satisfy your organizational needs completely. +

+
+ +
+
+
+
+

+ Prototyping +

+
+
+ Security +
+
+
+ JSONField +
+
+ Represents documents with no structure, and no validations. +
+
+ EmbeddedField +
+
+ Used to describe the data structure that triggers automatic validations at the application level. +
+
+ Settings.py +
+
+

+ Set enforce_schema to True in settings.py to enable schema checks at the database level. +

+
+
+
+ Lines of code +
+ +
+
+
+
+
+

+ Queries +

+
+
+
+
self.db['entry'].aggregate(
+  [{
+    '$match': {
+      'author_id': {
+        '$ne': None,
+        '$exists': True
+       }
+     }
+    },
+    {
+      '$lookup': {
+        'from': 'author',
+        'localField': 'author_id',
+        'foreignField': 'id',
+        'as': 'author'
+      }
+    },
+    {
+      '$unwind': '$author'
+    },
+    {
+      '$lookup': {
+        'from': 'blog',
+        'localField': 'blog_id',
+        'foreignField': 'id',
+        'as': 'blog'
+      }
+    },
+    {
+      '$unwind': {
+        'path': '$blog',
+        'preserveNullAndEmptyArrays': True
+      }
+    },
+    {
+      '$addFields': {
+        'blog': {
+          '$ifNull': ['$blog', {
+            'id': None,
+            'title': None
+          }]
+        }
+      }
+    },
+    {
+      '$match': {
+        'author.name': {
+          '$eq': 'Paul'
+        }
+      }
+    }, 
+    {
+      '$project': {
+        'id': True,
+        'blog_id': True,
+        'author_id': True,
+        'content': True,
+        'blog.id': True,
+        'blog.title': True
+      }
+    }]
+
+
+
+
+
+
+
qs = Entry.objects.filter(author__name='Paul').select_related('blog')
+
+
+
+
+
+ PyMongo +
+
+
+
+ Djongo +
+
+
+

+ Djongo generates complex, error free, aggregation queries automatically. +

+

+ It takes the query on the top and + + automatically + + generates the pymongo query document as the output. +

+
+
+
+
+
+
+
+

+ Security and Integrity Checks +

+
+
def script_injection(value):
+  if value.find('<script>') != -1:
+    raise ValidationError(_('Script injection in %(value)s'),
+                          params={'value': value})
+
+class Entry(models.Model):
+  homepage = models.URLField(validators=[URLValidator,
+                                         script_injection])
+
+
+

+ Djongo performs + + checks on data fields + + before they are saved to the database. +

+

+ Define + + custom validators + + or use builtin validators to check the data. Validation is triggered prior to writing to the database. +

+

+ Running + + integrity checks + + and field value validators ensures protect from garbage data. +

+
+
+
+
+
+
+
+
+ Latest Updates +
+
+ $9 +
+
+ PER MONTH +
+ + Create Account + +
+
+ +
+
+ Access to the Djongo private repository. +
+
+ +
+
+ Supports the latest version of Django, MongoDB. +
+
+ +
+
+ Important bug fixes. +
+
+
+
+
+ Extended Features +
+
+ $15 +
+
+ PER MONTH +
+ + Create Account + +
+
+ +
+
+ Includes Latest updates. +
+
+ +
+
+ MongoDB transactions. +
+
+ +
+
+ Advanced Fields. +
+
+
+
+
+
+
+
+
+

+ Built for Enterprises +

+
+
+ First Access +

+ First Access +

+

+ Djongo packages released to enterprises are compatible with newer versions of Django and MongoDB. +

+
+
+ Support +

+ Support +

+

+ As an enterprise customer, your queries and change requests take top priority. +

+
+
+ Redistribute +

+ Secure +

+

+ Djongo source is open and viewed by hundreds of developers everyday. Reported security vulnerabilities, bugs are rectified and continuously integrated. +

+
+
+
+
+
+
+

+ Products +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+   + + Djongo + + DjongoCS + + Enterprise +
+   + +   + + + Create Account + + + + More + +
+ Django MongoDB Connector + + + + + + +
+ Virtualized Containers + + + + + + +
+ + Latest Updates + + + + + + + +
+ + Advanced Features + + + + + + + +
+ + Commercial License + + + + + + + +
+ + Services + + + + + + + +
+
+
+
+
+

+ Djongo +

+

+ Djongo + Djongo is a unified approach to database interfacing. It is an extension to the +
+ + Django ORM + + framework but maps python objects to MongoDB documents. + +

+

+ Constructing queries using Djongo is + + much easier + + compared to writing lengthy Pymongo query documents. +Storing raw + + JSON + + emitted by the frontend directly into the database is scary. Djongo ensures that + + only clean data + + gets through. +

+

+ + You no longer + + need to use the shell to inspect your data. By using the + + Admin + + package, you can access and +modify data directly from the browser. + Djongo includes handy UI elements that help represent MongoDB documents on the browser. +

+

+ + Get Started + +

+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/markdown/_support/contact/book-a-debug.md b/docs/markdown/_support/contact/book-a-debug.md new file mode 100644 index 00000000..5b851e48 --- /dev/null +++ b/docs/markdown/_support/contact/book-a-debug.md @@ -0,0 +1,8 @@ +--- +layout: support-contact +--- + +{% include form.html + form=site.data.support.tire_form.default + next="/support/request-success/" + subject="Join Book a Debug" %} \ No newline at end of file diff --git a/docs/markdown/_support/contact/discord-support.md b/docs/markdown/_support/contact/discord-support.md new file mode 100644 index 00000000..c777cfdf --- /dev/null +++ b/docs/markdown/_support/contact/discord-support.md @@ -0,0 +1,8 @@ +--- +layout: support-contact +--- + +{% include form.html + form=site.data.support.tire_form.default + next="/support/payment/discord-support/" + subject="Discord support" %} \ No newline at end of file diff --git a/docs/markdown/_support/djongocs/create-account.md b/docs/markdown/_support/djongocs/create-account.md new file mode 100644 index 00000000..f93fa84b --- /dev/null +++ b/docs/markdown/_support/djongocs/create-account.md @@ -0,0 +1,69 @@ +--- +layout: splash +classes: + - empty-banner + - l-splash +--- + +# Create Account + +{% include form.html + form=site.data.support.forms.webserver + next="/support/payment/webserver/" + subject="webserver Access" %} + + + + + + + +{% include vendors/stripe.html btn_id="button" price_id="price_1HIKphLbyDBUaJVjQylkb7QE" %} \ No newline at end of file diff --git a/docs/markdown/_support/payment/discord-support.md b/docs/markdown/_support/payment/discord-support.md new file mode 100644 index 00000000..d1acf830 --- /dev/null +++ b/docs/markdown/_support/payment/discord-support.md @@ -0,0 +1,9 @@ +--- +title: Djongo Support +layout: splash +classes: + - empty-banner + - l-splash +--- + +{% include feature_page/support/payment.html price_id="price_1I8mqtLbyDBUaJVjs0ZCdbzS" %} diff --git a/docs/markdown/_support/payment/payment-success.md b/docs/markdown/_support/payment/payment-success.md new file mode 100644 index 00000000..7c8700cd --- /dev/null +++ b/docs/markdown/_support/payment/payment-success.md @@ -0,0 +1,4 @@ +--- +title: Sponsor Djongo +layout: splash +--- diff --git a/docs/markdown/_support/payment/server.md b/docs/markdown/_support/payment/server.md new file mode 100644 index 00000000..5ad0d3d3 --- /dev/null +++ b/docs/markdown/_support/payment/server.md @@ -0,0 +1,9 @@ +--- +title: Djongo Support +layout: splash +classes: + - empty-banner + - l-splash +--- + +{% include feature_page/support/payment.html price_id="price_1HIKphLbyDBUaJVjQylkb7QE" %} diff --git a/docs/markdown/_support/request-success.md b/docs/markdown/_support/request-success.md new file mode 100644 index 00000000..2d38135c --- /dev/null +++ b/docs/markdown/_support/request-success.md @@ -0,0 +1,11 @@ +--- +title: Djongo Support +layout: splash +classes: + - empty-banner + - l-splash +--- + +# Great! Your request has been recorded + +### We will get back to you soon diff --git a/docs/markdown/_support/support.md b/docs/markdown/_support/support.md new file mode 100644 index 00000000..b6ca0b90 --- /dev/null +++ b/docs/markdown/_support/support.md @@ -0,0 +1,60 @@ +--- +title: Support +layout: splash +tagline: "Create and Deploy a Backend Server" +description: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." +excerpt: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." + +classes: + - l-splash-full + - feature-page + - empty-banner + +redirect_to: /djongocs/create-account/ + +--- + +{% capture head %} + {% include feature_page/support/tire.html %} +{% endcapture%} + +{% capture content %} + {% capture content%} +## Enterprise +If you are an enterprise that uses Djongo for commercial purposes, you need a license to use Djongo. Rights +granted are: + +* Similar to a [MIT](https://opensource.org/licenses/MIT) style license. +* To use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. + +Get **phone, chat, and email support**. Send us a message for more information. +:: +{% include form.html form=site.data.support.forms.enterprise %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} +:: + + {% capture content%} +## Discuss +[Djongo forum](https://groups.google.com/forum/#!forum/djongo) is where you can watch for: + +* New release announcements. +* Suggest improvements. +* Ask questions. +* Discuss topics pertaining to Django and MongoDB. + +Alternatively, send us a message and we will get back to you. +:: +{% include form.html form=site.data.support.forms.discuss %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} + +{% endcapture %} + +{% include feature_page/features.html + content=content + head=head %} \ No newline at end of file diff --git a/docs/markdown/_support/support.md.bak b/docs/markdown/_support/support.md.bak new file mode 100644 index 00000000..a9539e35 --- /dev/null +++ b/docs/markdown/_support/support.md.bak @@ -0,0 +1,65 @@ +--- +title: DjongoCS +permalink: /support/ +layout: splash +tagline: "Create and Deploy a Backend Server" +description: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." +excerpt: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." + +classes: + - l-splash-full + - feature-page + - banner-page + +header: + overlay_image: /assets/images/home/banner-rand-dark-many6.png + overlay_color_dark: #092e20 + overlay_color: #09411f + cta_url: /support/djongocs/create-account/ + cta_label: "Create Account" +--- + +{% capture head %} + {% include feature_page/support/tire.html %} +{% endcapture%} + +{% capture content %} + {% capture content%} +## Enterprise +If you are an enterprise that uses Djongo for commercial purposes, you need a license to use Djongo. Rights +granted are: + +* Similar to a [MIT](https://opensource.org/licenses/MIT) style license. +* To use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. + +Get **phone, chat, and email support**. Send us a message for more information. +:: +{% include form.html form=site.data.support.forms.enterprise %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} +:: + + {% capture content%} +## Discuss +[Djongo forum](https://groups.google.com/forum/#!forum/djongo) is where you can watch for: + +* New release announcements. +* Suggest improvements. +* Ask questions. +* Discuss topics pertaining to Django and MongoDB. + +Alternatively, send us a message and we will get back to you. +:: +{% include form.html form=site.data.support.forms.discuss %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} + +{% endcapture %} + +{% include feature_page/features.html + content=content + head=head %} \ No newline at end of file diff --git a/docs/markdown/documentation/djongo/integrating-django-with-mongodb.md b/docs/markdown/documentation/djongo/integrating-django-with-mongodb.md new file mode 100644 index 00000000..c181adce --- /dev/null +++ b/docs/markdown/documentation/djongo/integrating-django-with-mongodb.md @@ -0,0 +1,156 @@ +--- +title: Django with MongoDB +permalink: /integrating-django-with-mongodb/ +description: "Djongo is an extension to the Django ORM. Use MongoDB as the backend for your Django project, without changing the Django ORM. +Use Django Admin to directly add and modify documents stored in MongoDB. Use other contrib modules such as Auth +and Sessions without any changes. Start using Django with MongoDB by adding just one line of code" +layout: docs +--- + +Use MongoDB as a backend database for your Django project, without changing the Django ORM. Use Django Admin to add and modify documents in MongoDB. Start using Django with MongoDB by adding just one line of code. + + +## How it works +Djongo makes **zero changes** to the existing Django ORM framework, which means unnecessary bugs and security vulnerabilities do not crop up. It simply translates a SQL query string into a [MongoDB query document](https://docs.mongodb.com/manual/tutorial/query-documents/). As a result, all Django features, models, etc., work as is. + +Django contrib modules: + +```python +'django.contrib.admin', +'django.contrib.auth', +'django.contrib.sessions', +``` +and others... fully supported. + +## What you get +Djongo ensures that you: + + * Reuse Django Models/ORM. + * Work with the original Django variant. + * Future proof your code. + * Atomic SQL JOIN operations. + +Get [expert support][support_page] for complex projects. + +## Rapid Prototyping +Djongo lets you rapidly develop and evolve your app models. Modifying your models is **much faster** with Djongo compared to traditional Django ORM. Since MongoDB is a schema-less database, every time you redefine a model, MongoDB does not expect you to redefine the schema. + +### Goodbye Migrations +With Djongo you **permanently say goodbye** to Django Migrations. To enable migration free model evolution simply set `ENFORCE_SCHEMA: False` in your database configuration. Djongo no longer interprets SQL DDL statements (example CREATE TABLE) to emit pymongo `create_collection` commands. With `ENFORCE_SCHEMA: False` collections are created implicitly, on the fly. + +## Use Django Admin to add documents + +The Django Admin interface can be used to work with MongoDB. Additionally, several MongoDB specific features are supported using [EmbeddedField](/using-django-with-mongodb-data-fields/), [ArrayField](/using-django-with-mongodb-array-field/) and other fields. Let’s say you want to create a blogging platform using Django with MongoDB as your backend. In your Blog `app/models.py` file define the `Blog` model: + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True +``` + +Now ‘embed’ your `Blog` inside a `Entry` using the `EmbeddedField`: + +```python +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + + headline = models.CharField(max_length=255) +``` + +Register your `Entry` in `admin.py`: + +```python +from django.contrib import admin +from .models import Entry + +admin.site.register(Entry) +``` + +That’s it you are set! Fire up Django Admin on localhost:8000/admin/ and this is what you get: + + +![Django Admin](/assets/images/admin.png) + + +### Querying Embedded fields + +In the above example, to query all Entries with Blogs which have names that start with *Beatles*, use the following query: + +```python +entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) +``` + +Refer to [Using Django with MongoDB data fields](/using-django-with-mongodb-data-fields/) for more details. + +## Migrating an existing Django app to MongoDB + +When migrating an existing Django app to MongoDB, it is recommended to start a new database on MongoDB. For example, use `myapp-djongo-db` in your `settings.py` file. + +1. Into `settings.py` file of your project, add: + + ```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'myapp-djongo-db', + } + } + ``` + +2. Run `manage.py makemigrations ` followed by `manage.py migrate`. +3. Open Django Admin and you should find all Models defined in your app, showing up in the Admin. +4. While the relevant collections have been created in MongoDB, they have no data inside. +5. Continue by inserting data into the collections manually, or use Django Admin for a GUI. + +## Setting up an existing MongoDB database on Django + +### The internal `__schema__` collection + +There is no concept of an AUTOINCREMENT field in MongoDB. Therefore, Djongo internally creates a `__schema__` collection to track such fields. The `__schema__` collection looks like: + +```python +{ + "_id" : ObjectId("5a5c3c87becdd9fe2fb255a9"), + "name" : "django_migrations", + "auto" : { + "field_names" : [ + "id" + ], + "seq" : NumberInt(14) + } +} +``` +For every collection in the DB that has an autoincrement field, there is a corresponding entry in the `__schema__` collection. Running `manage.py migrate` automatically creates these entries. + +Now there are 2 approaches to setting up your existing data onto MongoDB: + +### Zero risk + +1. Start with a new database name in `settings.py`. +2. If you have not already done so, define your models in the `models.py` file. The model names and model fields have to be exactly the same, as the existing data that you want to setup. +3. Run `manage.py makemigrations ` followed by `manage.py migrate`. +4. Now your empty DB should have a `__schema__` collection, and other collections defined in the `model.py` file. +5. Copy collection data (of your custom models defined in `model.py`) to the new DB. +6. In `__schema__` collection make sure that the `seq` number of your AUTOINCREMENT fields is **set to the latest value**. This should correspond to the document count for each model. For example, if your model has 16 entries (16 documents in the DB), then `seq` should be set as 16. Usually the AUTOINCREMENT field is called `id`. + +However, if you do not want to create a new database (and copy existing data into this new database), you can try this approach: + +### Medium risk + +1. Start with an empty database. You can always delete this later. +2. Same as before. +3. Same as before. +4. Now copy the `__schema__` collection from the new database (from step1) to the existing database. +5. Same as step 6 from before. +6. You can now delete the database created in step 1. + +*You are now done setting up Django with MongoDB. Start using Django with MongoDB, like you would with any other database backend.* + +{% include links %} diff --git a/docs/markdown/documentation/djongo/mongodb-field-reference.md b/docs/markdown/documentation/djongo/mongodb-field-reference.md new file mode 100644 index 00000000..068c416a --- /dev/null +++ b/docs/markdown/documentation/djongo/mongodb-field-reference.md @@ -0,0 +1,32 @@ +--- +title: MongoDB Field Reference +permalink: /mongodb-field-reference/ +layout: docs +--- + +## ObjectIdField + +```python +class ObjectIdField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + +## ListField + +> Note: To be depreciated soon and replaced with a `JSONField` + +```python +class ListField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + + + diff --git a/docs/markdown/documentation/djongo/using-django-with-mongodb-array-field.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-field.md new file mode 100644 index 00000000..a27b77e9 --- /dev/null +++ b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-field.md @@ -0,0 +1,209 @@ +--- +title: Using Djongo Array Model Field +permalink: /using-django-with-mongodb-array-field/ +layout: docs +--- + +## ArrayField + +With Djongo there can be an [array](https://docs.mongodb.com/manual/core/document/#arrays) of embedded documents inside the parent document. You can create an **embed array/list of models inside the parent model** and store it directly into MongoDB. + +```python +class ArrayField(MongoField): + def __init__(self, + model_container: typing.Type[Model], + model_form_class: typing.Type[forms.ModelForm] = None, + model_form_kwargs: dict = None, + *args, **kwargs): +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`model_container` | `models.Model` | The child model class type (not the instance) that this array field will contain. +`model_form_class` | `models.forms.ModelForm` | The child model form class type of the array model. All child models inside the array must be of the same type. Mixing different types of child models inside the embedded array is not supported. +`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. + +### Example + +```python +from djongo import models +from django import forms + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class BlogForm(forms.ModelForm): + class Meta: + model = Blog + fields = ( + 'name', 'tagline' + ) + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + class Meta: + abstract = True + +class AuthorForm(forms.ModelForm): + class Meta: + model = Author + fields = ( + 'name', 'email' + ) + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + + headline = models.CharField(max_length=255) + authors = models.ArrayField( + model_container=Author, + model_form_class=AuthorForm + ) + + objects = models.DjongoManager() +``` +### Creating Array fields + +A Model with an Array field can be created as follows: + +```python +entry = Entry() +entry.authors = [{'name': 'John', 'email': 'john@mail.com'}, + {'name': 'Paul', 'email': 'paul@mail.com'}] +entry.save() +``` + +### Querying Array fields + +Djongo uses a mixture of Django query syntax and MongoDB query syntax. Consider a query to retrieve all entries made by the author *Paul*. Using `ManyToManyField` this requires 2 SQL queries. First selects the `id` for author Paul from the `author` table. Next, a JOIN with `entry_authors` and `entry` gives the corresponding entries. + +With `ArrayField` the query reduces to a single simple query: + +```python +entries = Entry.objects.filter(authors={'name': 'Paul'}) +``` + +Djongo lets you get even more specific with your queries. To query all entries where the *third author is Paul*: + +```python +entries = Entry.objects.filter(authors={'2.name': 'Paul'}) +``` +Note: In MongoDB the first element in the array starts at index 0. + +## Using ArrayField in Django Admin + +The official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) exemplifies 3 models that interact with each other: **Blog, Author and Entry**. This tutorial considers the same 3 models. The `blog`; `ForeignKey` of the `Entry` model was optimized in the [other tutorial](/using-django-with-mongodb-data-fields/), here we optimize the `authors`; `ManyToManyField`. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + + A `ManyToManyField` defines a relation wherein *an entry is made by several authors*. It also defines a relation wherein *an author could have made several entries*. Django handles this internally by **creating another table**, the `entry_authors` table which contains different mappings between `entry_id` and `author_id`. + +Fetching an entry will require 2 SQL queries. The second query will be an expensive JOIN query across `entry_authors` and `authors`. The Model described above will work perfectly well on MongoDB as well, when you use Djongo as the connector. MongoDB however offers much more powerful ways to make such queries. These queries come at the cost of higher disk space utilization. + +As a designer using Djongo, you have the freedom to continue with the above schema. Alternatively, you can define a schema having a trade off on disk space for higher performance. + +Let us redefine the `authors` in the `Entry` models using the `ArrayField`: + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class MetaData(models.Model): + pub_date = models.DateField() + mod_date = models.DateField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + class Meta: + abstract = True + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + class Meta: + abstract = True + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayField( + model_container=Author, + ) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline + +``` + +**Notice** how the `ManyToManyField` is now replaced by the `ArrayField`. To display the Array field in Django Admin, a `Form` for the field must be present. Since the array is made up of abstract `Author` models, the form can be easily created by using a `ModelForm`. If you do not specify a `ModelForm` for your array models in the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. + +![Array-model-field](/assets/images/array-model-field.png) + +> Django Admin reveals multiple neatly nested `Name` and `Email` fields under a single Author label. + +Retrieving an entry from the database will result in **no JOINS and only a single database lookup. It is super fast** + + + + + diff --git a/docs/markdown/documentation/djongo/using-django-with-mongodb-array-reference-field.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-reference-field.md new file mode 100644 index 00000000..8b1fa534 --- /dev/null +++ b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-reference-field.md @@ -0,0 +1,60 @@ +--- +title: Using Djongo Array Reference Field +permalink: /using-django-with-mongodb-array-reference-field/ +layout: docs +--- + +## Array Reference field + +The `ArrayField` stores embedded models within a MongoDB array as embedded documents for each entry. However, if entries contain duplicate embedded documents, using the `ArrayField` would result in unnecessary duplication and increased disk space usage. On the other hand, the Django `ManyToManyField` only refers to a different table of entries. In addition however, it creates an intermediate "through/join" table which records all the mappings. + +The `ArrayReferenceField` is one of the most powerful features of Djongo. The `ArrayReferenceField` is a bargain between the `ArrayField` and `ManyToManyField`. Similar to the `ManyToManyField` a separate collection is used for storing duplicate entries (instead of embedding them as an array). This means there is no data duplication. However, the intermediate "through/join" mapping table is completely skipped! This is achieved by storing only a reference to the entries in the embedded array. + +While the `ManyToManyField` required two queries to fetch data, the `ArrayReferenceField` requires just one query and is much faster. If you have used the `ManyToManyField`, then you know how to use the `ArrayReferenceField`. In fact, **it implements the exact same API** as the `ManyToManyField`. You can replace all existing `ManyToManyField` with `ArrayReferenceField` and everything will continue to work as is. + +In the example the `Entry` Model can be rewritten as follows: + +```python +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + model_form_class=MetaDataForm + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayReferenceField( + to=Author, + on_delete=models.CASCADE, + ) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline + +``` +**Notice** how the `Author` model is no longer set as `abstract`. This means a separate `author` collection will be created in the DB. Simply set the `authors` to a list containing several author instances. When the entry gets saved, only a reference to the primary_key of the author model is saved in the array. Upon retrieving an entry from the DB the corresponding authors are automatically looked up and the author list is populated. + + The `ArrayReferenceField` behaves exactly like the `ManyToManyField`. However, underneath only references to the entries are being stored in the array. + +## ArrayReferenceField + +```python +class ArrayReferenceField(ForeignKey): + def __init__(self, *args, **kwargs): +``` +### Arguments + +Same as the `ForeignKey` Base class \ No newline at end of file diff --git a/docs/markdown/documentation/djongo/using-django-with-mongodb-data-fields.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-data-fields.md new file mode 100644 index 00000000..e682f109 --- /dev/null +++ b/docs/markdown/documentation/djongo/using-django-with-mongodb-data-fields.md @@ -0,0 +1,410 @@ +--- +title: Using Djongo Model fields +permalink: /using-django-with-mongodb-data-fields/ +layout: docs +--- + +## EmbeddedField + +MongoDB allows the creation of an [embedded document](https://docs.mongodb.com/manual/core/data-model-design/#data-modeling-embedding). By using Djongo as your connector, you can embed any other 'model' into your parent model through the `EmbeddedField`. + +```python +class EmbeddedField(MongoField): + def __init__(self, + model_container: typing.Type[Model], + model_form_class: typing.Type[forms.ModelForm] = None, + model_form_kwargs: dict = None, + *args, **kwargs): +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`model_container`| `models.Model` | The child model class type (not instance) that this embedded field will contain. +`model_form_class` | `models.forms.ModelForm` | The child model form class type of the embedded model. +`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry.objects.create( + headline='h1', + blog={ + 'name': 'b1', + 'tagline': 't1' + }) + +g = Entry.objects.get(headline='h1') +assert e == g + +e = Entry() +e.blog = { + 'name': 'b2', + 'tagline': 't2' +} +e.headline = 'h2' +e.save() + +``` + +## Field data integrity checks + +Djongo automatically validates the value assigned to an EmbeddedField. Integrity criteria (`null=True` or `blank=False`) can be applied on the `ÈmbeddedField` or to the internal fields (`CharField`) + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + null=True + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry(headline='h1', blog=None) +e.clean_fields() + +>>> +# No validation error +``` + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + null=False + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry(headline='h1', blog=None) +e.clean_fields() + +>>> + ValidationError({'blog': ['This field cannot be null.']}) +``` + +## Nesting Embedded Fields + +An `EmbeddedField` or `ArrayField` can be nested inside an `EmbeddedField`. There is no limitation on the depth of nesting. + +```python +from djongo import models + +class Tagline(models.Model) + title = models.CharField(max_length=100) + subtitle = models.CharField(max_length=100) + + class Meta: + abstract = True + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.EmbeddedField(model_container=Tagline) + + class Meta: + abstract = True + +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry.objects.create( + headline='h1', + blog={ + 'name': 'b1', + 'tagline': { + 'title': 'Tagline Title' + 'subtitle': 'Tagline Subtitle' + } + }) + +g = Entry.objects.get(headline='h1') +assert e == g + +``` + + +## Embedded Form + +While creating a Form for [the ModelForm](https://docs.djangoproject.com/en/dev/topics/forms/modelforms/), the embedded forms **are automatically generated**. Multiple embedded forms get automatically generated when the Model contains an array of embedded models. However, you can still override this by specifying the `model_form_class` argument in the `EmbeddedField`. + + +```python +from djongo import models +from django import forms + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class BlogForm(forms.ModelForm): + class Meta: + model = Blog + fields = ( + 'name', 'tagline' + ) + + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() +``` + +## Querying Embedded fields + +To query all BlogPost with content made by authors whose name startswith *Beatles* use the following query: + +```python +entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) +``` + +Internally Djongo converts this query (for BlogPost collection) to the form: + +```python +filter = { + 'blog.name': { + '$regex': '^Beatles.*$' + } +} +``` +For querying nested embedded fields provide the appropriate dictionary value + +```python +entries = Entry.objects.filter(blog__startswith={'tagline': {'subtitle': 'Artist'}) +``` +Internally Djongo converts this query (for BlogPost collection) to the form: + +```python +filter = { + 'blog.tagline.subtitle': { + '$regex': '^Artist.*$' + } +} +``` + +## Using EmbeddedField in Django Admin + +Django Admin is a powerful tool for managing data used in an app. When the models use Djongo relational fields, NoSQL "embedded models" can be created directly from Django Admin. **These fields provide better performance when compared with traditional Django relational fields.** + +Django admin can use models to automatically build a site area that can be used to create, view, update, and delete records. This can save a lot of time during development, making it very easy to test the models and get a feel for the right data. Django Admin is already quite well known, but to demonstrate how to use it with Djongo, here is a simple example. + +First define our basic models. In these tutorials, the same example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) is used. The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + +Start with the admin development by *registering* a model. Register the models defined above in the `admin.py` file. + +```python +from django.contrib import admin +from .models import Blog, Author, Entry + +admin.site.register([Blog, Author, Entry]) +``` + +## Data Model + +The `Entry` model defined in the documentation consists of 3 parts: +* 1-to-Many Relationship: A `Blog` is made up of multiple `Entry`s’ and each `Entry` is associated with just *one* `Blog`. The same entry cannot appear in two `Blog`s’ and this defines the 1-to-Many relationship. +* Many-to-Many Relationship: An `Entry` can have *multiple* `Author`s’ and an `Author` can make multiple `Entry`s’. This defines the many-to-many relationship for our data model. +* Normal data columns. + +**An interesting point of note** is that the `Blog` model consists of just 2 fields. Most of the data is stored in the `Entry` model. + +So what happens when a user enters a blog? The user wants to view the ‘Beatles blog’. In the project you could probably do: + +```python +blog = Blog.objects.get(name='Beatles Blog') +``` + +Next, to retrieve all entries related to the Beatles blog, follow it up with: + +```python +entries = Entry.objects.filter(blog_id=blog.id) +``` + +While it is fine to obtain entries in this fashion, you end up **making 2 trips** to the database. For SQL based backend this is not the most efficient way. The number of trips can be reduced to one. Django makes the query more efficient: + +```python +entries = Entry.objects.filter(blog__name='Beatles Blog') +``` + +This query will hit the database just once. All entries associated with a `Blog` having the name ‘Beatles Blog’ will be retrieved. However, this query generates a SQL JOIN. **JOINs are much slower when compared to single table lookups**. + +Since a `Blog` model shares a 1-to-many relationship with `Entry` the `Entry` model can be written as: + +```python +class Entry(models.Model): + blog_name = models.CharField(max_length=100) + blog_tagline = models.TextField() + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + +The `Blog` fields have been inserted into the `Entry` model. With this new data model the query changes to: + +```python +entries = Entry.objects.filter(blog_name='Beatles Blog') +``` + +There are no JOINs generated with this and queries will be much faster. There is data duplication, but only if the backend database does not use data compression. + +Using compression to mitigate data duplication is fine but take a look at the Entry model, it has 10 columns and is getting unmanageable. + +## The Embedded Data Model + +A `Blog` contains a `name` and a `tagline`. An `Entry` contains details of the `Blog`, the `Authors`, `body_text` and some `Meta` data. To make the `Entry` model manageable it can be redefined with an `EmbeddedField`. + +Embedded data models should be used when it does not make sense to store a data set as another table in the database and refer to it every time with a foreign key lookup. However, you still want to group the data set in a hierarchical fashion, to isolate its functionality. + +In case you don't plan on using your embedded model as a standalone model (which means it will always be embedded inside a parent model) you should add the `class Meta` and `abstract = True` This way Djongo will never register this model as an [actual model](https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes). + +It is a good practice to **define embedded models as abstract models** and this is **strongly recommended**. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class MetaData(models.Model): + pub_date = models.DateField() + mod_date = models.DateField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + class Meta: + abstract = True + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline +``` + +To display the embedded models in Django Admin, a `Form` for the embedded fields is required. Since the embedded field is an abstract model, the form is easily created by using a `ModelForm`. The `BlogForm` defines `Blog` as the model with `name` and `tagline` as the form fields. + +If you do not specify a `ModelForm` for your embedded models, and pass it using the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. + +Register the new models in `admin.py`. + +```python +from django.contrib import admin +from .embedded_models import Author, Entry + +admin.site.register([Author, Entry]) +``` + +The number of fields in the `Entry` model is reduce to 6. Fire up Django Admin to check what is up! + +![Django Admin](/assets/images/embedded-admin.png) + +Only the `Entry` and `Author` model are registered. I click on *Entrys Add* and get: + +![Django Admin](/assets/images/embedded-nested.png) + + +> The `Name` and `Tagline` fields are neatly nested within Blog. `Pub date` `Mod date` `N pingbanks` and `Rating` are neatly nested within Meta data. + +When a user queries for a blog named ‘Beatles Blog’, the query for filtering an embedded model changes to: + +```python +entries = Entry.objects.filter(blog={'name': 'Beatles Blog'}) +``` + +This query will return all entries having an embedded blog with the name ‘Beatles Blog’. **The query will hit the database just once and there are no JOINs involved.** + diff --git a/docs/markdown/documentation/djongo/using-django-with-mongodb-gridfs.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-gridfs.md new file mode 100644 index 00000000..2d6503f6 --- /dev/null +++ b/docs/markdown/documentation/djongo/using-django-with-mongodb-gridfs.md @@ -0,0 +1,98 @@ +--- +title: Using GridFSStorage +permalink: /using-django-with-mongodb-gridfs/ +layout: docs +--- + +[GridFS](https://docs.mongodb.com/manual/core/gridfs/) is a specification for storing and retrieving files that exceed the [BSON-document](https://docs.mongodb.com/manual/reference/glossary/#term-bson) [size limit](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) of 16 MB. + +GridFSStorage backend for Djongo aims to add a GridFS storage to upload files to using Django's file fields. + +We first define our basic models. In the tutorials, we use the example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/). The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. + +```python +## models.py +from djongo import models + + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + avatar = models.ImageField(upload_to='authors') + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + featured_image = models.ImageField(upload_to='entries') + + def __str__(self): + return self.headline +``` + +### GridFS Storage + +The `Author` and `Entry` models define a field type `ImageField`. Until now, when you upload files, those files will be uploaded to `MEDIA_ROOT/authors` and `MEDIA_ROOT/entries` directories. + +So, what happens if you want to save those files into database? That is when appears GridFS to the rescue!. + +In your `models.py` file you could probably do: + +```python +## models.py +from django.conf import settings + +# Add the import for GridFSStorage +from djongo.storage import GridFSStorage + + +# Define your GrifFSStorage instance +grid_fs_storage = GridFSStorage(collection='myfiles', base_url=''.join([settings.BASE_URL, 'myfiles/'])) +``` + +In `Author` change `avatar` field definition for this: + +```python +avatar = models.ImageField(upload_to='authors', storage=grid_fs_storage) +``` + +In `Entry` change `avatar` field definition for this: + +```python +featured_image = models.ImageField(upload_to='entries', storage=grid_fs_storage) +``` + +And, that's all, when you upload `avatar` for `Author` it will be saved in collection `myfiles.authors.files` or when you upload `featured_image` for `Entry` it will be saved in collection `myfiles.entries.files` + + +### Retriving values + +Suppose that you have saved some documents in your collection related to Author model, so if you want to retrieve one of them, you could probably do: + +``` +# in a python console +>>> author = Author.object.get(id=1) +>>> print(author) +{ 'id': 1, 'name': 'Lisa Stoner', 'email': 'lisa.stoner@nomail.local', 'avatar': 'http://mysite.local/myfiles/5dc880e06a8e6a7effa592a7'} +``` + +As you can see, the value that is retrieved in `avatar` field is the `_id` related to the saved image|file. In this case you get a url because you probably have in your settings file the following: +```python +UPLOADED_FILES_USE_URL = True +``` \ No newline at end of file diff --git a/docs/markdown/documentation/djongo/using-django-with-other-fields.md b/docs/markdown/documentation/djongo/using-django-with-other-fields.md new file mode 100644 index 00000000..01cf7416 --- /dev/null +++ b/docs/markdown/documentation/djongo/using-django-with-other-fields.md @@ -0,0 +1,49 @@ +--- +title: Other fields +permalink: /using-django-with-other-fields/ +layout: docs +--- + +## The ObjectId Field + +For every document inserted into a collection MongoDB internally creates an [ObjectID](https://docs.mongodb.com/manual/reference/method/ObjectId/) field with the name `_id`. Reference this field from within the Model: + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + ) +``` + +By default the `ObjectIdField` internally sets `primary_key` as `True`. This means the implicitly created `id` AUTOINCREMENT field will not be created. The Field inherits from the `AutoField`. An ObjectID will be automatically generated by MongoDB for every document inserted. + +Consider using the `ObjectIdField` in your models if you want to avoid calling Django migrations every time you create a new model. + +## ObjectIdField + +```python +class ObjectIdField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + +## The List field + +> Note: To be depreciated soon and replaced with a `JSONField` + +`ArrayField` and `ArrayReferenceField` require all Models in the list to be of the same type. MongoDB allows the saving of arbitrary data inside it is embedded array. The `ListField` is useful in such cases. The list field cannot be represented in Django Admin though and can only be used in the python script. + +### ListField + +```python +class ListField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class \ No newline at end of file diff --git a/docs/markdown/documentation/djongoCS/aggregation.md b/docs/markdown/documentation/djongoCS/aggregation.md new file mode 100644 index 00000000..b7d340cd --- /dev/null +++ b/docs/markdown/documentation/djongoCS/aggregation.md @@ -0,0 +1,24 @@ +--- +title: Aggregation +permalink: /aggregation/ +layout: server + +--- + +## Using Aggregation Operators + + + \ No newline at end of file diff --git a/docs/markdown/documentation/djongoCS/creating-django-capped-models-using-mongodb.md b/docs/markdown/documentation/djongoCS/creating-django-capped-models-using-mongodb.md new file mode 100644 index 00000000..12fd9b8a --- /dev/null +++ b/docs/markdown/documentation/djongoCS/creating-django-capped-models-using-mongodb.md @@ -0,0 +1,51 @@ +--- +title: Creating Capped Models using MongoDB +permalink: /creating-django-capped-models-using-mongodb/ +layout: server +--- + +[Capped collections][capped] are fixed-size collections that support high-throughput operations that insert and retrieve documents based on insertion order. Capped collections work in a way similar to circular buffers: once a collection fills its allocated space, it makes room for new documents by overwriting the oldest documents in the collection. + +Djongo lets you define certain Models as 'Capped' Models. The `Entry` Model is a perfect candidate for being stored as a Capped Model. + +```python +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + model_form_class=MetaDataForm + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayReferenceField( + to=Author, + on_delete=models.CASCADE, + ) + n_comments = models.IntegerField() + + class Meta: + capped = True + size = 5242880 + max = 5000 + + def __str__(self): + return self.headline + +``` + +As most SQL DBs do not support capped tables, Django lacks a way to define such tables during a migration. Djongo comes with it is own version of `manage.py` to make this happen. Switch to the root directory of your app and from the command line run: + +``` +python -m djongo.manage migrate +``` + +This will result in all Models having `capped == True` to being recreated as Capped collections. Use this command only if such a collection doesn't already exists or is empty, as `djongo.manage` will drop all collections marked as capped in the model but are not capped in the DB and create a new empty capped collection. + +{{page.notice.not_ready}} + +[capped]: https://docs.mongodb.com/manual/core/capped-collections/ \ No newline at end of file diff --git a/docs/markdown/documentation/djongoCS/database-transactions.md b/docs/markdown/documentation/djongoCS/database-transactions.md new file mode 100644 index 00000000..b2ffc879 --- /dev/null +++ b/docs/markdown/documentation/djongoCS/database-transactions.md @@ -0,0 +1,33 @@ +--- +title: Database Transactions +layout: server +permalink: /database-transactions/ +--- + + +## Transaction and Commit + +Djongo integrates with MongoDB Transactions API to support multi document atomic transactions. [Atomic transactions](https://docs.djangoproject.com/en/3.0/topics/db/transactions/) are enabled in Django using the usual `transaction.atomic()` decorator or context manager. MongoDB transactions significantly speed up Django test execution and validation. + +### Example + +```python +from djongo import transaction + +def viewfunc(request): + stuff() + + with transaction.atomic(): + # This code executes inside a transaction. + more_stuff() +``` + +This produces the following pymongo commands: + +```python +session = cli.start_session() +transaction = session.start_transaction() +# more_stuff +transaction.commit_transaction() # or transaction.abort_transaction() +session.end_session() +``` diff --git a/docs/markdown/documentation/djongoCS/indexes.md b/docs/markdown/documentation/djongoCS/indexes.md new file mode 100644 index 00000000..f356dfba --- /dev/null +++ b/docs/markdown/documentation/djongoCS/indexes.md @@ -0,0 +1,240 @@ +--- +title: Indexes +permalink: /indexes/ +layout: server +--- + +## Compound Index +```python +class CompoundIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None) +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`fields` | `Tuple` or `List` | A tuple of strings containing the fields to be indexed. Adding a '-' before the field name, builds the index in the [descending order](https://docs.djangoproject.com/en/dev/ref/models/indexes/#django.db.models.Index.fields). +`name` | `string` | The index name, if not provided will be autogenerated by MongoDB +`unique` | `boolean` | Used to create [unique indexes](https://docs.mongodb.com/manual/core/index-unique/) +`background` | `boolean` | Create the index in the background. +`partialFilterExpression` | `Q` | Used to create [partial indexes](https://docs.mongodb.com/manual/core/index-partial/). Similar to Django [Index condition](https://docs.djangoproject.com/en/dev/ref/models/indexes/#condition). Takes an instance of [Q](https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Q) to build the filter expression. +`sparse` | `boolean` | Used to create [sparse indexes](https://docs.mongodb.com/manual/core/index-sparse/) +`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + +### Example + +```python +from djongo.models.indexes import CompoundIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + CompoundIndex(fields=['name', '-tagline']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 1, 'tagline': -1 } ) +``` + +## Text Index + +```python +class TextIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + weights=None, + default_language='english', + language_override=None, + textIndexVersion=None) +``` +### Example + +```python +from djongo.models.indexes import TextIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + TextIndex(fields=['name', 'tagline']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 'text', 'tagline': 'text' } ) +``` + +## Wildcard Index + +```python +class WildcardIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + wildcardProjection=None) +``` +### Example + +```python +from djongo.models.indexes import WildcardIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + class Meta: + indexes = [ + WildcardIndex(fields=['blog']) + ] +``` +Generates the pymongo command: + +```python +db.entry.create_index( { 'blog.$**': 1 } ) +``` + +## 2dsphere Index +```python +class TwoDSphereIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + min=None, + max=None) +``` +### Example + +```python +from djongo.models.indexes import TwoDSphereIndex +from djongo import models + +class Location(models.Model): + type = models.CharField(max_length=100) + coordinates = models.ArrayField() + + class Meta: + abstract = True + +class Entry(models.Model): + loc = models.EmbeddedField( + model_container=Location, + ) + class Meta: + indexes = [ + TwoDSphereIndex(fields=['loc']) + ] +``` +Generates the pymongo command: + +```python +db.entry.create_index( { 'loc' : '2dsphere' } ) +``` + +## Hashed Index +```python +class HashedIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None) +``` +### Example + +```python +from djongo.models.indexes import HashedIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + HashedIndex(fields=['name']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 'hashed' } ) +``` + +## TTL Index +```python +class TTLIndex( + field=, + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + expireAfterSeconds=None) +``` +### Example + +```python +from djongo.models.indexes import TTLIndex +from djongo import models + +class Blog(models.Model): + pub_date = models.DateTimeField() + + class Meta: + indexes = [ + TTLIndex(field='pub_date', expireAfterSeconds=3600) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'pub_date': 1 }, expireAfterSeconds=3600 ) +``` + + + diff --git a/docs/markdown/documentation/djongoCS/model-creation.md b/docs/markdown/documentation/djongoCS/model-creation.md new file mode 100644 index 00000000..bed1ad6d --- /dev/null +++ b/docs/markdown/documentation/djongoCS/model-creation.md @@ -0,0 +1,67 @@ +--- +title: Model Creation +layout: server +permalink: /model-creation/ +--- + + +## Schema Validation and CheckConstraint + +Djongo automatically generates schema validation JSON documents for your models providing an extra layer of data validation and checking from within MongoDB. By creating [check constraints](https://docs.djangoproject.com/en/3.0/ref/models/constraints/#checkconstraint) in the Model Meta definition, djongo automatically interprets it to generate a [JSON Schema](https://docs.mongodb.com/manual/core/schema-validation/#json-schema) and a [query expression](https://docs.mongodb.com/manual/core/schema-validation/#other-query-expressions) + +### Example + +```python +from djongo.models import CheckConstraint, Q +from djongo import models +from pymongo.read_concern import ReadConcern + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + author_age = models.IntegerField() + + class Meta: + constraints = [ + CheckConstraint(check=Q(author_age__gte=18), name='age_gte_18') + ] +``` + +## CollectionConstraint and Capped Collections +Djongo introduces a new `CollectionConstraint`. Use this to specify MongoDB specific collection properties that are usually used when calling [create_collection](https://api.mongodb.com/python/current/api/pymongo/database.html#pymongo.database.Database.create_collection) + +```python +class CollectionConstraint(**kwargs) +``` + +All arguments passed to `create_collection` with the exception of `name` can be used to create the `CollectionConstraint` instance. Valid arguments include, but are not limited to those described below + +### Arguments + +Argument | Type | Description +---------|------|------------- +`codec_options` | `CodecOptions` | An instance of [CodecOptions](https://api.mongodb.com/python/current/api/bson/codec_options.html#bson.codec_options.CodecOptions). +`collation` | `Collation` | Takes an instance of [Collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + +### Example + +```python +from djongo.models import CollectionConstraint +from djongo import models +from pymongo.read_concern import ReadConcern + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + constraints = [ + CollectionConstraint( + read_concern=ReadConcern(level='majority'), + capped=True, + max=100 + ) + ] +``` + + diff --git a/docs/markdown/documentation/djongoCS/model-query.md b/docs/markdown/documentation/djongoCS/model-query.md new file mode 100644 index 00000000..6a1e18f6 --- /dev/null +++ b/docs/markdown/documentation/djongoCS/model-query.md @@ -0,0 +1,136 @@ +--- +title: Model Query +layout: server +permalink: /model-query/ +--- + +## Text Search + +Djongo lets you run [MongoDB text search](https://docs.mongodb.com/manual/core/text-search-operators/) queries on Django `CharField` and `TextField`. To run a text search, use the `text_search` operator that comes built in with Djongo. + +### Example + +```python +from djongo.models.indexes import TextIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + TextIndex(fields=['name']) + ] +``` + +```python +Blog.objects.filter(name__text_search='Paul Lennon') +``` +This will generate the pymongo command: + +```python +db.blog.find( { '$text': { '$search': "Paul Lennon" } } ) +``` + + + +## Geospatial Queries + +Geospatial queries are carried out in Djongo by using a combination of the `near` lookup operator and the `Near` search object. + +```python +class Near( + type=None, + coordinates=None, + minDistance=None, + maxDistance=None) +``` +### Example + +```python +from djongo.models.indexes import TwoDSphereIndex +from djongo import models + +class Location(models.Model): + type = models.CharField(max_length=100) + coordinates = models.ArrayField() + + class Meta: + abstract = True + +class Entry(models.Model): + loc = models.EmbeddedField( + model_container=Location, + ) + class Meta: + indexes = [ + TwoDSphereIndex(fields=['loc']) + ] +``` + +```python +from djongo.models import Near + +search_region = Near( + type='point', + coordinates=[-33.9, 89.81], + minDistance=100, + maxDistance=200 +) + +Entry.objects.filter(loc__near=search_region) +``` + +This generates the following pymongo search query: + +```python +db.entry.find({ + 'loc': + { '$near': + { + '$geometry': { 'type': "Point", 'coordinates': [-33.9, 89.81] }, + '$minDistance': 100, + '$maxDistance': 200 + } + } + }) +``` + +## Specifying Query Options + +Djongo lets you specify the configuration of the find command into your [QuerySets](https://docs.djangoproject.com/en/dev/ref/models/querysets/). Call the `configure` method on a QuerySet to configure the find query. All options supported by [aggregate](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate) or [find](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find) can be included as `kwargs`. Example of valid arguments: + +### Arguments + +Argument | Type | Description +---------|------|------------- +`allowDiskUse` | `boolean` | Enables writing to temporary files +`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [Collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + + +### Example + +```python +Blog.objects.filter(name='John Lennon').configure(hint=['-tagline']) +``` +This generates the following pymongo find query: + +```python +db.blog.find({'name': 'John Lennon'}, hint=[('tagline', pymongo.DESCENDING)]) +``` + +## Tailable Cursors +Tailable cursors are used to retrieve data from [capped collections](https://docs.mongodb.com/manual/core/capped-collections/). The querySet first has to be configured using `configure` to use a tailable cursor in the pymongo find command. Results of the querySet can only be accessed by generating an iterator by calling the [QuerySet iterator](https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator) + +### Example + +```python +iterable = Blog.objects.filter(name='John').configure(cursor_type=CursorType.TAILABLE).iterator() +for blog in iterable: + blog.name +``` + + diff --git a/docs/markdown/documentation/djongoCS/model-update.md b/docs/markdown/documentation/djongoCS/model-update.md new file mode 100644 index 00000000..3c62c4b3 --- /dev/null +++ b/docs/markdown/documentation/djongoCS/model-update.md @@ -0,0 +1,52 @@ +--- +title: Model Update +layout: server +permalink: /model-update/ +--- + +## Bulk Write + +MongoDB lets you perform [Bulk Write operations](https://docs.mongodb.com/manual/core/bulk-write-operations/) using [`bulk_write`](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write) which is currently not supported in Django. However, by using Djongo it is possible to perform bulk writes. + +```python +class BulkWrite(ordered=True) +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`ordered` | `boolean` | Perform the write operations either in order or arbitrarily. + +### Example + + ```python +from djongo import BulkWrite + +with BulkWrite(): + entry = Entry.objects.get(pk=p_key) # Queries the DB once + entry.headline = 'The Beatles reconcile' + entry.save() # Djongo does not really do a update to MongoDB + Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB + +# On exit, does: db.entry.bulk_write([UpdateOne(), InsertOne()]) +``` + +## Unordered Bulk Writes + +### Example + + ```python +from djongo import BulkWrite + +with BulkWrite(ordered=False): + entry = Entry.objects.get(pk=p_key) # Queries the DB once + entry.headline = 'The Beatles reconcile' + entry.save() # Djongo does not really do a update to MongoDB + Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB + +# On exit, does: +# db.entry.bulk_write( +# [UpdateOne(), InsertOne()] +# ordered=False) +``` diff --git a/docs/markdown/documentation/djongoCS/more-info.md b/docs/markdown/documentation/djongoCS/more-info.md new file mode 100644 index 00000000..9f802341 --- /dev/null +++ b/docs/markdown/documentation/djongoCS/more-info.md @@ -0,0 +1,8 @@ +--- +title: More Information +permalink: /more-info/ +layout: server +toc: false +--- + + \ No newline at end of file diff --git a/docs/markdown/documentation/get-started.md b/docs/markdown/documentation/get-started.md new file mode 100644 index 00000000..417559d8 --- /dev/null +++ b/docs/markdown/documentation/get-started.md @@ -0,0 +1,378 @@ +--- +title: Get Started +permalink: /get-started/ +description: "Djongo overcomes common pitfalls of PyMongo programming. It maps python objects to MongoDB documents. +Setting up the mapping documents to python objects is easy with Djongo." +layout: docs +--- + +## Deploy + +1. Start by [creating an account](/djongocs/create-account/). You will be assigned +a working webserver instance running Django and MongoDB. +2. (Optional) Test your instance by entering `https://api.djongomapper.com//` in your browser. +The username is what was used while creating the account. +3. Login to your [dashboard](/djongocs/dashboard/) and upload your Public SSH key. The command to open a shell +to your instance will appear in the dashboard. You can upload your app specific Django scripts to the server. + + +## Local Development + +### Setup +For a local installation start with: +1. `pip install djongo` +2. Into `settings.py` file of your project, add: + + ```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + } + } + ``` + +### Requirements +1. Python 3.6 or higher. +2. MongoDB 3.4 or higher. +3. If your models use nested queries or sub querysets like: + + ```python + inner_query = Blog.objects.filter(name__contains='Ch').values('name') + entries = Entry.objects.filter(blog__name__in=inner_query) + ``` + MongoDB 3.6 or higher is required. + +## MongoDB and Django + +### EmbeddedField + Nest a `dict` inside a model with the `EmbeddedField`. The `model_container` is used to describe the structure of the + data stored. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + + class Meta: + abstract = True + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog + ) + headline = models.CharField(max_length=255) + +e = Entry() +e.blog = { + 'name': 'Djongo' +} +e.headline = 'The Django MongoDB connector' +e.save() +``` + +### ArrayField +Nest a `list` of `dict` inside a model for more complex data. + +```python +from djongo import models + +class Entry(models.Model): + blog = models.ArrayField( + model_container=Blog + ) + headline = models.CharField(max_length=255) + +e = Entry() +e.blog = [ + {'name': 'Djongo'}, {'name': 'Django'}, {'name': 'MongoDB'} +] +e.headline = 'Djongo is the best Django and MongoDB connector' +e.save() +``` + + +## Database Configuration + +The `settings.py` supports (but is not limited to) the following options: + +Attribute | Value | Description +---------|------|------------- +ENGINE | djongo | The MongoDB connection engine for interfacing with Django. +ENFORCE_SCHEMA | True | Ensures that the model schema and database schema are exactly the same. Raises `Migration Error` in case of discrepancy. +ENFORCE_SCHEMA | False | (Default) Implicitly creates collections. Returns missing fields as `None` instead of raising an exception. +NAME | your-db-name | Specify your database name. This field cannot be left empty. +LOGGING | dict | A [dictConfig](https://docs.python.org/3.6/library/logging.config.html) for the type of logging to run on djongo. +CLIENT | dict | A set of key-value pairs that will be passed directly to [`MongoClient`](http://api.mongodb.com/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient) as kwargs while creating a new client connection. + +All options except `ENGINE` and `ENFORCE_SCHEMA` are the same those listed in the [pymongo documentation](http://api.mongodb.com/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient). + + +```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + 'ENFORCE_SCHEMA': False, + 'CLIENT': { + 'host': 'host-name or ip address', + 'port': port_number, + 'username': 'db-username', + 'password': 'password', + 'authSource': 'db-name', + 'authMechanism': 'SCRAM-SHA-1' + }, + 'LOGGING': { + 'version': 1, + 'loggers': { + 'djongo': { + 'level': 'DEBUG', + 'propagate': False, + } + }, + }, + } + } +``` + +## DjongoCS + +Djongo Cloud Server is the fastest way to deploy to the cloud your djongo powered apps. The DjongoCS package and +dependencies come preconfigured and installed on the [Cloud][support_page]. + +### SSH +On account creation you install your public SSH key at the [dashboard](/djongocs/dashboard/). +This gives a secure shell access to the VM instance for uploading a +[Django App](https://docs.djangoproject.com/en/dev/intro/tutorial01/). Once the key is installed, +the dashboard displays the SSH port number over which you can connect to the VM instance. + +Establish a secure shell connection using: + +```shell +ssh @api.djongomapper.com -p +``` + +The `user` is the same as the username used while creating the account. + +### Public API +When you create an account on DjongoCS you get a unique URL path assigned to you. The Django views that you +create for servicing your API can be accessed and extended further starting from the base URL: + +```shell +https://api.djongomapper.com/ +``` + +### Launching the App + +Establishing a SSH connection to your server logs you into the `/home/$USER` directory. The typical home directory +structure looks like: + +```shell +~home +| -- .ssh/ +| -- site/ +| -- api/ +| -- settings.py +| -- urls.py +| -- apps/ +| -- app1/ +| -- views.py +| -- models.py +| -- app2/ +| -- views.py +| -- models.py +``` + +In your `urls.py` if you add an entry like `path('hello/', app1.views.hello)`, the URL path becomes +`https://api.djongomapper.com//hello` + +#### Reload the Server +After making changes to your app, you need to reload the server. This is done by clicking the reload button +in your [dashboard](/djongocs/dashboard/). + +{% comment %} +### Installing dependencies + +{% endcomment %} + +## Security and Integrity Checks +Djongo allows for checks on data fields before they are saved to the database. Running the correct integrity checks and field value validators before writing data into the database is important. + +### Enforce schema + +MongoDB is *schemaless*, which means no schema rules are enforced by the database. You can add and exclude fields per entry and MongoDB will not complain. This can make life easier, especially when there are frequent changes to the data model. Take for example the `Blog` Model (version 1). + +```python +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() +``` + +You can save several entries into the DB and later modify it to version 2: + +```python +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + description = models.TextField() +``` + +The modified Model can be saved **without running any migrations**. + +This works fine if you know what you are doing. Consider a query that retrieves entries belonging to both the 'older' model (with just 2 fields) and the current model. What will the value of `description` now be? To handle such scenarios Djongo comes with the `ENFORCE_SCHEMA` option. + +When connecting to Djongo you can set `ENFORCE_SCHEMA: True`. In this case, a `MigrationError` will be raised when field values are missing from the retrieved documents. You can then check what went wrong. + +`ENFORCE_SCHEMA: False` works by silently setting the missing fields with the value `None`. If your app is programmed to expect this (which means it is not a bug) you can get away by not calling any migrations. + +### Validators +Apply validators to each field before they are saved. + +```python +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ +from djongo import models +from django.core.validators import URLValidator + +def script_injection(value): + if value.find('