diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0ad25db
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0fc970e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,46 @@
+## Metrics Model
+Metrics Model makes metrics combine metrics together, you could find us [here](https://github.com/chaoss/wg-metrics-models)
+
+### Please create json file as following way:
+
+ {
+ "gitee-{community name}": {
+ "gitee-software-artifact": [
+ "https://gitee.com/{owner}/{repo}"
+ ],
+ "gitee-governance": [
+ "https://gitee.com/{owner}/{repo}"
+ ]
+ }
+ }
+
+If it is a github repository, you need to change gitee to github
+### Please create conf.yaml file as following way:
+
+ url:
+ "https://user:password@ip:port"
+ params:
+ {
+ 'issue_index': Issue index,
+ 'pr_index':pr index,
+ 'json_file': json file for repos messages,
+ 'git_index': git index,
+ 'git_branch': git branch,
+ 'from_date': the beginning of time for metric model,
+ 'end_date': the end of time for metric model,
+ 'out_index': new index for metric model,
+ 'community': the name of community,
+ 'level': representation of the metrics, choose from repo, project, community,
+ 'company': the name of company,
+ 'pr_comments_index': pr comment index,
+ 'issue_comments_index': issue comment index,
+ 'repo_index': repo index,
+ 'release_index': release index
+ }
+
+params is designed to init Metric Model.
+
+### Modify 'cofig_url' path in the run.py , Run metrics model
+
+ python run.py
+
diff --git a/community-gitee-openeuler.json b/community-gitee-openeuler.json
new file mode 100644
index 0000000..463b125
--- /dev/null
+++ b/community-gitee-openeuler.json
@@ -0,0 +1,13 @@
+{
+ "openeuler": {
+ "gitee-software-artifact": [
+ "https://gitee.com/openeuler/iSulad",
+ "https://gitee.com/openeuler/A-Tune",
+ "https://gitee.com/openeuler/stratovirt",
+ "https://gitee.com/openeuler/bishengjdk-8",
+ "https://gitee.com/openeuler/kernel"
+ ],
+ "gitee-governance": [
+ ]
+ }
+}
\ No newline at end of file
diff --git a/community-gitee-openeuler.yaml b/community-gitee-openeuler.yaml
new file mode 100644
index 0000000..57ef9fe
--- /dev/null
+++ b/community-gitee-openeuler.yaml
@@ -0,0 +1,27 @@
+url:
+ "http://localhost:9200"
+
+params:
+ {
+ 'git_index': 'git_chaoss_enriched',
+ 'git_aoc_index': 'git-aoc_chaoss_enriched',
+ 'git_onion_index':'git-onion_enriched',
+ 'cocom_index':'cocom_chaoss_enrich',
+ 'colic_index':'colic_chaoss_enrich',
+ 'issue_index': 'gitee_issues_chaoss_enriched',
+ 'pr_index':'gitee_pulls_chaoss_enriched',
+ 'repo_index':'gitee_repo_enriched',
+ 'issue_comments_index':'gitee2-issues_enriched',
+ 'pr_comments_index':'gitee2-pull_enriched',
+ 'json_file': '/home/ruoxuan/metrics-model/community-gitee-openeuler.json',
+ 'git_branch': None,
+ 'from_date': '2023-05-01',
+ 'end_date': '2023-06-30',
+ 'out_index': 'health_metric_model',
+ 'risk_index': 'risk_model',
+ 'community': 'openeuler',
+ 'level': 'community',
+ 'company': 'huawei',
+ 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml',
+ 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json'
+ }
\ No newline at end of file
diff --git a/community-gitee-openharmony.json b/community-gitee-openharmony.json
new file mode 100644
index 0000000..7178241
--- /dev/null
+++ b/community-gitee-openharmony.json
@@ -0,0 +1,13 @@
+{
+ "openharmony": {
+ "gitee-software-artifact": [
+ "https://gitee.com/openharmony/arkui_ace_engine",
+ "https://gitee.com/openharmony/kernel_liteos_a",
+ "https://gitee.com/openharmony/systemabilitymgr_samgr_lite",
+ "https://gitee.com/openharmony/communication_dsoftbus",
+ "https://gitee.com/openharmony/community"
+ ],
+ "gitee-governance": [
+ ]
+ }
+}
\ No newline at end of file
diff --git a/community-gitee-openharmony.yaml b/community-gitee-openharmony.yaml
new file mode 100644
index 0000000..976765d
--- /dev/null
+++ b/community-gitee-openharmony.yaml
@@ -0,0 +1,27 @@
+url:
+ "http://localhost:9200"
+
+params:
+ {
+ 'git_index': 'git_chaoss_enriched',
+ 'git_aoc_index': 'git-aoc_chaoss_enriched',
+ 'git_onion_index':'git-onion_enriched',
+ 'cocom_index':'cocom_chaoss_enrich',
+ 'colic_index':'colic_chaoss_enrich',
+ 'issue_index': 'gitee_issues_chaoss_enriched',
+ 'pr_index':'gitee_pulls_chaoss_enriched',
+ 'repo_index':'gitee_repo_enriched',
+ 'issue_comments_index':'gitee2-issues_enriched',
+ 'pr_comments_index':'gitee2-pull_enriched',
+ 'json_file': '/home/ruoxuan/metrics-model/community-gitee-openharmony.json',
+ 'git_branch': None,
+ 'from_date': '2023-05-01',
+ 'end_date': '2023-06-30',
+ 'out_index': 'health_metric_model',
+ 'risk_index': 'risk_model',
+ 'community': 'openharmony',
+ 'level': 'community',
+ 'company': 'huawei',
+ 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml',
+ 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json'
+ }
\ No newline at end of file
diff --git a/identities.yml b/identities.yml
new file mode 100644
index 0000000..e0be015
--- /dev/null
+++ b/identities.yml
@@ -0,0 +1,46 @@
+- profile:
+ name: GitHub No Reply
+ is_bot: true
+ email:
+ - noreply@github.com
+
+- profile:
+ name: Owlbert Einstein
+ enrollments:
+ - organization: Bitergia
+ email:
+ - owlbert_einstein@bitergia.com
+ github:
+ - owlbert_einstein
+
+- profile:
+ name: Owlfred Hitchcock
+ enrollments:
+ - organization: Hogwarts
+ end: 2012-05-31
+ - organization: Bitergia
+ start: 2012-06-01
+ email:
+ - owl_hitchcock@hogwarts.com
+ - owl_hitchcock@bitergia.com
+ github:
+ - owl_hitchcock
+
+- profile:
+ name: Owl Capone
+ enrollments:
+ - organization: Hogwarts
+ end: 2012-05-31
+ - organization: Bitergia
+ start: 2012-06-01
+ email:
+ - owl_capone@bitergia.com
+ github:
+ - owl_capone
+
+- profile:
+ name: i-robot
+ enrollments:
+ - organization: Huawei
+ email:
+ - huawei_ci_bot@163.com
diff --git a/metrics_model/__init__.py b/metrics_model/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/metrics_model/__pycache__/__init__.cpython-37.pyc b/metrics_model/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..d0a203a
Binary files /dev/null and b/metrics_model/__pycache__/__init__.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/__init__.cpython-39.pyc b/metrics_model/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..023ff30
Binary files /dev/null and b/metrics_model/__pycache__/__init__.cpython-39.pyc differ
diff --git a/metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc b/metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc
new file mode 100644
index 0000000..e024430
Binary files /dev/null and b/metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc b/metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc
new file mode 100644
index 0000000..4517953
Binary files /dev/null and b/metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc differ
diff --git a/metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc b/metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc
new file mode 100644
index 0000000..e9900bb
Binary files /dev/null and b/metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc b/metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc
new file mode 100644
index 0000000..aab6ab6
Binary files /dev/null and b/metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/communityActivityModel.cpython-37.pyc b/metrics_model/__pycache__/communityActivityModel.cpython-37.pyc
new file mode 100644
index 0000000..a1e7abe
Binary files /dev/null and b/metrics_model/__pycache__/communityActivityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/humanDiversityModel.cpython-37.pyc b/metrics_model/__pycache__/humanDiversityModel.cpython-37.pyc
new file mode 100644
index 0000000..1c65629
Binary files /dev/null and b/metrics_model/__pycache__/humanDiversityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/metrics_model.cpython-37.pyc b/metrics_model/__pycache__/metrics_model.cpython-37.pyc
new file mode 100644
index 0000000..a803d7a
Binary files /dev/null and b/metrics_model/__pycache__/metrics_model.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/metrics_model.cpython-39.pyc b/metrics_model/__pycache__/metrics_model.cpython-39.pyc
new file mode 100644
index 0000000..1fec404
Binary files /dev/null and b/metrics_model/__pycache__/metrics_model.cpython-39.pyc differ
diff --git a/metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc b/metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc
new file mode 100644
index 0000000..59a5ddf
Binary files /dev/null and b/metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/statModel.cpython-37.pyc b/metrics_model/__pycache__/statModel.cpython-37.pyc
new file mode 100644
index 0000000..ae4f6de
Binary files /dev/null and b/metrics_model/__pycache__/statModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/summaryModel.cpython-37.pyc b/metrics_model/__pycache__/summaryModel.cpython-37.pyc
new file mode 100644
index 0000000..f8810b7
Binary files /dev/null and b/metrics_model/__pycache__/summaryModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/techDiversityModel.cpython-37.pyc b/metrics_model/__pycache__/techDiversityModel.cpython-37.pyc
new file mode 100644
index 0000000..db932cc
Binary files /dev/null and b/metrics_model/__pycache__/techDiversityModel.cpython-37.pyc differ
diff --git a/metrics_model/__pycache__/utils.cpython-37.pyc b/metrics_model/__pycache__/utils.cpython-37.pyc
new file mode 100644
index 0000000..817e369
Binary files /dev/null and b/metrics_model/__pycache__/utils.cpython-37.pyc differ
diff --git a/metrics_model/codeDevActivityModel.py b/metrics_model/codeDevActivityModel.py
new file mode 100644
index 0000000..a820361
--- /dev/null
+++ b/metrics_model/codeDevActivityModel.py
@@ -0,0 +1,201 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+MAX_BULK_UPDATE_SIZE = 500
+class CodeDevActivityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.pr_comments_index = pr_comments_index
+ self.model_name = 'Code develop activity'
+ self.company = None if company == None or company == 'None' else company
+
+ def LOC_frequency(self, date, repos_list, field='lines_changed'):
+ query_LOC_frequency = self.get_uuid_count_query(
+ 'sum', repos_list, field, 'grimoire_creation_date', size=0, from_date=date-timedelta(days=90), to_date=date)
+ # print("query_LOC_frequency", query_LOC_frequency)
+ LOC_frequency = self.es_in.search(index=self.git_index, body=query_LOC_frequency)[
+ 'aggregations']['count_of_uuid']['value']
+ return LOC_frequency/12.85
+
+ def contributor_count(self, date, repos_list):
+ query_author_uuid_data = self.get_uuid_count_contribute_query(
+ repos_list, company=None, from_date=(date - timedelta(days=90)), to_date=date)
+ author_uuid_count = self.es_in.search(index=(self.git_index, self.pr_comments_index), body=query_author_uuid_data)[
+ 'aggregations']["count_of_contributors"]['value']
+ return author_uuid_count
+
+ def get_pr_message_count(self, repos_list, field, date_field="grimoire_creation_date", size=0, filter_field=None, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": size,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ "cardinality": {
+ "field": field
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "must": [
+ {
+ "bool": {
+ "should": [{
+ "simple_query_string": {
+ "query": i,
+ "fields": ["tag"]
+ }}for i in repos_list],
+ "minimum_should_match": 1
+ }
+ },
+ {
+ "match_phrase": {
+ "pull_request": "true"
+ }
+ }
+ ],
+ "filter": [
+ {
+ "range":
+ {
+ filter_field: {
+ "gte": 1
+ }
+ }},
+ {
+ "range":
+ {
+ date_field: {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ return query
+
+ def code_review_ratio(self, date, repos_list):
+ query_pr_count = self.get_uuid_count_query(
+ "cardinality", repos_list, "uuid", size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ pr_count = self.es_in.search(index=self.pr_index, body=query_pr_count)[
+ 'aggregations']["count_of_uuid"]['value']
+ query_pr_body = self.get_pr_message_count(repos_list, "uuid", "grimoire_creation_date", size=0,
+ filter_field="num_review_comments_without_bot", from_date=(date-timedelta(days=90)), to_date=date)
+ prs = self.es_in.search(index=self.pr_index, body=query_pr_body)[
+ 'aggregations']["count_of_uuid"]['value']
+ try:
+ return prs/pr_count, pr_count
+ except ZeroDivisionError:
+ return None, 0
+
+ def commit_frequency(self, date, repos_list):
+ query_commit_frequency = self.get_uuid_count_query(
+ "cardinality", repos_list, "hash", "grimoire_creation_date", size=0, from_date=date - timedelta(days=90), to_date=date)
+ commit_frequency = self.es_in.search(index=self.git_index, body=query_commit_frequency)[
+ 'aggregations']["count_of_uuid"]['value']
+ query_commit_frequency_commpany = 0
+ if self.company:
+ query_commit_frequency["query"]["bool"]["must"].append({ "match": { "author_org_name": self.company } })
+ query_commit_frequency_commpany = self.es_in.search(index=self.git_index, body=query_commit_frequency)[
+ 'aggregations']["count_of_uuid"]['value']
+ return commit_frequency/12.85, query_commit_frequency_commpany/12.85
+
+ def updated_issue_count(self, date, repos_list):
+ query_issue_updated_since = self.get_uuid_count_query(
+ "cardinality", repos_list, "uuid", date_field='metadata__updated_on', size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ query_issue_updated_since["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ updated_issues_count = self.es_in.search(index=self.issue_index, body=query_issue_updated_since)[
+ 'aggregations']["count_of_uuid"]['value']
+ return updated_issues_count
+
+ def is_maintained(self, date, repos_list, level):
+ is_maintained_list = []
+ if level == "repo":
+ date_list_maintained = get_date_list(begin_date=str(
+ date-timedelta(days=90)), end_date=str(date), freq='7D')
+ for day in date_list_maintained:
+ query_git_commit_i = self.get_uuid_count_query(
+ "cardinality", repos_list, "hash", size=0, from_date=day-timedelta(days=7), to_date=day)
+ commit_frequency_i = self.es_in.search(index=self.git_index, body=query_git_commit_i)[
+ 'aggregations']["count_of_uuid"]['value']
+ if commit_frequency_i > 0:
+ is_maintained_list.append("True")
+ else:
+ is_maintained_list.append("False")
+
+ elif level in ["project", "community"]:
+ for repo in repos_list:
+ query_git_commit_i = self.get_uuid_count_query("cardinality",[repo+'.git'], "hash",from_date=date-timedelta(days=30), to_date=date)
+ commit_frequency_i = self.es_in.search(index=self.git_index, body=query_git_commit_i)['aggregations']["count_of_uuid"]['value']
+ if commit_frequency_i > 0:
+ is_maintained_list.append("True")
+ else:
+ is_maintained_list.append("False")
+ try:
+ return is_maintained_list.count("True") / len(is_maintained_list)
+ except ZeroDivisionError:
+ return 0
+
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ LOC_frequency = self.LOC_frequency(date, repos_list)
+ code_review_ratio, pr_count = self.code_review_ratio(date, repos_list)
+ commit_frequency_message = self.commit_frequency(date, repos_list)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'LOC_frequency': LOC_frequency,
+ 'contributor_count': self.contributor_count(date, repos_list),
+ 'pr_count': pr_count,
+ 'commit_frequency': commit_frequency_message[0],
+ 'updated_issues_count': self.updated_issue_count(date, repos_list),
+ 'is_maintained': round(self.is_maintained(date, repos_list, level), 4),
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ score = get_codeDevActicity_score(metrics_data, level)
+ metrics_data["code_develop_activity_score"] = score
+ print(score)
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
diff --git a/metrics_model/codeDevQualityModel.py b/metrics_model/codeDevQualityModel.py
new file mode 100644
index 0000000..f706953
--- /dev/null
+++ b/metrics_model/codeDevQualityModel.py
@@ -0,0 +1,402 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ codeDevQuality_decay
+ )
+
+import logging
+import math
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+
+class CodeDevQualityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.pr_comments_index = pr_comments_index
+ self.model_name = 'Code develop Quality'
+ self.company = None if company == None or company == 'None' else company
+
+ def get_pr_message_count(self, repos_list, field, date_field="grimoire_creation_date", size=0, filter_field=None, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": size,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ "cardinality": {
+ "field": field
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "must": [
+ {
+ "bool": {
+ "should": [{
+ "simple_query_string": {
+ "query": i,
+ "fields": ["tag"]
+ }}for i in repos_list],
+ "minimum_should_match": 1
+ }
+ },
+ {
+ "match_phrase": {
+ "pull_request": "true"
+ }
+ }
+ ],
+ "filter": [
+ {
+ "range":
+ {
+ filter_field: {
+ "gte": 1
+ }
+ }},
+ {
+ "range":
+ {
+ date_field: {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ return query
+
+ def get_pr_linked_issue_count(self, repo, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ "cardinality": {
+ "script": "if(doc.containsKey('pull_id')) {return doc['pull_id']} else {return doc['id']}"
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "should": [
+ {
+ "range": {
+ "linked_issues_count": {
+ "gte": 1
+ }
+ }
+ },
+ {
+ "script": {
+ "script": "if (doc.containsKey('body') && doc['body'].size()>0 &&doc['body'].value.indexOf('"+repo+"/issue') != -1){return true}"
+ }
+ }
+ ],
+ "minimum_should_match": 1,
+ "must": [
+ {
+ "bool": {
+ "should": [
+ {
+ "simple_query_string": {
+ "query": repo,
+ "fields": [
+ "tag"
+ ]
+ }
+ }
+ ],
+ "minimum_should_match": 1
+ }
+ }
+ ],
+ "filter": [
+ {
+ "range": {
+ "grimoire_creation_date": {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ return query
+
+ def code_review_ratio(self, date, repos_list):
+ query_pr_count = self.get_uuid_count_query(
+ "cardinality", repos_list, "uuid", size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ pr_count = self.es_in.search(index=self.pr_index, body=query_pr_count)[
+ 'aggregations']["count_of_uuid"]['value']
+ query_pr_body = self.get_pr_message_count(repos_list, "uuid", "grimoire_creation_date", size=0,
+ filter_field="num_review_comments_without_bot", from_date=(date-timedelta(days=90)), to_date=date)
+ prs = self.es_in.search(index=self.pr_index, body=query_pr_body)[
+ 'aggregations']["count_of_uuid"]['value']
+ try:
+ return prs/pr_count, pr_count
+ except ZeroDivisionError:
+ return None, 0
+
+ def code_merge_ratio(self, date, repos_list):
+ query_pr_body = self.get_uuid_count_query( "cardinality", repos_list, "uuid", "grimoire_creation_date", size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ query_pr_body["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }})
+ query_pr_body["query"]["bool"]["must"].append({"match_phrase": {"merged": "true" }})
+ pr_merged_count = self.es_in.search(index=self.pr_index, body=query_pr_body)[
+ 'aggregations']["count_of_uuid"]['value']
+ query_pr_body["query"]["bool"]["must"].append({
+ "script": {
+ "script": "if(doc['merged_by_data_name'].size() > 0 && doc['author_name'].size() > 0 && doc['merged_by_data_name'].value != doc['author_name'].value){return true}"
+ }
+ })
+ prs = self.es_in.search(index=self.pr_index, body=query_pr_body)[
+ 'aggregations']["count_of_uuid"]['value']
+ try:
+ return prs/pr_merged_count, pr_merged_count
+ except ZeroDivisionError:
+ return None, 0
+
+ def git_pr_linked_ratio(self, date, repos_list):
+ commit_frequency = self.get_uuid_count_query("cardinality", repos_list, "hash", "grimoire_creation_date", size=10000, from_date=date - timedelta(days=90), to_date=date)
+ commits_without_merge_pr = {
+ "bool": {
+ "should": [{"script": {
+ "script": "if (doc.containsKey('message') && doc['message'].size()>0 &&doc['message'].value.indexOf('Merge pull request') == -1){return true}"
+ }
+ }],
+ "minimum_should_match": 1}
+ }
+ commit_frequency["query"]["bool"]["must"].append(commits_without_merge_pr)
+ commit_message = self.es_in.search(index=self.git_index, body=commit_frequency)
+ commit_count = commit_message['aggregations']["count_of_uuid"]['value']
+ commit_pr_cout = 0
+ commit_all_message = [commit_message_i['_source']['hash'] for commit_message_i in commit_message['hits']['hits']]
+
+ for commit_message_i in set(commit_all_message):
+ commit_hash = commit_message_i
+ if commit_hash in self.commit_message_dict:
+ commit_pr_cout += self.commit_message_dict[commit_hash]
+ else:
+ pr_message = self.get_uuid_count_query("cardinality", repos_list, "uuid", "grimoire_creation_date", size=0)
+ commit_hash_query = { "bool": {"should": [ {"match_phrase": {"commits_data": commit_hash} }],
+ "minimum_should_match": 1
+ }
+ }
+ pr_message["query"]["bool"]["must"].append(commit_hash_query)
+ prs = self.es_in.search(index=self.pr_index, body=pr_message)
+ if prs['aggregations']["count_of_uuid"]['value']>0:
+ self.commit_message_dict[commit_hash] = 1
+ commit_pr_cout += 1
+ else:
+ self.commit_message_dict[commit_hash] = 0
+ if commit_count>0:
+ return len(commit_all_message), commit_pr_cout, commit_pr_cout/len(commit_all_message)
+ else:
+ return 0, None, None
+
+ def pr_issue_linked(self, date, repos_list):
+ pr_linked_issue = 0
+ for repo in repos_list:
+ query_pr_linked_issue = self.get_pr_linked_issue_count(
+ repo, from_date=date-timedelta(days=90), to_date=date)
+ pr_linked_issue += self.es_in.search(index=(self.pr_index, self.pr_comments_index), body=query_pr_linked_issue)[
+ 'aggregations']["count_of_uuid"]['value']
+ query_pr_count = self.get_uuid_count_query(
+ "cardinality", repos_list, "uuid", size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ query_pr_count["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }})
+ pr_count = self.es_in.search(index=self.pr_index,
+ body=query_pr_count)[
+ 'aggregations']["count_of_uuid"]['value']
+ try:
+ return pr_linked_issue/pr_count
+ except ZeroDivisionError:
+ return None
+
+ def pr_first_response_time(self, date, repos_list):
+ query_pr_first_reponse_avg = self.get_uuid_count_query(
+ "avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date)
+ query_pr_first_reponse_avg["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }})
+ pr_first_reponse = self.es_in.search(index=self.pr_index, body=query_pr_first_reponse_avg)
+ if pr_first_reponse["hits"]["total"] == 0:
+ return None, None
+ pr_first_reponse_avg = pr_first_reponse['aggregations']["count_of_uuid"]['value']
+ query_pr_first_reponse_mid = self.get_uuid_count_query(
+ "percentiles", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date)
+ query_pr_first_reponse_mid["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }})
+ query_pr_first_reponse_mid["aggs"]["count_of_uuid"]["percentiles"]["percents"] = [
+ 50]
+ pr_first_reponse_mid = self.es_in.search(index=self.pr_index, body=query_pr_first_reponse_mid)[
+ 'aggregations']["count_of_uuid"]['values']['50.0']
+ pr_first_reponse_mid = pr_first_reponse_mid if pr_first_reponse_mid != 'NaN' else None
+ return pr_first_reponse_avg, pr_first_reponse_mid
+
+ def pr_open_time(self, date, repos_list):
+ query_pr_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot",
+ "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date)
+ query_pr_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }})
+ pr_opens_items = self.es_in.search(
+ index=self.pr_index, body=query_pr_opens)['hits']['hits']
+ if len(pr_opens_items) == 0:
+ return None, None
+ pr_open_time_repo = []
+ for item in pr_opens_items:
+ if 'state' in item['_source']:
+ if item['_source']['state'] == 'merged' and item['_source']['merged_at'] and str_to_datetime(item['_source']['merged_at']) < date:
+ pr_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], item['_source']['merged_at']))
+ if item['_source']['state'] == 'closed' and str_to_datetime(item['_source']['closed_at'] or item['_source']['updated_at']) < date:
+ pr_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], item['_source']['closed_at'] or item['_source']['updated_at']))
+ else:
+ pr_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], str(date)))
+ if len(pr_open_time_repo) == 0:
+ return None, None
+ pr_open_time_repo_avg = float(sum(pr_open_time_repo)/len(pr_open_time_repo))
+ pr_open_time_repo_mid = get_medium(pr_open_time_repo)
+ return pr_open_time_repo_avg, pr_open_time_repo_mid
+
+ def issue_first_reponse(self, date, repos_list):
+ query_issue_first_reponse_avg = self.get_uuid_count_query(
+ "avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date)
+ query_issue_first_reponse_avg["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ issue_first_reponse = self.es_in.search(index=self.issue_index, body=query_issue_first_reponse_avg)
+ if issue_first_reponse["hits"]["total"] == 0:
+ return None, None
+ issue_first_reponse_avg = issue_first_reponse['aggregations']["count_of_uuid"]['value']
+ query_issue_first_reponse_mid = self.get_uuid_count_query(
+ "percentiles", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date)
+ query_issue_first_reponse_mid["aggs"]["count_of_uuid"]["percentiles"]["percents"] = [
+ 50]
+ query_issue_first_reponse_mid["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ issue_first_reponse_mid = self.es_in.search(index=self.issue_index, body=query_issue_first_reponse_mid)[
+ 'aggregations']["count_of_uuid"]['values']['50.0']
+ issue_first_reponse_mid = issue_first_reponse_mid if not isinstance(issue_first_reponse_mid, str) else None
+ return issue_first_reponse_avg, issue_first_reponse_mid
+
+ def issue_open_time(self, date, repos_list):
+ query_issue_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date)
+ query_issue_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ issue_opens_items = self.es_in.search(index=self.issue_index, body=query_issue_opens)['hits']['hits']
+ if len(issue_opens_items) == 0:
+ return None, None
+ issue_open_time_repo = []
+ for item in issue_opens_items:
+ if 'state' in item['_source']:
+ if item['_source']['closed_at']:
+ if item['_source']['state'] in ['closed', 'rejected'] and str_to_datetime(item['_source']['closed_at']) < date:
+ issue_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], item['_source']['closed_at']))
+ else:
+ issue_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], str(date)))
+ if len(issue_open_time_repo) == 0:
+ return None, None
+ issue_open_time_repo_avg = sum(issue_open_time_repo)/len(issue_open_time_repo)
+ issue_open_time_repo_mid = get_medium(issue_open_time_repo)
+ return issue_open_time_repo_avg, issue_open_time_repo_mid
+
+ def comment_frequency(self, date, repos_list):
+ query_issue_comments_count = self.get_uuid_count_query(
+ "sum", repos_list, "num_of_comments_without_bot", date_field='grimoire_creation_date', size=0, from_date=(date-timedelta(days=90)), to_date=date)
+ query_issue_comments_count["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ issue = self.es_in.search(
+ index=self.issue_index, body=query_issue_comments_count)
+ try:
+ return float(issue['aggregations']["count_of_uuid"]['value']/issue["hits"]["total"])
+ except ZeroDivisionError:
+ return None
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ code_review_ratio, pr_count = self.code_review_ratio(date, repos_list)
+ # print("code_review_ratio", code_review_ratio)
+ code_merge_ratio, pr_merged_count = self.code_merge_ratio(date, repos_list)
+ # print("code_merge_ratio", code_merge_ratio)
+ git_pr_linked_ratio = self.git_pr_linked_ratio(date, repos_list)
+ # print("git_pr_linked_ratio", git_pr_linked_ratio)
+ pr_issue_linked_ratio = self.pr_issue_linked(date, repos_list)
+ # print("pr_issue_linked_ratio", pr_issue_linked_ratio)
+ pr_first_response_time = self.pr_first_response_time(date, repos_list)
+ # print("pr_first_response_time", pr_first_response_time)
+ pr_open_time = self.pr_open_time(date, repos_list)
+ issue_first = self.issue_first_reponse(date, repos_list)
+ # print(issue_first[0], issue_first[1])
+ issue_open_time = self.issue_open_time(date, repos_list)
+ comment_frequency = self.comment_frequency(date, repos_list)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'code_review_ratio': code_review_ratio,
+ 'code_merge_ratio': code_merge_ratio,
+ 'git_pr_linked_ratio': git_pr_linked_ratio[2],
+ 'pr_issue_linked_ratio': pr_issue_linked_ratio,
+ 'pr_first_response_time_avg': round(pr_first_response_time[0], 4) if pr_first_response_time[0] is not None else None,
+ 'pr_first_response_time_mid': round(pr_first_response_time[1], 4) if pr_first_response_time[1] is not None else None,
+ 'pr_open_time_avg': round(pr_open_time[0], 4) if pr_open_time[0] is not None else None,
+ 'pr_open_time_mid': round(pr_open_time[1], 4) if pr_open_time[1] is not None else None,
+ 'issue_first_reponse_avg': round(issue_first[0], 4) if issue_first[0] is not None else None,
+ 'issue_first_reponse_mid': round(issue_first[1], 4) if issue_first[1] is not None else None,
+ 'issue_open_time_avg': round(issue_open_time[0], 4) if issue_open_time[0] is not None else None,
+ 'issue_open_time_mid': round(issue_open_time[1], 4) if issue_open_time[1] is not None else None,
+ 'comment_frequency': float(round(comment_frequency, 4)) if comment_frequency is not None else None,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ # TODO
+ self.cache_last_metrics_data(metrics_data, last_metrics_data)
+ score = get_codeDevQuality_score(codeDevQuality_decay(metrics_data, last_metrics_data, level), level)
+ metrics_data["code_develop_quality_score"] = score
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+
+ def cache_last_metrics_data(self, item, last_metrics_data):
+ for i in ["issue_first_reponse_avg", "issue_first_reponse_mid",
+ "pr_open_time_avg","pr_open_time_mid",
+ "pr_first_response_time_avg", "pr_first_response_time_mid",
+ "comment_frequency", "code_merge_ratio", "code_review_ratio",
+ "pr_issue_linked_ratio", "git_pr_linked_ratio"]:
+ if item[i] != None:
+ data = [item[i],item['grimoire_creation_date']]
+ last_metrics_data[i] = data
diff --git a/metrics_model/codeSecurityModel.py b/metrics_model/codeSecurityModel.py
new file mode 100644
index 0000000..d21a816
--- /dev/null
+++ b/metrics_model/codeSecurityModel.py
@@ -0,0 +1,136 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ get_codeSecurity_score,
+ codeDevQuality_decay
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+import random
+class CodeSecurityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, cocom_index=None, colic_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.cocom_index = cocom_index
+ self.colic_index = colic_index
+ self.pr_comments_index = pr_comments_index
+ self.model_name = 'Code security'
+ self.company = None if company == None or company == 'None' else company
+
+ def bug_issue_open_time(self, date, repos_list):
+ query_issue_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot",
+ "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date)
+ query_issue_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }})
+ bug_query = {
+ "bool": {
+ "should": [{
+ "script": {
+ "script": "if (doc.containsKey('labels') && doc['labels'].size()>0) { for (int i = 0; i < doc['labels'].length; ++i){ if(doc['labels'][i].toLowerCase().indexOf('bug')!=-1|| doc['labels'][i].toLowerCase().indexOf('缺陷')!=-1){return true;}}}"
+ }
+ },
+ {
+ "script": {
+ "script": "if (doc.containsKey('issue_type') && doc['issue_type'].size()>0) { for (int i = 0; i < doc['issue_type'].length; ++i){ if(doc['issue_type'][i].toLowerCase().indexOf('bug')!=-1 || doc['issue_type'][i].toLowerCase().indexOf('缺陷')!=-1){return true;}}}"
+ }
+ }],
+ "minimum_should_match": 1
+ }
+ }
+ query_issue_opens["query"]["bool"]["must"].append(bug_query)
+ issue_opens_items = self.es_in.search(
+ index=self.issue_index, body=query_issue_opens)['hits']['hits']
+ if len(issue_opens_items) == 0:
+ return None, None
+ issue_open_time_repo = []
+ for item in issue_opens_items:
+ if 'state' in item['_source']:
+ if item['_source']['closed_at'] and item['_source']['state'] in ['closed', 'rejected'] and str_to_datetime(item['_source']['closed_at']) < date:
+ issue_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], item['_source']['closed_at']))
+ else:
+ issue_open_time_repo.append(get_time_diff_days(
+ item['_source']['created_at'], str(date)))
+ issue_open_time_repo_avg = sum(issue_open_time_repo)/len(issue_open_time_repo)
+ issue_open_time_repo_mid = get_medium(issue_open_time_repo)
+ return issue_open_time_repo_avg, issue_open_time_repo_mid
+
+ def code_cyclomatic_complexity(self, date, repos_list):
+ query = self.get_uuid_count_query('sum', repos_list, 'ccn', 'grimoire_creation_date', size=0, from_date=date-timedelta(days=90), to_date=date)
+ code_cyclomatic_complexity = self.es_in.search(index=self.cocom_index, body=query)[
+ 'aggregations']['count_of_uuid']['value']
+ return code_cyclomatic_complexity/12.85
+
+ def licenses_include_percent(self, date, repos_list):
+ query = self.get_uuid_count_query('sum', repos_list, 'has_license', 'grimoire_creation_date', size=0, from_date=date-timedelta(days=90), to_date=date)
+ answer = self.es_in.search(index=self.colic_index, body=query)
+ has_license_count = answer['aggregations']['count_of_uuid']['value']
+ total_files = answer['hits']['total'] if answer['hits']['total'] is not 0 else 1
+ return has_license_count / total_files
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ bug_issue_open_time = self.bug_issue_open_time(date, repos_list)
+ vulnerability_count = self.vulnerability_count(date, repos_list)
+ defect_count = self.defect_count(date, repos_list)
+ code_smell = self.code_smell(date, repos_list)
+ code_clone_percent = self.code_clone_percent(date, repos_list)
+ code_cyclomatic_complexity = self.code_cyclomatic_complexity(date, repos_list)
+ # print("code_cyclomatic_complexity", code_cyclomatic_complexity)
+ licenses_include_percent = self.licenses_include_percent(date, repos_list)
+ # print("licenses_include_percent", licenses_include_percent)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'bug_issue_open_time_avg': round(bug_issue_open_time[0], 4) if bug_issue_open_time[0] is not None else None,
+ 'bug_issue_open_time_mid': round(bug_issue_open_time[1], 4) if bug_issue_open_time[1] is not None else None,
+ 'vulnerability_count' : vulnerability_count,
+ 'defect_count': defect_count,
+ 'code_smell': code_smell,
+ 'code_clone_percent': code_clone_percent,
+ 'code_cyclomatic_complexity': code_cyclomatic_complexity,
+ 'licenses_include_percent': licenses_include_percent,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ # TODO
+ score = get_codeSecurity_score(metrics_data, level)
+ metrics_data["code_security_score"] = score
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
diff --git a/metrics_model/communityActivityModel.py b/metrics_model/communityActivityModel.py
new file mode 100644
index 0000000..f4fddce
--- /dev/null
+++ b/metrics_model/communityActivityModel.py
@@ -0,0 +1,100 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ get_codeSecurity_score,
+ get_communityActivity_score,
+ codeDevQuality_decay
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+
+class CommunityActivityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, issue_comments_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.issue_comments_index = issue_comments_index
+ self.pr_comments_index = pr_comments_index
+ self.model_name = 'community activity'
+ self.company = None if company == None or company == 'None' else company
+
+ def contributors_number(self, date, repos_list):
+ query_author_uuid_data = self.get_uuid_count_contribute_query(
+ repos_list, company=None, from_date=(date - timedelta(days=90)), to_date=date)
+ author_uuid_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query_author_uuid_data)[
+ 'aggregations']["count_of_contributors"]['value']
+ return author_uuid_count
+
+ def updated_since(self, date, repos_list):
+ updated_since_list = []
+ for repo in repos_list:
+ query_updated_since = self.get_updated_since_query(
+ [repo], date_field='metadata__updated_on', to_date=date)
+ updated_since = self.es_in.search(
+ index=self.git_index, body=query_updated_since)['hits']['hits']
+ if updated_since:
+ updated_since_list.append(get_time_diff_months(
+ updated_since[0]['_source']["metadata__updated_on"], str(date)))
+ if updated_since_list:
+ return sum(updated_since_list) / len(updated_since_list)
+ else:
+ return 0
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ contributors_number = self.contributors_number(date, repos_list)
+ # print("contributors_number", contributors_number)
+ updated_at = self.updated_since(date, repos_list)
+ print("updated_at", updated_at)
+ print("created_since", created_since)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'contributors_number': contributors_number,
+ 'updated_at': float(round(updated_at, 4)),
+ 'created_at': float(round(created_since, 4)),
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ # TODO
+ score = get_communityActivity_score(metrics_data, level)
+ metrics_data["community_activity_score"] = score
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+
diff --git a/metrics_model/humanDiversityModel.py b/metrics_model/humanDiversityModel.py
new file mode 100644
index 0000000..8631659
--- /dev/null
+++ b/metrics_model/humanDiversityModel.py
@@ -0,0 +1,208 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ get_codeSecurity_score,
+ get_communityActivity_score,
+ get_humanDiversity_score,
+ codeDevQuality_decay
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+
+class HumanDiversityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, issue_comments_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.issue_comments_index = issue_comments_index
+ self.pr_comments_index = pr_comments_index
+ self.model_name = 'human Diversity'
+ self.company = None if company == None or company == 'None' else company
+
+ def get_org_count_query(self, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "aggs": {
+ "count_of_orgs": {
+ "cardinality": {
+ "field": field
+ }
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["tag"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+
+ {"grimoire_creation_date":
+ {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}}
+ }
+ }]}},
+ }
+ return query
+
+ def location_distribution(self, date, repos_list):
+ query = self.get_org_count_query(repos_list, "tz", from_date=(date - timedelta(days=90)), to_date=date)
+ tz_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query)['aggregations']["count_of_orgs"]['value']
+ return tz_count
+
+ def organization_count(self, date, repos_list):
+ query = self.get_org_count_query(repos_list, "author_domain", from_date=(date - timedelta(days=90)), to_date=date)
+ org_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query)[
+ 'aggregations']["count_of_orgs"]['value']
+ return org_count
+
+ def bus_factor(self, date, repos_list):
+ query = {
+ "size": 0,
+ "track_total_hits": "true",
+ "aggs": {
+ "my_field_count": {
+ "terms": {
+ "field": "author_name",
+ "min_doc_count": 3
+ }
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["tag"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+
+ {"grimoire_creation_date":
+ {"gte": (date - timedelta(days=90)).strftime("%Y-%m-%d"), "lt": date.strftime("%Y-%m-%d")}}}
+ }
+ }]}},
+ }
+ answer = self.es_in.search(index=self.git_index, body=query)
+ half_total = answer["hits"]["total"] / 2
+ developers = answer["aggregations"]["my_field_count"]["buckets"]
+ result = 0
+ cur = 0
+ for dev in developers:
+ cur += dev["doc_count"]
+ result += 1
+ if cur >= half_total:
+ break
+ return result
+
+ def elephant_factor(self, date, repos_list):
+ query = {
+ "size": 0,
+ "track_total_hits": "true",
+ "aggs": {
+ "my_field_count": {
+ "terms": {
+ "field": "author_domain",
+ "min_doc_count": 3
+ }
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["tag"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+
+ {"grimoire_creation_date":
+ {"gte": (date - timedelta(days=90)).strftime("%Y-%m-%d"), "lt": date.strftime("%Y-%m-%d")}}}
+ }
+ }]}},
+ }
+ answer = self.es_in.search(index=self.git_index, body=query)
+ half_total = answer["hits"]["total"] / 2
+ developers = answer["aggregations"]["my_field_count"]["buckets"]
+ result = 0
+ cur = 0
+ for dev in developers:
+ cur += dev["doc_count"]
+ result += 1
+ if cur >= half_total:
+ break
+ return result
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ location_distribution = self.location_distribution(date, repos_list)
+ print("location_distribution", location_distribution)
+ organization_count = self.organization_count(date, repos_list)
+ print("organization_count", organization_count)
+ bus_factor = self.bus_factor(date, repos_list)
+ print("bus_factor", bus_factor)
+ elephant_factor = self.elephant_factor(date, repos_list)
+ print("elephant_factor", elephant_factor)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'location_distribution': location_distribution,
+ 'organization_count': organization_count,
+ 'bus_factor': bus_factor,
+ 'elephant_factor': elephant_factor,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ score = get_humanDiversity_score(metrics_data, level)
+ metrics_data["human_diversity_score"] = score
+ print("human_diversity_score", score)
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+
diff --git a/metrics_model/metrics_model.py b/metrics_model/metrics_model.py
new file mode 100644
index 0000000..3d5a25c
--- /dev/null
+++ b/metrics_model/metrics_model.py
@@ -0,0 +1,636 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2021-2022 Yehui Wang, Chenqi Shan
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Authors:
+# Yehui Wang
+# Chenqi Shan
+
+from perceval.backend import uuid
+from datetime import datetime, timedelta
+from urllib.parse import urlparse
+import json
+import yaml
+import pandas as pd
+import logging
+from grimoire_elk.enriched.utils import get_time_diff_days
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from elasticsearch import Elasticsearch, RequestsHttpConnection
+from elasticsearch import helpers
+from elasticsearch.exceptions import NotFoundError
+from grimoire_elk.elastic import ElasticSearch
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score
+ )
+
+import os
+import inspect
+import sys
+current_dir = os.path.dirname(os.path.abspath(
+ inspect.getfile(inspect.currentframe())))
+os.chdir(current_dir)
+sys.path.append('../')
+
+logger = logging.getLogger(__name__)
+
+MAX_BULK_UPDATE_SIZE = 500
+
+
+class MetricsModel:
+ def __init__(self, json_file, from_date, end_date, out_index=None, risk_index=None, community=None, level=None):
+ """Metrics Model is designed for the integration of multiple CHAOSS metrics.
+ :param json_file: the path of json file containing repository message.
+ :param out_index: target index for Metrics Model.
+ :param community: used to mark the repo belongs to which community.
+ :param level: str representation of the metrics, choose from repo, project, community.
+ """
+ self.json_file = json_file
+ self.out_index = out_index
+ self.risk_index = risk_index
+ self.community = community
+ self.level = level
+ self.from_date = from_date
+ self.end_date = end_date
+ self.date_list = get_date_list(from_date, end_date)
+
+ def metrics_model_metrics(self, elastic_url):
+ is_https = urlparse(elastic_url).scheme == 'https'
+ self.es_in = Elasticsearch(
+ elastic_url, use_ssl=is_https, verify_certs=False, connection_class=RequestsHttpConnection)
+ self.es_out = ElasticSearch(elastic_url, self.out_index)
+ print("here1")
+ self.risk_out = ElasticSearch(elastic_url, self.risk_index)
+ print("here2")
+ print(self.level)
+ all_repo_json = json.load(open(self.json_file))
+ if self.level == "community":
+ software_artifact_repos_list = []
+ governance_repos_list = []
+ for project in all_repo_json:
+ origin = 'gitee' if 'gitee' in self.issue_index else 'github'
+ origin_software_artifact = origin + "-software-artifact"
+ origin_governance = origin + "-governance"
+ for key in all_repo_json[project].keys():
+ if key == origin_software_artifact:
+ for j in all_repo_json[project].get(key):
+ software_artifact_repos_list.append(j)
+ if key == origin_governance:
+ for j in all_repo_json[project].get(key):
+ governance_repos_list.append(j)
+ all_repo_list = software_artifact_repos_list + governance_repos_list
+ if len(all_repo_list) > 0:
+ for repo in all_repo_list:
+ # last_time = self.last_metrics_model_time(repo, self.model_name, "repo")
+ # if last_time is None:
+ # self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo",
+ # date_list=get_date_list(self.from_date, self.end_date))
+ # if last_time is not None and last_time < self.end_date:
+ # self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo",
+ # date_list=get_date_list(last_time, self.end_date))
+ self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo",
+ date_list=get_date_list(self.from_date, self.end_date))
+ if len(software_artifact_repos_list) > 0:
+ self.metrics_model_enrich(software_artifact_repos_list, self.community, "software-artifact")
+ if len(governance_repos_list) > 0:
+ self.metrics_model_enrich(governance_repos_list, self.community, "governance")
+ if self.level == "project":
+ for project in all_repo_json:
+ software_artifact_repos_list = []
+ governance_repos_list = []
+ origin = 'gitee' if 'gitee' in self.issue_index else 'github'
+ origin_software_artifact = origin + "-software-artifact"
+ origin_governance = origin + "-governance"
+ for key in all_repo_json[project].keys():
+ if key == origin_software_artifact:
+ for j in all_repo_json[project].get(key):
+ software_artifact_repos_list.append(j)
+ if key == origin_governance:
+ for j in all_repo_json[project].get(key):
+ governance_repos_list.append(j)
+ all_repo_list = software_artifact_repos_list + governance_repos_list
+ if len(all_repo_list) > 0:
+ for repo in all_repo_list:
+ last_time = self.last_metrics_model_time(repo, self.model_name, "repo")
+ if last_time is None:
+ self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo",
+ date_list=get_date_list(self.from_date, self.end_date))
+ if last_time is not None and last_time < self.end_date:
+ self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo",
+ date_list=get_date_list(last_time, self.end_date))
+ if len(software_artifact_repos_list) > 0:
+ self.metrics_model_enrich(software_artifact_repos_list, project, "software-artifact")
+ if len(governance_repos_list) > 0:
+ self.metrics_model_enrich(governance_repos_list, project, "governance")
+ if self.level == "repo":
+ for project in all_repo_json:
+ origin = 'gitee' if 'gitee' in self.issue_index else 'github'
+ origin_software_artifact = origin + "-software-artifact"
+ origin_governance = origin + "-governance"
+ for key in all_repo_json[project].keys():
+ if key == origin_software_artifact or key == origin_governance or key == origin:
+ for j in all_repo_json[project].get(key):
+ self.metrics_model_enrich([j], j)
+
+ def metrics_model_enrich(repos_list, label, type=None, level=None, date_list=None):
+ pass
+
+ def get_last_metrics_model_query(self, repo_url, model_name, level):
+ query = {
+ "size": 1,
+ "query": {
+ "bool": {
+ "must": [
+ {
+ "match_phrase": {
+ "label": repo_url
+ }
+ },
+ {
+ "term": {
+ "model_name.keyword": model_name
+ }
+ },
+ {
+ "term": {
+ "level.keyword":level
+ }
+ }
+ ]
+ }
+ },
+ "sort": [
+ {
+ "grimoire_creation_date": {
+ "order": "desc",
+ "unmapped_type": "keyword"
+ }
+ }
+ ]
+ }
+ return query
+
+ def last_metrics_model_time(self, repo_url, model_name, level):
+ query = self.get_last_metrics_model_query(repo_url, model_name, level)
+ try:
+ query_hits = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"]
+ return query_hits[0]["_source"]["grimoire_creation_date"] if query_hits.__len__() > 0 else None
+ except NotFoundError:
+ return None
+
+ def created_since(self, date, repos_list):
+ created_since_list = []
+ for repo in repos_list:
+ query_first_commit_since = self.get_updated_since_query(
+ [repo], date_field='grimoire_creation_date', to_date=date, order="asc")
+ first_commit_since = self.es_in.search(
+ index=self.git_index, body=query_first_commit_since)['hits']['hits']
+ if len(first_commit_since) > 0:
+ creation_since = first_commit_since[0]['_source']["grimoire_creation_date"]
+ created_since_list.append(
+ get_time_diff_months(creation_since, str(date)))
+ # print(get_time_diff_months(creation_since, str(date)))
+ # print(repo)
+ if created_since_list:
+ return sum(created_since_list)
+ else:
+ return None
+
+ def get_uuid_count_query(self, option, repos_list, field, date_field="grimoire_creation_date", size=0, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": size,
+ "track_total_hits": "true",
+ "aggs": {"count_of_uuid":
+ {option:
+ {"field": field}
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["tag"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+ {date_field:
+ {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}}
+ }
+ }]}}
+ }
+ return query
+
+ def get_uuid_count_contribute_query(self, repos_list, company=None, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "aggs": {
+ "count_of_contributors": {
+ "cardinality": {
+ "field": "author_name"
+ }
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["tag"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+ {"grimoire_creation_date":
+ {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}}
+ }
+ }]}},
+ }
+
+ if company:
+ query["query"]["bool"]["must"] = [{"bool": {
+ "should": [
+ {
+ "simple_query_string": {
+ "query": company + "*",
+ "fields": [
+ "author_domain"
+ ]
+ }
+ }],
+ "minimum_should_match": 1}}]
+ return query
+
+ def get_updated_since_query(self, repos_list, date_field="grimoire_creation_date", order="desc", to_date=datetime_utcnow()):
+ query = {
+ "query": {
+ "bool": {
+ "should": [
+ {
+ "match_phrase": {
+ "tag": repo
+ }} for repo in repos_list],
+ "minimum_should_match": 1,
+ "filter": {
+ "range": {
+ date_field: {
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ },
+ "sort": [
+ {
+ date_field: {"order": order}
+ }
+ ]
+ }
+ return query
+
+ def get_issue_closed_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ option: {
+ "field": field
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "must": [{
+ "bool": {
+ "should": [{
+ "simple_query_string": {
+ "query": i,
+ "fields": ["tag"]
+ }}for i in repos_list],
+ "minimum_should_match": 1
+ }
+ }],
+ "must_not": [
+ {"term": {"state": "open"}},
+ {"term": {"state": "progressing"}}
+ ],
+ "filter": {
+ "range": {
+ "closed_at": {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return query
+
+ def get_pr_closed_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ option: {
+ "field": field
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "must": [{
+ "bool": {
+ "should": [{
+ "simple_query_string": {
+ "query": i,
+ "fields": ["tag"]
+ }}for i in repos_list],
+ "minimum_should_match": 1
+ }
+ },
+ {
+ "match_phrase": {
+ "pull_request": "true"
+ }
+ }
+ ],
+ "must_not": [
+ {"term": {"state": "open"}},
+ {"term": {"state": "progressing"}}
+ ],
+ "filter": {
+ "range": {
+ "closed_at": {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return query
+
+ def get_recent_releases_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "track_total_hits": True,
+ "aggs": {
+ "count_of_uuid": {
+ option: {
+ "field": field + '.keyword'
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "must": [{
+ "bool": {
+ "should": [{
+ "simple_query_string": {
+ "query": i,
+ "fields": ["tag.keyword"]
+ }}for i in repos_list],
+ "minimum_should_match": 1
+ }
+ }
+ ],
+ "filter": {
+ "range": {
+ "grimoire_creation_date": {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lt": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return query
+
+ # name list of author_name in a index
+ def get_all_CX_contributors(self, repos_list, search_index, pr=False, issue=False, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query_CX_users = {
+ "aggs": {
+ "name": {
+ "terms": {
+ "field": "author_name",
+ "size": 100000
+ }, "aggs": {
+ "date": {
+ "top_hits": {
+ "sort": [{
+ "grimoire_creation_date": {"order": "asc"}
+ }],
+ "size": 1
+ }
+ }
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "should": [
+ {
+ "simple_query_string": {
+ "query": i+"(*) OR " + i+"*",
+ "fields": [
+ "tag"
+ ]
+ }
+ } for i in repos_list
+ ],
+ "minimum_should_match": 1,
+ "filter": {
+ "range": {
+ "grimoire_creation_date": {
+ "gte": from_date.strftime("%Y-%m-%d"), "lte": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ },
+ "size": 0,
+ "from": 0
+ }
+ if pr:
+ query_CX_users["query"]["bool"]["must"] = {
+ "match_phrase": {
+ "pull_request": "true"
+ }
+ }
+ if issue:
+ query_CX_users["query"]["bool"]["must"] = {
+ "match_phrase": {
+ "pull_request": "false"
+ }
+ }
+ CX_contributors = self.es_in.search(index=search_index, body=query_CX_users)[
+ "aggregations"]["name"]["buckets"]
+ return [i["date"]["hits"]["hits"][0]["_source"] for i in CX_contributors]
+
+ def get_all_CX_comments_contributors(self, repos_list, search_index, pr=False, issue=False, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query_CX_users = {
+ "aggs": {
+ "name": {
+ "terms": {
+ "field": "author_name",
+ "size": 100000
+ }, "aggs": {
+ "date": {
+ "top_hits": {
+ "sort": [{
+ "grimoire_creation_date": {"order": "asc"}
+ }],
+ "size": 1
+ }
+ }
+ }
+ }
+ },
+ "query": {
+ "bool": {
+ "should": [
+ {
+ "simple_query_string": {
+ "query": i+"(*) OR " + i+"*",
+ "fields": [
+ "tag"
+ ]
+ }
+ } for i in repos_list
+ ],
+ "minimum_should_match": 1,
+ "filter": {
+ "range": {
+ "grimoire_creation_date": {
+ "gte": from_date.strftime("%Y-%m-%d"), "lte": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ }
+ },
+ "size": 1,
+ "from": 0
+ }
+ if pr:
+ query_CX_users["query"]["bool"]["must"] = [
+ {
+ "match_phrase": {
+ "item_type": "comment"
+ }
+ }]
+ # print(query_CX_users)
+ if issue:
+ query_CX_users["query"]["bool"]["must"] = [
+ {
+ "match_phrase": {
+ "item_type": "comment"
+ }
+ }, {
+ "match_phrase": {
+ "issue_pull_request": "false"
+ }
+ }]
+ CX_contributors = self.es_in.search(index=search_index, body=query_CX_users)[
+ "aggregations"]["name"]["buckets"]
+ all_contributors = [i["date"]["hits"]["hits"]
+ [0]["_source"] for i in CX_contributors]
+ return all_contributors
+
+ def query_commit_contributor_list(self, index, repo, from_date, to_date, page_size=100, search_after=[]):
+ query = {
+ "size": page_size,
+ "query": {
+ "bool": {
+ "must": [
+ {
+ "match_phrase": {
+ "repo_name.keyword": repo
+ }
+ }
+ ],
+ "filter": [
+ {
+ "range": {
+ "code_commit_date_list": {
+ "gte": from_date.strftime("%Y-%m-%d"),
+ "lte": to_date.strftime("%Y-%m-%d")
+ }
+ }
+ }
+ ]
+ }
+ },
+ "sort": [
+ {
+ "_id": {
+ "order": "asc"
+ }
+ }
+ ]
+ }
+ if len(search_after) > 0:
+ query['search_after'] = search_after
+ results = self.es_in.search(index=index, body=query)["hits"]["hits"]
+ return results
+
+ def get_commit_contributor_list(self, date, repos_list):
+ result_list = []
+ for repo in repos_list:
+ search_after = []
+ while True:
+ contributor_list = self.query_commit_contributor_list(self.contributors_index, repo, date - timedelta(days=90), date, 500, search_after)
+ if len(contributor_list) == 0:
+ break
+ search_after = contributor_list[len(contributor_list) - 1]["sort"]
+ result_list = result_list +[contributor["_source"] for contributor in contributor_list]
+ return result_list
+
+ def org_count(self, date, contributor_list):
+ org_name_set = set()
+ from_date = (date - timedelta(days=90)).strftime("%Y-%m-%d")
+ to_date = date.strftime("%Y-%m-%d")
+
+ for contributor in contributor_list:
+ for org in contributor["org_change_date_list"]:
+ if org.get("org_name") is not None and check_times_has_overlap(org["first_date"], org["last_date"], from_date, to_date):
+ org_name_set.add(org.get("org_name"))
+ return len(org_name_set)
+
diff --git a/metrics_model/statModel.py b/metrics_model/statModel.py
new file mode 100644
index 0000000..6e8f1b1
--- /dev/null
+++ b/metrics_model/statModel.py
@@ -0,0 +1,198 @@
+
+import logging
+
+from functools import reduce
+from urllib.parse import urlparse
+
+from perceval.backend import uuid
+
+from grimoire_elk.elastic import ElasticSearch
+from grimoirelab_toolkit.datetime import datetime_utcnow
+
+from elasticsearch import Elasticsearch, RequestsHttpConnection
+
+from .utils import (get_uuid, get_date_list)
+
+MAX_BULK_UPDATE_SIZE = 5000
+
+logger = logging.getLogger(__name__)
+
+class statModel:
+ """
+ MetricsSummary mainly designed to summarize the global data of MetricsModel.
+ :param metric_index: summarization target index name
+ :param from_date: summarization start date
+ :param end_date: summarization end date
+ :param out_index: summarization storage index name
+ """
+ def __init__(self, metric_index, model_name, from_date, end_date, out_index):
+ self.from_date = from_date
+ self.end_date = end_date
+ self.out_index = out_index
+ self.model_name = model_name
+ self.metric_index = metric_index
+ self.summary_name = self.__class__.__name__
+
+ def base_stat_method(self, field):
+ query = {
+ f"{field}_mean": {
+ 'avg': {
+ 'field': field
+ }
+ },
+ f"{field}_percent": {
+ 'percentiles': {
+ 'field': field,
+ 'percents': [10, 30, 50]
+ }
+ },
+ f"{field}_min": {
+ 'min': {
+ 'field': field
+ }
+ },
+ f"{field}_max": {
+ 'max': {
+ 'field': field
+ }
+ },
+ }
+ return query
+
+ def apply_stat_method(self, fields):
+ return reduce(lambda query, field: {**self.base_stat_method(field), **query}, fields, {})
+
+ def metrics_model_summary_query(self, date=None):
+ query = {
+ "size": 0,
+ "from": 0,
+ "query": {
+ "bool": {
+ "filter": [
+ {
+ "range": {
+ "grimoire_creation_date": {
+ "lte": date.strftime("%Y-%m-%d"),
+ "gte": date.strftime("%Y-%m-%d")
+ }
+ }
+ },
+ {
+ "term": {
+ "model_name.keyword": self.model_name
+ }
+ }
+ ]
+ }
+ },
+ "aggs": self.apply_stat_method(self.summary_fields())
+ }
+ body = self.es_in.search(index=self.metric_index, body=query)
+ return body
+
+ def metrics_model_enrich(self, result, field):
+ result['res'] = {
+ **result['res'],
+ **{
+ f"{field}_mean": result['aggs'][f"{field}_mean"]['value'],
+ f"{field}_10percent": result['aggs'][f"{field}_percent"]['values']['10.0'],
+ f"{field}_30percent": result['aggs'][f"{field}_percent"]['values']['30.0'],
+ f"{field}_50percent": result['aggs'][f"{field}_percent"]['values']['50.0'],
+ f"{field}_max": result['aggs'][f"{field}_max"]['value'],
+ f"{field}_min": result['aggs'][f"{field}_min"]['value'],
+ }
+ }
+ return result
+
+ def metrics_model_after_query(self, response):
+ aggregations = response.get('aggregations')
+ return reduce(self.metrics_model_enrich, self.summary_fields(), {'aggs': aggregations, 'res': {}})
+
+ def metrics_model_statistic(self, elastic_url):
+ is_https = urlparse(elastic_url).scheme == 'https'
+ self.es_in = Elasticsearch(
+ elastic_url, use_ssl=is_https, verify_certs=False, connection_class=RequestsHttpConnection)
+ self.es_out = ElasticSearch(elastic_url, self.out_index)
+ date_list = get_date_list(self.from_date, self.end_date)
+
+ item_datas = []
+ for date in date_list:
+ print(str(date) + "--" + self.summary_name)
+ response = self.metrics_model_summary_query(date)
+ summary_data = self.metrics_model_after_query(response)['res']
+ summary_meta = {
+ 'uuid': get_uuid(str(date), self.summary_name),
+ 'model_name': self.summary_name,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ summary_item = {**summary_meta, **summary_data}
+ item_datas.append(summary_item)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+
+class CodeDevActivityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'LOC_frequency',
+ 'contributor_count',
+ 'pr_count',
+ 'commit_frequency',
+ 'updated_issues_count',
+ 'is_maintained',
+ ]
+
+class CodeDevQualityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'code_review_ratio',
+ 'code_merge_ratio',
+ 'git_pr_linked_ratio',
+ 'pr_issue_linked_ratio',
+ 'pr_first_response_time_avg',
+ 'pr_first_response_time_mid',
+ 'pr_open_time_avg',
+ 'pr_open_time_mid',
+ 'issue_first_reponse_avg',
+ 'issue_first_reponse_mid',
+ 'issue_open_time_avg',
+ 'issue_open_time_mid',
+ 'comment_frequency',
+ ]
+
+class CodeSecurityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'bug_issue_open_time_avg',
+ 'bug_issue_open_time_mid',
+ 'vulnerability_count',
+ 'defect_count',
+ 'code_smell',
+ 'code_clone_percent',
+ 'code_cyclomatic_complexity',
+ 'licenses_include_percent'
+ ]
+
+class CommunityActivityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'contributors_number',
+ 'updated_at',
+ 'created_at'
+ ]
+class HumanDiversityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'location_distribution',
+ 'organization_count',
+ 'bus_factor',
+ 'elephant_factor'
+ ]
+class TechDiversityStatistic(statModel):
+ def summary_fields(self):
+ return [
+ 'language_distribution',
+ 'license_distribution',
+ ]
\ No newline at end of file
diff --git a/metrics_model/summaryModel.py b/metrics_model/summaryModel.py
new file mode 100644
index 0000000..4a018da
--- /dev/null
+++ b/metrics_model/summaryModel.py
@@ -0,0 +1,283 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ get_codeSecurity_score,
+ get_communityActivity_score,
+ get_humanDiversity_score,
+ get_techDiversity_score,
+ get_summary_score,
+ codeDevQuality_decay
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+
+class SummaryModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, colic_index=None, git_aoc_index=None, out_index=None, risk_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, risk_index, community, level)
+ self.issue_index = issue_index
+ self.git_index = git_index
+ self.model_name = 'summary'
+ self.company = None if company == None or company == 'None' else company
+
+ def get_score_query(self, model_name, date, repos_list):
+ query = {
+ "query": {
+ "bool": {
+ "must": [
+ {"match_phrase": {"model_name": model_name}},
+ {"match": {"grimoire_creation_date": date}},
+ {
+ "bool": {
+ "should": [
+ [{
+ "match_phrase": {
+ "label": i
+ }}for i in repos_list]
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "sort": [
+ { "metadata__enriched_on": "asc" }
+ ]
+ }
+ return query
+
+ def code_develop_activity_score(self, date, repos_list):
+ query = self.get_score_query("Code develop activity", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ code_develop_activity_score = data["code_develop_activity_score"]
+ is_maintained = data["is_maintained"]
+ return code_develop_activity_score, is_maintained
+
+ def code_develop_quality_score(self, date, repos_list):
+ query = self.get_score_query("Code develop Quality", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ code_develop_quality_score = data["code_develop_quality_score"]
+ pr_first_response_time_avg = data["pr_first_response_time_avg"]
+ pr_open_time_avg = data["pr_open_time_avg"]
+ issue_first_reponse_avg = data["issue_first_reponse_avg"]
+ issue_open_time_avg = data["issue_open_time_avg"]
+ return code_develop_quality_score, pr_first_response_time_avg, pr_open_time_avg, issue_first_reponse_avg, issue_open_time_avg
+
+ def code_security_score(self, date, repos_list):
+ query = self.get_score_query("Code security", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ code_security_score = data["code_security_score"]
+ bug_issue_open_time_avg = data["bug_issue_open_time_avg"]
+ vulnerability_count = data["vulnerability_count"]
+ defect_count = data["defect_count"]
+ code_smell = data["code_smell"]
+ code_clone_percent = data["code_clone_percent"]
+ code_cyclomatic_complexity = data["code_cyclomatic_complexity"]
+ licenses_include_percent = data["licenses_include_percent"]
+ return code_security_score, bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent
+
+ def community_activity_score(self, date, repos_list):
+ query = self.get_score_query("community activity", date.isoformat(), repos_list)
+ community_activity_score = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]["community_activity_score"]
+ return community_activity_score
+
+ def human_diversity_score(self, date, repos_list):
+ query = self.get_score_query("human Diversity", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ human_diversity_score = data["human_diversity_score"]
+ bus_factor = data["bus_factor"]
+ elephant_factor = data["elephant_factor"]
+ return human_diversity_score, bus_factor, elephant_factor
+
+ def tech_diversity_score(self, date, repos_list):
+ query = self.get_score_query("technology Diversity", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ tech_diversity_score = data["tech_diversity_score"]
+ license_distribution = data["license_distribution"]
+ return tech_diversity_score, license_distribution
+
+ def get_stat_query(self, model_name, date, repos_list):
+ query = {
+ "query": {
+ "bool": {
+ "must": [
+ {"match_phrase": {"model_name": model_name}},
+ {"match": {"grimoire_creation_date": date}}
+ ]
+ }
+ },
+ "sort": [
+ { "metadata__enriched_on": "asc" }
+ ]
+ }
+ return query
+
+ def CodeDevActivityStatistic(self, date, repos_list):
+ query = self.get_stat_query("CodeDevActivityStatistic", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ is_maintained_10percent = data["is_maintained_10percent"]
+ is_maintained_30percent = data["is_maintained_30percent"]
+ is_maintained_50percent = data["is_maintained_50percent"]
+ return is_maintained_10percent, is_maintained_30percent, is_maintained_50percent
+
+ def CodeDevQualityStatistic(self, date, repos_list):
+ query = self.get_stat_query("CodeDevQualityStatistic", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ pr_first_response_time_avg_10percent = data["pr_first_response_time_avg_10percent"]
+ pr_first_response_time_avg_30percent = data["pr_first_response_time_avg_30percent"]
+ pr_first_response_time_avg_50percent = data["pr_first_response_time_avg_50percent"]
+ pr_open_time_avg_10percent = data["pr_open_time_avg_10percent"]
+ pr_open_time_avg_30percent = data["pr_open_time_avg_30percent"]
+ pr_open_time_avg_50percent = data["pr_open_time_avg_50percent"]
+ issue_first_reponse_avg_10percent = data["issue_first_reponse_avg_10percent"]
+ issue_first_reponse_avg_30percent = data["issue_first_reponse_avg_30percent"]
+ issue_first_reponse_avg_50percent = data["issue_first_reponse_avg_50percent"]
+ issue_open_time_avg_10percent = data["issue_open_time_avg_10percent"]
+ issue_open_time_avg_30percent = data["issue_open_time_avg_30percent"]
+ issue_open_time_avg_50percent = data["issue_open_time_avg_50percent"]
+ return pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent, pr_first_response_time_avg_50percent, pr_open_time_avg_10percent, pr_open_time_avg_30percent, pr_open_time_avg_50percent, issue_first_reponse_avg_10percent,issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent
+
+ def CodeSecurityStatistic(self, date, repos_list):
+ query = self.get_stat_query("CodeSecurityStatistic", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ bug_issue_open_time_avg_10percent = data["bug_issue_open_time_avg_10percent"]
+ bug_issue_open_time_avg_30percent = data["bug_issue_open_time_avg_30percent"]
+ bug_issue_open_time_avg_50percent = data["bug_issue_open_time_avg_50percent"]
+ vulnerability_count_10percent = data["vulnerability_count_10percent"]
+ vulnerability_count_30percent = data["vulnerability_count_30percent"]
+ vulnerability_count_50percent = data["vulnerability_count_50percent"]
+ defect_count_10percent = data["defect_count_10percent"]
+ defect_count_30percent = data["defect_count_30percent"]
+ defect_count_50percent = data["defect_count_50percent"]
+ code_smell_10percent = data["code_smell_10percent"]
+ code_smell_30percent = data["code_smell_30percent"]
+ code_smell_50percent = data["code_smell_50percent"]
+ code_clone_percent_10percent = data["code_clone_percent_10percent"]
+ code_clone_percent_30percent = data["code_clone_percent_30percent"]
+ code_clone_percent_50percent = data["code_clone_percent_50percent"]
+ code_cyclomatic_complexity_10percent = data["code_cyclomatic_complexity_10percent"]
+ code_cyclomatic_complexity_30percent = data["code_cyclomatic_complexity_30percent"]
+ code_cyclomatic_complexity_50percent = data["code_cyclomatic_complexity_50percent"]
+ licenses_include_percent_10percent = data["licenses_include_percent_10percent"]
+ licenses_include_percent_30percent = data["licenses_include_percent_30percent"]
+ licenses_include_percent_50percent = data["licenses_include_percent_50percent"]
+ return bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent, defect_count_10percent, defect_count_30percent, defect_count_50percent, code_smell_10percent, code_smell_30percent, code_smell_50percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent
+
+ def HumanDiversityStatistic(self, date, repos_list):
+ query = self.get_stat_query("HumanDiversityStatistic", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ bus_factor_10percent = data["bus_factor_10percent"]
+ bus_factor_30percent = data["bus_factor_30percent"]
+ bus_factor_50percent = data["bus_factor_50percent"]
+ elephant_factor_10percent = data["elephant_factor_10percent"]
+ elephant_factor_30percent = data["elephant_factor_30percent"]
+ elephant_factor_50percent = data["elephant_factor_50percent"]
+ return bus_factor_10percent, bus_factor_30percent, bus_factor_50percent, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent
+
+ def TechDiversityStatistic(self, date, repos_list):
+ query = self.get_stat_query("TechDiversityStatistic", date.isoformat(), repos_list)
+ data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]
+ license_distribution_10percent = data["license_distribution_10percent"]
+ license_distribution_30percent = data["license_distribution_30percent"]
+ license_distribution_50percent = data["license_distribution_50percent"]
+ return license_distribution_10percent, license_distribution_30percent, license_distribution_50percent
+
+ def get_risk_level(slef, data, data_10percent, data_30percent, data_50percent):
+ if data is None or data_10percent is None or data_30percent is None or data_50percent is None:
+ return "良好"
+ if data < data_10percent:
+ return "严重预警"
+ elif data < data_30percent:
+ return "中度预警"
+ elif data < data_50percent:
+ return "轻度预警"
+ else:
+ return "良好"
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ print("here")
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ code_develop_activity_score, is_maintained = self.code_develop_activity_score(date, repos_list)
+ code_develop_quality_score, pr_first_response_time_avg, pr_open_time_avg, issue_first_reponse_avg, issue_open_time_avg = self.code_develop_quality_score(date, repos_list)
+ code_security_score, bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent = self.code_security_score(date, repos_list)
+ community_activity_score = self.community_activity_score(date, repos_list)
+ human_diversity_score, bus_factor, elephant_factor = self.human_diversity_score(date, repos_list)
+ tech_diversity_score, license_distribution = self.tech_diversity_score(date, repos_list)
+ is_maintained_10percent, is_maintained_30percent, is_maintained_50percent = self.CodeDevActivityStatistic(date, repos_list)
+ pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent, pr_first_response_time_avg_50percent, pr_open_time_avg_10percent, pr_open_time_avg_30percent, pr_open_time_avg_50percent, issue_first_reponse_avg_10percent,issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent = self.CodeDevQualityStatistic(date, repos_list)
+ bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent, defect_count_10percent, defect_count_30percent, defect_count_50percent, code_smell_10percent, code_smell_30percent, code_smell_50percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent = self.CodeSecurityStatistic(date, repos_list)
+ bus_factor_10percent, bus_factor_30percent, bus_factor_50percent, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent = self.HumanDiversityStatistic(date, repos_list)
+ license_distribution_10percent, license_distribution_30percent, license_distribution_50percent = self.TechDiversityStatistic(date, repos_list)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'copy_code_develop_activity_score': code_develop_activity_score,
+ 'copy_code_develop_quality_score': code_develop_quality_score,
+ 'copy_code_security_score': code_security_score,
+ 'copy_community_activity_score': community_activity_score,
+ 'copy_human_diversity_score': human_diversity_score,
+ 'copy_tech_diversity_score' : tech_diversity_score,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ score = get_summary_score(metrics_data, level)
+
+ metrics_data["summary_score"] = score
+
+ metrics_data["is_maintained_risk"] = self.get_risk_level(is_maintained, is_maintained_10percent, is_maintained_30percent,is_maintained_50percent)
+ metrics_data["pr_first_response_time_avg_risk"] = self.get_risk_level(pr_first_response_time_avg, pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent,pr_first_response_time_avg_50percent)
+ metrics_data["pr_open_time_avg_risk"] = self.get_risk_level(pr_open_time_avg, pr_open_time_avg_10percent, pr_open_time_avg_30percent,pr_open_time_avg_50percent)
+ metrics_data["issue_first_reponse_avg_risk"] = self.get_risk_level(issue_first_reponse_avg, issue_first_reponse_avg_10percent, issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent)
+ metrics_data["issue_open_time_avg_risk"] = self.get_risk_level(issue_open_time_avg, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent)
+ # bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent
+ metrics_data["bug_issue_open_time_avg_risk"] = self.get_risk_level(bug_issue_open_time_avg, bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent)
+ metrics_data["vulnerability_count_risk"] = self.get_risk_level(vulnerability_count, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent)
+ metrics_data["defect_count_risk"] = self.get_risk_level(defect_count, defect_count_10percent, defect_count_30percent, defect_count_50percent)
+ metrics_data["code_smell_risk"] = self.get_risk_level(code_smell, code_smell_10percent, code_smell_30percent, code_smell_50percent)
+ metrics_data["code_clone_percent_risk"] = self.get_risk_level(code_clone_percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent)
+ metrics_data["code_cyclomatic_complexity_risk"] = self.get_risk_level(code_cyclomatic_complexity, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent)
+ metrics_data["licenses_include_percent_risk"] = self.get_risk_level(licenses_include_percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent)
+ # bus_factor, elephant_factor
+ metrics_data["bus_factor_risk"] = self.get_risk_level(bus_factor, bus_factor_10percent, bus_factor_30percent, bus_factor_50percent)
+ metrics_data["elephant_factor_risk"] = self.get_risk_level(elephant_factor, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent)
+ # license_distribution
+ metrics_data["license_distribution_risk"] = self.get_risk_level(license_distribution, license_distribution_10percent, license_distribution_30percent, license_distribution_50percent)
+
+ item_datas.append(metrics_data)
+ # print(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ self.risk_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+ self.risk_out.bulk_upload(item_datas, "uuid")
+
diff --git a/metrics_model/techDiversityModel.py b/metrics_model/techDiversityModel.py
new file mode 100644
index 0000000..6e2ec4b
--- /dev/null
+++ b/metrics_model/techDiversityModel.py
@@ -0,0 +1,124 @@
+from .metrics_model import MetricsModel
+
+from .utils import (get_all_repo,
+ newest_message,
+ check_times_has_overlap,
+ add_release_message,
+ get_release_index_mapping,
+ create_release_index,
+ get_all_project,
+ get_time_diff_months,
+ get_medium,
+ get_uuid,
+ get_date_list,
+ get_codeDevActicity_score,
+ get_codeDevQuality_score,
+ get_codeSecurity_score,
+ get_communityActivity_score,
+ get_humanDiversity_score,
+ get_techDiversity_score,
+ codeDevQuality_decay
+ )
+
+import logging
+from datetime import datetime, timedelta
+logger = logging.getLogger(__name__)
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ str_to_datetime)
+from grimoire_elk.enriched.utils import get_time_diff_days
+MAX_BULK_UPDATE_SIZE = 500
+
+class TechDiversityModel(MetricsModel):
+ def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, colic_index=None, git_aoc_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None):
+ super().__init__(json_file, from_date, end_date, out_index, community, level)
+ self.git_index = git_index
+ self.issue_index = issue_index
+ self.repo_index = repo_index
+ self.git_branch = git_branch
+ self.pr_index = pr_index
+ self.pr_comments_index = pr_comments_index
+ self.git_aoc_index = git_aoc_index
+ self.colic_index = colic_index
+ self.model_name = 'technology Diversity'
+ self.company = None if company == None or company == 'None' else company
+
+ def get_org_count_query(self, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()):
+ query = {
+ "size": 0,
+ "aggs": {
+ "count_of_orgs": {
+ "cardinality": {
+ "field": field
+ }
+ }
+ },
+ "query":
+ {"bool": {
+ "must": [
+ {"bool":
+ {"should":
+ [{"simple_query_string":
+ {"query": i + "*",
+ "fields":
+ ["origin"]}}for i in repos_list],
+ "minimum_should_match": 1,
+ "filter":
+ {"range":
+
+ {"grimoire_creation_date":
+ {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}}
+ }
+ }]}},
+ }
+ return query
+
+ def language_distribution(self, date, repos_list):
+ query = self.get_org_count_query(repos_list, "file_ext", from_date=(date - timedelta(days=90)), to_date=date)
+ # print("query", query)
+ language_count = self.es_in.search(index=self.git_aoc_index, body=query)[
+ 'aggregations']["count_of_orgs"]['value']
+ return language_count
+
+ def license_distribution(self, date, repos_list):
+ query = self.get_org_count_query(repos_list, "license_name", from_date=(date - timedelta(days=90)), to_date=date)
+ # print("query", query)
+ language_count = self.es_in.search(index=self.colic_index, body=query)[
+ 'aggregations']["count_of_orgs"]['value']
+ return language_count
+
+
+ def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None):
+ level = level if level is not None else self.level
+ date_list = date_list if date_list is not None else self.date_list
+ item_datas = []
+ last_metrics_data = {}
+ self.commit_message_dict = {}
+ for date in date_list:
+ print(str(date)+"--"+self.model_name+"--"+label)
+ created_since = self.created_since(date, repos_list)
+ if created_since is None:
+ continue
+ language_distribution = self.language_distribution(date, repos_list)
+ # print("language_distribution",language_distribution)
+ license_distribution = self.license_distribution(date, repos_list)
+ # print("license_distribution", license_distribution)
+ metrics_data = {
+ 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type),
+ 'level': level,
+ 'type': type,
+ 'label': label,
+ 'model_name': self.model_name,
+ 'language_distribution': language_distribution,
+ 'license_distribution': license_distribution,
+ 'grimoire_creation_date': date.isoformat(),
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ score = get_techDiversity_score(metrics_data, level)
+ metrics_data["tech_diversity_score"] = score
+ print("tech_diversity_score", score)
+ item_datas.append(metrics_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ self.es_out.bulk_upload(item_datas, "uuid")
+ item_datas = []
+ self.es_out.bulk_upload(item_datas, "uuid")
+
diff --git a/metrics_model/utils.py b/metrics_model/utils.py
new file mode 100644
index 0000000..8d4a2d2
--- /dev/null
+++ b/metrics_model/utils.py
@@ -0,0 +1,620 @@
+import math
+import pendulum
+import pandas as pd
+
+from perceval.backend import uuid
+from datetime import datetime, timedelta
+from urllib.parse import urlparse
+import json
+import yaml
+import logging
+from grimoire_elk.enriched.utils import get_time_diff_days
+from grimoirelab_toolkit.datetime import (datetime_utcnow,
+ datetime_to_utc,
+ str_to_datetime)
+from elasticsearch import Elasticsearch, RequestsHttpConnection
+from elasticsearch import helpers
+from elasticsearch.exceptions import NotFoundError
+from grimoire_elk.elastic import ElasticSearch
+
+
+BACKOFF_FACTOR = 0.2
+MAX_RETRIES = 21
+MAX_RETRIES_ON_REDIRECT = 5
+MAX_RETRIES_ON_READ = 8
+MAX_RETRIES_ON_CONNECT = 21
+STATUS_FORCE_LIST = [408, 409, 429, 502, 503, 504]
+METADATA_FILTER_RAW = 'metadata__filter_raw'
+REPO_LABELS = 'repository_labels'
+
+######################### 代码开发活动 #############################################
+LOC_FREQUENCY_WEIGHT = 0.0729
+CONTRIBUTOR_COUNT_WEIGHT = 0.2517
+PR_COUNT_WEIGHT = 0.1582
+COMMIT_FREQUENCY_WEIGHT = 0.2033
+UPDATED_ISSUES_WEIGHT = 0.1426
+IS_MAINTAINED_WEIGHT = 0.1714
+
+LOC_FREQUENCY_THRESHOLD = 300000
+CONTRIBUTOR_COUNT_THRESHOLD = 1000
+PR_COUNT_THRESHOLD = 10000
+COMMIT_FREQUENCY_THRESHOLD = 1000
+UPDATED_ISSUES_THRESHOLD = 2500
+IS_MAINTAINED_THRESHOLD = 1
+
+LOC_FREQUENCY_MULTIPLE_THRESHOLD = 300000
+CONTRIBUTOR_COUNT_MULTIPLE_THRESHOLD = 1000
+PR_COUNT_MULTIPLE_THRESHOLD = 10000
+COMMIT_FREQUENCY_MULTIPLE_THRESHOLD = 1000
+UPDATED_ISSUES_MULTIPLE_THRESHOLD = 2500
+IS_MAINTAINED_MULTIPLE_THRESHOLD = 1
+
+######################### 代码开发效率 #############################################
+CODE_REVIEW_RATIO_WEIGHT = 0.1028
+CODE_MERGE_RATIO_WEIGHT = 0.1028
+COMMIT_PR_LINKED_RATIO_WEIGHT = 0.1561
+PR_ISSUE_LINKED_WEIGHT = 0.1164
+PR_FIRST_RESPONSE_WEIGHT = -0.1164
+PR_OPEN_TIME_WEIGHT = -0.1028
+ISSUE_FIRST_RESPONSE_WEIGHT = -0.1164
+ISSUE_OPEN_TIME_WEIGHT = -0.1028
+COMMENT_FREQUENCY_WEIGHT = 0.0836
+
+CODE_REVIEW_RATIO_THRESHOLD = 1
+CODE_MERGE_RATIO_THRESHOLD = 1
+COMMIT_PR_LINKED_RATIO_THRESHOLD = 1
+PR_ISSUE_LINKED_THRESHOLD = 1
+PR_FIRST_RESPONSE_THRESHOLD = 15
+PR_OPEN_TIME_THRESHOLD = 30
+ISSUE_FIRST_RESPONSE_THRESHOLD = 15
+ISSUE_OPEN_TIME_THRESHOLD = 30
+COMMENT_FREQUENCY_THRESHOLD = 10
+
+CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD = 1
+CODE_MERGE_RATIO_MULTIPLE_THRESHOLD = 1
+COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD = 1
+PR_ISSUE_LINKED_MULTIPLE_THRESHOLD = 1
+PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD = 15
+PR_OPEN_TIME_MULTIPLE_THRESHOLD = 30
+ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD = 15
+ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD = 30
+COMMENT_FREQUENCY_MULTIPLE_THRESHOLD = 10
+
+######################### 代码安全保障#############################################
+BUG_ISSUE_OPEN_TIME_WEIGHT = -0.2469
+VULNERABILITY_COUNT_WEIGHT = -0.2469
+DEFECT_COUNT_WEIGHT = -0.1396
+CODE_SMELL_WEIGHT = -0.0756
+CODE_CLONE_PERCENT_WEIGHT = -0.0756
+CODE_CYCLOMATIC_COMPLEXITY_WEIGHT = -0.0756
+LICENSSE_INCLUDE_PERCENT_WEIGHT = 0.1396
+
+BUG_ISSUE_OPEN_TIME_THRESHOLD = 60
+VULNERABILITY_COUNT_THRESHOLD = 60
+DEFECT_COUNT_THRESHOLD = 60
+CODE_SMELL_THRESHOLD = 60
+CODE_CLONE_PERCENT_THRESHOLD = 60
+CODE_CYCLOMATIC_COMPLEXITY_THRESHOLD = 60
+LICENSSE_INCLUDE_PERCENT_THRESHOLD = 1
+
+BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD = 60
+VULNERABILITY_COUNT_MULTIPLE_THRESHOLD = 60
+DEFECT_COUNT_MULTIPLE_THRESHOLD = 60
+CODE_SMELL_MULTIPLE_THRESHOLD = 60
+CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD = 60
+CODE_CYCLOMATIC_COMPLEXITY_MULTIPLE_THRESHOLD = 60
+LICENSSE_INCLUDE_PERCENT_MULTIPLE_THRESHOLD = 1
+
+######################### 社区活跃度 #############################################
+CONTRIBUTORS_NUMBER_WEIGHT = 0.5397
+UPDATED_AT_WEIGHT = -0.2970
+CREATED_AT_WEIGHT = 0.1634
+
+CONTRIBUTORS_NUMBER_THRESHOLD = 2000
+UPDATED_AT_THRESHOLD = 60
+CREATED_AT_THRESHOLD = 1000
+
+CONTRIBUTORS_NUMBER_MULTIPLE_THRESHOLD = 2000
+UPDATED_AT_MULTIPLE_THRESHOLD = 60
+CREATED_AT_MULTIPLE_THRESHOLD = 1000
+
+######################### 人员多样性 #############################################
+LOCATION_DISTRIBUTION_WEIGHT = 0.1223
+ORGANIZATION_COUNT_WEIGHT = 0.2271
+BUS_FACTOR_WEIGHT = 0.4236
+ELEPHANT_FACTOR_WEIGHT = 0.2271
+
+LOCATION_DISTRIBUTION_THRESHOLD = 24
+ORGANIZATION_COUNT_THRESHOLD = 50
+BUS_FACTOR_THRESHOLD = 50
+ELEPHANT_FACTOR_THRESHOLD = 50
+
+LOCATION_DISTRIBUTION_MULTIPLE_THRESHOLD = 24
+ORGANIZATION_COUNT_MULTIPLE_THRESHOLD = 50
+BUS_FACTOR_MULTIPLE_THRESHOLD = 50
+ELEPHANT_FACTOR_MULTIPLE_THRESHOLD = 50
+######################### 技术多样性 #############################################
+LANGUAGE_DISTRIBUTION_WEIGHT = 0.5000
+LICENSE_DISTRIBUTION_WEIGHT = 0.5000
+
+LANGUAGE_DISTRIBUTION_THRESHOLD = 50
+LICENSE_DISTRIBUTION_THRESHOLD = 20
+
+LANGUAGE_DISTRIBUTION_MULTIPLE_THRESHOLD = 100
+LICENSE_DISTRIBUTION_MULTIPLE_THRESHOLD = 20
+
+######################### 总结 #############################################
+CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT = 0.1813
+CODE_DEVELOP_QUALITY_SCORE_WEIGHT = 0.1813
+CODE_SECURITY_SCORE_WEIGHT = 0.3209
+COMMUNITY_ACTIVITY_SCORE_WEIGHT = 0.0933
+HUMAN_DIVERSITY_SCORE_WEIGHT = 0.1297
+TECH_DIVERSITY_SCORE_WEIGHT = 0.0933
+
+CODE_DEVELOP_ACTIVITY_SCORE_THRESHOLD = 100
+CODE_DEVELOP_QUALITY_SCORE_THRESHOLD = 100
+CODE_SECURITY_SCORE_THRESHOLD = 100
+COMMUNITY_ACTIVITY_SCORE_THRESHOLD = 100
+HUMAN_DIVERSITY_SCORE_THRESHOLD = 100
+TECH_DIVERSITY_SCORE_THRESHOLD = 100
+
+###################################################
+CODE_DEVELOP_ACTIVITY_SCORE_MIN = 0
+CODE_DEVELOP_QUALITY_SCORE_MIN = -3.5556
+CODE_SECURITY_SCORE_MIN = -0.0060
+COMMUNITY_ACTIVITY_SCORE_MIN = -0.4061
+HUMAN_DIVERSITY_SCORE_MIN = 0
+TECH_DIVERSITY_SCORE_MIN = 0
+SUMMARY_SCORE_MIN = 0.0444
+
+CODE_DEVELOP_ACTIVITY_SCORE_MAX = 0.9712
+CODE_DEVELOP_QUALITY_SCORE_MAX = 1.5810
+CODE_SECURITY_SCORE_MAX = 0.7757
+COMMUNITY_ACTIVITY_SCORE_MAX = 1.5217
+HUMAN_DIVERSITY_SCORE_MAX = 0.6629
+TECH_DIVERSITY_SCORE_MAX = 1.0
+SUMMARY_SCORE_MAX = 0.2921
+
+
+DECAY_COEFFICIENT = 0.0027
+
+
+def get_all_repo(file, source):
+ '''Get all repo from json file'''
+ all_repo_json = json.load(open(file))
+ all_repo = []
+ origin = 'gitee' if 'gitee' in source else 'github'
+ for i in all_repo_json:
+ for j in all_repo_json[i][origin]:
+ all_repo.append(j)
+ return all_repo
+
+def newest_message(repo_url):
+ query = {
+ "query": {
+ "match": {
+ "tag": repo_url
+ }
+ },
+ "sort": [
+ {
+ "metadata__updated_on": {"order": "desc"}
+ }
+ ]
+ }
+ return query
+
+def check_times_has_overlap(dyna_start_time, dyna_end_time, fixed_start_time, fixed_end_time):
+ return not (dyna_end_time < fixed_start_time or dyna_start_time > fixed_end_time)
+
+def add_release_message(es_client, out_index, repo_url, releases,):
+ item_datas = []
+ for item in releases:
+ release_data = {
+ "_index": out_index,
+ "_id": uuid(str(item["id"])),
+ "_source": {
+ "uuid": uuid(str(item["id"])),
+ "id": item["id"],
+ "tag": repo_url,
+ "tag_name": item["tag_name"],
+ "target_commitish": item["target_commitish"],
+ "prerelease": item["prerelease"],
+ "name": item["name"],
+ "author_login": item["author"]["login"],
+ "author_name": item["author"]["name"],
+ "grimoire_creation_date": item["created_at"],
+ 'metadata__enriched_on': datetime_utcnow().isoformat()
+ }
+ }
+ item_datas.append(release_data)
+ if len(item_datas) > MAX_BULK_UPDATE_SIZE:
+ helpers.bulk(client=es_client, actions=item_datas)
+ item_datas = []
+ helpers.bulk(client=es_client, actions=item_datas)
+
+
+def get_release_index_mapping():
+ mapping = {
+ "mappings" : {
+ "properties" : {
+ "author_login" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "author_name" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "body" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "grimoire_creation_date" : {
+ "type" : "date"
+ },
+ "id" : {
+ "type" : "long"
+ },
+ "name" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "prerelease" : {
+ "type" : "boolean"
+ },
+ "tag" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "tag_name" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "target_commitish" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ },
+ "uuid" : {
+ "type" : "text",
+ "fields" : {
+ "keyword" : {
+ "type" : "keyword",
+ "ignore_above" : 256
+ }
+ }
+ }
+ }
+ }
+ }
+ return mapping
+
+
+def create_release_index(es_client, all_repo, repo_index, release_index):
+ es_exist = es_client.indices.exists(index=release_index)
+ if not es_exist:
+ res = es_client.indices.create(index=release_index, body=get_release_index_mapping())
+ for repo_url in all_repo:
+ query = newest_message(repo_url)
+ query_hits = es_client.search(index=repo_index, body=query)["hits"]["hits"]
+ if len(query_hits) > 0 and query_hits[0]["_source"].get("releases"):
+ items = query_hits[0]["_source"]["releases"]
+ add_release_message(es_client, release_index, repo_url, items)
+
+def get_all_project(file):
+ '''Get all projects from json file'''
+ file_json = json.load(open(file))
+ all_project = []
+ for i in file_json:
+ all_project.append(i)
+ return all_project
+
+
+def get_time_diff_months(start, end):
+ ''' Number of months between two dates in UTC format '''
+
+ if start is None or end is None:
+ return None
+
+ if type(start) is not datetime:
+ start = str_to_datetime(start).replace(tzinfo=None)
+ if type(end) is not datetime:
+ end = str_to_datetime(end).replace(tzinfo=None)
+
+ seconds_month = float(60 * 60 * 24 * 30)
+ diff_months = (end - start).total_seconds() / seconds_month
+ diff_months = float('%.2f' % diff_months)
+
+ return diff_months
+
+
+def get_medium(L):
+ L.sort()
+ n = len(L)
+ m = int(n/2)
+ if n == 0:
+ return None
+ elif n % 2 == 0:
+ return (L[m]+L[m-1])/2.0
+ else:
+ return L[m]
+
+
+def get_uuid(*args):
+ args_list = []
+ for arg in args:
+ if arg is None or arg == '':
+ continue
+ args_list.append(arg)
+ return uuid(*args_list)
+
+def get_date_list(begin_date, end_date, freq='W-MON'):
+ '''Get date list from begin_date to end_date every Monday'''
+ date_list = [x for x in list(pd.date_range(freq=freq, start=datetime_to_utc(
+ str_to_datetime(begin_date)), end=datetime_to_utc(str_to_datetime(end_date))))]
+ return date_list
+
+def normalize(score, min_score, max_score):
+ return (score-min_score)/(max_score-min_score)
+
+def get_param_score(param, max_value, weight=1):
+ """Return paramater score given its current value, max value and
+ parameter weight."""
+ if param <= 0:
+ return (math.log(1 - param) / math.log(1 + max(-param, max_value))) * -weight
+ else:
+ return (math.log(1 + param) / math.log(1 + max(param, max_value))) * weight
+
+def get_score_ahp(item, param_dict):
+ total_weight = 0
+ total_param_score = 0
+ for key, value in param_dict.items():
+ total_weight += value[0]
+ param = 0
+ if item[key] is None:
+ if value[0] < 0:
+ param = value[1]
+ else:
+ param = item[key]
+ result = get_param_score(param,value[1] ,value[0])
+ total_param_score += result
+ try:
+ return round(total_param_score / total_weight, 5)
+ except ZeroDivisionError:
+ return 0.0
+
+def get_codeDevActicity_score(item, level="repo"):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ "LOC_frequency": [LOC_FREQUENCY_WEIGHT, LOC_FREQUENCY_MULTIPLE_THRESHOLD],
+ "contributor_count": [CONTRIBUTOR_COUNT_WEIGHT, CONTRIBUTOR_COUNT_MULTIPLE_THRESHOLD],
+ "pr_count": [PR_COUNT_WEIGHT, PR_COUNT_MULTIPLE_THRESHOLD],
+ "commit_frequency": [COMMIT_FREQUENCY_WEIGHT, COMMIT_FREQUENCY_MULTIPLE_THRESHOLD],
+ "updated_issues_count": [UPDATED_ISSUES_WEIGHT, UPDATED_ISSUES_MULTIPLE_THRESHOLD],
+ "is_maintained": [IS_MAINTAINED_WEIGHT, IS_MAINTAINED_MULTIPLE_THRESHOLD],
+ }
+ if level == "repo":
+ param_dict = {
+ "LOC_frequency":[LOC_FREQUENCY_WEIGHT, LOC_FREQUENCY_THRESHOLD],
+ "contributor_count":[CONTRIBUTOR_COUNT_WEIGHT, CONTRIBUTOR_COUNT_THRESHOLD],
+ "pr_count": [PR_COUNT_WEIGHT, PR_COUNT_THRESHOLD],
+ "commit_frequency": [COMMIT_FREQUENCY_WEIGHT, COMMIT_FREQUENCY_THRESHOLD],
+ "updated_issues_count": [UPDATED_ISSUES_WEIGHT, UPDATED_ISSUES_THRESHOLD],
+ "is_maintained": [IS_MAINTAINED_WEIGHT, IS_MAINTAINED_THRESHOLD],
+ }
+ return normalize(get_score_ahp(item, param_dict), CODE_DEVELOP_ACTIVITY_SCORE_MIN, CODE_DEVELOP_ACTIVITY_SCORE_MAX)
+
+def get_codeDevQuality_score(item, level='repo'):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ "code_review_ratio": [CODE_REVIEW_RATIO_WEIGHT, CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD],
+ "code_merge_ratio": [CODE_MERGE_RATIO_WEIGHT, CODE_MERGE_RATIO_MULTIPLE_THRESHOLD],
+ "git_pr_linked_ratio": [COMMIT_PR_LINKED_RATIO_WEIGHT, COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD],
+ "pr_issue_linked_ratio": [PR_ISSUE_LINKED_WEIGHT, PR_ISSUE_LINKED_MULTIPLE_THRESHOLD],
+ "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD],
+ "pr_first_response_time_mid":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD],
+ "pr_open_time_avg": [PR_OPEN_TIME_WEIGHT * 0.5, PR_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "pr_open_time_mid": [PR_OPEN_TIME_WEIGHT * 0.5, PR_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "issue_first_reponse_avg": [ISSUE_FIRST_RESPONSE_WEIGHT * 0.5, ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD],
+ "issue_first_reponse_mid": [ISSUE_FIRST_RESPONSE_WEIGHT * 0.5, ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD],
+ "issue_open_time_avg": [ISSUE_OPEN_TIME_WEIGHT * 0.5, ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "issue_open_time_mid": [ISSUE_OPEN_TIME_WEIGHT * 0.5, ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "comment_frequency": [COMMENT_FREQUENCY_WEIGHT, COMMENT_FREQUENCY_MULTIPLE_THRESHOLD],
+ }
+ if level == "repo":
+ param_dict = {
+ "code_review_ratio":[CODE_REVIEW_RATIO_WEIGHT, CODE_REVIEW_RATIO_THRESHOLD],
+ "code_merge_ratio":[CODE_MERGE_RATIO_WEIGHT, CODE_MERGE_RATIO_THRESHOLD],
+ "git_pr_linked_ratio":[COMMIT_PR_LINKED_RATIO_WEIGHT, COMMIT_PR_LINKED_RATIO_THRESHOLD],
+ "pr_issue_linked_ratio":[PR_ISSUE_LINKED_WEIGHT, PR_ISSUE_LINKED_THRESHOLD],
+ "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_THRESHOLD],
+ "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_THRESHOLD],
+ "pr_open_time_avg":[PR_OPEN_TIME_WEIGHT*0.5, PR_OPEN_TIME_THRESHOLD],
+ "pr_open_time_mid":[PR_OPEN_TIME_WEIGHT*0.5, PR_OPEN_TIME_THRESHOLD],
+ "issue_first_reponse_avg":[ISSUE_FIRST_RESPONSE_WEIGHT*0.5, ISSUE_FIRST_RESPONSE_THRESHOLD],
+ "issue_first_reponse_mid":[ISSUE_FIRST_RESPONSE_WEIGHT*0.5, ISSUE_FIRST_RESPONSE_THRESHOLD],
+ "issue_open_time_avg":[ISSUE_OPEN_TIME_WEIGHT*0.5, ISSUE_OPEN_TIME_THRESHOLD],
+ "issue_open_time_mid":[ISSUE_OPEN_TIME_WEIGHT*0.5, ISSUE_OPEN_TIME_THRESHOLD],
+ "comment_frequency":[COMMENT_FREQUENCY_WEIGHT, COMMENT_FREQUENCY_THRESHOLD],
+ }
+ return normalize(get_score_ahp(item, param_dict), CODE_DEVELOP_QUALITY_SCORE_MIN, CODE_DEVELOP_QUALITY_SCORE_MAX)
+
+def get_codeSecurity_score(item, level='repo'):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ "bug_issue_open_time_avg": [BUG_ISSUE_OPEN_TIME_WEIGHT * 0.5, BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "bug_issue_open_time_mid": [BUG_ISSUE_OPEN_TIME_WEIGHT * 0.5, BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD],
+ "vulnerability_count": [VULNERABILITY_COUNT_WEIGHT, VULNERABILITY_COUNT_MULTIPLE_THRESHOLD],
+ "defect_count": [DEFECT_COUNT_WEIGHT, DEFECT_COUNT_MULTIPLE_THRESHOLD],
+ "code_smell": [CODE_SMELL_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD],
+ "code_clone_percent": [CODE_CLONE_PERCENT_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD],
+ "code_cyclomatic_complexity": [CODE_CYCLOMATIC_COMPLEXITY_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD],
+ "licenses_include_percent": [LICENSSE_INCLUDE_PERCENT_WEIGHT, LICENSSE_INCLUDE_PERCENT_MULTIPLE_THRESHOLD]
+ }
+ if level == "repo":
+ param_dict = {
+ "bug_issue_open_time_avg":[BUG_ISSUE_OPEN_TIME_WEIGHT*0.5, BUG_ISSUE_OPEN_TIME_THRESHOLD],
+ "bug_issue_open_time_mid":[BUG_ISSUE_OPEN_TIME_WEIGHT*0.5, BUG_ISSUE_OPEN_TIME_THRESHOLD],
+ "vulnerability_count": [VULNERABILITY_COUNT_WEIGHT, VULNERABILITY_COUNT_THRESHOLD],
+ "defect_count": [DEFECT_COUNT_WEIGHT, DEFECT_COUNT_THRESHOLD],
+ "code_smell": [CODE_SMELL_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD],
+ "code_clone_percent": [CODE_CLONE_PERCENT_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD],
+ "code_cyclomatic_complexity": [CODE_CYCLOMATIC_COMPLEXITY_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD],
+ "licenses_include_percent": [LICENSSE_INCLUDE_PERCENT_WEIGHT, LICENSSE_INCLUDE_PERCENT_THRESHOLD]
+ }
+ return normalize(get_score_ahp(item, param_dict), CODE_SECURITY_SCORE_MIN, CODE_SECURITY_SCORE_MAX)
+
+def get_communityActivity_score(item, level='repo'):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ "contributors_number": [CONTRIBUTORS_NUMBER_WEIGHT, CONTRIBUTORS_NUMBER_MULTIPLE_THRESHOLD],
+ "updated_at": [UPDATED_AT_WEIGHT, UPDATED_AT_MULTIPLE_THRESHOLD],
+ "created_at": [CREATED_AT_WEIGHT, CREATED_AT_MULTIPLE_THRESHOLD]
+ }
+ if level == "repo":
+ param_dict = {
+ "contributors_number": [CONTRIBUTORS_NUMBER_WEIGHT, CONTRIBUTORS_NUMBER_THRESHOLD],
+ "updated_at": [UPDATED_AT_WEIGHT, UPDATED_AT_THRESHOLD],
+ "created_at": [CREATED_AT_WEIGHT, CREATED_AT_THRESHOLD]
+ }
+ return normalize(get_score_ahp(item, param_dict), COMMUNITY_ACTIVITY_SCORE_MIN, COMMUNITY_ACTIVITY_SCORE_MAX)
+
+def get_humanDiversity_score(item, level='repo'):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ 'location_distribution': [LOCATION_DISTRIBUTION_WEIGHT, LOCATION_DISTRIBUTION_MULTIPLE_THRESHOLD],
+ 'organization_count': [ORGANIZATION_COUNT_WEIGHT, ORGANIZATION_COUNT_MULTIPLE_THRESHOLD],
+ # 'organization_developer_count': [ORGANIZATION_DEVELOPER_COUNT_WEIGHT, ORGANIZATION_DEVELOPER_COUNT_MULTIPLE_THRESHOLD],
+ 'bus_factor': [BUS_FACTOR_WEIGHT, BUS_FACTOR_MULTIPLE_THRESHOLD],
+ 'elephant_factor': [ELEPHANT_FACTOR_WEIGHT, ELEPHANT_FACTOR_MULTIPLE_THRESHOLD]
+ }
+ if level == "repo":
+ param_dict = {
+ 'location_distribution': [LOCATION_DISTRIBUTION_WEIGHT, LOCATION_DISTRIBUTION_THRESHOLD],
+ 'organization_count': [ORGANIZATION_COUNT_WEIGHT, ORGANIZATION_COUNT_THRESHOLD],
+ # 'organization_developer_count': [ORGANIZATION_DEVELOPER_COUNT_WEIGHT, ORGANIZATION_DEVELOPER_COUNT_THRESHOLD],
+ 'bus_factor': [BUS_FACTOR_WEIGHT, BUS_FACTOR_THRESHOLD],
+ 'elephant_factor': [ELEPHANT_FACTOR_WEIGHT, ELEPHANT_FACTOR_THRESHOLD]
+ }
+ return normalize(get_score_ahp(item, param_dict), HUMAN_DIVERSITY_SCORE_MIN, HUMAN_DIVERSITY_SCORE_MAX)
+
+def get_techDiversity_score(item, level='repo'):
+ param_dict = {}
+ if level == "community" or level == "project":
+ param_dict = {
+ 'language_distribution': [LANGUAGE_DISTRIBUTION_WEIGHT, LANGUAGE_DISTRIBUTION_MULTIPLE_THRESHOLD],
+ 'license_distribution': [LICENSE_DISTRIBUTION_WEIGHT, LICENSE_DISTRIBUTION_MULTIPLE_THRESHOLD]
+ }
+ if level == "repo":
+ param_dict = {
+ 'language_distribution': [LANGUAGE_DISTRIBUTION_WEIGHT, LANGUAGE_DISTRIBUTION_THRESHOLD],
+ 'license_distribution': [LICENSE_DISTRIBUTION_WEIGHT, LICENSE_DISTRIBUTION_THRESHOLD]
+ }
+ return normalize(get_score_ahp(item, param_dict), TECH_DIVERSITY_SCORE_MIN, TECH_DIVERSITY_SCORE_MAX)
+
+def get_summary_score(item, level='repo'):
+ param_dict = {
+ 'copy_code_develop_activity_score': [CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT, CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT],
+ 'copy_code_develop_quality_score': [CODE_DEVELOP_QUALITY_SCORE_WEIGHT, CODE_DEVELOP_QUALITY_SCORE_THRESHOLD],
+ 'copy_code_security_score': [CODE_SECURITY_SCORE_WEIGHT, CODE_SECURITY_SCORE_THRESHOLD],
+ 'copy_community_activity_score': [COMMUNITY_ACTIVITY_SCORE_WEIGHT, COMMUNITY_ACTIVITY_SCORE_THRESHOLD],
+ 'copy_human_diversity_score': [HUMAN_DIVERSITY_SCORE_WEIGHT, HUMAN_DIVERSITY_SCORE_THRESHOLD],
+ 'copy_tech_diversity_score': [TECH_DIVERSITY_SCORE_WEIGHT, TECH_DIVERSITY_SCORE_THRESHOLD]
+ }
+ return normalize(get_score_ahp(item, param_dict), SUMMARY_SCORE_MIN, SUMMARY_SCORE_MAX)
+
+def increment_decay(last_data, threshold, days):
+ return min(last_data + DECAY_COEFFICIENT * threshold * days, threshold)
+
+def decrease_decay(last_data, threshold, days):
+ return max(last_data - DECAY_COEFFICIENT * threshold * days, 0)
+
+def codeDevQuality_decay(item, last_data, level="repo"):
+ if last_data == None:
+ return item
+ decay_item = item.copy()
+ increment_decay_dict = {}
+ decrease_decay_dict = {}
+ if level == "community" or level == "project":
+ increment_decay_dict = {
+ "issue_first_reponse_avg": ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD,
+ "issue_first_reponse_mid": ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD,
+ "pr_open_time_avg": PR_OPEN_TIME_MULTIPLE_THRESHOLD,
+ "pr_open_time_mid": PR_OPEN_TIME_MULTIPLE_THRESHOLD,
+ "pr_first_response_time_avg": PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD,
+ "pr_first_response_time_mid": PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD,
+
+ }
+ decrease_decay_dict = {
+ "code_merge_ratio": CODE_MERGE_RATIO_MULTIPLE_THRESHOLD,
+ "code_review_ratio": CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD,
+ "pr_issue_linked_ratio": PR_ISSUE_LINKED_MULTIPLE_THRESHOLD,
+ "git_pr_linked_ratio": COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD,
+ "comment_frequency": COMMENT_FREQUENCY_MULTIPLE_THRESHOLD,
+ }
+ if level == "repo":
+ increment_decay_dict = {
+ "issue_first_reponse_avg":ISSUE_FIRST_RESPONSE_THRESHOLD,
+ "issue_first_reponse_mid":ISSUE_FIRST_RESPONSE_THRESHOLD,
+ "pr_open_time_avg":PR_OPEN_TIME_THRESHOLD,
+ "pr_open_time_mid":PR_OPEN_TIME_THRESHOLD,
+ "pr_first_response_time_avg": PR_FIRST_RESPONSE_THRESHOLD,
+ "pr_first_response_time_mid": PR_FIRST_RESPONSE_THRESHOLD,
+ }
+ decrease_decay_dict = {
+ "code_merge_ratio": CODE_MERGE_RATIO_THRESHOLD,
+ "code_review_ratio":CODE_REVIEW_RATIO_THRESHOLD,
+ "pr_issue_linked_ratio":PR_ISSUE_LINKED_THRESHOLD,
+ "git_pr_linked_ratio":COMMIT_PR_LINKED_RATIO_THRESHOLD,
+ "comment_frequency":COMMENT_FREQUENCY_THRESHOLD,
+ }
+
+ for key, value in increment_decay_dict.items():
+ if item[key] == None and last_data.get(key) != None:
+ days = pendulum.parse(item['grimoire_creation_date']).diff(pendulum.parse(last_data[key][1])).days
+ decay_item[key] = round(increment_decay(last_data[key][0], value, days), 4)
+ for key, value in decrease_decay_dict.items():
+ if item[key] == None and last_data.get(key) != None:
+ days = pendulum.parse(item['grimoire_creation_date']).diff(pendulum.parse(last_data[key][1])).days
+ decay_item[key] = round(decrease_decay(last_data[key][0], value, days), 4)
+ return decay_item
\ No newline at end of file
diff --git a/organizations.json b/organizations.json
new file mode 100644
index 0000000..0b8f41e
--- /dev/null
+++ b/organizations.json
@@ -0,0 +1,11459 @@
+{
+ "blacklist": [],
+ "organizations": {
+ "2N Telekomunikace": [
+ {
+ "domain": "2n.cz",
+ "is_top": true
+ }
+ ],
+ "2Scale": [
+ {
+ "domain": "2scale.net",
+ "is_top": true
+ }
+ ],
+ "3ality Technica": [
+ {
+ "domain": "3alitydigital.de",
+ "is_top": true
+ },
+ {
+ "domain": "3alitytechnica.com",
+ "is_top": true
+ }
+ ],
+ "42on": [
+ {
+ "domain": "42on.com",
+ "is_top": true
+ }
+ ],
+ "4pi": [
+ {
+ "domain": "4pi.com",
+ "is_top": true
+ }
+ ],
+ "5e Technologies": [
+ {
+ "domain": "5etech.eu",
+ "is_top": true
+ },
+ {
+ "domain": "5etechnologies.com",
+ "is_top": true
+ }
+ ],
+ "6WIND": [
+ {
+ "domain": "6wind.com",
+ "is_top": true
+ }
+ ],
+ "8D Technologies": [
+ {
+ "domain": "8d.com",
+ "is_top": true
+ }
+ ],
+ "99cloud": [
+ {
+ "domain": "99cloud.net",
+ "is_top": true
+ }
+ ],
+ "Aalto University": [
+ {
+ "domain": "aalto.fi",
+ "is_top": true
+ }
+ ],
+ "A10": [
+ {
+ "domain": "a10networks.com",
+ "is_top": true
+ }
+ ],
+ "ADDI-DATA GmbH": [
+ {
+ "domain": "addi-data.com",
+ "is_top": true
+ }
+ ],
+ "ADLINK": [
+ {
+ "domain": "adlinktech.com",
+ "is_top": true
+ }
+ ],
+ "AG Interactive": [
+ {
+ "domain": "americangreetings.com",
+ "is_top": true
+ }
+ ],
+ "AGETO Service GmbH": [
+ {
+ "domain": "ageto.de",
+ "is_top": true
+ }
+ ],
+ "AGIX Linux": [
+ {
+ "domain": "agix.com.au",
+ "is_top": true
+ }
+ ],
+ "ALPHA-BIT": [
+ {
+ "domain": "alpha-bit.de",
+ "is_top": true
+ }
+ ],
+ "ALT Linux, Ltd.": [
+ {
+ "domain": "altlinux.com",
+ "is_top": true
+ },
+ {
+ "domain": "altlinux.ru",
+ "is_top": true
+ }
+ ],
+ "ALi": [
+ {
+ "domain": "alitech.com",
+ "is_top": true
+ }
+ ],
+ "AMD": [
+ {
+ "domain": "amd.com",
+ "is_top": true
+ },
+ {
+ "domain": "amd64.org",
+ "is_top": true
+ }
+ ],
+ "AMDOCS": [
+ {
+ "domain": "amdocs.com",
+ "is_top": true
+ }
+ ],
+ "ANDURAS AG": [
+ {
+ "domain": "anduras.de",
+ "is_top": true
+ }
+ ],
+ "APM": [
+ {
+ "domain": "amcc.com",
+ "is_top": true
+ },
+ {
+ "domain": "apm.com",
+ "is_top": true
+ }
+ ],
+ "ARM": [
+ {
+ "domain": "arm.com",
+ "is_top": true
+ }
+ ],
+ "ARVOO Engineering": [
+ {
+ "domain": "arvoo.com",
+ "is_top": true
+ },
+ {
+ "domain": "arvoo.nl",
+ "is_top": true
+ }
+ ],
+ "ASIX Electronics Corporation": [
+ {
+ "domain": "asix.com.tw",
+ "is_top": true
+ }
+ ],
+ "Association of Computing Machinery": [
+ {
+ "domain": "acm.org",
+ "is_top": true
+ }
+ ],
+ "AT&T": [
+ {
+ "domain": "att.com",
+ "is_top": true
+ },
+ {
+ "domain": "attinteractive.com",
+ "is_top": true
+ }
+ ],
+ "ATRON electronic": [
+ {
+ "domain": "atron.com",
+ "is_top": true
+ }
+ ],
+ "Abilis Systems": [
+ {
+ "domain": "abilis.com",
+ "is_top": true
+ }
+ ],
+ "Absolut Bank": [
+ {
+ "domain": "absolutbank.com",
+ "is_top": true
+ },
+ {
+ "domain": "absolutbank.ru",
+ "is_top": true
+ }
+ ],
+ "AbsoluteValue Systems, Inc.": [
+ {
+ "domain": "linux-wlan.com",
+ "is_top": true
+ }
+ ],
+ "Acaleph": [
+ {
+ "domain": "acale.ph",
+ "is_top": true
+ }
+ ],
+ "Accenture": [
+ {
+ "domain": "accenture.com",
+ "is_top": true
+ }
+ ],
+ "Acelio": [
+ {
+ "domain": "acelio.com",
+ "is_top": true
+ }
+ ],
+ "Acision": [
+ {
+ "domain": "acision.com",
+ "is_top": true
+ }
+ ],
+ "Acme Systems srl": [
+ {
+ "domain": "acmesystems.it",
+ "is_top": true
+ }
+ ],
+ "Aconex": [
+ {
+ "domain": "aconex.com",
+ "is_top": true
+ }
+ ],
+ "Acronis": [
+ {
+ "domain": "acronis.com",
+ "is_top": true
+ }
+ ],
+ "Actuate Corporation": [
+ {
+ "domain": "actuate.com",
+ "is_top": true
+ }
+ ],
+ "Aculab": [
+ {
+ "domain": "aculab.com",
+ "is_top": true
+ }
+ ],
+ "AdRem Technologies": [
+ {
+ "domain": "ademtechnologies.com",
+ "is_top": true
+ }
+ ],
+ "Adaptec": [
+ {
+ "domain": "adaptec.com",
+ "is_top": true
+ }
+ ],
+ "Adaptive Computing": [
+ {
+ "domain": "adaptivecomputing.com",
+ "is_top": true
+ }
+ ],
+ "Adeneo Embedded": [
+ {
+ "domain": "adeneo-embedded.com",
+ "is_top": true
+ }
+ ],
+ "Adetel Group": [
+ {
+ "domain": "adetelgroup.com",
+ "is_top": true
+ }
+ ],
+ "Adobe Systems, Inc.": [
+ {
+ "domain": "adobe.com",
+ "is_top": true
+ }
+ ],
+ "AgileMesh": [
+ {
+ "domain": "agilemesh.com",
+ "is_top": true
+ }
+ ],
+ "Agilent Technologies": [
+ {
+ "domain": "agilent.com",
+ "is_top": true
+ }
+ ],
+ "AimValley": [
+ {
+ "domain": "aimvalley.nl",
+ "is_top": true
+ }
+ ],
+ "AirGap IT": [
+ {
+ "domain": "airgapit.com",
+ "is_top": true
+ }
+ ],
+ "Airbus Group": [
+ {
+ "domain": "airbus.com",
+ "is_top": true
+ },
+ {
+ "domain": "airbusgroup.com",
+ "is_top": true
+ },
+ {
+ "domain": "casaespacio.com",
+ "is_top": true
+ },
+ {
+ "domain": "eads.com",
+ "is_top": true
+ }
+ ],
+ "Airvana": [
+ {
+ "domain": "airvana.com",
+ "is_top": true
+ }
+ ],
+ "Akamai Technologies": [
+ {
+ "domain": "akamai.com",
+ "is_top": true
+ }
+ ],
+ "Akanda, Inc.": [
+ {
+ "domain": "akanda.io",
+ "is_top": true
+ }
+ ],
+ "Alacritech": [
+ {
+ "domain": "alacritech.com",
+ "is_top": true
+ }
+ ],
+ "Alcatel-Lucent": [
+ {
+ "domain": "alcatel-lucent.com",
+ "is_top": true
+ },
+ {
+ "domain": "alcatel-lucent.fr",
+ "is_top": true
+ },
+ {
+ "domain": "alcatel.com",
+ "is_top": true
+ },
+ {
+ "domain": "bell-labs.com",
+ "is_top": true
+ },
+ {
+ "domain": "lucent.com",
+ "is_top": true
+ }
+ ],
+ "Alibaba": [
+ {
+ "domain": "alibaba-inc.com",
+ "is_top": true
+ },
+ {
+ "domain": "alibaba.com",
+ "is_top": true
+ }
+ ],
+ "Allegro": [
+ {
+ "domain": "allegro.pl",
+ "is_top": true
+ },
+ {
+ "domain": "allegrogroup.com",
+ "is_top": true
+ },
+ {
+ "domain": "allegrogroup.hu",
+ "is_top": true
+ },
+ {
+ "domain": "allegrogroup.ro",
+ "is_top": true
+ }
+ ],
+ "Allen Organ Company": [
+ {
+ "domain": "allen-organ.com",
+ "is_top": true
+ },
+ {
+ "domain": "allenorgan.com",
+ "is_top": true
+ }
+ ],
+ "Allied Telesis": [
+ {
+ "domain": "alliedtelesis.co.nz",
+ "is_top": true
+ }
+ ],
+ "Alsatis": [
+ {
+ "domain": "alsatis.com",
+ "is_top": true
+ }
+ ],
+ "Alter Way": [
+ {
+ "domain": "alterway.fr",
+ "is_top": true
+ }
+ ],
+ "Altiscale": [
+ {
+ "domain": "altiscale.com",
+ "is_top": true
+ }
+ ],
+ "Altran": [
+ {
+ "domain": "altran.com",
+ "is_top": true
+ }
+ ],
+ "Alyseo": [
+ {
+ "domain": "alyseo.com",
+ "is_top": true
+ }
+ ],
+ "Amadeus": [
+ {
+ "domain": "amadeus.com",
+ "is_top": true
+ }
+ ],
+ "Amarula Solutions": [
+ {
+ "domain": "amarulasolutions.com",
+ "is_top": true
+ }
+ ],
+ "Amazon.com": [
+ {
+ "domain": "amazon.com",
+ "is_top": true
+ },
+ {
+ "domain": "lab126.com",
+ "is_top": true
+ }
+ ],
+ "Ambarella": [
+ {
+ "domain": "ambarella.com",
+ "is_top": true
+ }
+ ],
+ "American Microsystems, Ltd.": [
+ {
+ "domain": "amltd.com",
+ "is_top": true
+ }
+ ],
+ "American University": [
+ {
+ "domain": "american.edu",
+ "is_top": true
+ }
+ ],
+ "Ammeon": [
+ {
+ "domain": "ammeon.com",
+ "is_top": true
+ }
+ ],
+ "Anachron BV": [
+ {
+ "domain": "anachron.com",
+ "is_top": true
+ }
+ ],
+ "Antmicro": [
+ {
+ "domain": "antmicro.com",
+ "is_top": true
+ }
+ ],
+ "Anagramm GmbH": [
+ {
+ "domain": "anagramm.de",
+ "is_top": true
+ }
+ ],
+ "Analog Devices": [
+ {
+ "domain": "analog.com",
+ "is_top": true
+ }
+ ],
+ "Anchor Hosting": [
+ {
+ "domain": "anchor.com.au",
+ "is_top": true
+ }
+ ],
+ "Anevia": [
+ {
+ "domain": "anevia-group.com",
+ "is_top": true
+ },
+ {
+ "domain": "anevia.com",
+ "is_top": true
+ }
+ ],
+ "Ansible": [
+ {
+ "domain": "ansible.com",
+ "is_top": true
+ }
+ ],
+ "Anso Labs": [
+ {
+ "domain": "ansolabs.com",
+ "is_top": true
+ }
+ ],
+ "AnswerNet.Com": [
+ {
+ "domain": "answernet.com",
+ "is_top": true
+ }
+ ],
+ "Antagonist B.V.": [
+ {
+ "domain": "antagonist.nl",
+ "is_top": true
+ }
+ ],
+ "Apigee Corp": [
+ {
+ "domain": "apigee.com",
+ "is_top": true
+ }
+ ],
+ "AppDynamics": [
+ {
+ "domain": "appdynamics.com",
+ "is_top": true
+ }
+ ],
+ "Appear TV AS": [
+ {
+ "domain": "appeartv.com",
+ "is_top": true
+ }
+ ],
+ "Apple": [
+ {
+ "domain": "apple.com",
+ "is_top": true
+ }
+ ],
+ "Applied Micro Circuit Corporation": [],
+ "Aptana, Inc.": [
+ {
+ "domain": "aptana.com",
+ "is_top": true
+ }
+ ],
+ "Aptira": [
+ {
+ "domain": "aptira.com",
+ "is_top": true
+ }
+ ],
+ "Arastra, Inc.": [],
+ "Arcor lhr": [
+ {
+ "domain": "arcor.de",
+ "is_top": true
+ }
+ ],
+ "Areca": [
+ {
+ "domain": "areca.com.tw",
+ "is_top": true
+ }
+ ],
+ "Argonne National Laboratory": [
+ {
+ "domain": "anl.gov",
+ "is_top": true
+ }
+ ],
+ "Arista Networks": [
+ {
+ "domain": "arastra.com",
+ "is_top": true
+ },
+ {
+ "domain": "arista.com",
+ "is_top": true
+ },
+ {
+ "domain": "aristanetworks.com",
+ "is_top": true
+ }
+ ],
+ "Arkena": [
+ {
+ "domain": "arkena.com",
+ "is_top": true
+ }
+ ],
+ "Arkoon": [
+ {
+ "domain": "arkoon.com",
+ "is_top": true
+ }
+ ],
+ "Armadeus Systems": [
+ {
+ "domain": "armadeus.com",
+ "is_top": true
+ }
+ ],
+ "Armory Technologies, Inc.": [
+ {
+ "domain": "bitcoinarmory.com",
+ "is_top": true
+ }
+ ],
+ "Artec Design": [
+ {
+ "domain": "artecdesign.ee",
+ "is_top": true
+ }
+ ],
+ "ArtiBit": [
+ {
+ "domain": "artibit.com",
+ "is_top": true
+ }
+ ],
+ "Ascom": [
+ {
+ "domain": "ascom.ch",
+ "is_top": true
+ }
+ ],
+ "Askbot": [
+ {
+ "domain": "askbot.com",
+ "is_top": true
+ }
+ ],
+ "Astaro": [
+ {
+ "domain": "astaro.com",
+ "is_top": true
+ }
+ ],
+ "Astek Corporation": [
+ {
+ "domain": "astekcorp.com",
+ "is_top": true
+ }
+ ],
+ "Athabasca University": [
+ {
+ "domain": "athabascau.ca",
+ "is_top": true
+ }
+ ],
+ "Atheros Communications": [
+ {
+ "domain": "atheros.com",
+ "is_top": true
+ }
+ ],
+ "Athlone Institute of Technology": [
+ {
+ "domain": "ait.ie",
+ "is_top": true
+ }
+ ],
+ "Atlassian": [
+ {
+ "domain": "atlassian.com",
+ "is_top": true
+ }
+ ],
+ "Atmel": [
+ {
+ "domain": "atmel.com",
+ "is_top": true
+ }
+ ],
+ "Atomia": [
+ {
+ "domain": "atomia.com",
+ "is_top": true
+ }
+ ],
+ "Atomide": [
+ {
+ "domain": "atomide.com",
+ "is_top": true
+ }
+ ],
+ "Atos Integration": [
+ {
+ "domain": "atos.net",
+ "is_top": true
+ }
+ ],
+ "AudioScience, Inc.": [
+ {
+ "domain": "audioscience.com",
+ "is_top": true
+ }
+ ],
+ "Auerswald": [
+ {
+ "domain": "auerswald.de",
+ "is_top": true
+ }
+ ],
+ "AutoScout24 GmbH": [
+ {
+ "domain": "autoscout24.com",
+ "is_top": true
+ }
+ ],
+ "Avago Technologies": [
+ {
+ "domain": "avagotech.com",
+ "is_top": true
+ }
+ ],
+ "AvantSoft, Inc": [
+ {
+ "domain": "avantos.com",
+ "is_top": true
+ }
+ ],
+ "Avi Networks": [
+ {
+ "domain": "avinetworks.com",
+ "is_top": true
+ }
+ ],
+ "Avionic Design Development GmbH": [
+ {
+ "domain": "avionic-design.de",
+ "is_top": true
+ }
+ ],
+ "Avocent": [
+ {
+ "domain": "avocent.com",
+ "is_top": true
+ }
+ ],
+ "Avtrex": [
+ {
+ "domain": "avtrex.com",
+ "is_top": true
+ }
+ ],
+ "Awcloud": [
+ {
+ "domain": "awcloud.com",
+ "is_top": true
+ }
+ ],
+ "Axis Communications AB": [
+ {
+ "domain": "axis.com",
+ "is_top": true
+ }
+ ],
+ "Axway": [
+ {
+ "domain": "axway.com",
+ "is_top": true
+ }
+ ],
+ "Azingo, Inc.": [
+ {
+ "domain": "azingo.com",
+ "is_top": true
+ }
+ ],
+ "B Labs": [
+ {
+ "domain": "b-labs.co.uk",
+ "is_top": false
+ }
+ ],
+ "B1 Systems": [
+ {
+ "domain": "b1-systems.de",
+ "is_top": true
+ }
+ ],
+ "BCI": [
+ {
+ "domain": "bci.co.mz",
+ "is_top": true
+ }
+ ],
+ "BEA": [
+ {
+ "domain": "Bea-solutions.com",
+ "is_top": true
+ }
+ ],
+ "BIGBANK": [
+ {
+ "domain": "bigbank.at",
+ "is_top": true
+ },
+ {
+ "domain": "bigbank.de",
+ "is_top": true
+ },
+ {
+ "domain": "bigbank.ee",
+ "is_top": true
+ },
+ {
+ "domain": "bigbank.es",
+ "is_top": true
+ },
+ {
+ "domain": "bigbank.eu",
+ "is_top": true
+ },
+ {
+ "domain": "bigbank.lt",
+ "is_top": true
+ }
+ ],
+ "BMC Software": [
+ {
+ "domain": "bmc.com",
+ "is_top": true
+ }
+ ],
+ "BMW Group": [
+ {
+ "domain": "bmwgroup.com",
+ "is_top": true
+ }
+ ],
+ "BREDEX GmbH": [
+ {
+ "domain": "bredex.de",
+ "is_top": true
+ }
+ ],
+ "BSQUARE": [
+ {
+ "domain": "bsquare.com",
+ "is_top": true
+ }
+ ],
+ "BTChip": [
+ {
+ "domain": "btchip.com",
+ "is_top": true
+ }
+ ],
+ "BTicino": [
+ {
+ "domain": "bticino.it",
+ "is_top": true
+ }
+ ],
+ "BVOX": [
+ {
+ "domain": "bvox.net",
+ "is_top": true
+ }
+ ],
+ "Bacoosta IT Services": [
+ {
+ "domain": "bacoosta.com",
+ "is_top": true
+ }
+ ],
+ "Baidu": [
+ {
+ "domain": "baidu.com",
+ "is_top": true
+ }
+ ],
+ "BalaBit": [
+ {
+ "domain": "balabit.com",
+ "is_top": true
+ },
+ {
+ "domain": "balabit.hu",
+ "is_top": true
+ }
+ ],
+ "Banno, LLC": [
+ {
+ "domain": "banno.com",
+ "is_top": true
+ }
+ ],
+ "Barbon Insurance Group": [
+ {
+ "domain": "barbon.com",
+ "is_top": true
+ }
+ ],
+ "Barco": [
+ {
+ "domain": "barco.com",
+ "is_top": true
+ }
+ ],
+ "Basler AG": [
+ {
+ "domain": "baslerweb.com",
+ "is_top": true
+ }
+ ],
+ "Bay": [
+ {
+ "domain": "bay.ws",
+ "is_top": false
+ }
+ ],
+ "Bayan": [
+ {
+ "domain": "bayan.co.ir",
+ "is_top": true
+ }
+ ],
+ "Bazaarvoice": [
+ {
+ "domain": "bazaarvoice.com",
+ "is_top": true
+ }
+ ],
+ "BBVA Data & Analytics": [
+ {
+ "domain": "bbvadata.com",
+ "is_top": true
+ }
+ ],
+ "BDTi": [
+ {
+ "domain": "bdti.com",
+ "is_top": true
+ }
+ ],
+ "Beamly": [
+ {
+ "domain": "beamly.com",
+ "is_top": true
+ }
+ ],
+ "Beijing Rising Technology Co.": [
+ {
+ "domain": "rising-global.com",
+ "is_top": true
+ },
+ {
+ "domain": "rising.com.cn",
+ "is_top": true
+ }
+ ],
+ "Belden": [
+ {
+ "domain": "belden.com",
+ "is_top": true
+ }
+ ],
+ "BestSolution": [
+ {
+ "domain": "bestsolution.at",
+ "is_top": true
+ }
+ ],
+ "BetterLinux": [
+ {
+ "domain": "betterlinux.com",
+ "is_top": true
+ }
+ ],
+ "Big Switch Networks": [
+ {
+ "domain": "bigswitch.com",
+ "is_top": true
+ }
+ ],
+ "Bigfoot Networks": [
+ {
+ "domain": "bigfootnetworks.com",
+ "is_top": true
+ }
+ ],
+ "Bigpoint": [
+ {
+ "domain": "bigppoint.com",
+ "is_top": true
+ },
+ {
+ "domain": "bigppoint.net",
+ "is_top": true
+ }
+ ],
+ "Bingham University": [
+ {
+ "domain": "binghamuni.edu.ng",
+ "is_top": true
+ }
+ ],
+ "Bird": [
+ {
+ "domain": "bird.co",
+ "is_top": true
+ }
+ ],
+ "Birst": [
+ {
+ "domain": "birst.com",
+ "is_top": true
+ }
+ ],
+ "Bit-isle, Inc.": [
+ {
+ "domain": "bit-isle.jp",
+ "is_top": true
+ }
+ ],
+ "BitBox, Ltd.": [
+ {
+ "domain": "bitbox.co.uk",
+ "is_top": true
+ }
+ ],
+ "BitGo": [
+ {
+ "domain": "bitgo.com",
+ "is_top": true
+ }
+ ],
+ "BitPay": [
+ {
+ "domain": "bitpay.com",
+ "is_top": true
+ }
+ ],
+ "BitSim": [
+ {
+ "domain": "bitsim.com",
+ "is_top": true
+ }
+ ],
+ "BitSource.org": [
+ {
+ "domain": "bitsource.org",
+ "is_top": true
+ }
+ ],
+ "BitWagon Software": [
+ {
+ "domain": "bitwagon.com",
+ "is_top": true
+ }
+ ],
+ "Bitcoin Foundation": [
+ {
+ "domain": "bitcoin-contact.org",
+ "is_top": true
+ },
+ {
+ "domain": "bitcoin.org.pl",
+ "is_top": true
+ }
+ ],
+ "Bitergia": [
+ {
+ "domain": "bitergia.com",
+ "is_top": true
+ }
+ ],
+ "Bitfrost": [
+ {
+ "domain": "bitfrost.no",
+ "is_top": true
+ }
+ ],
+ "Bitmer, Ltd.": [
+ {
+ "domain": "bitmer.com",
+ "is_top": true
+ }
+ ],
+ "Bits Of Proof": [
+ {
+ "domain": "bitsofproof.com",
+ "is_top": true
+ }
+ ],
+ "Bitwise": [
+ {
+ "domain": "bitwise.io",
+ "is_top": true
+ }
+ ],
+ "Bivio Networks, Inc.": [
+ {
+ "domain": "bivio.net",
+ "is_top": true
+ }
+ ],
+ "Black Pearl Systems": [
+ {
+ "domain": "blackpearlsystems.com",
+ "is_top": true
+ }
+ ],
+ "BlackBerry": [
+ {
+ "domain": "rim.com",
+ "is_top": true
+ }
+ ],
+ "BlackMesh": [
+ {
+ "domain": "blackmesh.com",
+ "is_top": true
+ }
+ ],
+ "Blackberry Limited": [
+ {
+ "domain": "blackberry.com",
+ "is_top": true
+ }
+ ],
+ "Blackboard": [
+ {
+ "domain": "blackboard.com",
+ "is_top": true
+ }
+ ],
+ "BlankPage": [
+ {
+ "domain": "blankpage.ch",
+ "is_top": true
+ }
+ ],
+ "Blue Box Group": [
+ {
+ "domain": "bluebox.net",
+ "is_top": true
+ }
+ ],
+ "Blue Technix": [
+ {
+ "domain": "bluetechnix.at",
+ "is_top": true
+ }
+ ],
+ "Bluecherry, LLC": [
+ {
+ "domain": "bluecherry.net",
+ "is_top": true
+ }
+ ],
+ "Bluegiga": [
+ {
+ "domain": "bluegiga.com",
+ "is_top": true
+ }
+ ],
+ "Bluehost": [
+ {
+ "domain": "bluehost.com",
+ "is_top": true
+ }
+ ],
+ "Bluewater Systems": [
+ {
+ "domain": "bluewatersys.com",
+ "is_top": true
+ }
+ ],
+ "Bodeco, Inc.": [
+ {
+ "domain": "bodeco.io",
+ "is_top": true
+ }
+ ],
+ "Boeing": [
+ {
+ "domain": "boeing.com",
+ "is_top": true
+ }
+ ],
+ "Bollor\u00e9 Telecom": [
+ {
+ "domain": "bolloretelecom.eu",
+ "is_top": true
+ }
+ ],
+ "Borland Software Corp.": [
+ {
+ "domain": "borland.com",
+ "is_top": true
+ }
+ ],
+ "Bosch": [
+ {
+ "domain": "bosch-sensortec.com",
+ "is_top": true
+ },
+ {
+ "domain": "bosch.com",
+ "is_top": true
+ }
+ ],
+ "Bose Corporation": [
+ {
+ "domain": "bose.com",
+ "is_top": true
+ }
+ ],
+ "Boston Technologies, Inc.": [
+ {
+ "domain": "bostontechnologies.com",
+ "is_top": true
+ }
+ ],
+ "Boundary Devices": [
+ {
+ "domain": "boundarydevices.com",
+ "is_top": true
+ }
+ ],
+ "Brastel Telecom": [
+ {
+ "domain": "brastel.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "brastel.com",
+ "is_top": true
+ }
+ ],
+ "Bright Tag": [
+ {
+ "domain": "thebrighttag.com",
+ "is_top": true
+ }
+ ],
+ "Brown University": [
+ {
+ "domain": "brown.edu",
+ "is_top": true
+ }
+ ],
+ "Brightcove Inc": [],
+ "Brinkster": [
+ {
+ "domain": "brinkster.com",
+ "is_top": true
+ }
+ ],
+ "Broadcom": [
+ {
+ "domain": "broadcom.com",
+ "is_top": true
+ }
+ ],
+ "Brocade": [
+ {
+ "domain": "brocade.com",
+ "is_top": true
+ }
+ ],
+ "Brontes Technologies": [
+ {
+ "domain": "brontes3d.com",
+ "is_top": true
+ }
+ ],
+ "Bronto Software, Inc.": [
+ {
+ "domain": "bronto.com",
+ "is_top": true
+ }
+ ],
+ "BrowserStack": [
+ {
+ "domain": "browserstack.com",
+ "is_top": true
+ }
+ ],
+ "Budker Institute of Nuclear Physics": [
+ {
+ "domain": "inp.nsk.su",
+ "is_top": true
+ }
+ ],
+ "Bull": [
+ {
+ "domain": "bull.com",
+ "is_top": true
+ },
+ {
+ "domain": "bull.es",
+ "is_top": true
+ },
+ {
+ "domain": "bull.fr",
+ "is_top": true
+ },
+ {
+ "domain": "bull.net",
+ "is_top": true
+ }
+ ],
+ "Buscap\u00e9 Company": [
+ {
+ "domain": "buscape-inc.com",
+ "is_top": true
+ }
+ ],
+ "Business Systems Integration AG": [
+ {
+ "domain": "bsi-software.com",
+ "is_top": true
+ }
+ ],
+ "C&C Technologies": [
+ {
+ "domain": "cctechnol.com",
+ "is_top": true
+ }
+ ],
+ "CALAO Systems SAS": [
+ {
+ "domain": "calao-systems.com",
+ "is_top": true
+ }
+ ],
+ "CBS Interactive, Inc.": [
+ {
+ "domain": "cbsinteractive.com",
+ "is_top": true
+ }
+ ],
+ "CC Computer Consultants": [
+ {
+ "domain": "computergmbh.de",
+ "is_top": true
+ }
+ ],
+ "CCM Benchmark": [
+ {
+ "domain": "ccmbenchmark.com",
+ "is_top": true
+ }
+ ],
+ "CDI.CZ": [
+ {
+ "domain": "cdi.cz",
+ "is_top": true
+ }
+ ],
+ "CE Linux Forum": [
+ {
+ "domain": "celinuxforum.org",
+ "is_top": true
+ }
+ ],
+ "Cerebras": [
+ {
+ "domain": "cerebras.net",
+ "is_top": true
+ }
+ ],
+ "CEVA DSP": [
+ {
+ "domain": "ceva-dsp.com",
+ "is_top": true
+ }
+ ],
+ "CEA": [
+ {
+ "domain": "cea.fr",
+ "is_top": true
+ }
+ ],
+ "CERN": [
+ {
+ "domain": "cern.ch",
+ "is_top": true
+ }
+ ],
+ "Chongqing University": [
+ {
+ "domain": "cqu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "CGI Group": [
+ {
+ "domain": "cgi.com",
+ "is_top": true
+ }
+ ],
+ "CIeNET Technologies": [
+ {
+ "domain": "cienet.com.cn",
+ "is_top": true
+ }
+ ],
+ "CJSC NII STT": [
+ {
+ "domain": "niistt.ru",
+ "is_top": true
+ }
+ ],
+ "Codespeaks": [
+ {
+ "domain": "codespeaks.com",
+ "is_top": true
+ }
+ ],
+ "Cornell University": [
+ {
+ "domain": "cornell.edu",
+ "is_top": true
+ }
+ ],
+ "CNR": [
+ {
+ "domain": "cnr.it",
+ "is_top": true
+ }
+ ],
+ "CNRS": [
+ {
+ "domain": "cnrs.fr",
+ "is_top": true
+ }
+ ],
+ "COIT": [
+ {
+ "domain": "coit.es",
+ "is_top": true
+ }
+ ],
+ "CPTI": [
+ {
+ "domain": "cpti.cetuc.puc-rio.br",
+ "is_top": true
+ }
+ ],
+ "CSAIL": [
+ {
+ "domain": "csail.mit.edu",
+ "is_top": true
+ }
+ ],
+ "CSC": [
+ {
+ "domain": "csc.com",
+ "is_top": true
+ }
+ ],
+ "CSR": [
+ {
+ "domain": "csr.com",
+ "is_top": true
+ }
+ ],
+ "CSR4": [
+ {
+ "domain": "crs4.it",
+ "is_top": true
+ }
+ ],
+ "CSS Corporation": [
+ {
+ "domain": "csscorp.com",
+ "is_top": true
+ }
+ ],
+ "CTERA Networks": [
+ {
+ "domain": "ctera.com",
+ "is_top": true
+ }
+ ],
+ "CadSoft Computer GmbH": [
+ {
+ "domain": "cadsoft.de",
+ "is_top": true
+ }
+ ],
+ "Cadence Design Systems": [
+ {
+ "domain": "cadence.com",
+ "is_top": true
+ },
+ {
+ "domain": "ip.cadence.com",
+ "is_top": false
+ }
+ ],
+ "Calit2": [
+ {
+ "domain": "calit2.net",
+ "is_top": true
+ },
+ {
+ "domain": "calit2.uci.edu",
+ "is_top": true
+ }
+ ],
+ "Call Direct": [
+ {
+ "domain": "call-direct.com.au",
+ "is_top": false
+ }
+ ],
+ "Calsoft, Inc.": [
+ {
+ "domain": "calsoftinc.com",
+ "is_top": true
+ }
+ ],
+ "CalvaEDI": [
+ {
+ "domain": "calva.com",
+ "is_top": true
+ },
+ {
+ "domain": "calvaedi.com",
+ "is_top": true
+ }
+ ],
+ "Calxeda": [
+ {
+ "domain": "calxeda.com",
+ "is_top": true
+ }
+ ],
+ "Calyptech Pty, Ltd.": [
+ {
+ "domain": "calyptech.com",
+ "is_top": true
+ }
+ ],
+ "Canadian Bank Note Company": [
+ {
+ "domain": "cbnco.com",
+ "is_top": true
+ }
+ ],
+ "Candela Technologies": [
+ {
+ "domain": "candelatech.com",
+ "is_top": true
+ }
+ ],
+ "Canonical, Ltd.": [
+ {
+ "domain": "canonical.com",
+ "is_top": true
+ },
+ {
+ "domain": "ubuntu.com",
+ "is_top": true
+ }
+ ],
+ "Capgemini Consulting": [
+ {
+ "domain": "capgemini.com",
+ "is_top": true
+ }
+ ],
+ "Capital One": [
+ {
+ "domain": "capitalone.com",
+ "is_top": true
+ }
+ ],
+ "Capital Sales Group": [
+ {
+ "domain": "capitalsalesgroup.com",
+ "is_top": true
+ }
+ ],
+ "Card Access": [
+ {
+ "domain": "cardaccess-inc.com",
+ "is_top": true
+ }
+ ],
+ "CardSpring, Inc.": [
+ {
+ "domain": "cardspring.com",
+ "is_top": true
+ }
+ ],
+ "CareerBuilder, LLC.": [
+ {
+ "domain": "careerbuilder.com",
+ "is_top": true
+ }
+ ],
+ "Carnegie Mellon University": [
+ {
+ "domain": "cmu.edu",
+ "is_top": true
+ }
+ ],
+ "CartoDB": [
+ {
+ "domain": "cartodb.com",
+ "is_top": true
+ }
+ ],
+ "CastLabs": [
+ {
+ "domain": "castlabs.com",
+ "is_top": true
+ }
+ ],
+ "Catalyst": [
+ {
+ "domain": "catalyst.net.nz",
+ "is_top": true
+ }
+ ],
+ "Cavium": [
+ {
+ "domain": "cavium.com",
+ "is_top": true
+ },
+ {
+ "domain": "caviumnetworks.com",
+ "is_top": true
+ }
+ ],
+ "Celestrius": [
+ {
+ "domain": "celestrius.com",
+ "is_top": true
+ }
+ ],
+ "Celunite, Inc.": [
+ {
+ "domain": "celunite.com",
+ "is_top": true
+ }
+ ],
+ "Centaur Technology": [
+ {
+ "domain": "centtech.com",
+ "is_top": true
+ }
+ ],
+ "Centrin": [
+ {
+ "domain": "centrin.net.id",
+ "is_top": true
+ }
+ ],
+ "Cerner Corporation": [
+ {
+ "domain": "cerner.com",
+ "is_top": true
+ }
+ ],
+ "Chaincode Labs": [
+ {
+ "domain": "chaincode.com",
+ "is_top": true
+ }
+ ],
+ "Chair for Applied Software Engineering, TUM": [
+ {
+ "domain": "tum.de",
+ "is_top": true
+ }
+ ],
+ "ChargeStorm AB": [
+ {
+ "domain": "chargestorm.se",
+ "is_top": true
+ }
+ ],
+ "Check Point": [
+ {
+ "domain": "checkpoint.com",
+ "is_top": true
+ }
+ ],
+ "Chef": [
+ {
+ "domain": "chef.io",
+ "is_top": true
+ },
+ {
+ "domain": "opscode.com",
+ "is_top": true
+ }
+ ],
+ "Chelsio Communications": [
+ {
+ "domain": "chelsio.com",
+ "is_top": true
+ }
+ ],
+ "China Electronics Technology Group Corporation": [
+ {
+ "domain": "cetc.com.cn",
+ "is_top": true
+ }
+ ],
+ "Choopa, LLC": [
+ {
+ "domain": "choopa.com",
+ "is_top": true
+ }
+ ],
+ "Chumby Industries": [
+ {
+ "domain": "chumby.com",
+ "is_top": true
+ }
+ ],
+ "Ciklum": [
+ {
+ "domain": "ciklum.com",
+ "is_top": true
+ }
+ ],
+ "Cinterion Wireless Modules": [
+ {
+ "domain": "cinterion.com",
+ "is_top": true
+ }
+ ],
+ "Circle Internet Financial": [
+ {
+ "domain": "circle.com",
+ "is_top": true
+ }
+ ],
+ "Cirrax": [
+ {
+ "domain": "cirrax.com",
+ "is_top": true
+ }
+ ],
+ "Cirrus Logic": [
+ {
+ "domain": "cirrus.com",
+ "is_top": true
+ }
+ ],
+ "CirrusMio, Inc.": [
+ {
+ "domain": "cirrusmio.com",
+ "is_top": true
+ }
+ ],
+ "Cisco": [
+ {
+ "domain": "cisco.com",
+ "is_top": true
+ }
+ ],
+ "Citrix": [
+ {
+ "domain": "citrix.com",
+ "is_top": true
+ },
+ {
+ "domain": "cloud.com",
+ "is_top": true
+ },
+ {
+ "domain": "xensource.com",
+ "is_top": true
+ }
+ ],
+ "City University London": [],
+ "City of Austin": [
+ {
+ "domain": "austintexas.gov",
+ "is_top": true
+ }
+ ],
+ "City of Boston": [
+ {
+ "domain": "boston.gov",
+ "is_top": true
+ }
+ ],
+ "City of Santa Monica": [
+ {
+ "domain": "smgov.net",
+ "is_top": true
+ }
+ ],
+ "Clemson University": [
+ {
+ "domain": "clemson.edu",
+ "is_top": true
+ }
+ ],
+ "CloudBees, Inc.": [
+ {
+ "domain": "cloudbees.com",
+ "is_top": true
+ }
+ ],
+ "CloudPassage, Inc.": [
+ {
+ "domain": "cloudpassage.com",
+ "is_top": true
+ }
+ ],
+ "CloudRunner.io, Inc.": [
+ {
+ "domain": "cloudrunner.io",
+ "is_top": true
+ }
+ ],
+ "CloudVPS": [
+ {
+ "domain": "cloudvps.com",
+ "is_top": true
+ },
+ {
+ "domain": "cloudvps.nl",
+ "is_top": true
+ }
+ ],
+ "Cloudbase Solutions": [
+ {
+ "domain": "cloudbase.it",
+ "is_top": true
+ },
+ {
+ "domain": "cloudbasesolutions.com",
+ "is_top": true
+ }
+ ],
+ "Cloudbau": [
+ {
+ "domain": "cloudbau.de",
+ "is_top": true
+ }
+ ],
+ "Cloudera, Inc.": [
+ {
+ "domain": "cloudera.com",
+ "is_top": true
+ }
+ ],
+ "Cloudian, Inc.": [
+ {
+ "domain": "cloudian.com",
+ "is_top": true
+ }
+ ],
+ "Cloudscaling": [
+ {
+ "domain": "cloudscaling.com",
+ "is_top": true
+ }
+ ],
+ "Cloudsmith Inc.": [
+ {
+ "domain": "cloudsmith.com",
+ "is_top": true
+ }
+ ],
+ "Cloudwatt": [
+ {
+ "domain": "cloudwatt.com",
+ "is_top": true
+ }
+ ],
+ "Cloudzilla": [
+ {
+ "domain": "cloudzilla.com",
+ "is_top": true
+ }
+ ],
+ "Cluster Computing": [
+ {
+ "domain": "clustcom.com",
+ "is_top": true
+ }
+ ],
+ "Cluster File Systems, Inc.": [
+ {
+ "domain": "clusterfs.com",
+ "is_top": true
+ }
+ ],
+ "ClusterHQ": [
+ {
+ "domain": "clusterhq.com",
+ "is_top": true
+ }
+ ],
+ "Code Aurora Forum": [
+ {
+ "domain": "codeaurora.org",
+ "is_top": true
+ }
+ ],
+ "Code Lemon": [
+ {
+ "domain": "codelemon.com",
+ "is_top": true
+ }
+ ],
+ "CodeSourcery": [
+ {
+ "domain": "codesourcery.com",
+ "is_top": true
+ }
+ ],
+ "Codefidence": [
+ {
+ "domain": "codefidence.com",
+ "is_top": true
+ }
+ ],
+ "Codethink": [
+ {
+ "domain": "codethink.co.uk",
+ "is_top": true
+ }
+ ],
+ "Codetrails": [
+ {
+ "domain": "codetrails.com",
+ "is_top": true
+ }
+ ],
+ "Codewise": [
+ {
+ "domain": "codewise.com",
+ "is_top": true
+ }
+ ],
+ "Cogent.co Pty Ltd": [
+ {
+ "domain": "cogent.co",
+ "is_top": true
+ }
+ ],
+ "Cognitree Technologies": [
+ {
+ "domain": "cognitree.com",
+ "is_top": true
+ }
+ ],
+ "CohortFS, LLC": [
+ {
+ "domain": "cohortfs.com",
+ "is_top": true
+ }
+ ],
+ "Coinapult": [
+ {
+ "domain": "coinapult.com",
+ "is_top": true
+ }
+ ],
+ "Coinbase": [
+ {
+ "domain": "coinbase.com",
+ "is_top": true
+ }
+ ],
+ "Coinfy ApS.": [
+ {
+ "domain": "bips.me",
+ "is_top": true
+ }
+ ],
+ "Collabora": [
+ {
+ "domain": "collabora.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "collabora.com",
+ "is_top": true
+ }
+ ],
+ "Collax": [
+ {
+ "domain": "collax.com",
+ "is_top": true
+ }
+ ],
+ "Collective Idea": [
+ {
+ "domain": "inchworm.io",
+ "is_top": true
+ }
+ ],
+ "Columbia University": [
+ {
+ "domain": "columbia.edu",
+ "is_top": true
+ }
+ ],
+ "ComSleep": [
+ {
+ "domain": "comsleep.com",
+ "is_top": true
+ }
+ ],
+ "ComX Networks": [
+ {
+ "domain": "comx.dk",
+ "is_top": true
+ }
+ ],
+ "Comcast": [
+ {
+ "domain": "cable.comcast.com",
+ "is_top": true
+ },
+ {
+ "domain": "comcast.com",
+ "is_top": true
+ },
+ {
+ "domain": "comcast.net",
+ "is_top": true
+ }
+ ],
+ "Comindware Inc.": [
+ {
+ "domain": "comindware.com",
+ "is_top": true
+ }
+ ],
+ "Commerce Guys": [
+ {
+ "domain": "commerceguys.com",
+ "is_top": true
+ }
+ ],
+ "Commerce Technologies, Inc.": [
+ {
+ "domain": "commercehub.com",
+ "is_top": true
+ }
+ ],
+ "Commonwealth Bank of Australia": [
+ {
+ "domain": "cba.com.au",
+ "is_top": true
+ }
+ ],
+ "CompuLab": [
+ {
+ "domain": "compulab.co.il",
+ "is_top": true
+ }
+ ],
+ "Comrex Corporation": [
+ {
+ "domain": "comrex.com",
+ "is_top": true
+ }
+ ],
+ "Comtrade": [
+ {
+ "domain": "comtrade.com",
+ "is_top": true
+ }
+ ],
+ "Consensys": [
+ {
+ "domain": "consensys.net",
+ "is_top": true
+ }
+ ],
+ "ConSentry Networks": [
+ {
+ "domain": "consentry.com",
+ "is_top": true
+ }
+ ],
+ "Concentris Systems": [
+ {
+ "domain": "concentris-systems.com",
+ "is_top": true
+ }
+ ],
+ "Concurrent Computer Corporation": [
+ {
+ "domain": "ccur.com",
+ "is_top": true
+ }
+ ],
+ "Conductor": [
+ {
+ "domain": "conductor.com",
+ "is_top": true
+ }
+ ],
+ "Conectiva, Inc.": [
+ {
+ "domain": "conectiva.com.br",
+ "is_top": true
+ }
+ ],
+ "Conexant Systems, Inc.": [
+ {
+ "domain": "conexant.com",
+ "is_top": true
+ }
+ ],
+ "Confluent": [
+ {
+ "domain": "confluent.io",
+ "is_top": true
+ }
+ ],
+ "Connectifier": [
+ {
+ "domain": "connectifier.com",
+ "is_top": true
+ }
+ ],
+ "Connectify": [
+ {
+ "domain": "connectify.me",
+ "is_top": true
+ }
+ ],
+ "Contec Steuerungstechnik & Automation": [
+ {
+ "domain": "contec.at",
+ "is_top": true
+ }
+ ],
+ "Coraid": [
+ {
+ "domain": "coraid.com",
+ "is_top": true
+ }
+ ],
+ "CoreOS, Inc.": [
+ {
+ "domain": "coreos.com",
+ "is_top": true
+ }
+ ],
+ "Corelatus AB": [
+ {
+ "domain": "corelatus.se",
+ "is_top": true
+ }
+ ],
+ "Corgan Labs": [
+ {
+ "domain": "corganlabs.com",
+ "is_top": true
+ }
+ ],
+ "Cornelius Consult": [
+ {
+ "domain": "cornelius-consult.de",
+ "is_top": true
+ }
+ ],
+ "Corscience GmbH": [
+ {
+ "domain": "corscience.de",
+ "is_top": true
+ }
+ ],
+ "Corvisa, LLC": [
+ {
+ "domain": "corvisa.com",
+ "is_top": true
+ }
+ ],
+ "Cosmosbay~Vectis": [
+ {
+ "domain": "cosmosbay.com",
+ "is_top": true
+ }
+ ],
+ "Coursera Inc.": [
+ {
+ "domain": "coursera.org",
+ "is_top": true
+ }
+ ],
+ "Cray": [
+ {
+ "domain": "cray.com",
+ "is_top": true
+ }
+ ],
+ "Cruise": [
+ {
+ "domain": "getcruise.com",
+ "is_top": true
+ }
+ ],
+ "Creative Product Design": [
+ {
+ "domain": "cpdesign.com.au",
+ "is_top": true
+ }
+ ],
+ "Creative Technology": [
+ {
+ "domain": "creative.com",
+ "is_top": true
+ },
+ {
+ "domain": "creativelabs.com",
+ "is_top": true
+ }
+ ],
+ "Credit Mutuel Arkea": [
+ {
+ "domain": "arkea.com",
+ "is_top": true
+ }
+ ],
+ "Creytiv.com": [
+ {
+ "domain": "creytiv.com",
+ "is_top": true
+ }
+ ],
+ "Critical Link": [
+ {
+ "domain": "criticallink.com",
+ "is_top": true
+ }
+ ],
+ "Critical Links": [
+ {
+ "domain": "critical-links.com",
+ "is_top": true
+ }
+ ],
+ "Crossing-Tech SA": [
+ {
+ "domain": "crossing-tech.com",
+ "is_top": true
+ }
+ ],
+ "Crunchy Data Solutions": [
+ {
+ "domain": "crunchydatasolutions.com",
+ "is_top": true
+ }
+ ],
+ "Crystalfontz": [
+ {
+ "domain": "crystalfontz.com",
+ "is_top": true
+ }
+ ],
+ "Ctrip": [
+ {
+ "domain": "Ctrip.com",
+ "is_top": true
+ }
+ ],
+ "Cumulus Networks": [
+ {
+ "domain": "cumulusnetworks.com",
+ "is_top": true
+ }
+ ],
+ "Curve Dental": [
+ {
+ "domain": "curvedental.com",
+ "is_top": true
+ }
+ ],
+ "CyberGuard": [
+ {
+ "domain": "cyberguard.com",
+ "is_top": true
+ }
+ ],
+ "CyberSwitching": [
+ {
+ "domain": "cyberswitching.com",
+ "is_top": true
+ }
+ ],
+ "Cybera, Inc.": [
+ {
+ "domain": "cybera.com",
+ "is_top": true
+ },
+ {
+ "domain": "cybera.net",
+ "is_top": true
+ }
+ ],
+ "Cybernetics": [
+ {
+ "domain": "cybernetics.com",
+ "is_top": true
+ }
+ ],
+ "Cypress Semiconductor": [
+ {
+ "domain": "cypress.com",
+ "is_top": true
+ }
+ ],
+ "Cytronics & Melware": [
+ {
+ "domain": "melware.de",
+ "is_top": true
+ }
+ ],
+ "DAVE Embedded Systems": [
+ {
+ "domain": "dave.eu",
+ "is_top": true
+ }
+ ],
+ "DEK Tech.": [
+ {
+ "domain": "dektech.com.au",
+ "is_top": true
+ }
+ ],
+ "DEKA Research and Development Corporation": [
+ {
+ "domain": "dekaresearch.com",
+ "is_top": true
+ }
+ ],
+ "DENX Computer Systems": [
+ {
+ "domain": "denx-cs.de",
+ "is_top": true
+ }
+ ],
+ "DENX Software Engineering": [
+ {
+ "domain": "denx.de",
+ "is_top": true
+ }
+ ],
+ "DFKI": [
+ {
+ "domain": "dfki.de",
+ "is_top": true
+ }
+ ],
+ "DKRZ": [
+ {
+ "domain": "dkrz.de",
+ "is_top": true
+ }
+ ],
+ "DMP Electronics, Inc.": [
+ {
+ "domain": "dmp.com.tw",
+ "is_top": true
+ }
+ ],
+ "DMX": [
+ {
+ "domain": "dmx.com",
+ "is_top": true
+ }
+ ],
+ "DResearch": [
+ {
+ "domain": "dresearch-fe.de",
+ "is_top": true
+ },
+ {
+ "domain": "dresearch.de",
+ "is_top": true
+ }
+ ],
+ "DSO National Laboratories": [
+ {
+ "domain": "dso.org.sg",
+ "is_top": true
+ }
+ ],
+ "DSPECIALISTS": [
+ {
+ "domain": "dspecialists.de",
+ "is_top": true
+ }
+ ],
+ "DTI2": [
+ {
+ "domain": "dti2.net",
+ "is_top": true
+ }
+ ],
+ "Dassault Syst\u00e8mes": [
+ {
+ "domain": "3ds.com",
+ "is_top": true
+ },
+ {
+ "domain": "exalead.com",
+ "is_top": true
+ }
+ ],
+ "DataLab": [
+ {
+ "domain": "datalab.es",
+ "is_top": true
+ }
+ ],
+ "Databricks": [
+ {
+ "domain": "databricks.com",
+ "is_top": true
+ }
+ ],
+ "Dawning": [
+ {
+ "domain": "sugon.com",
+ "is_top": true
+ }
+ ],
+ "Day By Day": [
+ {
+ "domain": "daybyday.nl",
+ "is_top": true
+ }
+ ],
+ "Debian GNU/Linux": [
+ {
+ "domain": "debian.org",
+ "is_top": true
+ }
+ ],
+ "Defora OS": [
+ {
+ "domain": "defora.org",
+ "is_top": true
+ }
+ ],
+ "Dell": [
+ {
+ "domain": "dell.com",
+ "is_top": true
+ },
+ {
+ "domain": "software.dell.com",
+ "is_top": true
+ }
+ ],
+ "Delta Electronics, Inc.": [
+ {
+ "domain": "deltaww.com",
+ "is_top": true
+ }
+ ],
+ "Denali Systems": [
+ {
+ "domain": "denali-systems.com",
+ "is_top": true
+ }
+ ],
+ "Densan": [
+ {
+ "domain": "densan.co.jp",
+ "is_top": true
+ }
+ ],
+ "Depository Trust & Clearing Corporation": [
+ {
+ "domain": "dtcc.com",
+ "is_top": true
+ }
+ ],
+ "Despegar.com, Inc.": [
+ {
+ "domain": "despegar.com",
+ "is_top": true
+ }
+ ],
+ "Deutsche Telekom": [
+ {
+ "domain": "telekom.com",
+ "is_top": true
+ },
+ {
+ "domain": "telekom.de",
+ "is_top": true
+ }
+ ],
+ "Develtech": [
+ {
+ "domain": "develtech.com",
+ "is_top": true
+ }
+ ],
+ "Devicescape": [
+ {
+ "domain": "devicescape.com",
+ "is_top": true
+ }
+ ],
+ "Devoteam Group": [
+ {
+ "domain": "devoteam.com",
+ "is_top": true
+ },
+ {
+ "domain": "devoteam.es",
+ "is_top": true
+ }
+ ],
+ "Dexels": [
+ {
+ "domain": "dexels.com",
+ "is_top": true
+ }
+ ],
+ "DiBcom": [
+ {
+ "domain": "dibcom.fr",
+ "is_top": true
+ }
+ ],
+ "Dialog Semiconductor": [
+ {
+ "domain": "dialog-semiconductor.com",
+ "is_top": true
+ },
+ {
+ "domain": "diasemi.com",
+ "is_top": true
+ }
+ ],
+ "Diamond Light Source": [
+ {
+ "domain": "diamond.ac.uk",
+ "is_top": true
+ }
+ ],
+ "Digi International": [
+ {
+ "domain": "digi.com",
+ "is_top": true
+ }
+ ],
+ "Digia Plc": [
+ {
+ "domain": "digia.com",
+ "is_top": true
+ }
+ ],
+ "Digigram": [
+ {
+ "domain": "digigram.com",
+ "is_top": true
+ }
+ ],
+ "Digital Asset Holdings, LLC": [
+ {
+ "domain": "digitalasset.com",
+ "is_top": true
+ }
+ ],
+ "Digital Design Corporation": [
+ {
+ "domain": "digidescorp.com",
+ "is_top": true
+ }
+ ],
+ "Digital Devices GmbH": [
+ {
+ "domain": "digitaldevices.de",
+ "is_top": true
+ }
+ ],
+ "Digital River, Inc.": [
+ {
+ "domain": "digitalriver.com",
+ "is_top": true
+ }
+ ],
+ "Digium, Inc.": [
+ {
+ "domain": "digium.com",
+ "is_top": true
+ }
+ ],
+ "Docker, Inc.": [
+ {
+ "domain": "docker.com",
+ "is_top": true
+ }
+ ],
+ "Domicilium": [
+ {
+ "domain": "domicilium.com",
+ "is_top": true
+ }
+ ],
+ "DornerWorks": [
+ {
+ "domain": "dornerworks.com",
+ "is_top": true
+ }
+ ],
+ "Dor\u00e9Development": [
+ {
+ "domain": "doredevelopment.dk",
+ "is_top": true
+ }
+ ],
+ "Douban": [
+ {
+ "domain": "douban.com",
+ "is_top": true
+ }
+ ],
+ "Dresden University of Technology": [
+ {
+ "domain": "tu-dresden.de",
+ "is_top": true
+ }
+ ],
+ "DreamHost": [
+ {
+ "domain": "dreamhost.com",
+ "is_top": true
+ },
+ {
+ "domain": "newdream.net",
+ "is_top": true
+ }
+ ],
+ "Dreamwidth Studios": [
+ {
+ "domain": "dreamwidth.org",
+ "is_top": true
+ }
+ ],
+ "Drillinginfo": [
+ {
+ "domain": "drillinginfo.com",
+ "is_top": true
+ }
+ ],
+ "DSR Corporation": [
+ {
+ "domain": "dsr-corporation.com",
+ "is_top": true
+ },
+ {
+ "domain": "dsr-company.com",
+ "is_top": true
+ }
+ ],
+ "E.G.O.": [
+ {
+ "domain": "egoproducts.com",
+ "is_top": true
+ }
+ ],
+ "ECI Telecom": [
+ {
+ "domain": "ecitele.com",
+ "is_top": true
+ }
+ ],
+ "EF Education": [
+ {
+ "domain": "ef.com",
+ "is_top": true
+ }
+ ],
+ "EFJohnson Technologies": [
+ {
+ "domain": "efjohnson.com",
+ "is_top": true
+ }
+ ],
+ "EIA Electronics NV": [
+ {
+ "domain": "eia.be",
+ "is_top": true
+ }
+ ],
+ "EKE Group": [
+ {
+ "domain": "ebts.fi",
+ "is_top": true
+ },
+ {
+ "domain": "eke.fi",
+ "is_top": true
+ }
+ ],
+ "ELAN Microelectronics Corporation": [
+ {
+ "domain": "emc.com.tw",
+ "is_top": true
+ }
+ ],
+ "Ellis and Associates": [
+ {
+ "domain": "ellis-and-associates.com",
+ "is_top": true
+ }
+ ],
+ "ELPA": [
+ {
+ "domain": "elpa.it",
+ "is_top": true
+ }
+ ],
+ "EMA Tech": [
+ {
+ "domain": "ematech.fr",
+ "is_top": true
+ }
+ ],
+ "EMC": [
+ {
+ "domain": "emc.com",
+ "is_top": true
+ }
+ ],
+ "EMS Thomas Wuensche": [
+ {
+ "domain": "ems-wuensche.com",
+ "is_top": true
+ }
+ ],
+ "ENAC": [
+ {
+ "domain": "enac.fr",
+ "is_top": true
+ }
+ ],
+ "ENEA AB": [
+ {
+ "domain": "enea.com",
+ "is_top": true
+ }
+ ],
+ "ENS de Lyon": [
+ {
+ "domain": "ens-lyon.eu",
+ "is_top": true
+ }
+ ],
+ "ENSI de Bourges": [
+ {
+ "domain": "ensi-bourges.fr",
+ "is_top": true
+ }
+ ],
+ "EPAM Systems": [
+ {
+ "domain": "epam.com",
+ "is_top": true
+ }
+ ],
+ "EQWARE Engineering": [
+ {
+ "domain": "eqware.net",
+ "is_top": true
+ }
+ ],
+ "ESCRYPT GmbH": [
+ {
+ "domain": "escrypt.com",
+ "is_top": true
+ }
+ ],
+ "ESD Electronics": [
+ {
+ "domain": "esd-electronics.com",
+ "is_top": true
+ },
+ {
+ "domain": "esd.eu",
+ "is_top": true
+ }
+ ],
+ "ETH Zurich": [
+ {
+ "domain": "ethz.ch",
+ "is_top": true
+ }
+ ],
+ "EZchip Semiconductor, Ltd.": [
+ {
+ "domain": "ezchip.com",
+ "is_top": true
+ }
+ ],
+ "EasyESI": [
+ {
+ "domain": "easyesi.com",
+ "is_top": true
+ }
+ ],
+ "EasyStack": [
+ {
+ "domain": "easystack.cn",
+ "is_top": true
+ }
+ ],
+ "Eaternity": [
+ {
+ "domain": "eaternity.ch",
+ "is_top": true
+ }
+ ],
+ "Eclipse Foundation": [
+ {
+ "domain": "eclipse.org",
+ "is_top": true
+ }
+ ],
+ "EclipseSource (See Innoopract)": [
+ {
+ "domain": "eclipsesource.com",
+ "is_top": true
+ }
+ ],
+ "Ecole Polytechnique de Montreal": [
+ {
+ "domain": "polymtl.ca",
+ "is_top": true
+ }
+ ],
+ "Edesix, Ltd.": [
+ {
+ "domain": "edesix.com",
+ "is_top": true
+ }
+ ],
+ "Edinburgh Centre for Robotics": [
+ {
+ "domain": "edinburgh-robotics.org",
+ "is_top": true
+ }
+ ],
+ "EfficiOS": [
+ {
+ "domain": "efficios.com",
+ "is_top": true
+ }
+ ],
+ "Elan Digital Systems": [
+ {
+ "domain": "elandigitalsystems.com",
+ "is_top": true
+ }
+ ],
+ "Elance, Inc.": [
+ {
+ "domain": "elance.com",
+ "is_top": true
+ }
+ ],
+ "Elastic": [
+ {
+ "domain": "elastic.co",
+ "is_top": true
+ },
+ {
+ "domain": "elasticsearch.com",
+ "is_top": true
+ }
+ ],
+ "Elastic Path Software, Inc.": [
+ {
+ "domain": "elasticpath.com",
+ "is_top": true
+ }
+ ],
+ "ElasticHosts, Ltd.": [
+ {
+ "domain": "elastichosts.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "elastichosts.com",
+ "is_top": true
+ }
+ ],
+ "Elbrys Networks": [
+ {
+ "domain": "elbrys.com",
+ "is_top": true
+ }
+ ],
+ "Electronic Arts, Inc.": [
+ {
+ "domain": "ea.com",
+ "is_top": true
+ }
+ ],
+ "Elemedia S.p.A.": [
+ {
+ "domain": "katamail.com",
+ "is_top": true
+ }
+ ],
+ "Eleven Musicproduction GbR": [],
+ "Elitecore Technologies": [
+ {
+ "domain": "elitecore.com",
+ "is_top": true
+ }
+ ],
+ "Elliptic Technologies": [
+ {
+ "domain": "elliptictech.com",
+ "is_top": true
+ }
+ ],
+ "EmCraft Systems": [
+ {
+ "domain": "emcraft.com",
+ "is_top": true
+ }
+ ],
+ "Embarcadero Technologies Inc.": [
+ {
+ "domain": "embarcadero.com",
+ "is_top": true
+ }
+ ],
+ "Embedded Alley Solutions, Inc.": [
+ {
+ "domain": "embeddedalley.com",
+ "is_top": true
+ }
+ ],
+ "Embedded Machine Technology Co.": [
+ {
+ "domain": "ema-tech.com",
+ "is_top": true
+ }
+ ],
+ "Embedded Solutions, Ltd.": [
+ {
+ "domain": "embedded-sol.com",
+ "is_top": true
+ }
+ ],
+ "Ember JS": [
+ {
+ "domain": "emberjs.com",
+ "is_top": true
+ }
+ ],
+ "Embrane": [
+ {
+ "domain": "embrane.com",
+ "is_top": true
+ }
+ ],
+ "Emerson": [
+ {
+ "domain": "emerson.com",
+ "is_top": true
+ }
+ ],
+ "Empirix": [
+ {
+ "domain": "empirix.com",
+ "is_top": true
+ }
+ ],
+ "Empolis Information Management GmbH": [
+ {
+ "domain": "empolis.com",
+ "is_top": true
+ }
+ ],
+ "Emulex": [
+ {
+ "domain": "emulex.com",
+ "is_top": true
+ }
+ ],
+ "Endian": [
+ {
+ "domain": "endian.com",
+ "is_top": true
+ }
+ ],
+ "Endian Technologies": [
+ {
+ "domain": "endian.se",
+ "is_top": true
+ }
+ ],
+ "Endrelia": [
+ {
+ "domain": "endrelia.com",
+ "is_top": true
+ },
+ {
+ "domain": "watchdogone.com",
+ "is_top": true
+ }
+ ],
+ "Endurance Wind Power": [
+ {
+ "domain": "endurancewindpower.com",
+ "is_top": true
+ }
+ ],
+ "Enter": [
+ {
+ "domain": "enter.it",
+ "is_top": true
+ }
+ ],
+ "Entropy Wave": [
+ {
+ "domain": "entropywave.com",
+ "is_top": true
+ }
+ ],
+ "Epsilou Corporation": [
+ {
+ "domain": "epsilou.com",
+ "is_top": true
+ }
+ ],
+ "Ericsson": [
+ {
+ "domain": "ericsson.com",
+ "is_top": true
+ }
+ ],
+ "Escient": [
+ {
+ "domain": "escient.com",
+ "is_top": true
+ }
+ ],
+ "Essensium": [
+ {
+ "domain": "essensium.com",
+ "is_top": true
+ }
+ ],
+ "Essensium - Mind": [
+ {
+ "domain": "mind.be",
+ "is_top": true
+ }
+ ],
+ "Etched Pixels Digital Design": [
+ {
+ "domain": "etchedpixels.co.uk",
+ "is_top": true
+ }
+ ],
+ "Etersoft": [
+ {
+ "domain": "etersoft.ru",
+ "is_top": true
+ }
+ ],
+ "Ethereum Foundation": [
+ {
+ "domain": "ethdev.com",
+ "is_top": true
+ },
+ {
+ "domain": "ethereum.org",
+ "is_top": true
+ }
+ ],
+ "Etish Limited": [],
+ "Etna": [
+ {
+ "domain": "etna-alternance.net",
+ "is_top": true
+ }
+ ],
+ "Eucalyptus Systems, Inc.": [
+ {
+ "domain": "eucalyptus.com",
+ "is_top": true
+ }
+ ],
+ "Eukrea Electromatique": [
+ {
+ "domain": "eukrea.com",
+ "is_top": true
+ }
+ ],
+ "Eurek Elettronica": [
+ {
+ "domain": "eurek.it",
+ "is_top": true
+ }
+ ],
+ "Eurogiciel": [
+ {
+ "domain": "eurogiciel.fr",
+ "is_top": true
+ }
+ ],
+ "Eurotech, Ltd.": [
+ {
+ "domain": "eurotech-ltd.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "eurotech.com",
+ "is_top": true
+ }
+ ],
+ "Even Technologies, Inc.": [
+ {
+ "domain": "eventechnologiesinc.com",
+ "is_top": true
+ }
+ ],
+ "Everbread Limited": [
+ {
+ "domain": "everbread.com",
+ "is_top": true
+ }
+ ],
+ "Everlaw": [
+ {
+ "domain": "everlaw.com",
+ "is_top": true
+ }
+ ],
+ "EverteQ": [
+ {
+ "domain": "everteq.com",
+ "is_top": true
+ }
+ ],
+ "Evidence Srl": [
+ {
+ "domain": "evidence.eu.com",
+ "is_top": true
+ }
+ ],
+ "Exar Corporation": [
+ {
+ "domain": "exar.com",
+ "is_top": true
+ }
+ ],
+ "Exist Global": [
+ {
+ "domain": "exist.com",
+ "is_top": true
+ }
+ ],
+ "Exosec": [
+ {
+ "domain": "exosec.fr",
+ "is_top": true
+ }
+ ],
+ "Extreme Engineering Solutions": [
+ {
+ "domain": "xes-inc.com",
+ "is_top": true
+ }
+ ],
+ "Eyeview, Inc.": [
+ {
+ "domain": "eyeviewdigital.com",
+ "is_top": true
+ }
+ ],
+ "FGAN": [
+ {
+ "domain": "fgan.de",
+ "is_top": true
+ }
+ ],
+ "FINN.no AS": [
+ {
+ "domain": "finn.no",
+ "is_top": true
+ }
+ ],
+ "FIT": [
+ {
+ "domain": "fit-tecnologia.org.br",
+ "is_top": true
+ }
+ ],
+ "FZI Forschungszentrum Informatik": [
+ {
+ "domain": "fzi.de",
+ "is_top": true
+ }
+ ],
+ "Facebook": [
+ {
+ "domain": "fb.com",
+ "is_top": true
+ }
+ ],
+ "Factor-SPE": [
+ {
+ "domain": "nppfactor.kiev.ua",
+ "is_top": true
+ }
+ ],
+ "Fairfax Media": [
+ {
+ "domain": "fairfaxmedia.com.au",
+ "is_top": true
+ }
+ ],
+ "Faraday Technology Corporation": [
+ {
+ "domain": "faraday-tech.com",
+ "is_top": true
+ }
+ ],
+ "FastMail.FM": [],
+ "Fastpath Research": [
+ {
+ "domain": "fastpath.it",
+ "is_top": true
+ }
+ ],
+ "FathomDB": [
+ {
+ "domain": "fathomdb.com",
+ "is_top": true
+ }
+ ],
+ "Federal University of Campina Grande": [
+ {
+ "domain": "ufcg.edu.br",
+ "is_top": true
+ }
+ ],
+ "Fermilab": [
+ {
+ "domain": "fnal.gov",
+ "is_top": true
+ }
+ ],
+ "Fixstars Technologies": [
+ {
+ "domain": "fixstars.com",
+ "is_top": true
+ }
+ ],
+ "Flickerbox, Inc.": [
+ {
+ "domain": "flickerbox.com",
+ "is_top": true
+ }
+ ],
+ "Flipboard": [
+ {
+ "domain": "flipboard.com",
+ "is_top": true
+ }
+ ],
+ "Flipkart": [
+ {
+ "domain": "flipkart.com",
+ "is_top": true
+ }
+ ],
+ "Fon": [
+ {
+ "domain": "fon.com",
+ "is_top": true
+ }
+ ],
+ "FOSSA": [
+ {
+ "domain": "fossa.com",
+ "is_top": true
+ },
+ {
+ "domain": "fossa.io",
+ "is_top": true
+ }
+ ],
+ "Fox-IT": [
+ {
+ "domain": "fox-it.com",
+ "is_top": true
+ }
+ ],
+ "FractureCode Corporation": [
+ {
+ "domain": "fracturecode.com",
+ "is_top": true
+ }
+ ],
+ "Fragnetics": [
+ {
+ "domain": "fragnetics.com",
+ "is_top": true
+ }
+ ],
+ "Fraunhofer": [
+ {
+ "domain": "fraunhofer.de",
+ "is_top": true
+ }
+ ],
+ "Fraunhofer FHR": [
+ {
+ "domain": "fhr.fraunhofer.de",
+ "is_top": true
+ }
+ ],
+ "Fraunhofer FKIE": [
+ {
+ "domain": "fkie.fraunhofer.de",
+ "is_top": true
+ }
+ ],
+ "Fraunhofer FOKUS": [
+ {
+ "domain": "fokus.fraunhofer.de",
+ "is_top": true
+ }
+ ],
+ "Free Electrons": [
+ {
+ "domain": "free-electrons.com",
+ "is_top": true
+ }
+ ],
+ "Free Software Foundation": [
+ {
+ "domain": "fsf.org",
+ "is_top": true
+ }
+ ],
+ "Freebox": [
+ {
+ "domain": "freebox.fr",
+ "is_top": true
+ }
+ ],
+ "Freescale": [
+ {
+ "domain": "freescale.com",
+ "is_top": true
+ }
+ ],
+ "Freescale Semiconductor": [],
+ "Freicoin": [],
+ "Frequentis AG": [
+ {
+ "domain": "frequentis.com",
+ "is_top": true
+ }
+ ],
+ "Fujitsu": [
+ {
+ "domain": "cn.fujitsu.com",
+ "is_top": false
+ },
+ {
+ "domain": "fujitsu.com",
+ "is_top": true
+ },
+ {
+ "domain": "jp.fujitsu.com",
+ "is_top": false
+ }
+ ],
+ "Fujitsu Siemens": [
+ {
+ "domain": "fujitsu-siemens.com",
+ "is_top": true
+ }
+ ],
+ "FullContact": [
+ {
+ "domain": "fullcontact.com",
+ "is_top": true
+ }
+ ],
+ "Fullsix Group": [
+ {
+ "domain": "fullsix.com",
+ "is_top": true
+ }
+ ],
+ "Fusion-io": [
+ {
+ "domain": "fusionio.com",
+ "is_top": true
+ }
+ ],
+ "Future Technology Devices International": [
+ {
+ "domain": "ftdichip.com",
+ "is_top": true
+ }
+ ],
+ "G.T.S. Srl": [
+ {
+ "domain": "gts.it",
+ "is_top": true
+ }
+ ],
+ "GAMIC mbH": [
+ {
+ "domain": "gamic.com",
+ "is_top": true
+ }
+ ],
+ "GE Intelligent Platforms": [
+ {
+ "domain": "geautomation.com",
+ "is_top": true
+ },
+ {
+ "domain": "gefanuc.com",
+ "is_top": true
+ }
+ ],
+ "GNU": [
+ {
+ "domain": "gnu.org",
+ "is_top": true
+ }
+ ],
+ "GPLHost": [
+ {
+ "domain": "gplhost.com",
+ "is_top": true
+ }
+ ],
+ "GVS": [
+ {
+ "domain": "gvs.co.yu",
+ "is_top": true
+ }
+ ],
+ "Gaisler Research": [
+ {
+ "domain": "gaisler.com",
+ "is_top": true
+ }
+ ],
+ "Galvanix": [
+ {
+ "domain": "galvanix.com",
+ "is_top": true
+ }
+ ],
+ "GameServers.com": [
+ {
+ "domain": "gameservers.com",
+ "is_top": true
+ }
+ ],
+ "GeNUA": [
+ {
+ "domain": "genua.de",
+ "is_top": true
+ }
+ ],
+ "Geeknet, Inc.": [
+ {
+ "domain": "geek.net",
+ "is_top": true
+ }
+ ],
+ "Genband": [
+ {
+ "domain": "genband.com",
+ "is_top": true
+ }
+ ],
+ "General Aviation Safety Network": [
+ {
+ "domain": "ga-safety.net",
+ "is_top": true
+ }
+ ],
+ "General Electric": [
+ {
+ "domain": "ge.com",
+ "is_top": true
+ }
+ ],
+ "Gentoo Linux": [
+ {
+ "domain": "gentoo.org",
+ "is_top": true
+ }
+ ],
+ "Genuitec, LLC": [
+ {
+ "domain": "genuitec.com",
+ "is_top": true
+ }
+ ],
+ "Geomatys": [
+ {
+ "domain": "geomatys.fr",
+ "is_top": true
+ }
+ ],
+ "Geometrics": [
+ {
+ "domain": "geometrics.com",
+ "is_top": true
+ }
+ ],
+ "Georgia Tech Research Institute": [
+ {
+ "domain": "gtri.gatech.edu",
+ "is_top": true
+ }
+ ],
+ "Geotechnologies, Inc.": [
+ {
+ "domain": "geoteq.com",
+ "is_top": true
+ }
+ ],
+ "Getup Cloud": [
+ {
+ "domain": "getupcloud.com",
+ "is_top": true
+ }
+ ],
+ "GigaSpaces": [
+ {
+ "domain": "gigaspaces.com",
+ "is_top": true
+ }
+ ],
+ "Gik": [
+ {
+ "domain": "gik.de",
+ "is_top": true
+ }
+ ],
+ "Gini": [
+ {
+ "domain": "gini.net",
+ "is_top": true
+ }
+ ],
+ "Github": [
+ {
+ "domain": "github.com",
+ "is_top": false
+ }
+ ],
+ "GitLab": [
+ {
+ "domain": "gitlab.com",
+ "is_top": false
+ }
+ ],
+ "Gitter": [
+ {
+ "domain": "gitter.im",
+ "is_top": true
+ }
+ ],
+ "Glass Expansion": [
+ {
+ "domain": "geicp.com",
+ "is_top": true
+ }
+ ],
+ "Glencoe Software, Inc.": [
+ {
+ "domain": "glencoesoftware.com",
+ "is_top": true
+ }
+ ],
+ "GlobalLogic": [
+ {
+ "domain": "globallogic.com",
+ "is_top": true
+ }
+ ],
+ "Gluster, Inc.": [
+ {
+ "domain": "gluster.com",
+ "is_top": true
+ },
+ {
+ "domain": "zresearch.com",
+ "is_top": true
+ }
+ ],
+ "Go Daddy": [
+ {
+ "domain": "godaddy.com",
+ "is_top": true
+ }
+ ],
+ "GoPivotal, Inc.": [],
+ "Gocept GmbH & Co. KG": [
+ {
+ "domain": "gocept.com",
+ "is_top": true
+ }
+ ],
+ "Gold Circle": [
+ {
+ "domain": "goldcircle.co.za",
+ "is_top": true
+ }
+ ],
+ "GoodData": [
+ {
+ "domain": "gooddata.com",
+ "is_top": true
+ }
+ ],
+ "Google, Inc.": [
+ {
+ "domain": "android.com",
+ "is_top": true
+ },
+ {
+ "domain": "chrome.com",
+ "is_top": true
+ },
+ {
+ "domain": "chromium.org",
+ "is_top": true
+ },
+ {
+ "domain": "google.com",
+ "is_top": true
+ },
+ {
+ "domain": "tensorflow.org",
+ "is_top": true
+ }
+ ],
+ "Gorilla Logic": [
+ {
+ "domain": "gorillalogic.com",
+ "is_top": true
+ }
+ ],
+ "Graphcore": [
+ {
+ "domain": "graphcore.ai",
+ "is_top": true
+ }
+ ],
+ "Grammer": [
+ {
+ "domain": "eia.grammer.com",
+ "is_top": false
+ },
+ {
+ "domain": "grammer.com",
+ "is_top": true
+ }
+ ],
+ "Grass Valley": [
+ {
+ "domain": "grassvalley.com",
+ "is_top": true
+ }
+ ],
+ "Green Energy Corp.": [
+ {
+ "domain": "greenenergycorp.com",
+ "is_top": true
+ }
+ ],
+ "Green Turtles Technologies": [
+ {
+ "domain": "greenturtles.in",
+ "is_top": true
+ }
+ ],
+ "GreenAddress greenaddress.": [],
+ "Grid Dynamics": [
+ {
+ "domain": "griddynamics.com",
+ "is_top": true
+ }
+ ],
+ "Grid Net": [
+ {
+ "domain": "grid-net.com",
+ "is_top": true
+ }
+ ],
+ "GridApp Systems": [
+ {
+ "domain": "gridapp.com",
+ "is_top": true
+ }
+ ],
+ "GridCentric": [
+ {
+ "domain": "gridcentric.ca",
+ "is_top": true
+ }
+ ],
+ "Griffin INet": [
+ {
+ "domain": "griffin.net",
+ "is_top": true
+ }
+ ],
+ "Grml": [
+ {
+ "domain": "grml.org",
+ "is_top": true
+ }
+ ],
+ "Grupa WP": [
+ {
+ "domain": "wp.pl",
+ "is_top": true
+ }
+ ],
+ "Guntermann & Drunck GmbH": [
+ {
+ "domain": "gdsys.de",
+ "is_top": true
+ }
+ ],
+ "H&D Wireless AB": [
+ {
+ "domain": "hd-wireless.se",
+ "is_top": true
+ }
+ ],
+ "HALE electronic GmbH": [
+ {
+ "domain": "hale.at",
+ "is_top": true
+ }
+ ],
+ "HAProxy Technologies": [
+ {
+ "domain": "exceliance.fr",
+ "is_top": true
+ },
+ {
+ "domain": "haproxy.com",
+ "is_top": true
+ }
+ ],
+ "HCL": [
+ {
+ "domain": "hcl.com",
+ "is_top": true
+ },
+ {
+ "domain": "hcl.in",
+ "is_top": true
+ },
+ {
+ "domain": "hcltech.com",
+ "is_top": true
+ }
+ ],
+ "HCL Technologies": [],
+ "HERMES SoftLab": [
+ {
+ "domain": "hermes-softlab.com",
+ "is_top": true
+ }
+ ],
+ "HES-SO Valais Wallis": [
+ {
+ "domain": "hevs.ch",
+ "is_top": true
+ }
+ ],
+ "HGST": [
+ {
+ "domain": "hgst.com",
+ "is_top": true
+ }
+ ],
+ "HHTech Co.": [
+ {
+ "domain": "hhcn.com",
+ "is_top": true
+ }
+ ],
+ "HP": [
+ {
+ "domain": "cpqcorp.net",
+ "is_top": true
+ },
+ {
+ "domain": "hp.com",
+ "is_top": true
+ },
+ {
+ "domain": "hp.es",
+ "is_top": true
+ },
+ {
+ "domain": "palm.com",
+ "is_top": true
+ }
+ ],
+ "HPE": [
+ {
+ "domain": "hpe.com *",
+ "is_top": false
+ }
+ ],
+ "HV Sistemas": [
+ {
+ "domain": "hvsistemas.es",
+ "is_top": true
+ }
+ ],
+ "Halon Security": [
+ {
+ "domain": "halon.se",
+ "is_top": true
+ }
+ ],
+ "Habana": [
+ {
+ "domain": "habana.ai",
+ "is_top": true
+ }
+ ],
+ "Happiest Minds Technologies": [
+ {
+ "domain": "happiestminds.com",
+ "is_top": true
+ }
+ ],
+ "Harman/Becker Automotive Systems": [
+ {
+ "domain": "harbaum.org",
+ "is_top": true
+ },
+ {
+ "domain": "mybecker.com",
+ "is_top": true
+ }
+ ],
+ "Harris Corporation": [
+ {
+ "domain": "harris.com",
+ "is_top": true
+ }
+ ],
+ "Hastexo": [
+ {
+ "domain": "hastexo.com",
+ "is_top": true
+ }
+ ],
+ "Hatsize Learning Corporation": [
+ {
+ "domain": "hatsize.com",
+ "is_top": true
+ }
+ ],
+ "Hauppauge": [
+ {
+ "domain": "hauppauge.com",
+ "is_top": true
+ }
+ ],
+ "Heinrich-Heine-Universitat Dusseldorf": [
+ {
+ "domain": "uniklinik-duesseldorf.de",
+ "is_top": true
+ }
+ ],
+ "Heroku": [
+ {
+ "domain": "heroku.com",
+ "is_top": true
+ }
+ ],
+ "Hibernate": [
+ {
+ "domain": "hibernate.org",
+ "is_top": true
+ }
+ ],
+ "HighPoint Technologies": [
+ {
+ "domain": "highpoint-tech.com",
+ "is_top": true
+ }
+ ],
+ "Hitachi": [
+ {
+ "domain": "hitachi.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "hitachi.com",
+ "is_top": true
+ },
+ {
+ "domain": "hitachiconsulting.com",
+ "is_top": true
+ },
+ {
+ "domain": "hitachisoft.jp",
+ "is_top": true
+ }
+ ],
+ "Hitachi Data Systems": [
+ {
+ "domain": "hds.com",
+ "is_top": true
+ }
+ ],
+ "Holosc\u00f3pio Tecnologia Ltda.": [
+ {
+ "domain": "holoscopio.com",
+ "is_top": true
+ }
+ ],
+ "Hortonworks": [
+ {
+ "domain": "hortonworks.com",
+ "is_top": true
+ }
+ ],
+ "Hostplex": [
+ {
+ "domain": "hostplex.net",
+ "is_top": true
+ }
+ ],
+ "Hostway": [
+ {
+ "domain": "hostway.com",
+ "is_top": true
+ }
+ ],
+ "Huawei": [
+ {
+ "domain": "huawei.com",
+ "is_top": true
+ },
+ {
+ "domain": "huawei.com]",
+ "is_top": true
+ },
+ {
+ "domain": "huawei.com”",
+ "is_top": true
+ },
+ {
+ "domain": "7huawei.com",
+ "is_top": true
+ },
+ {
+ "domain": "hauwei.com",
+ "is_top": true
+ },
+ {
+ "domain": "h-partners.com",
+ "is_top": true
+ },
+ {
+ "domain": "hisilicon.com",
+ "is_top": true
+ },
+ {
+ "domain": "ohos.com.cn",
+ "is_top": true
+ },
+ {
+ "domain": "huawei-partners.com",
+ "is_top": true
+ },
+ {
+ "domain": "huawe.com",
+ "is_top": true
+ },
+ {
+ "domain": "notesmail.huawei.com",
+ "is_top": true
+ },
+ {
+ "domain": "华huaweii.com",
+ "is_top": true
+ },
+ {
+ "domain": "china.huawei.com",
+ "is_top": true
+ },
+ {
+ "domain": "hhuawei.com",
+ "is_top": true
+ },
+ {
+ "domain": "huawei",
+ "is_top": true
+ }
+ ],
+ "HubSpot": [
+ {
+ "domain": "hubspot.com",
+ "is_top": true
+ }
+ ],
+ "Huron Technologies": [
+ {
+ "domain": "hurontech.com",
+ "is_top": true
+ }
+ ],
+ "IAN Investments": [],
+ "IAV": [
+ {
+ "domain": "iav.com",
+ "is_top": true
+ }
+ ],
+ "IBH SYSTEMS GmbH": [
+ {
+ "domain": "ibh-systems.com",
+ "is_top": true
+ }
+ ],
+ "IBM": [
+ {
+ "domain": "au1.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "br.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "ca.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "cn.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "de.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "ibm.com",
+ "is_top": true
+ },
+ {
+ "domain": "il.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "in.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "linux.vnet.ibm.com",
+ "is_top": false
+ },
+ {
+ "domain": "ozlabs.org",
+ "is_top": true
+ },
+ {
+ "domain": "platform.com",
+ "is_top": true
+ },
+ {
+ "domain": "us.ibm.com",
+ "is_top": false
+ }
+ ],
+ "IC Plus": [
+ {
+ "domain": "icplus.com.tw",
+ "is_top": true
+ }
+ ],
+ "IFM Electronic": [
+ {
+ "domain": "ifm.com",
+ "is_top": true
+ }
+ ],
+ "IFS Institut fur Software": [
+ {
+ "domain": "isst.fraunhofer.de",
+ "is_top": true
+ }
+ ],
+ "IMC": [
+ {
+ "domain": "imc-chicago.com",
+ "is_top": true
+ }
+ ],
+ "IMS Nanofabrication AG": [
+ {
+ "domain": "ims.co.at",
+ "is_top": true
+ }
+ ],
+ "IMS Networks": [
+ {
+ "domain": "e-teleport.net",
+ "is_top": true
+ },
+ {
+ "domain": "imsnetworks.com",
+ "is_top": true
+ },
+ {
+ "domain": "intermediasud.com",
+ "is_top": false
+ }
+ ],
+ "INOV": [
+ {
+ "domain": "inov.pt",
+ "is_top": true
+ }
+ ],
+ "INRIA": [
+ {
+ "domain": "inria.fr",
+ "is_top": true
+ }
+ ],
+ "INdT": [
+ {
+ "domain": "indt.org",
+ "is_top": true
+ },
+ {
+ "domain": "indt.org.br",
+ "is_top": true
+ }
+ ],
+ "IPAX": [
+ {
+ "domain": "ipax.at",
+ "is_top": true
+ }
+ ],
+ "IPINYOU": [
+ {
+ "domain": "ipinyou.com",
+ "is_top": true
+ }
+ ],
+ "IRAM": [
+ {
+ "domain": "iram-institute.org",
+ "is_top": true
+ },
+ {
+ "domain": "iram.es",
+ "is_top": true
+ },
+ {
+ "domain": "iram.fr",
+ "is_top": true
+ }
+ ],
+ "ISEE": [
+ {
+ "domain": "isee.biz",
+ "is_top": true
+ },
+ {
+ "domain": "iseebcn.com",
+ "is_top": true
+ }
+ ],
+ "ISI": [
+ {
+ "domain": "isi.edu",
+ "is_top": true
+ }
+ ],
+ "ISTI-CNR": [
+ {
+ "domain": "isti.cnr.it",
+ "is_top": true
+ }
+ ],
+ "IT Offshore": [
+ {
+ "domain": "it-offshore.co.uk",
+ "is_top": true
+ }
+ ],
+ "IT Refined": [
+ {
+ "domain": "itrefined.com",
+ "is_top": true
+ }
+ ],
+ "ITHAKA": [
+ {
+ "domain": "ithaka.org",
+ "is_top": true
+ }
+ ],
+ "ITT Corporation": [
+ {
+ "domain": "itt.com",
+ "is_top": true
+ }
+ ],
+ "ITpearls AG": [
+ {
+ "domain": "itpearls.com",
+ "is_top": true
+ }
+ ],
+ "IVITERA a.s.": [
+ {
+ "domain": "ivitera.com",
+ "is_top": true
+ }
+ ],
+ "Ibrix": [
+ {
+ "domain": "ibrix.com",
+ "is_top": true
+ }
+ ],
+ "Igalia S.L.": [
+ {
+ "domain": "igalia.com",
+ "is_top": true
+ }
+ ],
+ "Imagination Technologies": [
+ {
+ "domain": "imgtec.com",
+ "is_top": true
+ }
+ ],
+ "Immobilien Scout GmbH": [
+ {
+ "domain": "immobilienscout24.de",
+ "is_top": true
+ }
+ ],
+ "In-Store Broadcasting Network": [
+ {
+ "domain": "ibnads.com",
+ "is_top": true
+ },
+ {
+ "domain": "instoreaudionetwork.com",
+ "is_top": true
+ }
+ ],
+ "InHand Electronics": [
+ {
+ "domain": "inhand.com",
+ "is_top": true
+ }
+ ],
+ "Indian Institute of Science": [
+ {
+ "domain": "iisc.ac.in",
+ "is_top": true
+ }
+ ],
+ "Intelligent Software Research Center": [
+ {
+ "domain": "isrc.iscas.ac.cn",
+ "is_top": true
+ }
+ ],
+ "Include7": [
+ {
+ "domain": "include7.ch",
+ "is_top": false
+ }
+ ],
+ "Indesign, LLC": [
+ {
+ "domain": "indesign-llc.com",
+ "is_top": true
+ }
+ ],
+ "Individual": [],
+ "Industrial TSI": [
+ {
+ "domain": "industrial-tsi.com",
+ "is_top": true
+ }
+ ],
+ "Inepro BV": [
+ {
+ "domain": "inepro.com",
+ "is_top": true
+ }
+ ],
+ "Infinity Tracking Ltd": [
+ {
+ "domain": "infinity-tracking.net",
+ "is_top": true
+ }
+ ],
+ "InfoObjects": [
+ {
+ "domain": "infoobjects.com",
+ "is_top": true
+ }
+ ],
+ "Infochimps": [
+ {
+ "domain": "infochimps.com",
+ "is_top": true
+ }
+ ],
+ "Infor": [
+ {
+ "domain": "infor.com",
+ "is_top": true
+ }
+ ],
+ "Ingate Systems": [
+ {
+ "domain": "ingate.com",
+ "is_top": true
+ }
+ ],
+ "Inktank": [
+ {
+ "domain": "inktank.com",
+ "is_top": true
+ }
+ ],
+ "Innominate Security Technologies": [
+ {
+ "domain": "innominate.com",
+ "is_top": true
+ }
+ ],
+ "Innoopract GmbH": [
+ {
+ "domain": "innoopract.com",
+ "is_top": true
+ }
+ ],
+ "Innovative Systems": [
+ {
+ "domain": "innovsys.com",
+ "is_top": true
+ },
+ {
+ "domain": "sinnovsys.com",
+ "is_top": true
+ }
+ ],
+ "Inpun, LLC": [
+ {
+ "domain": "inpun.by",
+ "is_top": true
+ }
+ ],
+ "Insignal Co.": [
+ {
+ "domain": "insignal.co.kr",
+ "is_top": true
+ }
+ ],
+ "Institut des Nanotechnologies de Lyon": [
+ {
+ "domain": "inl.fr",
+ "is_top": true
+ }
+ ],
+ "Institute for System Programming Russian Academy of Sciences": [
+ {
+ "domain": "ispras.ru",
+ "is_top": true
+ }
+ ],
+ "Instituto de Pesquisas Eldorado": [
+ {
+ "domain": "eldorado.org.br",
+ "is_top": true
+ }
+ ],
+ "Instrumentation Technologies": [
+ {
+ "domain": "i-tech.si",
+ "is_top": true
+ }
+ ],
+ "Intalio Inc.": [
+ {
+ "domain": "intalio.com",
+ "is_top": true
+ }
+ ],
+ "Integrated Device Technology": [
+ {
+ "domain": "idt.com",
+ "is_top": true
+ }
+ ],
+ "Intel": [
+ {
+ "domain": "intel.com",
+ "is_top": true
+ }
+ ],
+ "IntelliTree Solutions": [
+ {
+ "domain": "intellitree.com",
+ "is_top": true
+ }
+ ],
+ "Interactive Intelligence, Inc.": [
+ {
+ "domain": "inin.com",
+ "is_top": true
+ }
+ ],
+ "Internap": [
+ {
+ "domain": "internap.com",
+ "is_top": true
+ }
+ ],
+ "International Telematics, Ltd.": [
+ {
+ "domain": "itelematic.com",
+ "is_top": true
+ }
+ ],
+ "Internet Brands, Inc.": [
+ {
+ "domain": "internetbrands.com",
+ "is_top": true
+ }
+ ],
+ "Intra2net AG": [
+ {
+ "domain": "intra2net.com",
+ "is_top": true
+ }
+ ],
+ "Inuits": [
+ {
+ "domain": "inuits.eu",
+ "is_top": true
+ }
+ ],
+ "Invisible Things Lab": [
+ {
+ "domain": "invisiblethingslab.com",
+ "is_top": true
+ }
+ ],
+ "Ion Beam Applications": [
+ {
+ "domain": "iba-group.com",
+ "is_top": true
+ },
+ {
+ "domain": "iba-worldwide.com",
+ "is_top": true
+ }
+ ],
+ "Iron Systems, Inc.": [
+ {
+ "domain": "ironsystems.com",
+ "is_top": true
+ }
+ ],
+ "Iroquio Systems": [
+ {
+ "domain": "iroquoisystems.com",
+ "is_top": true
+ }
+ ],
+ "It Technology": [
+ {
+ "domain": "holik.at",
+ "is_top": true
+ }
+ ],
+ "Ixia": [
+ {
+ "domain": "ixiacom.com",
+ "is_top": true
+ }
+ ],
+ "Ixonos": [
+ {
+ "domain": "ixonos.com",
+ "is_top": true
+ }
+ ],
+ "IzelTech": [
+ {
+ "domain": "izeltech.com",
+ "is_top": true
+ }
+ ],
+ "JCZ-Automatisering": [
+ {
+ "domain": "jcz.nl",
+ "is_top": true
+ }
+ ],
+ "JDA Software Group, Inc.": [
+ {
+ "domain": "jda.com",
+ "is_top": true
+ }
+ ],
+ "JFrog Ltd": [
+ {
+ "domain": "jfrog.com",
+ "is_top": true
+ }
+ ],
+ "JHU APL": [
+ {
+ "domain": "jhuapl.edu",
+ "is_top": true
+ }
+ ],
+ "JPBerlin": [
+ {
+ "domain": "jpberlin.de",
+ "is_top": true
+ }
+ ],
+ "Jazkarta": [
+ {
+ "domain": "jazkarta.com",
+ "is_top": true
+ }
+ ],
+ "JiangSu Lemote Corporation": [
+ {
+ "domain": "lemote.com",
+ "is_top": true
+ }
+ ],
+ "Jina AI": [
+ {
+ "domain": "jina.ai",
+ "is_top": true
+ }
+ ],
+ "Jive Software": [
+ {
+ "domain": "jivesoftware.com",
+ "is_top": true
+ }
+ ],
+ "Johns Hopkins University": [
+ {
+ "domain": "jhu.edu",
+ "is_top": true
+ }
+ ],
+ "Jonathan DEKHTIAR": [
+ {
+ "domain": "jonathandekhtiar.eu",
+ "is_top": true
+ }
+ ],
+ "Jotron Phontech": [
+ {
+ "domain": "jotron.com",
+ "is_top": true
+ }
+ ],
+ "Jumpnow": [
+ {
+ "domain": "jumpnowtek.com",
+ "is_top": true
+ }
+ ],
+ "Jungo Connectivity, Ltd.": [
+ {
+ "domain": "jungo.com",
+ "is_top": true
+ }
+ ],
+ "Juniper": [
+ {
+ "domain": "juniper.net",
+ "is_top": true
+ }
+ ],
+ "K Computing": [
+ {
+ "domain": "kcomputing.com",
+ "is_top": true
+ }
+ ],
+ "KDE e.V.": [
+ {
+ "domain": "kdemail.net",
+ "is_top": true
+ }
+ ],
+ "KFKI": [
+ {
+ "domain": "kfki.hu",
+ "is_top": true
+ }
+ ],
+ "KPIT Technologies, Ltd.": [
+ {
+ "domain": "kpit.com",
+ "is_top": true
+ },
+ {
+ "domain": "kpitcummins.com",
+ "is_top": true
+ }
+ ],
+ "KT Corporation": [
+ {
+ "domain": "kt.com",
+ "is_top": true
+ }
+ ],
+ "KTH Royal Institute of Technology": [
+ {
+ "domain": "kth.se",
+ "is_top": true
+ }
+ ],
+ "KVH": [
+ {
+ "domain": "kvhasia.com",
+ "is_top": true
+ }
+ ],
+ "Ka-Ro electronics GmbH": [
+ {
+ "domain": "karo-electronics.de",
+ "is_top": true
+ }
+ ],
+ "Karlsruhe Institute of Technology": [
+ {
+ "domain": "kit.edu",
+ "is_top": true
+ },
+ {
+ "domain": "lists.kit.edu",
+ "is_top": false
+ }
+ ],
+ "Katalix Systems": [
+ {
+ "domain": "katalix.com",
+ "is_top": true
+ }
+ ],
+ "Kedacom": [
+ {
+ "domain": "kedacom.co",
+ "is_top": true
+ }
+ ],
+ "Keeper Technology": [
+ {
+ "domain": "keepertech.com",
+ "is_top": true
+ }
+ ],
+ "Kentrox": [
+ {
+ "domain": "kentrox.com",
+ "is_top": true
+ }
+ ],
+ "Kerlabs": [
+ {
+ "domain": "kerlabs.com",
+ "is_top": true
+ }
+ ],
+ "Kernel Concepts": [
+ {
+ "domain": "kernelconcepts.de",
+ "is_top": true
+ }
+ ],
+ "Kernel Labs, Inc.": [
+ {
+ "domain": "kernellabs.com",
+ "is_top": true
+ }
+ ],
+ "Keymile AG": [
+ {
+ "domain": "keymile.com",
+ "is_top": true
+ }
+ ],
+ "Kionix, Inc.": [
+ {
+ "domain": "kionix.com",
+ "is_top": true
+ }
+ ],
+ "Klocwork": [
+ {
+ "domain": "klocwork.com",
+ "is_top": true
+ }
+ ],
+ "Kloud": [
+ {
+ "domain": "kloud.com.au",
+ "is_top": true
+ }
+ ],
+ "Knewton": [
+ {
+ "domain": "knewton.com",
+ "is_top": true
+ }
+ ],
+ "KnowledgeTree": [
+ {
+ "domain": "knowledgetree.com",
+ "is_top": true
+ }
+ ],
+ "Kolab Systems AG": [
+ {
+ "domain": "kolabsystems.com",
+ "is_top": true
+ }
+ ],
+ "Kontron": [
+ {
+ "domain": "kontron.com",
+ "is_top": true
+ }
+ ],
+ "Ksplice, Inc.": [
+ {
+ "domain": "ksplice.com",
+ "is_top": true
+ }
+ ],
+ "KylinCloud": [
+ {
+ "domain": "kylin-cloud.com",
+ "is_top": true
+ }
+ ],
+ "Lacuna": [
+ {
+ "domain": "lacuna.ai",
+ "is_top": true
+ }
+ ],
+ "Lanzhou University": [
+ {
+ "domain": "lzu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "L&T Infotech": [
+ {
+ "domain": "lntinfotech.com",
+ "is_top": true
+ }
+ ],
+ "LD DIDACTIC GmbH": [
+ {
+ "domain": "ld-didactic.de",
+ "is_top": true
+ }
+ ],
+ "LG": [
+ {
+ "domain": "lg.com",
+ "is_top": true
+ },
+ {
+ "domain": "lge.com",
+ "is_top": true
+ }
+ ],
+ "LINBIT": [
+ {
+ "domain": "linbit.com",
+ "is_top": true
+ }
+ ],
+ "LSD": [
+ {
+ "domain": "lsbd.ufc.br",
+ "is_top": true
+ },
+ {
+ "domain": "lsd.ufcg.edu.br",
+ "is_top": true
+ }
+ ],
+ "LSE Leading Security Experts GmbH": [
+ {
+ "domain": "lsexperts.de",
+ "is_top": true
+ }
+ ],
+ "LSI Logic": [
+ {
+ "domain": "lsi.com",
+ "is_top": true
+ },
+ {
+ "domain": "lsil.com",
+ "is_top": true
+ }
+ ],
+ "LWN.net": [
+ {
+ "domain": "lwn.net",
+ "is_top": true
+ }
+ ],
+ "La Honda Research": [
+ {
+ "domain": "lahondaresearch.org",
+ "is_top": true
+ }
+ ],
+ "LaCie": [
+ {
+ "domain": "lacie.com",
+ "is_top": true
+ }
+ ],
+ "Lafayette College": [
+ {
+ "domain": "lafayette.edu",
+ "is_top": true
+ }
+ ],
+ "Lantiq": [
+ {
+ "domain": "lantiq.com",
+ "is_top": true
+ }
+ ],
+ "Laurel Networks": [
+ {
+ "domain": "laurelnetworks.com",
+ "is_top": true
+ }
+ ],
+ "Lavabit": [
+ {
+ "domain": "lavabit.com",
+ "is_top": true
+ }
+ ],
+ "Lawrence Livermore National Laboratory": [
+ {
+ "domain": "llnl.gov",
+ "is_top": true
+ }
+ ],
+ "Le laboratoire dinformatique interactive": [
+ {
+ "domain": "lii-enac.fr",
+ "is_top": true
+ }
+ ],
+ "Lebanon Evangelical School": [
+ {
+ "domain": "lesbg.com",
+ "is_top": true
+ }
+ ],
+ "Letv": [
+ {
+ "domain": "letv.com",
+ "is_top": true
+ }
+ ],
+ "Lenovo": [
+ {
+ "domain": "Lenovo.com",
+ "is_top": true
+ }
+ ],
+ "LiPPERT Embedded Computers GmbH": [
+ {
+ "domain": "lippert-at.de",
+ "is_top": true
+ },
+ {
+ "domain": "lippertembedded.de",
+ "is_top": true
+ }
+ ],
+ "Liaison Technologies": [
+ {
+ "domain": "liaison.com",
+ "is_top": true
+ }
+ ],
+ "Liewenthal Electronics": [
+ {
+ "domain": "liewenthal.ee",
+ "is_top": true
+ }
+ ],
+ "LinSysSoft Technologies": [
+ {
+ "domain": "linsyssoft.com",
+ "is_top": true
+ }
+ ],
+ "Linagora": [
+ {
+ "domain": "linagora.com",
+ "is_top": true
+ }
+ ],
+ "Linaro": [
+ {
+ "domain": "linaro.org",
+ "is_top": true
+ }
+ ],
+ "LinkedIn": [
+ {
+ "domain": "linkedin.com",
+ "is_top": true
+ }
+ ],
+ "Linux Foundation": [
+ {
+ "domain": "linux-foundation.org",
+ "is_top": true
+ },
+ {
+ "domain": "linuxfoundation.org",
+ "is_top": true
+ },
+ {
+ "domain": "osdl.org",
+ "is_top": true
+ }
+ ],
+ "Linux Networx, Inc.": [
+ {
+ "domain": "lnxi.com",
+ "is_top": true
+ }
+ ],
+ "LinuxBox.cz": [
+ {
+ "domain": "linuxbox.cz",
+ "is_top": true
+ }
+ ],
+ "Linuxant": [
+ {
+ "domain": "linuxant.com",
+ "is_top": true
+ }
+ ],
+ "LiteStack, Inc.": [
+ {
+ "domain": "litestack.com",
+ "is_top": true
+ }
+ ],
+ "Litecoin": [
+ {
+ "domain": "litecoin.org",
+ "is_top": true
+ }
+ ],
+ "LiveRamp": [
+ {
+ "domain": "liveramp.com",
+ "is_top": true
+ }
+ ],
+ "LizardQ": [
+ {
+ "domain": "lizardq.de",
+ "is_top": true
+ }
+ ],
+ "Loadbalancer.org": [
+ {
+ "domain": "loadbalancer.org",
+ "is_top": true
+ }
+ ],
+ "Locaweb": [
+ {
+ "domain": "locaweb.com.br",
+ "is_top": true
+ }
+ ],
+ "Lodgens": [
+ {
+ "domain": "lodgens.com",
+ "is_top": true
+ }
+ ],
+ "Logic Supply": [
+ {
+ "domain": "logicsupply.com",
+ "is_top": true
+ }
+ ],
+ "Logitech": [
+ {
+ "domain": "logitech.com",
+ "is_top": true
+ }
+ ],
+ "London Internet Exchange": [
+ {
+ "domain": "linx.net",
+ "is_top": true
+ }
+ ],
+ "Lookout, Inc.": [
+ {
+ "domain": "lookout.com",
+ "is_top": true
+ }
+ ],
+ "Los Alamos National Lab": [
+ {
+ "domain": "lanl.gov",
+ "is_top": true
+ }
+ ],
+ "LucidWorks": [
+ {
+ "domain": "lucidworks.com",
+ "is_top": true
+ }
+ ],
+ "Lunds Universitet": [
+ {
+ "domain": "control.lth.se",
+ "is_top": false
+ },
+ {
+ "domain": "lth.se",
+ "is_top": true
+ }
+ ],
+ "Lyft": [
+ {
+ "domain": "lyft.com",
+ "is_top": true
+ }
+ ],
+ "Lyrtech": [
+ {
+ "domain": "lyrtech.com",
+ "is_top": true
+ }
+ ],
+ "Lyve Minds, Inc.": [
+ {
+ "domain": "lyveminds.com",
+ "is_top": true
+ }
+ ],
+ "M&N Solutions": [
+ {
+ "domain": "mn-solutions.de",
+ "is_top": true
+ }
+ ],
+ "M2R": [
+ {
+ "domain": "m2r.biz",
+ "is_top": true
+ }
+ ],
+ "MACOM": [
+ {
+ "domain": "macom.com",
+ "is_top": true
+ }
+ ],
+ "MESUTRONIC Ger\u00e4tebau GmbH": [
+ {
+ "domain": "mesutronic.de",
+ "is_top": true
+ }
+ ],
+ "MEV Limited": [
+ {
+ "domain": "mev.co.uk",
+ "is_top": true
+ }
+ ],
+ "MIPS Technologies, Inc.": [
+ {
+ "domain": "mips.com",
+ "is_top": true
+ }
+ ],
+ "MIT": [
+ {
+ "domain": "mit.edu",
+ "is_top": true
+ }
+ ],
+ "MIT Lincoln Laboratory": [
+ {
+ "domain": "ll.mit.edu",
+ "is_top": true
+ }
+ ],
+ "MJS Gadgets": [
+ {
+ "domain": "mjsgadgets.com",
+ "is_top": true
+ }
+ ],
+ "MM Solutions AD": [
+ {
+ "domain": "mm-sol.com",
+ "is_top": true
+ }
+ ],
+ "MOD Systems": [
+ {
+ "domain": "modsystems.com",
+ "is_top": true
+ }
+ ],
+ "MPC Data, Ltd.": [
+ {
+ "domain": "mpc-data.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "mpcdata.com",
+ "is_top": true
+ }
+ ],
+ "MRV Communications": [
+ {
+ "domain": "mrv.com",
+ "is_top": true
+ }
+ ],
+ "MSC Open Source AB": [
+ {
+ "domain": "mscopensource.se",
+ "is_top": true
+ }
+ ],
+ "MSC Technologies": [
+ {
+ "domain": "exm32.com",
+ "is_top": true
+ },
+ {
+ "domain": "msc-ge.com",
+ "is_top": true
+ },
+ {
+ "domain": "msc-technologies.eu",
+ "is_top": true
+ }
+ ],
+ "MSys Technologies": [
+ {
+ "domain": "msystechnologies.com",
+ "is_top": true
+ }
+ ],
+ "Macq Electronique": [
+ {
+ "domain": "macqel.be",
+ "is_top": true
+ },
+ {
+ "domain": "macqel.com",
+ "is_top": true
+ }
+ ],
+ "Magento Development": [
+ {
+ "domain": "magento-development.com",
+ "is_top": true
+ }
+ ],
+ "Maginatics": [
+ {
+ "domain": "maginatics.com",
+ "is_top": true
+ }
+ ],
+ "Mainpine": [
+ {
+ "domain": "mainpine.com",
+ "is_top": true
+ }
+ ],
+ "Majitek": [
+ {
+ "domain": "majitek.com",
+ "is_top": true
+ }
+ ],
+ "Managed IT": [
+ {
+ "domain": "managedit.ie",
+ "is_top": true
+ }
+ ],
+ "Managed Security Services GmbH": [
+ {
+ "domain": "mssgmbh.com",
+ "is_top": true
+ }
+ ],
+ "Mandriva": [
+ {
+ "domain": "mandriva.com",
+ "is_top": true
+ },
+ {
+ "domain": "mandriva.com.br",
+ "is_top": true
+ },
+ {
+ "domain": "mandriva.org",
+ "is_top": true
+ }
+ ],
+ "MapR Technologies": [
+ {
+ "domain": "maprtech.com",
+ "is_top": true
+ }
+ ],
+ "Marine Bridge & Navigation Systems": [
+ {
+ "domain": "mns.spb.ru",
+ "is_top": true
+ }
+ ],
+ "Martinsson Elektronik AB": [
+ {
+ "domain": "martinsson.se",
+ "is_top": true
+ }
+ ],
+ "Marvell": [
+ {
+ "domain": "marvell.com",
+ "is_top": true
+ }
+ ],
+ "Matriks": [
+ {
+ "domain": "matriksdata.com",
+ "is_top": true
+ }
+ ],
+ "Matrix Orbital": [
+ {
+ "domain": "matrixorbital.ca",
+ "is_top": true
+ }
+ ],
+ "Matrix Vision": [
+ {
+ "domain": "matrix-vision.com",
+ "is_top": true
+ },
+ {
+ "domain": "matrix-vision.de",
+ "is_top": true
+ }
+ ],
+ "Matrox Graphics": [
+ {
+ "domain": "matrox.com",
+ "is_top": true
+ }
+ ],
+ "Max-Planck-Institut for Astrophysics": [
+ {
+ "domain": "mpg.de",
+ "is_top": true
+ }
+ ],
+ "MaxLinear": [
+ {
+ "domain": "maxlinear.com",
+ "is_top": true
+ }
+ ],
+ "Maxim Integrated Products": [
+ {
+ "domain": "maxim-ic.com",
+ "is_top": true
+ }
+ ],
+ "Maxtrack Industrial": [
+ {
+ "domain": "maxtrack.com.br",
+ "is_top": true
+ }
+ ],
+ "McAfee": [
+ {
+ "domain": "mcafee.com",
+ "is_top": true
+ },
+ {
+ "domain": "snapgear.com",
+ "is_top": true
+ }
+ ],
+ "Medhost Inc.": [
+ {
+ "domain": "medhost.com",
+ "is_top": true
+ }
+ ],
+ "Media Lab, Inc.": [
+ {
+ "domain": "mlb.co.jp",
+ "is_top": true
+ }
+ ],
+ "MediaTek, Inc.": [
+ {
+ "domain": "mediatek.com",
+ "is_top": true
+ }
+ ],
+ "Mediabistro Inc.": [
+ {
+ "domain": "mediabistro.com",
+ "is_top": true
+ }
+ ],
+ "Mediana Technologies": [
+ {
+ "domain": "medianatech.com",
+ "is_top": true
+ }
+ ],
+ "Medidata Solutions, Inc.": [
+ {
+ "domain": "mdsol.com",
+ "is_top": true
+ }
+ ],
+ "Melexis NV": [
+ {
+ "domain": "melexis.com",
+ "is_top": true
+ }
+ ],
+ "Mellanox Technologies": [
+ {
+ "domain": "mellanox.co.il",
+ "is_top": true
+ },
+ {
+ "domain": "mellanox.com",
+ "is_top": true
+ }
+ ],
+ "Memset": [
+ {
+ "domain": "memset.com",
+ "is_top": true
+ }
+ ],
+ "Mentor Graphics": [
+ {
+ "domain": "mentor.com",
+ "is_top": true
+ }
+ ],
+ "Mercury Development": [
+ {
+ "domain": "mercdev.com",
+ "is_top": true
+ }
+ ],
+ "Mercury HMI, Ltd.": [
+ {
+ "domain": "mercuryhmi.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "mimc.co.uk",
+ "is_top": true
+ }
+ ],
+ "Meruvian": [
+ {
+ "domain": "meruvian.com",
+ "is_top": true
+ }
+ ],
+ "MessageNet Systems": [
+ {
+ "domain": "messagenetcommunicationsystems.com",
+ "is_top": true
+ },
+ {
+ "domain": "messagenetsystems.com",
+ "is_top": true
+ }
+ ],
+ "Metacloud": [
+ {
+ "domain": "metacloud.com",
+ "is_top": true
+ }
+ ],
+ "Metamarkets Group": [
+ {
+ "domain": "metamarkets.com",
+ "is_top": true
+ }
+ ],
+ "Meteor": [
+ {
+ "domain": "meteor.ie",
+ "is_top": true
+ }
+ ],
+ "Meteor Development Group": [
+ {
+ "domain": "meteor.com",
+ "is_top": true
+ }
+ ],
+ "Metzler Brothers Systementwicklung GbR": [
+ {
+ "domain": "metzlerbros.de",
+ "is_top": true
+ }
+ ],
+ "MiTAC": [
+ {
+ "domain": "mitac.com",
+ "is_top": true
+ }
+ ],
+ "Micrel, Inc.": [
+ {
+ "domain": "micrel.com",
+ "is_top": true
+ }
+ ],
+ "Micro-Star International": [
+ {
+ "domain": "msi.com",
+ "is_top": true
+ },
+ {
+ "domain": "msi.com.tw",
+ "is_top": true
+ }
+ ],
+ "MicroGate Systems": [
+ {
+ "domain": "microgate.com",
+ "is_top": true
+ }
+ ],
+ "Microbit": [
+ {
+ "domain": "microbit.se",
+ "is_top": true
+ }
+ ],
+ "Microchip Technology, Inc.": [
+ {
+ "domain": "microchip.com",
+ "is_top": true
+ }
+ ],
+ "Micromodicom": [
+ {
+ "domain": "micromodi.com",
+ "is_top": true
+ }
+ ],
+ "Micron": [
+ {
+ "domain": "micron.com",
+ "is_top": true
+ }
+ ],
+ "Microsoft": [
+ {
+ "domain": "microsoft.com",
+ "is_top": true
+ }
+ ],
+ "Midokura": [
+ {
+ "domain": "midokura.com",
+ "is_top": true
+ },
+ {
+ "domain": "midokura.jp",
+ "is_top": true
+ }
+ ],
+ "MikroTik": [
+ {
+ "domain": "mikrotik.com",
+ "is_top": true
+ }
+ ],
+ "Millicom": [
+ {
+ "domain": "millicom.com",
+ "is_top": true
+ }
+ ],
+ "Mindbit": [
+ {
+ "domain": "mindbit.ro",
+ "is_top": true
+ }
+ ],
+ "Mindspeed Technologies": [
+ {
+ "domain": "mindspeed.com",
+ "is_top": true
+ }
+ ],
+ "Miracle Linux": [
+ {
+ "domain": "miraclelinux.com",
+ "is_top": true
+ }
+ ],
+ "Mirantis": [
+ {
+ "domain": "mirantis.com",
+ "is_top": true
+ }
+ ],
+ "Miromico": [
+ {
+ "domain": "miromico.ch",
+ "is_top": true
+ }
+ ],
+ "Missing Link Electronics": [
+ {
+ "domain": "missinglinkelectronics.com",
+ "is_top": true
+ }
+ ],
+ "Mistral Solutions": [
+ {
+ "domain": "mistralsolutions.com",
+ "is_top": true
+ }
+ ],
+ "Mitel": [
+ {
+ "domain": "es.mitel.com",
+ "is_top": false
+ },
+ {
+ "domain": "mitel.com",
+ "is_top": true
+ }
+ ],
+ "Mobile Devices Ingenierie": [
+ {
+ "domain": "mobile-devices.com",
+ "is_top": true
+ }
+ ],
+ "Mocean Labs": [
+ {
+ "domain": "mocean-labs.com",
+ "is_top": true
+ }
+ ],
+ "Modern Technologies Inc.": [
+ {
+ "domain": "mti.ag",
+ "is_top": true
+ }
+ ],
+ "ModpoW": [
+ {
+ "domain": "modpow.es",
+ "is_top": true
+ }
+ ],
+ "Mojain": [
+ {
+ "domain": "mojain.com",
+ "is_top": true
+ }
+ ],
+ "Molecular Discovery, Ltd.": [
+ {
+ "domain": "moldiscovery.com",
+ "is_top": true
+ }
+ ],
+ "MomentumSI": [
+ {
+ "domain": "momentumsi.com",
+ "is_top": true
+ }
+ ],
+ "Monax": [
+ {
+ "domain": "monax.io",
+ "is_top": true
+ }
+ ],
+ "MontaVista": [
+ {
+ "domain": "mvista.com",
+ "is_top": true
+ }
+ ],
+ "Montages AG": [
+ {
+ "domain": "montages.com",
+ "is_top": true
+ }
+ ],
+ "Morphlabs": [
+ {
+ "domain": "morphlabs.com",
+ "is_top": true
+ }
+ ],
+ "Mortar": [
+ {
+ "domain": "mortardata.com",
+ "is_top": true
+ }
+ ],
+ "Motorola": [
+ {
+ "domain": "motorola.com",
+ "is_top": true
+ }
+ ],
+ "Movial": [
+ {
+ "domain": "movial.com",
+ "is_top": true
+ },
+ {
+ "domain": "movial.fi",
+ "is_top": true
+ }
+ ],
+ "Mozilla Corporation": [
+ {
+ "domain": "mozilla.org",
+ "is_top": true
+ },
+ {
+ "domain": "mozilla.com",
+ "is_top": true
+ }
+ ],
+ "MtekVision Corporation": [
+ {
+ "domain": "mtekvision.com",
+ "is_top": true
+ }
+ ],
+ "MuleSoft, Inc.": [
+ {
+ "domain": "mulesoft.com",
+ "is_top": true
+ }
+ ],
+ "MyNET": [
+ {
+ "domain": "mynet.at",
+ "is_top": true
+ }
+ ],
+ "Myricom": [
+ {
+ "domain": "myri.com",
+ "is_top": true
+ }
+ ],
+ "NASA": [
+ {
+ "domain": "nasa.gov",
+ "is_top": true
+ }
+ ],
+ "Nankai University": [
+ {
+ "domain": "mail.nankai.edu.cn",
+ "is_top": true
+ }
+ ],
+ "NEC": [
+ {
+ "domain": "az.jp.nec.com",
+ "is_top": false
+ },
+ {
+ "domain": "bu.jp.nec.com",
+ "is_top": false
+ },
+ {
+ "domain": "cq.jp.nec.com",
+ "is_top": false
+ },
+ {
+ "domain": "da.jp.nec.com",
+ "is_top": false
+ },
+ {
+ "domain": "mxk.nes.nec.co.jp",
+ "is_top": false
+ },
+ {
+ "domain": "mxs.nes.nec.co.jp",
+ "is_top": false
+ },
+ {
+ "domain": "nec-labs.com",
+ "is_top": false
+ },
+ {
+ "domain": "nec.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "nec.com",
+ "is_top": true
+ },
+ {
+ "domain": "necel.com",
+ "is_top": true
+ },
+ {
+ "domain": "necst.nec.co.jp",
+ "is_top": false
+ },
+ {
+ "domain": "nectechnologies.in",
+ "is_top": true
+ }
+ ],
+ "NETASQ": [
+ {
+ "domain": "netasq.com",
+ "is_top": true
+ }
+ ],
+ "NIIF Institute": [
+ {
+ "domain": "niif.hu",
+ "is_top": true
+ }
+ ],
+ "Ningbo University": [
+ {
+ "domain": "nbu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Nicolas Hug": [
+ {
+ "domain": "nicolas-hug.com",
+ "is_top": true
+ }
+ ],
+ "NIISI RAS": [
+ {
+ "domain": "niisi.ru",
+ "is_top": true
+ }
+ ],
+ "NIST": [
+ {
+ "domain": "nist.gov",
+ "is_top": true
+ }
+ ],
+ "NPR": [
+ {
+ "domain": "npr.org",
+ "is_top": true
+ }
+ ],
+ "NREL": [
+ {
+ "domain": "nrel.gov",
+ "is_top": true
+ }
+ ],
+ "NTT": [
+ {
+ "domain": "intellilink.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "lab.ntt.co.jp",
+ "is_top": false
+ },
+ {
+ "domain": "ntt.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "ntt.com",
+ "is_top": true
+ },
+ {
+ "domain": "nttmcl.com",
+ "is_top": true
+ },
+ {
+ "domain": "ntts.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "po.ntts.co.jp",
+ "is_top": false
+ },
+ {
+ "domain": "vertex.co.in",
+ "is_top": true
+ }
+ ],
+ "NTT Data": [
+ {
+ "domain": "nttdata.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "nttdata.com",
+ "is_top": true
+ }
+ ],
+ "NUXEO": [
+ {
+ "domain": "nuxeo.com",
+ "is_top": true
+ }
+ ],
+ "NVidia": [
+ {
+ "domain": "nvidia.com",
+ "is_top": true
+ }
+ ],
+ "NXP": [
+ {
+ "domain": "nxp.com",
+ "is_top": true
+ }
+ ],
+ "Nagravision": [
+ {
+ "domain": "dtv.nagra.com",
+ "is_top": false
+ },
+ {
+ "domain": "nagra.com",
+ "is_top": true
+ }
+ ],
+ "NameSys": [
+ {
+ "domain": "namesys.com",
+ "is_top": true
+ }
+ ],
+ "Nanometrics": [
+ {
+ "domain": "nanometrics.ca",
+ "is_top": true
+ }
+ ],
+ "National Center for Biotechnology Information": [
+ {
+ "domain": "ncbi.nlm.nih.gov",
+ "is_top": true
+ }
+ ],
+ "National Electronics and Computer Technology Center": [
+ {
+ "domain": "nectec.or.th",
+ "is_top": true
+ }
+ ],
+ "National ICT Australia": [
+ {
+ "domain": "nicta.com.au",
+ "is_top": true
+ }
+ ],
+ "National Institute of Advanced Industrial Science and Technology": [
+ {
+ "domain": "aist.go.jp",
+ "is_top": true
+ }
+ ],
+ "National Instruments": [
+ {
+ "domain": "ni.com",
+ "is_top": true
+ }
+ ],
+ "National University of Defense Technology": [
+ {
+ "domain": "nudt.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Navman Wireless": [
+ {
+ "domain": "navmanwireless.com",
+ "is_top": true
+ }
+ ],
+ "NeCTAR": [
+ {
+ "domain": "nectar.org.au",
+ "is_top": true
+ }
+ ],
+ "Nebula, Inc.": [
+ {
+ "domain": "nebula.com",
+ "is_top": true
+ }
+ ],
+ "Neotion": [
+ {
+ "domain": "neotion.com",
+ "is_top": true
+ }
+ ],
+ "New York University": [
+ {
+ "domain": "nyu.edu",
+ "is_top": true
+ }
+ ],
+ "Neratec Solutions": [
+ {
+ "domain": "neratec.com",
+ "is_top": true
+ }
+ ],
+ "NerdKits": [
+ {
+ "domain": "nerdkits.com",
+ "is_top": true
+ }
+ ],
+ "Net Insight": [
+ {
+ "domain": "netinsight.net",
+ "is_top": true
+ }
+ ],
+ "NetApp": [
+ {
+ "domain": "netapp.com",
+ "is_top": true
+ }
+ ],
+ "NetBSD Foundation, Inc.": [
+ {
+ "domain": "netbsd.org",
+ "is_top": true
+ }
+ ],
+ "NetEase": [
+ {
+ "domain": "corp.netease.com",
+ "is_top": false
+ },
+ {
+ "domain": "netease.com",
+ "is_top": true
+ }
+ ],
+ "NetEffects, Inc.": [
+ {
+ "domain": "neteffects.com",
+ "is_top": true
+ }
+ ],
+ "NetLogic Microsystems": [
+ {
+ "domain": "netlogicmicro.com",
+ "is_top": true
+ }
+ ],
+ "NetOne": [
+ {
+ "domain": "etone.co.jp",
+ "is_top": true
+ }
+ ],
+ "NetSpectrum": [
+ {
+ "domain": "netspectrum.ca",
+ "is_top": true
+ },
+ {
+ "domain": "netspectrum.com",
+ "is_top": true
+ }
+ ],
+ "NetUP": [
+ {
+ "domain": "netup.ru",
+ "is_top": true
+ }
+ ],
+ "NetXen": [
+ {
+ "domain": "netxen.com",
+ "is_top": true
+ }
+ ],
+ "Neterion": [
+ {
+ "domain": "neterion.com",
+ "is_top": true
+ }
+ ],
+ "Neterra": [
+ {
+ "domain": "neterra.net",
+ "is_top": true
+ },
+ {
+ "domain": "neterra.tv",
+ "is_top": true
+ }
+ ],
+ "Netflix": [
+ {
+ "domain": "corp.netflix.com",
+ "is_top": false
+ },
+ {
+ "domain": "netflix.com",
+ "is_top": true
+ }
+ ],
+ "Netronome Systems": [
+ {
+ "domain": "netronome.com",
+ "is_top": true
+ }
+ ],
+ "Netservers, Ltd.": [
+ {
+ "domain": "netservers.co.uk",
+ "is_top": true
+ }
+ ],
+ "Netstal-Maschinen AG": [
+ {
+ "domain": "netstal.com",
+ "is_top": true
+ }
+ ],
+ "Nexenta": [
+ {
+ "domain": "nexenta.com",
+ "is_top": false
+ }
+ ],
+ "Nexeya": [
+ {
+ "domain": "nexeya.com",
+ "is_top": true
+ },
+ {
+ "domain": "nexeya.fr",
+ "is_top": true
+ }
+ ],
+ "Nexor Limited": [
+ {
+ "domain": "nexor.com",
+ "is_top": true
+ }
+ ],
+ "NextIO": [
+ {
+ "domain": "nextio.com",
+ "is_top": true
+ }
+ ],
+ "Nexus": [
+ {
+ "domain": "nexusis.com",
+ "is_top": true
+ }
+ ],
+ "Nias Digital": [
+ {
+ "domain": "niasdigital.com",
+ "is_top": true
+ }
+ ],
+ "Nicira": [
+ {
+ "domain": "nicira.com",
+ "is_top": true
+ }
+ ],
+ "Nike, Inc.": [
+ {
+ "domain": "nike.com",
+ "is_top": true
+ }
+ ],
+ "Nimag Networks": [
+ {
+ "domain": "nimag.net",
+ "is_top": true
+ }
+ ],
+ "Nimbis Services": [
+ {
+ "domain": "nimbisservices.com",
+ "is_top": true
+ }
+ ],
+ "NimbleStorage": [
+ {
+ "domain": "nimblestorage.com",
+ "is_top": true
+ }
+ ],
+ "Ninki": [
+ {
+ "domain": "ninkip2p.com",
+ "is_top": true
+ }
+ ],
+ "Nokia": [
+ {
+ "domain": "nokia.com",
+ "is_top": true
+ }
+ ],
+ "Nokia Networks": [
+ {
+ "domain": "networks.nokia.com",
+ "is_top": true
+ },
+ {
+ "domain": "nsn.com",
+ "is_top": true
+ }
+ ],
+ "Nomad Global Communication Solutions": [
+ {
+ "domain": "nomadgcs.com",
+ "is_top": true
+ },
+ {
+ "domain": "nomadgs.com",
+ "is_top": true
+ }
+ ],
+ "Nomadio": [
+ {
+ "domain": "nomadio.net",
+ "is_top": true
+ }
+ ],
+ "Nomovok, Ltd.": [
+ {
+ "domain": "nomovok.com",
+ "is_top": true
+ }
+ ],
+ "Norbit": [
+ {
+ "domain": "norbit.no",
+ "is_top": true
+ }
+ ],
+ "Nortel": [
+ {
+ "domain": "nortel.com",
+ "is_top": true
+ }
+ ],
+ "North University of China": [
+ {
+ "domain": "nuc.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Northern Digital, Inc.": [
+ {
+ "domain": "ndigital.com",
+ "is_top": true
+ }
+ ],
+ "Norwegian Air Shuttle ASA": [
+ {
+ "domain": "norwegian.no",
+ "is_top": true
+ }
+ ],
+ "Notal Vision, Inc.": [
+ {
+ "domain": "foreseehome.com",
+ "is_top": true
+ },
+ {
+ "domain": "notalvision.com",
+ "is_top": true
+ }
+ ],
+ "Nouva Systems": [
+ {
+ "domain": "nuovasystems.com",
+ "is_top": true
+ }
+ ],
+ "Novatel Wireless": [
+ {
+ "domain": "nvtl.com",
+ "is_top": true
+ }
+ ],
+ "Novell": [
+ {
+ "domain": "novell.com",
+ "is_top": true
+ }
+ ],
+ "Nuage Networks": [
+ {
+ "domain": "nuagenetworks.net",
+ "is_top": true
+ }
+ ],
+ "Numascale": [
+ {
+ "domain": "numascale.com",
+ "is_top": true
+ }
+ ],
+ "Numergy": [
+ {
+ "domain": "numergy.com",
+ "is_top": true
+ }
+ ],
+ "Numlog": [
+ {
+ "domain": "numlog.fr",
+ "is_top": true
+ }
+ ],
+ "Nuovations": [
+ {
+ "domain": "nuovations.com",
+ "is_top": true
+ }
+ ],
+ "Nutaq": [
+ {
+ "domain": "nutaq.com",
+ "is_top": true
+ }
+ ],
+ "Nuvoton Technology": [
+ {
+ "domain": "nuvoton.com",
+ "is_top": true
+ }
+ ],
+ "O.S. Systems": [
+ {
+ "domain": "ossystems.com.br",
+ "is_top": true
+ }
+ ],
+ "OBEO": [
+ {
+ "domain": "obeo.fr",
+ "is_top": true
+ }
+ ],
+ "OCTO Technology": [
+ {
+ "domain": "octo.com",
+ "is_top": true
+ }
+ ],
+ "OKTET Labs": [
+ {
+ "domain": "oktetlabs.ru",
+ "is_top": true
+ }
+ ],
+ "OLPC": [
+ {
+ "domain": "laptop.org",
+ "is_top": true
+ }
+ ],
+ "OMICRON Electronics": [
+ {
+ "domain": "omicron.at",
+ "is_top": true
+ }
+ ],
+ "ONELAN": [
+ {
+ "domain": "onelan.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "onelan.com",
+ "is_top": true
+ }
+ ],
+ "ONERA": [
+ {
+ "domain": "onera.fr",
+ "is_top": true
+ }
+ ],
+ "ONstor": [
+ {
+ "domain": "onstor.com",
+ "is_top": true
+ }
+ ],
+ "OODrive": [
+ {
+ "domain": "oodrive.com",
+ "is_top": true
+ }
+ ],
+ "ORSoC": [
+ {
+ "domain": "orsoc.se",
+ "is_top": true
+ }
+ ],
+ "OSADL": [
+ {
+ "domain": "osadl.org",
+ "is_top": true
+ }
+ ],
+ "OSDN": [
+ {
+ "domain": "osdn.jp",
+ "is_top": true
+ }
+ ],
+ "OVH": [
+ {
+ "domain": "ovh.net",
+ "is_top": true
+ }
+ ],
+ "Oak Ridge National Laboratory": [
+ {
+ "domain": "ornl.gov",
+ "is_top": true
+ }
+ ],
+ "Oberthur Technologies": [
+ {
+ "domain": "oberthur.com",
+ "is_top": true
+ }
+ ],
+ "Objectif-libre": [
+ {
+ "domain": "objectif-libre.com",
+ "is_top": true
+ }
+ ],
+ "Observision": [
+ {
+ "domain": "observision.com",
+ "is_top": true
+ }
+ ],
+ "Obsidian Research": [
+ {
+ "domain": "obsidianresearch.com",
+ "is_top": true
+ }
+ ],
+ "Ocado": [
+ {
+ "domain": "ocado.com",
+ "is_top": true
+ }
+ ],
+ "Oculus": [
+ {
+ "domain": "oculus.com",
+ "is_top": true
+ }
+ ],
+ "Octant Informatique": [
+ {
+ "domain": "octant-fr.com",
+ "is_top": false
+ },
+ {
+ "domain": "octant.org",
+ "is_top": true
+ }
+ ],
+ "Octasic Semiconductor": [
+ {
+ "domain": "octasic.com",
+ "is_top": true
+ }
+ ],
+ "Oc\u00e9 Technologies": [
+ {
+ "domain": "oce.com",
+ "is_top": true
+ }
+ ],
+ "Oki Semiconductor": [
+ {
+ "domain": "okisemi.com",
+ "is_top": true
+ }
+ ],
+ "Oklahoma State University": [
+ {
+ "domain": "okstate.edu",
+ "is_top": true
+ }
+ ],
+ "OnLive": [
+ {
+ "domain": "onlive.com",
+ "is_top": true
+ }
+ ],
+ "OnTheNet Pty, Ltd.": [
+ {
+ "domain": "onthe.net.au",
+ "is_top": true
+ }
+ ],
+ "One Technologies, L.P.": [
+ {
+ "domain": "onetechnologies.net",
+ "is_top": true
+ }
+ ],
+ "One.com": [
+ {
+ "domain": "one.com",
+ "is_top": true
+ }
+ ],
+ "OneScreen Inc": [
+ {
+ "domain": "onescreen.com",
+ "is_top": true
+ }
+ ],
+ "Onyx Neon": [
+ {
+ "domain": "onyxneon.com",
+ "is_top": true
+ }
+ ],
+ "Onyx Point, Inc.": [
+ {
+ "domain": "onyxpoint.com",
+ "is_top": true
+ }
+ ],
+ "Ooyala, Inc.": [
+ {
+ "domain": "ooyala.com",
+ "is_top": true
+ }
+ ],
+ "OpCoach": [
+ {
+ "domain": "opcoach.com",
+ "is_top": true
+ }
+ ],
+ "Open Grid Computing": [
+ {
+ "domain": "ogc.us",
+ "is_top": true
+ },
+ {
+ "domain": "opengridcomputing.com",
+ "is_top": true
+ }
+ ],
+ "Open Nandra": [
+ {
+ "domain": "open-nandra.com",
+ "is_top": true
+ }
+ ],
+ "OpenBOSSA": [
+ {
+ "domain": "openbossa.org",
+ "is_top": true
+ }
+ ],
+ "OpenBSD": [
+ {
+ "domain": "openbsd.org",
+ "is_top": true
+ }
+ ],
+ "OpenNebula Systems S.L.": [
+ {
+ "domain": "c12g.com",
+ "is_top": true
+ },
+ {
+ "domain": "opennebula.systems",
+ "is_top": true
+ }
+ ],
+ "OpenStack Foundation": [
+ {
+ "domain": "openstack.org",
+ "is_top": true
+ }
+ ],
+ "OpenedHand": [
+ {
+ "domain": "openedhand.com",
+ "is_top": true
+ }
+ ],
+ "Openwall": [
+ {
+ "domain": "openwall.com",
+ "is_top": true
+ }
+ ],
+ "Opower": [
+ {
+ "domain": "opower.com",
+ "is_top": true
+ }
+ ],
+ "Optiflows": [
+ {
+ "domain": "optiflows.com",
+ "is_top": true
+ }
+ ],
+ "Option Wireless Technology": [
+ {
+ "domain": "option.com",
+ "is_top": true
+ }
+ ],
+ "Optiver": [
+ {
+ "domain": "optiver.com",
+ "is_top": true
+ }
+ ],
+ "Oracle": [
+ {
+ "domain": "oracle.com",
+ "is_top": true
+ }
+ ],
+ "Orange": [
+ {
+ "domain": "orange.com",
+ "is_top": true
+ }
+ ],
+ "Orbitz, LLC": [
+ {
+ "domain": "orbitz.com",
+ "is_top": true
+ }
+ ],
+ "Osones": [
+ {
+ "domain": "osones.com",
+ "is_top": true
+ }
+ ],
+ "Outpost Embedded": [
+ {
+ "domain": "outpostembedded.com",
+ "is_top": true
+ },
+ {
+ "domain": "rapidrollout.com",
+ "is_top": true
+ }
+ ],
+ "Overstock": [
+ {
+ "domain": "overstock.com",
+ "is_top": true
+ }
+ ],
+ "Oxilion": [
+ {
+ "domain": "oxilion.nl",
+ "is_top": true
+ }
+ ],
+ "PA Semi Corporation": [
+ {
+ "domain": "pasemi.com",
+ "is_top": true
+ }
+ ],
+ "PCS Systemtechnik": [
+ {
+ "domain": "pcs.com",
+ "is_top": true
+ },
+ {
+ "domain": "pcs.de",
+ "is_top": true
+ }
+ ],
+ "PCSol": [
+ {
+ "domain": "pcsol.be",
+ "is_top": true
+ }
+ ],
+ "PHYTEC Messtechnik GmbH": [
+ {
+ "domain": "phytec.de",
+ "is_top": true
+ }
+ ],
+ "PIAP": [
+ {
+ "domain": "piap.pl",
+ "is_top": true
+ }
+ ],
+ "PIKA Technologies": [
+ {
+ "domain": "pikatech.com",
+ "is_top": true
+ }
+ ],
+ "PLUMgrid": [
+ {
+ "domain": "plumgrid.com",
+ "is_top": true
+ }
+ ],
+ "PLX Technology, Inc.": [
+ {
+ "domain": "plxtech.com",
+ "is_top": true
+ }
+ ],
+ "PMC-Sierra": [
+ {
+ "domain": "pmc-sierra.com",
+ "is_top": true
+ }
+ ],
+ "PRESENSE Technologies": [
+ {
+ "domain": "pre-sense.de",
+ "is_top": true
+ }
+ ],
+ "PROMISE Technology, Inc.": [
+ {
+ "domain": "promise.com",
+ "is_top": true
+ }
+ ],
+ "PROS, Inc.": [
+ {
+ "domain": "pros.com",
+ "is_top": true
+ }
+ ],
+ "PWC Avis": [
+ {
+ "domain": "pwcavis.sk",
+ "is_top": true
+ }
+ ],
+ "PWI North": [
+ {
+ "domain": "pwienterprises.com",
+ "is_top": true
+ }
+ ],
+ "Pacific Northwest National Laboratory": [
+ {
+ "domain": "pnl.gov",
+ "is_top": true
+ },
+ {
+ "domain": "pnnl.gov",
+ "is_top": true
+ }
+ ],
+ "Pagero AB": [
+ {
+ "domain": "pagero.com",
+ "is_top": true
+ }
+ ],
+ "Palantir Technologies": [
+ {
+ "domain": "palantir.com",
+ "is_top": true
+ }
+ ],
+ "Panasas": [
+ {
+ "domain": "panasas.com",
+ "is_top": true
+ }
+ ],
+ "Panasonic": [
+ {
+ "domain": "panasonic.com",
+ "is_top": true
+ }
+ ],
+ "PaperCut Software": [
+ {
+ "domain": "papercut.biz",
+ "is_top": true
+ },
+ {
+ "domain": "papercut.com",
+ "is_top": true
+ }
+ ],
+ "Parallels": [
+ {
+ "domain": "openvz.org",
+ "is_top": true
+ },
+ {
+ "domain": "parallels.com",
+ "is_top": true
+ },
+ {
+ "domain": "sw.ru",
+ "is_top": true
+ },
+ {
+ "domain": "swsoft.com",
+ "is_top": true
+ }
+ ],
+ "Pardus": [
+ {
+ "domain": "pardus.org.tr",
+ "is_top": true
+ }
+ ],
+ "Parkeon": [
+ {
+ "domain": "parkeon.com",
+ "is_top": true
+ }
+ ],
+ "Parrot SA": [
+ {
+ "domain": "parrot.com",
+ "is_top": true
+ }
+ ],
+ "Pavlinux, Inc.": [
+ {
+ "domain": "pavlinux.ru",
+ "is_top": true
+ }
+ ],
+ "PayPal": [
+ {
+ "domain": "paypal.com",
+ "is_top": true
+ }
+ ],
+ "Pearson Education, Inc.": [
+ {
+ "domain": "ecollege.com",
+ "is_top": true
+ }
+ ],
+ "Pengcheng Laboratory": [
+ {
+ "domain": "pcl.ac.cn",
+ "is_top": true
+ }
+ ],
+ "Peking University Microprocessor R&D Center": [
+ {
+ "domain": "mprc.pku.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Pelagicore AB": [
+ {
+ "domain": "pelagicore.com",
+ "is_top": true
+ }
+ ],
+ "Pengutronix": [
+ {
+ "domain": "pengutronix.de",
+ "is_top": true
+ }
+ ],
+ "Percona": [
+ {
+ "domain": "percona.com",
+ "is_top": true
+ }
+ ],
+ "Persistent": [
+ {
+ "domain": "persistent.co.in",
+ "is_top": true
+ }
+ ],
+ "PetaLogix": [
+ {
+ "domain": "petalogix.com",
+ "is_top": true
+ }
+ ],
+ "Phase2": [
+ {
+ "domain": "phase2technology.com",
+ "is_top": true
+ }
+ ],
+ "Philipps-Universit\u00e4t Marburg": [
+ {
+ "domain": "mathematik.uni-marburg.de",
+ "is_top": false
+ },
+ {
+ "domain": "uni-marburg.de",
+ "is_top": true
+ }
+ ],
+ "Philosys Software": [
+ {
+ "domain": "philosys.de",
+ "is_top": true
+ }
+ ],
+ "Phoenix Technologies": [
+ {
+ "domain": "phoenix.com",
+ "is_top": true
+ }
+ ],
+ "Photobucket, Inc.": [
+ {
+ "domain": "photobucket.com",
+ "is_top": true
+ }
+ ],
+ "PiKRON s.r.o": [
+ {
+ "domain": "pikron.com",
+ "is_top": true
+ }
+ ],
+ "Piston Cloud Computing": [
+ {
+ "domain": "pistoncloud.com",
+ "is_top": true
+ }
+ ],
+ "Pitney Bowes": [
+ {
+ "domain": "pitneybowes.com",
+ "is_top": true
+ }
+ ],
+ "Pivotal": [
+ {
+ "domain": "gopivotal.com",
+ "is_top": true
+ },
+ {
+ "domain": "pivotal.io",
+ "is_top": true
+ }
+ ],
+ "Pixart SRL": [
+ {
+ "domain": "pixartargentina.com.ar",
+ "is_top": true
+ }
+ ],
+ "PingCAP": [
+ {
+ "domain": "pingcap.com",
+ "is_top": true
+ }
+ ],
+ "Plan Group": [
+ {
+ "domain": "plan-group.com",
+ "is_top": true
+ }
+ ],
+ "Planet Labs": [
+ {
+ "domain": "planet.com",
+ "is_top": true
+ }
+ ],
+ "Planon": [
+ {
+ "domain": "planonsoftware.com",
+ "is_top": true
+ }
+ ],
+ "Plugable Technologies": [
+ {
+ "domain": "plugable.com",
+ "is_top": true
+ }
+ ],
+ "Pogoapp": [
+ {
+ "domain": "pogoapp.com",
+ "is_top": true
+ }
+ ],
+ "Politecnico di Milano": [
+ {
+ "domain": "mail.polimi.it",
+ "is_top": true
+ }
+ ],
+ "Posteo": [
+ {
+ "domain": "posteo.de",
+ "is_top": true
+ }
+ ],
+ "PolyBeacon, Inc.": [
+ {
+ "domain": "polybeacon.com",
+ "is_top": true
+ }
+ ],
+ "Polycom": [
+ {
+ "domain": "polycom.com",
+ "is_top": true
+ }
+ ],
+ "Preferred Networks": [
+ {
+ "domain": "preferred.jp",
+ "is_top": true
+ }
+ ],
+ "Prevas": [
+ {
+ "domain": "prevas.dk",
+ "is_top": true
+ }
+ ],
+ "Prezi, Inc.": [
+ {
+ "domain": "prezi.com",
+ "is_top": true
+ }
+ ],
+ "Primary Data, Inc.": [
+ {
+ "domain": "primarydata.com",
+ "is_top": true
+ }
+ ],
+ "Princeton University": [
+ {
+ "domain": "princeton.edu",
+ "is_top": true
+ }
+ ],
+ "ProFUSION Embedded Systems": [
+ {
+ "domain": "profusion.mobi",
+ "is_top": true
+ }
+ ],
+ "Profihost AG": [
+ {
+ "domain": "profihost.com",
+ "is_top": true
+ }
+ ],
+ "Proformatique": [
+ {
+ "domain": "proformatique.com",
+ "is_top": true
+ }
+ ],
+ "Profusion": [
+ {
+ "domain": "profusion.com",
+ "is_top": true
+ }
+ ],
+ "Progress Software Corporation": [
+ {
+ "domain": "progress.com",
+ "is_top": true
+ }
+ ],
+ "Project Management Institute, Inc.": [
+ {
+ "domain": "pmi.org",
+ "is_top": true
+ }
+ ],
+ "Prolan Zrt.": [
+ {
+ "domain": "prolan.hu",
+ "is_top": true
+ }
+ ],
+ "Promwad": [
+ {
+ "domain": "promwad.com",
+ "is_top": true
+ }
+ ],
+ "ProphetStor": [
+ {
+ "domain": "prophetstor.com",
+ "is_top": true
+ }
+ ],
+ "Prosyst Software": [
+ {
+ "domain": "prosyst.com",
+ "is_top": true
+ }
+ ],
+ "Protei, Ltd.": [
+ {
+ "domain": "protei.ru",
+ "is_top": true
+ }
+ ],
+ "Protocol Labs": [
+ {
+ "domain": "protocollabs.com",
+ "is_top": true
+ }
+ ],
+ "Protos Software GmbH": [
+ {
+ "domain": "protos.de",
+ "is_top": true
+ }
+ ],
+ "PublicRelay": [
+ {
+ "domain": "publicrelay.com",
+ "is_top": true
+ }
+ ],
+ "Puppet Labs": [
+ {
+ "domain": "puppetlabs.com",
+ "is_top": true
+ }
+ ],
+ "Pure Storage": [
+ {
+ "domain": "purestorage.com",
+ "is_top": true
+ }
+ ],
+ "Puzzle ITC": [
+ {
+ "domain": "puzzle.ch",
+ "is_top": true
+ }
+ ],
+ "QLogic": [
+ {
+ "domain": "ir.qlogic.com",
+ "is_top": false
+ },
+ {
+ "domain": "qlogic.com",
+ "is_top": true
+ }
+ ],
+ "QNX Software Systems Co.": [
+ {
+ "domain": "qnx.com",
+ "is_top": true
+ }
+ ],
+ "QUALITANCE": [
+ {
+ "domain": "qualitance.com",
+ "is_top": true
+ }
+ ],
+ "Qihoo 360 Technology Co., Ltd.": [
+ {
+ "domain": "360.cn",
+ "is_top": true
+ }
+ ],
+ "Qisda": [
+ {
+ "domain": "qisda.com",
+ "is_top": true
+ }
+ ],
+ "Qt Company": [
+ {
+ "domain": "qt.io",
+ "is_top": true
+ }
+ ],
+ "Qualcomm": [
+ {
+ "domain": "qualcomm.com",
+ "is_top": true
+ },
+ {
+ "domain": "quicinc.com",
+ "is_top": true
+ }
+ ],
+ "Qualcomm Atheros": [
+ {
+ "domain": "qca.qualcomm.com",
+ "is_top": true
+ }
+ ],
+ "Quanta Computer, Inc.": [
+ {
+ "domain": "quantatw.com",
+ "is_top": true
+ }
+ ],
+ "Quantum Controls BV": [
+ {
+ "domain": "quantumcontrols.nl",
+ "is_top": true
+ }
+ ],
+ "Qubit": [
+ {
+ "domain": "qubitdigital.com",
+ "is_top": true
+ }
+ ],
+ "Quixey, Inc.": [
+ {
+ "domain": "quixey.com",
+ "is_top": true
+ }
+ ],
+ "Qumranet, Inc.": [
+ {
+ "domain": "qumranet.com",
+ "is_top": true
+ }
+ ],
+ "Qunar": [
+ {
+ "domain": "qunar.com",
+ "is_top": true
+ }
+ ],
+ "Quobyte": [
+ {
+ "domain": "quobyte.com",
+ "is_top": true
+ }
+ ],
+ "Quansight": [
+ {
+ "domain": "quansight.com",
+ "is_top": true
+ }
+ ],
+ "R-S-I Elektrotechnik GmbH": [
+ {
+ "domain": "rsi-elektrotechnik.de",
+ "is_top": true
+ }
+ ],
+ "RAPICORP": [
+ {
+ "domain": "rapicorp.com",
+ "is_top": true
+ }
+ ],
+ "RCP Vision": [
+ {
+ "domain": "rcp-vision.com",
+ "is_top": true
+ }
+ ],
+ "RDC Semiconductor Co., Ltd.": [
+ {
+ "domain": "rdc.com.tw",
+ "is_top": true
+ }
+ ],
+ "REA Elektronik GmbH": [
+ {
+ "domain": "rea-elektronik.net",
+ "is_top": true
+ }
+ ],
+ "RGM Advisors": [
+ {
+ "domain": "rgmadvisors.com",
+ "is_top": true
+ }
+ ],
+ "RGen Solutions": [
+ {
+ "domain": "rgensolutions.com",
+ "is_top": true
+ }
+ ],
+ "RISC Software GmbH": [
+ {
+ "domain": "risc-software.at",
+ "is_top": true
+ }
+ ],
+ "RISE Security": [
+ {
+ "domain": "risesecurity.org",
+ "is_top": true
+ }
+ ],
+ "ROAD": [
+ {
+ "domain": "road.de",
+ "is_top": true
+ }
+ ],
+ "Racelogic": [
+ {
+ "domain": "racelogic.co.uk",
+ "is_top": true
+ }
+ ],
+ "Rackspace": [
+ {
+ "domain": "rackspace.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "rackspace.com",
+ "is_top": true
+ }
+ ],
+ "Radware": [
+ {
+ "domain": "radware.com",
+ "is_top": true
+ }
+ ],
+ "Rajant": [
+ {
+ "domain": "rajant.com",
+ "is_top": true
+ }
+ ],
+ "Rakuten": [
+ {
+ "domain": "mail.rakuten.com",
+ "is_top": true
+ }
+ ],
+ "Ralink Technology": [
+ {
+ "domain": "ralinktech.com",
+ "is_top": true
+ }
+ ],
+ "Rally Software": [
+ {
+ "domain": "rallydev.com",
+ "is_top": true
+ }
+ ],
+ "Rapid7": [
+ {
+ "domain": "rapid7.com",
+ "is_top": true
+ }
+ ],
+ "Raumfeld GmbH": [
+ {
+ "domain": "raumfeld.com",
+ "is_top": true
+ }
+ ],
+ "Ravello Systems": [
+ {
+ "domain": "ravellosystems.com",
+ "is_top": true
+ }
+ ],
+ "Raytheon": [
+ {
+ "domain": "raytheon.com",
+ "is_top": true
+ }
+ ],
+ "Razorblue, Ltd.": [
+ {
+ "domain": "razorblue.com",
+ "is_top": true
+ }
+ ],
+ "Reaktor": [
+ {
+ "domain": "reaktor.fi",
+ "is_top": true
+ }
+ ],
+ "Real-Time Remedies, Inc.": [
+ {
+ "domain": "rtr.ca",
+ "is_top": true
+ }
+ ],
+ "RealVNC": [
+ {
+ "domain": "realvnc.com",
+ "is_top": true
+ }
+ ],
+ "Realsil Microelectronics": [
+ {
+ "domain": "realsil.com.cn",
+ "is_top": true
+ }
+ ],
+ "Realtek": [
+ {
+ "domain": "realtek.com",
+ "is_top": true
+ },
+ {
+ "domain": "realtek.com.tw",
+ "is_top": true
+ }
+ ],
+ "Red Flag Software": [
+ {
+ "domain": "redflag-linux.com",
+ "is_top": true
+ }
+ ],
+ "Red Hat": [
+ {
+ "domain": "fedoraproject.org",
+ "is_top": true
+ },
+ {
+ "domain": "redhat.com",
+ "is_top": true
+ },
+ {
+ "domain": "weilnetz.de",
+ "is_top": true
+ }
+ ],
+ "Red Hat, Inc.": [],
+ "Redbrick Health": [
+ {
+ "domain": "redbrickhealth.com",
+ "is_top": true
+ }
+ ],
+ "Redpill Linpro": [
+ {
+ "domain": "redpill-linpro.com",
+ "is_top": false
+ }
+ ],
+ "Reflex Systems": [
+ {
+ "domain": "reflexsystems.co.uk",
+ "is_top": true
+ }
+ ],
+ "Reliance Jio Infocomm, Ltd.": [
+ {
+ "domain": "ril.com",
+ "is_top": true
+ }
+ ],
+ "Remix": [
+ {
+ "domain": "remix.com",
+ "is_top": true
+ }
+ ],
+ "Renesas Electronics Corporation": [
+ {
+ "domain": "renesas.com",
+ "is_top": true
+ },
+ {
+ "domain": "renesas.eu",
+ "is_top": true
+ }
+ ],
+ "ReportLab, Inc.": [
+ {
+ "domain": "reportlab.com",
+ "is_top": true
+ }
+ ],
+ "Restorepoint Ltd.": [
+ {
+ "domain": "restorepoint.com",
+ "is_top": true
+ }
+ ],
+ "Rheinmetall Canada": [
+ {
+ "domain": "rheinmetall.ca",
+ "is_top": true
+ }
+ ],
+ "Rheinmetall Defence Electronics": [
+ {
+ "domain": "rheinmetall-de.com",
+ "is_top": true
+ },
+ {
+ "domain": "rheinmetall-defence.com",
+ "is_top": true
+ }
+ ],
+ "RidgeRun, LLC": [
+ {
+ "domain": "ridgerun.com",
+ "is_top": true
+ }
+ ],
+ "Riedel Communications": [
+ {
+ "domain": "riedel.net",
+ "is_top": true
+ }
+ ],
+ "RightScale, Inc.": [
+ {
+ "domain": "rightscale.com",
+ "is_top": true
+ }
+ ],
+ "Riot Games, Inc.": [
+ {
+ "domain": "riotgames.com",
+ "is_top": true
+ }
+ ],
+ "RisingTide Systems": [
+ {
+ "domain": "risingtidesystems.com",
+ "is_top": true
+ }
+ ],
+ "Risk Management Solutions": [
+ {
+ "domain": "rms.com",
+ "is_top": true
+ }
+ ],
+ "Riskive": [
+ {
+ "domain": "riskive.com",
+ "is_top": true
+ }
+ ],
+ "Riverbed Technology": [
+ {
+ "domain": "riverbed.com",
+ "is_top": true
+ }
+ ],
+ "Roald van Loon Consultancy": [
+ {
+ "domain": "roaldvanloon.nl",
+ "is_top": true
+ }
+ ],
+ "Robert Bosch GmbH": [],
+ "Rocket Internet SE": [
+ {
+ "domain": "rocket-internet.de",
+ "is_top": true
+ }
+ ],
+ "Rockwell Automation, Inc.": [
+ {
+ "domain": "rockwell.com",
+ "is_top": true
+ },
+ {
+ "domain": "rockwellautomation.com",
+ "is_top": true
+ }
+ ],
+ "Rockwell Collins": [
+ {
+ "domain": "rockwellcollins.com",
+ "is_top": true
+ }
+ ],
+ "Roesch & Walter Industrie-Elektronik": [
+ {
+ "domain": "rw-gmbh.de",
+ "is_top": true
+ }
+ ],
+ "Roku": [
+ {
+ "domain": "roku.com",
+ "is_top": true
+ }
+ ],
+ "Rowland Institute, Harvard": [
+ {
+ "domain": "rowland.harvard.edu",
+ "is_top": true
+ }
+ ],
+ "RuggedCom, Inc.": [
+ {
+ "domain": "ruggedcom.com",
+ "is_top": true
+ }
+ ],
+ "Ruijie Networks Co., Ltd.": [
+ {
+ "domain": "ruijie.com.cn",
+ "is_top": true
+ },
+ {
+ "domain": "ruijienetworks.com",
+ "is_top": true
+ }
+ ],
+ "Rutgers University": [
+ {
+ "domain": "rutgers.edu",
+ "is_top": true
+ }
+ ],
+ "R\u00e9volution Linux": [
+ {
+ "domain": "revolutionlinux.com",
+ "is_top": true
+ }
+ ],
+ "SANPeople": [
+ {
+ "domain": "sanpeople.com",
+ "is_top": true
+ }
+ ],
+ "SAP": [
+ {
+ "domain": "sap.com",
+ "is_top": true
+ }
+ ],
+ "SAP AG": [],
+ "SAS": [
+ {
+ "domain": "sas.com",
+ "is_top": true
+ }
+ ],
+ "SC5": [
+ {
+ "domain": "sc5.io",
+ "is_top": true
+ }
+ ],
+ "SDG Systems": [
+ {
+ "domain": "sdgsystems.com",
+ "is_top": true
+ }
+ ],
+ "SES TechCom": [
+ {
+ "domain": "ses-astra.com",
+ "is_top": true
+ },
+ {
+ "domain": "ses.com",
+ "is_top": true
+ }
+ ],
+ "SFR": [
+ {
+ "domain": "neufcegetel.fr",
+ "is_top": true
+ },
+ {
+ "domain": "sfr.fr",
+ "is_top": true
+ }
+ ],
+ "SGI": [
+ {
+ "domain": "sgi.com",
+ "is_top": true
+ }
+ ],
+ "SICE S.A": [
+ {
+ "domain": "sice.com",
+ "is_top": true
+ }
+ ],
+ "SIGMA Chemnitz": [
+ {
+ "domain": "sigma-chemnitz.de",
+ "is_top": true
+ }
+ ],
+ "SIOS Technology Corporation": [
+ {
+ "domain": "sios.com",
+ "is_top": true
+ },
+ {
+ "domain": "us.sios.com",
+ "is_top": false
+ }
+ ],
+ "SMARTX": [
+ {
+ "domain": "smartx-cn.com",
+ "is_top": true
+ },
+ {
+ "domain": "zelin.io",
+ "is_top": true
+ }
+ ],
+ "SMSC": [
+ {
+ "domain": "smsc.com",
+ "is_top": true
+ }
+ ],
+ "SRI International": [
+ {
+ "domain": "sri.com",
+ "is_top": true
+ }
+ ],
+ "SRI Quant": [
+ {
+ "domain": "rdi-kvant.ru",
+ "is_top": true
+ }
+ ],
+ "Star Lab Software": [
+ {
+ "domain": "starlab.io",
+ "is_top": true
+ }
+ ],
+ "ST Ericsson": [
+ {
+ "domain": "stericsson.com",
+ "is_top": true
+ }
+ ],
+ "STMicroelectronics": [
+ {
+ "domain": "st.com",
+ "is_top": true
+ }
+ ],
+ "SUSE": [
+ {
+ "domain": "suse.com",
+ "is_top": true
+ },
+ {
+ "domain": "suse.cz",
+ "is_top": true
+ },
+ {
+ "domain": "suse.de",
+ "is_top": true
+ }
+ ],
+ "SW Complete, Inc.": [
+ {
+ "domain": "swcomplete.com",
+ "is_top": true
+ }
+ ],
+ "SWITCH": [
+ {
+ "domain": "switch.ch",
+ "is_top": true
+ }
+ ],
+ "SYS TEC electronic GmbH": [
+ {
+ "domain": "systec-electronic.com",
+ "is_top": true
+ }
+ ],
+ "SYSGO": [
+ {
+ "domain": "sysgo.com",
+ "is_top": true
+ }
+ ],
+ "Sabayon Linux": [
+ {
+ "domain": "sabayon.org",
+ "is_top": true
+ },
+ {
+ "domain": "sabayonlinux.org",
+ "is_top": true
+ }
+ ],
+ "Safari.to": [
+ {
+ "domain": "safari.to",
+ "is_top": true
+ }
+ ],
+ "Sage Group PLC": [
+ {
+ "domain": "sage.com",
+ "is_top": true
+ }
+ ],
+ "Sagem": [
+ {
+ "domain": "sagem.com",
+ "is_top": true
+ }
+ ],
+ "Sailpoint": [
+ {
+ "domain": "sailpoint.com",
+ "is_top": true
+ }
+ ],
+ "Salesforce": [
+ {
+ "domain": "salesforce.com",
+ "is_top": true
+ }
+ ],
+ "SaltStack, Inc.": [
+ {
+ "domain": "saltstack.com",
+ "is_top": true
+ }
+ ],
+ "Samsung": [
+ {
+ "domain": "samsung.com",
+ "is_top": true
+ }
+ ],
+ "SanDisk": [
+ {
+ "domain": "sandisk.com",
+ "is_top": true
+ }
+ ],
+ "Sandia National Laboratories": [
+ {
+ "domain": "sandia.gov",
+ "is_top": true
+ }
+ ],
+ "Savant Systems": [
+ {
+ "domain": "savantav.com",
+ "is_top": true
+ }
+ ],
+ "Savoir-faire Linux": [
+ {
+ "domain": "savoirfairelinux.com",
+ "is_top": true
+ }
+ ],
+ "Saxnet GmbH": [
+ {
+ "domain": "saxnet.de",
+ "is_top": true
+ }
+ ],
+ "ScaleMP, Inc.": [
+ {
+ "domain": "scalemp.com",
+ "is_top": true
+ }
+ ],
+ "Scality": [
+ {
+ "domain": "scality.com",
+ "is_top": true
+ }
+ ],
+ "Scapa Technologies Limited": [
+ {
+ "domain": "scapatech.com",
+ "is_top": true
+ }
+ ],
+ "ScholarStack": [
+ {
+ "domain": "scholarstack.com",
+ "is_top": true
+ }
+ ],
+ "Science Fiction Technologies": [
+ {
+ "domain": "sf-tec.de",
+ "is_top": true
+ }
+ ],
+ "Science and Technology Facilities Council": [
+ {
+ "domain": "stfc.ac.uk",
+ "is_top": true
+ }
+ ],
+ "Scilab Enterprises": [
+ {
+ "domain": "scilab-enterprises.com",
+ "is_top": false
+ }
+ ],
+ "Seagate Technology LLC": [
+ {
+ "domain": "evault.com",
+ "is_top": true
+ }
+ ],
+ "Secretlab": [
+ {
+ "domain": "secretlab.ca",
+ "is_top": true
+ }
+ ],
+ "Secure Computing": [
+ {
+ "domain": "moreton.com.au",
+ "is_top": true
+ },
+ {
+ "domain": "securecomputing.com",
+ "is_top": true
+ }
+ ],
+ "Seegno": [
+ {
+ "domain": "seegno.com",
+ "is_top": true
+ }
+ ],
+ "Selectel": [
+ {
+ "domain": "selectel.ru",
+ "is_top": true
+ }
+ ],
+ "Semaphore": [
+ {
+ "domain": "cse-semaphore.com",
+ "is_top": true
+ }
+ ],
+ "Semihalf Embedded Systems": [
+ {
+ "domain": "semihalf.com",
+ "is_top": true
+ }
+ ],
+ "SendFaster": [
+ {
+ "domain": "sendfaster.com",
+ "is_top": true
+ }
+ ],
+ "SendGrid": [
+ {
+ "domain": "sendgrid.com",
+ "is_top": true
+ }
+ ],
+ "Sensirion": [
+ {
+ "domain": "sensirion.com",
+ "is_top": true
+ }
+ ],
+ "Sensoray": [
+ {
+ "domain": "sensoray.com",
+ "is_top": true
+ }
+ ],
+ "Sensortherm GmbH": [
+ {
+ "domain": "sensortherm.de",
+ "is_top": true
+ }
+ ],
+ "Sentelic Corporation": [
+ {
+ "domain": "sentelic.com",
+ "is_top": true
+ }
+ ],
+ "Sequoia IT": [
+ {
+ "domain": "sequoia.it",
+ "is_top": true
+ }
+ ],
+ "ServerEngines Corporation": [
+ {
+ "domain": "serverengines.com",
+ "is_top": true
+ }
+ ],
+ "Seven Networks": [
+ {
+ "domain": "seven.com",
+ "is_top": true
+ }
+ ],
+ "Sferia": [
+ {
+ "domain": "sferia.pl",
+ "is_top": true
+ }
+ ],
+ "Shawhin Tech": [
+ {
+ "domain": "shawhintech.com",
+ "is_top": true
+ }
+ ],
+ "Shawn Zhong": [
+ {
+ "domain": "shawnzhong.com",
+ "is_top": true
+ }
+ ],
+ "Shiny Srl": [
+ {
+ "domain": "shiny.it",
+ "is_top": true
+ },
+ {
+ "domain": "shinystat.com",
+ "is_top": true
+ }
+ ],
+ "Shotgun Software": [
+ {
+ "domain": "shotgunsoftware.com",
+ "is_top": true
+ }
+ ],
+ "Shutterstock, Inc.": [
+ {
+ "domain": "shutterstock.com",
+ "is_top": true
+ }
+ ],
+ "Siano Mobile Silicon": [
+ {
+ "domain": "siano-ms.com",
+ "is_top": true
+ }
+ ],
+ "Sichuan University": [
+ {
+ "domain": "stu.scu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Sicortex": [
+ {
+ "domain": "sicortex.com",
+ "is_top": true
+ }
+ ],
+ "Sidebranch": [
+ {
+ "domain": "sidebranch.com",
+ "is_top": true
+ }
+ ],
+ "Siemens": [
+ {
+ "domain": "siemens.com",
+ "is_top": true
+ }
+ ],
+ "Sierra Wireless": [
+ {
+ "domain": "sierrawireless.com",
+ "is_top": true
+ }
+ ],
+ "Sigfox": [
+ {
+ "domain": "sigfox.com",
+ "is_top": true
+ }
+ ],
+ "Sigma Designs": [
+ {
+ "domain": "sdesigns.com",
+ "is_top": true
+ }
+ ],
+ "Signal 11 Software": [
+ {
+ "domain": "signal11.us",
+ "is_top": true
+ }
+ ],
+ "Signature Research": [
+ {
+ "domain": "signatureresearchinc.com",
+ "is_top": true
+ }
+ ],
+ "Signips": [
+ {
+ "domain": "signips.com",
+ "is_top": true
+ }
+ ],
+ "Signove": [
+ {
+ "domain": "signove.com",
+ "is_top": true
+ }
+ ],
+ "Sigterm": [
+ {
+ "domain": "sigterm.no",
+ "is_top": true
+ }
+ ],
+ "Simtec Electronics": [
+ {
+ "domain": "simtec.co.uk",
+ "is_top": true
+ }
+ ],
+ "Sirius International": [
+ {
+ "domain": "siriushk.com",
+ "is_top": true
+ }
+ ],
+ "Sirrix AG": [
+ {
+ "domain": "sirrix.com",
+ "is_top": true
+ }
+ ],
+ "Slimlogic, Ltd.": [
+ {
+ "domain": "slimlogic.co.uk",
+ "is_top": true
+ }
+ ],
+ "Smart Weblications": [
+ {
+ "domain": "smart-weblications.com",
+ "is_top": true
+ }
+ ],
+ "SmartJog S.A.S.": [
+ {
+ "domain": "smartjog.com",
+ "is_top": true
+ }
+ ],
+ "Smashing Boxes": [
+ {
+ "domain": "smashingboxes.com",
+ "is_top": true
+ }
+ ],
+ "Smile": [
+ {
+ "domain": "smile.ci",
+ "is_top": true
+ },
+ {
+ "domain": "smile.fr",
+ "is_top": true
+ }
+ ],
+ "Snabb": [
+ {
+ "domain": "snabb.co",
+ "is_top": true
+ }
+ ],
+ "SnapTV": [
+ {
+ "domain": "snap.tv",
+ "is_top": true
+ }
+ ],
+ "Snowflake Computing, Inc.": [
+ {
+ "domain": "snowflake.net",
+ "is_top": true
+ }
+ ],
+ "Social Physics": [],
+ "Socrata, Inc.": [
+ {
+ "domain": "socrata.com",
+ "is_top": true
+ }
+ ],
+ "SodiFrance (formely Mia software)": [
+ {
+ "domain": "sodifrance.fr",
+ "is_top": true
+ }
+ ],
+ "SofaWare": [
+ {
+ "domain": "sofaware.com",
+ "is_top": true
+ }
+ ],
+ "SoftLayer": [
+ {
+ "domain": "softlayer.com",
+ "is_top": true
+ }
+ ],
+ "SoftPLC": [
+ {
+ "domain": "softplc.com",
+ "is_top": true
+ }
+ ],
+ "Softek Solutions, Inc.": [
+ {
+ "domain": "softekinc.com",
+ "is_top": true
+ }
+ ],
+ "Software Freedom Law Center": [
+ {
+ "domain": "softwarefreedom.org",
+ "is_top": true
+ }
+ ],
+ "Sogyo": [
+ {
+ "domain": "sogyo.nl",
+ "is_top": true
+ }
+ ],
+ "Sohonet": [
+ {
+ "domain": "sohonet.com",
+ "is_top": true
+ }
+ ],
+ "Solarflare Communications, Inc.": [
+ {
+ "domain": "solarflare.com",
+ "is_top": true
+ }
+ ],
+ "Solid Boot, Ltd.": [
+ {
+ "domain": "solidboot.com",
+ "is_top": true
+ }
+ ],
+ "SolidFire": [
+ {
+ "domain": "solidfire.com",
+ "is_top": true
+ }
+ ],
+ "Solinea": [
+ {
+ "domain": "solinea.com",
+ "is_top": true
+ }
+ ],
+ "Sonatest Limited": [
+ {
+ "domain": "sonatest.com",
+ "is_top": true
+ }
+ ],
+ "Sonatype": [
+ {
+ "domain": "sonatype.com",
+ "is_top": true
+ }
+ ],
+ "Sony": [
+ {
+ "domain": "am.sony.com",
+ "is_top": false
+ },
+ {
+ "domain": "sony.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "sony.com",
+ "is_top": true
+ },
+ {
+ "domain": "sonycom.com",
+ "is_top": true
+ }
+ ],
+ "Sony Mobile": [
+ {
+ "domain": "sonyericsson.com",
+ "is_top": true
+ },
+ {
+ "domain": "sonymobile.com",
+ "is_top": true
+ }
+ ],
+ "Sophos": [
+ {
+ "domain": "sophos.com",
+ "is_top": true
+ }
+ ],
+ "SoundCloud Ltd": [
+ {
+ "domain": "soundcloud.com",
+ "is_top": true
+ }
+ ],
+ "South Pole AB": [
+ {
+ "domain": "southpole.se",
+ "is_top": true
+ }
+ ],
+ "Southwest Solar Technologies": [
+ {
+ "domain": "swsolartech.com",
+ "is_top": true
+ }
+ ],
+ "Soyatec": [
+ {
+ "domain": "soyatec.com",
+ "is_top": true
+ }
+ ],
+ "Special Communications Systems": [
+ {
+ "domain": "scs-ptc.com",
+ "is_top": true
+ }
+ ],
+ "Spectra Logic": [
+ {
+ "domain": "spectralogic.com",
+ "is_top": true
+ }
+ ],
+ "Sphairon Technologies GmbH": [
+ {
+ "domain": "sphairon.com",
+ "is_top": true
+ }
+ ],
+ "SpiderNet Services": [
+ {
+ "domain": "spidernet.net",
+ "is_top": true
+ }
+ ],
+ "Spil Games": [
+ {
+ "domain": "spilgames.com",
+ "is_top": true
+ }
+ ],
+ "Spotify AB": [
+ {
+ "domain": "spotify.com",
+ "is_top": true
+ }
+ ],
+ "SpringSource, Inc aka VMware now GoPivotal": [],
+ "Springpath Inc.": [
+ {
+ "domain": "storvisor.com",
+ "is_top": true
+ }
+ ],
+ "Square, Inc.": [
+ {
+ "domain": "squareup.com",
+ "is_top": true
+ }
+ ],
+ "Squarespace": [
+ {
+ "domain": "squarespace.com",
+ "is_top": true
+ }
+ ],
+ "StackMasters": [
+ {
+ "domain": "stackmasters.eu",
+ "is_top": true
+ }
+ ],
+ "StackOps Technologies": [
+ {
+ "domain": "stackops.com",
+ "is_top": true
+ }
+ ],
+ "Stackinsider": [
+ {
+ "domain": "stackinsider.com",
+ "is_top": true
+ },
+ {
+ "domain": "stackinsider.org",
+ "is_top": true
+ },
+ {
+ "domain": "windawn.com",
+ "is_top": true
+ }
+ ],
+ "Stanford University": [
+ {
+ "domain": "cs.stanford.edu",
+ "is_top": false
+ },
+ {
+ "domain": "stanford.edu",
+ "is_top": true
+ }
+ ],
+ "Star Trac": [
+ {
+ "domain": "startrac.com",
+ "is_top": true
+ }
+ ],
+ "Starent Networks": [
+ {
+ "domain": "starentnetworks.com",
+ "is_top": true
+ }
+ ],
+ "SteelEye": [
+ {
+ "domain": "steeleye.com",
+ "is_top": true
+ }
+ ],
+ "Stepping Stone": [
+ {
+ "domain": "stepping-stone.ch",
+ "is_top": true
+ }
+ ],
+ "Sterry IT, LLC": [
+ {
+ "domain": "sterryit.com",
+ "is_top": true
+ }
+ ],
+ "Stiftelsen Chalmers Studenthem": [
+ {
+ "domain": "chalmersstudentbostader.se",
+ "is_top": true
+ },
+ {
+ "domain": "csbnet.se",
+ "is_top": true
+ }
+ ],
+ "Stonesoft Corporation": [
+ {
+ "domain": "stonesoft.com",
+ "is_top": true
+ }
+ ],
+ "StorPool": [
+ {
+ "domain": "storpool.com",
+ "is_top": true
+ }
+ ],
+ "Stormshield": [
+ {
+ "domain": "stormshield.eu",
+ "is_top": true
+ }
+ ],
+ "Storwize": [
+ {
+ "domain": "storwize.com",
+ "is_top": true
+ }
+ ],
+ "Strandera Corporation": [
+ {
+ "domain": "strandera.com",
+ "is_top": true
+ }
+ ],
+ "Strato": [
+ {
+ "domain": "strato.de",
+ "is_top": true
+ }
+ ],
+ "StratoScale": [
+ {
+ "domain": "stratoscale.com",
+ "is_top": true
+ }
+ ],
+ "Stratosec": [
+ {
+ "domain": "stratosec.co",
+ "is_top": true
+ }
+ ],
+ "Stream Processors, Inc.": [
+ {
+ "domain": "streamprocessors.com",
+ "is_top": true
+ }
+ ],
+ "StreamUnlimited": [
+ {
+ "domain": "streamunlimited.com",
+ "is_top": true
+ }
+ ],
+ "Stripe": [
+ {
+ "domain": "stripe.com",
+ "is_top": true
+ }
+ ],
+ "StrongLoop": [
+ {
+ "domain": "strongloop.com",
+ "is_top": true
+ }
+ ],
+ "Substantiel": [
+ {
+ "domain": "substantiel.fr",
+ "is_top": true
+ }
+ ],
+ "Sumo Logic": [
+ {
+ "domain": "sumologic.com",
+ "is_top": true
+ }
+ ],
+ "Sun": [],
+ "Sun Microsystems, Inc.": [
+ {
+ "domain": "sun.com",
+ "is_top": true
+ }
+ ],
+ "Sun Yat-sen University": [
+ {
+ "domain": "mail2.sysu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "SunGard": [
+ {
+ "domain": "sungard.com",
+ "is_top": true
+ }
+ ],
+ "Sunplus Core Technology": [],
+ "Sunplus Technology Co., Ltd.": [
+ {
+ "domain": "sunplus.com",
+ "is_top": true
+ },
+ {
+ "domain": "sunplusct.com",
+ "is_top": true
+ }
+ ],
+ "Swapp Engineering": [
+ {
+ "domain": "swapp-eng.it",
+ "is_top": true
+ }
+ ],
+ "Swedish Institute of Computer Science": [
+ {
+ "domain": "sics.se",
+ "is_top": true
+ }
+ ],
+ "Swedish University of Agricultural Sciences": [
+ {
+ "domain": "data.slu.se",
+ "is_top": false
+ },
+ {
+ "domain": "slu.se",
+ "is_top": true
+ }
+ ],
+ "SwiftStack": [
+ {
+ "domain": "swiftstack.com",
+ "is_top": true
+ }
+ ],
+ "Sybase": [
+ {
+ "domain": "sybase.com",
+ "is_top": true
+ }
+ ],
+ "Symantec": [],
+ "Symantec Corporation": [
+ {
+ "domain": "symantec.com",
+ "is_top": true
+ },
+ {
+ "domain": "veritas.com",
+ "is_top": true
+ }
+ ],
+ "Symas Corporation": [
+ {
+ "domain": "symas.com",
+ "is_top": true
+ }
+ ],
+ "Synopsys": [
+ {
+ "domain": "synopsys.com",
+ "is_top": true
+ }
+ ],
+ "Synk": [
+ {
+ "domain": "synk.com",
+ "is_top": true
+ }
+ ],
+ "System Fabric Works": [
+ {
+ "domain": "systemfabricworks.com",
+ "is_top": true
+ }
+ ],
+ "TAOS, Inc.": [
+ {
+ "domain": "taosinc.com",
+ "is_top": true
+ }
+ ],
+ "TBWA": [
+ {
+ "domain": "tbwa.com",
+ "is_top": true
+ }
+ ],
+ "TCloud Computing": [
+ {
+ "domain": "tcloudcomputing.com",
+ "is_top": true
+ }
+ ],
+ "TECNA": [
+ {
+ "domain": "tecna.com",
+ "is_top": true
+ }
+ ],
+ "TES s.r.o.": [
+ {
+ "domain": "tes.eu",
+ "is_top": true
+ },
+ {
+ "domain": "tesnet.cz",
+ "is_top": true
+ }
+ ],
+ "TIBCO Software": [
+ {
+ "domain": "tibco.com",
+ "is_top": true
+ },
+ {
+ "domain": "tibco.es",
+ "is_top": true
+ }
+ ],
+ "TIL Technologies": [
+ {
+ "domain": "til-technologies.fr",
+ "is_top": true
+ }
+ ],
+ "TIS": [
+ {
+ "domain": "tis.co.jp",
+ "is_top": true
+ }
+ ],
+ "TOPTICA Photonics": [
+ {
+ "domain": "toptica.com",
+ "is_top": true
+ }
+ ],
+ "TVGlobo": [
+ {
+ "domain": "tvglobo.com.br",
+ "is_top": true
+ }
+ ],
+ "TVU Networks": [
+ {
+ "domain": "tvunetworks.com",
+ "is_top": true
+ }
+ ],
+ "Taktik": [
+ {
+ "domain": "taktik.be",
+ "is_top": true
+ }
+ ],
+ "Talend": [
+ {
+ "domain": "talend.com",
+ "is_top": true
+ }
+ ],
+ "Tandberg": [
+ {
+ "domain": "tandberg.com",
+ "is_top": true
+ }
+ ],
+ "Taobao": [
+ {
+ "domain": "taobao.com",
+ "is_top": true
+ }
+ ],
+ "Tapestry Systems": [
+ {
+ "domain": "tapsys.com",
+ "is_top": true
+ }
+ ],
+ "Tasktop": [
+ {
+ "domain": "tasktop.com",
+ "is_top": true
+ }
+ ],
+ "Tata Consultancy": [
+ {
+ "domain": "tcs.com",
+ "is_top": true
+ }
+ ],
+ "TecVenture": [
+ {
+ "domain": "tec-venture.de",
+ "is_top": true
+ }
+ ],
+ "Tech-angels": [
+ {
+ "domain": "tech-angels.com",
+ "is_top": true
+ }
+ ],
+ "TechNexion, Ltd.": [
+ {
+ "domain": "technexion.com",
+ "is_top": true
+ }
+ ],
+ "TechPatron": [
+ {
+ "domain": "techpatron.co.in",
+ "is_top": true
+ }
+ ],
+ "TechniSat Digital GmbH": [
+ {
+ "domain": "technisat.com",
+ "is_top": true
+ }
+ ],
+ "Technical Solutions, Inc.": [
+ {
+ "domain": "techsol.ca",
+ "is_top": true
+ }
+ ],
+ "Technische Universitaet Darmstadt": [
+ {
+ "domain": "tu-darmstadt.de",
+ "is_top": true
+ }
+ ],
+ "Teevity": [
+ {
+ "domain": "teevity.com",
+ "is_top": true
+ }
+ ],
+ "Telargo, Inc.": [
+ {
+ "domain": "telargo.com",
+ "is_top": true
+ }
+ ],
+ "Teleca": [
+ {
+ "domain": "teleca.com",
+ "is_top": true
+ }
+ ],
+ "Telecom Italia": [
+ {
+ "domain": "telecomitalia.com",
+ "is_top": true
+ }
+ ],
+ "Telecom-Service": [
+ {
+ "domain": "tls.msk.ru",
+ "is_top": true
+ }
+ ],
+ "Telegent System": [
+ {
+ "domain": "telegent.com",
+ "is_top": true
+ }
+ ],
+ "Telemotive AG": [
+ {
+ "domain": "telemotive.de",
+ "is_top": true
+ }
+ ],
+ "Televic": [
+ {
+ "domain": "televic.com",
+ "is_top": true
+ }
+ ],
+ "Tellabs": [
+ {
+ "domain": "tellabs.com",
+ "is_top": true
+ }
+ ],
+ "Telly": [
+ {
+ "domain": "telly.com",
+ "is_top": true
+ }
+ ],
+ "Teltonika": [
+ {
+ "domain": "teltonika.lt",
+ "is_top": true
+ }
+ ],
+ "Tencent": [
+ {
+ "domain": "tencent.com",
+ "is_top": true
+ }
+ ],
+ "Tendril": [
+ {
+ "domain": "tendrilinc.com",
+ "is_top": true
+ }
+ ],
+ "Tensilica": [],
+ "Tensilica, Inc.": [
+ {
+ "domain": "tensilica.com",
+ "is_top": true
+ }
+ ],
+ "Terascala": [
+ {
+ "domain": "terascala.com",
+ "is_top": true
+ }
+ ],
+ "Tesora, Inc.": [
+ {
+ "domain": "parelastic.com",
+ "is_top": true
+ },
+ {
+ "domain": "tesora.com",
+ "is_top": true
+ }
+ ],
+ "Texas Instruments": [
+ {
+ "domain": "ti.com",
+ "is_top": true
+ }
+ ],
+ "Thales": [
+ {
+ "domain": "thalesgroup.com",
+ "is_top": true
+ }
+ ],
+ "The Apache Software Foundation": [
+ {
+ "domain": "apache.org",
+ "is_top": true
+ }
+ ],
+ "The Church of Jesus Christ of Latter-day Saints": [
+ {
+ "domain": "ldschurch.org",
+ "is_top": true
+ }
+ ],
+ "The Guardian": [
+ {
+ "domain": "guardian.co.uk",
+ "is_top": true
+ }
+ ],
+ "The Linux Box": [
+ {
+ "domain": "linuxbox.com",
+ "is_top": true
+ }
+ ],
+ "The Product Engine, Inc.": [
+ {
+ "domain": "productengine.com",
+ "is_top": true
+ }
+ ],
+ "Think.Web": [
+ {
+ "domain": "think.web.id",
+ "is_top": true
+ }
+ ],
+ "Thinking Phone Networks": [
+ {
+ "domain": "thinkingphones.com",
+ "is_top": true
+ }
+ ],
+ "Thinktube": [
+ {
+ "domain": "thinktube.com",
+ "is_top": true
+ }
+ ],
+ "Thomson Reuters": [
+ {
+ "domain": "thomsonreuters.com",
+ "is_top": true
+ }
+ ],
+ "Thot-Soft 2002": [
+ {
+ "domain": "thot-soft.com",
+ "is_top": true
+ }
+ ],
+ "ThoughtWorks, Inc.": [
+ {
+ "domain": "thoughtworks.com",
+ "is_top": true
+ }
+ ],
+ "Tianjin Zhongke Blue Whale Information Technologies": [
+ {
+ "domain": "nrchpc.ac.cn",
+ "is_top": false
+ }
+ ],
+ "Tieto": [
+ {
+ "domain": "tieto.com",
+ "is_top": true
+ }
+ ],
+ "Tilera": [
+ {
+ "domain": "tilera.com",
+ "is_top": true
+ }
+ ],
+ "Time Warner Cable, Inc.": [
+ {
+ "domain": "twcable.com",
+ "is_top": true
+ }
+ ],
+ "Timesys": [
+ {
+ "domain": "timesys.com",
+ "is_top": true
+ }
+ ],
+ "Tk Open Systems, Ltd.": [
+ {
+ "domain": "tkos.co.il",
+ "is_top": true
+ }
+ ],
+ "TomTom": [
+ {
+ "domain": "tomtom.com",
+ "is_top": true
+ }
+ ],
+ "Top Bug Net": [
+ {
+ "domain": "topbug.net",
+ "is_top": true
+ }
+ ],
+ "Tonian": [
+ {
+ "domain": "tonian.com",
+ "is_top": true
+ }
+ ],
+ "Toshiba": [
+ {
+ "domain": "toshiba.co.jp",
+ "is_top": true
+ },
+ {
+ "domain": "toshiba.com",
+ "is_top": true
+ },
+ {
+ "domain": "toshiba.es",
+ "is_top": true
+ },
+ {
+ "domain": "toshiba.eu",
+ "is_top": true
+ }
+ ],
+ "Total Knowledge": [
+ {
+ "domain": "total-knowledge.com",
+ "is_top": true
+ }
+ ],
+ "Tower Technologies": [
+ {
+ "domain": "towertech.it",
+ "is_top": true
+ }
+ ],
+ "Tracelytics": [
+ {
+ "domain": "tracelytics.com",
+ "is_top": true
+ }
+ ],
+ "Traffic Management Technologies": [
+ {
+ "domain": "tmtservices.co.za",
+ "is_top": true
+ }
+ ],
+ "Transitive": [
+ {
+ "domain": "transitive.com",
+ "is_top": true
+ }
+ ],
+ "Transmode Systems": [
+ {
+ "domain": "transmode.se",
+ "is_top": true
+ }
+ ],
+ "Traverse Technologies": [
+ {
+ "domain": "traverse.com.au",
+ "is_top": true
+ }
+ ],
+ "Tremolo Security, Inc.": [
+ {
+ "domain": "tremolosecurity.com",
+ "is_top": true
+ }
+ ],
+ "Trend Micro": [
+ {
+ "domain": "trendmicro.com",
+ "is_top": true
+ },
+ {
+ "domain": "trendmicro.com.cn",
+ "is_top": true
+ }
+ ],
+ "Tresys": [
+ {
+ "domain": "tresys.com",
+ "is_top": true
+ }
+ ],
+ "Trinnov Audio": [
+ {
+ "domain": "trinnov.com",
+ "is_top": true
+ }
+ ],
+ "Tripeaks": [
+ {
+ "domain": "tripeaks.co.jp",
+ "is_top": true
+ }
+ ],
+ "TriplePoint": [
+ {
+ "domain": "tpi.com",
+ "is_top": true
+ }
+ ],
+ "Triplemining": [
+ {
+ "domain": "triplemining.com",
+ "is_top": true
+ }
+ ],
+ "Tripp Lite": [
+ {
+ "domain": "keyspan.com",
+ "is_top": true
+ },
+ {
+ "domain": "tripplite.com",
+ "is_top": true
+ }
+ ],
+ "TrollTech": [
+ {
+ "domain": "trolltech.com",
+ "is_top": true
+ }
+ ],
+ "TruCoin": [
+ {
+ "domain": "trucoin.com",
+ "is_top": false
+ }
+ ],
+ "Trusted Computer Solutions": [
+ {
+ "domain": "trustedcs.com",
+ "is_top": true
+ }
+ ],
+ "Tundra Semiconductor": [
+ {
+ "domain": "tundra.com",
+ "is_top": true
+ }
+ ],
+ "Tungsten Graphics": [
+ {
+ "domain": "tungstengraphics.com",
+ "is_top": true
+ }
+ ],
+ "Tuxera": [
+ {
+ "domain": "tuxera.com",
+ "is_top": true
+ }
+ ],
+ "Twin Sun": [
+ {
+ "domain": "twinsun.com",
+ "is_top": true
+ }
+ ],
+ "Twitter": [
+ {
+ "domain": "twitter.com",
+ "is_top": true
+ }
+ ],
+ "Tyro Payments Limited": [
+ {
+ "domain": "tyro.com",
+ "is_top": true
+ }
+ ],
+ "T\u00e9l\u00e9com Bretagne": [
+ {
+ "domain": "telecom-bretagne.eu",
+ "is_top": true
+ }
+ ],
+ "U.S. Naval Research Laboratory": [
+ {
+ "domain": "nrl.navy.mil",
+ "is_top": true
+ }
+ ],
+ "UHU-Linux": [
+ {
+ "domain": "uhulinux.hu",
+ "is_top": true
+ }
+ ],
+ "UIC": [
+ {
+ "domain": "uic.edu",
+ "is_top": true
+ }
+ ],
+ "UK National Health Service": [
+ {
+ "domain": "nhs.net",
+ "is_top": true
+ },
+ {
+ "domain": "nhs.uk",
+ "is_top": true
+ }
+ ],
+ "ULYSSIS VZW": [
+ {
+ "domain": "ulyssis.org",
+ "is_top": true
+ }
+ ],
+ "UNICUS Co., Ltd.": [
+ {
+ "domain": "unicus.jp",
+ "is_top": true
+ }
+ ],
+ "URSYS Pty, Ltd.": [
+ {
+ "domain": "ursys.com.au",
+ "is_top": true
+ }
+ ],
+ "US National Security Agency": [
+ {
+ "domain": "nsa.gov",
+ "is_top": true
+ },
+ {
+ "domain": "tycho.nsa.gov",
+ "is_top": false
+ }
+ ],
+ "Uber": [
+ {
+ "domain": "uber.com",
+ "is_top": true
+ }
+ ],
+ "Ubisoft": [
+ {
+ "domain": "ubisoft.com",
+ "is_top": true
+ }
+ ],
+ "Ubuntu Kylin": [
+ {
+ "domain": "ubuntukylin.com",
+ "is_top": true
+ }
+ ],
+ "Uhuru Software, Inc.": [
+ {
+ "domain": "uhurusoftware.com",
+ "is_top": true
+ }
+ ],
+ "Unicontrol Systemtechnik": [
+ {
+ "domain": "unicontrol.de",
+ "is_top": true
+ }
+ ],
+ "University of Electronic Science and Technology of China": [
+ {
+ "domain": "std.uestc.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Berkeley University of California": [
+ {
+ "domain": "berkeley.edu",
+ "is_top": true
+ }
+ ],
+ "University of Science and Technology of China": [
+ {
+ "domain": "mail.ustc.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Unilogic Networks B.V.": [
+ {
+ "domain": "unilogicnetworks.net",
+ "is_top": true
+ }
+ ],
+ "Unique Computing Solutions": [
+ {
+ "domain": "ucs.at",
+ "is_top": true
+ }
+ ],
+ "Unisys": [
+ {
+ "domain": "unisys.com",
+ "is_top": true
+ }
+ ],
+ "University of Texas at Austin": [
+ {
+ "domain": "utexas.edu",
+ "is_top": true
+ }
+ ],
+ "UnitedStack": [
+ {
+ "domain": "unitedstack.com",
+ "is_top": true
+ }
+ ],
+ "Universal Scientific Industrial Co.": [
+ {
+ "domain": "usish.com",
+ "is_top": true
+ }
+ ],
+ "Universidad Complutense": [
+ {
+ "domain": "dacya.ucm.es",
+ "is_top": true
+ },
+ {
+ "domain": "fdi.ucm.es",
+ "is_top": true
+ }
+ ],
+ "Universidad Rey Juan Carlos": [
+ {
+ "domain": "gsyc.es",
+ "is_top": true
+ },
+ {
+ "domain": "gsyc.urjc.es",
+ "is_top": false
+ },
+ {
+ "domain": "libresoft.es",
+ "is_top": true
+ }
+ ],
+ "Universidad de Cantabria": [
+ {
+ "domain": "ifca.unican.es",
+ "is_top": false
+ },
+ {
+ "domain": "unican.es",
+ "is_top": true
+ }
+ ],
+ "Universidad de Sevilla": [
+ {
+ "domain": "us.es",
+ "is_top": true
+ }
+ ],
+ "Universitat Polit\u00e8cnica de Catalunya": [
+ {
+ "domain": "entel.upc.edu",
+ "is_top": true
+ }
+ ],
+ "University of Applied Sciences Rapperswil": [],
+ "University of Arizona": [
+ {
+ "domain": "arizona.edu",
+ "is_top": true
+ }
+ ],
+ "University of California, Santa Cruz": [
+ {
+ "domain": "cs.ucsc.edu",
+ "is_top": false
+ },
+ {
+ "domain": "soe.ucsc.edu",
+ "is_top": false
+ },
+ {
+ "domain": "ucsc.edu",
+ "is_top": true
+ }
+ ],
+ "University of Cambridge": [
+ {
+ "domain": "cam.ac.uk",
+ "is_top": true
+ }
+ ],
+ "University of Limerick": [
+ {
+ "domain": "ul.ie",
+ "is_top": true
+ }
+ ],
+ "University of Manchester": [
+ {
+ "domain": "manchester.ac.uk",
+ "is_top": true
+ }
+ ],
+ "University of Maryland": [
+ {
+ "domain": "umd.edu",
+ "is_top": true
+ }
+ ],
+ "University of Melbourne": [
+ {
+ "domain": "unimelb.edu.au",
+ "is_top": true
+ }
+ ],
+ "University of Michigan": [
+ {
+ "domain": "umich.edu",
+ "is_top": true
+ }
+ ],
+ "University of Michigan - CITI": [
+ {
+ "domain": "citi.umich.edu",
+ "is_top": true
+ }
+ ],
+ "University of Minnesota": [
+ {
+ "domain": "umn.edu",
+ "is_top": true
+ }
+ ],
+ "University of Mississippi": [
+ {
+ "domain": "olemiss.edu",
+ "is_top": true
+ }
+ ],
+ "University of Nebraska Omaha": [
+ {
+ "domain": "unomaha.edu",
+ "is_top": true
+ }
+ ],
+ "University of North Carolina at Chapel Hill": [
+ {
+ "domain": "unc.edu",
+ "is_top": true
+ }
+ ],
+ "University of Queensland": [
+ {
+ "domain": "uq.edu.au",
+ "is_top": true
+ }
+ ],
+ "University of Missouri": [
+ {
+ "domain": "missouri.edu",
+ "is_top": true
+ },
+ {
+ "domain": "mail.missouri.edu",
+ "is_top": true
+ }
+ ],
+ "University of Toronto": [
+ {
+ "domain": "utoronto.ca",
+ "is_top": true
+ },
+ {
+ "domain": "mail.utoronto.ca",
+ "is_top": true
+ }
+ ],
+ "University of Utah": [
+ {
+ "domain": "cs.utah.edu",
+ "is_top": false
+ },
+ {
+ "domain": "utah.edu",
+ "is_top": true
+ }
+ ],
+ "University of Virginia": [
+ {
+ "domain": "virginia.edu",
+ "is_top": true
+ }
+ ],
+ "University of Waterloo": [
+ {
+ "domain": "csclub.uwaterloo.ca",
+ "is_top": true
+ }
+ ],
+ "Universit\u00e4t Osnabr\u00fcck": [
+ {
+ "domain": "uos.de",
+ "is_top": true
+ }
+ ],
+ "Uppsala University": [
+ {
+ "domain": "uu.se",
+ "is_top": true
+ }
+ ],
+ "Upstream University": [
+ {
+ "domain": "upstream-university.org",
+ "is_top": true
+ }
+ ],
+ "VA Linux Systems Japan": [
+ {
+ "domain": "valinux.co.jp",
+ "is_top": false
+ }
+ ],
+ "VIA Technologies, Inc.": [
+ {
+ "domain": "via.com.tw",
+ "is_top": true
+ },
+ {
+ "domain": "viatech.com",
+ "is_top": true
+ },
+ {
+ "domain": "viatech.com.cn",
+ "is_top": true
+ }
+ ],
+ "VIVO Systems": [
+ {
+ "domain": "vivosys.com",
+ "is_top": true
+ }
+ ],
+ "VMTurbo": [
+ {
+ "domain": "vmturbo.com",
+ "is_top": true
+ }
+ ],
+ "VMware": [
+ {
+ "domain": "vmware.com",
+ "is_top": true
+ }
+ ],
+ "VPAC": [
+ {
+ "domain": "vpac.org",
+ "is_top": true
+ }
+ ],
+ "VPOP Technologies, Inc.": [
+ {
+ "domain": "vpop.net",
+ "is_top": true
+ }
+ ],
+ "VRT Systems": [
+ {
+ "domain": "vrt.com.au",
+ "is_top": true
+ }
+ ],
+ "VU University Amsterdam": [
+ {
+ "domain": "vu.nl",
+ "is_top": true
+ }
+ ],
+ "Value Team SpA": [
+ {
+ "domain": "valueteam.com",
+ "is_top": true
+ }
+ ],
+ "Varnish Software": [
+ {
+ "domain": "varnish-software.com",
+ "is_top": true
+ }
+ ],
+ "VayavyaLabs": [
+ {
+ "domain": "vayavyalabs.com",
+ "is_top": true
+ }
+ ],
+ "Venatech AB": [
+ {
+ "domain": "venatech.se",
+ "is_top": true
+ }
+ ],
+ "Verismo": [
+ {
+ "domain": "verismonetworks.com",
+ "is_top": true
+ }
+ ],
+ "Verizon": [
+ {
+ "domain": "verizon.com",
+ "is_top": true
+ }
+ ],
+ "Vernier Software and Technology": [
+ {
+ "domain": "vernier.com",
+ "is_top": true
+ }
+ ],
+ "Vertafore, Inc.": [
+ {
+ "domain": "vertafore.com",
+ "is_top": true
+ }
+ ],
+ "VexxHost": [
+ {
+ "domain": "vexxhost.com",
+ "is_top": true
+ }
+ ],
+ "Viafoura": [
+ {
+ "domain": "viafoura.com",
+ "is_top": true
+ }
+ ],
+ "Vianet Internet Solutions": [
+ {
+ "domain": "vianet.ca",
+ "is_top": true
+ },
+ {
+ "domain": "zing-net.ca",
+ "is_top": true
+ }
+ ],
+ "Vidible": [
+ {
+ "domain": "vidible.tv",
+ "is_top": true
+ }
+ ],
+ "Viettel": [
+ {
+ "domain": "viettel.com.vn",
+ "is_top": true
+ }
+ ],
+ "Vimeo, LLC": [
+ {
+ "domain": "vimeo.com",
+ "is_top": true
+ }
+ ],
+ "VinaKom": [
+ {
+ "domain": "vinakom.com",
+ "is_top": true
+ }
+ ],
+ "Violin Memory": [
+ {
+ "domain": "vmem.com",
+ "is_top": true
+ }
+ ],
+ "Viprinet GmpH": [
+ {
+ "domain": "viprinet.com",
+ "is_top": true
+ }
+ ],
+ "Virginia Tech": [
+ {
+ "domain": "vt.edu",
+ "is_top": true
+ }
+ ],
+ "Virtual Bridges": [
+ {
+ "domain": "vbridges.com",
+ "is_top": true
+ }
+ ],
+ "Virtual Computer": [
+ {
+ "domain": "virtualcomputer.com",
+ "is_top": true
+ }
+ ],
+ "Virtual Scale": [
+ {
+ "domain": "virtualscale.fr",
+ "is_top": true
+ }
+ ],
+ "Virtual Security Research": [
+ {
+ "domain": "vsecurity.com",
+ "is_top": true
+ }
+ ],
+ "VirtualLogix, Inc.": [
+ {
+ "domain": "virtuallogix.com",
+ "is_top": true
+ }
+ ],
+ "VirtualTech": [
+ {
+ "domain": "virtualtech.jp",
+ "is_top": true
+ }
+ ],
+ "Virtuata": [
+ {
+ "domain": "virtuata.com",
+ "is_top": true
+ }
+ ],
+ "Vision Engraving Systems": [
+ {
+ "domain": "visionengravers.com",
+ "is_top": true
+ }
+ ],
+ "Vision Service Plan": [
+ {
+ "domain": "vsp.com",
+ "is_top": true
+ }
+ ],
+ "Vision Systems GmbH": [
+ {
+ "domain": "visionsystems.de",
+ "is_top": true
+ }
+ ],
+ "Vista-Silicon S.L.": [
+ {
+ "domain": "vista-silicon.com",
+ "is_top": true
+ }
+ ],
+ "Vivecode": [
+ {
+ "domain": "vivecode.com",
+ "is_top": true
+ }
+ ],
+ "Vizuri": [
+ {
+ "domain": "vizuri.com",
+ "is_top": true
+ }
+ ],
+ "Volkswagen": [
+ {
+ "domain": "volkswagen.de",
+ "is_top": true
+ }
+ ],
+ "Voltaire": [
+ {
+ "domain": "voltaire.com",
+ "is_top": true
+ }
+ ],
+ "Voxelbrain UG": [
+ {
+ "domain": "voxelbrain.com",
+ "is_top": true
+ }
+ ],
+ "Vyatta": [
+ {
+ "domain": "vyatta.com",
+ "is_top": true
+ }
+ ],
+ "WANdisco": [
+ {
+ "domain": "wandisco.com",
+ "is_top": true
+ }
+ ],
+ "WE7": [
+ {
+ "domain": "we7.com",
+ "is_top": true
+ }
+ ],
+ "WORK Microwave GmbH": [
+ {
+ "domain": "work-microwave.de",
+ "is_top": true
+ }
+ ],
+ "WPR Medical": [
+ {
+ "domain": "wprmedical.com",
+ "is_top": true
+ }
+ ],
+ "WSO2": [
+ {
+ "domain": "wso2.com",
+ "is_top": true
+ }
+ ],
+ "Wabtec Railway Electronics": [
+ {
+ "domain": "wabtec.com",
+ "is_top": true
+ }
+ ],
+ "Wacom": [
+ {
+ "domain": "wacom.com",
+ "is_top": true
+ }
+ ],
+ "WalmartLabs": [
+ {
+ "domain": "walmartlabs.com",
+ "is_top": true
+ }
+ ],
+ "Warpnet B.V.": [
+ {
+ "domain": "warpnet.nl",
+ "is_top": true
+ }
+ ],
+ "WatchGuard Video": [
+ {
+ "domain": "WatchGuardVideo.com",
+ "is_top": true
+ }
+ ],
+ "Web Drive": [
+ {
+ "domain": "webdrive.co.nz",
+ "is_top": true
+ }
+ ],
+ "Websense": [
+ {
+ "domain": "websense.com",
+ "is_top": true
+ }
+ ],
+ "Webtrends": [
+ {
+ "domain": "webtrends.com",
+ "is_top": true
+ }
+ ],
+ "Weigle Wilczek GmbH": [
+ {
+ "domain": "w11k.de",
+ "is_top": true
+ }
+ ],
+ "Weinmann Medical Technology": [
+ {
+ "domain": "weinmann.de",
+ "is_top": true
+ }
+ ],
+ "Westell": [
+ {
+ "domain": "westell.com",
+ "is_top": true
+ }
+ ],
+ "Westermo": [
+ {
+ "domain": "westermo.co.uk",
+ "is_top": true
+ },
+ {
+ "domain": "westermo.com",
+ "is_top": true
+ }
+ ],
+ "Western Digital": [
+ {
+ "domain": "wdc.com",
+ "is_top": true
+ }
+ ],
+ "Whamcloud, Inc.": [
+ {
+ "domain": "whamcloud.com",
+ "is_top": true
+ }
+ ],
+ "Whatever": [
+ {
+ "domain": "knowledgeplaza.net",
+ "is_top": true
+ },
+ {
+ "domain": "whatever-company.com",
+ "is_top": true
+ }
+ ],
+ "WiMobilis": [
+ {
+ "domain": "wimobilis.com.br",
+ "is_top": true
+ }
+ ],
+ "WikiWorks": [
+ {
+ "domain": "wikiworks.com",
+ "is_top": true
+ }
+ ],
+ "Wikia, Inc.": [
+ {
+ "domain": "wikia.com",
+ "is_top": true
+ }
+ ],
+ "Wikimedia Deutschland": [
+ {
+ "domain": "wikimedia.de",
+ "is_top": true
+ }
+ ],
+ "Wikimedia Foundation": [
+ {
+ "domain": "wikimedia.org",
+ "is_top": true
+ }
+ ],
+ "Willow Garage": [
+ {
+ "domain": "willowgarage.com",
+ "is_top": true
+ }
+ ],
+ "Winbond Electronics": [
+ {
+ "domain": "winbond.com",
+ "is_top": true
+ },
+ {
+ "domain": "winbond.com.tw",
+ "is_top": true
+ }
+ ],
+ "Wincor Nixdorf": [
+ {
+ "domain": "wincor-nixdorf.com",
+ "is_top": true
+ }
+ ],
+ "Wind River": [
+ {
+ "domain": "windriver.com",
+ "is_top": true
+ }
+ ],
+ "Wipro": [
+ {
+ "domain": "wipro.com",
+ "is_top": true
+ }
+ ],
+ "Wize Commerce, Inc.": [
+ {
+ "domain": "wizecommerce.com",
+ "is_top": true
+ }
+ ],
+ "Wizery, Ltd.": [
+ {
+ "domain": "wizery.com",
+ "is_top": true
+ }
+ ],
+ "Wolfson Microelectronics": [
+ {
+ "domain": "wolfsonmicro.com",
+ "is_top": true
+ }
+ ],
+ "Woods Hole Oceanographic Institution": [
+ {
+ "domain": "whoi.edu",
+ "is_top": true
+ }
+ ],
+ "Workday": [
+ {
+ "domain": "workday.com",
+ "is_top": true
+ }
+ ],
+ "Worldline": [
+ {
+ "domain": "worldline.com",
+ "is_top": true
+ }
+ ],
+ "Wotif Holdings Limited": [
+ {
+ "domain": "wotifgroup.com",
+ "is_top": true
+ }
+ ],
+ "Wytron Technology": [
+ {
+ "domain": "wytron.com.tw",
+ "is_top": true
+ }
+ ],
+ "X-IO": [
+ {
+ "domain": "x-io.com",
+ "is_top": true
+ }
+ ],
+ "X-ION": [
+ {
+ "domain": "x-ion.de",
+ "is_top": true
+ }
+ ],
+ "XBMC Foundation": [
+ {
+ "domain": "xbmc.org",
+ "is_top": true
+ }
+ ],
+ "XIV Information Systems": [
+ {
+ "domain": "xiv.co.il",
+ "is_top": true
+ },
+ {
+ "domain": "xivstorage.com",
+ "is_top": true
+ }
+ ],
+ "XLAB": [
+ {
+ "domain": "xlab.si",
+ "is_top": true
+ }
+ ],
+ "XMotra": [
+ {
+ "domain": "xmotra.com",
+ "is_top": true
+ }
+ ],
+ "XTech": [
+ {
+ "domain": "xtech.com.ar",
+ "is_top": true
+ },
+ {
+ "domain": "xtech.com",
+ "is_top": true
+ }
+ ],
+ "Xelerated, Inc.": [
+ {
+ "domain": "xelerated.com",
+ "is_top": true
+ }
+ ],
+ "Xemeti": [
+ {
+ "domain": "xemeti.com",
+ "is_top": true
+ }
+ ],
+ "Xentech Solutions, Ltd.": [
+ {
+ "domain": "xentech.co.uk",
+ "is_top": true
+ }
+ ],
+ "Xerox": [
+ {
+ "domain": "xerox.com",
+ "is_top": true
+ }
+ ],
+ "Xilinx, Inc.": [
+ {
+ "domain": "xilinx.com",
+ "is_top": true
+ }
+ ],
+ "Xi’an Jiaotong University": [
+ {
+ "domain": "stu.xjtu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Xidian University": [
+ {
+ "domain": "mail.xidian.edu.cn",
+ "is_top": true
+ },
+ {
+ "domain": "stu.xidian.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Xiotech Corporation": [
+ {
+ "domain": "xiostorage.com",
+ "is_top": true
+ },
+ {
+ "domain": "xiotech.com",
+ "is_top": true
+ }
+ ],
+ "Xiph.Org Foundation": [
+ {
+ "domain": "xiph.org",
+ "is_top": true
+ }
+ ],
+ "Xorcom": [
+ {
+ "domain": "xorcom.com",
+ "is_top": true
+ }
+ ],
+ "Xored Software Inc": [
+ {
+ "domain": "xored.com",
+ "is_top": true
+ }
+ ],
+ "YOPESO": [
+ {
+ "domain": "yopeso.com",
+ "is_top": true
+ }
+ ],
+ "Yahoo, Inc.": [
+ {
+ "domain": "yahoo-inc.com",
+ "is_top": true
+ }
+ ],
+ "Yatta Solutions GmbH": [
+ {
+ "domain": "yatta.de",
+ "is_top": true
+ }
+ ],
+ "Yelp, Inc.": [
+ {
+ "domain": "yelp.com",
+ "is_top": true
+ }
+ ],
+ "Yepa S.r.l.": [
+ {
+ "domain": "yepa.com",
+ "is_top": true
+ }
+ ],
+ "Yext": [
+ {
+ "domain": "yext.com",
+ "is_top": true
+ }
+ ],
+ "Yokogawa Electric": [
+ {
+ "domain": "yokogawa.com",
+ "is_top": true
+ }
+ ],
+ "You/Com Audiocommunicatie BV": [
+ {
+ "domain": "youcom.nl",
+ "is_top": true
+ }
+ ],
+ "YouScribe": [
+ {
+ "domain": "youscribe.com",
+ "is_top": true
+ },
+ {
+ "domain": "youscribe.fr",
+ "is_top": true
+ }
+ ],
+ "Ysance": [
+ {
+ "domain": "ysance.com",
+ "is_top": true
+ }
+ ],
+ "ZE Powergroup, Inc.": [
+ {
+ "domain": "ze.com",
+ "is_top": true
+ }
+ ],
+ "ZOHO Corporation": [
+ {
+ "domain": "zoho.com",
+ "is_top": true
+ }
+ ],
+ "ZTE Corporation": [
+ {
+ "domain": "zte.com.cn",
+ "is_top": true
+ }
+ ],
+ "Zadara Storage": [
+ {
+ "domain": "zadarastorage.com",
+ "is_top": true
+ }
+ ],
+ "Zalando": [
+ {
+ "domain": "zalando.de",
+ "is_top": true
+ }
+ ],
+ "Zafar Takhirov": [
+ {
+ "domain": "zafar.cc",
+ "is_top": true
+ }
+ ],
+ "Zane Benefits, Inc.": [
+ {
+ "domain": "zanebenefits.com",
+ "is_top": true
+ }
+ ],
+ "Zend": [
+ {
+ "domain": "zend.com",
+ "is_top": true
+ }
+ ],
+ "Zentific": [
+ {
+ "domain": "zentific.com",
+ "is_top": true
+ }
+ ],
+ "Zeugma Systems": [
+ {
+ "domain": "zeugmasystems.com",
+ "is_top": true
+ }
+ ],
+ "Zhejiang University": [
+ {
+ "domain": "zju.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Zilogic Systems": [
+ {
+ "domain": "zilogic.com",
+ "is_top": true
+ }
+ ],
+ "Zinkov": [
+ {
+ "domain": "zinkov.com",
+ "is_top": true
+ }
+ ],
+ "Zing Systems": [
+ {
+ "domain": "zing.net",
+ "is_top": true
+ }
+ ],
+ "Zmanda": [
+ {
+ "domain": "zmanda.com",
+ "is_top": true
+ }
+ ],
+ "Zonbu": [
+ {
+ "domain": "zonbu.com",
+ "is_top": true
+ }
+ ],
+ "ZTE": [
+ {
+ "domain": "zte.com.cn",
+ "is_top": true
+ }
+ ],
+ "ZyXel": [
+ {
+ "domain": "zyxel.com",
+ "is_top": true
+ }
+ ],
+ "Zynga, Inc.": [
+ {
+ "domain": "zynga.com",
+ "is_top": true
+ }
+ ],
+ "aizo ag": [
+ {
+ "domain": "aizo.com",
+ "is_top": true
+ }
+ ],
+ "ams": [
+ {
+ "domain": "ams.com",
+ "is_top": true
+ }
+ ],
+ "caiaq": [
+ {
+ "domain": "caiaq.de",
+ "is_top": true
+ }
+ ],
+ "cloudControl, Inc.": [
+ {
+ "domain": "cloudcontrol.com",
+ "is_top": true
+ },
+ {
+ "domain": "dotcloud.com",
+ "is_top": true
+ }
+ ],
+ "codecentric AG": [
+ {
+ "domain": "codecentric.de",
+ "is_top": true
+ }
+ ],
+ "compeople AG": [
+ {
+ "domain": "compeople.de",
+ "is_top": true
+ }
+ ],
+ "cozybit": [
+ {
+ "domain": "cozybit.com",
+ "is_top": true
+ }
+ ],
+ "eBay": [
+ {
+ "domain": "ebay.com",
+ "is_top": true
+ },
+ {
+ "domain": "ebaysf.com",
+ "is_top": true
+ }
+ ],
+ "eInfochips": [
+ {
+ "domain": "einfochips.com",
+ "is_top": true
+ }
+ ],
+ "eInstruction": [
+ {
+ "domain": "einstruction.com",
+ "is_top": true
+ }
+ ],
+ "eNovance": [
+ {
+ "domain": "enovance.com",
+ "is_top": true
+ }
+ ],
+ "eOriginal": [
+ {
+ "domain": "eoriginal.com",
+ "is_top": true
+ }
+ ],
+ "eSATURNUS": [
+ {
+ "domain": "esaturnus.com",
+ "is_top": true
+ }
+ ],
+ "eSentire": [
+ {
+ "domain": "esentire.com",
+ "is_top": true
+ }
+ ],
+ "eXponent Technologies": [
+ {
+ "domain": "exponent.gr",
+ "is_top": true
+ }
+ ],
+ "eZ Systems AS": [
+ {
+ "domain": "ez.no",
+ "is_top": true
+ }
+ ],
+ "edX, Inc.": [
+ {
+ "domain": "edx.org",
+ "is_top": true
+ }
+ ],
+ "emlix GmbH": [
+ {
+ "domain": "emlix.com",
+ "is_top": true
+ }
+ ],
+ "enStratus": [
+ {
+ "domain": "enstratius.com",
+ "is_top": true
+ }
+ ],
+ "eteration A.S.": [
+ {
+ "domain": "eteration.com",
+ "is_top": true
+ }
+ ],
+ "ev-i Informationstechnologie": [
+ {
+ "domain": "ev-i.at",
+ "is_top": true
+ }
+ ],
+ "exceet electronics": [
+ {
+ "domain": "exceet-electronics.com",
+ "is_top": true
+ }
+ ],
+ "filoo": [
+ {
+ "domain": "filoo.de",
+ "is_top": true
+ }
+ ],
+ "fuel7": [
+ {
+ "domain": "fuel7.com",
+ "is_top": true
+ }
+ ],
+ "hbz": [],
+ "hjk engineering": [
+ {
+ "domain": "hansjkoch.de",
+ "is_top": true
+ }
+ ],
+ "iDa Mobile": [
+ {
+ "domain": "idamob.com",
+ "is_top": true
+ }
+ ],
+ "iNic": [
+ {
+ "domain": "inic.no",
+ "is_top": true
+ }
+ ],
+ "iPlant Collaborative": [
+ {
+ "domain": "iplantcollaborative.org",
+ "is_top": true
+ }
+ ],
+ "iTel Networks, Inc.": [
+ {
+ "domain": "itel.com",
+ "is_top": true
+ }
+ ],
+ "iWeb": [
+ {
+ "domain": "iweb.com",
+ "is_top": true
+ }
+ ],
+ "igel": [
+ {
+ "domain": "igel.co.jp",
+ "is_top": true
+ }
+ ],
+ "imapp, ltd.": [
+ {
+ "domain": "imapp.pl",
+ "is_top": true
+ }
+ ],
+ "internet24 GmbH": [
+ {
+ "domain": "internet24.de",
+ "is_top": true
+ }
+ ],
+ "iomart Group": [
+ {
+ "domain": "iomart.com",
+ "is_top": true
+ }
+ ],
+ "ipb (uk), Ltd.": [
+ {
+ "domain": "ibp.de",
+ "is_top": true
+ }
+ ],
+ "iptelorg GmbH": [
+ {
+ "domain": "iptel.org",
+ "is_top": true
+ }
+ ],
+ "isis-mpp": [
+ {
+ "domain": "isismpp.fr",
+ "is_top": false
+ }
+ ],
+ "itemis AG": [
+ {
+ "domain": "itemis.com",
+ "is_top": true
+ }
+ ],
+ "jmicron.com": [
+ {
+ "domain": "jmicron.com",
+ "is_top": true
+ }
+ ],
+ "jusst technologies GmbH": [
+ {
+ "domain": "jusst.de",
+ "is_top": true
+ }
+ ],
+ "Koneksys": [
+ {
+ "domain": "koneksys.com",
+ "is_top": true
+ }
+ ],
+ "kt NexR": [
+ {
+ "domain": "nexr.co.kr",
+ "is_top": true
+ }
+ ],
+ "linutronix": [
+ {
+ "domain": "linutronix.de",
+ "is_top": true
+ }
+ ],
+ "m-privacy GmbH": [
+ {
+ "domain": "m-privacy.de",
+ "is_top": true
+ }
+ ],
+ "medisite Systemhaus GmbH": [
+ {
+ "domain": "medisite.de",
+ "is_top": true
+ }
+ ],
+ "neteffect technologies": [
+ {
+ "domain": "ne-t.com",
+ "is_top": true
+ },
+ {
+ "domain": "neteffect.com",
+ "is_top": false
+ }
+ ],
+ "nexB Inc.": [
+ {
+ "domain": "nexb.com",
+ "is_top": true
+ }
+ ],
+ "novero GmbH": [
+ {
+ "domain": "novero.com",
+ "is_top": true
+ }
+ ],
+ "nsfocus": [
+ {
+ "domain": "nsfocus.com",
+ "is_top": true
+ }
+ ],
+ "oDesk Corporation": [
+ {
+ "domain": "odesk.com",
+ "is_top": true
+ }
+ ],
+ "pair Networks": [
+ {
+ "domain": "pair.com",
+ "is_top": true
+ }
+ ],
+ "picoChip Designs": [
+ {
+ "domain": "picochip.com",
+ "is_top": true
+ }
+ ],
+ "productOps": [
+ {
+ "domain": "productops.com",
+ "is_top": true
+ }
+ ],
+ "rPath, Inc.": [
+ {
+ "domain": "rpath.com",
+ "is_top": true
+ }
+ ],
+ "raw engineering, Inc.": [
+ {
+ "domain": "built.io",
+ "is_top": true
+ },
+ {
+ "domain": "contentstack.io",
+ "is_top": true
+ },
+ {
+ "domain": "raweng.com",
+ "is_top": true
+ }
+ ],
+ "reliablesolutions": [
+ {
+ "domain": "reliablesolutions.de",
+ "is_top": true
+ }
+ ],
+ "section5": [
+ {
+ "domain": "section5.ch",
+ "is_top": true
+ }
+ ],
+ "secunet": [
+ {
+ "domain": "secunet.com",
+ "is_top": true
+ }
+ ],
+ "skinnyCorp LLC": [
+ {
+ "domain": "skinnycorp.com",
+ "is_top": true
+ }
+ ],
+ "taskit": [
+ {
+ "domain": "taskit.de",
+ "is_top": true
+ }
+ ],
+ "team(ix) GmbH": [
+ {
+ "domain": "teamix.de",
+ "is_top": true
+ }
+ ],
+ "teamf1": [
+ {
+ "domain": "teamf1.com",
+ "is_top": true
+ }
+ ],
+ "testing": [],
+ "txtr GmbH": [
+ {
+ "domain": "txtr.com",
+ "is_top": true
+ }
+ ],
+ "universit\u00e9 Libre de Bruxelles": [
+ {
+ "domain": "ulb.ac.be",
+ "is_top": true
+ }
+ ],
+ "vArmour": [
+ {
+ "domain": "varmour.com",
+ "is_top": true
+ }
+ ],
+ "verit Informationssysteme GmbH": [
+ {
+ "domain": "verit.de",
+ "is_top": true
+ }
+ ],
+ "weLaika": [
+ {
+ "domain": "welaika.com",
+ "is_top": true
+ }
+ ],
+ "webERP Africa": [
+ {
+ "domain": "weberpafrica.com",
+ "is_top": true
+ }
+ ],
+ "who Ingenieurgesellschaft mbH": [
+ {
+ "domain": "who-ing.de",
+ "is_top": false
+ }
+ ],
+ "\u00c9cole polytechnique f\u00e9d\u00e9rale de Lausanne": [
+ {
+ "domain": "epfl.ch",
+ "is_top": true
+ }
+ ],
+ "Peking University": [
+ {
+ "domain": "pku.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Beijing Institute of Technology": [
+ {
+ "domain": "bit.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Beijing Jiaotong University": [
+ {
+ "domain": "bjtu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Wuhan University": [
+ {
+ "domain": "whu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Beijing University of Posts and Telecommunications": [
+ {
+ "domain": "bupt.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Tsinghua University": [
+ {
+ "domain": "mail.tsinghua.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Shanghai Jiao Tong University": [
+ {
+ "domain": "sjtu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "Boston University": [
+ {
+ "domain": "bu.edu",
+ "is_top": true
+ }
+ ],
+ "Xi'an Jiaotong University": [
+ {
+ "domain": "tiaozhan.com",
+ "is_top": true
+ }
+ ],
+ "Cambrian": [
+ {
+ "domain": "cambricon.com",
+ "is_top": true
+ }
+ ],
+ "Legato Health Technologies": [
+ {
+ "domain": "legatohealth.com",
+ "is_top": true
+ }
+ ],
+ "PolyMage Labs": [
+ {
+ "domain": "polymagelabs.com",
+ "is_top": true
+ }
+ ],
+ "Netaji Subhash Engineering College": [
+ {
+ "domain": "nsec.ac.in",
+ "is_top": true
+ }
+ ],
+ "sparkfun": [
+ {
+ "domain": "sparkfun.com",
+ "is_top": true
+ }
+ ],
+ "Himax Technologies": [
+ {
+ "domain": "himax.com.tw",
+ "is_top": true
+ }
+ ],
+ "bytedance": [
+ {
+ "domain": "bytedance.com",
+ "is_top": true
+ },
+ {
+ "domain": "BYTEDANCE.COM",
+ "is_top": true
+ }
+ ],
+ "MAXAR": [
+ {
+ "domain": "maxar.com",
+ "is_top": true
+ }
+ ],
+ "infineon": [
+ {
+ "domain": "infineon.com",
+ "is_top": true
+ }
+ ],
+ "Cal Poly": [
+ {
+ "domain": "calpoly.edu",
+ "is_top": true
+ }
+ ],
+ "espressif": [
+ {
+ "domain": "espressif.com",
+ "is_top": true
+ }
+ ],
+ "Illinois": [
+ {
+ "domain": "illinois.edu",
+ "is_top": true
+ }
+ ],
+ "Noble.AI": [
+ {
+ "domain": "noble.ai",
+ "is_top": true
+ }
+ ],
+ "XMOS": [
+ {
+ "domain": "xmos.com",
+ "is_top": true
+ }
+ ],
+ "Edge Impulse": [
+ {
+ "domain": "edgeimpulse.com",
+ "is_top": true
+ }
+ ],
+ "SensiML": [
+ {
+ "domain": "sensiml.com",
+ "is_top": true
+ }
+ ],
+ "Ravelin": [
+ {
+ "domain": "ravelin.com",
+ "is_top": true
+ }
+ ],
+ "Brainscode": [
+ {
+ "domain": "brainscode.com",
+ "is_top": true
+ }
+ ],
+ "University of Victoria": [
+ {
+ "domain": "uvic.ca",
+ "is_top": true
+ }
+ ],
+ "Eyedea Recognition": [
+ {
+ "domain": "eyedea.cz",
+ "is_top": true
+ }
+ ],
+ "University of Southampton": [
+ {
+ "domain": "soton.ac.uk",
+ "is_top": true
+ }
+ ],
+ "Stylight": [
+ {
+ "domain": "stylight.com",
+ "is_top": true
+ }
+ ],
+ "Artec 3D": [
+ {
+ "domain": "artec-group.com",
+ "is_top": true
+ }
+ ],
+ "Criteo": [
+ {
+ "domain": "criteo.com",
+ "is_top": true
+ }
+ ],
+ "Fizyr": [
+ {
+ "domain": "fizyr.com",
+ "is_top": true
+ }
+ ],
+ "Hi Auto": [
+ {
+ "domain": "hi.auto",
+ "is_top": true
+ }
+ ],
+ "Insoundz": [
+ {
+ "domain": "insoundz.com",
+ "is_top": true
+ }
+ ],
+ "Peritiae": [
+ {
+ "domain": "peritiae.it",
+ "is_top": true
+ }
+ ],
+ "University of Aveiro": [
+ {
+ "domain": "ua.pt",
+ "is_top": true
+ }
+ ],
+ "Universidad Complutense de Madrid": [
+ {
+ "domain": "ucm.es",
+ "is_top": true
+ }
+ ],
+ "Electrical and Electronics Engineering InstituteUniversity of the Philippines": [
+ {
+ "domain": "eee.upd.edu.ph",
+ "is_top": true
+ }
+ ],
+ "ESI: Accueil": [
+ {
+ "domain": "esi.dz",
+ "is_top": true
+ }
+ ],
+ "Georgia Tech": [
+ {
+ "domain": "gatech.edu",
+ "is_top": true
+ }
+ ],
+ "Lambda": [
+ {
+ "domain": "lambdal.com",
+ "is_top": true
+ }
+ ],
+ "Recogni": [
+ {
+ "domain": "recogni.com",
+ "is_top": true
+ }
+ ],
+ "Reveal Technology": [
+ {
+ "domain": "revealtech.ai",
+ "is_top": true
+ }
+ ],
+ "TCL": [
+ {
+ "domain": "tcl.com",
+ "is_top": true
+ }
+ ],
+ "Western University": [
+ {
+ "domain": "uwo.ca",
+ "is_top": true
+ }
+ ],
+ "Berkeley University Of California": [
+ {
+ "domain": "berkeley.edu",
+ "is_top": true
+ }
+ ],
+ "Butterfly Network": [
+ {
+ "domain": "butterflynetinc.com",
+ "is_top": true
+ }
+ ],
+ "Departamento de Ciência da Computação da UFMG": [
+ {
+ "domain": "dcc.ufmg.br",
+ "is_top": true
+ }
+ ],
+ "Dropbox": [
+ {
+ "domain": "dropbox.com",
+ "is_top": true
+ }
+ ],
+ "Illuminate": [
+ {
+ "domain": "goilluminate.com",
+ "is_top": true
+ }
+ ],
+ "Hello": [
+ {
+ "domain": "hello.com",
+ "is_top": true
+ }
+ ],
+ "KaiHong": [
+ {
+ "domain": "kaihongdigi.com",
+ "is_top": true
+ },
+ {
+ "domain": "kaihong.com",
+ "is_top": true
+ }
+ ],
+ "HOPERUN": [
+ {
+ "domain": "hoperun.com",
+ "is_top": true
+ }
+ ],
+ "ISoftStone": [
+ {
+ "domain": "isoftstone.com",
+ "is_top": true
+ }
+ ],
+ "ThunderSoft": [
+ {
+ "domain": "thundersoft.com",
+ "is_top": true
+ }
+ ],
+ "ISCAS": [
+ {
+ "domain": "iscas.ac.cn",
+ "is_top": true
+ }
+ ],
+ "ICS&S": [
+ {
+ "domain": "chinasoftinc.com",
+ "is_top": true
+ },
+ {
+ "domain": "chinasofti.com",
+ "is_top": true
+ }
+ ],
+ "Midea": [
+ {
+ "domain": "midea.com",
+ "is_top": true
+ }
+ ],
+ "Neusoft": [
+ {
+ "domain": "neusoft.com",
+ "is_top": true
+ }
+ ],
+ "KOTEI": [
+ {
+ "domain": "kotei-info.com",
+ "is_top": true
+ }
+ ],
+ "Talkweb": [
+ {
+ "domain": "talkweb.com.cn",
+ "is_top": true
+ }
+ ],
+ "Bestechnic": [
+ {
+ "domain": "bestechnic.com",
+ "is_top": true
+ }
+ ],
+ "HOLD": [
+ {
+ "domain": "holdiot.com",
+ "is_top": true
+ }
+ ],
+ "Southeast University": [
+ {
+ "domain": "seu.edu.cn",
+ "is_top": true
+ }
+ ],
+ "UNIONMAN": [
+ {
+ "domain": "unionman.com.cn",
+ "is_top": true
+ }
+ ],
+ "Telink": [
+ {
+ "domain": "telink-semi.com",
+ "is_top": true
+ }
+ ],
+ "NUCLEI": [
+ {
+ "domain": "nucleisys.com",
+ "is_top": true
+ }
+ ],
+ "CHIPSEA": [
+ {
+ "domain": "chipsea.com",
+ "is_top": true
+ }
+ ],
+ "SUPER RED": [
+ {
+ "domain": "superred.com.cn",
+ "is_top": true
+ }
+ ],
+ "ARCHERMIND": [
+ {
+ "domain": "archermind.com",
+ "is_top": true
+ }
+ ],
+ "Kika Tech": [
+ {
+ "domain": "archermind.com",
+ "is_top": true
+ }
+ ],
+ "UBTECH": [
+ {
+ "domain": "ub-tech.cn",
+ "is_top": true
+ }
+ ],
+ "Antiy": [
+ {
+ "domain": "antiy.cn",
+ "is_top": true
+ }
+ ],
+ "GOODIX": [
+ {
+ "domain": "goodix.com",
+ "is_top": true
+ }
+ ],
+ "ASR": [
+ {
+ "domain": "asrmicro.com",
+ "is_top": true
+ }
+ ],
+ "BILLJC": [
+ {
+ "domain": "billjc.com",
+ "is_top": true
+ }
+ ],
+ "Digital China": [
+ {
+ "domain": "digitalchina.com",
+ "is_top": true
+ }
+ ],
+ "H-Lab Informatikai Kft.": [
+ {
+ "domain": "h-lab.eu",
+ "is_top": true
+ }
+ ],
+ "Glandium": [
+ {
+ "domain": "glandium.org",
+ "is_top": true
+ }
+ ],
+ "Bananium": [
+ {
+ "domain": "bananium.fr",
+ "is_top": true
+ }
+ ],
+ "Karunya": [
+ {
+ "domain": "karunya.edu.in",
+ "is_top": true
+ }
+ ],
+ "NC State University": [
+ {
+ "domain": "ncsu.edu",
+ "is_top": true
+ }
+ ]
+ },
+ "time": "2019-09-09 07:00:00",
+ "uidentities": {}
+}
\ No newline at end of file
diff --git a/project-gitee.json b/project-gitee.json
new file mode 100644
index 0000000..7f05871
--- /dev/null
+++ b/project-gitee.json
@@ -0,0 +1,55 @@
+{
+ "gitee": {
+ "gitee-software-artifact": [
+ "https://gitee.com/paradigm4/OpenMLDB",
+ "https://gitee.com/mindspore/mindspore",
+ "https://gitee.com/opengauss/openGauss-server",
+ "https://gitee.com/mindspore/mindinsight",
+ "https://gitee.com/mindspore/mindscience",
+ "https://gitee.com/mymagicpower/AIAS",
+ "https://gitee.com/fastnlp/fastNLP",
+ "https://gitee.com/secretflow/secretflow",
+ "https://gitee.com/apitable/APITable",
+ "https://gitee.com/dromara/go-view",
+ "https://gitee.com/Armink/FlashDB",
+ "https://gitee.com/mqttsnet/thinglinks",
+ "https://gitee.com/IoTSharp/IoTSharp",
+ "https://gitee.com/Runner-Go-Team/RunnerGo",
+ "https://gitee.com/zzdevelop/lenosp",
+ "https://gitee.com/opengoofy/hippo4j",
+ "https://gitee.com/secretflow/secretflow",
+ "https://gitee.com/seagull1985/LuckyFrameClient",
+ "https://gitee.com/acl-dev/acl",
+ "https://gitee.com/actframework/actframework",
+ "https://gitee.com/actionview/av",
+ "https://gitee.com/agile-bpm/agile-bpm-basic",
+ "https://gitee.com/mymagicpower/AIAS",
+ "https://gitee.com/AirtestProject/Airtest",
+ "https://gitee.com/anji-plus/captcha",
+ "https://gitee.com/anji-plus/report",
+ "https://gitee.com/baidu/amis",
+ "https://gitee.com/ant-design/ant-design",
+ "https://gitee.com/ant-design-blazor/ant-design-blazor",
+ "https://gitee.com/ant-design/ant-design-pro",
+ "https://gitee.com/ant-design-vue/ant-design-vue",
+ "https://gitee.com/iresty/apisix",
+ "https://gitee.com/Sharding-Sphere/sharding-sphere",
+ "https://gitee.com/apiadmin/ApiAdmin",
+ "https://gitee.com/Tencent/APIJSON",
+ "https://gitee.com/apioak/apioak",
+ "https://gitee.com/apitable/APITable",
+ "https://gitee.com/ApolloAuto/apollo",
+ "https://gitee.com/apolloconfig/apollo",
+ "https://gitee.com/rtttte/Archery",
+ "https://gitee.com/arthas/arthas",
+ "https://gitee.com/jd-platform-opensource/asyncTool",
+ "https://gitee.com/goatom/atomci",
+ "https://gitee.com/qiujiayu/AutoLoadCache",
+ "https://gitee.com/smallweigit/avue",
+ "https://gitee.com/zlgopen/awtk",
+ "https://gitee.com/notrynohigh/BabyOS"
+ ],
+ "gitee-governance": [
+ ]
+ }
+}
\ No newline at end of file
diff --git a/project-gitee.yaml b/project-gitee.yaml
new file mode 100644
index 0000000..ec1f369
--- /dev/null
+++ b/project-gitee.yaml
@@ -0,0 +1,27 @@
+url:
+ "http://localhost:9200"
+
+params:
+ {
+ 'git_index': 'git_chaoss_enriched',
+ 'git_aoc_index': 'git-aoc_chaoss_enriched',
+ 'git_onion_index':'git-onion_enriched',
+ 'cocom_index':'cocom_chaoss_enrich',
+ 'colic_index':'colic_chaoss_enrich',
+ 'issue_index': 'gitee_issues_chaoss_enriched',
+ 'pr_index':'gitee_pulls_chaoss_enriched',
+ 'repo_index':'gitee_repo_enriched',
+ 'issue_comments_index':'gitee2-issues_enriched',
+ 'pr_comments_index':'gitee2-pull_enriched',
+ 'json_file': '/home/ruoxuan/metrics-model/project-gitee.json',
+ 'git_branch': None,
+ 'from_date': '2023-05-01',
+ 'end_date': '2023-06-30',
+ 'out_index': 'health_metric_model',
+ 'risk_index': 'risk_model',
+ 'community': 'gitee',
+ 'level': 'repo',
+ 'company': 'gitee',
+ 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml',
+ 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json'
+ }
\ No newline at end of file
diff --git a/project-github copy.json b/project-github copy.json
new file mode 100644
index 0000000..0b69862
--- /dev/null
+++ b/project-github copy.json
@@ -0,0 +1,58 @@
+{
+ "github": {
+ "github-software-artifact": [
+ "https://github.com/ayamir/nvimdots",
+ "https://github.com/oceanbase/oceanbase",
+ "https://github.com/PaddlePaddle/Paddle",
+ "https://github.com/microsoft/CNTK",
+ "https://github.com/keras-team/keras",
+ "https://github.com/apache/mxnet",
+ "https://github.com/onnx/onnx",
+ "https://github.com/redis/redis",
+ "https://github.com/tikv/tikv",
+ "https://github.com/google/leveldb",
+ "https://github.com/hivedb/hive",
+ "https://github.com/apache/spark",
+ "https://github.com/apache/flink",
+ "https://github.com/apache/hive",
+ "https://github.com/apache/hadoop",
+ "https://github.com/apache/kafka",
+ "https://github.com/spring-projects/spring-batch",
+ "https://github.com/lf-edge/ekuiper",
+ "https://github.com/apache/pulsar",
+ "https://github.com/apache/hudi",
+ "https://github.com/apache/iceberg",
+ "https://github.com/Delta-ML/delta",
+ "https://github.com/delta-io/delta",
+ "https://github.com/apache/storm",
+ "https://github.com/confluentinc/ksql",
+ "https://github.com/lencx/ChatGPT",
+ "https://github.com/PlexPt/awesome-chatgpt-prompts-zh",
+ "https://github.com/acheong08/ChatGPT",
+ "https://github.com/transitive-bullshit/chatgpt-api",
+ "https://github.com/nltk/nltk",
+ "https://github.com/explosion/spaCy",
+ "https://github.com/stanfordnlp/CoreNLP",
+ "https://github.com/apache/opennlp",
+ "https://github.com/RaRe-Technologies/gensim",
+ "https://github.com/huggingface/transformers",
+ "https://github.com/allenai/allennlp",
+ "https://github.com/PetrochukM/PyTorch-NLP",
+ "https://github.com/facebookresearch/fastText",
+ "https://github.com/hankcs/HanLP",
+ "https://github.com/fxsjy/jieba",
+ "https://github.com/facebookresearch/pytext",
+ "https://github.com/nexB/scancode-toolkit",
+ "https://github.com/DependencyTrack/dependency-track",
+ "https://github.com/XmirrorSecurity/OpenSCA-cli",
+ "https://github.com/murphysecurity/murphysec",
+ "https://github.com/mergebase/log4j-detector",
+ "https://github.com/AppThreat/dep-scan",
+ "https://github.com/stevespringett/nist-data-mirror",
+ "https://github.com/pytorch/pytorch",
+ "https://github.com/tensorflow/tensorflow"
+ ],
+ "github-governance": [
+ ]
+ }
+}
\ No newline at end of file
diff --git a/project-github.json b/project-github.json
new file mode 100644
index 0000000..0b69862
--- /dev/null
+++ b/project-github.json
@@ -0,0 +1,58 @@
+{
+ "github": {
+ "github-software-artifact": [
+ "https://github.com/ayamir/nvimdots",
+ "https://github.com/oceanbase/oceanbase",
+ "https://github.com/PaddlePaddle/Paddle",
+ "https://github.com/microsoft/CNTK",
+ "https://github.com/keras-team/keras",
+ "https://github.com/apache/mxnet",
+ "https://github.com/onnx/onnx",
+ "https://github.com/redis/redis",
+ "https://github.com/tikv/tikv",
+ "https://github.com/google/leveldb",
+ "https://github.com/hivedb/hive",
+ "https://github.com/apache/spark",
+ "https://github.com/apache/flink",
+ "https://github.com/apache/hive",
+ "https://github.com/apache/hadoop",
+ "https://github.com/apache/kafka",
+ "https://github.com/spring-projects/spring-batch",
+ "https://github.com/lf-edge/ekuiper",
+ "https://github.com/apache/pulsar",
+ "https://github.com/apache/hudi",
+ "https://github.com/apache/iceberg",
+ "https://github.com/Delta-ML/delta",
+ "https://github.com/delta-io/delta",
+ "https://github.com/apache/storm",
+ "https://github.com/confluentinc/ksql",
+ "https://github.com/lencx/ChatGPT",
+ "https://github.com/PlexPt/awesome-chatgpt-prompts-zh",
+ "https://github.com/acheong08/ChatGPT",
+ "https://github.com/transitive-bullshit/chatgpt-api",
+ "https://github.com/nltk/nltk",
+ "https://github.com/explosion/spaCy",
+ "https://github.com/stanfordnlp/CoreNLP",
+ "https://github.com/apache/opennlp",
+ "https://github.com/RaRe-Technologies/gensim",
+ "https://github.com/huggingface/transformers",
+ "https://github.com/allenai/allennlp",
+ "https://github.com/PetrochukM/PyTorch-NLP",
+ "https://github.com/facebookresearch/fastText",
+ "https://github.com/hankcs/HanLP",
+ "https://github.com/fxsjy/jieba",
+ "https://github.com/facebookresearch/pytext",
+ "https://github.com/nexB/scancode-toolkit",
+ "https://github.com/DependencyTrack/dependency-track",
+ "https://github.com/XmirrorSecurity/OpenSCA-cli",
+ "https://github.com/murphysecurity/murphysec",
+ "https://github.com/mergebase/log4j-detector",
+ "https://github.com/AppThreat/dep-scan",
+ "https://github.com/stevespringett/nist-data-mirror",
+ "https://github.com/pytorch/pytorch",
+ "https://github.com/tensorflow/tensorflow"
+ ],
+ "github-governance": [
+ ]
+ }
+}
\ No newline at end of file
diff --git a/project-github.yaml b/project-github.yaml
new file mode 100644
index 0000000..1b33663
--- /dev/null
+++ b/project-github.yaml
@@ -0,0 +1,27 @@
+url:
+ "http://localhost:9200"
+
+params:
+ {
+ 'git_index': 'git_chaoss_enriched',
+ 'git_aoc_index': 'git-aoc_chaoss_enriched',
+ 'git_onion_index':'git-onion_enriched',
+ 'cocom_index':'cocom_chaoss_enrich',
+ 'colic_index':'colic_chaoss_enrich',
+ 'issue_index': 'github_issues_chaoss_enriched',
+ 'pr_index':'github_pulls_chaoss_enriched',
+ 'repo_index':'github_repo_enriched',
+ 'issue_comments_index':'github2-issues_enriched',
+ 'pr_comments_index':'github2-pull_enriched',
+ 'json_file': '/home/ruoxuan/metrics-model/project-github.json',
+ 'git_branch': None,
+ 'from_date': '2023-05-01',
+ 'end_date': '2023-06-30',
+ 'out_index': 'health_metric_model',
+ 'risk_index': 'risk_model',
+ 'community': 'github',
+ 'level': 'repo',
+ 'company': 'github',
+ 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml',
+ 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json'
+ }
\ No newline at end of file
diff --git a/run.py b/run.py
new file mode 100644
index 0000000..6005265
--- /dev/null
+++ b/run.py
@@ -0,0 +1,103 @@
+from metrics_model.codeDevActivityModel import CodeDevActivityModel
+from metrics_model.codeDevQualityModel import CodeDevQualityModel
+from metrics_model.codeSecurityModel import CodeSecurityModel
+from metrics_model.communityActivityModel import CommunityActivityModel
+from metrics_model.humanDiversityModel import HumanDiversityModel
+from metrics_model.techDiversityModel import TechDiversityModel
+from metrics_model.summaryModel import SummaryModel
+from metrics_model.statModel import (
+ CodeDevActivityStatistic,
+ CodeDevQualityStatistic,
+ CodeSecurityStatistic,
+ CommunityActivityStatistic,
+ HumanDiversityStatistic,
+ TechDiversityStatistic
+)
+
+import yaml
+
+def process(cofig_url, elastic_url, params):
+ # 代码开发活动
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_CodeDevActivity = CodeDevActivityModel(**kwargs)
+ model_CodeDevActivity.metrics_model_metrics(elastic_url)
+
+ # 代码开发效率
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_CodeDevQuality = CodeDevQualityModel(**kwargs)
+ model_CodeDevQuality.metrics_model_metrics(elastic_url)
+
+ # 代码安全保障
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'cocom_index', 'colic_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_CodeSecurity = CodeSecurityModel(**kwargs)
+ model_CodeSecurity.metrics_model_metrics(elastic_url)
+
+ # 社区活跃度
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'issue_comments_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_communityActivity = CommunityActivityModel(**kwargs)
+ model_communityActivity.metrics_model_metrics(elastic_url)
+
+ # 人员多样性
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'issue_comments_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_humanDiversity = HumanDiversityModel(**kwargs)
+ model_humanDiversity.metrics_model_metrics(elastic_url)
+
+ # 技术多样性
+ kwargs = {}
+ for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'git_aoc_index', 'colic_index','json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_techDiversity = TechDiversityModel(**kwargs)
+ model_techDiversity.metrics_model_metrics(elastic_url)
+
+ # 总结
+ kwargs = {}
+ for item in ['issue_index', 'git_index', 'json_file', 'out_index', 'risk_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']:
+ kwargs[item] = params[item]
+ model_summary = SummaryModel(**kwargs)
+ model_summary.metrics_model_metrics(elastic_url)
+
+if __name__ == '__main__':
+ cofig_urls = ["/home/ruoxuan/metrics-model/community-gitee-openeuler.yaml", "/home/ruoxuan/metrics-model/community-gitee-openharmony.yaml", "/home/ruoxuan/metrics-model/project-gitee.yaml", "/home/ruoxuan/metrics-model/project-github.yaml"]
+ # cofig_urls = ["/home/ruoxuan/metrics-model/project-github.yaml"]
+
+ for cofig_url in cofig_urls:
+ CONF = yaml.safe_load(open(cofig_url))
+ # print(CONF)
+ elastic_url = CONF['url']
+ params = CONF['params']
+ process(cofig_url, elastic_url, params)
+
+
+ # 代码开发活动
+ stat_CodeDevActivity = CodeDevActivityStatistic(params['out_index'], 'Code develop activity', params['from_date'], params['end_date'], params['out_index'])
+ stat_CodeDevActivity.metrics_model_statistic(elastic_url)
+
+ # 代码开发效率
+ stat_CodeDevQuality = CodeDevQualityStatistic(params['out_index'], 'Code develop Quality', params['from_date'], params['end_date'], params['out_index'])
+ stat_CodeDevQuality.metrics_model_statistic(elastic_url)
+
+ # 代码开发质量
+ stat_CodeSecurity = CodeSecurityStatistic(params['out_index'], 'Code security', params['from_date'], params['end_date'], params['out_index'])
+ stat_CodeSecurity.metrics_model_statistic(elastic_url)
+
+ # 社区活跃度
+ stat_CommunityActivity = CommunityActivityStatistic(params['out_index'], 'community activity', params['from_date'], params['end_date'], params['out_index'])
+ stat_CommunityActivity.metrics_model_statistic(elastic_url)
+
+ # 人员多样性
+ stat_HumanDiversity = HumanDiversityStatistic(params['out_index'], 'human Diversity', params['from_date'], params['end_date'], params['out_index'])
+ stat_HumanDiversity.metrics_model_statistic(elastic_url)
+
+ # 技术多样性
+ stat_TechDiversity = TechDiversityStatistic(params['out_index'], 'technology Diversity', params['from_date'], params['end_date'], params['out_index'])
+ stat_TechDiversity.metrics_model_statistic(elastic_url)
\ No newline at end of file