diff --git a/.gitignore b/.gitignore index 6c82503b..f0547d06 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ tests/logs Gemfile.lock /docs/.jekyll-metadata -/docs/djongocs/assets/* \ No newline at end of file +/docs/djongocs/assets/* diff --git a/djongo/.github/FUNDING.yml b/djongo/.github/FUNDING.yml new file mode 100644 index 00000000..850f0e7b --- /dev/null +++ b/djongo/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: +patreon: +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: diff --git a/djongo/.gitignore b/djongo/.gitignore new file mode 100644 index 00000000..6c82503b --- /dev/null +++ b/djongo/.gitignore @@ -0,0 +1,15 @@ +dist/ +build/ +.idea/ +.tox/ +*__pycache__* +*egg-info/ + +docs/.sass-cache/* +docs/_site/* +tests/logs + +Gemfile.lock + +/docs/.jekyll-metadata +/docs/djongocs/assets/* \ No newline at end of file diff --git a/djongo/.travis.yml b/djongo/.travis.yml new file mode 100644 index 00000000..dbf6e3ee --- /dev/null +++ b/djongo/.travis.yml @@ -0,0 +1,26 @@ +language: python + +python: + - 3.8 + +env: + matrix: + - MONGODB=4.2.6 + +install: + - wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - + - echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list + - sudo apt-get update + - sudo apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} --allow-downgrades + - sudo service mongod start + - sudo service mongod status + - pip install tox + +before_script: + - mongod --version + +script: + - tox -e py38-django_stable + +after_script: + - pkill mongod \ No newline at end of file diff --git a/djongo/ISSUE_TEMPLATE.md b/djongo/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..4f305e96 --- /dev/null +++ b/djongo/ISSUE_TEMPLATE.md @@ -0,0 +1,14 @@ + +#### One line description of the issue + +#### Python script + + + +```python + + +``` + +#### Traceback + diff --git a/djongo/LICENSE b/djongo/LICENSE new file mode 100644 index 00000000..b54e9aa7 --- /dev/null +++ b/djongo/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/djongo/MANIFEST b/djongo/MANIFEST new file mode 100644 index 00000000..f1161b12 --- /dev/null +++ b/djongo/MANIFEST @@ -0,0 +1,18 @@ +# file GENERATED by distutils, do NOT edit +setup.cfg +setup.py +djongo\__init__.py +djongo\base.py +djongo\compiler.py +djongo\cursor.py +djongo\database.py +djongo\features.py +djongo\introspection.py +djongo\operations.py +djongo\schema.py +djongo\models\__init__.py +djongo\models\fields.py +djongo\sql2mongo\__init__.py +djongo\sql2mongo\converters.py +djongo\sql2mongo\operators.py +djongo\sql2mongo\query.py diff --git a/djongo/MANIFEST.in b/djongo/MANIFEST.in new file mode 100644 index 00000000..7f32d838 --- /dev/null +++ b/djongo/MANIFEST.in @@ -0,0 +1,4 @@ +include djongo/dynamic_formsets/static/dynamic_formsets/images/*.* +include djongo/dynamic_formsets/static/dynamic_formsets/js/jquery/*.* +include djongo/dynamic_formsets/static/dynamic_formsets/js/jquery-formset/*.* +include djongo/dynamic_formsets/templates/admin/*.* diff --git a/djongo/README.md b/djongo/README.md new file mode 100644 index 00000000..6c676983 --- /dev/null +++ b/djongo/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/djongo/__init__.py b/djongo/djongo/__init__.py similarity index 100% rename from djongo/__init__.py rename to djongo/djongo/__init__.py diff --git a/djongo/admin.py b/djongo/djongo/admin.py similarity index 100% rename from djongo/admin.py rename to djongo/djongo/admin.py diff --git a/djongo/base.py b/djongo/djongo/base.py similarity index 100% rename from djongo/base.py rename to djongo/djongo/base.py diff --git a/djongo/compiler.py b/djongo/djongo/compiler.py similarity index 100% rename from djongo/compiler.py rename to djongo/djongo/compiler.py diff --git a/djongo/creation.py b/djongo/djongo/creation.py similarity index 100% rename from djongo/creation.py rename to djongo/djongo/creation.py diff --git a/djongo/cursor.py b/djongo/djongo/cursor.py similarity index 100% rename from djongo/cursor.py rename to djongo/djongo/cursor.py diff --git a/djongo/database.py b/djongo/djongo/database.py similarity index 100% rename from djongo/database.py rename to djongo/djongo/database.py diff --git a/djongo/exceptions.py b/djongo/djongo/exceptions.py similarity index 100% rename from djongo/exceptions.py rename to djongo/djongo/exceptions.py diff --git a/djongo/features.py b/djongo/djongo/features.py similarity index 100% rename from djongo/features.py rename to djongo/djongo/features.py diff --git a/djongo/introspection.py b/djongo/djongo/introspection.py similarity index 100% rename from djongo/introspection.py rename to djongo/djongo/introspection.py diff --git a/djongo/models/__init__.py b/djongo/djongo/models/__init__.py similarity index 100% rename from djongo/models/__init__.py rename to djongo/djongo/models/__init__.py diff --git a/djongo/models/fields.py b/djongo/djongo/models/fields.py similarity index 100% rename from djongo/models/fields.py rename to djongo/djongo/models/fields.py diff --git a/djongo/models/indexes.py b/djongo/djongo/models/indexes.py similarity index 100% rename from djongo/models/indexes.py rename to djongo/djongo/models/indexes.py diff --git a/djongo/models/json.py b/djongo/djongo/models/json.py similarity index 100% rename from djongo/models/json.py rename to djongo/djongo/models/json.py diff --git a/djongo/operations.py b/djongo/djongo/operations.py similarity index 100% rename from djongo/operations.py rename to djongo/djongo/operations.py diff --git a/djongo/schema.py b/djongo/djongo/schema.py similarity index 100% rename from djongo/schema.py rename to djongo/djongo/schema.py diff --git a/djongo/sql2mongo/__init__.py b/djongo/djongo/sql2mongo/__init__.py similarity index 100% rename from djongo/sql2mongo/__init__.py rename to djongo/djongo/sql2mongo/__init__.py diff --git a/djongo/sql2mongo/aggregation.py b/djongo/djongo/sql2mongo/aggregation.py similarity index 100% rename from djongo/sql2mongo/aggregation.py rename to djongo/djongo/sql2mongo/aggregation.py diff --git a/djongo/sql2mongo/constraints.py b/djongo/djongo/sql2mongo/constraints.py similarity index 100% rename from djongo/sql2mongo/constraints.py rename to djongo/djongo/sql2mongo/constraints.py diff --git a/djongo/sql2mongo/converters.py b/djongo/djongo/sql2mongo/converters.py similarity index 100% rename from djongo/sql2mongo/converters.py rename to djongo/djongo/sql2mongo/converters.py diff --git a/djongo/sql2mongo/functions.py b/djongo/djongo/sql2mongo/functions.py similarity index 100% rename from djongo/sql2mongo/functions.py rename to djongo/djongo/sql2mongo/functions.py diff --git a/djongo/sql2mongo/operators.py b/djongo/djongo/sql2mongo/operators.py similarity index 100% rename from djongo/sql2mongo/operators.py rename to djongo/djongo/sql2mongo/operators.py diff --git a/djongo/sql2mongo/query.py b/djongo/djongo/sql2mongo/query.py similarity index 100% rename from djongo/sql2mongo/query.py rename to djongo/djongo/sql2mongo/query.py diff --git a/djongo/sql2mongo/sql_tokens.py b/djongo/djongo/sql2mongo/sql_tokens.py similarity index 100% rename from djongo/sql2mongo/sql_tokens.py rename to djongo/djongo/sql2mongo/sql_tokens.py diff --git a/djongo/sql2mongo/validation.py b/djongo/djongo/sql2mongo/validation.py similarity index 100% rename from djongo/sql2mongo/validation.py rename to djongo/djongo/sql2mongo/validation.py diff --git a/djongo/storage.py b/djongo/djongo/storage.py similarity index 100% rename from djongo/storage.py rename to djongo/djongo/storage.py diff --git a/djongo/transaction.py b/djongo/djongo/transaction.py similarity index 100% rename from djongo/transaction.py rename to djongo/djongo/transaction.py diff --git a/djongo/no-response.yml b/djongo/no-response.yml new file mode 100644 index 00000000..f4b26fa7 --- /dev/null +++ b/djongo/no-response.yml @@ -0,0 +1,10 @@ +# Number of days of inactivity before an Issue is closed for lack of response +daysUntilClose: 7 +# Label requiring a response +responseRequiredLabel: more-info-needed +# Comment to post when closing an Issue for lack of response. Set to `false` to disable +closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. diff --git a/djongo/requirements.txt b/djongo/requirements.txt new file mode 100644 index 00000000..4041fbaf --- /dev/null +++ b/djongo/requirements.txt @@ -0,0 +1,9 @@ +sqlparse==0.4.4 +pymongo>=3.2.0 +django>=2.0,<=3.1.4 + + # requirements.txt + # + # installs dependencies from ./setup.py, and the package itself, + # in editable mode + -e . diff --git a/djongo/setup.cfg b/djongo/setup.cfg new file mode 100644 index 00000000..224a7795 --- /dev/null +++ b/djongo/setup.cfg @@ -0,0 +1,2 @@ +[metadata] +description-file = README.md \ No newline at end of file diff --git a/djongo/setup.py b/djongo/setup.py new file mode 100644 index 00000000..7a2a18e2 --- /dev/null +++ b/djongo/setup.py @@ -0,0 +1,120 @@ +from distutils.core import setup +from setuptools import find_packages +import os +import codecs +import re +import sys + +LONG_DESCRIPTION = """ + +Use Mongodb as a backend database for your django project, without changing a +single django model! + +Usage +----- + +1. Install djongo:: + + pip install djongo + +2. Into settings.py file of your project, add:: + + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + } + } + +3. Run (ONLY the first time to create collections in mongoDB):: + + manage.py makemigrations + manage.py migrate + +YOUR ARE SET! HAVE FUN! + +Requirements +------------ + +1. Djongo requires python 3.6 or above. + + +How it works +------------ + +Djongo is a SQL to mongodb query transpiler. 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. + +Important links +--------------- + +* `Full Documentation `_ +* `Source code `_ +""" + + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +packages = find_packages() + + +def read(*parts): + with codecs.open(os.path.join(BASE_DIR, *parts), 'r') as fp: + return fp.read() + + +def find_version(*file_paths): + version_file = read(*file_paths) + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + version_file, re.M) + if version_match: + return version_match.group(1) + raise RuntimeError("Unable to find version string.") + + +install_requires = [ + 'sqlparse==0.4.4', + 'pymongo>=3.2.0', + 'django>=2.1', + 'pytz>=2018.5' +] + +if sys.version_info.major == 3 and sys.version_info.minor < 7: + install_requires.append("dataclasses") + +setup( + name='djongo', + version=find_version("djongo", "__init__.py"), + include_package_data=True, + packages=packages, + url='https://www.djongomapper.com/', + license='AGPL', + author='doableware', + author_email='support@doableware.com', + description=( + 'Driver for allowing Django to use MongoDB as the database backend.'), + install_requires=install_requires, + extras_require=dict( + json=[ + 'jsonfield>=2.0.2', + 'django-jsoneditor>=0.0.12', + ], + ), + long_description=LONG_DESCRIPTION, + python_requires='>=3.6', + keywords='Django MongoDB driver connector', + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 3.6', + ] +) diff --git a/djongo/tox.ini b/djongo/tox.ini new file mode 100644 index 00000000..dfe4b405 --- /dev/null +++ b/djongo/tox.ini @@ -0,0 +1,50 @@ +# tox (https://tox.readthedocs.io/) is a tool for running tests +# in multiple virtualenvs. This configuration file will run the +# test suite on all supported python versions. To use it, "pip install tox" +# and then run "tox" from this directory. + +[tox] +envlist = + py{36,38}-django{21, _stable} + +[testenv] + +commands_pre = + pip install tblib + python tests/precheckin.py + +[testenv:django21] +commands = + python tests/django_tests/manage_tests/runtests.py --check-currently-passing --django-version=21 +deps = + Django==2.1 + +[testenv:py38-django_stable] +commands = + python tests/django_tests/runtests.py --check-currently-passing --django-version=22 --v 2 --parallel=2 + +deps = + Django>=2.2,<2.3 + +[testenv:py38-django31] +deps = + Django>=3.1 + +[testenv:django22_discover] +commands = + python tests/django_tests/manage_tests/runtests.py --discover-passing --django-version=22 -v 2 +deps = + Django==2.2 + +[testenv:django22_run_test] +commands = + python tests/django_tests/manage_tests/runtests.py --django-version=22 --failfast \ + --run-specific=migrations.test_operations.OperationTests.test_rename_model +deps = + Django==2.2 + +[testenv:django21_discover] +commands = + python tests/django_tests/manage_tests/runtests.py --discover-passing --django-version=21 --failfast +deps = + Django==2.1 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..8e74aeda --- /dev/null +++ b/docs/_data/navigation.yml @@ -0,0 +1,67 @@ +# main links +main: + - title: "Create Account" + url: /djongocs/create-account/ + id: 'nav-create-account' + - 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/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 00000000..73f0b059 --- /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}.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/home/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}.l-tiles{display:grid;grid-template-columns:repeat(3, 1fr);gap:1rem}.l-tiles.is-titled{padding-top:1rem}.l-tiles>div{box-shadow:0 5px 15px rgba(0,0,0,.35);font-size:.8em;padding:1.5em;border-radius:5px;display:flex;flex-direction:column;align-items:flex-start;background-color:#fff}.l-tiles img{height:5em;display:block;margin:0 auto 1.3rem}.l-tiles .cta{margin-top:auto}@media(max-width: 900px){.l-tiles{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 600px){.l-tiles{grid-template-columns:1fr}}.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}}.pc-title.pc-subtitle h2{margin-bottom:1.3rem}.pc-title.pc-subtitle h3{margin-bottom:2.7rem}.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}.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}a.cta{text-decoration:none;color:#09411f;position:relative}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)}.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}.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/admin.png b/docs/assets/images/admin.png new file mode 100644 index 00000000..2a0f3d33 Binary files /dev/null and b/docs/assets/images/admin.png differ diff --git a/docs/assets/images/array-model-field.png b/docs/assets/images/array-model-field.png new file mode 100644 index 00000000..f02dc155 Binary files /dev/null and b/docs/assets/images/array-model-field.png differ diff --git a/docs/assets/images/bug.jpg b/docs/assets/images/bug.jpg new file mode 100644 index 00000000..e5aaa8dc Binary files /dev/null and b/docs/assets/images/bug.jpg differ diff --git a/docs/assets/images/django.jpg b/docs/assets/images/django.jpg new file mode 100755 index 00000000..13a778c4 Binary files /dev/null and b/docs/assets/images/django.jpg differ diff --git a/docs/assets/images/djongo-logo-new.png b/docs/assets/images/djongo-logo-new.png new file mode 100755 index 00000000..bd579a12 Binary files /dev/null and b/docs/assets/images/djongo-logo-new.png differ diff --git a/docs/assets/images/djongo-logo.png b/docs/assets/images/djongo-logo.png new file mode 100755 index 00000000..d3fa1c4c Binary files /dev/null and b/docs/assets/images/djongo-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/embedded-admin.png b/docs/assets/images/embedded-admin.png new file mode 100644 index 00000000..a75b56a6 Binary files /dev/null and b/docs/assets/images/embedded-admin.png differ diff --git a/docs/assets/images/embedded-nested.png b/docs/assets/images/embedded-nested.png new file mode 100644 index 00000000..1e296325 Binary files /dev/null and b/docs/assets/images/embedded-nested.png differ diff --git a/docs/assets/images/enterprise/deploy.svg b/docs/assets/images/enterprise/deploy.svg new file mode 100755 index 00000000..d7d2a25d --- /dev/null +++ b/docs/assets/images/enterprise/deploy.svg @@ -0,0 +1,108 @@ + +image/svg+xml diff --git a/docs/assets/images/enterprise/modify.svg b/docs/assets/images/enterprise/modify.svg new file mode 100755 index 00000000..a61a3824 --- /dev/null +++ b/docs/assets/images/enterprise/modify.svg @@ -0,0 +1,95 @@ + +image/svg+xml diff --git a/docs/assets/images/enterprise/redistribute.svg b/docs/assets/images/enterprise/redistribute.svg new file mode 100755 index 00000000..9cbd0d9b --- /dev/null +++ b/docs/assets/images/enterprise/redistribute.svg @@ -0,0 +1,112 @@ + +image/svg+xml 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/heart.png b/docs/assets/images/heart.png new file mode 100644 index 00000000..47a866c9 Binary files /dev/null and b/docs/assets/images/heart.png differ diff --git a/docs/assets/images/home/banner-cloud.png b/docs/assets/images/home/banner-cloud.png new file mode 100755 index 00000000..13e36140 Binary files /dev/null and b/docs/assets/images/home/banner-cloud.png differ diff --git a/docs/assets/images/home/banner-map-dark.svg b/docs/assets/images/home/banner-map-dark.svg new file mode 100755 index 00000000..08162bb8 --- /dev/null +++ b/docs/assets/images/home/banner-map-dark.svg @@ -0,0 +1,10370 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + MongoDB Document Mapper + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + + + + + + { + } + + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + { + } + + + + + + + { + } + + + + + + + { + } + + ] + [ + + + + + + + + + + + + + { + } + + + + + + + + + + + + + + + + + + + + + + + { + } + + } + { + + + + + + + + + + { + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + } + + [ + + + + + ] + + : + + + + + + + + + + + + { + } + + + + + + + + + + [ + + + + + ] + + : + + + + + diff --git a/docs/assets/images/home/banner-rand-dark-many6.png b/docs/assets/images/home/banner-rand-dark-many6.png new file mode 100755 index 00000000..8da56763 Binary files /dev/null and b/docs/assets/images/home/banner-rand-dark-many6.png differ diff --git a/docs/assets/images/home/banner-rand-dark-many7.png b/docs/assets/images/home/banner-rand-dark-many7.png new file mode 100755 index 00000000..fee0fe48 Binary files /dev/null and b/docs/assets/images/home/banner-rand-dark-many7.png differ diff --git a/docs/assets/images/home/cloud-tiles.png b/docs/assets/images/home/cloud-tiles.png new file mode 100755 index 00000000..df786c41 Binary files /dev/null and b/docs/assets/images/home/cloud-tiles.png differ diff --git a/docs/assets/images/home/cloud.png b/docs/assets/images/home/cloud.png new file mode 100755 index 00000000..72730edf Binary files /dev/null and b/docs/assets/images/home/cloud.png differ diff --git a/docs/assets/images/home/containers.svg b/docs/assets/images/home/containers.svg new file mode 100755 index 00000000..3940f785 --- /dev/null +++ b/docs/assets/images/home/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/home/cross.svg b/docs/assets/images/home/cross.svg new file mode 100755 index 00000000..ff7c4b8a --- /dev/null +++ b/docs/assets/images/home/cross.svg @@ -0,0 +1,228 @@ + +image/svg+xmlProductsDjango MongoDB connectorVirtualized containersCommercial licenseDjongoDjongoCSEnterpriseCreate AccountEnquire diff --git a/docs/assets/images/home/djongo-Nxt-v1.png b/docs/assets/images/home/djongo-Nxt-v1.png new file mode 100644 index 00000000..445a5d79 Binary files /dev/null and b/docs/assets/images/home/djongo-Nxt-v1.png differ diff --git a/docs/assets/images/home/djongo-name-logo.png b/docs/assets/images/home/djongo-name-logo.png new file mode 100755 index 00000000..07f9880c Binary files /dev/null and b/docs/assets/images/home/djongo-name-logo.png differ diff --git a/docs/assets/images/home/e2e.png b/docs/assets/images/home/e2e.png new file mode 100644 index 00000000..c6fcf051 Binary files /dev/null and b/docs/assets/images/home/e2e.png differ diff --git a/docs/assets/images/home/landing-banner-center.jpg b/docs/assets/images/home/landing-banner-center.jpg new file mode 100644 index 00000000..e69de29b diff --git a/docs/assets/images/home/landing-banner-narrow-2.png b/docs/assets/images/home/landing-banner-narrow-2.png new file mode 100755 index 00000000..d104b528 Binary files /dev/null and b/docs/assets/images/home/landing-banner-narrow-2.png differ diff --git a/docs/assets/images/home/landing-banner-narrow.jpg b/docs/assets/images/home/landing-banner-narrow.jpg new file mode 100644 index 00000000..bc7d4382 Binary files /dev/null and b/docs/assets/images/home/landing-banner-narrow.jpg differ diff --git a/docs/assets/images/home/mongo.jpg b/docs/assets/images/home/mongo.jpg new file mode 100755 index 00000000..db7fae66 Binary files /dev/null and b/docs/assets/images/home/mongo.jpg differ diff --git a/docs/assets/images/home/noSql.png b/docs/assets/images/home/noSql.png new file mode 100755 index 00000000..4f3b428c Binary files /dev/null and b/docs/assets/images/home/noSql.png differ diff --git a/docs/assets/images/home/query-green-own.png b/docs/assets/images/home/query-green-own.png new file mode 100755 index 00000000..16258661 Binary files /dev/null and b/docs/assets/images/home/query-green-own.png differ diff --git a/docs/assets/images/home/query-green.png b/docs/assets/images/home/query-green.png new file mode 100755 index 00000000..e501976b Binary files /dev/null and b/docs/assets/images/home/query-green.png differ diff --git a/docs/assets/images/home/rapid-levels.png b/docs/assets/images/home/rapid-levels.png new file mode 100755 index 00000000..9c5c30e9 Binary files /dev/null and b/docs/assets/images/home/rapid-levels.png differ diff --git a/docs/assets/images/home/rapid.png b/docs/assets/images/home/rapid.png new file mode 100755 index 00000000..ff8d42a3 Binary files /dev/null and b/docs/assets/images/home/rapid.png differ diff --git a/docs/assets/images/home/rapid.svg b/docs/assets/images/home/rapid.svg new file mode 100755 index 00000000..ff22a2f6 --- /dev/null +++ b/docs/assets/images/home/rapid.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/home/security-green.png b/docs/assets/images/home/security-green.png new file mode 100755 index 00000000..ff0330ec Binary files /dev/null and b/docs/assets/images/home/security-green.png differ diff --git a/docs/assets/images/home/security.png b/docs/assets/images/home/security.png new file mode 100755 index 00000000..522bb916 Binary files /dev/null and b/docs/assets/images/home/security.png differ diff --git a/docs/assets/images/home/security.svg b/docs/assets/images/home/security.svg new file mode 100755 index 00000000..c9295269 --- /dev/null +++ b/docs/assets/images/home/security.svg @@ -0,0 +1,99 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/docs/assets/images/home/sumeru.png b/docs/assets/images/home/sumeru.png new file mode 100644 index 00000000..f84e4745 Binary files /dev/null and b/docs/assets/images/home/sumeru.png differ diff --git a/docs/assets/images/home/support-new.png b/docs/assets/images/home/support-new.png new file mode 100755 index 00000000..7ffa2d6a Binary files /dev/null and b/docs/assets/images/home/support-new.png differ diff --git a/docs/assets/images/home/support-new.svg b/docs/assets/images/home/support-new.svg new file mode 100755 index 00000000..bbf88402 --- /dev/null +++ b/docs/assets/images/home/support-new.svg @@ -0,0 +1,90 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/docs/assets/images/home/support.png b/docs/assets/images/home/support.png new file mode 100644 index 00000000..5d8e8ef4 Binary files /dev/null and b/docs/assets/images/home/support.png differ diff --git a/docs/assets/images/home/third-party-thin.png b/docs/assets/images/home/third-party-thin.png new file mode 100755 index 00000000..9c9bc314 Binary files /dev/null and b/docs/assets/images/home/third-party-thin.png differ diff --git a/docs/assets/images/home/third-party.png b/docs/assets/images/home/third-party.png new file mode 100755 index 00000000..16790fe4 Binary files /dev/null and b/docs/assets/images/home/third-party.png differ diff --git a/docs/assets/images/home/tick.svg b/docs/assets/images/home/tick.svg new file mode 100755 index 00000000..e9176a77 --- /dev/null +++ b/docs/assets/images/home/tick.svg @@ -0,0 +1,49 @@ + +image/svg+xml diff --git a/docs/assets/images/home/webpage.png b/docs/assets/images/home/webpage.png new file mode 100755 index 00000000..42ed09c7 Binary files /dev/null and b/docs/assets/images/home/webpage.png differ diff --git a/docs/assets/images/layers.png b/docs/assets/images/layers.png new file mode 100644 index 00000000..3db2e131 Binary files /dev/null and b/docs/assets/images/layers.png differ diff --git a/docs/assets/images/migration.png b/docs/assets/images/migration.png new file mode 100644 index 00000000..40f21c99 Binary files /dev/null and b/docs/assets/images/migration.png differ diff --git a/docs/assets/images/optimization2.png b/docs/assets/images/optimization2.png new file mode 100644 index 00000000..377ec6df Binary files /dev/null and b/docs/assets/images/optimization2.png differ diff --git a/docs/assets/images/orm2odm.png b/docs/assets/images/orm2odm.png new file mode 100644 index 00000000..988a148c Binary files /dev/null and b/docs/assets/images/orm2odm.png differ diff --git a/docs/assets/images/pizza.jpg b/docs/assets/images/pizza.jpg new file mode 100644 index 00000000..41cc63de Binary files /dev/null and b/docs/assets/images/pizza.jpg differ diff --git a/docs/assets/images/sql2mongodb.png b/docs/assets/images/sql2mongodb.png new file mode 100644 index 00000000..5fd515e6 Binary files /dev/null and b/docs/assets/images/sql2mongodb.png differ diff --git a/docs/assets/images/white.jpg b/docs/assets/images/white.jpg new file mode 100644 index 00000000..099f1799 Binary files /dev/null and b/docs/assets/images/white.jpg 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/docs/assets/js/login.js b/docs/assets/js/login.js new file mode 100644 index 00000000..e69de29b 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..a0f336bf --- /dev/null +++ b/docs/djongocs/campaign/index.html @@ -0,0 +1,467 @@ + + + + + + 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..ad91205c --- /dev/null +++ b/docs/djongocs/contact-us/index.html @@ -0,0 +1,156 @@ + + + + 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..ad91205c --- /dev/null +++ b/docs/djongocs/create-account/index.html @@ -0,0 +1,156 @@ + + + + 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..ad91205c --- /dev/null +++ b/docs/djongocs/dashboard/index.html @@ -0,0 +1,156 @@ + + + + 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..22515f89 --- /dev/null +++ b/docs/djongocs/enterprise/index.html @@ -0,0 +1,344 @@ + + + + + + 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 holes and 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..ad91205c --- /dev/null +++ b/docs/djongocs/index.html @@ -0,0 +1,156 @@ + + + + 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..ad91205c --- /dev/null +++ b/docs/djongocs/login/index.html @@ -0,0 +1,156 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/main.957b5b6eaca5321d.js b/docs/djongocs/main.957b5b6eaca5321d.js new file mode 100644 index 00000000..4e4056f5 --- /dev/null +++ b/docs/djongocs/main.957b5b6eaca5321d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[179],{802:()=>{function ae(e){return"function"==typeof e}function Ao(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 ts=Ao(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 To(e,t){if(e){const n=e.indexOf(t);0<=n&&e.splice(n,1)}}class wt{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(ae(r))try{r()}catch(i){t=i instanceof ts?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 ts?t=[...t,...s.errors]:t.push(s)}}if(t)throw new ts(t)}}add(t){var n;if(t&&t!==this)if(this.closed)nh(t);else{if(t instanceof wt){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)&&To(n,t)}remove(t){const{_finalizers:n}=this;n&&To(n,t),t instanceof wt&&t._removeParent(this)}}wt.EMPTY=(()=>{const e=new wt;return e.closed=!0,e})();const eh=wt.EMPTY;function th(e){return e instanceof wt||e&&"closed"in e&&ae(e.remove)&&ae(e.add)&&ae(e.unsubscribe)}function nh(e){ae(e)?e():e.unsubscribe()}const er={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},ns={setTimeout(e,t,...n){const{delegate:r}=ns;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){const{delegate:t}=ns;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function rh(e){ns.setTimeout(()=>{const{onUnhandledError:t}=er;if(!t)throw e;t(e)})}function oh(){}const Qw=wl("C",void 0,void 0);function wl(e,t,n){return{kind:e,value:t,error:n}}let tr=null;function rs(e){if(er.useDeprecatedSynchronousErrorHandling){const t=!tr;if(t&&(tr={errorThrown:!1,error:null}),e(),t){const{errorThrown:n,error:r}=tr;if(tr=null,n)throw r}}else e()}class El extends wt{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,th(t)&&t.add(this)):this.destination=rE}static create(t,n,r){return new xo(t,n,r)}next(t){this.isStopped?Ml(function Jw(e){return wl("N",e,void 0)}(t),this):this._next(t)}error(t){this.isStopped?Ml(function Yw(e){return wl("E",void 0,e)}(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?Ml(Qw,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 eE=Function.prototype.bind;function bl(e,t){return eE.call(e,t)}class tE{constructor(t){this.partialObserver=t}next(t){const{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){os(r)}}error(t){const{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){os(r)}else os(t)}complete(){const{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){os(n)}}}class xo extends El{constructor(t,n,r){let o;if(super(),ae(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&er.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 tE(o)}}function os(e){er.useDeprecatedSynchronousErrorHandling?function Xw(e){er.useDeprecatedSynchronousErrorHandling&&tr&&(tr.errorThrown=!0,tr.error=e)}(e):rh(e)}function Ml(e,t){const{onStoppedNotification:n}=er;n&&ns.setTimeout(()=>n(e,t))}const rE={closed:!0,next:oh,error:function nE(e){throw e},complete:oh},Sl="function"==typeof Symbol&&Symbol.observable||"@@observable";function nr(e){return e}function ih(e){return 0===e.length?nr: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 sE(e){return e&&e instanceof El||function iE(e){return e&&ae(e.next)&&ae(e.error)&&ae(e.complete)}(e)&&th(e)}(n)?n:new xo(n,r,o);return rs(()=>{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 xo({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)}[Sl](){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??er.Promise)&&void 0!==t?t:Promise}const aE=Ao(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 aE}next(n){rs(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(const r of this.currentObservers)r.next(n)}})}error(n){rs(()=>{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(){rs(()=>{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 wt(()=>{this.currentObservers=null,To(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 ae(e?.lift)}function je(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 Fe(e,t,n,r,o){return new lE(e,t,n,r,o)}class lE extends El{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 je((n,r)=>{let o=0;n.subscribe(Fe(r,i=>{r.next(e.call(t,i,o++))}))})}function Pn(e){return this instanceof Pn?(this.v=e,this):new Pn(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 Pn?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 xl(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 ae(e?.then)}function gh(e){return ae(e[Sl])}function mh(e){return Symbol.asyncIterator&&ae(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 xE(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}();function _h(e){return ae(e?.[vh])}function Dh(e){return dh(this,arguments,function*(){const n=e.getReader();try{for(;;){const{value:r,done:o}=yield Pn(n.read());if(o)return yield Pn(void 0);yield yield Pn(r)}}finally{n.releaseLock()}})}function Ch(e){return ae(e?.getReader)}function Ot(e){if(e instanceof Ce)return e;if(null!=e){if(gh(e))return function RE(e){return new Ce(t=>{const n=e[Sl]();if(ae(n.subscribe))return n.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}(e);if(hh(e))return function NE(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 OE(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 PE(e){return wh(Dh(e))}(e)}throw yh(e)}function wh(e){return new Ce(t=>{(function kE(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 pn(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 $e(e,t,n=1/0){return ae(t)?$e((r,o)=>q((i,s)=>t(r,i,o,s))(Ot(e(r,o))),n):("number"==typeof t&&(n=t),je((r,o)=>function LE(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;Ot(n(g,c++)).subscribe(Fe(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(Fe(t,h,()=>{d=!0,f()})),()=>{a?.()}}(r,o,e,n)))}function Ar(e=1/0){return $e(nr,e)}const gn=new Ce(e=>e.complete());function Rl(e){return e[e.length-1]}function Eh(e){return ae(Rl(e))?e.pop():void 0}function Ro(e){return function jE(e){return e&&ae(e.schedule)}(Rl(e))?e.pop():void 0}function bh(e,t=0){return je((n,r)=>{n.subscribe(Fe(r,o=>pn(r,e,()=>r.next(o),t),()=>pn(r,e,()=>r.complete(),t),o=>pn(r,e,()=>r.error(o),t)))})}function Mh(e,t=0){return je((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=>{pn(n,t,()=>{const r=e[Symbol.asyncIterator]();pn(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function Me(e,t){return t?function WE(e,t){if(null!=e){if(gh(e))return function UE(e,t){return Ot(e).pipe(Mh(t),bh(t))}(e,t);if(hh(e))return function HE(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 $E(e,t){return Ot(e).pipe(Mh(t),bh(t))}(e,t);if(mh(e))return Sh(e,t);if(_h(e))return function GE(e,t){return new Ce(n=>{let r;return pn(n,t,()=>{r=e[vh](),pn(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)}),()=>ae(r?.return)&&r.return()})}(e,t);if(Ch(e))return function zE(e,t){return Sh(Dh(e),t)}(e,t)}throw yh(e)}(e,t):Ot(e)}function Nl(e,t,...n){if(!0===t)return void e();if(!1===t)return;const r=new xo({next:()=>{r.unsubscribe(),e()}});return t(...n).subscribe(r)}function oe(e){for(let t in e)if(e[t]===oe)return t;throw Error("Could not find renamed property on target object.")}function Fl(e,t){for(const n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function ie(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(ie).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 Ol(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}const ZE=oe({__forward_ref__:oe});function le(e){return e.__forward_ref__=le,e.toString=function(){return ie(this())},e}function k(e){return Pl(e)?e():e}function Pl(e){return"function"==typeof e&&e.hasOwnProperty(ZE)&&e.__forward_ref__===le}class w extends Error{constructor(t,n){super(function is(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 ss(e,t){throw new w(-201,!1)}function dt(e,t){null==e&&function te(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 as(e){return Ih(e,ls)||Ih(e,Th)}function Ih(e,t){return e.hasOwnProperty(t)?e[t]:null}function Ah(e){return e&&(e.hasOwnProperty(kl)||e.hasOwnProperty(ob))?e[kl]:null}const ls=oe({\u0275prov:oe}),kl=oe({\u0275inj:oe}),Th=oe({ngInjectableDef:oe}),ob=oe({ngInjectorDef:oe});var F=(()=>((F=F||{})[F.Default=0]="Default",F[F.Host=1]="Host",F[F.Self=2]="Self",F[F.SkipSelf=4]="SkipSelf",F[F.Optional=8]="Optional",F))();let Ll;function Et(e){const t=Ll;return Ll=e,t}function xh(e,t,n){const r=as(e);return r&&"root"==r.providedIn?void 0===r.value?r.value=r.factory():r.value:n&F.Optional?null:void 0!==t?t:void ss(ie(e))}function kn(e){return{toString:e}.toString()}var Pt=(()=>((Pt=Pt||{})[Pt.OnPush=0]="OnPush",Pt[Pt.Default=1]="Default",Pt))(),Jt=(()=>{return(e=Jt||(Jt={}))[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom",Jt;var e})();const ue=(()=>typeof globalThis<"u"&&globalThis||typeof global<"u"&&global||typeof window<"u"&&window||typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&self)(),Tr={},X=[],us=oe({\u0275cmp:oe}),Vl=oe({\u0275dir:oe}),jl=oe({\u0275pipe:oe}),Rh=oe({\u0275mod:oe}),yn=oe({\u0275fac:oe}),No=oe({__NG_ELEMENT_ID__:oe});let sb=0;function bt(e){return kn(()=>{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===Pt.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"+sb++,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 ne(e)||Ye(e)}function Fh(e){return null!==e}function Mt(e){return kn(()=>({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 Tr;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=bt;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 ne(e){return e[us]||null}function Ye(e){return e[Vl]||null}function Je(e){return e[jl]||null}function ht(e,t){const n=e[Rh]||null;if(!n&&!0===t)throw new Error(`Type ${ie(e)} does not have '\u0275mod' property.`);return n}const G=11;function at(e){return Array.isArray(e)&&"object"==typeof e[1]}function Lt(e){return Array.isArray(e)&&!0===e[1]}function $l(e){return 0!=(8&e.flags)}function hs(e){return 2==(2&e.flags)}function ps(e){return 1==(1&e.flags)}function Vt(e){return null!==e.template}function fb(e){return 0!=(256&e[2])}function ar(e,t){return e.hasOwnProperty(yn)?e[yn]:null}class gb{constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}}function It(){return Lh}function Lh(e){return e.type.prototype.ngOnChanges&&(e.setInput=yb),mb}function mb(){const e=jh(this),t=e?.current;if(t){const n=e.previous;if(n===Tr)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function yb(e,t,n,r){const o=jh(e)||function vb(e,t){return e[Vh]=t}(e,{previous:Tr,current:null}),i=o.current||(o.current={}),s=o.previous,a=this.declaredInputs[n],l=s[a];i[a]=new gb(l&&l.currentValue,t,s===Tr),e[r]=t}It.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 gs(e,t){return Se(t[e])}function gt(e,t){return Se(t[e.index])}function ql(e,t){return e.data[t]}function Or(e,t){return e[t]}function mt(e,t){const n=t[e];return at(n)?n:n[0]}function ms(e){return 64==(64&e[2])}function Ln(e,t){return null==t?null:e[t]}function Bh(e){e[18]=0}function Kl(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 j={lFrame:Qh(null),bindingsEnabled:!0};function $h(){return j.bindingsEnabled}function _(){return j.lFrame.lView}function Q(){return j.lFrame.tView}function jt(e){return j.lFrame.contextLView=e,e[8]}function Bt(e){return j.lFrame.contextLView=null,e}function Oe(){let e=Hh();for(;null!==e&&64===e.type;)e=e.parent;return e}function Hh(){return j.lFrame.currentTNode}function Xt(e,t){const n=j.lFrame;n.currentTNode=e,n.isParent=t}function Zl(){return j.lFrame.isParent}function Ql(){j.lFrame.isParent=!1}function Pr(){return j.lFrame.bindingIndex++}function _n(e){const t=j.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function Fb(e,t){const n=j.lFrame;n.bindingIndex=n.bindingRootIndex=e,Yl(t)}function Yl(e){j.lFrame.currentDirectiveIndex=e}function qh(){return j.lFrame.currentQueryIndex}function Xl(e){j.lFrame.currentQueryIndex=e}function Pb(e){const t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function Kh(e,t,n){if(n&F.SkipSelf){let o=t,i=e;for(;!(o=o.parent,null!==o||n&F.Host||(o=Pb(i),null===o||(i=i[15],10&o.type))););if(null===o)return!1;t=o,e=i}const r=j.lFrame=Zh();return r.currentTNode=t,r.lView=e,!0}function eu(e){const t=Zh(),n=e[1];j.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=j.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=j.lFrame;return j.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const Jh=Yh;function tu(){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 j.lFrame.selectedIndex}function Vn(e){j.lFrame.selectedIndex=e}function me(){const e=j.lFrame;return ql(e.tView,e.selectedIndex)}function kr(){j.lFrame.currentNamespace="svg"}function Vo(){!function jb(){j.lFrame.currentNamespace=null}()}function ys(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 jo{constructor(t,n,r){this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=r}}function Ds(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 ws(e){const t=ou;return ou=e,t}let Kb=0;const en={};function Uo(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=Es(e,t),i=e.injectorIndex;if(rp(o)){const s=Lr(o),a=Vr(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 Es(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 bs(e,t,n){!function Zb(e,t,n){let r;"string"==typeof n?r=n.charCodeAt(0)||0:n.hasOwnProperty(No)&&(r=n[No]),null==r&&(r=n[No]=Kb++);const o=255&r;t.data[e+(o>>5)]|=1<=0?255&t:Xb:t}(n);if("function"==typeof i){if(!Kh(t,e,r))return r&F.Host?sp(o,0,r):ap(t,n,r,o);try{const s=i(r);if(null!=s||r&F.Optional)return s;ss()}finally{Jh()}}else if("number"==typeof i){let s=null,a=su(e,t),l=-1,u=r&F.Host?t[16][6]:null;for((-1===a||r&F.SkipSelf)&&(l=-1===a?Es(e,t):t[a+8],-1!==l&&dp(r,!1)?(s=t[1],a=Lr(l),t=Vr(l,t)):a=-1);-1!==a;){const c=t[1];if(cp(i,a,c.data)){const d=Yb(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=Lr(l),t=Vr(l,t)):a=-1}}return o}function Yb(e,t,n,r,o,i){const s=t[1],a=s.data[e+8],c=Ms(a,s,n,null==r?hs(a)&&ou:r!=s&&0!=(3&a.type),o&F.Host&&i===a);return null!==c?$o(t,s,c,a):en}function Ms(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&&Vt(h)&&h.type===n)return l}return null}function $o(e,t,n,r){let o=e[n];const i=t.data;if(function Hb(e){return e instanceof jo}(o)){const s=o;s.resolving&&function QE(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=ws(s.canSeeViewProviders);s.resolving=!0;const l=s.injectImpl?Et(s.injectImpl):null;Kh(e,r,F.Default);try{o=e[n]=s.factory(void 0,i,e,r),t.firstCreatePass&&n>=r.directiveStart&&function Ub(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&&Et(l),ws(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[yn]||au(t),r=Object.prototype;let o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){const i=o[yn]||au(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function au(e){return Pl(e)?()=>{const t=au(k(e));return t&&t()}:ar(e)}function fp(e){const t=e[1],n=t.type;return 2===n?t.declTNode:1===n?e[6]:null}function Ho(e){return function Qb(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(Ur)?l[Ur]:Object.defineProperty(l,Ur,{value:[]})[Ur];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 T{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 yt(e,t){void 0===t&&(t=e);for(let n=0;nArray.isArray(n)?Dn(n,t):t(n))}function pp(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Ss(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function vt(e,t,n){let r=Gr(e,t);return r>=0?e[1|r]=n:(r=~r,function o0(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=Gr(e,t);if(n>=0)return e[1|n]}function Gr(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 O0=0;const Du="__ngContext__";function qe(e,t){at(t)?(e[Du]=t[20],function k0(e){vu.set(e[20],e)}(t)):e[Du]=t}function wu(e,t){return undefined(e,t)}function ti(e){const t=e[3];return Lt(t)?t[3]:t}function Eu(e){return jp(e[13])}function bu(e){return jp(e[4])}function jp(e){for(;null!==e&&!Lt(e);)e=e[4];return e}function qr(e,t,n,r,o){if(null!=r){let i,s=!1;Lt(r)?i=r:at(r)&&(s=!0,r=r[0]);const a=Se(r);0===e&&null!==n?null==o?zp(t,n,a):lr(t,n,a,o||null,!0):1===e&&null!==n?lr(t,n,a,o||null,!0):2===e?function Ru(e,t,n){const r=Rs(e,t);r&&function oM(e,t,n,r){e.removeChild(t,n,r)}(e,r,t,n)}(t,a,s):3===e&&t.destroyNode(a),null!=i&&function aM(e,t,n,r,o){const i=n[7];i!==Se(n)&&qr(t,e,r,i,o);for(let a=10;a0&&(e[n-1][4]=r[4]);const i=Ss(e,10+t);!function Q0(e,t){ni(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&&ni(e,t,n,3,null,null),function X0(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 rM(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 Os}()?.createHTML(e)||e}function tg(e){return function ku(){if(void 0===Ps&&(Ps=null,ue.trustedTypes))try{Ps=ue.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch{}return Ps}()?.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 Bn(e){return e instanceof og?e.changingThisBreaksApplicationSecurity:e}class _M{constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=""+t;try{const n=(new window.DOMParser).parseFromString(ur(t),"text/html").body;return null===n?this.inertDocumentHelper.getInertBodyElement(t):(n.removeChild(n.firstChild),n)}catch{return null}}}class DM{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=ur(t),n;const r=this.inertDocument.createElement("body");return r.innerHTML=ur(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 MM=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,SM=/([^\#-~ |!])/g;function cg(e){return e.replace(/&/g,"&").replace(MM,function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"}).replace(SM,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}let ks;function Bu(e){return"content"in e&&function AM(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 ii(){const e=_();return e&&e[12]}();return t?tg(t.sanitize(Ie.HTML,e)||""):function ri(e,t){const n=function vM(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(Bn(e)):function IM(e,t){let n=null;try{ks=ks||function ig(e){const t=new DM(e);return function CM(){try{return!!(new window.DOMParser).parseFromString(ur(""),"text/html")}catch{return!1}}()?new _M(t):t}(e);let r=t?String(t):"";n=ks.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=ks.getInertBodyElement(r)}while(r!==i);return ur((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 T("ENVIRONMENT_INITIALIZER"),hg=new T("INJECTOR",-1),pg=new T("INJECTOR_DEF_TYPES");class gg{get(t,n=qo){if(n===qo){const r=new Error(`NullInjectorError: No provider for ${ie(t)}!`);throw r.name="NullInjectorError",r}return n}}function PM(...e){return{\u0275providers:mg(0,e)}}function mg(e,...t){const n=[],r=new Set;let o;return Dn(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&&ne(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{Dn(i.imports,c=>{Hu(c,t,n,r)&&(u||(u=[]),u.push(c))})}finally{}void 0!==u&&yg(u,t)}if(!a){const u=ar(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||Dn(l,c=>{t.push(c)})}}return o!==e&&void 0!==e.providers}const kM=oe({provide:String,useValue:oe});function Gu(e){return null!==e&&"object"==typeof e&&kM in e}function cr(e){return"function"==typeof e}const zu=new T("Set Injector scope."),Ls={},VM={};let Wu;function Vs(){return void 0===Wu&&(Wu=new gg),Wu}class Un{}class Dg extends Un{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,Kr(void 0,this)),o.has("environment")&&this.records.set(Un,Kr(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,F.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=zr(this),r=Et(void 0);try{return t()}finally{zr(n),Et(r)}}get(t,n=qo,r=F.Default){this.assertNotDestroyed();const o=zr(this),i=Et(void 0);try{if(!(r&F.SkipSelf)){let a=this.records.get(t);if(void 0===a){const l=function HM(e){return"function"==typeof e||"object"==typeof e&&e instanceof T}(t)&&as(t);a=l&&this.injectableDefInScope(l)?Kr(qu(t),Ls):null,this.records.set(t,a)}if(null!=a)return this.hydrate(t,a)}return(r&F.Self?Vs():this.parent).get(t,n=r&F.Optional&&n===qo?null:n)}catch(s){if("NullInjectorError"===s.name){if((s[As]=s[As]||[]).unshift(ie(t)),o)throw s;return function y0(e,t,n,r){const o=e[As];throw t[vp]&&o.unshift(t[vp]),e.message=function v0(e,t,n,r=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let o=ie(t);if(Array.isArray(t))o=t.map(ie).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):ie(a)))}o=`{${i.join(", ")}}`}return`${n}${r?"("+r+")":""}[${o}]: ${e.replace(h0,"\n ")}`}("\n"+e.message,o,n,r),e.ngTokenPath=o,e[As]=null,e}(s,t,"R3InjectorError",this.source)}throw s}finally{Et(i),zr(o)}}resolveInjectorInitializers(){const t=zr(this),n=Et(void 0);try{const r=this.get($u.multi,X,F.Self);for(const o of r)o()}finally{zr(t),Et(n)}}toString(){const t=[],n=this.records;for(const r of n.keys())t.push(ie(r));return`R3Injector[${t.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new w(205,!1)}processProvider(t){let n=cr(t=k(t))?t:k(t&&t.provide);const r=function BM(e){return Gu(e)?Kr(void 0,e.useValue):Kr(Cg(e),Ls)}(t);if(cr(t)||!0!==t.multi)this.records.get(n);else{let o=this.records.get(n);o||(o=Kr(void 0,Ls,!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===Ls&&(n.value=VM,n.value=n.factory()),"object"==typeof n.value&&n.value&&function $M(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=as(e),n=null!==t?t.factory:ar(e);if(null!==n)return n;if(e instanceof T)throw new w(204,!1);if(e instanceof Function)return function jM(e){const t=e.length;if(t>0)throw function Wo(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(cr(e)){const o=k(e);return ar(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 UM(e){return!!e.deps}(e))return ar(o)||qu(o);r=()=>new o(...hu(e.deps))}return r}function Kr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function GM(e){return!!e.\u0275providers}function Ku(e,t){for(const n of e)Array.isArray(n)?Ku(n,t):GM(n)?Ku(n.\u0275providers,t):t(n)}class wg{}class qM{resolveComponentFactory(t){throw function WM(e){const t=Error(`No component factory found for ${ie(e)}. Did you add it to @NgModule.entryComponents?`);return t.ngComponent=e,t}(t)}}let si=(()=>{class e{}return e.NULL=new qM,e})();function KM(){return Zr(Oe(),_())}function Zr(e,t){return new _t(gt(e,t))}let _t=(()=>{class e{constructor(n){this.nativeElement=n}}return e.__NG_ELEMENT_ID__=KM,e})();function ZM(e){return e instanceof _t?e.nativeElement:e}class bg{}let wn=(()=>{class e{}return e.__NG_ELEMENT_ID__=()=>function QM(){const e=_(),n=mt(Oe().index,e);return(at(n)?n:e)[G]}(),e})(),YM=(()=>{class e{}return e.\u0275prov=L({token:e,providedIn:"root",factory:()=>null}),e})();class ai{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const JM=new ai("14.3.0"),Zu={};function Yu(e){return e.ngOriginalError}class Qr{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 uS(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(Ut(r))return!1;s=!0}}}}else{if(!s&&!Ut(r)&&!Ut(l))return!1;if(s&&Ut(l))continue;s=!1,r=l|1&r}}return Ut(r)||s}function Ut(e){return 0==(1&e)}function fS(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&&!Ut(s)&&(t+=xg(i,o),o=""),r=s,i=i||!Ut(r);n++}return""!==o&&(t+=xg(i,o)),t}const $={};function O(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&&vs(t,i,n)}else{const i=e.preOrderHooks;null!==i&&_s(t,i,0,n)}Vn(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,PM(e)];return r=r||("object"==typeof e?void 0:ie(e)),new Dg(i,t||Vs(),r||null,o)}let Dt=(()=>{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=F.Default){const n=_();return null===n?I(e,t):lp(Oe(),n,k(e),t)}function nc(){throw new Error("invalid")}function Bs(e,t){return e<<17|t<<2}function $t(e){return e>>17&32767}function rc(e){return 2|e}function bn(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{Vn(i)}}function tm(e,t,n){if($l(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 lI(e,t,n){if(n){if(t.exportAs)for(let r=0;r0&&Dc(n)}}function Dc(e){for(let r=Eu(e);null!==r;r=bu(r))for(let o=10;o0&&Dc(i)}const n=e[1].components;if(null!==n)for(let r=0;r0&&Dc(o)}}function gI(e,t){const n=mt(t,e),r=n[1];(function mI(e,t){for(let n=t.length;n-1&&(Iu(t,r),Ss(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(){Ws(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 J0(e,t){ni(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 yI extends li{constructor(t){super(t),this._view=t}detectChanges(){const t=this._view;Ws(t[1],t,t[8],!1)}checkNoChanges(){}get context(){return null}}class bc extends si{constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){const n=ne(t);return new ui(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 _I{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 ui extends wg{constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=function vS(e){return e.map(yS).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 Un?o:o?.injector;i&&null!==this.componentDef.getStandaloneInjector&&(i=this.componentDef.getStandaloneInjector(i)||i);const s=i?new _I(t,i):t,a=s.get(bg,null);if(null===a)throw new w(407,!1);const l=s.get(YM,null),u=a.createRenderer(null,this.componentDef),c=this.componentDef.selectors[0][0]||"div",d=r?function JS(e,t,n){return e.selectRootElement(t,n===Jt.ShadowDom)}(u,r,this.componentDef.encapsulation):Su(u,c,function vI(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=Hs(null,h,null,f,null,null,a,u,l,s,null);let g,m;eu(p);try{const v=function wI(e,t,n,r,o,i){const s=n[1];n[22]=e;const l=Xr(s,22,2,"#host",null),u=l.mergedAttrs=t.hostAttrs;null!==u&&(qs(l,u,!0),null!==e&&(Ds(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=Hs(n,nm(t),null,t.onPush?32:16,n[22],l,r,c,i||null,null,null);return s.firstCreatePass&&(bs(Uo(l,n),s,t.type),um(s,l),cm(l,n.length,1)),zs(n,d),n[22]=d}(d,this.componentDef,p,a,u);if(d)if(r)Ds(u,d,["ng-version",JM.full]);else{const{attrs:E,classes:y}=function _S(e){const t=[],n=[];let r=1,o=2;for(;r0&&Fu(u,d,y.join(" "))}if(m=ql(h,22),void 0!==n){const E=m.projection=[];for(let y=0;y=0;r--){const o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Cs(o.hostAttrs,n=Cs(n,o.hostAttrs))}}(r)}function Mc(e){return e===Tr?{}:e===X?[]:e}function SI(e,t){const n=e.viewQuery;e.viewQuery=n?(r,o)=>{t(r,o),n(r,o)}:t}function II(e,t){const n=e.contentQueries;e.contentQueries=n?(r,o,i)=>{t(r,o,i),n(r,o,i)}:t}function AI(e,t){const n=e.hostBindings;e.hostBindings=n?(r,o)=>{t(r,o),n(r,o)}:t}let Zs=null;function dr(){if(!Zs){const e=ue.Symbol;if(e&&e.iterator)Zs=e.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let n=0;na(Se(Y[r.index])):r.index;let A=null;if(!a&&l&&(A=function BI(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!==A)(A.__ngLastListenerFn__||A).__ngNextListenerFn__=i,A.__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,E,E+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,j.lFrame.contextLView))[8]}(e)}function Hm(e,t,n,r,o){const i=e[n+1],s=null===t;let a=r?$t(i):bn(i),l=!1;for(;0!==a&&(!1===l||s);){const c=e[a+1];WI(e[a],t)&&(l=!0,e[a+1]=r?ic(c):rc(c)),a=r?$t(c):bn(c)}l&&(e[n+1]=r?rc(i):ic(i))}function WI(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Gr(e,t)>=0}function Xs(e,t){return function Ht(e,t,n,r){const o=_(),i=Q(),s=_n(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 tA(e,t,n,r){const o=function Jl(e){const t=j.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=hi(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 nA(e,t,n){const r=n?t.classBindings:t.styleBindings;if(0!==bn(r))return e[$t(r)]}(e,t,r);void 0!==l&&Array.isArray(l)&&(l=xc(null,e,t,l[1],r),l=hi(l,t.attrs,r),function rA(e,t,n,r){e[$t(n?t.classBindings:t.styleBindings)]=r}(e,t,r,l))}else i=function oA(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=$t(e[a+1]);e[r+1]=Bs(f,a),0!==f&&(e[f+1]=oc(e[f+1],r)),e[a+1]=function VS(e,t){return 131071&e|t<<17}(e[a+1],r)}else e[r+1]=Bs(a,0),0!==a&&(e[a+1]=oc(e[a+1],r)),a=r;else e[r+1]=Bs(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 zI(e,t,n,r,o){const i=o?e.residualClasses:e.residualStyles;null!=i&&"string"==typeof t&&Gr(i,t)>=0&&(n[r+1]=ic(n[r+1]))}(t,c,e,r,i),s=Bs(a,l),i?t.classBindings=s:t.styleBindings=s}(o,i,t,n,s,r)}}(i,e,s,r),t!==$&&Ke(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];ea(function zg(e){return 1==(1&e)}(u)?ty(l,t,n,o,bn(u),s):void 0)||(ea(i)||function Gg(e){return 2==(2&e)}(u)&&(i=ty(l,null,n,o,a,s)),function lM(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,gs(et(),n),o,i))}(i,i.data[et()],o,o[G],e,o[s+1]=function aA(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=ie(Bn(e)))),e}(t,n),r,s)}(e,t,null,!0),Xs}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&&!ea(h)&&(h=cu(l,r)),ea(h)&&(a=h,s))return a;const p=e[o+1];o=s?$t(p):bn(p)}if(null!==t){let l=i?t.residualClasses:t.residualStyles;null!=l&&(a=cu(l,r))}return a}function ea(e){return void 0!==e}function R(e,t=""){const n=_(),r=Q(),o=e+22,i=r.firstCreatePass?Xr(r,o,1,t,null):r.data[o],s=n[o]=function Mu(e,t){return e.createText(t)}(n[G],t);Ns(r,n,s,i),Xt(i,!1)}function pi(e){return zt("",e,""),pi}function zt(e,t,n){const r=_(),o=function no(e,t,n,r){return Ke(e,Pr(),n)?t+U(n)+r:$}(r,e,t,n);return o!==$&&Mn(r,et(),o),zt}function Rc(e,t,n,r,o){const i=_(),s=ro(i,e,t,n,r,o);return s!==$&&Mn(i,et(),s),Rc}const ho="en-US";let Ey=ho;function Oc(e,t,n,r,o){if(e=k(e),Array.isArray(e))for(let i=0;i>20;if(cr(e)||!e.multi){const h=new jo(l,o,D),p=kc(a,t,o?c:c+f,d);-1===p?(bs(Uo(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){bs(Uo(u,s),i,a);const v=function MT(e,t,n,r,o){const i=new jo(e,n,D);return i.multi=[],i.index=t,i.componentProviders=0,Ky(i,o,r&&!n),i}(o?bT:ET,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=cr(t),i=function LM(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 wT(e,t,n){const r=Q();if(r.firstCreatePass){const o=Vt(e);Oc(n,r.data,r.blueprint,o,!0),Oc(t,r.data,r.blueprint,o,!1)}}(r,o?o(e):e,t)}}class pr{}class Zy{}class Qy extends pr{constructor(t,n){super(),this._parent=n,this._bootstrapComponents=[],this.destroyCbs=[],this.componentFactoryResolver=new bc(this);const r=ht(t);this._bootstrapComponents=En(r.bootstrap),this._r3Injector=kg(t,n,[{provide:pr,useValue:this},{provide:si,useValue:this.componentFactoryResolver}],ie(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 IT extends pr{constructor(t,n,r){super(),this.componentFactoryResolver=new bc(this),this.instance=null;const o=new Dg([...t,{provide:pr,useValue:this},{provide:si,useValue:this.componentFactoryResolver}],n||Vs(),r,new Set(["environment"]));this.injector=o,o.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}}function ia(e,t,n=null){return new IT(e,t,n).injector}let AT=(()=>{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?ia([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(Un))}),e})();function Yy(e){e.getStandaloneInjector=t=>t.get(AT).getOrCreateStandaloneInjector(e)}function ov(e,t,n,r,o,i){const s=t+n;return Ke(e,s,o)?function nn(e,t,n){return e[t]=n}(e,s+1,i?r.call(i,o):r(o)):function Di(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=Or(o,r);return function Ci(e,t){return e[1].data[t].pure}(o,r)?ov(o,function Xe(){const e=j.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 De=class JT 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 wt&&t.add(a),a}};function XT(){return this._results[dr()]()}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=dr(),r=Uc.prototype;r[n]||(r[n]=XT)}get changes(){return this._changes||(this._changes=new De)}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=yt(t);(this._changesDetected=!function n0(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r{class e{}return e.__NG_ELEMENT_ID__=nx,e})();const ex=Sn,tx=class extends ex{constructor(t,n,r){super(),this._declarationLView=t,this._declarationTContainer=n,this.elementRef=r}createEmbeddedView(t,n){const r=this._declarationTContainer.tViews,o=Hs(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 li(o)}};function nx(){return sa(Oe(),_())}function sa(e,t){return 4&e.type?new tx(t,e,Zr(e,t)):null}let Wt=(()=>{class e{}return e.__NG_ELEMENT_ID__=rx,e})();function rx(){return hv(Oe(),_())}const ox=Wt,dv=class extends ox{constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return Zr(this._hostTNode,this._hostLView)}get injector(){return new jr(this._hostTNode,this._hostLView)}get parentInjector(){const t=Es(this._hostTNode,this._hostLView);if(rp(t)){const n=Vr(t,this._hostLView),r=Lr(t);return new jr(n[1].data[r+8],n)}return new jr(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 zo(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 ui(ne(t)),u=r||this.parentInjector;if(!i&&null==l.ngModule){const f=(s?u:this.parentInjector).get(Un,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 Mb(e){return Lt(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 eM(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=ca,this.reject=ca,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(da,8))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Ei=new T("AppId",{providedIn:"root",factory:function jv(){return`${Xc()}${Xc()}${Xc()}`}});function Xc(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const Bv=new T("Platform Initializer"),ed=new T("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),Uv=new T("appBootstrapListener");let Nx=(()=>{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 In=new T("LocaleId",{providedIn:"root",factory:()=>we(In,F.Optional|F.SkipSelf)||function Fx(){return typeof $localize<"u"&&$localize.locale||ho}()});class Px{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(ht(n).declarations).reduce((s,a)=>{const l=ne(a);return l&&s.push(new ui(l)),s},[]);return new Px(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 Vx=(()=>Promise.resolve(0))();function nd(e){typeof Zone>"u"?Vx.then(()=>{e&&e.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",e)}class Le{constructor({enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new De(!1),this.onMicrotaskEmpty=new De(!1),this.onStable=new De(!1),this.onError=new De(!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 jx(){let e=ue.requestAnimationFrame,t=ue.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 $x(e){const t=()=>{!function Ux(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(ue,()=>{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(!Le.isInAngularZone())throw new w(909,!1)}static assertNotInAngularZone(){if(Le.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,Bx,ca,ca);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 Bx={};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 Hx{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new De,this.onMicrotaskEmpty=new De,this.onStable=new De,this.onError=new De}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 T(""),ha=new T("");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 Gx(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:()=>{Le.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(Le),I(sd),I(ha))},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 T("AllowMultipleToken"),ld=new T("PlatformDestroyListeners");class Kv{constructor(t,n){this.name=t,this.token=n}}function Qv(e,t,n=[]){const r=`Platform: ${t}`,o=new T(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 qx(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 Dt.create({name:t,providers:[{provide:zu,useValue:"platform"},{provide:ld,useValue:new Set([()=>zn=null])},...e]})}(a,r))}return function Zx(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 Hx:("zone.js"===e?void 0:e)||new Le(t),n}(r?.ngZone,function Xv(e){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:!(!e||!e.ngZoneEventCoalescing)||!1,shouldCoalesceRunChangeDetection:!(!e||!e.ngZoneRunCoalescing)||!1}}(r)),i=[{provide:Le,useValue:o}];return o.run(()=>{const s=Dt.create({providers:i,parent:this.injector,name:n.moduleType.name}),a=n.create(s),l=a.injector.get(Qr,null);if(!l)throw new w(402,!1);return o.runOutsideAngular(()=>{const u=o.onError.subscribe({next:c=>{l.handleError(c)}});a.onDestroy(()=>{ga(this._modules,a),u.unsubscribe()})}),function t_(e,t,n){try{const r=n();return fi(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(fa);return u.runInitializers(),u.donePromise.then(()=>(function by(e){dt(e,"Expected localeId to be defined"),"string"==typeof e&&(Ey=e.toLowerCase().replace(/_/g,"-"))}(a.injector.get(In,ho)||ho),this._moduleDoBootstrap(a),a))})})}bootstrapModule(n,r=[]){const o=n_({},r);return function zx(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(pa);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(Dt))},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 pa=(()=>{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(()=>{Le.assertNotInAngularZone(),nd(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,a.next(!0))})})});const u=this._zone.onUnstable.subscribe(()=>{Le.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{a.next(!1)}))});return()=>{l.unsubscribe(),u.unsubscribe()}});this.isStable=function qE(...e){const t=Ro(e),n=function BE(e,t){return"number"==typeof Rl(e)?e.pop():t}(e,1/0),r=e;return r.length?1===r.length?Ot(r[0]):Ar(n)(Me(r,t)):gn}(i,s.pipe(function KE(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 je((g,m)=>{u++,!d&&!c&&f();const v=l=l??t();m.add(()=>{u--,0===u&&!d&&!c&&(a=Nl(p,o))}),v.subscribe(m),!s&&u>0&&(s=new xo({next:E=>v.next(E),error:E=>{d=!0,f(),a=Nl(h,n,E),v.error(E)},complete:()=>{c=!0,f(),a=Nl(h,r),v.complete()}}),Ot(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(fa).done)throw!o&&function xr(e){const t=ne(e)||Ye(e)||Je(e);return null!==t&&t.standalone}(n),new w(405,false);let s;s=o?n:this._injector.get(si).resolveComponentFactory(n),this.componentTypes.push(s.componentType);const a=function Wx(e){return e.isBoundToModule}(s)?void 0:this._injector.get(pr),u=s.create(Dt.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),ga(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;ga(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),()=>ga(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(Le),I(Un),I(Qr))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();function ga(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}let o_=!0,ma=(()=>{class e{}return e.__NG_ELEMENT_ID__=Jx,e})();function Jx(e){return function Xx(e,t,n){if(hs(e)&&!n){const r=mt(e.index,t);return new li(r,r)}return 47&e.type?new li(t[16],t):null}(Oe(),_(),16==(16&e))}class u_{constructor(){}supports(t){return ci(t)}create(t){return new iR(t)}}const oR=(e,t)=>t;class iR{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||oR}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 sR(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 sR{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 aR{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 aR,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 uR(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 uR{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 _a([new u_])}let _a=(()=>{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 Yo,new Qo]]}}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 bi([new f_])}let bi=(()=>{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 Yo,new Qo]]}}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 fR=Qv(null,"core",[]);let hR=(()=>{class e{constructor(n){}}return e.\u0275fac=function(n){return new(n||e)(I(pa))},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({}),e})();function Tn(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}let Da=null;function an(){return Da}const ot=new T("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 yR(){return I(g_)}()},providedIn:"platform"}),e})();const vR=new T("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 an().getBaseHref(this._doc)}onPopState(n){const r=an().getGlobalEventTarget(this._doc,"window");return r.addEventListener("popstate",n,!1),()=>r.removeEventListener("popstate",n)}onHashChange(n){const r=an().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 _R(){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 xn(e){return e&&"?"!==e[0]?"?"+e:e}let mr=(()=>{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 T("appBaseHref");let __=(()=>{class e extends mr{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+xn(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){const s=this.prepareExternalUrl(o+xn(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){const s=this.prepareExternalUrl(o+xn(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})(),DR=(()=>{class e extends mr{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+xn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+xn(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 De,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+xn(r))}normalize(n){return e.stripTrailingSlash(function wR(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+xn(r)),o)}replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+xn(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=xn,e.joinWithSlash=gd,e.stripTrailingSlash=y_,e.\u0275fac=function(n){return new(n||e)(I(mr))},e.\u0275prov=L({token:e,factory:function(){return function CR(){return new md(I(mr))}()},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&&(ci(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 ${ie(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(_a),D(bi),D(_t),D(wn))},e.\u0275dir=V({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"},standalone:!0}),e})();class sN{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 F_=(()=>{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 sN(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),O_(a,o)}});for(let o=0,i=r.length;o{O_(r.get(o.currentIndex),o)})}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(D(Wt),D(Sn),D(_a))},e.\u0275dir=V({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"},standalone:!0}),e})();function O_(e,t){e.context.$implicit=t.item}let yr=(()=>{class e{constructor(n,r){this._viewContainer=n,this._context=new lN,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){P_("ngIfThen",n),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){P_("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(Sn))},e.\u0275dir=V({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"},standalone:!0}),e})();class lN{constructor(){this.$implicit=null,this.ngIf=null}}function P_(e,t){if(t&&!t.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${ie(t)}'.`)}let L_=(()=>{class e{constructor(n){this.differs=n,this.keyValues=[],this.compareFn=V_}transform(n,r=V_){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 TN(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(bi,16))},e.\u0275pipe=st({name:"keyvalue",type:e,pure:!1,standalone:!0}),e})();function V_(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=Mt({type:e}),e.\u0275inj=ft({}),e})();let VN=(()=>{class e{}return e.\u0275prov=L({token:e,providedIn:"root",factory:()=>new jN(I(ot),window)}),e})();class jN{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 BN(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=B_(this.window.history)||B_(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 B_(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}class U_{}class Nd extends class h1 extends class mR{}{constructor(){super(...arguments),this.supportsDOMEvents=!0}}{static makeCurrent(){!function gR(e){Da||(Da=e)}(new Nd)}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 p1(){return Ai=Ai||document.querySelector("base"),Ai?Ai.getAttribute("href"):null}();return null==n?null:function g1(e){Na=Na||document.createElement("a"),Na.setAttribute("href",e);const t=Na.pathname;return"/"===t.charAt(0)?t:`/${t}`}(n)}resetBaseElement(){Ai=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return T_(document.cookie,t)}}let Na,Ai=null;const W_=new T("TRANSITION_ID"),y1=[{provide:da,useFactory:function m1(e,t,n){return()=>{n.get(fa).donePromise.then(()=>{const r=an(),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 Fa=new T("EventManagerPlugins");let Oa=(()=>{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})(),Ti=(()=>{class e extends K_{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(Z_),this._hostNodes.delete(n)}onStylesAdded(n){this._hostNodes.forEach((r,o)=>{this._addStylesToHost(n,o,r)})}ngOnDestroy(){this._hostNodes.forEach(n=>n.forEach(Z_))}}return e.\u0275fac=function(n){return new(n||e)(I(ot))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();function Z_(e){an().remove(e)}const Fd={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/"},Od=/%COMP%/g;function Pa(e,t,n){for(let r=0;r{if("__ngUnwrap__"===t)return e;!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}let Pd=(()=>{class e{constructor(n,r,o){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.rendererByCompId=new Map,this.defaultRenderer=new kd(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 M1(this.eventManager,this.sharedStylesHost,r,this.appId),this.rendererByCompId.set(r.id,o)),o.applyToHost(n),o}case 1:case Jt.ShadowDom:return new S1(this.eventManager,this.sharedStylesHost,n,r);default:if(!this.rendererByCompId.has(r.id)){const o=Pa(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(Oa),I(Ti),I(Ei))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();class kd{constructor(t){this.eventManager=t,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(t,n){return n?document.createElementNS(Fd[n]||n,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,n){(eD(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(eD(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=Fd[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){const o=Fd[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,J_(r)):this.eventManager.addEventListener(t,n,J_(r))}}function eD(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class M1 extends kd{constructor(t,n,r,o){super(t),this.component=r;const i=Pa(o+"-"+r.id,r.styles,[]);n.addStyles(i),this.contentAttr=function w1(e){return"_ngcontent-%COMP%".replace(Od,e)}(o+"-"+r.id),this.hostAttr=function E1(e){return"_nghost-%COMP%".replace(Od,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 S1 extends kd{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=Pa(o.id,o.styles,[]);for(let s=0;s{class e extends q_{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 tD=["alt","control","meta","shift"],A1={"\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"},T1={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let x1=(()=>{class e extends q_{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(()=>an().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."),tD.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=A1[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"),tD.forEach(s=>{s!==o&&(0,T1[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 O1=Qv(fR,"browser",[{provide:ed,useValue:"browser"},{provide:Bv,useValue:function R1(){Nd.makeCurrent()},multi:!0},{provide:ot,useFactory:function F1(){return function fM(e){Pu=e}(document),document},deps:[]}]),oD=new T(""),iD=[{provide:ha,useClass:class v1{addToWindow(t){ue.getAngularTestability=(r,o=!0)=>{const i=t.findTestabilityInTree(r,o);if(null==i)throw new Error("Could not find testability for element.");return i},ue.getAllAngularTestabilities=()=>t.getAllTestabilities(),ue.getAllAngularRootElements=()=>t.getAllRootElements(),ue.frameworkStabilizers||(ue.frameworkStabilizers=[]),ue.frameworkStabilizers.push(r=>{const o=ue.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?an().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null)}},deps:[]},{provide:Wv,useClass:id,deps:[Le,sd,ha]},{provide:id,useClass:id,deps:[Le,sd,ha]}],sD=[{provide:zu,useValue:"root"},{provide:Qr,useFactory:function N1(){return new Qr},deps:[]},{provide:Fa,useClass:I1,multi:!0,deps:[ot,Le,ed]},{provide:Fa,useClass:x1,multi:!0,deps:[ot]},{provide:Pd,useClass:Pd,deps:[Oa,Ti,Ei]},{provide:bg,useExisting:Pd},{provide:K_,useExisting:Ti},{provide:Ti,useClass:Ti,deps:[ot]},{provide:Oa,useClass:Oa,deps:[Fa,Le]},{provide:U_,useClass:_1,deps:[]},[]];let P1=(()=>{class e{constructor(n){}static withServerTransition(n){return{ngModule:e,providers:[{provide:Ei,useValue:n.appId},{provide:W_,useExisting:Ei},y1]}}}return e.\u0275fac=function(n){return new(n||e)(I(oD,12))},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({providers:[...sD,...iD],imports:[ON,hR]}),e})(),aD=(()=>{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 L1(){return new aD(I(ot))}(),r},providedIn:"root"}),e})();function x(...e){return Me(e,Ro(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 ka=Ao(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"}),{isArray:z1}=Array,{getPrototypeOf:W1,prototype:q1,keys:K1}=Object;function cD(e){if(1===e.length){const t=e[0];if(z1(t))return{args:t,keys:null};if(function Z1(e){return e&&"object"==typeof e&&W1(e)===q1}(t)){const n=K1(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}const{isArray:Q1}=Array;function dD(e){return q(t=>function Y1(e,t){return Q1(t)?e(...t):e(t)}(e,t))}function fD(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function hD(...e){const t=Ro(e),n=Eh(e),{args:r,keys:o}=cD(e);if(0===r.length)return Me([],t);const i=new Ce(function J1(e,t,n=nr){return r=>{pD(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(Fe(r,d=>{i[l]=d,c||(c=!0,a--),a||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}(r,t,o?s=>fD(o,s):nr));return n?i.pipe(dD(n)):i}function pD(e,t,n){e?pn(n,e,t):t()}function jd(...e){return function X1(){return Ar(1)}()(Me(e,Ro(e)))}function gD(e){return new Ce(t=>{Ot(e()).subscribe(t)})}function xi(e,t){const n=ae(e)?e:()=>e,r=o=>o.error(n());return new Ce(t?o=>t.schedule(r,0,o):r)}function Bd(){return je((e,t)=>{let n=null;e._refCount++;const r=Fe(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 mD 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 wt;const n=this.getSubject();t.add(this.source.subscribe(Fe(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=wt.EMPTY)}return t}refCount(){return Bd()(this)}}function ln(e,t){return je((n,r)=>{let o=null,i=0,s=!1;const a=()=>s&&!o&&r.complete();n.subscribe(Fe(r,l=>{o?.unsubscribe();let u=0;const c=i++;Ot(e(l,c)).subscribe(o=Fe(r,d=>r.next(t?t(l,d,c,u++):d),()=>{o=null,a()}))},()=>{s=!0,a()}))})}function Ri(e){return e<=0?()=>gn:je((t,n)=>{let r=0;t.subscribe(Fe(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function Nn(e,t){return je((n,r)=>{let o=0;n.subscribe(Fe(r,i=>e.call(t,i,o++)&&r.next(i)))})}function La(e){return je((t,n)=>{let r=!1;t.subscribe(Fe(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function yD(e=tF){return je((t,n)=>{let r=!1;t.subscribe(Fe(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function tF(){return new ka}function qn(e,t){const n=arguments.length>=2;return r=>r.pipe(e?Nn((o,i)=>e(o,i,r)):nr,Ri(1),n?La(t):yD(()=>new ka))}function Kn(e,t){return ae(t)?$e(e,t,1):$e(e,1)}function Ze(e,t,n){const r=ae(e)||t||n?{next:e,error:t,complete:n}:e;return r?je((o,i)=>{var s;null===(s=r.subscribe)||void 0===s||s.call(r);let a=!0;o.subscribe(Fe(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)}))}):nr}function Zn(e){return je((t,n)=>{let i,r=null,o=!1;r=t.subscribe(Fe(n,void 0,void 0,s=>{i=Ot(e(s,Zn(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function nF(e,t,n,r,o){return(i,s)=>{let a=n,l=t,u=0;i.subscribe(Fe(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 vD(e,t){return je(nF(e,t,arguments.length>=2,!0))}function Ud(e){return e<=0?()=>gn:je((t,n)=>{let r=[];t.subscribe(Fe(n,o=>{r.push(o),e{for(const o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function _D(e,t){const n=arguments.length>=2;return r=>r.pipe(e?Nn((o,i)=>e(o,i,r)):nr,Ud(1),n?La(t):yD(()=>new ka))}function $d(e){return je((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}const W="primary",Ni=Symbol("RouteTitle");class iF{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 mo(e){return new iF(e)}function sF(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 CD(e){return Array.prototype.concat.apply([],e)}function wD(e){return e.length>0?e[e.length-1]:null}function He(e,t){for(const n in e)e.hasOwnProperty(n)&&t(e[n],n)}function Qn(e){return Ac(e)?e:fi(e)?Me(Promise.resolve(e)):x(e)}const uF={exact:function MD(e,t,n){if(!_r(e.segments,t.segments)||!Va(e.segments,t.segments,n)||e.numberOfChildren!==t.numberOfChildren)return!1;for(const r in t.children)if(!e.children[r]||!MD(e.children[r],t.children[r],n))return!1;return!0},subset:SD},ED={exact:function cF(e,t){return un(e,t)},subset:function dF(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(n=>DD(e[n],t[n]))},ignored:()=>!0};function bD(e,t,n){return uF[n.paths](e.root,t.root,n.matrixParams)&&ED[n.queryParams](e.queryParams,t.queryParams)&&!("exact"===n.fragment&&e.fragment!==t.fragment)}function SD(e,t,n){return ID(e,t,t.segments,n)}function ID(e,t,n,r){if(e.segments.length>n.length){const o=e.segments.slice(0,n.length);return!(!_r(o,n)||t.hasChildren()||!Va(o,n,r))}if(e.segments.length===n.length){if(!_r(e.segments,n)||!Va(e.segments,n,r))return!1;for(const o in t.children)if(!e.children[o]||!SD(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!!(_r(e.segments,o)&&Va(e.segments,o,r)&&e.children[W])&&ID(e.children[W],t,i,r)}}function Va(e,t,n){return t.every((r,o)=>ED[n](e[o].parameters,r.parameters))}class vr{constructor(t,n,r){this.root=t,this.queryParams=n,this.fragment=r}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=mo(this.queryParams)),this._queryParamMap}toString(){return pF.serialize(this)}}class K{constructor(t,n){this.segments=t,this.children=n,this.parent=null,He(n,(r,o)=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return ja(this)}}class Fi{constructor(t,n){this.path=t,this.parameters=n}get parameterMap(){return this._parameterMap||(this._parameterMap=mo(this.parameters)),this._parameterMap}toString(){return RD(this)}}function _r(e,t){return e.length===t.length&&e.every((n,r)=>n.path===t[r].path)}let AD=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return new Gd},providedIn:"root"}),e})();class Gd{parse(t){const n=new EF(t);return new vr(n.parseRootSegment(),n.parseQueryParams(),n.parseFragment())}serialize(t){const n=`/${Oi(t.root,!0)}`,r=function yF(e){const t=Object.keys(e).map(n=>{const r=e[n];return Array.isArray(r)?r.map(o=>`${Ba(n)}=${Ba(o)}`).join("&"):`${Ba(n)}=${Ba(r)}`}).filter(n=>!!n);return t.length?`?${t.join("&")}`:""}(t.queryParams);return`${n}${r}${"string"==typeof t.fragment?`#${function gF(e){return encodeURI(e)}(t.fragment)}`:""}`}}const pF=new Gd;function ja(e){return e.segments.map(t=>RD(t)).join("/")}function Oi(e,t){if(!e.hasChildren())return ja(e);if(t){const n=e.children[W]?Oi(e.children[W],!1):"",r=[];return He(e.children,(o,i)=>{i!==W&&r.push(`${i}:${Oi(o,!1)}`)}),r.length>0?`${n}(${r.join("//")})`:n}{const n=function hF(e,t){let n=[];return He(e.children,(r,o)=>{o===W&&(n=n.concat(t(r,o)))}),He(e.children,(r,o)=>{o!==W&&(n=n.concat(t(r,o)))}),n}(e,(r,o)=>o===W?[Oi(e.children[W],!1)]:[`${o}:${Oi(r,!1)}`]);return 1===Object.keys(e.children).length&&null!=e.children[W]?`${ja(e)}/${n[0]}`:`${ja(e)}/(${n.join("//")})`}}function TD(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Ba(e){return TD(e).replace(/%3B/gi,";")}function zd(e){return TD(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Ua(e){return decodeURIComponent(e)}function xD(e){return Ua(e.replace(/\+/g,"%20"))}function RD(e){return`${zd(e.path)}${function mF(e){return Object.keys(e).map(t=>`;${zd(t)}=${zd(e[t])}`).join("")}(e.parameters)}`}const vF=/^[^\/()?;=#]+/;function $a(e){const t=e.match(vF);return t?t[0]:""}const _F=/^[^=?&#]+/,CF=/^[^&#]+/;class EF{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=$a(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new w(4009,!1);return this.capture(t),new Fi(Ua(t),this.parseMatrixParams())}parseMatrixParams(){const t={};for(;this.consumeOptional(";");)this.parseParam(t);return t}parseParam(t){const n=$a(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const o=$a(this.remaining);o&&(r=o,this.capture(r))}t[Ua(n)]=Ua(r)}parseQueryParam(t){const n=function DF(e){const t=e.match(_F);return t?t[0]:""}(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const s=function wF(e){const t=e.match(CF);return t?t[0]:""}(this.remaining);s&&(r=s,this.capture(r))}const o=xD(n),i=xD(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=$a(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 Wd(e){return e.segments.length>0?new K([],{[W]:e}):e}function Ha(e){const t={};for(const r of Object.keys(e.children)){const i=Ha(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 Dr(e){return e instanceof vr}function IF(e,t,n,r,o){if(0===n.length)return yo(t.root,t.root,t.root,r,o);const i=function OD(e){if("string"==typeof e[0]&&1===e.length&&"/"===e[0])return new FD(!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 He(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 FD(n,t,r)}(n);return i.toRoot()?yo(t.root,t.root,new K([],{}),r,o):function s(l){const u=function TF(e,t,n,r){if(e.isAbsolute)return new vo(t.root,!0,0);if(-1===r)return new vo(n,n===t.root,0);return function PD(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 vo(r,!1,o-i)}(n,r+(Pi(e.commands[0])?0:1),e.numberOfDoubleDots)}(i,t,e.snapshot?._urlSegment,l),c=u.processChildren?Li(u.segmentGroup,u.index,i.commands):Kd(u.segmentGroup,u.index,i.commands);return yo(t.root,u.segmentGroup,c,r,o)}(e.snapshot?._lastPathIndex)}function Pi(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function ki(e){return"object"==typeof e&&null!=e&&e.outlets}function yo(e,t,n,r,o){let s,i={};r&&He(r,(l,u)=>{i[u]=Array.isArray(l)?l.map(c=>`${c}`):`${l}`}),s=e===t?n:ND(e,t,n);const a=Wd(Ha(s));return new vr(a,i,o)}function ND(e,t,n){const r={};return He(e.children,(o,i)=>{r[i]=o===t?n:ND(o,t,n)}),new K(e.segments,r)}class FD{constructor(t,n,r){if(this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=r,t&&r.length>0&&Pi(r[0]))throw new w(4003,!1);const o=r.find(ki);if(o&&o!==wD(r))throw new w(4004,!1)}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class vo{constructor(t,n,r){this.segmentGroup=t,this.processChildren=n,this.index=r}}function Kd(e,t,n){if(e||(e=new K([],{})),0===e.segments.length&&e.hasChildren())return Li(e,t,n);const r=function RF(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(ki(a))break;const l=`${a}`,u=r0&&void 0===l)break;if(l&&u&&"object"==typeof u&&void 0===u.outlets){if(!LD(l,u,s))return i;r+=2}else{if(!LD(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]=Kd(e.children[s],t,i))}),He(e.children,(i,s)=>{void 0===r[s]&&(o[s]=i)}),new K(e.segments,o)}}function Zd(e,t,n){const r=e.segments.slice(0,t);let o=0;for(;o{"string"==typeof n&&(n=[n]),null!==n&&(t[r]=Zd(new K([],{}),0,n))}),t}function kD(e){const t={};return He(e,(n,r)=>t[r]=`${n}`),t}function LD(e,t,n){return e==n.path&&un(t,n.parameters)}class Fn{constructor(t,n){this.id=t,this.url=n}}class Qd extends Fn{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 Cr extends Fn{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 Ga extends Fn{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 VD extends Fn{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 FF extends Fn{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 OF extends Fn{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 PF extends Fn{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 kF extends Fn{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 LF extends Fn{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 VF{constructor(t){this.route=t,this.type=9}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class jF{constructor(t){this.route=t,this.type=10}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class BF{constructor(t){this.snapshot=t,this.type=11}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class UF{constructor(t){this.snapshot=t,this.type=12}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class $F{constructor(t){this.snapshot=t,this.type=13}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class HF{constructor(t){this.snapshot=t,this.type=14}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class jD{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 BD{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=Yd(t,this._root);return n?n.children.map(r=>r.value):[]}firstChild(t){const n=Yd(t,this._root);return n&&n.children.length>0?n.children[0].value:null}siblings(t){const n=Jd(t,this._root);return n.length<2?[]:n[n.length-2].children.map(o=>o.value).filter(o=>o!==t)}pathFromRoot(t){return Jd(t,this._root).map(n=>n.value)}}function Yd(e,t){if(e===t.value)return t;for(const n of t.children){const r=Yd(e,n);if(r)return r}return null}function Jd(e,t){if(e===t.value)return[t];for(const n of t.children){const r=Jd(e,n);if(r.length)return r.unshift(t),r}return[]}class On{constructor(t,n){this.value=t,this.children=n}toString(){return`TreeNode(${this.value})`}}function _o(e){const t={};return e&&e.children.forEach(n=>t[n.value.outlet]=n),t}class UD extends BD{constructor(t,n){super(t),this.snapshot=n,Xd(this,t)}toString(){return this.snapshot.toString()}}function $D(e,t){const n=function zF(e,t){const s=new za([],{},{},"",{},W,t,null,e.root,-1,{});return new GD("",new On(s,[]))}(e,t),r=new Qt([new Fi("",{})]),o=new Qt({}),i=new Qt({}),s=new Qt({}),a=new Qt(""),l=new wr(r,o,s,a,i,W,t,n.root);return l.snapshot=n.root,new UD(new On(l,[]),n)}class wr{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[Ni]))??x(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=>mo(t)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(q(t=>mo(t)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function HD(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 WF(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 za{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?.[Ni],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=mo(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=mo(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class GD extends BD{constructor(t,n){super(n),this.url=t,Xd(this,n)}toString(){return zD(this._root)}}function Xd(e,t){t.value._routerState=e,t.children.forEach(n=>Xd(e,n))}function zD(e){const t=e.children.length>0?` { ${e.children.map(zD).join(", ")} } `:"";return`${e.value}${t}`}function ef(e){if(e.snapshot){const t=e.snapshot,n=e._futureSnapshot;e.snapshot=n,un(t.queryParams,n.queryParams)||e.queryParams.next(n.queryParams),t.fragment!==n.fragment&&e.fragment.next(n.fragment),un(t.params,n.params)||e.params.next(n.params),function aF(e,t){if(e.length!==t.length)return!1;for(let n=0;nun(n.parameters,t[r].parameters))}(e.url,t.url);return n&&!(!e.parent!=!t.parent)&&(!e.parent||tf(e.parent,t.parent))}function Vi(e,t,n){if(n&&e.shouldReuseRoute(t.value,n.value.snapshot)){const r=n.value;r._futureSnapshot=t.value;const o=function KF(e,t,n){return t.children.map(r=>{for(const o of n.children)if(e.shouldReuseRoute(r.value,o.value.snapshot))return Vi(e,r,o);return Vi(e,r)})}(e,t,n);return new On(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=>Vi(e,a)),s}}const r=function ZF(e){return new wr(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=>Vi(e,i));return new On(r,o)}}const nf="ngNavigationCancelingError";function WD(e,t){const{redirectTo:n,navigationBehaviorOptions:r}=Dr(t)?{redirectTo:t,navigationBehaviorOptions:void 0}:t,o=qD(!1,0,t);return o.url=n,o.navigationBehaviorOptions=r,o}function qD(e,t,n){const r=new Error("NavigationCancelingError: "+(e||""));return r[nf]=!0,r.cancellationCode=t,n&&(r.url=n),r}function KD(e){return ZD(e)&&Dr(e.url)}function ZD(e){return e&&e[nf]}class QF{constructor(){this.outlet=null,this.route=null,this.resolver=null,this.injector=null,this.children=new ji,this.attachRef=null}}let ji=(()=>{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 QF,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 Wa=!1;let rf=(()=>{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 De,this.deactivateEvents=new De,this.attachEvents=new De,this.detachEvents=new De,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,Wa);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new w(4012,Wa);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new w(4012,Wa);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,Wa);this._activatedRoute=n;const o=this.location,s=n._futureSnapshot.component,a=this.parentContexts.getOrCreateContext(this.name).children,l=new YF(n,a,o.injector);if(r&&function JF(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(ji),D(Wt),Ho("name"),D(ma),D(Un))},e.\u0275dir=V({type:e,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],standalone:!0}),e})();class YF{constructor(t,n,r){this.route=t,this.childContexts=n,this.parent=r}get(t,n){return t===wr?this.route:t===ji?this.childContexts:this.parent.get(t,n)}}let sf=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({type:e,selectors:[["ng-component"]],standalone:!0,features:[Yy],decls:1,vars:0,template:function(n,r){1&n&&Ae(0,"router-outlet")},dependencies:[rf],encapsulation:2}),e})();function QD(e,t){return e.providers&&!e._injector&&(e._injector=ia(e.providers,t,`Route: ${e.path}`)),e._injector??t}function lf(e){const t=e.children&&e.children.map(lf),n=t?{...e,children:t}:{...e};return!n.component&&!n.loadComponent&&(t||n.loadChildren)&&n.outlet&&n.outlet!==W&&(n.component=sf),n}function Ft(e){return e.outlet||W}function YD(e,t){const n=e.filter(r=>Ft(r)===t);return n.push(...e.filter(r=>Ft(r)!==t)),n}function Bi(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 rO{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),ef(this.futureState.root),this.activateChildRoutes(n,r,t)}deactivateChildRoutes(t,n,r){const o=_o(n);t.children.forEach(i=>{const s=i.value.outlet;this.deactivateRoutes(i,o[s],r),delete o[s]}),He(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=_o(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=_o(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=_o(n);t.children.forEach(i=>{this.activateRoutes(i,o[i.value.outlet],r),this.forwardEvent(new HF(i.value.snapshot))}),t.children.length&&this.forwardEvent(new UF(t.value.snapshot))}activateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(ef(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),ef(a.route.value),this.activateChildRoutes(t,null,s.children)}else{const a=Bi(o.snapshot),l=a?.get(si)??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 JD{constructor(t){this.path=t,this.route=this.path[this.path.length-1]}}class qa{constructor(t,n){this.component=t,this.route=n}}function oO(e,t,n){const r=e._root;return Ui(r,t?t._root:null,n,[r.value])}function Do(e,t){const n=Symbol(),r=t.get(e,n);return r===n?"function"!=typeof e||function tb(e){return null!==as(e)}(e)?t.get(e):e:r}function Ui(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=_o(t);return e.children.forEach(s=>{(function sO(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 aO(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!_r(e.url,t.url);case"pathParamsOrQueryParamsChange":return!_r(e.url,t.url)||!un(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!tf(e,t)||!un(e.queryParams,t.queryParams);default:return!tf(e,t)}}(s,i,i.routeConfig.runGuardsAndResolvers);l?o.canActivateChecks.push(new JD(r)):(i.data=s.data,i._resolvedData=s._resolvedData),Ui(e,t,i.component?a?a.children:null:n,r,o),l&&a&&a.outlet&&a.outlet.isActivated&&o.canDeactivateChecks.push(new qa(a.outlet.component,s))}else s&&$i(t,a,o),o.canActivateChecks.push(new JD(r)),Ui(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]}),He(i,(s,a)=>$i(s,n.getContext(a),o)),o}function $i(e,t,n){const r=_o(e),o=e.value;He(r,(i,s)=>{$i(i,o.component?t?t.children.getContext(s):null:t,n)}),n.canDeactivateChecks.push(new qa(o.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,o))}function Hi(e){return"function"==typeof e}function uf(e){return e instanceof ka||"EmptyError"===e?.name}const Ka=Symbol("INITIAL_VALUE");function Co(){return ln(e=>hD(e.map(t=>t.pipe(Ri(1),function eF(...e){const t=Ro(e);return je((n,r)=>{(t?jd(e,n,t):jd(e,n)).subscribe(r)})}(Ka)))).pipe(q(t=>{for(const n of t)if(!0!==n){if(n===Ka)return Ka;if(!1===n||n instanceof vr)return n}return!0}),Nn(t=>t!==Ka),Ri(1)))}function XD(e){return function oE(...e){return ih(e)}(Ze(t=>{if(Dr(t))throw WD(0,t)}),q(t=>!0===t))}const cf={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function eC(e,t,n,r,o){const i=df(e,t,n);return i.matched?function bO(e,t,n,r){const o=t.canMatch;return o&&0!==o.length?x(o.map(s=>{const a=Do(s,e);return Qn(function hO(e){return e&&Hi(e.canMatch)}(a)?a.canMatch(t,n):e.runInContext(()=>a(t,n)))})).pipe(Co(),XD()):x(!0)}(r=QD(t,r),t,n).pipe(q(s=>!0===s?i:{...cf})):x(i)}function df(e,t,n){if(""===t.path)return"full"===t.pathMatch&&(e.hasChildren()||n.length>0)?{...cf}:{matched:!0,consumedSegments:[],remainingSegments:n,parameters:{},positionalParamSegments:{}};const o=(t.matcher||sF)(n,e,t);if(!o)return{...cf};const i={};He(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 Za(e,t,n,r,o="corrected"){if(n.length>0&&function IO(e,t,n){return n.some(r=>Qa(e,t,r)&&Ft(r)!==W)}(e,n,r)){const s=new K(t,function SO(e,t,n,r){const o={};o[W]=r,r._sourceSegment=e,r._segmentIndexShift=t.length;for(const i of n)if(""===i.path&&Ft(i)!==W){const s=new K([],{});s._sourceSegment=e,s._segmentIndexShift=t.length,o[Ft(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 AO(e,t,n){return n.some(r=>Qa(e,t,r))}(e,n,r)){const s=new K(e.segments,function MO(e,t,n,r,o,i){const s={};for(const a of r)if(Qa(e,n,a)&&!o[Ft(a)]){const l=new K([],{});l._sourceSegment=e,l._segmentIndexShift="legacy"===i?e.segments.length:t.length,s[Ft(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 Qa(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function tC(e,t,n,r){return!!(Ft(e)===r||r!==W&&Qa(t,n,e))&&("**"===e.path||df(t,e,n).matched)}function nC(e,t,n){return 0===t.length&&!e.children[n]}const Ya=!1;class Ja{constructor(t){this.segmentGroup=t||null}}class rC{constructor(t){this.urlTree=t}}function Gi(e){return xi(new Ja(e))}function oC(e){return xi(new rC(e))}class NO{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=Za(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(Ha(i),this.urlTree.queryParams,this.urlTree.fragment))).pipe(Zn(i=>{if(i instanceof rC)return this.allowRedirects=!1,this.match(i.urlTree);throw i instanceof Ja?this.noMatchError(i):i}))}match(t){return this.expandSegmentGroup(this.injector,this.config,t.root,W).pipe(q(o=>this.createUrlTree(Ha(o),t.queryParams,t.fragment))).pipe(Zn(o=>{throw o instanceof Ja?this.noMatchError(o):o}))}noMatchError(t){return new w(4002,Ya)}createUrlTree(t,n,r){const o=Wd(t);return new vr(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=YD(n,i);return this.expandSegmentGroup(t,a,s,i).pipe(q(l=>({segment:l,outlet:i})))}),vD((i,s)=>(i[s.outlet]=s.segment,i),{}),_D())}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 Ja)return x(null);throw u}))),qn(a=>!!a),Zn((a,l)=>{if(uf(a))return nC(n,o,i)?x(new K([],{})):Gi(n);throw a}))}expandSegmentAgainstRoute(t,n,r,o,i,s,a){return tC(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):Gi(n):Gi(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("/")?oC(i):this.lineralizeSegments(r,i).pipe($e(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}=df(n,o,i);if(!a)return Gi(n);const d=this.applyRedirectCommands(l,o.redirectTo,c);return o.redirectTo.startsWith("/")?oC(d):this.lineralizeSegments(o,d).pipe($e(f=>this.expandSegment(t,n,r,f.concat(u),s,!1)))}matchSegmentAgainstRoute(t,n,r,o,i){return"**"===r.path?(t=QD(r,t),r.loadChildren?(r._loadedRoutes?x({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,{})))):x(new K(o,{}))):eC(n,r,o,t).pipe(ln(({matched:s,consumedSegments:a,remainingSegments:l})=>s?this.getChildConfig(t=r._injector??t,r,o).pipe($e(c=>{const d=c.injector??t,f=c.routes,{segmentGroup:h,slicedSegments:p}=Za(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 x(new K(a,{}));const m=Ft(r)===i;return this.expandSegment(d,g,f,p,m?W:i,!0).pipe(q(E=>new K(a.concat(E.segments),E.children)))})):Gi(n)))}getChildConfig(t,n,r){return n.children?x({routes:n.children,injector:t}):n.loadChildren?void 0!==n._loadedRoutes?x({routes:n._loadedRoutes,injector:n._loadedInjector}):function EO(e,t,n,r){const o=t.canLoad;return void 0===o||0===o.length?x(!0):x(o.map(s=>{const a=Do(s,e);return Qn(function uO(e){return e&&Hi(e.canLoad)}(a)?a.canLoad(t,n):e.runInContext(()=>a(t,n)))})).pipe(Co(),XD())}(t,n,r).pipe($e(o=>o?this.configLoader.loadChildren(t,n).pipe(Ze(i=>{n._loadedRoutes=i.routes,n._loadedInjector=i.injector})):function xO(e){return xi(qD(Ya,3))}())):x({routes:[],injector:t})}lineralizeSegments(t,n){let r=[],o=n.root;for(;;){if(r=r.concat(o.segments),0===o.numberOfChildren)return x(r);if(o.numberOfChildren>1||!o.children[W])return xi(new w(4e3,Ya));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 vr(i,this.createQueryParams(n.queryParams,this.urlTree.queryParams),n.fragment)}createQueryParams(t,n){const r={};return He(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 He(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,Ya);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 OO{}class LO{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=Za(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 za([],Object.freeze({}),Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,{},W,this.rootComponentType,null,this.urlTree.root,-1,{}),o=new On(r,n),i=new GD(this.url,o);return this.inheritParamsAndData(i._root),i}))}inheritParamsAndData(t){const n=t.value,r=HD(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=YD(n,o);return this.processSegmentGroup(t,s,i,o)}),vD((o,i)=>o&&i?(o.push(...i),o):null),function rF(e,t=!1){return je((n,r)=>{let o=0;n.subscribe(Fe(r,i=>{const s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}(o=>null!==o),La(null),_D(),q(o=>{if(null===o)return null;const i=iC(o);return function VO(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(uf(s))return nC(r,o,i)?x([]):x(null);throw s}))}processSegmentAgainstRoute(t,n,r,o,i){if(n.redirectTo||!tC(n,r,o,i))return x(null);let s;if("**"===n.path){const a=o.length>0?wD(o).parameters:{},l=aC(r)+o.length;s=x({snapshot:new za(o,a,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,uC(n),Ft(n),n.component??n._loadedComponent??null,n,sC(r),l,cC(n),l),consumedSegments:[],remainingSegments:[]})}else s=eC(r,n,o,t).pipe(q(({matched:a,consumedSegments:l,remainingSegments:u,parameters:c})=>{if(!a)return null;const d=aC(r)+l.length;return{snapshot:new za(l,c,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,uC(n),Ft(n),n.component??n._loadedComponent??null,n,sC(r),d,cC(n),d),consumedSegments:l,remainingSegments:u}}));return s.pipe(ln(a=>{if(null===a)return x(null);const{snapshot:l,consumedSegments:u,remainingSegments:c}=a;t=n._injector??t;const d=n._loadedInjector??t,f=function jO(e){return e.children?e.children:e.loadChildren?e._loadedRoutes:[]}(n),{segmentGroup:h,slicedSegments:p}=Za(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 On(l,m)]));if(0===f.length&&0===p.length)return x([new On(l,[])]);const g=Ft(n)===i;return this.processSegment(d,f,h,p,g?W:i).pipe(q(m=>null===m?null:[new On(l,m)]))}))}}function BO(e){const t=e.value.routeConfig;return t&&""===t.path&&void 0===t.redirectTo}function iC(e){const t=[],n=new Set;for(const r of e){if(!BO(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=iC(r.children);t.push(new On(r.value,o))}return t.filter(r=>!n.has(r))}function sC(e){let t=e;for(;t._sourceSegment;)t=t._sourceSegment;return t}function aC(e){let t=e,n=t._segmentIndexShift??0;for(;t._sourceSegment;)t=t._sourceSegment,n+=t._segmentIndexShift??0;return n-1}function uC(e){return e.data||{}}function cC(e){return e.resolve||{}}function dC(e){return"string"==typeof e.title||null===e.title}function ff(e){return ln(t=>{const n=e(t);return n?Me(n).pipe(q(()=>t)):x(t)})}let fC=(()=>{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[Ni]}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=L({token:e,factory:function(){return we(hC)},providedIn:"root"}),e})(),hC=(()=>{class e extends fC{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(aD))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class KO{}class QO extends class ZO{shouldDetach(t){return!1}store(t,n){}shouldAttach(t){return!1}retrieve(t){return null}shouldReuseRoute(t,n){return t.routeConfig===n.routeConfig}}{}const el=new T("",{providedIn:"root",factory:()=>({})}),hf=new T("ROUTES");let pf=(()=>{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 x(n._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(n);const r=Qn(n.loadComponent()).pipe(Ze(i=>{this.onLoadEndListener&&this.onLoadEndListener(n),n._loadedComponent=i}),$d(()=>{this.componentLoaders.delete(n)})),o=new mD(r,()=>new Yt).pipe(Bd());return this.componentLoaders.set(n,o),o}loadChildren(n,r){if(this.childrenLoaders.get(r))return this.childrenLoaders.get(r);if(r._loadedRoutes)return x({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=CD(l.get(hf,[],F.Self|F.Optional)));return{routes:u.map(lf),injector:l}}),$d(()=>{this.childrenLoaders.delete(r)})),s=new mD(i,()=>new Yt).pipe(Bd());return this.childrenLoaders.set(r,s),s}loadModuleFactoryOrRoutes(n){return Qn(n()).pipe($e(r=>r instanceof Zy||Array.isArray(r)?x(r):Me(this.compiler.compileModuleAsync(r))))}}return e.\u0275fac=function(n){return new(n||e)(I(Dt),I(td))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class JO{}class XO{shouldProcessUrl(t){return!0}extract(t){return t}merge(t,n){return t}}function eP(e){throw e}function tP(e,t,n){return t.parse("/")}const nP={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},rP={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function gC(){const e=we(AD),t=we(ji),n=we(md),r=we(Dt),o=we(td),i=we(hf,{optional:!0})??[],s=we(el,{optional:!0})??{},a=we(hC),l=we(fC,{optional:!0}),u=we(JO,{optional:!0}),c=we(KO,{optional:!0}),d=new Re(null,e,t,n,r,o,CD(i));return u&&(d.urlHandlingStrategy=u),c&&(d.routeReuseStrategy=c),d.titleStrategy=l??a,function oP(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 Re=(()=>{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=eP,this.malformedUriErrorHandler=tP,this.navigated=!1,this.lastSuccessfulId=-1,this.afterPreactivation=()=>x(void 0),this.urlHandlingStrategy=new XO,this.routeReuseStrategy=new QO,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.configLoader=s.get(pf),this.configLoader.onLoadEndListener=f=>this.triggerEvent(new jF(f)),this.configLoader.onLoadStartListener=f=>this.triggerEvent(new VF(f)),this.ngModule=s.get(pr),this.console=s.get(Nx);const d=s.get(Le);this.isNgZoneEnabled=d instanceof Le&&Le.isInAngularZone(),this.resetConfig(l),this.currentUrlTree=function lF(){return new vr(new K([],{}),{},null)}(),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.routerState=$D(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(Nn(o=>0!==o.id),q(o=>({...o,extractedUrl:this.urlHandlingStrategy.extract(o.rawUrl)})),ln(o=>{let i=!1,s=!1;return x(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}}),ln(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 mC(a.source)&&(this.browserUrlTree=a.extractedUrl),x(a).pipe(ln(d=>{const f=this.transitions.getValue();return r.next(new Qd(d.id,this.serializeUrl(d.extractedUrl),d.source,d.restoredState)),f!==this.transitions.getValue()?gn:Promise.resolve(d)}),function FO(e,t,n,r){return ln(o=>function RO(e,t,n,r,o){return new NO(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 $O(e,t,n,r,o,i){return $e(s=>function kO(e,t,n,r,o,i,s="emptyOnly",a="legacy"){return new LO(e,t,n,r,o,s,a,i).recognize().pipe(ln(l=>null===l?function PO(e){return new Ce(t=>t.error(e))}(new OO):x(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 FF(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 Qd(f,this.serializeUrl(h),p,g);r.next(v);const E=$D(h,this.rootComponentType).snapshot;return x(o={...a,targetSnapshot:E,urlAfterRedirects:h,extras:{...m,skipLocationChange:!1,replaceUrl:!1}})}return this.rawUrlTree=a.rawUrl,a.resolve(null),gn}),Ze(a=>{const l=new OF(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot);this.triggerEvent(l)}),q(a=>o={...a,guards:oO(a.targetSnapshot,a.currentSnapshot,this.rootContexts)}),function gO(e,t){return $e(n=>{const{targetSnapshot:r,currentSnapshot:o,guards:{canActivateChecks:i,canDeactivateChecks:s}}=n;return 0===s.length&&0===i.length?x({...n,guardsResult:!0}):function mO(e,t,n,r){return Me(e).pipe($e(o=>function wO(e,t,n,r,o){const i=t&&t.routeConfig?t.routeConfig.canDeactivate:null;return i&&0!==i.length?x(i.map(a=>{const l=Bi(t)??o,u=Do(a,l);return Qn(function fO(e){return e&&Hi(e.canDeactivate)}(u)?u.canDeactivate(e,t,n,r):l.runInContext(()=>u(e,t,n,r))).pipe(qn())})).pipe(Co()):x(!0)}(o.component,o.route,n,t,r)),qn(o=>!0!==o,!0))}(s,r,o,e).pipe($e(a=>a&&function lO(e){return"boolean"==typeof e}(a)?function yO(e,t,n,r){return Me(t).pipe(Kn(o=>jd(function _O(e,t){return null!==e&&t&&t(new BF(e)),x(!0)}(o.route.parent,r),function vO(e,t){return null!==e&&t&&t(new $F(e)),x(!0)}(o.route,r),function CO(e,t,n){const r=t[t.length-1],i=t.slice(0,t.length-1).reverse().map(s=>function iO(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=>gD(()=>x(s.guards.map(l=>{const u=Bi(s.node)??n,c=Do(l,u);return Qn(function dO(e){return e&&Hi(e.canActivateChild)}(c)?c.canActivateChild(r,e):u.runInContext(()=>c(r,e))).pipe(qn())})).pipe(Co())));return x(i).pipe(Co())}(e,o.path,n),function DO(e,t,n){const r=t.routeConfig?t.routeConfig.canActivate:null;if(!r||0===r.length)return x(!0);const o=r.map(i=>gD(()=>{const s=Bi(t)??n,a=Do(i,s);return Qn(function cO(e){return e&&Hi(e.canActivate)}(a)?a.canActivate(t,e):s.runInContext(()=>a(t,e))).pipe(qn())}));return x(o).pipe(Co())}(e,o.route,n))),qn(o=>!0!==o,!0))}(r,i,e,t):x(a)),q(a=>({...n,guardsResult:a})))})}(this.ngModule.injector,a=>this.triggerEvent(a)),Ze(a=>{if(o.guardsResult=a.guardsResult,Dr(a.guardsResult))throw WD(0,a.guardsResult);const l=new PF(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);this.triggerEvent(l)}),Nn(a=>!!a.guardsResult||(this.restoreHistory(a),this.cancelNavigationTransition(a,"",3),!1)),ff(a=>{if(a.guards.canActivateChecks.length)return x(a).pipe(Ze(l=>{const u=new kF(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}),ln(l=>{let u=!1;return x(l).pipe(function HO(e,t){return $e(n=>{const{targetSnapshot:r,guards:{canActivateChecks:o}}=n;if(!o.length)return x(n);let i=0;return Me(o).pipe(Kn(s=>function GO(e,t,n,r){const o=e.routeConfig,i=e._resolve;return void 0!==o?.title&&!dC(o)&&(i[Ni]=o.title),function zO(e,t,n,r){const o=function WO(e){return[...Object.keys(e),...Object.getOwnPropertySymbols(e)]}(e);if(0===o.length)return x({});const i={};return Me(o).pipe($e(s=>function qO(e,t,n,r){const o=Bi(t)??r,i=Do(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}))),Ud(1),function oF(e){return q(()=>e)}(i),Zn(s=>uf(s)?gn:xi(s)))}(i,e,t,r).pipe(q(s=>(e._resolvedData=s,e.data=HD(e,n).resolve,o&&dC(o)&&(e.data[Ni]=o.title),null)))}(s.route,r,e,t)),Ze(()=>i++),Ud(1),$e(s=>i===o.length?x(n):gn))})}(this.paramsInheritanceStrategy,this.ngModule.injector),Ze({next:()=>u=!0,complete:()=>{u||(this.restoreHistory(l),this.cancelNavigationTransition(l,"",2))}}))}),Ze(l=>{const u=new LF(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}))}),ff(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 hD(l(a.targetSnapshot.root)).pipe(La(),Ri(1))}),ff(()=>this.afterPreactivation()),q(a=>{const l=function qF(e,t,n){const r=Vi(e,t._root,n?n._root:void 0);return new UD(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 rO(t,r.targetRouterState,r.currentRouterState,n).activate(e),r)))(this.rootContexts,this.routeReuseStrategy,a=>this.triggerEvent(a)),Ze({next(){i=!0},complete(){i=!0}}),$d(()=>{i||s||this.cancelNavigationTransition(o,"",1),this.currentNavigation?.id===o.id&&(this.currentNavigation=null)}),Zn(a=>{if(s=!0,ZD(a)){KD(a)||(this.navigated=!0,this.restoreHistory(o,!0));const l=new Ga(o.id,this.serializeUrl(o.extractedUrl),a.message,a.cancellationCode);if(r.next(l),KD(a)){const u=this.urlHandlingStrategy.merge(a.url,this.rawUrlTree),c={skipLocationChange:o.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||mC(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 VD(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 gn}))}))}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(lf),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)),IF(u,this.currentUrlTree,n,d,c??null)}navigateByUrl(n,r={skipLocationChange:!1}){const o=Dr(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 iP(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 Cr(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 Ga(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 gC()},providedIn:"root"}),e})();function mC(e){return"imperative"!==e}let nl=(()=>{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=Tn(n)}get preserveFragment(){return this._preserveFragment}set skipLocationChange(n){this._skipLocationChange=Tn(n)}get skipLocationChange(){return this._skipLocationChange}set replaceUrl(n){this._replaceUrl=Tn(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(Re),D(wr),Ho("tabindex"),D(wn),D(_t))},e.\u0275dir=V({type:e,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(n,r){1&n&&ee("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:[It]}),e})();class yC{}let lP=(()=>{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(Nn(n=>n instanceof Cr),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=ia(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(Ar())}preloadConfig(n,r){return this.preloadingStrategy.preload(r,()=>{let o;o=r.loadChildren&&void 0===r.canLoad?this.loader.loadChildren(n,r):x(null);const i=o.pipe($e(s=>null===s?x(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(Ar()):i})}}return e.\u0275fac=function(n){return new(n||e)(I(Re),I(td),I(Un),I(yC),I(pf))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const mf=new T("");let vC=(()=>{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 Qd?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=n.navigationTrigger,this.restoredId=n.restoredState?n.restoredState.navigationId:0):n instanceof Cr&&(this.lastId=n.id,this.scheduleScrollEvent(n,this.router.parseUrl(n.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(n=>{n instanceof jD&&(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 jD(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 wo(e,t){return{\u0275kind:e,\u0275providers:t}}function yf(e){return[{provide:hf,multi:!0,useValue:e}]}function DC(){const e=we(Dt);return t=>{const n=e.get(pa);if(t!==n.components[0])return;const r=e.get(Re),o=e.get(CC);1===e.get(vf)&&r.initialNavigation(),e.get(wC,null,F.Optional)?.setUpPreloading(),e.get(mf,null,F.Optional)?.init(),r.resetRootComponentType(n.componentTypes[0]),o.closed||(o.next(),o.unsubscribe())}}const CC=new T("",{factory:()=>new Yt}),vf=new T("",{providedIn:"root",factory:()=>1});const wC=new T("");function fP(e){return wo(0,[{provide:wC,useExisting:lP},{provide:yC,useExisting:e}])}const EC=new T("ROUTER_FORROOT_GUARD"),hP=[md,{provide:AD,useClass:Gd},{provide:Re,useFactory:gC},ji,{provide:wr,useFactory:function _C(e){return e.routerState.root},deps:[Re]},pf];function pP(){return new Kv("Router",Re)}let bC=(()=>{class e{constructor(n){}static forRoot(n,r){return{ngModule:e,providers:[hP,[],yf(n),{provide:EC,useFactory:vP,deps:[[Re,new Qo,new Yo]]},{provide:el,useValue:r||{}},r?.useHash?{provide:mr,useClass:DR}:{provide:mr,useClass:__},{provide:mf,useFactory:()=>{const e=we(Re),t=we(VN),n=we(el);return n.scrollOffset&&t.setOffset(n.scrollOffset),new vC(e,t,n)}},r?.preloadingStrategy?fP(r.preloadingStrategy).\u0275providers:[],{provide:Kv,multi:!0,useFactory:pP},r?.initialNavigation?_P(r):[],[{provide:MC,useFactory:DC},{provide:Uv,multi:!0,useExisting:MC}]]}}static forChild(n){return{ngModule:e,providers:[yf(n)]}}}return e.\u0275fac=function(n){return new(n||e)(I(EC,8))},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({imports:[sf]}),e})();function vP(e){return"guarded"}function _P(e){return["disabled"===e.initialNavigation?wo(3,[{provide:da,multi:!0,useFactory:()=>{const t=we(Re);return()=>{t.setUpLocationChangeListener()}}},{provide:vf,useValue:2}]).\u0275providers:[],"enabledBlocking"===e.initialNavigation?wo(2,[{provide:vf,useValue:0},{provide:da,multi:!0,deps:[Dt],useFactory:t=>{const n=t.get(vR,Promise.resolve());let r=!1;return()=>n.then(()=>new Promise(i=>{const s=t.get(Re),a=t.get(CC);(function o(i){t.get(Re).events.pipe(Nn(a=>a instanceof Cr||a instanceof Ga||a instanceof VD),q(a=>a instanceof Cr||a instanceof Ga&&(0===a.code||1===a.code)&&null),Nn(a=>null!==a),Ri(1)).subscribe(()=>{i()})})(()=>{i(!0),r=!0}),s.afterPreactivation=()=>(i(!0),r||a.closed?x(void 0):a),s.initialNavigation()}))}}]).\u0275providers:[]]}const MC=new T("");let CP=(()=>{class e{constructor(){this.title="djongo-FE"}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({type:e,selectors:[["app-root"]],decls:1,vars:0,template:function(n,r){1&n&&Ae(0,"router-outlet")},dependencies:[rf]}),e})();var Ue=(()=>{return(e=Ue||(Ue={})).createAccount="create-account/",e.login="login/",e.dashboard="dashboard/",e.enterprise="enterprise/",e.contactUs="contact-us/",Ue;var e})(),zi=(()=>{return(e=zi||(zi={})).intention="intention/",e.payment="payment/",zi;var e})(),il=(()=>{return(e=il||(il={}))[e.OK=0]="OK",e[e.EMAIL_EXISTS=1]="EMAIL_EXISTS",e[e.OTHER=2]="OTHER",il;var e})(),Eo=(()=>{return(e=Eo||(Eo={}))[e.OK=0]="OK",e[e.STRIPE_REJ=1]="STRIPE_REJ",e[e.OTHER=2]="OTHER",Eo;var e})();class SC{}class IC{}class cn{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 cn?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 cn;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof cn?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 wP{encodeKey(t){return AC(t)}encodeValue(t){return AC(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}}const bP=/%(\d[a-f0-9])/gi,MP={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function AC(e){return encodeURIComponent(e).replace(bP,(t,n)=>MP[n]??t)}function sl(e){return`${e}`}class dn{constructor(t={}){if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new wP,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function EP(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 dn({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 SP{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 TC(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function xC(e){return typeof Blob<"u"&&e instanceof Blob}function RC(e){return typeof FormData<"u"&&e instanceof FormData}class Wi{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 IP(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 cn),this.context||(this.context=new SP),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 Wi(n,r,i,{params:u,headers:l,context:c,reportProgress:a,responseType:o,withCredentials:s})}}var Ne=(()=>((Ne=Ne||{})[Ne.Sent=0]="Sent",Ne[Ne.UploadProgress=1]="UploadProgress",Ne[Ne.ResponseHeader=2]="ResponseHeader",Ne[Ne.DownloadProgress=3]="DownloadProgress",Ne[Ne.Response=4]="Response",Ne[Ne.User=5]="User",Ne))();class _f{constructor(t,n=200,r="OK"){this.headers=t.headers||new cn,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 Df extends _f{constructor(t={}){super(t),this.type=Ne.ResponseHeader}clone(t={}){return new Df({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 _f{constructor(t={}){super(t),this.type=Ne.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 NC extends _f{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 Cf(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 FC=(()=>{class e{constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof Wi)i=n;else{let l,u;l=o.headers instanceof cn?o.headers:new cn(o.headers),o.params&&(u=o.params instanceof dn?o.params:new dn({fromObject:o.params})),i=new Wi(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=x(i).pipe(Kn(l=>this.handler.handle(l)));if(n instanceof Wi||"events"===o.observe)return s;const a=s.pipe(Nn(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 dn).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,Cf(o,r))}post(n,r,o={}){return this.request("POST",n,Cf(o,r))}put(n,r,o={}){return this.request("PUT",n,Cf(o,r))}}return e.\u0275fac=function(n){return new(n||e)(I(SC))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();class OC{constructor(t,n){this.next=t,this.interceptor=n}handle(t){return this.interceptor.intercept(t,this.next)}}const PC=new T("HTTP_INTERCEPTORS");let TP=(()=>{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 xP=/^\)\]\}',?\n/;let kC=(()=>{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 cn(o.getAllResponseHeaders()),g=function RP(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 Df({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 E=p>=200&&p<300;if("json"===n.responseType&&"string"==typeof v){const y=v;v=v.replace(xP,"");try{v=""!==v?JSON.parse(v):null}catch(A){v=y,E&&(E=!1,v={error:A,text:v})}}E?(r.next(new al({body:v,headers:h,status:p,statusText:g,url:m||void 0})),r.complete()):r.error(new NC({error:v,headers:h,status:p,statusText:g,url:m||void 0}))},u=h=>{const{url:p}=a(),g=new NC({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:Ne.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:Ne.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:Ne.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(U_))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})();const wf=new T("XSRF_COOKIE_NAME"),Ef=new T("XSRF_HEADER_NAME");class LC{}let NP=(()=>{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(wf))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),bf=(()=>{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(LC),I(Ef))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),FP=(()=>{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(PC,[]);this.chain=r.reduceRight((o,i)=>new OC(o,i),this.backend)}return this.chain.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(I(IC),I(Dt))},e.\u0275prov=L({token:e,factory:e.\u0275fac}),e})(),OP=(()=>{class e{static disable(){return{ngModule:e,providers:[{provide:bf,useClass:TP}]}}static withOptions(n={}){return{ngModule:e,providers:[n.cookieName?{provide:wf,useValue:n.cookieName}:[],n.headerName?{provide:Ef,useValue:n.headerName}:[]]}}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({providers:[bf,{provide:PC,useExisting:bf,multi:!0},{provide:LC,useClass:NP},{provide:wf,useValue:"XSRF-TOKEN"},{provide:Ef,useValue:"X-XSRF-TOKEN"}]}),e})(),PP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({providers:[FC,{provide:SC,useClass:FP},kC,{provide:IC,useExisting:kC}],imports:[OP.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]}),e})();const qi_baseUrl="https://api.djongomapper.com/mapper/";class VC{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 fn=(()=>{class e{constructor(n){this.http=n}post(n,r){let o={"Content-Type":"text/plain"},i=VC.get("csrftoken");i&&(o["X-CSRFTOKEN"]=i);let s={withCredentials:!0};return s.headers=new cn(o),this.http.post(qi_baseUrl+n,r,s)}postForm(n,r){let o=new dn({fromObject:r}),i=VC.get("csrftoken");return i&&(o=o.set("csrfmiddlewaretoken",i)),this.http.post(qi_baseUrl+n,o,{withCredentials:!0})}get(n,r){let o={withCredentials:!0};return r&&(o.params=new dn({fromObject:r})),this.http.get(qi_baseUrl+n,o)}}return e.\u0275fac=function(n){return new(n||e)(I(FC))},e.\u0275prov=L({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Mf={dashboard:[{provide:fn,useClass:fn}],createAccount:[{provide:fn,useClass:fn}],contactUs:[{provide:fn,useClass:fn}]};class Sf{constructor(t){this.name=t.name,this.id=t.id,this.required=t.required,this.ngClass=t.ngClass}}class If extends Sf{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 jC extends If{constructor(t){t.required=!0,t.type="password",super(t)}}class kP extends If{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 BC{constructor(t){this.type=t.type,this.label=t.label,this.attr=t.attr,this.errors=t.errors||{}}}class ll extends BC{constructor(t){t.type="input",super(t)}}class UC extends BC{constructor(t){t.type="select",super(t),this.options=t.options}}let $C=(()=>{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(wn),D(_t))},e.\u0275dir=V({type:e}),e})(),Er=(()=>{class e extends $C{}return e.\u0275fac=function(){let t;return function(r){return(t||(t=We(e)))(r||e)}}(),e.\u0275dir=V({type:e,features:[re]}),e})();const hn=new T("NgValueAccessor"),jP={provide:hn,useExisting:le(()=>br),multi:!0},UP=new T("CompositionEventMode");let br=(()=>{class e extends $C{constructor(n,r,o){super(n,r),this._compositionMode=o,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function BP(){const e=an()?an().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(wn),D(_t),D(UP,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&&ee("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:[se([jP]),re]}),e})();function Yn(e){return null==e||("string"==typeof e||Array.isArray(e))&&0===e.length}const Qe=new T("NgValidators"),Jn=new T("NgAsyncValidators");function qC(e){return Yn(e.value)?{required:!0}:null}function ul(e){return null}function XC(e){return null!=e}function ew(e){return fi(e)?Me(e):e}function tw(e){let t={};return e.forEach(n=>{t=null!=n?{...t,...n}:t}),0===Object.keys(t).length?null:t}function nw(e,t){return t.map(n=>n(e))}function rw(e){return e.map(t=>function GP(e){return!e.validate}(t)?t:n=>t.validate(n))}function Af(e){return null!=e?function ow(e){if(!e)return null;const t=e.filter(XC);return 0==t.length?null:function(n){return tw(nw(n,t))}}(rw(e)):null}function Tf(e){return null!=e?function iw(e){if(!e)return null;const t=e.filter(XC);return 0==t.length?null:function(n){return function LP(...e){const t=Eh(e),{args:n,keys:r}=cD(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?fD(r,a):a),i.complete())}))}});return t?o.pipe(dD(t)):o}(nw(n,t).map(ew)).pipe(q(tw))}}(rw(e)):null}function sw(e,t){return null===e?[t]:Array.isArray(e)?[...e,t]:[e,t]}function xf(e){return e?Array.isArray(e)?e:[e]:[]}function cl(e,t){return Array.isArray(e)?e.includes(t):e===t}function uw(e,t){const n=xf(t);return xf(e).forEach(o=>{cl(n,o)||n.push(o)}),n}function cw(e,t){return xf(t).filter(n=>!cl(e,n))}class dw{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 dw{get formDirective(){return null}get path(){return null}}class Xn extends dw{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class fw{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 Ki=(()=>{class e extends fw{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(D(Xn,2))},e.\u0275dir=V({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(n,r){2&n&&Xs("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:[re]}),e})(),Zi=(()=>{class e extends fw{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&&Xs("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:[re]}),e})();const Qi="VALID",fl="INVALID",bo="PENDING",Yi="DISABLED";function Of(e){return(hl(e)?e.validators:e)||null}function pw(e){return Array.isArray(e)?Af(e):e||null}function Pf(e,t){return(hl(t)?t.asyncValidators:e)||null}function gw(e){return Array.isArray(e)?Tf(e):e||null}function hl(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class vw{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=pw(this._rawValidators),this._composedAsyncValidatorFn=gw(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===Qi}get invalid(){return this.status===fl}get pending(){return this.status==bo}get disabled(){return this.status===Yi}get enabled(){return this.status!==Yi}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=pw(t)}setAsyncValidators(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=gw(t)}addValidators(t){this.setValidators(uw(t,this._rawValidators))}addAsyncValidators(t){this.setAsyncValidators(uw(t,this._rawAsyncValidators))}removeValidators(t){this.setValidators(cw(t,this._rawValidators))}removeAsyncValidators(t){this.setAsyncValidators(cw(t,this._rawAsyncValidators))}hasValidator(t){return cl(this._rawValidators,t)}hasAsyncValidator(t){return cl(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=bo,!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=Yi,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=Qi,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===Qi||this.status===bo)&&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()?Yi:Qi}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(t){if(this.asyncValidator){this.status=bo,this._hasOwnPendingAsyncValidator=!0;const n=ew(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 De,this.statusChanges=new De}_calculateStatus(){return this._allControlsDisabled()?Yi:this.errors?fl:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(bo)?bo:this._anyControlsHaveStatus(fl)?fl:Qi}_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){hl(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 vw{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 yw(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 mw(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 Ji(e,t){Lf(e,t),t.valueAccessor.writeValue(e.value),e.disabled&&t.valueAccessor.setDisabledState?.(!0),function XP(e,t){t.valueAccessor.registerOnChange(n=>{e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&_w(e,t)})}(e,t),function tk(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 ek(e,t){t.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&_w(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function JP(e,t){if(t.valueAccessor.setDisabledState){const n=r=>{t.valueAccessor.setDisabledState(r)};e.registerOnDisabledChange(n),t._registerOnDestroy(()=>{e._unregisterOnDisabledChange(n)})}}(e,t)}function ml(e,t){e.forEach(n=>{n.registerOnValidatorChange&&n.registerOnValidatorChange(t)})}function Lf(e,t){const n=function aw(e){return e._rawValidators}(e);null!==t.validator?e.setValidators(sw(n,t.validator)):"function"==typeof n&&e.setValidators([n]);const r=function lw(e){return e._rawAsyncValidators}(e);null!==t.asyncValidator?e.setAsyncValidators(sw(r,t.asyncValidator)):"function"==typeof r&&e.setAsyncValidators([r]);const o=()=>e.updateValueAndValidity();ml(t._rawValidators,o),ml(t._rawAsyncValidators,o)}function _w(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}const sk={provide:it,useExisting:le(()=>Mr)},Xi=(()=>Promise.resolve())();let Mr=(()=>{class e extends it{constructor(n,r){super(),this.submitted=!1,this._directives=new Set,this.ngSubmit=new De,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){Xi.then(()=>{const r=this._findContainer(n.path);n.control=r.registerControl(n.name,n.control),Ji(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(n)})}getControl(n){return this.form.get(n.path)}removeControl(n){Xi.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name),this._directives.delete(n)})}addFormGroup(n){Xi.then(()=>{const r=this._findContainer(n.path),o=new kf({});(function Dw(e,t){Lf(e,t)})(o,n),r.registerControl(n.name,o),o.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(n){Xi.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name)})}getFormGroup(n){return this.form.get(n.path)}updateModel(n,r){Xi.then(()=>{this.form.get(n.path).setValue(r)})}setValue(n){this.control.setValue(n)}onSubmit(n){return this.submitted=!0,function ww(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(Jn,10))},e.\u0275dir=V({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(n,r){1&n&&ee("submit",function(i){return r.onSubmit(i)})("reset",function(){return r.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[se([sk]),re]}),e})();function Ew(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 Mw=class extends vw{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}),hl(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){Ew(this._onChange,t)}registerOnDisabledChange(t){this._onDisabledChange.push(t)}_unregisterOnDisabledChange(t){Ew(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}},uk={provide:Xn,useExisting:le(()=>Mo)},Aw=(()=>Promise.resolve())();let Mo=(()=>{class e extends Xn{constructor(n,r,o,i,s){super(),this._changeDetectorRef=s,this.control=new Mw,this._registered=!1,this.update=new De,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===br?n=i:function ok(e){return Object.getPrototypeOf(e.constructor)===Er}(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(){Ji(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){Aw.then(()=>{this.control.setValue(n,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(n){const r=n.isDisabled.currentValue,o=0!==r&&Tn(r);Aw.then(()=>{o&&!this.control.disabled?this.control.disable():!o&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(n){return this._parent?function pl(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(Jn,10),D(hn,10),D(ma,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:[se([uk]),re,It]}),e})(),vl=(()=>{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})(),xw=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({}),e})();const _k={provide:hn,useExisting:le(()=>_l),multi:!0};function Lw(e,t){return null==e?`${t}`:(t&&"object"==typeof t&&(t="Object"),`${e}: ${t}`.slice(0,50))}let _l=(()=>{class e extends Er{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=Lw(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 Dk(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=We(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&&ee("change",function(i){return r.onChange(i.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},features:[se([_k]),re]}),e})(),Vw=(()=>{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(Lw(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(_t),D(wn),D(_l,9))},e.\u0275dir=V({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})();const Ck={provide:hn,useExisting:le(()=>Hf),multi:!0};function jw(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 Er{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(jw(this.id,n)),this._select.writeValue(this._select.value))}set value(n){this._select?(this._value=n,this._setElementValue(jw(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(_t),D(wn),D(Hf,9))},e.\u0275dir=V({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),e})(),Sr=(()=>{class e{constructor(){this._validator=ul}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):ul,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:[It]}),e})();const Mk={provide:Qe,useExisting:le(()=>So),multi:!0};let So=(()=>{class e extends Sr{constructor(){super(...arguments),this.inputName="required",this.normalizeInput=Tn,this.createValidator=n=>qC}enabled(n){return n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=We(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&&xt("required",r._enabled?"":null)},inputs:{required:"required"},features:[se([Mk]),re]}),e})();const xk={provide:Qe,useExisting:le(()=>es),multi:!0};let es=(()=>{class e extends Sr{constructor(){super(...arguments),this.inputName="pattern",this.normalizeInput=n=>n,this.createValidator=n=>function JC(e){if(!e)return ul;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(Yn(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=We(e)))(r||e)}}(),e.\u0275dir=V({type:e,selectors:[["","pattern","","formControlName",""],["","pattern","","formControl",""],["","pattern","","ngModel",""]],hostVars:1,hostBindings:function(n,r){2&n&&xt("pattern",r._enabled?r.pattern:null)},inputs:{pattern:"pattern"},features:[se([xk]),re]}),e})(),Rk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({imports:[xw]}),e})(),Nk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({imports:[Rk]}),e})(),Gf=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({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&&(kr(),C(0,"svg",0)(1,"defs")(2,"linearGradient",1),Ae(3,"stop",2)(4,"stop",3)(5,"stop",4),M()(),C(6,"g",5)(7,"g",6)(8,"path",7),Ae(9,"animateTransform",8),M(),C(10,"circle",9),Ae(11,"animateTransform",8),M()()()())}}),e})();function Ok(e,t){if(1&e&&(C(0,"div",10),R(1),M()),2&e){const n=fe().$implicit;O(1),zt(" ",n.value.msg," ")}}function Pk(e,t){if(1&e&&(Ys(0),pe(1,Ok,2,1,"div",9),Js()),2&e){const n=t.$implicit;fe(2);const r=rn(1);O(1),B("ngIf",r.submitted&&n.value.show)}}function kk(e,t){if(1&e&&(C(0,"div",10),R(1),M()),2&e){const n=fe(2).$implicit;O(1),zt("",n.label," is required")}}function Lk(e,t){if(1&e&&(C(0,"div",10),R(1),M()),2&e){const n=fe(2).$implicit;O(1),zt("",n.label," is invalid")}}function Vk(e,t){if(1&e){const n=Gn();C(0,"div"),pe(1,kk,2,1,"div",9),pe(2,Lk,2,1,"div",9),C(3,"input",11,12),ee("ngModelChange",function(o){return jt(n),Bt(fe().$implicit.value=o)}),M()()}if(2&e){const n=rn(4),r=fe().$implicit;fe();const o=rn(1);O(1),B("ngIf",o.submitted&&(null==n.errors?null:n.errors.required)),O(1),B("ngIf",o.submitted&&(null==n.errors?null:n.errors.pattern)),O(1),B("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),xt("id",r.attr.id)("title",r.attr.title)("placeholder",r.attr.placeholder)}}function jk(e,t){if(1&e&&(C(0,"div",10),R(1),M()),2&e){const n=fe(2).$implicit;O(1),zt("",n.label," is required")}}function Bk(e,t){if(1&e&&(C(0,"option",15),R(1),M()),2&e){const n=t.$implicit;B("value",n.value),O(1),zt(" ",n.label," ")}}function Uk(e,t){if(1&e){const n=Gn();C(0,"div"),pe(1,jk,2,1,"div",9),C(2,"select",13,12),ee("ngModelChange",function(o){return jt(n),Bt(fe().$implicit.value=o)}),pe(4,Bk,2,2,"option",14),M()()}if(2&e){const n=rn(3),r=fe().$implicit;fe();const o=rn(1);O(1),B("ngIf",(null==n.errors?null:n.errors.required)&&o.submitted),O(1),B("name",r.attr.name)("required",r.attr.required)("ngClass",r.attr.ngClass)("ngModel",r.value),xt("id",r.attr.id),O(2),B("ngForOf",r.options)}}function $k(e,t){if(1&e){const n=Gn();C(0,"textarea",16,12),ee("ngModelChange",function(o){return jt(n),Bt(fe().$implicit.value=o)}),R(2,"\n "),M()}2&e&&B("ngModel",fe().$implicit.value)}function Hk(e,t){if(1&e&&(C(0,"label"),R(1),pe(2,Pk,2,1,"ng-container",3),function uv(e,t){const n=Q();let r;const o=e+22;n.firstCreatePass?(r=function qT(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=ar(r.type)),s=Et(D);try{const a=ws(!1),l=i();return ws(a),function LI(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}(n,_(),o,l),l}finally{Et(s)}}(3,"keyvalue"),pe(4,Vk,5,12,"div",7),pe(5,Uk,5,7,"div",7),C(6,"div"),pe(7,$k,3,1,"textarea",8),M()()),2&e){const n=t.$implicit;O(1),zt(" ",n.label,": "),O(1),B("ngForOf",cv(3,5,n.errors)),O(2),B("ngIf","input"===n.type),O(1),B("ngIf","select"===n.type),O(2),B("ngIf","textarea"===n.type)}}function Gk(e,t){1&e&&(C(0,"div",17),Ae(1,"app-spinner"),M())}function zk(e,t){1&e&&Ae(0,"p",18),2&e&&B("innerHTML",fe(2).formDes.footnote,dg)}function Wk(e,t){if(1&e){const n=Gn();C(0,"form",1,2),ee("ngSubmit",function(){jt(n);const o=rn(1);return Bt(fe().formDes.onSubmit(o))}),pe(2,Hk,8,7,"label",3),C(3,"button",4),R(4),M(),pe(5,Gk,2,0,"div",5),pe(6,zk,1,1,"p",6),M()}if(2&e){const n=fe();B("ngClass",n.formDes.ngClass),O(2),B("ngForOf",n.formDes.fields),O(1),B("ngClass",n.formDes.button.ngClass),O(1),zt(" ",n.formDes.button.label," "),O(1),B("ngIf",n.formDes.button.show),O(1),B("ngIf",n.formDes.footnote)}}let qk=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({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&&pe(0,Wk,7,6,"form",0),2&n&&B("ngIf",r.formDes.show)},dependencies:[x_,F_,yr,vl,Vw,Bw,br,_l,Ki,Zi,So,es,Mo,Mr,Gf,L_],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){const n=Gn();C(0,"div")(1,"div",1)(2,"div",2),kr(),C(3,"svg",3),ee("click",function(){return jt(n),Bt(fe().prev())}),C(4,"g",4),Ae(5,"path",5),M()()(),Vo(),C(6,"div",6),R(7,"Latest Updates"),M(),C(8,"div",2),kr(),C(9,"svg",3),ee("click",function(){return jt(n),Bt(fe().next())}),C(10,"g",4),Ae(11,"path",7),M()()()(),Vo(),C(12,"div",8),R(13,"$9"),M(),C(14,"div",9),R(15," PER MONTH "),M()()}}function Zk(e,t){if(1&e){const n=Gn();C(0,"div")(1,"div",1)(2,"div",2),kr(),C(3,"svg",3),ee("click",function(){return jt(n),Bt(fe().prev())}),C(4,"g",4),Ae(5,"path",5),M()()(),Vo(),C(6,"div",6),R(7,"Extended Features"),M(),C(8,"div",2),kr(),C(9,"svg",3),ee("click",function(){return jt(n),Bt(fe().next())}),C(10,"g",4),Ae(11,"path",7),M()()()(),Vo(),C(12,"div",8),R(13,"$15"),M(),C(14,"div",9),R(15," PER MONTH "),M()()}}let Zw=(()=>{class e{constructor(){this.show={server:!0,support:!1}}ngOnInit(){}prev(){this.show.server=!this.show.server,this.show.support=!this.show.support}next(){this.show.server=!this.show.server,this.show.support=!this.show.support}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({type:e,selectors:[["app-features"]],decls:2,vars:2,consts:[[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&&(pe(0,Kk,16,0,"div",0),pe(1,Zk,16,0,"div",0)),2&n&&(B("ngIf",r.show.server),O(1),B("ngIf",r.show.support))},dependencies:[yr]}),e})();const Qk=["cardErrorEl"];function Yk(e,t){1&e&&(C(0,"div",17),Ae(1,"app-spinner"),M())}function Jk(e,t){1&e&&(C(0,"div",18)(1,"div",19)(2,"p"),R(3,"Your instance is being setup. This can take several minutes."),M(),C(4,"div",17),Ae(5,"app-spinner"),M()()())}let Xk=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.submitted={intention:!1,payment:!1},this.formData={userName:"",password:"",email:"",organisation:"",region:""},this.show={buttonSpinner:!1,userApi:!1,passwordMismatch:!1,waitingPaymentConfirm:!1,waitingBackendConfirm:!1},this.intentionResponse={status:-1,clientSecret:"",stripeCustomerId:""},this.intentionResponseStatus=il,this.stripe={card:void 0,paymentEl:void 0,stripe:void 0,elements:void 0,error:""},this.usernameField=new ll({label:"Username",attr:new If({name:"username",required:!0,type:"text",title:"Lowercase alphanumeric characters: min 4, max 8",pattern:"[a-z0-9]{4,8}"})}),this.passwordField=new ll({label:"Password",attr:new jC({name:"password",autocomplete:"new-password"})}),this.confirmPasswordField=new ll({label:"Confirm Password",attr:new jC({name:"confirmPassword",autocomplete:"new-password"}),errors:{mismatch:{msg:"Passwords do not match",show:!1}}}),this.emailField=new ll({label:"Email",attr:new kP({name:"email"})}),this.orgField=new UC({label:"Organization",attr:new Sf({name:"organization",required:!0}),options:[{value:"individual",label:"Private Individual"},{value:"enterprise",label:"Enterprise"}]}),this.regionField=new UC({label:"Region",attr:new Sf({name:"region",required:!0}),options:[{value:"eu",label:"EU"},{value:"other",label:"Other"}]}),this.intentionForm={ngClass:"form-2-col",button:{ngClass:"btn btn--primary btn--large",label:"Create Account"},onSubmit:o=>{this.onIntention(o)},fields:[this.usernameField,this.passwordField,this.confirmPasswordField,this.emailField],footnote:'By creating an account you agree to our Terms and conditions',show:!1},this.regionForm={ngClass:"form-2-col",fields:[this.orgField,this.regionField],onSubmit:o=>{this.onRegion(o)},button:{ngClass:"btn btn--primary btn--large",label:"To Payment"}},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){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.stripe.stripe=Stripe("pk_live_eEfW8XjO4oZUPRFaYASLCWqn"),this.intentionForm.show=!0,this.stripeForm.show=!1}onRegion(n){}onIntention(n){n.valid&&!this.intentionForm.button.show&&(this.passwordField.value==this.confirmPasswordField.value?(this.intentionForm.button.show=!0,this.backend.get(Ue.createAccount+zi.intention,{userName:this.usernameField.value,email:this.emailField.value}).subscribe(i=>{this.intentionResponse=i,this.initStripPaymentEl(i.clientSecret),this.intentionForm.show=!1,this.stripeForm.show=!0},i=>{})):this.confirmPasswordField.errors.mismatch.show=!0)}onPayment(){this.stripe.stripe.confirmSetup({elements:this.stripe.elements,confirmParams:{return_url:"http://djongomapper.com/djongocs/login"}}).then(n=>{this.stripe.error=n.message})}onCardPayement(){this.show.waitingPaymentConfirm=!0,this.stripe.stripe.confirmCardSetup(this.intentionResponse.clientSecret,{payment_method:{card:this.stripe.card,billing_details:{email:this.formData.email}}}).then(n=>this.onStripeResponse(n))}onStripeResponse(n){n.error?(alert(n.error.code+"and code"+n.error.message+"and type"+n.error.type),this.submitted.payment=!1,this.show.waitingPaymentConfirm=!1):this.backend.post(Ue.createAccount+zi.payment,{status:Eo.OK,userName:this.formData.userName,email:this.formData.email,password:this.formData.password,stripeCustomerId:this.intentionResponse.stripeCustomerId}).subscribe(i=>{i.status===Eo.OK?this.router.navigateByUrl(Ue.dashboard.slice(0,-1)):alert("Request failed with status: "+Eo[i.status])})}}return e.\u0275fac=function(n){return new(n||e)(D(fn),D(Re))},e.\u0275cmp=bt({type:e,selectors:[["app-create-account"]],viewQuery:function(n,r){if(1&n&&mv(Qk,5),2&n){let o;aa(o=function la(){return function dx(e,t){return e[19].queries[t].queryList}(_(),qh())}())&&(r.cardErrorEl=o.first)}},features:[se(Mf.createAccount)],decls:25,vars:8,consts:[["id","main","role","main"],[1,"splash","page__content"],[1,"h1-title"],[1,"l-tire"],[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/docs/security"],["class","text-center",4,"ngIf"],[1,"tire-col","tire-content","tire-2-col-full"],[1,"spinner"],[1,"text-center"],[1,"message","notice--success"]],template:function(n,r){1&n&&(C(0,"div",0)(1,"div",1)(2,"h1",2),R(3,"Create Account "),M(),C(4,"div",3)(5,"div",4),Ae(6,"app-form",5)(7,"app-form",5),C(8,"div",6)(9,"form",7),ee("ngSubmit",function(){return r.onPayment()}),Ae(10,"div",8),C(11,"div",9,10),R(13),M(),C(14,"button",11),R(15,"Confirm Payment "),M(),pe(16,Yk,2,0,"div",12),C(17,"p",13),R(18," Payment data managed by "),C(19,"a",14),R(20,"Stripe."),M(),R(21," Card numbers are encrypted with AES-256. "),M()()(),pe(22,Jk,6,0,"div",15),M(),C(23,"div",16),Ae(24,"app-features"),M()()()()),2&n&&(O(6),B("formDes",r.intentionForm),O(1),B("formDes",r.regionForm),O(1),B("hidden",!r.stripeForm.show),O(3),B("hidden",!r.stripe.error),O(2),pi(r.stripe.error),O(1),B("disabled",r.stripeForm.button.show),O(2),B("ngIf",r.stripeForm.button.show),O(6),B("ngIf",r.show.waitingBackendConfirm))},dependencies:[yr,vl,Zi,Mr,qk,Gf,Zw],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 Io=(()=>{return(e=Io||(Io={}))[e.OK=0]="OK",e[e.LOGIN_REQUIRED=1]="LOGIN_REQUIRED",e[e.VALUE_ERR=2]="VALUE_ERR",Io;var e})();function eL(e,t){if(1&e&&(C(0,"td"),R(1),M()),2&e){const n=fe(2);O(1),Rc("ssh ",n.body.username,"@api.djongomapper.com -p ",n.body.sshPort,"")}}function tL(e,t){1&e&&(C(0,"td"),R(1,""),M())}function nL(e,t){if(1&e){const n=Gn();C(0,"table")(1,"thead")(2,"tr")(3,"th"),R(4,"Property"),M(),C(5,"th"),R(6,"Value"),M()()(),C(7,"tbody")(8,"tr")(9,"td"),R(10,"Username"),M(),C(11,"td"),R(12),M()(),C(13,"tr")(14,"td"),R(15,"Base URL"),M(),C(16,"td"),R(17),M()(),C(18,"tr")(19,"td"),R(20,"Status"),M(),C(21,"td"),R(22),M()(),C(23,"tr")(24,"td"),R(25,"SSH Command"),M(),pe(26,eL,2,2,"td",2),pe(27,tL,2,0,"ng-template",null,3,Dv),M(),C(29,"tr")(30,"td"),R(31,"SSH Public Key"),M(),C(32,"td")(33,"textarea",4),ee("ngModelChange",function(o){return jt(n),Bt(fe().body.sshPublicKey=o)}),R(34," "),M(),C(35,"button",5),ee("click",function(){return jt(n),Bt(fe().onSubmit())}),R(36,"Update"),M()()()()()}if(2&e){const n=rn(28),r=fe();O(12),pi(r.body.username),O(5),zt("https://api.djongomapper.com/",r.body.username,""),O(5),pi(r.body.state),O(4),B("ngIf",r.body.sshPort&&r.body.sshPublicKey)("ngIfElse",n),O(7),B("ngModel",r.body.sshPublicKey),O(2),B("disabled","setup"!=r.body.state)}}let rL=(()=>{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(Ue.dashboard).subscribe(n=>{n.status===Io.LOGIN_REQUIRED?this.router.navigateByUrl(Ue.login.slice(0,-1)):(this.show=!0,this.body=n.body)},n=>{this.router.navigateByUrl(Ue.login.slice(0,-1))})}onSubmit(){this.backend.post(Ue.dashboard,{sshPublicKey:this.body.sshPublicKey}).subscribe(n=>{n.status===Io.LOGIN_REQUIRED?this.router.navigateByUrl(Ue.login.slice(0,-1)):n.status===Io.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(fn),D(Re))},e.\u0275cmp=bt({type:e,selectors:[["app-dashboard"]],features:[se(Mf.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),pe(1,nL,37,7,"table",1),M()),2&n&&(O(1),B("ngIf",r.show))},dependencies:[yr,br,Ki,Mo],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 Dl=(()=>{return(e=Dl||(Dl={}))[e.OK=0]="OK",e[e.DOES_NOT_EXIST=1]="DOES_NOT_EXIST",Dl;var e})();function oL(e,t){1&e&&(C(0,"div",14),Ae(1,"app-spinner"),M())}function iL(e,t){1&e&&(C(0,"div",15)(1,"div",16)(2,"p"),R(3,"Username or Password is incorrect."),M(),C(4,"p"),R(5,"Do not have an endpoint yet? "),C(6,"a",17),R(7,"Create an endpoint."),M()()()())}let sL=(()=>{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(Ue.login,this.formData).subscribe(n=>{this.show.buttonSpinner=!1,n.status===Dl.OK?this.router.navigateByUrl(Ue.dashboard.slice(0,-1)):(this.show.loginFail=!0,this.submitted=!1)})}}return e.\u0275fac=function(n){return new(n||e)(D(fn),D(Re))},e.\u0275cmp=bt({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),R(3,"MongoDB Django Hosting Server"),M(),C(4,"div",3)(5,"div",4)(6,"form",5,6),ee("ngSubmit",function(){return r.onSubmit()}),C(8,"label"),R(9,"Username: "),C(10,"input",7),ee("ngModelChange",function(i){return r.formData.userName=i}),M()(),C(11,"label"),R(12,"Password: "),C(13,"input",8),ee("ngModelChange",function(i){return r.formData.password=i}),M()(),C(14,"button",9),R(15," Login "),M(),pe(16,oL,2,0,"div",10),M(),pe(17,iL,8,0,"div",11),M(),C(18,"div",12),Ae(19,"app-features"),C(20,"button",13),R(21," Create Account "),M()()()()()),2&n){const o=rn(7);O(10),B("ngModel",r.formData.userName),O(3),B("ngModel",r.formData.password),O(1),B("disabled",!o.valid||r.submitted),O(2),B("ngIf",r.show.buttonSpinner),O(1),B("ngIf",r.show.loginFail)}},dependencies:[yr,vl,br,Ki,Zi,So,es,Mo,Mr,nl,Gf,Zw]}),e})(),aL=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=bt({type:e,selectors:[["app-not-found"]],decls:2,vars:0,consts:[[1,"h1-title"]],template:function(n,r){1&n&&(C(0,"h1",0),R(1,"Oops! The page you are looking for does not exist"),M())}}),e})();var Cl=(()=>{return(e=Cl||(Cl={}))[e.OK=0]="OK",e[e.OTHER=1]="OTHER",Cl;var e})();function lL(e,t){1&e&&(C(0,"div",10)(1,"div",11)(2,"p")(3,"strong"),R(4,"Thank you!"),M(),R(5," Message received. We will get back soon."),M()()())}let uL=(()=>{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(Ue.contactUs,this.formData).subscribe(n=>{n.status==Cl.OK&&(this.show.messageReceived=!0),console.log(n.status)},n=>{})}}return e.\u0275fac=function(n){return new(n||e)(D(fn))},e.\u0275cmp=bt({type:e,selectors:[["app-contact-us"]],features:[se(Mf.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),R(3,"Contact Us"),M(),C(4,"form",3,4),ee("ngSubmit",function(){return r.onSubmit()}),C(6,"label"),R(7,"Name: "),C(8,"input",5),ee("ngModelChange",function(i){return r.formData.name=i}),M()(),C(9,"label"),R(10,"Organisation: "),C(11,"input",6),ee("ngModelChange",function(i){return r.formData.organisation=i}),M()(),C(12,"label"),R(13,"Email: "),C(14,"input",7),ee("ngModelChange",function(i){return r.formData.email=i}),M()(),C(15,"button",8),R(16," Send "),M(),pe(17,lL,6,0,"div",9),M()()()),2&n){const o=rn(5);O(8),B("ngModel",r.formData.name),O(3),B("ngModel",r.formData.organisation),O(3),B("ngModel",r.formData.email),O(1),B("disabled",!o.valid||r.show.messageReceived||r.clicked),O(2),B("ngIf",r.show.messageReceived)}},dependencies:[yr,br,Ki,Zi,So,es,Mo,Mr]}),e})();const cL=[{path:Ue.createAccount.slice(0,-1),title:"DjongoCS - Create Account",component:Xk},{path:Ue.dashboard.slice(0,-1),title:"DjongoCS - Dashboard",component:rL},{path:Ue.login.slice(0,-1),title:"DjongoCS - Login",component:sL},{path:Ue.contactUs.slice(0,-1),title:"DjongoCS - Contact Us",component:uL},{path:"**",component:aL}];let dL=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e}),e.\u0275inj=ft({imports:[bC.forRoot(cL),bC]}),e})(),fL=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=Mt({type:e,bootstrap:[CP]}),e.\u0275inj=ft({imports:[P1,Nk,dL,PP]}),e})();(function Yx(){o_=!1})(),O1().bootstrapModule(fL).catch(e=>console.error(e))}},ae=>{ae(ae.s=802)}]); \ 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..c98fa7d4 --- /dev/null +++ b/docs/djongocs/products/index.html @@ -0,0 +1,433 @@ + + + + + + Djongo Products - Deploy a Django MongoDB webserver + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ Latest Updates +
+
+ $9 +
+
+ PER MONTH +
+ + Create Account + +
+
    +
  • + 1 webserver instance. +
  • +
  • + Supports Django 4.2. +
  • +
  • + Supports MongoDB 7.0. +
  • +
+
+
+
+
+ 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 holes and 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..3b6f203d --- /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 holes and 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(' diff --git a/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/search_form.html b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/search_form.html new file mode 100644 index 00000000..5b5e6a58 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/search_form.html @@ -0,0 +1,16 @@ +{% load i18n static %} +{% if cl.search_fields %} +
+{% endif %} diff --git a/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/submit_line.html b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/submit_line.html new file mode 100644 index 00000000..4a2ca088 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/admin_views/article/submit_line.html @@ -0,0 +1,7 @@ +{% extends "admin/submit_line.html" %} +{% load i18n admin_urls %} + +{% block submit-row %} +{% if show_publish %}{% endif %} +{{ block.super }} +{% endblock %} diff --git a/tests/django_tests/tests/v21/tests/admin_views/templates/admin/base_site.html b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/base_site.html new file mode 100644 index 00000000..97145712 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_views/templates/admin/base_site.html @@ -0,0 +1,3 @@ +{% extends "admin/base.html" %} + +{% block bodyclass %}bodyclass_consistency_check{% endblock %} diff --git a/tests/django_tests/tests/v21/tests/admin_views/templates/custom_filter_template.html b/tests/django_tests/tests/v21/tests/admin_views/templates/custom_filter_template.html new file mode 100644 index 00000000..e5c9a8e7 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_views/templates/custom_filter_template.html @@ -0,0 +1,7 @@ +

By {{ filter_title }} (custom)

+ diff --git a/tests/django_tests/tests/v21/tests/admin_views/test_actions.py b/tests/django_tests/tests/v21/tests/admin_views/test_actions.py new file mode 100644 index 00000000..1069f4a1 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_views/test_actions.py @@ -0,0 +1,451 @@ +import json + +from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME +from django.contrib.admin.views.main import IS_POPUP_VAR +from django.contrib.auth.models import Permission, User +from django.core import mail +from django.template.loader import render_to_string +from django.template.response import TemplateResponse +from django.test import TestCase, override_settings +from django.urls import reverse + +from .admin import SubscriberAdmin +from .forms import MediaActionForm +from .models import ( + Actor, Answer, Book, ExternalSubscriber, Question, Subscriber, + UnchangeableObject, +) + + +@override_settings(ROOT_URLCONF='admin_views.urls') +class AdminActionsTest(TestCase): + + @classmethod + def setUpTestData(cls): + cls.superuser = User.objects.create_superuser(username='super', password='secret', email='super@example.com') + cls.s1 = ExternalSubscriber.objects.create(name='John Doe', email='john@example.org') + cls.s2 = Subscriber.objects.create(name='Max Mustermann', email='max@example.org') + + def setUp(self): + self.client.force_login(self.superuser) + + def test_model_admin_custom_action(self): + """A custom action defined in a ModelAdmin method.""" + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'mail_admin', + 'index': 0, + } + self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].subject, 'Greetings from a ModelAdmin action') + + def test_model_admin_default_delete_action(self): + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk, self.s2.pk], + 'action': 'delete_selected', + 'index': 0, + } + delete_confirmation_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk, self.s2.pk], + 'action': 'delete_selected', + 'post': 'yes', + } + confirmation = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) + self.assertIsInstance(confirmation, TemplateResponse) + self.assertContains(confirmation, 'Are you sure you want to delete the selected subscribers?') + self.assertContains(confirmation, '

Summary

') + self.assertContains(confirmation, '
  • Subscribers: 2
  • ') + self.assertContains(confirmation, '
  • External subscribers: 1
  • ') + self.assertContains(confirmation, ACTION_CHECKBOX_NAME, count=2) + self.client.post(reverse('admin:admin_views_subscriber_changelist'), delete_confirmation_data) + self.assertEqual(Subscriber.objects.count(), 0) + + def test_default_delete_action_nonexistent_pk(self): + self.assertFalse(Subscriber.objects.filter(id=9998).exists()) + action_data = { + ACTION_CHECKBOX_NAME: ['9998'], + 'action': 'delete_selected', + 'index': 0, + } + response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) + self.assertContains(response, 'Are you sure you want to delete the selected subscribers?') + self.assertContains(response, '
      ', html=True) + + @override_settings(USE_THOUSAND_SEPARATOR=True, USE_L10N=True, NUMBER_GROUPING=3) + def test_non_localized_pk(self): + """ + If USE_THOUSAND_SEPARATOR is set, the ids for the objects selected for + deletion are rendered without separators. + """ + s = ExternalSubscriber.objects.create(id=9999) + action_data = { + ACTION_CHECKBOX_NAME: [s.pk, self.s2.pk], + 'action': 'delete_selected', + 'index': 0, + } + response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) + self.assertTemplateUsed(response, 'admin/delete_selected_confirmation.html') + self.assertContains(response, 'value="9999"') # Instead of 9,999 + self.assertContains(response, 'value="%s"' % self.s2.pk) + + def test_model_admin_default_delete_action_protected(self): + """ + The default delete action where some related objects are protected + from deletion. + """ + q1 = Question.objects.create(question='Why?') + a1 = Answer.objects.create(question=q1, answer='Because.') + a2 = Answer.objects.create(question=q1, answer='Yes.') + q2 = Question.objects.create(question='Wherefore?') + action_data = { + ACTION_CHECKBOX_NAME: [q1.pk, q2.pk], + 'action': 'delete_selected', + 'index': 0, + } + delete_confirmation_data = action_data.copy() + delete_confirmation_data['post'] = 'yes' + response = self.client.post(reverse('admin:admin_views_question_changelist'), action_data) + self.assertContains(response, 'would require deleting the following protected related objects') + self.assertContains( + response, + '
    • Answer: Because.
    • ' % reverse('admin:admin_views_answer_change', args=(a1.pk,)), + html=True + ) + self.assertContains( + response, + '
    • Answer: Yes.
    • ' % reverse('admin:admin_views_answer_change', args=(a2.pk,)), + html=True + ) + # A POST request to delete protected objects displays the page which + # says the deletion is prohibited. + response = self.client.post(reverse('admin:admin_views_question_changelist'), delete_confirmation_data) + self.assertContains(response, 'would require deleting the following protected related objects') + self.assertEqual(Question.objects.count(), 2) + + def test_model_admin_default_delete_action_no_change_url(self): + """ + The default delete action doesn't break if a ModelAdmin removes the + change_view URL (#20640). + """ + obj = UnchangeableObject.objects.create() + action_data = { + ACTION_CHECKBOX_NAME: obj.pk, + 'action': 'delete_selected', + 'index': '0', + } + response = self.client.post(reverse('admin:admin_views_unchangeableobject_changelist'), action_data) + # No 500 caused by NoReverseMatch + self.assertEqual(response.status_code, 200) + # The page doesn't display a link to the nonexistent change page. + self.assertContains(response, '
    • Unchangeable object: %s
    • ' % obj, 1, html=True) + + def test_delete_queryset_hook(self): + delete_confirmation_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk, self.s2.pk], + 'action': 'delete_selected', + 'post': 'yes', + 'index': 0, + } + SubscriberAdmin.overridden = False + self.client.post(reverse('admin:admin_views_subscriber_changelist'), delete_confirmation_data) + # SubscriberAdmin.delete_queryset() sets overridden to True. + self.assertIs(SubscriberAdmin.overridden, True) + self.assertEqual(Subscriber.objects.all().count(), 0) + + def test_delete_selected_uses_get_deleted_objects(self): + """The delete_selected action uses ModelAdmin.get_deleted_objects().""" + book = Book.objects.create(name='Test Book') + data = { + ACTION_CHECKBOX_NAME: [book.pk], + 'action': 'delete_selected', + 'index': 0, + } + response = self.client.post(reverse('admin2:admin_views_book_changelist'), data) + # BookAdmin.get_deleted_objects() returns custom text. + self.assertContains(response, 'a deletable object') + + def test_custom_function_mail_action(self): + """A custom action may be defined in a function.""" + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'external_mail', + 'index': 0, + } + self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].subject, 'Greetings from a function action') + + def test_custom_function_action_with_redirect(self): + """Another custom action defined in a function.""" + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'redirect_to', + 'index': 0, + } + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) + self.assertEqual(response.status_code, 302) + + def test_default_redirect(self): + """ + Actions which don't return an HttpResponse are redirected to the same + page, retaining the querystring (which may contain changelist info). + """ + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'external_mail', + 'index': 0, + } + url = reverse('admin:admin_views_externalsubscriber_changelist') + '?o=1' + response = self.client.post(url, action_data) + self.assertRedirects(response, url) + + def test_custom_function_action_streaming_response(self): + """A custom action may return a StreamingHttpResponse.""" + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'download', + 'index': 0, + } + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) + content = b''.join(response.streaming_content) + self.assertEqual(content, b'This is the content of the file') + self.assertEqual(response.status_code, 200) + + def test_custom_function_action_no_perm_response(self): + """A custom action may returns an HttpResponse with a 403 code.""" + action_data = { + ACTION_CHECKBOX_NAME: [self.s1.pk], + 'action': 'no_perm', + 'index': 0, + } + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) + self.assertEqual(response.status_code, 403) + self.assertEqual(response.content, b'No permission to perform this action') + + def test_actions_ordering(self): + """Actions are ordered as expected.""" + response = self.client.get(reverse('admin:admin_views_externalsubscriber_changelist')) + self.assertContains(response, '''