diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2de89b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/db diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ffc0b40 --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +SHD (rql-backend/shd31) +======================= +Copyright (c) 2007 Takeaki Uno. +See rql-backend/shd31/readme.txt for details. + +RQL-API, RQL-Core, RQL-Server, and RQL-UI +========================================= +Copyright (c) 2011-2024 [LIMOS/ISIMA, LIRIS/INSA Lyon, LIAS/ISAE-ENSMA] + +These portions of the software are licensed under the terms of the MIT License. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3afd637 --- /dev/null +++ b/README.md @@ -0,0 +1,142 @@ +# RQL project + +RQL (Rule Query Language) is a framework that allows the user to mine dependencies such as association rules, functional dependencies, order dependencies, etc. + +This project includes a Web interface to write SQL or RQL queries on top of a local DBMS, and browse generated rules. + +You can read more about RQL using the following resources: + +- [RQL: A Query Language for Rule Discovery in Databases](https://hal.science/hal-01395083/), a TCS paper, 2017. +- [RQL: An SQL-like Query Language for Discovering Meaningful Rules](https://hal.science/hal-01301091/), an ICDM demo, 2014. +- [Query Rewriting for Rule Mining in Databases](https://hal.science/hal-01339257/), an LML workshop paper, 2013. +- [Armstrong-compliant Logical Query Languages](https://hal.science/hal-00649604/), an LID workshop paper, 2011. + + +## Software requirements + +* [Docker](https://www.docker.com/) (that's all) + +RQL building and deployment have been tested on: + +* macOS Sonoma (with Docker Desktop), +* Ubuntu 20.04.6 LTS +* Debian 12.5 + +In fact, any operating system that supports [Docker](https://www.docker.com/) should be able to build RQL. + +## Build + +```console +$ docker compose build +``` + +## Run + +* Create all containers + +```console +$ docker compose up -d +``` + +* Initialize the database + +```console +$ docker exec -i rql_db psql -U postgres < db_init.sql +``` + +* Open the http://localhost/rql URL with your favorite web browser. +To log in, the default account has credentials admin/adminadmin. + +## Example + +The following example is based on a sample employee table. It can be created from the RQL main query form, which supports both SQL and RQL queries. + +~~~SQL +CREATE TABLE emp ( + empno INT, + lastname VARCHAR(20), + workdept VARCHAR(3), + job VARCHAR(20), + educlevel INT, + gender CHAR, + sal INT, + bonus INT, + comm INT, + mgrno INT +); +INSERT INTO EMP VALUES (10, 'SPEN', 'C01', 'FINANCE', 18, 'F', 52750, 500, 4220, 20); +INSERT INTO EMP VALUES (20, 'THOMP', NULL, 'MANAGER', 18, 'M', 41250, 800, 3300, NULL); +INSERT INTO EMP VALUES (30, 'KWAN', NULL, 'FINANCE', 20, 'F', 38250, 500, 3060, 10); +INSERT INTO EMP VALUES (50, 'GEYER', NULL, 'MANAGER', 16, 'M', 40175, 700, 3214, 20); +INSERT INTO EMP VALUES (60, 'STERN', 'D21', 'SALE', 14, 'M', 32250, 500, 2580, 30); +INSERT INTO EMP VALUES (70, 'PULASKI', 'D21', 'SALE', 16, 'F', 36170, 700, 2893, 100); +INSERT INTO EMP VALUES (90, 'HENDER', 'D21', 'SALE', 17, 'F', 29750, 500, 2380, 10); +INSERT INTO EMP VALUES (100, 'SPEN', 'C01', 'FINANCE', 18, 'M', 26150, 800, 2092, 20); +~~~ + +RQL can then be used to identify dependencies within the data. For instance, the following query identifies functional dependencies. + +~~~RQL +FINDRULES +OVER empno, lastname, workdept, job, educlevel, gender, sal, bonus, comm, mgrno +SCOPE t1, t2 emp +CONDITION ON A IS t1.A = t2.A +~~~ + +![The RQL Web interface](images/rql_web.png) + +## User accounts + +New user accounts must be added manually. + +```console +$ docker exec -i rql_db psql -U postgres -d rql +``` + +~~~SQL +INSERT INTO users (username, firstname, lastname, hashpassword, isadmin) +VALUES +('jdoe', 'Jane', 'Doe', '', FALSE); +~~~ + +RQL uses the original version of bcrypt hashing with 12 rounds. +Therefore, hashed passwords should be of the form: `$2a$12$...`. + +An example of such password is provided at the end of the `db_init.sql` file. + +## Acknowledgments + +RQL has been partially funded by: + +- LIRIS, INSA Lyon and the French National Research Agency (ANR), as part of the DAG project +- CNRS, as part of the Mastodons PetaSky, QualiSky and QDoSSI projects +- LIAS, ISAE-ENSMA and the MIRES research federation + +### Historic contributors + +* Mickael Baron, LIAS, ISAE-ENSMA +* Nicolas Buisson, LIRIS, INSA Lyon +* Brice Chardin, LIAS, ISAE-ENSMA +* Emmanuel Coquery, LIRIS, Université Claude Bernard Lyon 1 +* Benjamin Gouriou, LIMOS, ISIMA +* Marie Pailloux, LIMOS, ISIMA +* Jean-Marc Petit, LIRIS, INSA Lyon +* Bilal Rezkellah, LIAS, ISAE-ENSMA + +## Citation + +If you use RQL in a scientific publication, please reference the following work: + +Chardin, B., Coquery, E., Pailloux, M., & Petit, J.-M. (2017). RQL: A Query Language for Rule Discovery in Databases. Theoretical Computer Science, 658, 357-374. + +~~~bibtex +@article{rql2017, + title={RQL: A Query Language for Rule Discovery in Databases}, + author={Chardin, Brice and Coquery, Emmanuel and Pailloux, Marie and Petit, Jean-Marc}, + journal={Theoretical Computer Science}, + volume={658}, + pages={357--374}, + year={2017}, + publisher={Elsevier}, +} +~~~ diff --git a/db_init.sql b/db_init.sql new file mode 100644 index 0000000..0cda41c --- /dev/null +++ b/db_init.sql @@ -0,0 +1,74 @@ +CREATE DATABASE rql; +\c rql; +CREATE TABLE users +( + userid serial NOT NULL, + username character varying, + firstname character varying, + hashpassword character varying, + lastname character varying, + isadmin boolean, + CONSTRAINT user_pkey PRIMARY KEY (userid), + CONSTRAINT user_username_key UNIQUE (username) +); +CREATE TABLE project +( + projectid serial NOT NULL, + projectname character varying, + creationdate character varying, + userid character varying, + description character varying, + CONSTRAINT project_pkey PRIMARY KEY (projectid), + CONSTRAINT project_userid_fkey FOREIGN KEY (userid) + REFERENCES public.users (username) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION +); +CREATE TABLE database +( + "databaseID" serial NOT NULL, + host character varying, + port integer, + name character varying, + userid character varying, + password character varying, + type character varying, + projectid bigint, + CONSTRAINT database_pkey PRIMARY KEY ("databaseID"), + CONSTRAINT pro FOREIGN KEY (projectid) + REFERENCES public.project (projectid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION +); +CREATE TABLE collaborator +( + collaboratorid serial NOT NULL, + projectid bigint, + userid character varying, + CONSTRAINT collaborator_pkey PRIMARY KEY (collaboratorid), + CONSTRAINT collaborator_projectid_fkey FOREIGN KEY (projectid) + REFERENCES public.project (projectid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT collaborator_userid_fkey FOREIGN KEY (userid) + REFERENCES public.users (username) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION +); +CREATE TABLE favorite +( + favoriteid serial NOT NULL, + description character varying, + query character varying, + creationdate character varying, + projectid bigint, + favoritename character varying, + type character varying, + CONSTRAINT favorite_pkey PRIMARY KEY (favoriteid), + CONSTRAINT favorite_projectid_fkey FOREIGN KEY (projectid) + REFERENCES public.project (projectid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT favorite_favoritename_key UNIQUE (favoritename) +); + +INSERT INTO users( + username, firstname, hashpassword, lastname, isadmin) + VALUES ('admin', 'admin', '$2a$12$Cq1GoUaBySCjWBHJJALYNOetItTezPXr1B9JdsLa8xqH5ARVVFplm', 'admin', TRUE); +-- login: admin +-- password: adminadmin diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..3446bbd --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,58 @@ +services: + + backend: + container_name: rql_backend + build: rql-backend/ + image: rql:backend-1.1.0-SNAPSHOT + depends_on: + - db + networks: + - rqlnetwork + + db: + container_name: rql_db + image: postgres:9.6 + volumes: + - ./db/rql:/var/lib/postgresql/data + networks: + - rqlnetwork + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + + business_db: + container_name: rql_business_db + image: postgres:9.6 + volumes: + - ./db/business:/var/lib/postgresql/data + networks: + - rqlnetwork + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + + frontend: + container_name: rql_frontend + build: rql-ui/ + image: rql:frontend-1.1.0-SNAPSHOT + depends_on: + - backend + networks: + - rqlnetwork + + web: + container_name: rql_proxy + image: nginx:1.25.4 + depends_on: + - frontend + - backend + volumes: + - ./nginx-conf:/etc/nginx/conf.d + ports: + - "80:80" + networks: + - rqlnetwork + +networks: + rqlnetwork: + name: rqlnetwork diff --git a/images/rql_web.png b/images/rql_web.png new file mode 100644 index 0000000..0308f01 Binary files /dev/null and b/images/rql_web.png differ diff --git a/nginx-conf/nginx.conf b/nginx-conf/nginx.conf new file mode 100644 index 0000000..76e60a7 --- /dev/null +++ b/nginx-conf/nginx.conf @@ -0,0 +1,25 @@ +server { + listen 80; + + location /rql/server/ { + proxy_pass http://backend:9992/; + proxy_connect_timeout 3000; + proxy_send_timeout 3000; + proxy_read_timeout 3000; + send_timeout 3000; + } + + location /rql/ { + rewrite ^/rql(/.*)$ $1 break; + proxy_pass http://frontend; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_connect_timeout 3000; + proxy_send_timeout 3000; + proxy_read_timeout 3000; + send_timeout 3000; + } +} diff --git a/rql-backend/.gitignore b/rql-backend/.gitignore new file mode 100644 index 0000000..d229fa7 --- /dev/null +++ b/rql-backend/.gitignore @@ -0,0 +1,4 @@ +**/target/ +**/.classpath +**/.project +**/.settings diff --git a/rql-backend/Dockerfile b/rql-backend/Dockerfile new file mode 100644 index 0000000..9e944a8 --- /dev/null +++ b/rql-backend/Dockerfile @@ -0,0 +1,24 @@ +FROM maven:3.8.6-openjdk-8-slim AS build-java-stage + +ADD pom.xml /work/pom.xml +ADD rql-api /work/rql-api/ +ADD rql-core /work/rql-core/ +ADD rql-server /work/rql-server/ +WORKDIR /work + +RUN ["mvn", "package","-Dmaven.test.skip=true"] + +FROM adoptopenjdk/openjdk8:debian-slim + +RUN apt-get update && apt-get install make && apt-get install gcc -y +ADD ["shd31", "/shd31"] +RUN cd /shd31 && make + +COPY --from=build-java-stage /work/rql-server/target/classes /work/target/classes +COPY --from=build-java-stage /work/rql-server/target/dependency/*.jar /work/target/dependency/ + +WORKDIR /work +EXPOSE 9992 +ENTRYPOINT ["java", "-cp", "target/classes:target/dependency/*", "fr.ensma.lias.rql.RqlLauncher"] + +LABEL maintainer="Mickael BARON and Bilal REZKELLAH" diff --git a/rql-backend/pom.xml b/rql-backend/pom.xml new file mode 100644 index 0000000..7b83323 --- /dev/null +++ b/rql-backend/pom.xml @@ -0,0 +1,151 @@ + + 4.0.0 + fr.ensma.lias + rql-backend + 1.1.0-SNAPSHOT + pom + REST API module of RQL platform + + rql-core + rql-api + rql-server + + + + 3.4.3 + + + 1.0.8 + + + 2.25.1 + + + 1.1.1 + + + 0.4 + + + 3.1 + 8 + 8 + + + 1.7.25 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + ${maven.compiler.source} + ${maven.compiler.target} + ${project.build.sourceEncoding} + + + + + + + + + + + com.google.code.gson + gson + 2.2.2 + compile + + + + org.aeonbits.owner + owner + ${owner.version} + + + + + javax.ws.rs + jsr311-api + ${jsr311.version} + compile + + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + ${jersey.version} + + + + org.glassfish.jersey.containers + jersey-container-grizzly2-http + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-multipart + ${jersey.version} + + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + + org.glassfish.jersey.ext.cdi + jersey-weld2-se + ${jersey.version} + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-csv + 2.8.4 + + + + org.apache.poi + poi-ooxml + 3.17 + + + + org.slf4j + slf4j-api + ${sl4j.version} + + + org.slf4j + slf4j-log4j12 + ${sl4j.version} + + + + org.mongodb + mongodb-driver + ${mongodb.version} + + + org.mindrot + jbcrypt + ${jbcrypt.version} + + + fr.ensma.lias + rql-core + ${project.version} + + + + \ No newline at end of file diff --git a/rql-backend/rql-api/pom.xml b/rql-backend/rql-api/pom.xml new file mode 100644 index 0000000..06aa4ec --- /dev/null +++ b/rql-backend/rql-api/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + rql-api + + fr.ensma.lias + rql-backend + 1.1.0-SNAPSHOT + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-csv + + + javax.ws.rs + jsr311-api + + + org.glassfish.jersey.media + jersey-media-multipart + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + fr.ensma.lias + rql-core + + + com.google.code.gson + gson + + + \ No newline at end of file diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiConstant.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiConstant.java new file mode 100644 index 0000000..49ba60a --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiConstant.java @@ -0,0 +1,8 @@ +package fr.ensma.lias.rql.api; + +/** + * @author Bilal REZKELLAH + */ +public class ApiConstant { + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiParameters.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiParameters.java new file mode 100644 index 0000000..efc5ced --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiParameters.java @@ -0,0 +1,46 @@ +package fr.ensma.lias.rql.api; + +/** + * @author Bilal REZKELLAH + */ +public interface ApiParameters { + + static final String QUERY = "query"; + + static final String TABLE = "table"; + + static final String ID = "id"; + + static final String SUPPORT = "support"; + + static final String CONFIDENCE = "confidence"; + + static final String LEFT_ATTRIBUTES = "leftAttributes"; + + static final String RIGHT_ATTRIBUTES = "rightAttribute"; + + static final String QUERY_TYPE = "QueryType"; + + static final String SQL_QUERY = "sqlQuery"; + + static final String IS_ALL_DATA = "isALLData"; + + static final String IS_TABLE = "isTable"; + + static final String TABLE_NAME = "tableName"; + + static final String SUBSET_WHERE = "subsetWhere"; + + static final String ATTRIBUTES_LIST = "attributesList"; + + static final String IS_CONDITIONAL = "isConditional"; + + static final String CONDITIONAL_WHERE = "conditionalWhere"; + + static final String TOLERENCE = "tolerence"; + + static final String COLUMN_LIST = "columnList"; + + static final String SHEET_INDEX = "sheetIndex"; + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiPaths.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiPaths.java new file mode 100644 index 0000000..17a59fc --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ApiPaths.java @@ -0,0 +1,44 @@ +package fr.ensma.lias.rql.api; + +/** + * @author Bilal REZKELLAH + */ +public interface ApiPaths { + + static final String TABLE = "/table"; + + static final String QUERY = "/query"; + + static final String PROJECT = "/project"; + + static final String USER = "/user"; + + final String HEADER = "/header"; + + static final String TEST = "/test"; + + static final String QUERY_CONSTRUCTION = "/queryconstruction"; + + static final String TYPE = "/typequery"; + + static final String RULE = "/rule"; + + static final String RULECHECK = "/rulecheck"; + + static final String RESULTSET = "/resultset"; + + static final String DB_IMPORT = "/dbimport"; + + static final String TABLE_IMPORT = "/tableImport"; + + static final String AUTHENTICATION = "/authentication"; + + static final String LOGIN = "login"; + + static final String LOGOUT = "logout"; + + static final String UPLOAD_XLSX = "uploadXlsx"; + + static final String SCRIPT_DOWNLOAD = "/scriptdownload"; + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/AuthenticationResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/AuthenticationResource.java new file mode 100644 index 0000000..805bfc4 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/AuthenticationResource.java @@ -0,0 +1,32 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiPaths.AUTHENTICATION; +import static fr.ensma.lias.rql.api.ApiPaths.LOGIN; +import static fr.ensma.lias.rql.api.ApiPaths.LOGOUT; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import fr.ensma.lias.rql.dto.Credentials; + +/** + * @author Bilal REZKELLAH + */ +@Path(AUTHENTICATION) +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public interface AuthenticationResource { + + @Path(LOGIN) + @POST + Response login(Credentials credentials); + + @Path(LOGOUT) + @DELETE + Response logout(); +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/DataBaseImport.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/DataBaseImport.java new file mode 100644 index 0000000..8d07f18 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/DataBaseImport.java @@ -0,0 +1,56 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.COLUMN_LIST; +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import static fr.ensma.lias.rql.api.ApiParameters.TABLE_NAME; +import static fr.ensma.lias.rql.api.ApiParameters.SHEET_INDEX; +import static fr.ensma.lias.rql.api.ApiPaths.DB_IMPORT; +import static fr.ensma.lias.rql.api.ApiPaths.TABLE_IMPORT; +import static fr.ensma.lias.rql.api.ApiPaths.UPLOAD_XLSX; +import static fr.ensma.lias.rql.api.ApiPaths.SCRIPT_DOWNLOAD; +import java.io.InputStream; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; + +import fr.ensma.lias.rql.dto.FilePreview; +import fr.ensma.lias.rql.dto.TableImportResult; + +/** + * @author Bilal REZKELLAH + */ +@Path(DB_IMPORT) +@Produces(MediaType.APPLICATION_JSON) +public interface DataBaseImport { + + @TokenAuthenticated + @Path(UPLOAD_XLSX) + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + FilePreview uploadFile(@FormDataParam("file") InputStream filestream, + @FormDataParam("file") FormDataContentDisposition fileDetail); + + @TokenAuthenticated + @Path("{id}" + TABLE_IMPORT) + @GET + @Consumes(MediaType.APPLICATION_JSON) + TableImportResult tableImport(@PathParam(ID) String id, @QueryParam(SHEET_INDEX) Integer sheetIndex, + @QueryParam(TABLE_NAME) String tableName, @QueryParam("projectID") String projectID, + @QueryParam(COLUMN_LIST) String columnList); + + @TokenAuthenticated + @Path("{id}" + SCRIPT_DOWNLOAD) + @GET + @Consumes(MediaType.APPLICATION_JSON) + @Produces("text/plain") + Response scriptDownload(@PathParam(ID) String id); + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/NotYetImplementedException.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/NotYetImplementedException.java new file mode 100644 index 0000000..2d746e0 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/NotYetImplementedException.java @@ -0,0 +1,10 @@ +package fr.ensma.lias.rql.api; + +/** + * @author Bilal REZKELLAH + */ +public class NotYetImplementedException extends RuntimeException { + + private static final long serialVersionUID = -1762035426001482646L; + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ProjectResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ProjectResource.java new file mode 100644 index 0000000..d337ddf --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/ProjectResource.java @@ -0,0 +1,73 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import static fr.ensma.lias.rql.api.ApiPaths.PROJECT; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import fr.ensma.lias.rql.dto.Favorite; +import fr.ensma.lias.rql.dto.Project; + +/** + * @author Bilal REZKELLAH + */ +@Path(PROJECT) +@Produces(MediaType.APPLICATION_JSON) +public interface ProjectResource { + + @Path("/allproject") + @GET + @Consumes(MediaType.APPLICATION_JSON) + List getAllProjectByUserID(@QueryParam("userID") String userID); + + @Path("/create") + @POST + @Consumes(MediaType.APPLICATION_JSON) + String createNewProject(Project project); + + @Path("{id}") + @GET + @Consumes(MediaType.APPLICATION_JSON) + Project getProjectById(@PathParam(ID) String id); + + @Path("{id}") + @DELETE + @Consumes(MediaType.APPLICATION_JSON) + boolean deleteProjectById(@PathParam(ID) String id); + + @Path("/update") + @POST // à remplacer par un PUT + @Consumes(MediaType.APPLICATION_JSON) + boolean updateProject(Project project); + + @Path("{id}/favorite") + @GET + @Consumes(MediaType.APPLICATION_JSON) + List getAllFavoriteByProject(@PathParam(ID) String id); + + @Path("{id}/favorite/sql") + @GET + @Consumes(MediaType.APPLICATION_JSON) + List getAllFavoriteSqlQueries(@PathParam(ID) String id); + + @Path("/favorite/{id}") + @DELETE + @Consumes(MediaType.APPLICATION_JSON) + boolean deleteFavoriteById(@PathParam(ID) String id); + + @Path("/favorite/create") + @POST + @Consumes(MediaType.APPLICATION_JSON) + String createNewFavorite(Favorite favorite); + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryConstruction.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryConstruction.java new file mode 100644 index 0000000..b62cffe --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryConstruction.java @@ -0,0 +1,33 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.ATTRIBUTES_LIST; +import static fr.ensma.lias.rql.api.ApiParameters.CONDITIONAL_WHERE; +import static fr.ensma.lias.rql.api.ApiParameters.IS_ALL_DATA; +import static fr.ensma.lias.rql.api.ApiParameters.IS_TABLE; +import static fr.ensma.lias.rql.api.ApiParameters.SQL_QUERY; +import static fr.ensma.lias.rql.api.ApiParameters.IS_CONDITIONAL; +import static fr.ensma.lias.rql.api.ApiParameters.QUERY_TYPE; +import static fr.ensma.lias.rql.api.ApiParameters.SUBSET_WHERE; +import static fr.ensma.lias.rql.api.ApiParameters.TABLE_NAME; +import static fr.ensma.lias.rql.api.ApiParameters.TOLERENCE; +import static fr.ensma.lias.rql.api.ApiPaths.QUERY_CONSTRUCTION; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; + +/** + * @author Bilal REZKELLAH + */ +@Path(QUERY_CONSTRUCTION) +public interface QueryConstruction { + + @TokenAuthenticated + @GET + String getQuery(@QueryParam(QUERY_TYPE) String QueryType, @QueryParam(IS_TABLE) String isTable, + @QueryParam(IS_ALL_DATA) String isALLData, @QueryParam(SQL_QUERY) String sqlQuery, + @QueryParam(TABLE_NAME) String tableName, @QueryParam(SUBSET_WHERE) String subsetWhere, + @QueryParam(ATTRIBUTES_LIST) String attributesList, @QueryParam(IS_CONDITIONAL) String isConditional, + @QueryParam(CONDITIONAL_WHERE) String conditionalWhere, @QueryParam(TOLERENCE) String tolerence); + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryResource.java new file mode 100644 index 0000000..9516e63 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/QueryResource.java @@ -0,0 +1,105 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.CONFIDENCE; +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import static fr.ensma.lias.rql.api.ApiParameters.LEFT_ATTRIBUTES; +import static fr.ensma.lias.rql.api.ApiParameters.RIGHT_ATTRIBUTES; +import static fr.ensma.lias.rql.api.ApiParameters.SUPPORT; +import static fr.ensma.lias.rql.api.ApiPaths.QUERY; +import static fr.ensma.lias.rql.api.ApiPaths.RESULTSET; +import static fr.ensma.lias.rql.api.ApiPaths.RULE; +import static fr.ensma.lias.rql.api.ApiPaths.RULECHECK; +import static fr.ensma.lias.rql.api.ApiPaths.TEST; +import static fr.ensma.lias.rql.api.ApiPaths.TYPE; + +import java.io.IOException; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.glassfish.jersey.media.multipart.FormDataParam; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.dto.CheckRuleResult; +import fr.ensma.lias.rql.dto.RQLResult; +import fr.ensma.lias.rql.dto.SQLResult; +import fr.ensma.lias.rql.dto.TypeQuery; + +/** + * @author Bilal REZKELLAH + */ +@Path(QUERY) +@Produces(MediaType.APPLICATION_JSON) +public interface QueryResource { + + /** + * Returns the type and the id of the query and save it on the DataBase + * + * @param query The SQL or the RQL query to + */ + @TokenAuthenticated + @Path(TYPE) + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + TypeQuery createQuery(@FormDataParam("query") String query, @FormDataParam("projectID") String projectID); + + /** + * Returns all Rules calculated after executing the RQL query corresponding to + * the ID. + * + * @param id The ID of the query in the database + */ + + @TokenAuthenticated + @Path("{id}" + RULE) + @GET + RQLResult getAllRulesID(@PathParam(ID) String id, @QueryParam(SUPPORT) String support, + @QueryParam(CONFIDENCE) String confidence); + + /** + * Returns a boolean value that indicate if the rule is true or not and if it's + * not true it returns a table of counter examples. + * + * @param id The ID of the query in the database + * @param leftAttributes The left Attributes of the rule to check + * + * @param rightAttribute The right Attributes of the rule to check + */ + + @TokenAuthenticated + @Path("{id}" + RULECHECK) + @GET + CheckRuleResult checkForThisRule(@PathParam(ID) String id, @QueryParam(LEFT_ATTRIBUTES) String leftAttributes, + @QueryParam(RIGHT_ATTRIBUTES) String rightAttribute, @QueryParam(SUPPORT) String support, + @QueryParam(CONFIDENCE) String confidence, @QueryParam("projectID") String projectID); + + /** + * Returns all rows of the table if query is a Select SQL query and returns null + * if it's another type of SQL query + * + * @param id The ID of the SQL query + * @throws IOException + * @throws JsonMappingException + * @throws JsonParseException + */ + + @TokenAuthenticated + @Path("{id}" + RESULTSET) + @GET + SQLResult getResultSet(@PathParam("id") String id, @QueryParam("projectID") String projectID) + throws JsonParseException, JsonMappingException, IOException; + + @TokenAuthenticated + @Path(TEST) + @GET + String isGoodConstructed(@QueryParam("query") String query); + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/SchemaResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/SchemaResource.java new file mode 100644 index 0000000..94b2b43 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/SchemaResource.java @@ -0,0 +1,41 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import static fr.ensma.lias.rql.api.ApiParameters.QUERY_TYPE; +import static fr.ensma.lias.rql.api.ApiPaths.HEADER; +import static fr.ensma.lias.rql.api.ApiPaths.TABLE; + +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import fr.ensma.lias.rql.api.TokenAuthenticated; +import fr.ensma.lias.rql.dto.SchemaResult; + +/** + * @author Bilal REZKELLAH + */ +@Path(TABLE) +@Produces(MediaType.APPLICATION_JSON) +public interface SchemaResource { + + @TokenAuthenticated + @GET + SchemaResult getAllTables(@QueryParam("projectID") String projectID); + + @TokenAuthenticated + @Path("{id}") + @GET + List getAttributesList(@PathParam(ID) String id, @QueryParam(QUERY_TYPE) String queryType, + @QueryParam("projectID") String projectID); + + @TokenAuthenticated + @Path(HEADER) + @GET + List getAllTablesHeader(@QueryParam("projectID") String projectID); +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/TokenAuthenticated.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/TokenAuthenticated.java new file mode 100644 index 0000000..41598eb --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/TokenAuthenticated.java @@ -0,0 +1,17 @@ +package fr.ensma.lias.rql.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.ws.rs.NameBinding; + +/** + * @author Bilal REZKELLAH + */ +@NameBinding +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +public @interface TokenAuthenticated { +} \ No newline at end of file diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/UserResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/UserResource.java new file mode 100644 index 0000000..808f4db --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/UserResource.java @@ -0,0 +1,46 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiPaths.USER; +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.glassfish.jersey.media.multipart.FormDataParam; + +import fr.ensma.lias.rql.dto.User; + +/** + * @author Bilal REZKELLAH + */ +@Path(USER) +@Produces(MediaType.APPLICATION_JSON) +public interface UserResource { + + @GET + @Consumes(MediaType.APPLICATION_JSON) + List getAllCollaborarors(@QueryParam(ID) String userid); + + @Path("/collaborator") + @DELETE + @Consumes(MediaType.APPLICATION_JSON) + boolean deleteCollaborator(@QueryParam("projectid") String projectid, @QueryParam("username") String username); + + @Path("/collaborator") + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + String addCollaborator(@FormDataParam("projectid") String projectid, @FormDataParam("username") String username); + + @Path("/collaborator") + @GET + @Consumes(MediaType.APPLICATION_JSON) + String getCollaborators(@QueryParam("projectid") String projectid, @QueryParam("username") String username); + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/XlsxResource.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/XlsxResource.java new file mode 100644 index 0000000..59d1d6d --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/api/XlsxResource.java @@ -0,0 +1,45 @@ +package fr.ensma.lias.rql.api; + +import static fr.ensma.lias.rql.api.ApiParameters.CONFIDENCE; +import static fr.ensma.lias.rql.api.ApiParameters.ID; +import static fr.ensma.lias.rql.api.ApiParameters.LEFT_ATTRIBUTES; +import static fr.ensma.lias.rql.api.ApiParameters.RIGHT_ATTRIBUTES; +import static fr.ensma.lias.rql.api.ApiParameters.SUPPORT; +import static fr.ensma.lias.rql.api.ApiPaths.RULE; +import static fr.ensma.lias.rql.api.ApiPaths.RULECHECK; +import static fr.ensma.lias.rql.api.ApiPaths.RESULTSET; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Response; + +import fr.ensma.lias.rql.api.TokenAuthenticated; + +/** + * @author Bilal REZKELLAH + */ +@Path("/excel") +@Produces("application/vnd.ms-excel") +public interface XlsxResource { + + @Path("{id}" + RULE) + @GET + @TokenAuthenticated + Response getRule(@PathParam(ID) String id, @QueryParam(SUPPORT) String support, + @QueryParam(CONFIDENCE) String confidence); + + @Path("{id}" + RULECHECK) + @GET + @TokenAuthenticated + Response getCounterExample(@PathParam(ID) String id, @QueryParam(LEFT_ATTRIBUTES) String leftAttributes, + @QueryParam(RIGHT_ATTRIBUTES) String rightAttribute, @QueryParam(SUPPORT) String support, + @QueryParam(CONFIDENCE) String confidence, @QueryParam("projectID") String projectID); + + @TokenAuthenticated + @Path("{id}" + RESULTSET) + @GET + Response getResultSet(@PathParam(ID) String id, @QueryParam("projectID") String projectID); +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleResult.java new file mode 100644 index 0000000..dc65890 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleResult.java @@ -0,0 +1,35 @@ +package fr.ensma.lias.rql.dto; + +import fr.ensma.lias.rql.rulecheck.CheckResult; + +/** + * @author Bilal REZKELLAH + */ +public class CheckRuleResult { + + private CheckResult checkResult; + + private CheckRuleSummary summary; + + public CheckResult getCheckResult() { + return checkResult; + } + + public void setCheckResult(CheckResult checkResult) { + this.checkResult = checkResult; + } + + public CheckRuleSummary getSummary() { + return summary; + } + + public CheckRuleResult(CheckResult checkResult, CheckRuleSummary summary) { + super(); + this.checkResult = checkResult; + this.summary = summary; + } + + public void setSummary(CheckRuleSummary summary) { + this.summary = summary; + } +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleSummary.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleSummary.java new file mode 100644 index 0000000..e7f527e --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/CheckRuleSummary.java @@ -0,0 +1,70 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class CheckRuleSummary extends ExecutionSummary { + + private int counterExampleNB; + + private int tupleNB; + + private String isTrue; + + private String support; + + private String confidence; + + public String getSupport() { + return support; + } + + public void setSupport(String support) { + this.support = support; + } + + public String getConfidence() { + return confidence; + } + + public void setConfidence(String confidence) { + this.confidence = confidence; + } + + public CheckRuleSummary(long timeExecution, List attributesList, List tuplesList, + int counterExampleNB, int tupleNB, String isTrue, String support, String confidence) { + super(timeExecution, attributesList, tuplesList); + this.counterExampleNB = counterExampleNB; + this.tupleNB = tupleNB; + this.isTrue = isTrue; + this.support = support; + this.confidence = confidence; + } + + public int getCounterExampleNB() { + return counterExampleNB; + } + + public void setCounterExampleNB(int counterExampleNB) { + this.counterExampleNB = counterExampleNB; + } + + public int getTupleNB() { + return tupleNB; + } + + public void setTupleNB(int tupleNB) { + this.tupleNB = tupleNB; + } + + public String getIsTrue() { + return isTrue; + } + + public void setIsTrue(String isTrue) { + this.isTrue = isTrue; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Credentials.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Credentials.java new file mode 100644 index 0000000..95ed154 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Credentials.java @@ -0,0 +1,61 @@ +package fr.ensma.lias.rql.dto; + +import fr.ensma.lias.rql.dto.Credentials; + +/** + * @author Bilal REZKELLAH + */ +public class Credentials { + + protected String username; + + protected String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((password == null) ? 0 : password.hashCode()); + result = prime * result + ((username == null) ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Credentials other = (Credentials) obj; + if (password == null) { + if (other.password != null) + return false; + } else if (!password.equals(other.password)) + return false; + if (username == null) { + if (other.username != null) + return false; + } else if (!username.equals(other.username)) + return false; + return true; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/ExecutionSummary.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/ExecutionSummary.java new file mode 100644 index 0000000..6f4921a --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/ExecutionSummary.java @@ -0,0 +1,47 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class ExecutionSummary { + + private long timeExecution; + + private List attributesList; + + private List tuplesList; + + public long getTimeExecution() { + return timeExecution; + } + + public void setTimeExecution(long timeExecution) { + this.timeExecution = timeExecution; + } + + public List getAttributesList() { + return attributesList; + } + + public void setAttributesList(List attributesList) { + this.attributesList = attributesList; + } + + public List getTuplesList() { + return tuplesList; + } + + public void setTuplesList(List tuplesList) { + this.tuplesList = tuplesList; + } + + public ExecutionSummary(long timeExecution, List attributesList, List tuplesList) { + super(); + this.timeExecution = timeExecution; + this.attributesList = attributesList; + this.tuplesList = tuplesList; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Favorite.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Favorite.java new file mode 100644 index 0000000..d19b225 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Favorite.java @@ -0,0 +1,78 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public class Favorite { + + private String id; + + private String name; + + private String query; + + private String creationDate; + + private String projectID; + + private String type; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public String getCreationDate() { + return creationDate; + } + + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; + } + + public String getProjectID() { + return projectID; + } + + public void setProjectID(String projectID) { + this.projectID = projectID; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/FilePreview.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/FilePreview.java new file mode 100644 index 0000000..7fa626f --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/FilePreview.java @@ -0,0 +1,44 @@ +package fr.ensma.lias.rql.dto; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class FilePreview { + + private List sheetList = new ArrayList(); + private String fileID; + + private boolean goNext; + + public boolean isGoNext() { + return goNext; + } + + public void setGoNext(boolean goNext) { + this.goNext = goNext; + } + + public FilePreview() { + + } + + public String getFileID() { + return fileID; + } + + public void setFileID(String fileID) { + this.fileID = fileID; + } + + public List getSheetList() { + return sheetList; + } + + public void setSheetList(List sheetList) { + this.sheetList = sheetList; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Project.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Project.java new file mode 100644 index 0000000..0aab8a2 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/Project.java @@ -0,0 +1,85 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class Project { + + private String id; + private String name; + private String description; + private String userid; + private String creationDate; + private String dbType; + private List collaborators; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getCreationDate() { + return creationDate; + } + + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; + } + + public Project(String id, String name, String userid, String string) { + super(); + this.id = id; + this.name = name; + this.userid = userid; + this.creationDate = string; + } + + public Project() { + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } + + public List getCollaborators() { + return collaborators; + } + + public void setCollaborators(List collaborators) { + this.collaborators = collaborators; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryEnumType.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryEnumType.java new file mode 100644 index 0000000..c6044d6 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryEnumType.java @@ -0,0 +1,8 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public enum QueryEnumType { + RQL, SQL +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryResult.java new file mode 100644 index 0000000..09a524c --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/QueryResult.java @@ -0,0 +1,37 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public class QueryResult { + + private RQLResult rules; // rules + + private SQLResult sqlTuples; // SQLTuples + + public RQLResult getrules() { + return rules; + } + + public void setrules(RQLResult rules) { + this.rules = rules; + } + + public SQLResult getsqlTuples() { + return sqlTuples; + } + + public void setsqlTuples(SQLResult sqlTuples) { + this.sqlTuples = sqlTuples; + } + + public QueryResult(RQLResult rules, SQLResult sqlTuples) { + this.rules = rules; + this.sqlTuples = sqlTuples; + } + + public QueryResult() { + + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLResult.java new file mode 100644 index 0000000..5f35c2c --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLResult.java @@ -0,0 +1,40 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class RQLResult { + + private List exactRule; + + private RuleGenerationSummary summary; + + public RuleGenerationSummary getSummary() { + return summary; + } + + public void setSummary(RuleGenerationSummary summary) { + this.summary = summary; + } + + public List getexactRule() { + return exactRule; + } + + public RQLResult(List exactRule, RuleGenerationSummary summary) { + super(); + this.exactRule = exactRule; + this.summary = summary; + } + + public void setexactRule(List exactRule) { + this.exactRule = exactRule; + } + + public RQLResult() { + + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLRow.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLRow.java new file mode 100644 index 0000000..a756545 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RQLRow.java @@ -0,0 +1,67 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public class RQLRow { + + private String leftAttributes; + + private String rightAttribute; + + private double support; + + private double confidence; + + private double lift; + + public String getLeftAttributes() { + return leftAttributes; + } + + public void setLeftAttributes(String leftAttributes) { + this.leftAttributes = leftAttributes; + } + + public String getRightAttribute() { + return rightAttribute; + } + + public void setRightAttribute(String rightAttribute) { + this.rightAttribute = rightAttribute; + } + + public RQLRow(String leftAttributes, String rightAttribute) { + super(); + this.leftAttributes = leftAttributes; + this.rightAttribute = rightAttribute; + } + + public RQLRow() { + } + + public double getSupport() { + return support; + } + + public void setSupport(double support) { + this.support = support; + } + + public double getConfidence() { + return confidence; + } + + public void setConfidence(double confidence) { + this.confidence = confidence; + } + + public double getLift() { + return lift; + } + + public void setLift(double lift) { + this.lift = lift; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RuleGenerationSummary.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RuleGenerationSummary.java new file mode 100644 index 0000000..3c3ef48 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/RuleGenerationSummary.java @@ -0,0 +1,13 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class RuleGenerationSummary extends ExecutionSummary { + + public RuleGenerationSummary(long timeExecution, List attributesList, List tuplesList) { + super(timeExecution, attributesList, tuplesList); + } +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLResult.java new file mode 100644 index 0000000..29aa40f --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLResult.java @@ -0,0 +1,51 @@ +package fr.ensma.lias.rql.dto; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLResult { + + public List rows = new ArrayList(); + + public List header = new ArrayList(); + + boolean IsSelect; + + public boolean isIsSelect() { + return IsSelect; + } + + public void setIsSelect(boolean isSelect) { + IsSelect = isSelect; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public List getHeader() { + return header; + } + + public void setHeader(List header) { + this.header = header; + } + + public SQLResult(List header, List rows, Boolean isSelect) { + this.header = header; + this.rows = rows; + this.IsSelect = isSelect; + } + + public SQLResult() { + + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLRow.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLRow.java new file mode 100644 index 0000000..ef25f64 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SQLRow.java @@ -0,0 +1,24 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLRow { + + private List cels; + + public List getCels() { + return cels; + } + + public void setCels(List cels) { + this.cels = cels; + } + + public SQLRow(List cels) { + super(); + this.cels = cels; + } +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SchemaResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SchemaResult.java new file mode 100644 index 0000000..254a2d0 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SchemaResult.java @@ -0,0 +1,27 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +import fr.ensma.lias.rql.database.Table; + +/** + * @author Bilal REZKELLAH + */ +public class SchemaResult { + + private List tables; + + public List
getTables() { + return tables; + } + + public void setTables(List
tables) { + this.tables = tables; + } + + public SchemaResult(List
tables) { + super(); + this.tables = tables; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SheetContent.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SheetContent.java new file mode 100644 index 0000000..4203506 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/SheetContent.java @@ -0,0 +1,61 @@ +package fr.ensma.lias.rql.dto; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SheetContent { + + private List rows = new ArrayList(); + + private List header = new ArrayList(); + + private String tableName; + + private Integer nbRow; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public List getHeader() { + return header; + } + + public void setHeader(List header) { + this.header = header; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public SheetContent(List rows, List header, String tableName) { + super(); + this.rows = rows; + this.header = header; + this.tableName = tableName; + } + + public SheetContent() { + + } + + public Integer getNbRow() { + return nbRow; + } + + public void setNbRow(Integer nbRow) { + this.nbRow = nbRow; + } +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TableImportResult.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TableImportResult.java new file mode 100644 index 0000000..c7b5f22 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TableImportResult.java @@ -0,0 +1,53 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public class TableImportResult { + + private String tableName; + private Integer nbRow; + private Integer nbCol; + private boolean goNext2; + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Integer getNbRow() { + return nbRow; + } + + public void setNbRow(Integer nbRow) { + this.nbRow = nbRow; + } + + public Integer getNbCol() { + return nbCol; + } + + public void setNbCol(Integer nbCol) { + this.nbCol = nbCol; + } + + public TableImportResult(String tableName, Integer nbRow, Integer nbCol, boolean goNext2) { + super(); + this.tableName = tableName; + this.nbRow = nbRow; + this.nbCol = nbCol; + this.goNext2 = goNext2; + } + + public boolean isGoNext2() { + return goNext2; + } + + public void setGoNext2(boolean goNext2) { + this.goNext2 = goNext2; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TypeQuery.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TypeQuery.java new file mode 100644 index 0000000..740ebc1 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/TypeQuery.java @@ -0,0 +1,72 @@ +package fr.ensma.lias.rql.dto; + +import java.util.List; + +import fr.ensma.lias.rql.baseresults.BaseLine; + +/** + * @author Bilal REZKELLAH + */ +public class TypeQuery { + + private QueryEnumType type; + + private String ruleParsed; + + private String queryKey; + + private List baseContent; + + private List attributesList; + + public List getAttributesList() { + return attributesList; + } + + public void setAttributesList(List attributesList) { + this.attributesList = attributesList; + } + + public TypeQuery(QueryEnumType type, String ruleParsed, String queryKey, List baseContent, + List attributesList) { + super(); + this.setType(type); + this.ruleParsed = ruleParsed; + this.queryKey = queryKey; + this.baseContent = baseContent; + this.attributesList = attributesList; + } + + public String getQueryKey() { + return queryKey; + } + + public void setQueryKey(String queryKey) { + this.queryKey = queryKey; + } + + public List getBaseContent() { + return baseContent; + } + + public void setBaseContent(List baseContent) { + this.baseContent = baseContent; + } + + public String getRuleParsed() { + return ruleParsed; + } + + public void setRuleParsed(String ruleParsed) { + this.ruleParsed = ruleParsed; + } + + public QueryEnumType getType() { + return type; + } + + public void setType(QueryEnumType type) { + this.type = type; + } + +} diff --git a/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/User.java b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/User.java new file mode 100644 index 0000000..9ed4f86 --- /dev/null +++ b/rql-backend/rql-api/src/main/java/fr/ensma/lias/rql/dto/User.java @@ -0,0 +1,55 @@ +package fr.ensma.lias.rql.dto; + +/** + * @author Bilal REZKELLAH + */ +public class User { + + private Integer userID; + private String firstName; + private String lastName; + private String username; + + public User(Integer userID, String firstName, String lastName, String username) { + super(); + this.userID = userID; + this.firstName = firstName; + this.lastName = lastName; + this.username = username; + } + + public User() { + } + + public Integer getUserID() { + return userID; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} diff --git a/rql-backend/rql-api/src/main/resources/DELETE.me b/rql-backend/rql-api/src/main/resources/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-api/src/test/java/DELETE.me b/rql-backend/rql-api/src/test/java/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-api/src/test/resources/DELETE.me b/rql-backend/rql-api/src/test/resources/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-core/pom.xml b/rql-backend/rql-core/pom.xml new file mode 100644 index 0000000..2787382 --- /dev/null +++ b/rql-backend/rql-core/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + rql-core + Core module of RQL platform + + + fr.ensma.lias + rql-backend + 1.1.0-SNAPSHOT + + + + + 11.2.0.4 + 2.6 + 42.2.1 + 20180130 + 2.8.4 + + + UTF-8 + + + + + org.codehaus.mojo + javacc-maven-plugin + ${javacc.version} + + src + + + + generate-javacc + generate-sources + + javacc + + + + + + + + + com.oracle.database.jdbc + ojdbc6 + ${ojdbc.version} + + + org.postgresql + postgresql + ${postgresql.version} + + + org.json + json + ${json.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + \ No newline at end of file diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLManager.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLManager.java new file mode 100644 index 0000000..ba01322 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLManager.java @@ -0,0 +1,356 @@ +package fr.ensma.lias.rql; + +import java.io.BufferedOutputStream; +import java.io.BufferedWriter; +import java.io.Closeable; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; + +import fr.ensma.lias.rql.baseresults.BaseLine; +import fr.ensma.lias.rql.cfg.RqlCoreConf; +import fr.ensma.lias.rql.database.Database; +import fr.ensma.lias.rql.database.MysqlDB; +import fr.ensma.lias.rql.database.OracleDB; +import fr.ensma.lias.rql.database.PostgresqlDB; +import fr.ensma.lias.rql.dfg.Dfg; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; +import fr.ensma.lias.rql.rulesgrammar.ParseException; +import fr.ensma.lias.rql.rulesgrammar.RulesParser; + +/** + * @author Gouriou Benjamin + * @author Bilal REZKELLAH + */ +public class RQLManager implements Closeable { + + private String agFile = null; + + private PrintStream output = null; + + private OutputStream outStream = null; + + private Database db = null; + + private long startTime; + + private String shdPath; + + private RqlCoreConf rqlCoreConf = new RqlCoreConf(); + + public RQLManager(String AgFile) { + this.agFile = AgFile; + } + + public RQLManager(RqlCoreConf cfgConf) { + this.rqlCoreConf = cfgConf; + this.shdPath = cfgConf.getPathToShd(); + agFile = cfgConf.getTmpAgFile(); + startTime = System.currentTimeMillis(); + } + + /** + * Initializes an RQL context without log output. + * + * @param tmpAgFile the URL of the temporary file to store the agree set + */ + public RQLManager(String tmpAgFile, String shdPath) { + if (tmpAgFile == null) { + throw new NullPointerException("Temporary file can not be null."); + } + this.shdPath = shdPath; + agFile = tmpAgFile; + startTime = System.currentTimeMillis(); + } + + /** + * Initializes an RQL context. + * + * @param tmpAgFile the URL of the temporary file to store the agree set + * @param log the output stream, or null to disable + */ + public RQLManager(String tmpAgFile, String shdPath, PrintStream log) { + this(tmpAgFile, shdPath); + output = log; + } + + /** + * Initializes an RQL context. + * + * @param tmpAgFile the URL of the temporary file to store the agree set + * @param log the URL of the output file, or null to disable + * + * @throws IOException IO-related error + */ + public RQLManager(String tmpAgFile, String shdPath, String log) throws IOException { + this(tmpAgFile, shdPath); + if (log != null) { + output = new PrintStream(log); + } + } + + /** + * Executes an RQL query. + * + * @param rqlQuery an RQL query + * @param outFilename the URL of the output file for rules + * + * @throws SQLException SQL-related error + * @throws IOException IO-related error + * @throws InterruptedException Interruption during the execution of DFG + * @throws rulesgrammar.ParseException Wrong syntax in rules generated by DFG + * @throws rqlgrammar.ParseException Wrong syntax in the RQL query + */ + public List executeQuery(String rqlQuery, String outFilename) + throws SQLException, IOException, InterruptedException, fr.ensma.lias.rql.rulesgrammar.ParseException, + fr.ensma.lias.rql.rqlgrammar.ParseException { + + log("RQL query:\n" + rqlQuery); + log("parsing RQL query"); + RQLParser parser = RQLParser.parse(rqlQuery); + System.out.println(rqlQuery); + log("generating SQL query"); + + String sqlQuery = ""; + if (rqlCoreConf.getRqlDbType().equals("oracle")) { + sqlQuery = parser.oracleQuery(); + } else if (rqlCoreConf.getRqlDbType().equals("postgresql")) { + sqlQuery = parser.postgresQuery(); + } else if (rqlCoreConf.getRqlDbType().equals("mysql")) { + sqlQuery = parser.mysqlQuery(); + } + log("SQL query:\n" + sqlQuery); + + log("initializing oracle connection"); + if (rqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (rqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (rqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } + db.open(rqlCoreConf.getRqlDbHost(), rqlCoreConf.getRqlDbPort(), rqlCoreConf.getRqlDbName(), + rqlCoreConf.getRqlDbAdminLogin(), rqlCoreConf.getRqlDbAdminPwd()); + + System.out.println("\nconnexion etablie \n"); + + log("oracle query"); + ResultSet results = db.executeQuery(sqlQuery); + + log("printing results"); + resultsToFile(results, parser.getAttributeList().size()); + results.close(); + db.close(); + + log("generating rules"); + int tailleMax = parser.getAttributeList().size(); + Dfg dfg = new Dfg(agFile, agFile + "_rules.txt", 0, 0, tailleMax, shdPath); + /* + * Dfg dfg = new Dfg(agFile + "_rules.txt", tailleMax, + * parser.getAttributeList().size()); // set agree set while (results.next()) { + * int card = results.getInt(1); String ag = results.getString(2); if (ag != + * null && !ag.equals("")) { String[] elems = ag.split(" "); int[] agr = new + * int[elems.length]; for (int i = 0; i < elems.length; i++) { agr[i] = + * Integer.parseInt(elems[i]); } dfg.init(card, agr); } } results.close(); + * db.close(); done + */ + try { + dfg.execute(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + + log("translating rules"); + List ruleResults = new ArrayList(); + int[] counts = new int[2]; + outStream = new BufferedOutputStream(new FileOutputStream(outFilename), 1024); + RulesParser.translate(agFile + "_rules.txt", outStream, parser.getAttributeList(), ruleResults, 100000, counts); + log("RQL query computed"); + return ruleResults; + } + + private void log(String log) { + if (output != null) { + output.println((System.currentTimeMillis() - startTime) + "\t" + log); + } + } + + /** + * Writes the agree set (results of the SQL query) to the file tmpAgFile + * specified in the constructor. + * + * @param result the result of the SQL query + * @param attSize the number of attributes used in rules + * + * @throws SQLException SQL-related error + * @throws IOException IO-related error + */ + private void resultsToFile(ResultSet result, int attSize) throws SQLException, IOException { + StringBuffer buf = new StringBuffer(); + + /* cardinality of the relation: sum of count */ + int cardinality = 0; + while (result.next()) { + cardinality += result.getInt(1); + buf.append(result.getString(1)); + String ag = result.getString(2); + if (ag != null && !ag.equals("")) { + buf.append(" " + ag.trim()); + } + buf.append("\n"); + } + + BufferedWriter out = new BufferedWriter(new FileWriter(agFile)); + + out.write(Integer.toString(attSize) + "\n"); + for (int i = 0; i < attSize; i++) { + if (i > 0) { + out.write(" "); + } + out.write(Integer.toString(i)); + } + out.write("\n" + Integer.toString(attSize) + " " + Integer.toString(cardinality) + "\n"); + out.write(buf.toString()); + + out.flush(); + out.close(); + } + + public void resultsToFile2(List result, int attSize) throws SQLException, IOException { + StringBuffer buf = new StringBuffer(); + + /* cardinality of the relation: sum of count */ + int cardinality = 0; + ListIterator it = result.listIterator(); + while (it.hasNext()) { + BaseLine ligne = it.next(); + cardinality += Integer.parseInt(ligne.getCount()); + buf.append(ligne.getCount()); + if (ligne.getAg() != null && !ligne.getAg().equals("")) { + buf.append(" " + ligne.getAg().trim()); + } + buf.append("\n"); + } + System.out.println(agFile); + BufferedWriter out = new BufferedWriter(new FileWriter(agFile)); + + out.write(Integer.toString(attSize) + "\n"); + for (int i = 0; i < attSize; i++) { + if (i > 0) { + out.write(" "); + } + out.write(Integer.toString(i)); + } + out.write("\n" + Integer.toString(attSize) + " " + Integer.toString(cardinality) + "\n"); + out.write(buf.toString()); + + out.flush(); + out.close(); + } + + /** + * Updates the temporary file used to store the agree set. + * + * @param tmpAgFile the URL of the temporary file + */ + public void setTemporaryFile(String tmpAgFile) { + agFile = tmpAgFile; + } + + public void executeDFG(String fileIn, String fileOut, int tailleMax, double support, double confidence, + String m_execpath) { + Dfg dfg = new Dfg(fileIn, fileOut, support, confidence, tailleMax, m_execpath); + try { + dfg.execute(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + public RQLResults translate(String ruleFile, String outFile, List parseAttributeList) + throws ParseException, IOException { + List listrqlExact = new ArrayList(); + List ExactRule = new ArrayList(); + List leftAtts; + String[] sides; + String[] rightSides; + Rule rule = new Rule(); + int[] counts = new int[2]; + OutputStream outStream = null; + outStream = new BufferedOutputStream(new FileOutputStream(ruleFile), 1024); + RulesParser.translate(outFile, outStream, parseAttributeList, listrqlExact, 100000, counts); + DecimalFormat df = new DecimalFormat(); + df.setMaximumFractionDigits(3); // arrondi à 2 chiffres apres la virgules + for (int i = 0; i < listrqlExact.size(); i++) { + rule = new Rule(); + sides = listrqlExact.get(i).split("=>"); + rightSides = sides[1].split("\\s"); + rule.setRightAttributes(rightSides[1]); + rule.setSupport(Double.valueOf( + df.format(Double.valueOf(rightSides[5]) / Double.valueOf(rightSides[2])).replace(',', '.'))); + rule.setConfidence(Double.valueOf( + df.format(Double.valueOf(rightSides[5]) / Double.valueOf(rightSides[3])).replace(',', '.'))); + rule.setLift(Double.valueOf(df + .format(Double.valueOf( + rule.getConfidence() / (Double.valueOf(rightSides[4]) / Double.valueOf(rightSides[2])))) + .replace(',', '.'))); + leftAtts = new ArrayList(); + for (String w : sides[0].split("\\s")) { + leftAtts.add(w); + } + rule.setLeftAttributes(leftAtts); + ExactRule.add(rule); + } + return new RQLResults(ExactRule); + } + + /** + * Sets the output to trace the RQL query, the SQL query and execution times. + * + * @param log the URL of the output file, or null to disable + * + * @throws IOException IO-related error + */ + public void setOutput(String log) throws IOException { + if (output != null) { + output.flush(); + output.close(); + } + output = new PrintStream(log); + } + + /** + * Sets the output to trace the RQL query, the SQL query and execution times. + * + * @param log the output stream, or null to disable + */ + public void setOutput(PrintStream log) { + if (output != null) { + output.flush(); + output.close(); + } + output = log; + } + + /** + * Closes the connection to the DBMS and file handlers. + */ + public void close() throws IOException { + if (output != null) { + output.flush(); + output.close(); + output = null; + } + db.close(); + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLResults.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLResults.java new file mode 100644 index 0000000..eb86b1e --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/RQLResults.java @@ -0,0 +1,28 @@ +package fr.ensma.lias.rql; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class RQLResults { + + private List exactRules; + + public List getExactRules() { + return exactRules; + } + + public void setExactRules(List exactRules) { + this.exactRules = exactRules; + } + + public RQLResults() { + + } + + public RQLResults(List exactRules) { + super(); + this.exactRules = exactRules; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/Rule.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/Rule.java new file mode 100644 index 0000000..bf5bbb1 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/Rule.java @@ -0,0 +1,62 @@ +package fr.ensma.lias.rql; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class Rule { + + private List leftAttributes; + + private String rightAttributes; + + private double support; + + private double confidence; + + private double lift; + + public Rule() { + } + + public List getLeftAttributes() { + return leftAttributes; + } + + public void setLeftAttributes(List leftAttributes) { + this.leftAttributes = leftAttributes; + } + + public String getRightAttributes() { + return rightAttributes; + } + + public void setRightAttributes(String rightAttributes) { + this.rightAttributes = rightAttributes; + } + + public double getSupport() { + return support; + } + + public void setSupport(double support) { + this.support = support; + } + + public double getConfidence() { + return confidence; + } + + public void setConfidence(double confidence) { + this.confidence = confidence; + } + + public double getLift() { + return lift; + } + + public void setLift(double lift) { + this.lift = lift; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseLine.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseLine.java new file mode 100644 index 0000000..790af78 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseLine.java @@ -0,0 +1,32 @@ +package fr.ensma.lias.rql.baseresults; + +/** + * @author Bilal REZKELLAH + */ +public class BaseLine { + + private String count; + + private String ag; + + public String getCount() { + return count; + } + + public void setCount(String count) { + this.count = count; + } + + public String getAg() { + return ag; + } + + public void setAg(String ag) { + this.ag = ag; + } + + public BaseLine(String count, String ag) { + this.count = count; + this.ag = ag; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseResult.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseResult.java new file mode 100644 index 0000000..dd96650 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/baseresults/BaseResult.java @@ -0,0 +1,32 @@ +package fr.ensma.lias.rql.baseresults; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class BaseResult { + + private List content = new ArrayList(); + + public void resultsToList(ResultSet result) throws SQLException { + BaseLine ligne; + while (result.next()) { + String count = result.getString(1); + String ag = result.getString(2); + ligne = new BaseLine(count, ag); + this.content.add(ligne); + } + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/CoreConfig.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/CoreConfig.java new file mode 100644 index 0000000..6f0aeba --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/CoreConfig.java @@ -0,0 +1,80 @@ +package fr.ensma.lias.rql.cfg; + +/** + * @author Bilal REZKELLAH + */ +public class CoreConfig { + + private String rqlDbName; + + private String rqlDbHost; + + private String rqlDbType; + + private Integer rqlDbPort; + + private String rqlDbAdminLogin; + + private String rqlDbAdminPwd; + + public String getRqlDbName() { + return rqlDbName; + } + + public void setRqlDbName(String rqlDbName) { + this.rqlDbName = rqlDbName; + } + + public CoreConfig() { + } + + public CoreConfig(String rqlDbName, String rqlDbHost, Integer rqlDbPort, String rqlDbType, String rqlDbAdminLogin, + String rqlDbAdminPwd) { + this.rqlDbName = rqlDbName; + this.rqlDbHost = rqlDbHost; + this.rqlDbType = rqlDbType; + this.rqlDbPort = rqlDbPort; + this.rqlDbAdminLogin = rqlDbAdminLogin; + this.rqlDbAdminPwd = rqlDbAdminPwd; + } + + public String getRqlDbHost() { + return rqlDbHost; + } + + public void setRqlDbHost(String rqlDbHost) { + this.rqlDbHost = rqlDbHost; + } + + public String getRqlDbType() { + return rqlDbType; + } + + public void setRqlDbType(String rqlDbType) { + this.rqlDbType = rqlDbType; + } + + public Integer getRqlDbPort() { + return rqlDbPort; + } + + public void setRqlDbPort(Integer rqlDbPort) { + this.rqlDbPort = rqlDbPort; + } + + public String getRqlDbAdminLogin() { + return rqlDbAdminLogin; + } + + public void setRqlDbAdminLogin(String rqlDbAdminLogin) { + this.rqlDbAdminLogin = rqlDbAdminLogin; + } + + public String getRqlDbAdminPwd() { + return rqlDbAdminPwd; + } + + public void setRqlDbAdminPwd(String rqlDbAdminPwd) { + this.rqlDbAdminPwd = rqlDbAdminPwd; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/RqlCoreConf.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/RqlCoreConf.java new file mode 100644 index 0000000..c6a4d3f --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/RqlCoreConf.java @@ -0,0 +1,37 @@ +package fr.ensma.lias.rql.cfg; + +/** + * @author Bilal REZKELLAH + */ +public class RqlCoreConf extends CoreConfig { + + private String pathToShd; + private String tmpAgFile; + + public RqlCoreConf(String rqlDbName, String rqlDbHost, Integer rqlDbPort, String rqlDbType, String rqlDbAdminLogin, + String rqlDbAdminPwd, String pathToShd, String tmpAgFile) { + super(rqlDbName, rqlDbHost, rqlDbPort, rqlDbType, rqlDbAdminLogin, rqlDbAdminPwd); + this.pathToShd = pathToShd; + this.tmpAgFile = tmpAgFile; + } + + public RqlCoreConf() { + super(); + }; + + public String getPathToShd() { + return pathToShd; + } + + public void setPathToShd(String pathToShd) { + this.pathToShd = pathToShd; + } + + public String getTmpAgFile() { + return tmpAgFile; + } + + public void setTmpAgFile(String tmpAgFile) { + this.tmpAgFile = tmpAgFile; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/SqlCoreConf.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/SqlCoreConf.java new file mode 100644 index 0000000..884dced --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/cfg/SqlCoreConf.java @@ -0,0 +1,17 @@ +package fr.ensma.lias.rql.cfg; + +/** + * @author Bilal REZKELLAH + */ +public class SqlCoreConf extends CoreConfig { + + public SqlCoreConf() { + super(); + } + + public SqlCoreConf(String rqlDbName, String rqlDbHost, Integer rqlDbPort, String rqlDbType, String rqlDbAdminLogin, + String rqlDbAdminPwd) { + super(rqlDbName, rqlDbHost, rqlDbPort, rqlDbType, rqlDbAdminLogin, rqlDbAdminPwd); + + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Column.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Column.java new file mode 100644 index 0000000..3907212 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Column.java @@ -0,0 +1,34 @@ +package fr.ensma.lias.rql.database; + +/** + * @author Bilal REZKELLAH + */ +public class Column { + + private String columnName; + + private String columnType; + + public Column(String columnName, String columnType) { + super(); + this.columnName = columnName; + this.columnType = columnType; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getColumnType() { + return columnType; + } + + public void setColumnType(String columnType) { + this.columnType = columnType; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseSchema.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseSchema.java new file mode 100644 index 0000000..fa04888 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseSchema.java @@ -0,0 +1,24 @@ +package fr.ensma.lias.rql.database; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class DataBaseSchema { + + private List
tables; + + public List
getTables() { + return tables; + } + + public void setTables(List
tables) { + this.tables = tables; + } + + public DataBaseSchema(List
tables) { + super(); + this.tables = tables; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseType.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseType.java new file mode 100644 index 0000000..0deb72d --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/DataBaseType.java @@ -0,0 +1,8 @@ +package fr.ensma.lias.rql.database; + +/** + * @author Bilal REZKELLAH + */ +public enum DataBaseType { + oracle, postgresql, mysql +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Database.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Database.java new file mode 100644 index 0000000..a2ece48 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Database.java @@ -0,0 +1,28 @@ +package fr.ensma.lias.rql.database; + +import java.io.Closeable; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * @author Bilal REZKELLAH + */ +public abstract interface Database extends Closeable { + + /** + * Executes a SQL query. + * + * @param query a SQL query + * @return the result of the query + * + * @throws SQLException SQL-related error + */ + public ResultSet executeQuery(String query) throws SQLException; + + /** + * Initializes the connection to the DBMS. + * + * @throws SQLException SQL-related error + */ + public void open(String host, int port, String database, String user, String password) throws SQLException; +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/MysqlDB.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/MysqlDB.java new file mode 100644 index 0000000..71e32ce --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/MysqlDB.java @@ -0,0 +1,46 @@ +package fr.ensma.lias.rql.database; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * @author Bilal REZKELLAH + */ +public class MysqlDB implements Database { + + private Connection cx; + + private Statement stmt; + + public ResultSet executeQuery(String query) throws SQLException { + ResultSet rs = null; + boolean isSelect = stmt.execute(query); + if (isSelect) { + rs = stmt.getResultSet(); + } + return rs; + } + + public void open(String host, int port, String database, String user, String password) throws SQLException { + try { + Class.forName("com.mysql.jdbc.Driver").newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + cx = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, user, password); + stmt = cx.createStatement(); + } + + public void close() throws IOException { + try { + stmt.close(); + cx.close(); + } catch (SQLException e) { + throw new IOException(e); + } + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/OracleDB.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/OracleDB.java new file mode 100644 index 0000000..9218799 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/OracleDB.java @@ -0,0 +1,65 @@ +package fr.ensma.lias.rql.database; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import fr.ensma.lias.rql.database.Database; +import oracle.jdbc.pool.OracleDataSource; + +/** + * @author Bilal REZKELLAH + */ +public class OracleDB implements Database { + + private OracleDataSource ora; + + private Connection cx = null; + + private Statement stmt = null; + + private ResultSet rs = null; + + @Override + public ResultSet executeQuery(String query) throws SQLException { + if (cx == null) { + cx = ora.getConnection(); + } + if (stmt == null) { + stmt = cx.createStatement(); + } + boolean isSelect = stmt.execute(query); + if (isSelect) { + rs = stmt.getResultSet(); + } else { + rs = null; + } + return rs; + } + + @Override + public void open(String host, int port, String database, String user, String password) throws SQLException { + ora = new OracleDataSource(); + ora.setDriverType("thin"); + // ora.setServerName("134.214.104.91"); + ora.setServerName(host); + ora.setPortNumber(port); + ora.setDatabaseName(database); + ora.setUser(user); + ora.setPassword(password); + ora.setLoginTimeout(20); + cx = ora.getConnection(); + stmt = cx.createStatement(); + } + + public void close() throws IOException { + try { + stmt.close(); + cx.close(); + } catch (SQLException e) { + throw new IOException(e); + } + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/PostgresqlDB.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/PostgresqlDB.java new file mode 100644 index 0000000..b500320 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/PostgresqlDB.java @@ -0,0 +1,50 @@ +package fr.ensma.lias.rql.database; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * @author Bilal REZKELLAH + */ +public class PostgresqlDB implements Database { + + private Connection cx; + private Statement stmt; + + @Override + public void close() throws IOException { + try { + stmt.close(); + cx.close(); + } catch (SQLException e) { + throw new IOException(e); + } + + } + + @Override + public ResultSet executeQuery(String query) throws SQLException { + ResultSet rs = null; + boolean isSelect = stmt.execute(query); + if (isSelect) { + rs = stmt.getResultSet(); + } + return rs; + } + + @Override + public void open(String host, int port, String database, String user, String password) throws SQLException { + try { + Class.forName("org.postgresql.Driver").newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + cx = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/" + database, user, password); + + stmt = cx.createStatement(); + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Table.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Table.java new file mode 100644 index 0000000..5943c69 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/database/Table.java @@ -0,0 +1,38 @@ +package fr.ensma.lias.rql.database; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class Table { + + private String tableName; + + private List columnsName; + + public Table(String tableName, List columnsName) { + super(); + this.tableName = tableName; + this.columnsName = columnsName; + } + + public Table() { + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public List getColumnsName() { + return columnsName; + } + + public void setColumnsName(List columnsName) { + this.columnsName = columnsName; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributSet.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributSet.java new file mode 100644 index 0000000..9f5e6a6 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributSet.java @@ -0,0 +1,220 @@ +package fr.ensma.lias.rql.dfg; + +import java.util.Iterator; +import java.util.TreeSet; + +/** + * @author Benjamin GOURIOU + */ +public class AttributSet { + + private TreeSet m_at; + + private int m_count; + + public AttributSet() { + this.m_count = 1; + } + + public AttributSet(TreeSet at) { + this.m_count = 1; + m_at = at; + } + + public AttributSet(String line) { + m_count = 1; + String val[] = line.split(" "); + m_at = new TreeSet(); + for (String curr : val) + m_at.add(Integer.valueOf(curr)); + } + + public AttributSet(AttributSet inAttr) { + this.m_count = inAttr.m_count; + this.m_at = (TreeSet) inAttr.m_at.clone(); + } + + public void clear() { + m_at.clear(); + } + + public void insert(int x) { + m_at.add(x); + } + + public boolean empty() { + return m_at.isEmpty(); + } + + public int size() { + return m_at.size(); + } + + public boolean find(int valeur) { + return (m_at.contains(valeur)); + } + + public void erase(int v) { + m_at.remove(v); + } + + public void incr() { + m_count++; + } + + @Override + public String toString() { + StringBuilder tmp = new StringBuilder("{"); + int size = m_at.size(); + if (size > 0) { + /* + * for (int i=0; i iter = m_at.iterator(); + while (iter.hasNext()) + tmp.append(iter.next()).append(","); + tmp.replace(tmp.length() - 1, tmp.length(), "}, "); + } else + tmp.append("}, "); + + tmp.append(this.m_count); + return tmp.toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof AttributSet) { + AttributSet var = (AttributSet) obj; + return this.is_equal(var); + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 17 * hash + (this.m_at != null ? this.m_at.hashCode() : 0); + hash = 17 * hash + this.m_count; + return hash; + } + + /******** + * Renvoie true si l'attributSet X est un sous-ensemble strict Y + ********/ + boolean is_strictsubset(AttributSet Y) { + if ((m_at.size()) >= Y.size()) + return false; + else + return (Y.m_at.containsAll(this.m_at)); + } + + /******** Renvoie true si l'attributSet X est inclus dans Y ********/ + boolean is_subset(AttributSet Y) { + return (Y.m_at.containsAll(this.m_at)); + } + + int containsSubSet(AttributSet Y) { + // int curAttr=0; + Iterator iter = m_at.iterator(); + Iterator iterY = Y.m_at.iterator(); + int curr = -1, currY = iterY.next(); + while (iterY.hasNext()) { + while (iter.hasNext() && ((curr = iter.next()) < currY)) { + } + + if (currY != curr) + return 0; + else + iterY.next(); + } + return 1; + } + + /* don't use, prefer the function based on the std methods, below */ + int containsSubSetAndRightPart(AttributSet Y, int rhs, MutableInt countRightPart) { + boolean foundRightPart = false; + Iterator iter = m_at.iterator(); + Iterator iterY = Y.m_at.iterator(); + int curr = -1, currY; + while (iterY.hasNext()) { + currY = iterY.next(); + + while (iter.hasNext() && ((curr = iter.next()) < currY)) + if (curr == rhs) + foundRightPart = true; + + if (currY != curr) + return 0; + else if (curr == rhs) + foundRightPart = true; + } + if (foundRightPart) + countRightPart.add(this.m_count); // update of right part cpt if + // found + else // if not found maybe the right part is greater than the last value + // checked in the loop + { + while (iter.hasNext() && ((curr = iter.next()) < rhs)) { + } // so check the rest + if (curr == rhs) + countRightPart.add(this.m_count); + } + + return m_count; + } + + /* + * Check that the attribuSet contains or not the attributset Y. Return m_count + * if it contains it nor 0 + */ + int containsSubSetAndRightPartStd(AttributSet Y, int rhs, MutableInt countRightPart) { + boolean foundleftPart = this.m_at.containsAll(Y.m_at); + if (foundleftPart) { + if (this.m_at.contains(rhs)) + countRightPart.add(this.m_count); + return m_count; + } + + return 0; + } + + /******** Renvoie true si l'attributSet X contient Y ********/ + boolean is_superset(AttributSet Y) { + return (this.m_at.containsAll(Y.m_at)); + } + + /******** Renvoie true si l'attributSet X égal Y ********/ + boolean is_equal(AttributSet Y) { + int size = 0; + if ((size = this.m_at.size()) == Y.size()) { + /* + * for (int i=0; i iter = m_at.iterator(); + while (iter.hasNext()) + if (!Y.m_at.contains(iter.next())) + return false; + } else + return false; + + return true; + } + + /*** GETTERS AND SETTERS ***/ + public int getM_count() { + return m_count; + } + + public void setM_count(int m_count) { + this.m_count = m_count; + } + + public TreeSet getM_at() { + return m_at; + } + + public void setM_at(TreeSet m_at) { + this.m_at = m_at; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributeCalculation.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributeCalculation.java new file mode 100644 index 0000000..0c3525c --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/AttributeCalculation.java @@ -0,0 +1,489 @@ +package fr.ensma.lias.rql.dfg; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.TreeSet; + +import fr.ensma.lias.rql.dfg.KnownException; +import fr.ensma.lias.rql.dfg.Set_AttributSet; +import fr.ensma.lias.rql.dfg.ThreadRunException; + +/** + * @author Benjamin GOURIOU + */ +public class AttributeCalculation implements Runnable { + + private Set_AttributSet m_inf; // Inf + + private Set_AttributSet m_cinf; // Complementaires de Inf + + private Set_AttributSet m_lhs; // lhs + + private AttributSet m_rhs; // rhs + + private Dfg m_appli; + + private int m_supp[]; + + private Set_AttributSet m_base; + + private int m_A; + + private File m_fileCinf = null; + + private File m_fileRet = null; + + private BufferedReader m_reader = null; + + private BufferedWriter m_writer = null; + + private Process m_process = null; + + private long calculInfTime = 0; + + private long concatRulesCGLTime = 0; + + private long calculCInfTime = 0; + + private long calculLhsUnoTime = 0; + + private long writeRulesCCTime = 0; + + private double supportSeuil = 0; + + private double confidenceSeuil = 0; + + public AttributeCalculation(Dfg appli, int A, double support, double confidence) { + m_inf = new Set_AttributSet(); + m_cinf = new Set_AttributSet(); + m_lhs = new Set_AttributSet(); + this.supportSeuil = support; + this.confidenceSeuil = confidence; + m_appli = appli; + m_supp = appli.m_supp; + m_base = appli.m_base; + m_A = A; + } + + @Override + public void run() { + try { + CalculRegles(); + m_appli.addTimes(calculInfTime, concatRulesCGLTime, calculCInfTime, calculLhsUnoTime, writeRulesCCTime); + } catch (Exception ex) { + ex.printStackTrace(); + ThreadRunException exception = new ThreadRunException(ex, this.m_A); + this.m_appli.setThreadException(exception); + throw exception; + } + } + + /** + * Calcul des regles pour chaque attribut central A + * + * @throws Exception + */ + void CalculRegles() throws Exception { + long start = System.currentTimeMillis(); + calculInf(); + long end = System.currentTimeMillis(); + calculInfTime = end - start; + start = end; + + // insertion des regles approximatives + StringBuilder builder = concatRulesCGL(); + m_appli.writeInStream(builder); + builder = null; + end = System.currentTimeMillis(); + concatRulesCGLTime = end - start; + start = end; + + // System.out.println("Calcul de CInf(A) : complémentaires de Inf(A)"); + StringBuilder sbCinf = calculCInf(); + m_inf.clear(); + end = System.currentTimeMillis(); + calculCInfTime = end - start; + start = end; + + // System.out.println("Calcul de lhs(A) : transmin, parties gauches des + // règles"); + /* + * double t1 = System.currentTimeMillis(); + */ + try { + this.calculLhsUnoTakeaki(sbCinf); + } catch (KnownException ex) { + throw ex; + } catch (Exception ex) { + throw new Exception("Lhs_Uno : Unknown exception caught caused the fail of left parts rules generation."); + } + end = System.currentTimeMillis(); + calculLhsUnoTime = end - start; + start = end; + this.writeRulesCC(); + end = System.currentTimeMillis(); + writeRulesCCTime = end - start; + start = end; + + } + + /******** + * Calcul de Inf(A) : plus grds elements de "m_base" ne contenant pas A + ********/ + void calculInf() { + ArrayList tmpArray = m_base.getM_sos(); + for (int i = 0; i < tmpArray.size(); i++) { + AttributSet current = tmpArray.get(i); + if (!current.find(m_A)) + m_inf.InsertIfThisSetMaximal(current); + } + } + + /******** FIN ********/ + + /******** Calcul de CInf(A) : complémentaires de Inf(A) ********/ + private StringBuilder calculCInf() { + + StringBuilder builder = new StringBuilder(""); + + ArrayList complementaire = new ArrayList(); + int nbattr = m_appli.getM_nbattr(); + for (int i = 0; i < nbattr; i++) { + complementaire.add(i); + } + + // R1 : RESTRICTION pour éviter les règles du type A -> A + complementaire.remove(new Integer(m_A)); + + // Pour tout élément de m_inf + for (int i = 0; i < m_inf.size(); i++) { + TreeSet tmpAl = new TreeSet(); + TreeSet current = m_inf.getM_sos().get(i).getM_at(); + + for (int iComp = 0; iComp < complementaire.size(); iComp++) { + Integer curr = complementaire.get(iComp); + if (!current.contains(curr)) + tmpAl.add(curr); + } + + Iterator iter = tmpAl.iterator(); + while (iter.hasNext()) + builder.append(iter.next()).append(' '); + builder.append('\n'); + } + + return builder; + } + + /******** FIN ********/ + + /******** Calcul de lhs(A) : transmin, parties gauches des règles ********/ + void calculLhsUnoTakeaki(StringBuilder sbuild) throws Exception { + + AttributSet transversal; + + m_lhs.clear(); + + if (sbuild.length() != 0) { + long thread = Thread.currentThread().getId(); + + m_fileCinf = new File(new File(m_appli.getM_fileOut()).getParentFile().getCanonicalPath() + File.separator + + "temp_mcinf_" + thread + ".dat"); + String fileOut = new File(m_appli.getM_fileOut()).getParentFile().getCanonicalPath() + File.separator + + "retLHS_" + thread + ".txt"; + + m_fileRet = new File(fileOut); + FileWriter fwrit = null; + try { + fwrit = new FileWriter(m_fileCinf, false); + m_writer = new BufferedWriter(fwrit); + } catch (IOException ex) { + throw new KnownException("Lhs_Uno : Impossible to create the cinf file, incorrect path."); + } + + try { + m_writer.write(sbuild.toString()); + m_writer.flush(); + m_writer.close(); + fwrit.close(); + } catch (IOException ex) { + m_fileCinf.delete(); + throw new KnownException("Lhs_Uno : Error during the writing of cinf data in the file."); + } + + try { + String params[] = { m_appli.getM_exePath(), "0", m_fileCinf.getAbsolutePath(), fileOut, "base", + m_appli.getM_fileIn(), (m_appli.isM_lineNbInFile() ? "" : ("" + m_appli.getM_nbligne())) }; + + System.out.println(params); + m_process = Runtime.getRuntime().exec(params); + + m_process.waitFor(); + + } catch (IOException ex) { + throw new KnownException("shd : Execution of shd has failed, error during the execution."); + } + + FileReader fread = null; + try { + fread = new FileReader(fileOut); + m_reader = new BufferedReader(fread); + + String line; + while ((line = m_reader.readLine()) != null) { + AttributSet atr = new AttributSet(line); + m_lhs.push_back(atr); + } + + m_reader.close(); + fread.close(); + m_fileRet.delete(); + m_fileCinf.delete(); + + } catch (IOException ex) { + throw new KnownException("Lhs_Uno : Error during the reading of shd's left parts rules."); + } + + } else { + transversal = new AttributSet(new TreeSet()); + m_lhs.push_back(transversal); + } + + } + + /******** Calcul de rhs(A) : parties droites des règles ********/ + void calculRhs() { + // Intersection des éléments de la base qui contiennent A + // this.m_rhs.clear(); + boolean first = true; + + for (int it1 = 0; it1 < m_base.getM_sos().size(); it1++) { + AttributSet curIt1 = m_base.getM_sos().get(it1); + // Si l'attribut A est inclu dans l'element de la base + if (curIt1.find(m_A)) { + // Premier élément trouvé + if (first == true) { + Iterator iter = curIt1.getM_at().iterator(); + while (iter.hasNext()) { + Integer val = iter.next(); + // si l'attribut n'a pas déjà été traité + if (!(m_appli.m_centr[val] == true)) + m_rhs.insert(val); + } + first = false; + } else { + // On insert l'element de la base, dans m_union_rhs + TreeSet tmpArray = new TreeSet(); + for (Integer currentInt : m_rhs.getM_at()) { + if (curIt1.getM_at().contains(currentInt)) + tmpArray.add(currentInt); + } + m_rhs.clear(); + for (Integer currentInt : tmpArray) + m_rhs.insert(currentInt); + } + } + } + // R2 : RESTRICTION pour éviter les règles du type A -> A + m_rhs.erase(m_A); + } + + public StringBuilder concatRulesCGL() { + // CGL + StringBuilder sbRules = new StringBuilder(""); + int supA = m_supp[m_A]; + int nbligne = m_appli.getM_nbligne(); + int taille_max = m_appli.getM_taille_max(); + + for (int iMinf = 0; iMinf < m_inf.size(); iMinf++) { + AttributSet curMinf = m_inf.getM_sos().get(iMinf); + if (curMinf.size() == 0) { + // sbRules.append("-1\t").append(m_A).append('\t'); + sbRules.append("-1 =>\t").append(m_A).append('\t'); + sbRules.append(nbligne).append('\t').append(nbligne).append('\t'); + sbRules.append(supA).append('\t').append(supA).append('\n'); + } else if (curMinf.size() <= taille_max) { + AttributSet lhs_rhs = new AttributSet(curMinf); + lhs_rhs.insert(m_A); + + int supXY = m_base.comptage(lhs_rhs); + int supX = m_base.comptage(curMinf); + double confidenceXY; + if (supX != 0) { + confidenceXY = (double) supXY / (double) supX; + } else { + confidenceXY = 0; + } + System.out.println("confidence:" + confidenceXY); + + // R4 : RESTRICTION aux parties gauches telles que suppX > 0 // supX != 0 + if (supXY != 0 && ((double) supXY / nbligne) >= supportSeuil && confidenceXY != 0 + && confidenceXY >= confidenceSeuil) { + for (Integer curVal : curMinf.getM_at()) + sbRules.append(curVal).append(' '); + sbRules.append("=>\t").append(m_A).append('\t').append(nbligne).append('\t'); + sbRules.append(supX).append('\t').append(supA).append('\t').append(supXY).append('\n'); + } + } + } + + return sbRules; + } + + public void writeRulesCC() throws Exception { + // CC + // lhs => A + StringBuilder sbRules = new StringBuilder(""); + int supA = m_supp[m_A]; + int cpt = 50000; + int nbligne = m_appli.getM_nbligne(); + int taille_max = m_appli.getM_taille_max(); + + for (int iMlhs = 0; iMlhs < m_lhs.size(); iMlhs++) { + AttributSet curMlhs = m_lhs.getM_sos().get(iMlhs); + if (curMlhs.size() == 0) { + // sbRules.append("-1\t").append(m_A).append('\t'); + sbRules.append("-1 =>\t").append(m_A).append('\t'); + sbRules.append(nbligne).append('\t').append(nbligne).append('\t'); + sbRules.append(supA).append('\t').append(supA).append('\n'); + cpt--; + } else if (curMlhs.size() <= taille_max) { + /* + * avec calcul du support + */ + MutableInt supXY = new MutableInt(); + int supX = m_base.new_comptage(curMlhs, m_A, supXY); + double confidenceXY; + if (supX != 0) { + confidenceXY = (double) supXY.getValue() / (double) supX; + } else { + confidenceXY = 0; + } + System.out.println("confidenceExact:" + confidenceXY); + /* + * sans calcul du support int supXY = 2; int supX = 2; + */ + // R4 : RESTRICTION aux parties gauches telles que suppX > 0 + if (supXY.getValue() != 0 && (double) supXY.getValue() / nbligne >= supportSeuil && confidenceXY != 0 + && confidenceXY >= confidenceSeuil) { + for (Integer curVal : curMlhs.getM_at()) + sbRules.append(curVal).append(' '); + // sbRules.append('\t').append(m_A).append('\t').append(nbligne).append('\t'); + sbRules.append("=>\t").append(m_A).append('\t').append(nbligne).append('\t'); + sbRules.append(supX).append('\t').append(supA).append('\t').append(supXY).append('\n'); + cpt--; + } + } + + if (cpt <= 0) { + m_appli.writeInStream(sbRules); + cpt = 50000; + sbRules = new StringBuilder(""); + } + + } + + // A => rhs + // Calculs inutiles si tous les attributs sont centraux + if (m_appli.getM_nbcentral() < m_appli.getM_nbattr()) { + // for (int iMrhs=0; iMrhs it = m_rhs.getM_at().iterator(); + while (it.hasNext()) { + Integer curVal = it.next(); + TreeSet tmpArray = new TreeSet(); + tmpArray.add(m_A); + tmpArray.add(curVal); + AttributSet lhs_rhs = new AttributSet(tmpArray); + int supXY = m_base.comptage(lhs_rhs); // supXY : support partie + // gauche + partie droite + + int supY = m_supp[curVal]; // supX : support partie gauche + // sbRules.append(m_A).append('\t').append(curVal).append('\t'); + sbRules.append(m_A).append(" =>\t").append(curVal).append('\t'); + sbRules.append(nbligne).append('\t').append(supA).append('\t').append(supY); + sbRules.append('\t').append(supXY).append('\n'); + cpt--; + } + } + + if (cpt < 50000) + m_appli.writeInStream(sbRules); + + } + + /******** FIN ********/ + + /******** Renvoie true si l'intersection est vide ********/ + boolean is_intersection_empty(AttributSet F, AttributSet E) { + if (F.size() < E.size()) { + for (Integer curVal : F.getM_at()) + if (E.find(curVal)) + return false; + return true; + } else { + for (Integer curVal : E.getM_at()) + if (F.find(curVal)) + return false; + return true; + } + } + + /******** FIN ********/ + + /******** + * Permet de supprimer les fichiers textes utiles pour UNOLHS + ********/ + void cleanUnoTempFiles() { + if (m_process != null) { + m_process.destroy(); + } + + try { + Thread.sleep(200); + } catch (InterruptedException ex) { + /* ignore exception */ + ex.printStackTrace(); + } + + try { + if (m_reader != null) { + m_reader.close(); + } + if (m_writer != null) { + m_writer.close(); + } + if (this.m_fileCinf != null && this.m_fileCinf.exists()) { + m_fileCinf.delete(); + } + if (this.m_fileRet != null && this.m_fileRet.exists()) { + m_fileRet.delete(); + } + } catch (IOException ex) { + /* ignore exception */ + ex.printStackTrace(); + } + } + + public Set_AttributSet getM_inf() { + return m_inf; + } + + public Set_AttributSet getM_cinf() { + return m_cinf; + } + + public Set_AttributSet getM_lhs() { + return m_lhs; + } + + public AttributSet getM_rhs() { + return m_rhs; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Dfg.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Dfg.java new file mode 100644 index 0000000..499baa0 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Dfg.java @@ -0,0 +1,418 @@ +package fr.ensma.lias.rql.dfg; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.TreeSet; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.logging.Level; +import java.util.logging.Logger; + +import fr.ensma.lias.rql.dfg.MyUncaughtExceptionHandler; +import fr.ensma.lias.rql.dfg.NotifyingBlockingThreadPoolExecutor; +import fr.ensma.lias.rql.dfg.Set_AttributSet; +import fr.ensma.lias.rql.dfg.ThreadRunException; + +/** + * @author Gouriou Benjamin + */ +public class Dfg { + + private int m_progress = 0; + + private int m_taille_max; // taille maximale de la partie gauche + + private int m_nbattr; // nb d'attributs dans le trie + + private int m_nbligne = 0; // nb de lignes + + private int m_nbcentral; // nb d'attributs centraux + + private ArrayList m_central; // Attributs centraux + + boolean m_centr[]; // pour chaque attribut, true si il est central + + int m_supp[]; // Supports des attributs + + Set_AttributSet m_base; // Base du système de fermeture + + private String m_fileIn; + + private String m_fileOut; + + private String m_execpath; + + private BufferedWriter m_buffer = null; + + private FileWriter m_writer = null; + + private boolean m_lineNbInFile = false; + + private final Lock m_lock = new ReentrantLock(); + + private ThreadRunException _threadException = null; + + static final int THREAD_POOL_SIZE = 4; + + static final int THREAD_QUEUE_SIZE = 8; + + static final int THREAD_KEEPALIVE = 15; + + static final TimeUnit THREAD_KEEPALIVE_UNIT = TimeUnit.SECONDS; + + public long loadTime = 0; + + public long calculInfTime = 0; + + public long concatRulesCGLTime = 0; + + public long calculCInfTime = 0; + + public long calculLhsUnoTime = 0; + + public long writeRulesCCTime = 0; + + public long writeTime = 0; + + public double supportSeuil = 0; + public double confidenceSeuil = 0; + + public Dfg(String fileIn, String fileOut, double support, double confidence, int tailleMax, String m_execpath) { + m_base = new Set_AttributSet(); + // ******************************* + this.m_taille_max = tailleMax; + this.m_fileOut = fileOut; + this.m_fileIn = fileIn; + this.m_execpath = m_execpath; + this.supportSeuil = support; + this.confidenceSeuil = confidence; + } + + /* + * void init(int nbOcc, int[] agr) { TreeSet tmpArray = new + * TreeSet(); for (int cur : agr) { tmpArray.add(cur); } AttributSet ag + * = new AttributSet(); ag.setM_count(nbOcc); ag.setM_at(tmpArray); + * m_base.push_back(ag); } + */ + + /******** Chargement de m_base, m_central et m_supp ********/ + int charger() throws Exception { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(m_fileIn)); + } catch (FileNotFoundException ex) { + throw new Exception("DFGApp : Specified entry base file does not exist."); + } + + String line = ""; + try { + line = reader.readLine(); + m_nbcentral = Integer.valueOf(line); + System.out.println("m_nbcentral : " + m_nbcentral); + m_central = new ArrayList(m_nbcentral); + } catch (IOException ex) { + reader.close(); + throw new Exception("DFGApp : Can't get central genes number. File format is incorrect."); + } + + try { + line = reader.readLine(); + String tmp[] = line.split(" "); + for (String curr : tmp) + m_central.add(Integer.valueOf(curr)); + } catch (NumberFormatException e) { + reader.close(); + throw new Exception("DFGApp : Invalide caracter in the list of central gene."); + } catch (IOException e) { + reader.close(); + throw new Exception("DFGApp : Error during the reading of central genes list."); + } + + try { + line = reader.readLine(); + String tmp[] = line.split(" "); + m_nbattr = Integer.valueOf(tmp[0]); + m_nbligne = Integer.valueOf(tmp[1]); + } catch (IOException ex) { + reader.close(); + throw new Exception("DFGApp : Error during the reading of attributes and lines number."); + } + + m_centr = new boolean[m_nbattr]; + m_supp = new int[m_nbattr]; + System.out.println("Nombre d'attributs : " + m_nbattr); + + if (m_nbligne != 0) + m_lineNbInFile = true; + + for (int i = 0; i < m_nbcentral; i++) + m_centr[m_central.get(i)] = true; + + // Chargement de la base (a partir de la 3eme ligne) + int numAttribut; + int countElt; + AttributSet ag = null; + TreeSet tmpArray; + try { + while ((line = reader.readLine()) != null) { + ag = new AttributSet(); + tmpArray = new TreeSet(); + String tmp[] = line.split(" ", 2); + countElt = Integer.parseInt(tmp[0]); + if (!m_lineNbInFile) + m_nbligne += countElt; + ag.setM_count(countElt); + if (tmp.length == 2) { + String val[] = tmp[1].split(" "); + for (String curr : val) { + numAttribut = Integer.parseInt(curr); + tmpArray.add(numAttribut); + m_supp[numAttribut] += countElt; + } + } + ag.setM_at(tmpArray); + m_base.push_back(ag); + } + for (int i = 0; i < m_supp.length; i++) { + System.out.println(m_supp[i]); + } + } catch (IOException ex) { + throw new Exception("DFGApp : Error during the reading of base lines in the file."); + } + + System.out.println("Nombre de lignes : " + m_nbligne); + + reader.close(); + + return 0; + } + + public int execute() throws Exception { + /* + * double t1, t2; t1=System.currentTimeMillis(); + */ + Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); + File file = new File(m_fileIn); + + if (!file.exists() || m_taille_max <= 0) + throw new Exception("DFGApp: Error in entry parameters. Rules generation aborted."); + + if (charger() != 0) + throw new Exception("DFGApp: Error during the reading of the file. Rules generation aborted."); + + /* + * String path = System.getenv("WebNetwork"); //Windows if + * (System.getProperty("os.name").contains("Windows")) m_exePath = path + + * "\\shd.exe"; else m_exePath = path + "shd"; + */ + + // Mac + // m_exePath = path + "shd"; + + // System.out.println("execution: "+m_exePath); + + // ***************************************************************** + // ***************************************** Parallel calculation + // ***************************************************************** + + // ----------------------------------------------------------------- + // NotifyingBlockingThreadPoolExecutor initialization parameters + + // ----------------------------------------------------------------- + // Create the NotifyingBlockingThreadPoolExecutor + NotifyingBlockingThreadPoolExecutor m_threadPoolExecutor = new NotifyingBlockingThreadPoolExecutor( + THREAD_POOL_SIZE, THREAD_QUEUE_SIZE, THREAD_KEEPALIVE, THREAD_KEEPALIVE_UNIT); + + // ----------------------------------------------------------------- + // Stack and execute the tasks + for (int i = 0; i < this.m_nbcentral && _threadException == null; i++) { + AttributeCalculation currentAttr = new AttributeCalculation(this, m_central.get(i), supportSeuil, + confidenceSeuil); + System.out.println("checkpoint"); + m_threadPoolExecutor.execute(currentAttr); + // this.m_progress=m_threadPoolExecutor.getTasksCompleted(); + this.m_progress = i; + System.out.println((i * 100 / this.m_nbcentral) + "%"); + } + + if (_threadException != null) { + this.closeStream(); + throw _threadException; + } + + // ----------------------------------------------------------------- + // Wait for the last tasks to be done + try { + boolean done = false; + do { + // System.out.println("waiting for the last tasks to finish"); + if (!m_threadPoolExecutor.isShutdown()) + done = m_threadPoolExecutor.await(5, TimeUnit.SECONDS); + else + done = true; + // this.m_progress=m_threadPoolExecutor.getTasksCompleted(); + } while (!done); + } catch (InterruptedException e) { + throw new Exception("DFGApp : Unknown error during the execution of the process!"); + } + + if (_threadException != null) { + this.closeStream(); + throw _threadException; + } + + m_threadPoolExecutor.shutdown(); + /* + * t2 = System.currentTimeMillis(); System.out.println("Temps d'execution : "+ + * (t2 - t1)); + */ + this.closeStream(); + + return 0; + } + + /* + * public static void main(String[] args) { if (args.length<3) { + * System.err.println("Erreur nombre de paramètres incorrects"); return; } + * + * Dfg app = new Dfg(args[0],args[1],Integer.valueOf(args[2])); try { + * app.execute(); } catch (Exception ex) { + * //Logger.getLogger(Appli.class.getName()).log(Level.SEVERE, null, ex); + * System.err.println(ex.getMessage()); } } + */ + + public BufferedWriter getStream() { + if (m_buffer == null) { + File fOut = new File(this.m_fileOut); + if (fOut.exists()) + fOut.delete(); + try { + this.m_writer = new FileWriter(m_fileOut, true); + this.m_buffer = new BufferedWriter(m_writer); + } catch (IOException ex) { + ex.printStackTrace(); + Logger.getLogger(Dfg.class.getName()).log(Level.SEVERE, null, ex); + } + } + return m_buffer; + } + + public synchronized void writeInStream(StringBuilder builder) throws Exception { + m_lock.lock(); + BufferedWriter wr = this.getStream(); + try { + wr.write(builder.toString()); + wr.flush(); + } catch (IOException ex) { + throw new Exception("DFGApp : Error during rules writing in file."); + } finally { + m_lock.unlock(); + } + + } + + public synchronized void closeStream() { + try { + m_buffer.close(); + m_writer.close(); + } catch (IOException ex) { + ex.printStackTrace(); + System.err.println("Erreur à la fermeture du fichier de regles."); + } + } + + public int getProgress() { + return (int) Math.ceil((this.m_progress / ((float) this.m_nbcentral)) * 100); + } + + /* + * public int killExecution() { try { + * m_threadPoolExecutor.setExecutionKilled(true); this.setThreadException(new + * ThreadRunException(new Exception("User killed execution"),-1)); + * m_threadPoolExecutor.shutdownNow(); if + * (!m_threadPoolExecutor.awaitTermination(3, TimeUnit.SECONDS)) + * System.err.println("Pool did not terminate"); } catch (InterruptedException + * ex) { ex.printStackTrace(); + * Logger.getLogger(Dfg.class.getName()).log(Level.SEVERE, null, ex); return -1; + * } return 0; } + */ + + /***** GETTERS AND SETTERS *****/ + + public int getM_taille_max() { + return m_taille_max; + } + + public void setM_taille_max(int m_taille_max) { + this.m_taille_max = m_taille_max; + } + + public int getM_nbattr() { + return m_nbattr; + } + + public int getM_nbligne() { + return m_nbligne; + } + + public int getM_nbcentral() { + return m_nbcentral; + } + + public ArrayList getM_central() { + return m_central; + } + + public Set_AttributSet getM_base() { + return m_base; + } + + public boolean[] getM_centr() { + return m_centr; + } + + public int[] getM_supp() { + return m_supp; + } + + public String getM_fileIn() { + return m_fileIn; + } + + public String getM_fileOut() { + return m_fileOut; + } + + public String getM_exePath() { + return m_execpath; + } + + public boolean isM_lineNbInFile() { + return m_lineNbInFile; + } + + public Exception getThreadException() { + return _threadException; + } + + public synchronized void setThreadException(ThreadRunException threadException) { + this._threadException = threadException; + } + + public synchronized void addTimes(long calculInf, long concatRulesCGL, long calculCInf, long calculLhsUno, + long writeRulesCC) { + calculInfTime += calculInf; + concatRulesCGLTime += concatRulesCGL; + calculCInfTime += calculCInf; + calculLhsUnoTime += calculLhsUno; + writeRulesCCTime += writeRulesCC; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KilledProcessException.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KilledProcessException.java new file mode 100644 index 0000000..f44398c --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KilledProcessException.java @@ -0,0 +1,15 @@ +package fr.ensma.lias.rql.dfg; + +import java.util.concurrent.RejectedExecutionException; + +/** + * @author Gouriou Benjamin + */ +public class KilledProcessException extends RejectedExecutionException { + + private static final long serialVersionUID = -6689075757022563066L; + + KilledProcessException(String details) { + super(details); + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KnownException.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KnownException.java new file mode 100644 index 0000000..e25716a --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/KnownException.java @@ -0,0 +1,18 @@ +package fr.ensma.lias.rql.dfg; + +/** + * @author Gouriou Benjamin + */ +public class KnownException extends Exception { + + private static final long serialVersionUID = -1052570947087566045L; + + KnownException(String details) { + super(details); + } + + KnownException(Exception exception) { + super(exception); + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MutableInt.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MutableInt.java new file mode 100644 index 0000000..9bc3ab6 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MutableInt.java @@ -0,0 +1,46 @@ +package fr.ensma.lias.rql.dfg; + +/** + * @author Gouriou Benjamin + */ +public class MutableInt { + + private int value; + + public MutableInt() { + value = 0; + } + + public MutableInt(int val) { + value = val; + } + + public void increment() { + value++; + } + + public void decrement() { + value--; + } + + public void add(int delta) { + value += delta; + } + + public void minus(int delta) { + value -= delta; + } + + public int getValue() { + return value; + } + + public boolean estEgal(int val) { + return val == value; + } + + @Override + public String toString() { + return Integer.toString(value); + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MyUncaughtExceptionHandler.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MyUncaughtExceptionHandler.java new file mode 100644 index 0000000..b0171de --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/MyUncaughtExceptionHandler.java @@ -0,0 +1,11 @@ +package fr.ensma.lias.rql.dfg; + +/** + * @author Gouriou Benjamin + */ +public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { + + @Override + public void uncaughtException(Thread t, Throwable e) { + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/NotifyingBlockingThreadPoolExecutor.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/NotifyingBlockingThreadPoolExecutor.java new file mode 100644 index 0000000..cacabbc --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/NotifyingBlockingThreadPoolExecutor.java @@ -0,0 +1,317 @@ +package fr.ensma.lias.rql.dfg; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.Semaphore; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * This class is a specialized extension of the ThreadPoolExecutor class. + * + * Two functionalities had been added to this subclass. 1) The execute method of + * the ThreadPoolExecutor will block in case the queue is full and only unblock + * when the queue is dequeued - that is a task that is currently in the queue is + * removed and handled by the ThreadPoolExecutor. 2) Client code can await for + * the event of all tasks beeing run to conclusion. Client code which actively + * chose to wait for this occurrence should call await on the instance of his + * ThreadPoolExecutor. This differs from awaitTermination as it does not require + * any call to shutdown. + * + * Code example: + * + * NotifyingBlockingThreadPoolExecutor threadPoolExecutor = new + * NotifyingBlockingThreadPoolExecutor(5, ,10, 15, TimeUnit.SECONDS); + * + * for (int i = 0; i < 5000; i++) { threadPoolExecutor.execute(...) } + * + * try { threadPoolExecutor.await(); } catch (InterruptedException e) { // + * Handle error } + * + * System.out.println("Done!"); + * + * The example above shows how 5000 tasks are run within 5 threads. The line + * with 'System.out.println("Done!");' will not run until such a time when all + * the tasks given to the thread pool have concluded. their run. + * + * This subclass of ThreadPoolExecutor also takes away the max threads + * capabilities of the ThreadPoolExecutor superclass and internally sets the + * amount of maximum threads to be the size of the core threads. This is done + * since threads over the core size and under the max are instantiated only once + * the queue is full, but the NotifyingBlockingThreadPoolExecutor will block + * once the queue is full. + * + * @author Yaneeve Shekel & Amir Kirsh + */ +public class NotifyingBlockingThreadPoolExecutor extends ThreadPoolExecutor { + + /** + * Counts the number of current tasks in process + */ + private AtomicInteger tasksInProcess = new AtomicInteger(); + + /** + * This is the Synchronizer instance that is used in order to notify all + * interested code of when all the tasks that have been submitted to the + * execute() method have run to conclusion. This notification can occur a + * numerous amount of times. It is all up to the client code. Whenever the + * ThreadPoolExecutor concludes to run all the tasks the Synchronizer object + * will be notified and will in turn notify the code which is waiting on it. + */ + private Synchronizer synchronizer = new Synchronizer(); + + private final Semaphore semaphore; + + /** + * This constructor is used in order to maintain the first functionality + * specified above. It does so by using an ArrayBlockingQueue and the + * BlockThenRunPolicy that is defined in this class. Using this constructor, + * waiting time on new task insertion is unlimited. + * + * @param poolSize is the amount of threads that this pool may have alive + * at any given time. + * @param queueSize is the size of the queue. This number should be at least + * as the pool size to make sense (otherwise there are + * unused threads), thus if the number sent is smaller, the + * poolSize is used for the size of the queue. Recommended + * value is twice the poolSize. + * @param keepAliveTime is the amount of time after which an inactive thread is + * terminated. + * @param unit is the unit of time to use with the previous parameter. + */ + public NotifyingBlockingThreadPoolExecutor(int poolSize, int queueSize, long keepAliveTime, TimeUnit unit) { + + super(poolSize, // Core size + poolSize, // Max size + keepAliveTime, unit, new ArrayBlockingQueue(Math.max(poolSize, queueSize)) // not + // smaller + // than + // the + // poolSize + // (to + // avoid + // redundant + // threads) + ); + this.semaphore = new Semaphore(Math.max(poolSize, queueSize), true); + super.allowCoreThreadTimeOut(true); // Time out the core threads. + } + + /** + * Before calling super's version of this method, the amount of tasks which are + * currently in process is first incremented. + * + * @see java.util.concurrent.ThreadPoolExecutor#execute(Runnable) + */ + @Override + public void execute(Runnable task) { + // count a new task in process + tasksInProcess.incrementAndGet(); + boolean acquired = false; + do { + try { + semaphore.acquire(); + acquired = true; + } catch (InterruptedException e) { + // e.printStackTrace(); + } + } while (!acquired); + + try { + super.execute(task); + } catch (RuntimeException e) { // specifically handle + // RejectedExecutionException + tasksInProcess.decrementAndGet(); + e.printStackTrace(); + semaphore.release(); + throw e; + } catch (Error e) { + tasksInProcess.decrementAndGet(); + e.printStackTrace(); + semaphore.release(); + throw e; + } + } + + /** + * After calling super's implementation of this method, the amount of tasks + * which are currently in process is decremented. Finally, if the amount of + * tasks currently running is zero the synchronizer's signallAll() method is + * invoked, thus anyone awaiting on this instance of ThreadPoolExecutor is + * released. + * + * @see java.util.concurrent.ThreadPoolExecutor#afterExecute(Runnable, + * Throwable) + */ + @Override + protected void afterExecute(Runnable r, Throwable t) { + + super.afterExecute(r, t); + + // synchronizing on the pool (and actually all its threads) + // the synchronization is needed to avoid more than one signal if two or + // more + // threads decrement almost together and come to the if with 0 tasks + // together + synchronized (this) { + tasksInProcess.decrementAndGet(); + if (tasksInProcess.intValue() == 0) { + synchronizer.signalAll(); + } + } + semaphore.release(); + } + + /** + * Internally calls on super's setCorePoolSize and setMaximumPoolSize methods + * with the given method argument. + * + * @see java.util.concurrent.ThreadPoolExecutor#setCorePoolSize(int) + */ + @Override + public void setCorePoolSize(int corePoolSize) { + super.setCorePoolSize(corePoolSize); + super.setMaximumPoolSize(corePoolSize); + } + + /** + * Does Nothing! + * + * @throws UnsupportedOperationException in any event + * @see java.util.concurrent.ThreadPoolExecutor#setMaximumPoolSize(int) + */ + @Override + public void setMaximumPoolSize(int maximumPoolSize) { + throw new UnsupportedOperationException("setMaximumPoolSize is not supported."); + } + + /** + * Does Nothing! MUST NOT CHANGE OUR BUILT IN RejectedExecutionHandler + * + * @throws UnsupportedOperationException in any event + * @see java.util.concurrent.ThreadPoolExecutor#setRejectedExecutionHandler(RejectedExecutionHandler) + */ + @Override + public void setRejectedExecutionHandler(RejectedExecutionHandler handler) { + throw new UnsupportedOperationException("setRejectedExecutionHandler is not allowed on this class."); + } + + /** + * A blocking wait for this ThreadPool to be in idle state, which means that + * there are no more tasks in the Queue or currently executed by one of the + * threads. BE AWARE that this method may get out from blocking state when a + * task is currently sent to the ThreadPool not from this thread context. Thus + * it is not safe to call this method in case there are several threads feeding + * the TreadPool with tasks (calling execute). The safe way to call this method + * is from the thread that is calling execute and when there is only one such + * thread. Note that this method differs from awaitTemination, as it can be + * called without shutting down the ThreadPoolExecuter. + * + * @throws InterruptedException when the internal condition throws it. + */ + public void await() throws InterruptedException { + synchronizer.await(); + } + + /** + * A blocking wait for this ThreadPool to be in idle state or a certain timeout + * to elapse. Works the same as the await() method, except for adding the + * timeout condition. + * + * @see NotifyingBlockingThreadPoolExecutor#await() for more details. + * @return false if the timeout elapsed, true if the synch event we are waiting + * for had happened. + * @throws InterruptedException when the internal condition throws it. + */ + public boolean await(long timeout, TimeUnit timeUnit) throws InterruptedException { + return synchronizer.await(timeout, timeUnit); + } + + // ==================================================================== + // start of inner private class Synchronizer + // ==================================================================== + + /** + * This inner class serves to notify all interested parties that the + * ThreadPoolExecutor has finished running all the tasks given to its execute + * method. + */ + private class Synchronizer { + + private final Lock lock = new ReentrantLock(); + private final Condition done = lock.newCondition(); + private boolean isDone = false; + + /** + * This PRIVATE method allows the ThreadPoolExecutor to notify all interested + * parties that all tasks given to the execute method have run to conclusion. + */ + private void signalAll() { + + lock.lock(); // MUST lock! + try { + isDone = true; // To help the await method ascertain that it has + // not waken up 'spuriously' + done.signalAll(); + } finally { + lock.unlock(); // Make sure to unlock even in case of an + // exception + } + } + + /** + * This is the inner implementation for supporting the + * NotifyingBlockingThreadPoolExecutor.await(). + * + * @see NotifyingBlockingThreadPoolExecutor#await() for details. + * @throws InterruptedException when the internal condition throws it. + */ + public void await() throws InterruptedException { + + lock.lock(); // MUST lock! + try { + while (!isDone) { // Ascertain that this is not a 'spurious + // wake-up' + done.await(); + } + } finally { + isDone = false; // for next time + lock.unlock(); // Make sure to unlock even in case of an + // exception + } + } + + /** + * This is the inner implementation for supporting the + * NotifyingBlockingThreadPoolExecutor.await(timeout, timeUnit). + * + * @see NotifyingBlockingThreadPoolExecutor#await(long, TimeUnit) for details. + * @throws InterruptedException when the internal condition throws it. + */ + public boolean await(long timeout, TimeUnit timeUnit) throws InterruptedException { + + boolean await_result = false; + lock.lock(); // MUST lock! + boolean localIsDone; + try { + await_result = done.await(timeout, timeUnit); + } finally { + localIsDone = isDone; + isDone = false; // for next time + lock.unlock(); // Make sure to unlock even in case of an + // exception + } + // make sure we return true only if done! + return await_result && localIsDone; + } + } + + // ==================================================================== + // end of inner class Synchronizer + // ==================================================================== + +} \ No newline at end of file diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Set_AttributSet.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Set_AttributSet.java new file mode 100644 index 0000000..dce06e5 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/Set_AttributSet.java @@ -0,0 +1,138 @@ +package fr.ensma.lias.rql.dfg; + +import java.util.ArrayList; +import java.util.Iterator; + +/** + * @author Gouriou Benjamin + */ +public class Set_AttributSet { + + private ArrayList m_sos; + + public Set_AttributSet() { + m_sos = new ArrayList(); + } + + public Set_AttributSet(Set_AttributSet inSet) { + this.clone(inSet); + } + + public final void clone(Object o) { + if (o instanceof Set_AttributSet) { + Set_AttributSet obj = (Set_AttributSet) o; + this.m_sos.clear(); + Iterator iter = obj.m_sos.iterator(); + while (iter.hasNext()) + this.m_sos.add(new AttributSet(iter.next())); + } + } + + public void clear() { + m_sos.clear(); + } + + boolean empty() { + return m_sos.isEmpty(); + } + + int size() { + return m_sos.size(); + } + + void push_back(AttributSet elt) { + m_sos.add(elt); + } + + void eraseElmtAt(int index) { + m_sos.remove(index); + /* + * Iterator iter = m_sos.iterator(); int icpt=0; while(icpt<=index) + * { iter.next(); icpt++; } + * + * iter.remove(); + */ + } + + @Override + public String toString() { + StringBuilder tmp = new StringBuilder("{"); + Iterator iter = this.m_sos.iterator(); + while (iter.hasNext()) { + tmp.append("(").append(iter.next().toString()).append(") "); + } + tmp.append("}\n"); + return tmp.toString(); + } + + /******** Insert un attribut maximal ********/ + void InsertIfThisSetMaximal(AttributSet X) { + boolean encore = true; + boolean premier = true; + int size = m_sos.size(); + for (int i = 0; i < size; i++) { + AttributSet current = m_sos.get(i); + if (X.is_subset(current)) { + encore = false; + return; + } else { + if (current.is_strictsubset(X)) { + if (premier) { + m_sos.set(i, X); + premier = false; + } else { + eraseElmtAt(i); + i--; + size--; + } + } + } + } + + if (encore && premier) { + m_sos.add(X); + } + } + + /******** + * Renvoie true si l'attributSet S est inclus dans un élément du setofSet + ********/ + boolean est_inclus(AttributSet S) { + for (int i = 0; i < m_sos.size(); i++) { + if (S.is_subset(m_sos.get(i))) { + return true; + } + } + return false; + } + + /******** + * Compte le nb de fois qu'apparait un attributSet S dans le setofSet + ********/ + // A REFAIRE EN NE FAISANT QU'UN SEUL PARCOURS DE M_SOS + int comptage(AttributSet S) { + int cpt = 0; + for (int i = 0; i < m_sos.size(); i++) { + AttributSet current = m_sos.get(i); + if (S.is_subset(current)) + cpt += current.getM_count(); + } + return cpt; + } + + int new_comptage(AttributSet S, int rightPart, MutableInt cptRightPart) { + int cpt = 0; + for (int i = 0; i < m_sos.size(); i++) { + AttributSet current = m_sos.get(i); + // cpt+=current.containsSubSetAndRightPart(S,rightPart,cptRightPart); + cpt += current.containsSubSetAndRightPartStd(S, rightPart, cptRightPart); + } + return cpt; + } + + /**** GETTERS AND SETTERS ****/ + public ArrayList getM_sos() { + return m_sos; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/ThreadRunException.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/ThreadRunException.java new file mode 100644 index 0000000..58e8ada --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/dfg/ThreadRunException.java @@ -0,0 +1,29 @@ +package fr.ensma.lias.rql.dfg; + +/** + * @author Gouriou Benjamin + */ +public class ThreadRunException extends RuntimeException { + + private static final long serialVersionUID = 5598083182705789448L; + + private final Exception _parentException; + + private final int _centralGene; + + ThreadRunException(Exception ex, int gene) { + super("DFGApp : Execution has failed for gene " + gene + "--> Generation Process aborted. Details:\n\t" + + ex.getMessage()); + _parentException = ex; + _centralGene = gene; + } + + public Exception getParentException() { + return _parentException; + } + + public int getCentralGene() { + return _centralGene; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/queryconstruction/QueryConstructor.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/queryconstruction/QueryConstructor.java new file mode 100644 index 0000000..6c33cfa --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/queryconstruction/QueryConstructor.java @@ -0,0 +1,94 @@ +package fr.ensma.lias.rql.queryconstruction; + +/** + * @author Bilal REZKELLAH + */ +public class QueryConstructor { + + static final String FINDRULES = "FINDRULES"; + static final String OVER = "OVER"; + static final String SCOPE = "SCOPE"; + static final String WHERE = "WHERE"; + static final String CONDITION_ON_A_IS = "CONDITION ON A IS"; + static final String NULL = " NULL"; + static final String FD = "Functional Dependencies"; + static final String SFD = "Sequential Functional Dependencies"; + static final String MFD = "Metric Functional Dependencies"; + static final String CAR = "Classic Association Rules"; + static final String NV = "Null Values"; + + String constructedQuery = ""; + String attributesList = "[ATTRIBUTES LIST]"; + String dataSet = "[TABLE NAME]"; + String tableName = "[TABLE NAME]"; + String whereScope = "[CONDITION]"; + String conditionalWhere = "[CONDITION]"; + + public QueryConstructor() { + + } + + public String constructquery(String QueryType, String isTable, String isALLData, String sqlQuerie, String tableName, + String subsetWhere, String attributesList, boolean isConditional, String conditionalWhere, + String tolerence) { + + constructedQuery = FINDRULES + "\n" + OVER + " "; + + if (!attributesList.equals("")) { + this.attributesList = attributesList; + } + + constructedQuery += this.attributesList; + constructedQuery += "\n"; + constructedQuery += SCOPE; + if (isTable.equals("table")) { + if (isALLData.equals("Subset")) { + if (!tableName.equals("")) { + this.tableName = tableName; + } + if (!subsetWhere.equals("")) { + this.whereScope = subsetWhere; + } + dataSet = " ( SELECT * FROM " + this.tableName + " " + WHERE + " " + this.whereScope.toUpperCase() + + " )"; + } else if (isALLData.equals("All")) { + if (!tableName.equals("")) { + this.tableName = tableName; + } + dataSet = this.tableName; + } + } else { + dataSet = "( " + sqlQuerie + " )"; + } + if (QueryType.equals(NV)) { + + constructedQuery += " t1 " + this.dataSet + "\n"; + } else { + constructedQuery += " t1, t2 " + this.dataSet + "\n"; + } + + if (isConditional) { + if (!conditionalWhere.equals("")) { + this.conditionalWhere = conditionalWhere; + } + + constructedQuery += WHERE + " " + this.conditionalWhere.toUpperCase() + "\n"; + + } + constructedQuery += CONDITION_ON_A_IS; + if (QueryType.equals(NV)) { + + constructedQuery += " t1.A is " + NULL; + } else if (QueryType.equals(FD)) { + constructedQuery += " t1.A = t2.A"; + } else if (QueryType.equals(SFD)) { + constructedQuery += " t1.A > t2.A"; + } else if (QueryType.equals(MFD)) { + constructedQuery += " 2 * ABS(t1.A - t2.A) / (t1.A + t2.A) < " + tolerence; + } else if (QueryType.equals(CAR)) { + constructedQuery += " t1.A = 1 "; + } + return constructedQuery; + + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/CheckResult.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/CheckResult.java new file mode 100644 index 0000000..b99fe57 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/CheckResult.java @@ -0,0 +1,95 @@ +package fr.ensma.lias.rql.rulecheck; + +import fr.ensma.lias.rql.sql.SQLResultsRow; + +/** + * @author Bilal REZKELLAH + */ +public class CheckResult { + + private String isTrue; + + private String support; + + private String confidence; + + private int counterExamplesNB; + + public SQLResultsRow counterExamples; + + public SQLResultsRow counterExamples2; + + public SQLResultsRow counterExamples3; + + public String getSupport() { + return support; + } + + public void setSupport(String support) { + this.support = support; + } + + public String getConfidence() { + return confidence; + } + + public int getCounterExamplesNB() { + return counterExamplesNB; + } + + public void setCounterExamplesNB(int counterExamplesNB) { + this.counterExamplesNB = counterExamplesNB; + } + + public void setConfidence(String confidence) { + this.confidence = confidence; + } + + public CheckResult(String isTrue, String support, String confidence, int counterExamplesNB, + SQLResultsRow counterExamples, SQLResultsRow counterExamples2, SQLResultsRow counterExamples3) { + super(); + this.isTrue = isTrue; + this.support = support; + this.confidence = confidence; + this.counterExamplesNB = counterExamplesNB; + this.counterExamples = counterExamples; + this.counterExamples2 = counterExamples2; + this.counterExamples3 = counterExamples3; + + } + + public SQLResultsRow getCounterExamples2() { + return counterExamples2; + } + + public void setCounterExamples2(SQLResultsRow counterExamples2) { + this.counterExamples2 = counterExamples2; + } + + public SQLResultsRow getCounterExamples3() { + return counterExamples3; + } + + public void setCounterExamples3(SQLResultsRow counterExamples3) { + this.counterExamples3 = counterExamples3; + } + + public String getIsTrue() { + return isTrue; + } + + public void setIsTrue(String isTrue) { + this.isTrue = isTrue; + } + + public SQLResultsRow getCounterExamples() { + return counterExamples; + } + + public void setCounterExamples(SQLResultsRow counterExamples) { + this.counterExamples = counterExamples; + } + + public CheckResult() { + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/RuleChecker.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/RuleChecker.java new file mode 100644 index 0000000..8ffc53d --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/rulecheck/RuleChecker.java @@ -0,0 +1,514 @@ +package fr.ensma.lias.rql.rulecheck; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.database.Database; +import fr.ensma.lias.rql.database.MysqlDB; +import fr.ensma.lias.rql.database.OracleDB; +import fr.ensma.lias.rql.database.PostgresqlDB; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; +import fr.ensma.lias.rql.sql.SQLResultsRow; +import fr.ensma.lias.rql.sql.SQLRow; + +/** + * @author Bilal REZKELLAH + */ +public class RuleChecker { + + private String rqlQuery; + + private String leftAttributes; + + private String rightAttribute; + + private String isTrue; + + private String query1 = ""; + + private String query2 = ""; + + private String query3 = ""; + + private String querySupportX = ""; + + private String querySupportXYBar = ""; + + private SqlCoreConf sqlCoreConf; + + private Database db = null; + + public CheckResult CheckRule(RQLParser parse, String rqlQuery, String leftAttributes, String rightAttribute, + double support, double confidence) { + List listEntetes = new ArrayList(); + List recurentList = new ArrayList(); + List counterExp = new ArrayList(); + List counterExp2 = new ArrayList(); + List counterExp3 = new ArrayList(); + List separated = new ArrayList(); + List separated2 = new ArrayList(); + List separated3 = new ArrayList(); + SQLRow sqlRow; + List rows = new ArrayList(); + ; + SQLResultsRow sqlResults = new SQLResultsRow(listEntetes, rows, true); + SQLResultsRow sqlResults2 = new SQLResultsRow(listEntetes, rows, true); + SQLResultsRow sqlResults3 = new SQLResultsRow(listEntetes, rows, true); + + try { + System.out.println(leftAttributes); + ArrayList leftAttributesList = parseAttributeList(leftAttributes); + ArrayList rightAttributesList = parseAttributeList(rightAttribute); + RQLParser parser = parse; + parser.improve(); + if (this.sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (this.sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (this.sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } + db.open(this.sqlCoreConf.getRqlDbHost(), this.sqlCoreConf.getRqlDbPort(), this.sqlCoreConf.getRqlDbName(), + this.sqlCoreConf.getRqlDbAdminLogin(), this.sqlCoreConf.getRqlDbAdminPwd()); + System.out.println("\nconnexion etablie \n"); + + /* this QUERY is used to get the support of the lhs of the checked rule */ + querySupportX = "SELECT count(*)"; + querySupportX += "\nFROM " + parser.getSqlStatement() + "\nWHERE "; + if (parser.getSqlConditions() != null) { + querySupportX += parser.getSqlConditions() + "\nAND "; + } + // (conditions[left]) AND NOT (conditions[right]) + querySupportX += "("; + for (int i = 0; i < leftAttributesList.size(); i++) { + if (i > 0) { + querySupportX += " AND "; + } + querySupportX += "(" + parser.sqlCondition(leftAttributesList.get(i)) + ")"; + } + + querySupportX += ")"; + System.out.println("querySupportX" + querySupportX); + /* this QUERY is used to get the support the checked rule */ + querySupportXYBar = "SELECT count(*)"; + querySupportXYBar += "\nFROM " + parser.getSqlStatement() + "\nWHERE "; + if (parser.getSqlConditions() != null) { + querySupportXYBar += parser.getSqlConditions() + "\nAND "; + } + // (conditions[left]) AND NOT (conditions[right]) + querySupportXYBar += "("; + for (int i = 0; i < leftAttributesList.size(); i++) { + if (i > 0) { + querySupportXYBar += " AND "; + } + querySupportXYBar += "(" + parser.sqlCondition(leftAttributesList.get(i)) + ")"; + } + + querySupportXYBar += ")\nAND CASE WHEN ("; + for (int i = 0; i < rightAttributesList.size(); i++) { + if (i > 0) { + querySupportXYBar += " AND "; + } + querySupportXYBar += "(" + parser.sqlCondition(rightAttributesList.get(i)) + ")"; + } + querySupportXYBar += ") THEN 1 ELSE 0 END = 0"; + /* end of query generation */ + ResultSet supXSet = db.executeQuery(querySupportX); + supXSet.next(); + double supX = supXSet.getInt(1); + ResultSet supXYBarSet = db.executeQuery(querySupportXYBar); + supXYBarSet.next(); + double supXYBar = supXYBarSet.getInt(1); + /* this query is used to get the nbligne of the sql statement from */ + String queryNBLigne = "select count(*) from " + parser.getSqlStatement(); + if (parser.getSqlConditions() != null) { + queryNBLigne += " where " + parser.getSqlConditions(); + } + ResultSet NBLigneSet = db.executeQuery(queryNBLigne); + NBLigneSet.next(); + double NBLigne = NBLigneSet.getInt(1); + System.out.println(NBLigne); + DecimalFormat df = new DecimalFormat("#.###"); + double supportXY = (supX - supXYBar) / NBLigne; + double supportX = supX / NBLigne; + double confidenceXY = (supportXY / supportX); + System.out.println("2"); + + if (supportXY != 0 && supportXY >= support && confidenceXY != 0 && confidenceXY >= confidence) { + return new CheckResult("true", df.format(supportXY).replace(',', '.'), + df.format(confidenceXY).replace(',', '.'), (int) supXYBar, sqlResults, sqlResults2, + sqlResults3); + } else { + query1 = "SELECT "; + // SELECT t1.att1, t1.att2, ... , t2.att1, t2.att2, ... , tn.attm + List tupVarList = parser.getTupVarList(); + for (int i = 0; i < tupVarList.size(); i++) { + if (i != 0) { + query1 += ", "; + } + + for (int j = 0; j < parser.getAttributeList().size(); j++) { + if (j != 0) { + query1 += ", "; + } + query1 += tupVarList.get(i) + "." + parser.getAttributeList().get(j); + } + } + query1 += "\nFROM " + parser.getSqlStatement() + "\nWHERE "; + + // WHERE [sqlConditions AND] + if (parser.getSqlConditions() != null) { + query1 += parser.getSqlConditions() + "\nAND "; + } + + // (conditions[left]) AND NOT (conditions[right]) + query1 += "("; + for (int i = 0; i < leftAttributesList.size(); i++) { + if (i > 0) { + query1 += " AND "; + } + query1 += "(" + parser.sqlCondition(leftAttributesList.get(i)) + ")"; + } + + query1 += ")\nAND CASE WHEN ("; + for (int i = 0; i < rightAttributesList.size(); i++) { + if (i > 0) { + query1 += " AND "; + } + query1 += "(" + parser.sqlCondition(rightAttributesList.get(i)) + ")"; + } + // AND rownum <= 10 + if (this.sqlCoreConf.getRqlDbType().equals("oracle")) { + query1 += ") THEN 1 ELSE 0 END = 0 \nAND rownum <= 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("postgresql")) { + query1 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("mysql")) { + query1 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } + /* end of query generation */ + + /* query generation without attributs projection */ + query2 = "SELECT "; + // SELECT t1.att1, t1.att2, ... , t2.att1, t2.att2, ... , tn.attm + for (int i = 0; i < tupVarList.size(); i++) { + if (i != 0) { + query2 += ", "; + } + query2 += tupVarList.get(i) + ".*"; + } + query2 += "\nFROM " + parser.getSqlStatement() + "\nWHERE "; + + // WHERE [sqlConditions AND] + if (parser.getSqlConditions() != null) { + query2 += parser.getSqlConditions() + "\nAND "; + } + + // (conditions[left]) AND NOT (conditions[right]) + query2 += "("; + for (int i = 0; i < leftAttributesList.size(); i++) { + if (i > 0) { + query2 += " AND "; + } + query2 += "(" + parser.sqlCondition(leftAttributesList.get(i)) + ")"; + } + + query2 += ")\nAND CASE WHEN ("; + for (int i = 0; i < rightAttributesList.size(); i++) { + if (i > 0) { + query2 += " AND "; + } + query2 += "(" + parser.sqlCondition(rightAttributesList.get(i)) + ")"; + } + // AND rownum <= 1 + if (this.sqlCoreConf.getRqlDbType().equals("oracle")) { + query2 += ") THEN 1 ELSE 0 END = 0 \nAND rownum <= 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("postgresql")) { + query2 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("mysql")) { + query2 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } + /* end of query generation */ + + /* query generation with attributs projection on left and right */ + query3 = "SELECT "; + // SELECT t1.att1, t1.att2, ... , t2.att1, t2.att2, ... , tn.attm + for (int i = 0; i < tupVarList.size(); i++) { + if (i != 0) { + query3 += ", "; + } + int k = 0; + for (int j = 0; j < leftAttributesList.size() + rightAttributesList.size(); j++) { + if (j != 0) { + query3 += ", "; + } + if (j < leftAttributesList.size()) { + query3 += tupVarList.get(i) + "." + leftAttributesList.get(j); + } else { + query3 += tupVarList.get(i) + "." + rightAttributesList.get(k); + k++; + } + } + } + query3 += "\nFROM " + parser.getSqlStatement() + "\nWHERE "; + + // WHERE [sqlConditions AND] + if (parser.getSqlConditions() != null) { + query3 += parser.getSqlConditions() + "\nAND "; + } + + // (conditions[left]) AND NOT (conditions[right]) + query3 += "("; + for (int i = 0; i < leftAttributesList.size(); i++) { + if (i > 0) { + query3 += " AND "; + } + query3 += "(" + parser.sqlCondition(leftAttributesList.get(i)) + ")"; + } + + query3 += ")\nAND CASE WHEN ("; + for (int i = 0; i < rightAttributesList.size(); i++) { + if (i > 0) { + query3 += " AND "; + } + query3 += "(" + parser.sqlCondition(rightAttributesList.get(i)) + ")"; + } + // AND rownum <= 1 + if (this.sqlCoreConf.getRqlDbType().equals("oracle")) { + query3 += ") THEN 1 ELSE 0 END = 0 \nAND rownum <= 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("postgresql")) { + query3 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } else if (this.sqlCoreConf.getRqlDbType().equals("mysql")) { + query3 += ") THEN 1 ELSE 0 END = 0 Limit 10"; + } + /* end of query generation */ + + ResultSet resultsSql = db.executeQuery(query1); + ResultSetMetaData rsmd = resultsSql.getMetaData(); + for (int i = 1; i <= rsmd.getColumnCount(); i++) { + listEntetes.add(rsmd.getColumnName(i)); + } + sqlRow = new SQLRow(listEntetes); + counterExp.add(sqlRow); + while (resultsSql.next()) { + recurentList = new ArrayList(); + for (int i = 1; i <= rsmd.getColumnCount(); i++) { + recurentList.add(resultsSql.getString(i)); + } + sqlRow = new SQLRow(recurentList); + counterExp.add(sqlRow); + } + if (counterExp.size() <= 1) { + isTrue = "false"; + } else { + isTrue = "false"; + + List recurent1 = new ArrayList(); + List recurent2 = new ArrayList(); + recurent1 = counterExp.get(0).getCels(); + int size = recurent1.size() / parser.getTupVarList().size(); + for (int i = 0; i < size; i++) { + recurent2.add(recurent1.get(i)); + } + sqlRow = new SQLRow(recurent2); + separated.add(sqlRow); + int size2; + + size2 = counterExp.size(); + + for (int i = 1; i < size2; i++) { + recurent1 = new ArrayList(counterExp.get(i).getCels()); + recurent2 = new ArrayList(); + for (int k = 0; k < parser.getTupVarList().size(); k++) { + recurent2 = new ArrayList(); + for (int j = k * size; j < k * size + size; j++) { + recurent2.add(recurent1.get(j)); + } + sqlRow = new SQLRow(recurent2); + separated.add(sqlRow); + } + } + rows = new ArrayList(); + for (int i = 1; i < separated.size(); i++) { + rows.add(separated.get(i)); + } + sqlResults = new SQLResultsRow(separated.get(0).getCels(), rows, true); + } + + ResultSet resultsSql2 = db.executeQuery(query2); + ResultSetMetaData rsmd2 = resultsSql2.getMetaData(); + listEntetes = new ArrayList(); + for (int i = 1; i <= rsmd2.getColumnCount(); i++) { + listEntetes.add(rsmd2.getColumnName(i)); + } + sqlRow = new SQLRow(listEntetes); + counterExp2.add(sqlRow); + while (resultsSql2.next()) { + recurentList = new ArrayList(); + for (int i = 1; i <= rsmd2.getColumnCount(); i++) { + recurentList.add(resultsSql2.getString(i)); + } + sqlRow = new SQLRow(recurentList); + counterExp2.add(sqlRow); + } + if (counterExp2.size() <= 1) { + } else { + List recurent1 = new ArrayList(); + List recurent2 = new ArrayList(); + if (counterExp.size() != 0) { + recurent1 = counterExp2.get(0).getCels(); + int size = recurent1.size() / parser.getTupVarList().size(); + for (int i = 0; i < size; i++) { + recurent2.add(recurent1.get(i)); + } + sqlRow = new SQLRow(recurent2); + separated2.add(sqlRow); + int size2; + + size2 = counterExp2.size(); + + for (int i = 1; i < size2; i++) { + recurent1 = new ArrayList(counterExp2.get(i).getCels()); + recurent2 = new ArrayList(); + for (int k = 0; k < parser.getTupVarList().size(); k++) { + recurent2 = new ArrayList(); + for (int j = k * size; j < k * size + size; j++) { + recurent2.add(recurent1.get(j)); + } + sqlRow = new SQLRow(recurent2); + separated2.add(sqlRow); + } + + } + } + rows = new ArrayList(); + for (int i = 1; i < separated2.size(); i++) { + rows.add(separated2.get(i)); + } + sqlResults2 = new SQLResultsRow(separated2.get(0).getCels(), rows, true); + } + + ResultSet resultsSql3 = db.executeQuery(query3); + ResultSetMetaData rsmd3 = resultsSql3.getMetaData(); + listEntetes = new ArrayList(); + for (int i = 1; i <= rsmd3.getColumnCount(); i++) { + listEntetes.add(rsmd3.getColumnName(i)); + } + sqlRow = new SQLRow(listEntetes); + counterExp3.add(sqlRow); + while (resultsSql3.next()) { + recurentList = new ArrayList(); + for (int i = 1; i <= rsmd3.getColumnCount(); i++) { + recurentList.add(resultsSql3.getString(i)); + } + sqlRow = new SQLRow(recurentList); + counterExp3.add(sqlRow); + } + if (counterExp3.size() <= 1) { + } else { + List recurent1 = new ArrayList(); + List recurent2 = new ArrayList(); + if (counterExp3.size() != 0) { + recurent1 = counterExp3.get(0).getCels(); + int size = recurent1.size() / parser.getTupVarList().size(); + for (int i = 0; i < size; i++) { + recurent2.add(recurent1.get(i)); + } + sqlRow = new SQLRow(recurent2); + separated3.add(sqlRow); + int size2; + + size2 = counterExp3.size(); + + for (int i = 1; i < size2; i++) { + recurent1 = new ArrayList(counterExp3.get(i).getCels()); + recurent2 = new ArrayList(); + for (int k = 0; k < parser.getTupVarList().size(); k++) { + recurent2 = new ArrayList(); + for (int j = k * size; j < k * size + size; j++) { + recurent2.add(recurent1.get(j)); + } + sqlRow = new SQLRow(recurent2); + separated3.add(sqlRow); + } + + } + } + rows = new ArrayList(); + for (int i = 1; i < separated3.size(); i++) { + rows.add(separated3.get(i)); + } + sqlResults3 = new SQLResultsRow(separated3.get(0).getCels(), rows, true); + System.out.println(sqlResults3.getHeader()); + for (int i = 0; i < sqlResults3.getRows().size(); i++) { + System.out.println(sqlResults3.getRows().get(i).getCels()); + } + } + System.out.println("3"); + return new CheckResult(isTrue, df.format(supportXY).replace(',', '.'), + df.format(confidenceXY).replace(',', '.'), (int) supXYBar, sqlResults, sqlResults2, + sqlResults3); + } + } catch (Exception e) { + e.printStackTrace(); + return new CheckResult("NoValideAttributes", null, null, 0, sqlResults, sqlResults2, sqlResults3); + } + + } + + public RuleChecker(SqlCoreConf sqlConf) { + super(); + this.sqlCoreConf = sqlConf; + } + + public String getRqlQuery() { + return rqlQuery; + } + + public void setRqlQuery(String rqlQuery) { + this.rqlQuery = rqlQuery; + } + + public String getLeftAttributes() { + return leftAttributes; + } + + public void setLeftAttributes(String leftAttributes) { + this.leftAttributes = leftAttributes; + } + + public String getRightAttribute() { + return rightAttribute; + } + + public void setRightAttribute(String rightAttribute) { + this.rightAttribute = rightAttribute; + } + + private static ArrayList parseAttributeList(String attributes) { + ArrayList result = new ArrayList(); + String attribute = new String(attributes); + + attribute += ' '; + + if (attribute.indexOf(' ') == -1) { + result.add(attribute); + } else { + String tempAttribute = attribute.substring(0, attribute.indexOf(' ')); + + while (attribute.length() > 0) { + result.add(tempAttribute); + attribute = attribute.replace(tempAttribute + ' ', ""); + + if (attribute.length() > 0) { + tempAttribute = attribute.substring(0, attribute.indexOf(' ')); + } + } + } + + return result; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLManager.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLManager.java new file mode 100644 index 0000000..dc52772 --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLManager.java @@ -0,0 +1,346 @@ +package fr.ensma.lias.rql.sql; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; + +import org.json.JSONObject; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.database.Column; +import fr.ensma.lias.rql.database.DataBaseSchema; +import fr.ensma.lias.rql.database.Database; +import fr.ensma.lias.rql.database.MysqlDB; +import fr.ensma.lias.rql.database.OracleDB; +import fr.ensma.lias.rql.database.PostgresqlDB; +import fr.ensma.lias.rql.database.Table; + +/** + * @author Bilal REZKELLAH + */ +public class SQLManager { + + private String sqlQuery; + + private SqlCoreConf sqlCoreConf; + + private Database db = null; + + private List finalList = new ArrayList(); + + private List recurentList = new ArrayList(); + + private List listEntete = new ArrayList(); + + public List getListEntete() { + return listEntete; + } + + public void setListEntete(List listEntete) { + this.listEntete = listEntete; + } + + public String getSqlQuery() { + return sqlQuery; + } + + public void setSqlQuery(String sqlQuery) { + this.sqlQuery = sqlQuery; + } + + public List getFinalList() { + return finalList; + } + + public void setFinalList(List finalList) { + this.finalList = finalList; + } + + public List getRecurentList() { + return recurentList; + } + + public void setRecurentList(List recurentList) { + this.recurentList = recurentList; + } + + public SQLManager(SqlCoreConf sqlCoreConf) { + this.sqlCoreConf = sqlCoreConf; + } + + public void openDB() throws SQLException { + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + System.out.println("\nconnexion etablie \n"); + } + + public void closeDB() throws IOException { + db.close(); + } + + public DataBaseSchema getDataBaseSchema() throws SQLException { + List
tables = new ArrayList
(); + Table myTable; + List tablesName = new ArrayList(); + List colTabName = new ArrayList(); + String tablesNameQuery = ""; + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER =" + "'" + + sqlCoreConf.getRqlDbAdminLogin().toUpperCase() + "'" + " order by TABLE_NAME asc"; + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'public' order by TABLE_NAME asc"; + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'public' order by TABLE_NAME asc"; + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + + ResultSet resultsName = db.executeQuery(tablesNameQuery); + while (resultsName.next()) { + if (!resultsName.getString(1).contains("$")) { + System.out.println(resultsName.getString(1)); + tablesName.add(resultsName.getString(1)); + } + } + ListIterator it = tablesName.listIterator(); + String colNameQuery = ""; + String actualTab = ""; + ResultSet resultCol = null; + while (it.hasNext()) { + myTable = new Table(); + colTabName = new ArrayList(); + actualTab = it.next(); + Column column = null; + System.out.println(actualTab); + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + colNameQuery = "SELECT column_name, data_type column_type FROM user_tab_cols WHERE table_name =" + "'" + + actualTab + "'"; + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + colNameQuery = "SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + actualTab + "'"; + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + colNameQuery = "SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + actualTab + "'"; + } + resultCol = db.executeQuery(colNameQuery); + while (resultCol.next()) { + column = new Column(resultCol.getString(1), resultCol.getString(2)); + colTabName.add(column); + } + myTable.setTableName(actualTab); + myTable.setColumnsName(colTabName); + tables.add(myTable); + } + return new DataBaseSchema(tables); + } + + public List getDataBaseTablesHeader() throws SQLException { + List tablesName = new ArrayList(); + String tablesNameQuery = ""; + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER =" + "'" + + sqlCoreConf.getRqlDbAdminLogin().toUpperCase() + "'" + " order by TABLE_NAME asc"; + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'public' order by TABLE_NAME asc"; + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + tablesNameQuery = "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'public' order by TABLE_NAME asc"; + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + ResultSet resultsName = db.executeQuery(tablesNameQuery); + while (resultsName.next()) { + if (!resultsName.getString(1).contains("$")) { + System.out.println(resultsName.getString(1)); + tablesName.add(resultsName.getString(1)); + } + } + return tablesName; + } + + public ResultSet execute(String query) throws Exception { + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } else { + throw new Exception(); + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + + return db.executeQuery(query); + } + + public List getAttributesList(String id, String queryType) throws SQLException { + List colTabName = new ArrayList(); + String colNameQuery = ""; + System.out.println("queryType:" + queryType); + if (!queryType.equals("Metric Functional Dependencies")) { + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + colNameQuery = "SELECT column_name FROM user_tab_cols WHERE table_name =" + "'" + id + "'"; + + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + colNameQuery = "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + id + "'"; + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + colNameQuery = "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + id + "'"; + } + } else { + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + colNameQuery = "SELECT column_name FROM user_tab_cols WHERE table_name =" + "'" + id + + "' and (data_type LIKE '%NUMBER%' or data_type LIKE '%FLOAT%' or data_type LIKE '%DOUBLE%')"; + + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + colNameQuery = "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + id + "'" + + " and (data_type = 'integer' or data_type = 'smallint' or data_type = 'bigint' or data_type = 'serial' or data_type = 'bigserial' or data_type LIKE 'number%' or data_type LIKE 'decimal%' or\r\n" + + "data_type LIKE 'real%' or data_type LIKE 'double precision%')"; + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + colNameQuery = "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' and table_name =" + + "'" + id + "'" + + " and (data_type LIKE '%int%' or data_type = 'serial' or data_type = 'bigserial' or data_type LIKE 'number%' or data_type LIKE 'double%' or data_type LIKE 'float%' or data_type LIKE 'decimal%' or\r\n" + + "data_type LIKE 'real%' or data_type LIKE 'double precision%')"; + } + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + + ResultSet resultCol = db.executeQuery(colNameQuery); + while (resultCol.next()) { + colTabName.add(resultCol.getString(1)); + } + return colTabName; + } + + public SQLResultsObject executeQuery(String sqlQuery) + throws SQLException, JsonParseException, JsonMappingException, IOException { + Boolean isSelect = false; + this.sqlQuery = sqlQuery; + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + System.out.println("\nconnexion etablie \n"); + System.out.println(sqlQuery); + ResultSet resultsSql = db.executeQuery(sqlQuery); + List rows = new ArrayList(); + ObjectMapper mapper = new ObjectMapper(); + + if (resultsSql != null) { + isSelect = true; + ResultSetMetaData resultMeta = resultsSql.getMetaData(); + List header = new ArrayList(); + for (int i = 1; i <= resultMeta.getColumnCount(); i++) { + header.add(resultMeta.getColumnName(i)); + } + Set set = new LinkedHashSet<>(); + for (String str : header) { + if (!str.equals("")) { + String value = str; + for (int i1 = 1; !set.add(value); i1++) { + value = str + i1; + } + } + } + header = new ArrayList(); + header.addAll(set); + + while (resultsSql.next()) { + JSONObject json = new JSONObject(); + + for (int i = 1; i <= resultMeta.getColumnCount(); i++) { + Object obj = resultsSql.getObject(i); + if (obj == null) { + + json.put(resultMeta.getColumnName(i), ""); + } else { + + json.put(header.get(i - 1), obj.toString()); + } + + } + Object obj = mapper.readValue(json.toString(), Object.class); + rows.add(obj); + } + for (int i = 1; i <= resultMeta.getColumnCount(); i++) { + listEntete.add(header.get(i - 1)); + } + } + return new SQLResultsObject(listEntete, rows, isSelect); + } + + public void insertRow(String query) throws SQLException { + ResultSet resultsSql = db.executeQuery(query); + } + + public SQLResultsRow executeQuery2(String sqlQuery) throws SQLException { + SQLRow sqlRow; + Boolean isSelect = false; + this.sqlQuery = sqlQuery; + if (sqlCoreConf.getRqlDbType().equals("oracle")) { + db = new OracleDB(); + } else if (sqlCoreConf.getRqlDbType().equals("postgresql")) { + db = new PostgresqlDB(); + } else if (sqlCoreConf.getRqlDbType().equals("mysql")) { + db = new MysqlDB(); + } + db.open(sqlCoreConf.getRqlDbHost(), sqlCoreConf.getRqlDbPort(), sqlCoreConf.getRqlDbName(), + sqlCoreConf.getRqlDbAdminLogin(), sqlCoreConf.getRqlDbAdminPwd()); + System.out.println("\nconnexion etablie \n"); + System.out.println(sqlQuery); + ResultSet resultsSql = db.executeQuery(sqlQuery); + if (resultsSql != null) { + isSelect = true; + ResultSetMetaData rsmd = resultsSql.getMetaData(); + for (int i = 1; i <= rsmd.getColumnCount(); i++) { + listEntete.add(rsmd.getColumnName(i)); + } + while (resultsSql.next()) { + recurentList = new ArrayList(); + for (int i = 1; i <= rsmd.getColumnCount(); i++) { + recurentList.add(resultsSql.getString(i)); + } + sqlRow = new SQLRow(recurentList); + finalList.add(sqlRow); + } + } + return new SQLResultsRow(listEntete, finalList, isSelect); + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResults.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResults.java new file mode 100644 index 0000000..6913eec --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResults.java @@ -0,0 +1,36 @@ +package fr.ensma.lias.rql.sql; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLResults { + + public List header = new ArrayList(); + + private Boolean isSelect; + + public SQLResults(List header, Boolean isSelect) { + this.header = header; + this.isSelect = isSelect; + } + + public Boolean getIsSelect() { + return isSelect; + } + + public void setIsSelect(Boolean isSelect) { + this.isSelect = isSelect; + } + + public List getHeader() { + return header; + } + + public void setHeader(List header) { + this.header = header; + } + +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsObject.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsObject.java new file mode 100644 index 0000000..002a6eb --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsObject.java @@ -0,0 +1,25 @@ +package fr.ensma.lias.rql.sql; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLResultsObject extends SQLResults { + + public SQLResultsObject(List header, List rows, Boolean isSelect) { + super(header, isSelect); + this.rows = rows; + } + + public List rows = new ArrayList(); + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsRow.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsRow.java new file mode 100644 index 0000000..035e7cc --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLResultsRow.java @@ -0,0 +1,25 @@ +package fr.ensma.lias.rql.sql; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLResultsRow extends SQLResults { + + public SQLResultsRow(List header, List rows, Boolean isSelect) { + super(header, isSelect); + this.rows = rows; + } + + private List rows = new ArrayList(); + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } +} diff --git a/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLRow.java b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLRow.java new file mode 100644 index 0000000..74cdddb --- /dev/null +++ b/rql-backend/rql-core/src/main/java/fr/ensma/lias/rql/sql/SQLRow.java @@ -0,0 +1,23 @@ +package fr.ensma.lias.rql.sql; + +import java.util.List; + +/** + * @author Bilal REZKELLAH + */ +public class SQLRow { + + private List cels; + + public List getCels() { + return cels; + } + + public void setCels(List cels) { + this.cels = cels; + } + + public SQLRow(List cels) { + this.cels = cels; + } +} diff --git a/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rqlgrammar/RQL.jj b/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rqlgrammar/RQL.jj new file mode 100644 index 0000000..eb95597 --- /dev/null +++ b/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rqlgrammar/RQL.jj @@ -0,0 +1,418 @@ +options +{ + static = false; + SUPPORT_CLASS_VISIBILITY_PUBLIC = false; +} + +PARSER_BEGIN(RQLParser) +package fr.ensma.lias.rql.rqlgrammar; +import java.io.StringReader; +import java.io.Reader; +import java.util.Collections; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + + +public class RQLParser { + private List attributes; + private List tupVarList = new ArrayList(); + private String sqlStatement; + private String rqlVar; + private String rqlConditions; + private String sqlConditions; + + public List getTupVarList() { + return tupVarList; + } + + public String getSqlStatement() { + return sqlStatement; + } + + public String getSqlConditions() { + return sqlConditions; + } + + public List getAttributeList() { + return Collections.unmodifiableList(attributes); + } + + public RQLParser(String s) { + this((Reader)(new StringReader(s))); + } + + public String sqlCondition(String attributeName) throws ParseException { + //return rqlConditions.replace(rqlVar, attributeName); + Pattern regex = Pattern.compile("(^|[^0-9a-zA-Z])" + rqlVar.replace("$", "\\$") + + "($|[^0-9a-zA-Z])"); + Matcher matcher = regex.matcher(rqlConditions); + if (matcher.find() == false) { + throw new ParseException("Attribute Variable (" + rqlVar + + ") not found in condition (" + rqlConditions + ")"); + } + StringBuffer buf = new StringBuffer(); + matcher.reset(); + while (matcher.find()) { + matcher.appendReplacement(buf, + matcher.group().replace(rqlVar, attributeName)); + } + matcher.appendTail(buf); + return buf.toString(); + } + + public static RQLParser parse(String rqlQuery) + throws ParseException { + RQLParser parser = new RQLParser(rqlQuery); + try { + parser.rqlQuery(); + } catch (TokenMgrError e) { + e.printStackTrace(); + throw new ParseException(e.getMessage()); + } + return(parser); + } + + public void improve() { + /* purely cosmetic part */ + /* trim sqlQuery */ + if (sqlStatement.charAt(sqlStatement.length() - 1) == '\n') { + sqlStatement = sqlStatement.substring(0, sqlStatement.length() - 1); + } + sqlStatement = sqlStatement.trim(); + /* trim rqlConditions */ + while (rqlConditions.charAt(rqlConditions.length() - 1) == '\n') { + rqlConditions = + rqlConditions.substring(0, rqlConditions.length() - 1); + } + rqlConditions = rqlConditions.trim(); + /* trim sqlConditions */ + if (sqlConditions != null) { + while (sqlConditions.charAt(sqlConditions.length() - 1) == '\n') { + sqlConditions = + sqlConditions.substring(0, sqlConditions.length() - 1); + } + sqlConditions = sqlConditions.trim(); + } + } + + public String oracleQuery() throws ParseException { + improve(); + /* Oracle syntax */ + StringBuffer query = new StringBuffer(); + query.append("SELECT count(*), ag FROM (\n"); + query.append("SELECT\n("); + for (int i = 0; i < attributes.size(); i++) { + if (i > 0) { + query.append(" ||"); + } + query.append("\n CASE WHEN "); + query.append(sqlCondition(attributes.get(i))); + query.append(" THEN '"); + query.append(Integer.toString(i)); + query.append(" ' END"); + } + query.append("\n) as ag\nFROM "); + query.append(sqlStatement); + if (sqlConditions != null) { + query.append("\nWHERE "); + query.append(sqlConditions); + } + query.append("\n)\nGROUP BY ag\nORDER BY ag ASC"); + return query.toString(); + } + + public String mysqlQuery() throws ParseException { + improve(); + /* MySQL syntax */ + StringBuffer query = new StringBuffer(); + query.append("SELECT count(*), ag FROM (\n"); + query.append("SELECT\n(\n CONCAT("); + for (int i = 0; i < attributes.size(); i++) { + if (i > 0) { + query.append(","); + } + query.append("\n CASE WHEN "); + query.append(sqlCondition(attributes.get(i))); + query.append(" THEN '"); + query.append(Integer.toString(i)); + query.append(" ' ELSE '' END"); + } + query.append("\n )\n) as ag\nFROM "); + query.append(sqlStatement); + if (sqlConditions != null) { + query.append("\nWHERE "); + query.append(sqlConditions); + } + query.append("\n) t1\nGROUP BY ag\nORDER BY ag ASC"); + return query.toString(); + } + public String postgresQuery() throws ParseException { + improve(); + /* Postgresql syntax */ + StringBuffer query = new StringBuffer(); + query.append("SELECT count(*), ag FROM (\n"); + query.append("SELECT\n(\n CONCAT("); + for (int i = 0; i < attributes.size(); i++) { + if (i > 0) { + query.append(","); + } + query.append("\n CASE WHEN "); + query.append(sqlCondition(attributes.get(i))); + query.append(" THEN '"); + query.append(Integer.toString(i)); + query.append(" ' ELSE '' END"); + } + query.append("\n )\n) as ag\nFROM "); + query.append(sqlStatement); + if (sqlConditions != null) { + query.append("\nWHERE "); + query.append(sqlConditions); + } + query.append("\n) as Base\nGROUP BY ag\nORDER BY ag ASC"); + return query.toString(); + } +} +PARSER_END(RQLParser) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| "\r\n" +} + +TOKEN : +{ + < LEFT_PAR : "(" > +| < RIGHT_PAR : ")" > +| < COMMA : "," > +| < CONDITION : "CONDITION" | "condition" > +| < FINDRULES : "FINDRULES" | "findrules" > +| < IS : "IS" | "is" > +| < ON : "ON" | "on" > +| < OVER : "OVER" | "over" > +| < SCOPE : "SCOPE" | "scope" > +| < WHERE : "WHERE" | "where" > +| < WORD : ( | "_" | "$" ) ( | | "_" )* > +| < #LETTER : ["a"-"z","A"-"Z"] > +| < #DIGIT : ["0"-"9"] > +| < OTHER : ~[] > +} + + SKIP: +{ + "" +} + + TOKEN: +{ + < SQL_LEFT_PAR : "(" > +| < SQL_RIGHT_PAR : ")" > +| < SQL_OTHER : ~[] > +} + + SKIP: +{ + "" +} + + TOKEN: +{ + < SQLCOND_CONDITION : "CONDITION" | "condition" > +| < SQLCOND_OTHER : ~[] > +} + + SKIP: +{ + "" +} + + TOKEN: +{ + < SQLFORM_OTHER : ~[] > +} + +void rqlQuery() : +{} +{ + + attributeList() + + this.sqlStatement = tupleVariableList() + ( + + this.sqlConditions = sqlCondition() + // in sqlCondition() + | + + ) + + attributeVariable() + + miningFormula() + +} + +void attributeList() : +{} +{ + this.attributes = idList() +} + +List idList() : +{ + List list = new ArrayList(); + Token t; +} +{ + t = + { list.add(t.image); } + ( + + t = + { list.add(t.image); } + )* + { return list; } +} + +String tupleVariableList() : +{ + List tupVarList; + Token t; + StringBuilder buf = new StringBuilder(); + String query = null; +} +{ + tupVarList = idList() + { this.tupVarList.addAll(tupVarList); } + ( + + query = sqlStatement() + // in sqlStatement() + { + for (int i = 0; i < tupVarList.size(); i++) { + if (i > 0) { + buf.append(", "); + } + buf.append("("); + buf.append(query); + buf.append(") "); + buf.append(tupVarList.get(i)); + } + } + | + t = + { + for (int i = 0; i < tupVarList.size(); i++) { + if (i > 0) { + buf.append(", "); + } + buf.append(t.image); + buf.append(" "); + buf.append(tupVarList.get(i)); + } + } + ) + ( + + query = tupleVariableList() + { buf.append(", "); } + { buf.append(query); } + )? + { return buf.toString(); } +} + +void attributeVariable() : +{ + Token t; +} +{ + t = + { this.rqlVar = t.image; } +} + +void miningFormula() : +{} +{ + this.rqlConditions = sql() +} + +String sqlStatement() : +{ + Token t; + StringBuffer buf = new StringBuffer(); + String subStatement; +} +{ + { token_source.SwitchTo(SQL); } + ( + t = + { buf.append(t.image); } + | + t = + { buf.append(t.image); } + subStatement = sqlSubStatement() + { buf.append(subStatement); } + t = + { buf.append(t.image); } + )* + + { token_source.SwitchTo(DEFAULT); } + { return buf.toString(); } +} + +String sqlSubStatement() : +{ + Token t; + StringBuffer buf = new StringBuffer(); + String subStatement; +} +{ + ( + t = + { buf.append(t.image); } + | + t = + { buf.append(t.image); } + subStatement = sqlSubStatement() + { buf.append(subStatement); } + t = + { buf.append(t.image); } + )* + { return buf.toString(); } +} + +String sqlCondition() : +{ + Token t; + StringBuffer buf = new StringBuffer(); +} +{ + { token_source.SwitchTo(SQLCOND); } + ( + t = + { buf.append(t.image); } + )* + + { token_source.SwitchTo(DEFAULT); } + { return buf.toString(); } +} + +String sql() : +{ + Token t; + StringBuffer buf = new StringBuffer(); +} +{ + { token_source.SwitchTo(SQLFORM); } + ( + t = + { buf.append(t.image); } + )* + { token_source.SwitchTo(DEFAULT); } + { return buf.toString(); } +} diff --git a/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rulesgrammar/Rules.jj b/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rulesgrammar/Rules.jj new file mode 100644 index 0000000..67bf479 --- /dev/null +++ b/rql-backend/rql-core/src/main/resources/fr/ensma/lias/rql/rulesgrammar/Rules.jj @@ -0,0 +1,158 @@ +options +{ + static = false; + SUPPORT_CLASS_VISIBILITY_PUBLIC = false; +} + +PARSER_BEGIN(RulesParser) +package fr.ensma.lias.rql.rulesgrammar; + +import java.io.BufferedWriter; +import java.io.Closeable; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.util.List; +import java.io.OutputStream; + +public class RulesParser implements Closeable { + private OutputStream out; + private List atts; + + public RulesParser(String inFile, OutputStream outStream, + List attributeList) throws IOException { + this((Reader)(new FileReader(inFile))); + out = outStream; + atts = attributeList; + } + + public void close() throws IOException { + out.flush(); + out.close(); + } + + public static void translate(String inFile, OutputStream outStream, List attributeList) throws ParseException, IOException { + RulesParser parser = new RulesParser(inFile,outStream, attributeList); + parser.rules(null, 0, null); + parser.close(); + } + + public static void translate(String inFile, OutputStream outStream, List attributeList, List previewExact, int previewSize, int[] counts) throws ParseException, IOException { + RulesParser parser = new RulesParser(inFile,outStream, attributeList); + parser.rules(previewExact, previewSize, counts); + parser.close(); + } +} + +PARSER_END(RulesParser) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| "\r\n" +} + +TOKEN : +{ + < IMPLICATION : "=>" > +| < EMPTY : "-1" > +| < INTEGER : ( )* > +| < #DIGIT : ["0"-"9"] > +| < OTHER : ~[] > +} + +void rules(List previewExact, int previewSize, int[] counts) throws IOException : +{ + String rl; +} +{ + ( + rl = rule() + { + if (previewExact != null) + { + if ( previewExact.size() < previewSize) + { + previewExact.add(rl); + counts[0]++; + } + } + } + )* + +} + +String rule() throws IOException : +{ + Token t; + StringBuilder rule = new StringBuilder(); +} +{ + + /* left member: list of attributes or empty */ + ( + ( + t = + { rule.append(atts.get(Integer.parseInt(t.image)) + " "); + } + )+ + | + ( + + { rule.append("empty "); } + ) + ) + + { rule.append("=>"); } + /* right member: single attribute */ + t = + { rule.append(" " + atts.get(Integer.parseInt(t.image)));} + t = + { rule.append(" " + Integer.parseInt(t.image));} + t = + { rule.append(" " + Integer.parseInt(t.image));} + t = + { rule.append(" " + Integer.parseInt(t.image));} + t = + { rule.append(" " + Integer.parseInt(t.image) + "\n");} + { out.write(rule.toString().getBytes()); } + { return rule.toString(); } +} + +boolean metadata() throws IOException : +{ + Token t; + int nX; + int nXY; +} +{ + /* tuples */ + t = + // { out.write("\t" + t.image);} + /* nX */ + t = + // { out.write("\t" + t.image); } + { nX = Integer.parseInt(t.image); } + /* nY */ + t = + // { out.write("\t" + t.image); } + /* nXY */ + t = + { + // out.write("\t" + t.image + "\n"); + nXY = Integer.parseInt(t.image); + if (nX == nXY) + { + out.write("\t(exact)\n".getBytes()); + } + else + { + out.write("\t(G&L cover)\n".getBytes()); + } + return (nX == nXY); + } +} diff --git a/rql-backend/rql-core/src/test/java/DELETE.me b/rql-backend/rql-core/src/test/java/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-core/src/test/resources/DELETE.me b/rql-backend/rql-core/src/test/resources/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-server/pom.xml b/rql-backend/rql-server/pom.xml new file mode 100644 index 0000000..71041a9 --- /dev/null +++ b/rql-backend/rql-server/pom.xml @@ -0,0 +1,98 @@ + + 4.0.0 + rql-server + + fr.ensma.lias + rql-backend + 1.1.0-SNAPSHOT + + + + ${project.groupId} + rql-api + ${project.version} + + + javax.ws.rs + jsr311-api + + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + + + + org.glassfish.jersey.containers + jersey-container-grizzly2-http + + + org.glassfish.jersey.media + jersey-media-multipart + + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + + org.glassfish.jersey.ext.cdi + jersey-weld2-se + + + + org.apache.poi + poi-ooxml + + + + org.aeonbits.owner + owner + + + + org.slf4j + slf4j-api + + + + org.slf4j + slf4j-log4j12 + + + + org.mindrot + jbcrypt + + + fr.ensma.lias + rql-core + + + org.jasypt + jasypt + 1.9.2 + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + package + + copy-dependencies + + + + + + + \ No newline at end of file diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/AuthToken.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/AuthToken.java new file mode 100644 index 0000000..e60a3bd --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/AuthToken.java @@ -0,0 +1,39 @@ +package fr.ensma.lias.rql; + +import java.util.Date; + +/** + * @author Bilal REZKELLAH + */ +public class AuthToken { + + protected String identifiant; + + protected Date startDate; + + public AuthToken(String pIdentifiant, Date pStartDate) { + this.identifiant = pIdentifiant; + this.startDate = pStartDate; + } + + public boolean isValid() { + return identifiant != null && startDate != null; + } + + public String getIdentifiant() { + return identifiant; + } + + public String getStartDateValue() { + return Long.toString(startDate.getTime()); + } + + public Date getStartDate() { + return startDate; + } + + @Override + public String toString() { + return "AuthToken [identifiant=" + identifiant + ", startDate=" + startDate + "]"; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/CrossDomainFilter.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/CrossDomainFilter.java new file mode 100644 index 0000000..148414c --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/CrossDomainFilter.java @@ -0,0 +1,21 @@ +package fr.ensma.lias.rql; + +import java.io.IOException; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; + +/** + * @author Bilal REZKELLAH + */ +public class CrossDomainFilter implements ContainerResponseFilter { + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext cresp) throws IOException { + cresp.getHeaders().add("Access-Control-Allow-Origin", "http://localhost:8080"); + cresp.getHeaders().add("Access-Control-Allow-Credentials", "true"); + cresp.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + cresp.getHeaders().add("Allow", "GET, POST, DELETE, PUT"); + cresp.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Accept, authorization"); + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlConstant.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlConstant.java new file mode 100644 index 0000000..4ff08b2 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlConstant.java @@ -0,0 +1,13 @@ +package fr.ensma.lias.rql; + +/** + * @author Bilal REZKELLAH + */ +public interface RqlConstant { + + static final int WORKLOAD = 12; + + static final String AUTH_TOKEN_SEPARATOR = "#"; + + static final int SESSION_TIMEOUT_DEFAULT = 300; +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlLauncher.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlLauncher.java new file mode 100644 index 0000000..a9f2bab --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlLauncher.java @@ -0,0 +1,61 @@ +package fr.ensma.lias.rql; + +import java.net.URI; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.core.UriBuilder; + +import org.glassfish.grizzly.http.server.HttpServer; +import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; +import org.glassfish.jersey.media.multipart.MultiPartFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.jboss.weld.environment.se.Weld; +import org.jboss.weld.environment.se.WeldContainer; + +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.service.AuthenticationResourceImpl; +import fr.ensma.lias.rql.service.DataBaseImportImp; +import fr.ensma.lias.rql.service.ProjectResourceImp; +import fr.ensma.lias.rql.service.QueryConstructionImp; +import fr.ensma.lias.rql.service.QueryResourceImp; +import fr.ensma.lias.rql.service.SchemaResourceImp; +import fr.ensma.lias.rql.service.UserResourceImp; +import fr.ensma.lias.rql.service.XlsxResourceImp; + +/** + * @author Bilal REZKELLAH + */ +public class RqlLauncher { + + private static URI getBaseURI(Integer value) { + return UriBuilder.fromUri("http://0.0.0.0/").port(value).build(); + } + + public static void main(String[] args) { + Logger l = Logger.getLogger("org.glassfish.grizzly.http.server.HttpHandler"); + l.setLevel(Level.FINE); + l.setUseParentHandlers(false); + ConsoleHandler ch = new ConsoleHandler(); + ch.setLevel(Level.ALL); + l.addHandler(ch); + + ResourceConfig rc = new ResourceConfig(); + rc.registerClasses(UserResourceImp.class, ProjectResourceImp.class, AuthenticationResourceImpl.class, + MultiPartFeature.class, DataBaseImportImp.class, QueryResourceImp.class, SchemaResourceImp.class, + XlsxResourceImp.class, QueryConstructionImp.class, CrossDomainFilter.class); + rc.property("jersey.config.server.wadl.disableWadl", "false"); + + Weld weld = new Weld(); + final WeldContainer initialize = weld.initialize(); + final IConfiguration refRQLConfiguration = initialize.instance().select(IConfiguration.class).get(); + try { + HttpServer server = GrizzlyHttpServerFactory.createHttpServer( + getBaseURI(Integer.parseInt(refRQLConfiguration.getConfiguration().rqlServerPort())), rc); + server.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlUtil.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlUtil.java new file mode 100644 index 0000000..1480644 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/RqlUtil.java @@ -0,0 +1,81 @@ +package fr.ensma.lias.rql; + +import java.util.Date; + +import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; +import org.mindrot.jbcrypt.BCrypt; + +/** + * @author Bilal REZKELLAH + */ +public class RqlUtil { + + public static String hashPassword(String password_plaintext) { + String salt = BCrypt.gensalt(RqlConstant.WORKLOAD); + String hashed_password = BCrypt.hashpw(password_plaintext, salt); + + return (hashed_password); + } + + public static boolean checkPassword(String newPassword, String old) { + return BCrypt.checkpw(newPassword, old); + } + + public static String encryptToken(AuthToken currentToken, String password, String noise) { + if (currentToken != null && !currentToken.isValid()) { + return null; + } + + return RqlUtil.encrypt(currentToken.getIdentifiant() + RqlConstant.AUTH_TOKEN_SEPARATOR + + currentToken.getStartDateValue() + RqlConstant.AUTH_TOKEN_SEPARATOR + noise, password); + } + + public static AuthToken decryptToken(String value, String password, String noise) { + if (value == null) { + return null; + } + + AuthToken currentToken = null; + try { + final String decrypt = RqlUtil.decrypt(value, password); + + if (decrypt == null) { + return null; + } + + final String[] split = decrypt.split(RqlConstant.AUTH_TOKEN_SEPARATOR); + + if (split == null || split.length != 3) { + return null; + } + + String previousIdentifiant = split[0]; + Date previousStartDate = new Date(Long.parseLong(split[1])); + String previousNoise = split[2]; + + if (!noise.equals(previousNoise)) { + return null; + } + + currentToken = new AuthToken(previousIdentifiant, previousStartDate); + return currentToken; + } catch (Exception e) { + return null; + } + } + + public static String encrypt(String content, String password) { + return RqlUtil.getEncryptor(password).encrypt(content); + } + + public static String decrypt(String content, String password) { + return RqlUtil.getEncryptor(password).decrypt(content); + } + + private static StandardPBEStringEncryptor getEncryptor(String password) { + StandardPBEStringEncryptor cookieEncryptor = new StandardPBEStringEncryptor(); + cookieEncryptor.setStringOutputType("hexadecimal"); + cookieEncryptor.setPassword(password); + return cookieEncryptor; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/Configuration.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/Configuration.java new file mode 100644 index 0000000..fac47a1 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/Configuration.java @@ -0,0 +1,23 @@ +package fr.ensma.lias.rql.cfg; + +import javax.inject.Singleton; + +import org.aeonbits.owner.ConfigFactory; + +/** + * @author Bilal REZKELLAH + */ +@Singleton +public class Configuration implements IConfiguration { + + protected RqlConfig config; + + public Configuration() { + config = ConfigFactory.create(RqlConfig.class); + } + + @Override + public RqlConfig getConfiguration() { + return config; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/IConfiguration.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/IConfiguration.java new file mode 100644 index 0000000..de9a1f2 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/IConfiguration.java @@ -0,0 +1,9 @@ +package fr.ensma.lias.rql.cfg; + +/** + * @author Bilal REZKELLAH + */ +public interface IConfiguration { + + RqlConfig getConfiguration(); +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/RqlConfig.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/RqlConfig.java new file mode 100644 index 0000000..349ba26 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/cfg/RqlConfig.java @@ -0,0 +1,61 @@ +package fr.ensma.lias.rql.cfg; + +import org.aeonbits.owner.Config; + +/** + * @author Bilal REZKELLAH + */ +public interface RqlConfig extends Config { + + @DefaultValue("postgres") + String rqlDbName(); + + @DefaultValue("db") + String rqlDbHost(); + + @DefaultValue("business_db") + String rqlDbHostMetier(); + + @DefaultValue("5432") + Integer rqlDbPort(); + + @DefaultValue("postgresql") + String rqlDbType(); + + @DefaultValue("postgres") + String rqlDbAdminLogin(); + + @DefaultValue("postgres") + String rqlDbAdminPwd(); + + @Key("rql.identification.user") + @DefaultValue("admin") + String identificationUser(); + + @Key("rql.identification.password") + @DefaultValue("adminadmin") + String identificationPassword(); + + @Key("rql.encrypt.password") + @DefaultValue("!thisismypassword!") + String encryptPassword(); + + @Key("rql.encrypt.noise") + @DefaultValue("@BCDEFGHIJKLMNPQRSTUVWXZ&bcdefghijklmnopqrstuvwxyz0123456789") + String encryptNoise(); + + @Key("rql.session.timeout") + @DefaultValue("60") + String sessionTimeout(); + + @DefaultValue("../shd31/shd") + String pathToShd(); + + @DefaultValue("./target/tmpFiles") + String tmpResultsDir(); + + @Key("rql.server.port") + @DefaultValue("9992") + String rqlServerPort(); + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/IRql.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/IRql.java new file mode 100644 index 0000000..3b38280 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/IRql.java @@ -0,0 +1,50 @@ +package fr.ensma.lias.rql.core; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.dto.CheckRuleResult; +import fr.ensma.lias.rql.dto.RQLResult; +import fr.ensma.lias.rql.dto.SQLResult; +import fr.ensma.lias.rql.dto.SchemaResult; +import fr.ensma.lias.rql.model.DataBaseConfig; +import fr.ensma.lias.rql.rqlgrammar.ParseException; +import fr.ensma.lias.rql.sql.SQLResultsRow; + +/** + * @author Bilal REZKELLAH + */ +public interface IRql { + + SQLResult executeSqlQuery(String sqlquery, DataBaseConfig dbc) + throws SQLException, JsonParseException, JsonMappingException, IOException; + + SQLResultsRow executeSqlQuery2(String sqlquery, DataBaseConfig dbc) throws SQLException; + + Boolean isRqlQuery(String query); + + RQLResult executeRqlQuery(String id, double support, double confidence) throws Exception; + + SchemaResult getDataBaseSchema(DataBaseConfig dbc) throws SQLException, IOException; + + List getDataBaseTablesHeader(DataBaseConfig dbc) throws SQLException, IOException; + + List getTableAttributesList(String id, String queryType, DataBaseConfig dbc) + throws SQLException, IOException; + + String constructQuery(String QueryType, String isTable, String isALLData, String sqlQuerie, String tableName, + String subsetWhere, String attributesList, boolean isConditional, String conditionalWhere, + String tolerence); + + CheckRuleResult checkRule(long debut, DataBaseConfig dbc, String query, String leftAttributes, + String rightAttribute, double support, double confidence) throws ParseException; + + void testQuery(String query) throws ParseException; + + String normalizeName(String source, String dbt); + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlConstant.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlConstant.java new file mode 100644 index 0000000..03c36ef --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlConstant.java @@ -0,0 +1,9 @@ +package fr.ensma.lias.rql.core; + +/** + * @author Bilal REZKELLAH + */ +public class RqlConstant { + + static final String FIND_RULES = "FINDRULES"; +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlImp.java new file mode 100644 index 0000000..987f5b8 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/core/RqlImp.java @@ -0,0 +1,204 @@ +package fr.ensma.lias.rql.core; + +import java.io.File; +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.inject.Inject; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.RQLManager; +import fr.ensma.lias.rql.RQLResults; +import fr.ensma.lias.rql.Rule; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.dao.query.IQueryDAO; +import fr.ensma.lias.rql.database.DataBaseSchema; +import fr.ensma.lias.rql.database.Table; +import fr.ensma.lias.rql.dbimport.MySqlNameNormalizer; +import fr.ensma.lias.rql.dbimport.NameNormalizer; +import fr.ensma.lias.rql.dbimport.OracleNameNormalizer; +import fr.ensma.lias.rql.dbimport.PostgresNameNormalizer; +import fr.ensma.lias.rql.dto.CheckRuleResult; +import fr.ensma.lias.rql.dto.CheckRuleSummary; +import fr.ensma.lias.rql.dto.RQLResult; +import fr.ensma.lias.rql.dto.RQLRow; +import fr.ensma.lias.rql.dto.RuleGenerationSummary; +import fr.ensma.lias.rql.dto.SQLResult; +import fr.ensma.lias.rql.dto.SchemaResult; +import fr.ensma.lias.rql.model.DataBaseConfig; +import fr.ensma.lias.rql.queryconstruction.QueryConstructor; +import fr.ensma.lias.rql.rqlgrammar.ParseException; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; +import fr.ensma.lias.rql.rulecheck.CheckResult; +import fr.ensma.lias.rql.rulecheck.RuleChecker; +import fr.ensma.lias.rql.sql.SQLManager; +import fr.ensma.lias.rql.sql.SQLResultsObject; +import fr.ensma.lias.rql.sql.SQLResultsRow; + +/** + * @author Bilal REZKELLAH + */ +public class RqlImp implements IRql { + + Properties props = new Properties(); + + @Inject + IConfiguration cfg; + + @Inject + IQueryDAO iquery; + + @Override + public SQLResult executeSqlQuery(String sqlquery, DataBaseConfig dbc) + throws SQLException, JsonParseException, JsonMappingException, IOException { + + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + SQLResultsObject sqlResults = sql.executeQuery(sqlquery); + SQLResult sqlResult = new SQLResult(); + sqlResult.setHeader(sqlResults.getHeader()); + sqlResult.setIsSelect(sqlResults.getIsSelect()); + for (int i = 0; i < sqlResults.getRows().size(); i++) { + Object sqlRow = new Object(); + sqlRow = sqlResults.getRows().get(i); + sqlResult.getRows().add(sqlRow); + } + return sqlResult; + } + + @Override + public Boolean isRqlQuery(String query) { + return (query.contains(RqlConstant.FIND_RULES) || query.contains("FINDRULE")); + } + + @Override + public RQLResult executeRqlQuery(String id, double support, double confidence) throws Exception { + long debut = System.currentTimeMillis(); + RuleGenerationSummary summ; + RQLResults rqlResults = new RQLResults(); + RQLRow row; + List exact = new ArrayList(); + RQLParser parse = iquery.getParserByID(id); + File resultDir = new File(cfg.getConfiguration().tmpResultsDir()); + resultDir.mkdir(); + String agFile = resultDir.getCanonicalPath() + File.separator + id + "rql_agree_set.txt"; + RQLManager rql = new RQLManager(agFile); + rql.resultsToFile2(iquery.getBaseByID(id).getContent(), parse.getAttributeList().size()); + rql.executeDFG(agFile, agFile + "_rules.txt", parse.getAttributeList().size(), support, confidence, + cfg.getConfiguration().pathToShd()); + rqlResults = rql.translate(resultDir.getCanonicalPath() + File.separator + id + "rules.txt", + agFile + "_rules.txt", parse.getAttributeList()); + + for (Rule currentRules : rqlResults.getExactRules()) { + row = new RQLRow(); + row.setLeftAttributes(String.join(" ", currentRules.getLeftAttributes())); + row.setRightAttribute(currentRules.getRightAttributes()); + row.setSupport(currentRules.getSupport() * 100); + row.setConfidence(currentRules.getConfidence() * 100); + row.setLift(currentRules.getLift()); + exact.add(row); + } + + summ = new RuleGenerationSummary(System.currentTimeMillis() - debut, parse.getAttributeList(), + parse.getTupVarList()); + RQLResult rqlResult = new RQLResult(exact, summ); + return rqlResult; + } + + @Override + public SchemaResult getDataBaseSchema(DataBaseConfig dbc) throws SQLException, IOException { + List
tables = new ArrayList
(); + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + DataBaseSchema schema = sql.getDataBaseSchema(); + sql.closeDB(); + tables = schema.getTables(); + SchemaResult tablesResults = new SchemaResult(tables); + + return tablesResults; + } + + @Override + public CheckRuleResult checkRule(long debut, DataBaseConfig dbc, String id, String leftAttributes, + String rightAttribute, double support, double confidence) throws ParseException { + String query = iquery.getQueryByID(id); + RQLParser parser = iquery.getParserByID(id); + RuleChecker ruleChecker = new RuleChecker(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + CheckResult checkResult = ruleChecker.CheckRule(parser, query, leftAttributes, rightAttribute, support, + confidence); + CheckRuleSummary summary = new CheckRuleSummary(System.currentTimeMillis() - debut, parser.getAttributeList(), + parser.getTupVarList(), checkResult.getCounterExamplesNB(), parser.getTupVarList().size(), + checkResult.getIsTrue(), checkResult.getSupport(), checkResult.getConfidence()); + return new CheckRuleResult(checkResult, summary); + } + + @Override + public List getDataBaseTablesHeader(DataBaseConfig dbc) throws SQLException, IOException { + List tablesHeader; + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + tablesHeader = sql.getDataBaseTablesHeader(); + sql.closeDB(); + return tablesHeader; + } + + @Override + public List getTableAttributesList(String id, String queryType, DataBaseConfig dbc) + throws SQLException, IOException { + List attributesList; + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + attributesList = sql.getAttributesList(id, queryType); + sql.closeDB(); + return attributesList; + } + + @Override + public String constructQuery(String QueryType, String isTable, String isALLData, String sqlQuerie, String tableName, + String subsetWhere, String attributesList, boolean isConditional, String conditionalWhere, + String tolerence) { + String rqlQuery; + QueryConstructor queryConstructor = new QueryConstructor(); + rqlQuery = queryConstructor.constructquery(QueryType, isTable, isALLData, sqlQuerie, tableName, subsetWhere, + attributesList, isConditional, conditionalWhere, tolerence); + return rqlQuery; + } + + @Override + public void testQuery(String query) throws ParseException { + RQLParser parse = RQLParser.parse(query); + System.out.println(parse.postgresQuery()); + } + + @Override + public SQLResultsRow executeSqlQuery2(String sqlquery, DataBaseConfig dbc) throws SQLException { + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + SQLResultsRow sqlResults = sql.executeQuery2(sqlquery); + return sqlResults; + } + + @Override + public String normalizeName(String source, String dbType) { + NameNormalizer nNormalizer = null; + if (dbType.equals("postgresql")) { + nNormalizer = new PostgresNameNormalizer(); + source = nNormalizer.colNameNormalizer(source); + } else if (dbType.equals("oracle")) { + nNormalizer = new OracleNameNormalizer(); + source = nNormalizer.colNameNormalizer(source); + } else if (dbType.equals("mysql")) { + nNormalizer = new MySqlNameNormalizer(); + source = nNormalizer.colNameNormalizer(source); + } else { + } + return source; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/ConfigurationDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/ConfigurationDAO.java new file mode 100644 index 0000000..422c893 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/ConfigurationDAO.java @@ -0,0 +1,68 @@ +package fr.ensma.lias.rql.dao.dbconfiguration; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.inject.Inject; + +import fr.ensma.lias.rql.dao.postgressession.IPostgresSession; +import fr.ensma.lias.rql.model.DataBaseConfig; + +/** + * @author Bilal REZKELLAH + */ +public class ConfigurationDAO implements IConfigurationDAO { + + @Inject + IPostgresSession ips; + + @Override + public DataBaseConfig getConfigByID(String id) throws SQLException, IOException { + Connection conn = ips.getConnection(); + Statement stmt = conn.createStatement(); + String query = "SELECT * FROM DATABASE WHERE projectid = " + "'" + Integer.valueOf(id) + "'"; + System.out.println(query); + ResultSet rs = stmt.executeQuery(query); + rs.next(); + DataBaseConfig dbc = new DataBaseConfig(); + dbc.setDataBaseHost(rs.getString("host")); + dbc.setDataBaseName(rs.getString("name")); + dbc.setDataBasePassword(rs.getString("password")); + dbc.setDataBasePort(rs.getInt("port")); + dbc.setDataBaseType(rs.getString("type")); + dbc.setDataBaseUser(rs.getString("userid")); + return dbc; + } + + @Override + public String createConfig(DataBaseConfig dbc) throws SQLException { + String SQL = "INSERT INTO DATABASE (projectid,host,name,password,port,type,userid) " + "VALUES(?,?,?,?,?,?,?)"; + long id = 0; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); + pstmt.setInt(1, Integer.valueOf(dbc.getProjectid())); + pstmt.setString(2, dbc.getDataBaseHost()); + pstmt.setString(3, dbc.getDataBaseName()); + pstmt.setString(4, dbc.getDataBasePassword()); + pstmt.setInt(5, dbc.getDataBasePort()); + pstmt.setString(6, dbc.getDataBaseType()); + pstmt.setString(7, dbc.getDataBaseUser()); + + int affectedRows = pstmt.executeUpdate(); + // check the affected rows + if (affectedRows > 0) { + // get the ID back + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + id = rs.getLong(1); + } + } + + return Long.toString(id); + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/IConfigurationDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/IConfigurationDAO.java new file mode 100644 index 0000000..f6b0768 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbconfiguration/IConfigurationDAO.java @@ -0,0 +1,17 @@ +package fr.ensma.lias.rql.dao.dbconfiguration; + +import java.io.IOException; +import java.sql.SQLException; + +import fr.ensma.lias.rql.model.DataBaseConfig; + +/** + * @author Bilal REZKELLAH + */ +public interface IConfigurationDAO { + + DataBaseConfig getConfigByID(String ProjectID) throws SQLException, IOException; + + String createConfig(DataBaseConfig dbc) throws SQLException; + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/AbstractSchemaDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/AbstractSchemaDAO.java new file mode 100644 index 0000000..026e2bf --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/AbstractSchemaDAO.java @@ -0,0 +1,67 @@ +package fr.ensma.lias.rql.dao.dbschema; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.core.IRql; + +/** + * @author Bilal REZKELLAH + */ +public class AbstractSchemaDAO implements ISchemaDAO { + + @Inject + IRql irql; + + public CellType getColType(XSSFSheet sheet, Integer index) { + Row rowi = sheet.getRow(1); + CellType cellType = null; + int rowIndex = 1; + cellType = rowi.getCell(index).getCellTypeEnum(); + if (cellType == CellType.BLANK) { + while (cellType == CellType.BLANK && rowIndex < sheet.getPhysicalNumberOfRows() - 1) { + rowi = sheet.getRow(++rowIndex); + cellType = rowi.getCell(index).getCellTypeEnum(); + } + if (rowIndex == sheet.getPhysicalNumberOfRows() - 1) { + cellType = CellType.STRING; + } + } + if (cellType == CellType.NUMERIC) { + rowIndex = 1; + while ((cellType == CellType.NUMERIC || cellType == CellType.BLANK) + && rowIndex < sheet.getPhysicalNumberOfRows() - 1) { + rowi = sheet.getRow(++rowIndex); + cellType = rowi.getCell(index).getCellTypeEnum(); + } + if (cellType != CellType.NUMERIC && cellType != CellType.BLANK) { + cellType = CellType.STRING; + } else { + + cellType = CellType.NUMERIC; + } + } + return cellType; + } + + public String cellTypeMap(CellType cellType) { + return null; + } + + @Override + public String createTable(XSSFSheet sheet, List intList, String tableName) + throws SQLException, JsonParseException, JsonMappingException, IOException { + return null; + }; + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/ISchemaDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/ISchemaDAO.java new file mode 100644 index 0000000..a4d2dfc --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/ISchemaDAO.java @@ -0,0 +1,19 @@ +package fr.ensma.lias.rql.dao.dbschema; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import org.apache.poi.xssf.usermodel.XSSFSheet; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +/** + * @author Bilal REZKELLAH + */ +public interface ISchemaDAO { + + String createTable(XSSFSheet sheet, List intList, String tableName) + throws SQLException, JsonParseException, JsonMappingException, IOException; +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/MySqlSchemaDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/MySqlSchemaDAO.java new file mode 100644 index 0000000..5a9963d --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/MySqlSchemaDAO.java @@ -0,0 +1,20 @@ +package fr.ensma.lias.rql.dao.dbschema; + +import org.apache.poi.ss.usermodel.CellType; + +/** + * @author Bilal REZKELLAH + */ +public class MySqlSchemaDAO extends AbstractSchemaDAO { + public String cellTypeMap(CellType cellType) { + if (cellType == CellType.STRING) { + return "TEXT"; + } else if (cellType == CellType.NUMERIC) { + return "BIGINT"; + } else if (cellType == CellType.BOOLEAN) { + return "BOOLEAN"; + } else { + return null; + } + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/OracleSchemaDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/OracleSchemaDAO.java new file mode 100644 index 0000000..c79ba2f --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/OracleSchemaDAO.java @@ -0,0 +1,21 @@ +package fr.ensma.lias.rql.dao.dbschema; + +import org.apache.poi.ss.usermodel.CellType; + +/** + * @author Bilal REZKELLAH + */ +public class OracleSchemaDAO extends AbstractSchemaDAO { + + public String cellTypeMap(CellType cellType) { + if (cellType == CellType.STRING) { + return "VARCHAR2(200)"; + } else if (cellType == CellType.NUMERIC) { + return "NUMBER(20)"; + } else if (cellType == CellType.BOOLEAN) { + return "BOOLEAN"; + } else { + return null; + } + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/PostgresSchemaDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/PostgresSchemaDAO.java new file mode 100644 index 0000000..9d4ab41 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/PostgresSchemaDAO.java @@ -0,0 +1,151 @@ +package fr.ensma.lias.rql.dao.dbschema; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dbimport.NameNormalizer; +import fr.ensma.lias.rql.dbimport.PostgresNameNormalizer; +import fr.ensma.lias.rql.sql.SQLManager; + + +/** + * @author Bilal REZKELLAH + */ +public class PostgresSchemaDAO extends AbstractSchemaDAO { + + @Inject + IConfiguration cfg; + + @Inject + IConfigurationDAO iconfig; + + public String cellTypeMap(CellType cellType) { + if (cellType == CellType.STRING) { + return "TEXT"; + } else if (cellType == CellType.NUMERIC) { + return "BIGINT"; + } else if (cellType == CellType.BOOLEAN) { + return "BOOLEAN"; + } else { + return null; + } + } + + public String importTable(XSSFSheet sheet, List intList, String tableName, String projectID) + throws SQLException, JsonParseException, JsonMappingException, IOException { + String scriptSQL = ""; + String createTable = null; + List colTypeList = new ArrayList(); + System.out.println(cfg.getConfiguration().rqlDbName()); + + NameNormalizer nNormalizer = new PostgresNameNormalizer(); + + SQLManager sql = new SQLManager( + new SqlCoreConf(cfg.getConfiguration().rqlDbName(), cfg.getConfiguration().rqlDbHost(), + cfg.getConfiguration().rqlDbPort(), cfg.getConfiguration().rqlDbType(), + cfg.getConfiguration().rqlDbAdminLogin(), cfg.getConfiguration().rqlDbAdminPwd())); + + sql.openDB(); + Row titleRow = sheet.getRow(0); + createTable = "CREATE TABLE " + nNormalizer.colNameNormalizer(tableName) + " ("; + + List header = new ArrayList(); + DataFormatter formatter = new DataFormatter(); + for (int j = 0; j < titleRow.getLastCellNum(); j++) { + String val = formatter.formatCellValue(titleRow.getCell(j)); + header.add(val); + } + Set set = new LinkedHashSet<>(); + for (String str : header) { + if (!str.equals("")) { + String value = str; + for (int i1 = 1; !set.add(value); i1++) { + value = str + i1; + } + } + } + header = new ArrayList(); + header.addAll(set); + for (int i = 0; i < intList.size(); i++) { + if (i == 0) { + createTable += nNormalizer.colNameNormalizer(header.get(intList.get(i))) + " " + + cellTypeMap(getColType(sheet, intList.get(i))); + } else { + createTable += ", " + nNormalizer.colNameNormalizer(header.get(intList.get(i))) + " " + + cellTypeMap(colTypeList.get(i)); + + } + } + createTable += ")"; + scriptSQL += createTable; + irql.executeSqlQuery(createTable, iconfig.getConfigByID(projectID)); + String insertRow = ""; + insertRow = "INSERT INTO " + nNormalizer.colNameNormalizer(tableName) + " ("; + for (int i = 0; i < intList.size(); i++) { + if (i == 0) { + insertRow += nNormalizer.colNameNormalizer(header.get(intList.get(i))); + } else { + insertRow += ", " + nNormalizer.colNameNormalizer(header.get(intList.get(i))); + } + } + insertRow += ") "; + String values = ""; + Iterator iteratorRow = sheet.iterator(); + if (iteratorRow.hasNext()) + iteratorRow.next(); + while (iteratorRow.hasNext()) { + values = insertRow + "VALUES("; + Row row = iteratorRow.next(); + for (int i = 0; i < intList.size(); i++) { + if (colTypeList.get(i) == CellType.STRING) { + String val = formatter.formatCellValue(row.getCell(intList.get(i))); + if (i == 0) { + values += "'" + val.replace("'", "") + "'"; + } else { + values += ", " + "'" + val.replace("'", "") + "'"; + } + } else if (colTypeList.get(i) == CellType.NUMERIC) { + Integer val = -1; + val = (int) row.getCell(intList.get(i)).getNumericCellValue(); + if (i == 0) { + values += val; + } else { + values += ", " + val; + } + } else if (colTypeList.get(i) == CellType.BOOLEAN) { + + } else { + boolean val = (boolean) row.getCell(intList.get(i)).getBooleanCellValue(); + if (i == 0) { + values += val; + } else { + values += ", " + val; + } + } + } + values += ")"; + scriptSQL += values; + sql.insertRow(values); + } + sql.closeDB(); + return scriptSQL; + }; +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/FavoriteDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/FavoriteDAO.java new file mode 100644 index 0000000..96dce6a --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/FavoriteDAO.java @@ -0,0 +1,105 @@ +package fr.ensma.lias.rql.dao.dbschema.favorite; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import fr.ensma.lias.rql.dao.postgressession.IPostgresSession; +import fr.ensma.lias.rql.dto.Favorite; + +/** + * @author Bilal REZKELLAH + */ +public class FavoriteDAO implements IFavoriteDAO { + + @Inject + IPostgresSession ips; + + @Override + public String createFavorite(Favorite favorite) throws SQLException { + String SQL = "INSERT INTO favorite (query,creationdate,description,projectID,favoritename,type) " + + "VALUES(?,?,?,?,?,?)"; + long id = 0; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); + pstmt.setString(1, favorite.getQuery()); + pstmt.setString(2, favorite.getCreationDate()); + pstmt.setString(3, favorite.getDescription()); + pstmt.setInt(4, Integer.valueOf(favorite.getProjectID())); + pstmt.setString(5, favorite.getName()); + pstmt.setString(6, favorite.getType()); + int affectedRows = pstmt.executeUpdate(); + // check the affected rows + if (affectedRows > 0) { + // get the ID back + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + id = rs.getLong(1); + } + } + return Long.toString(id); + } + + @Override + public boolean deleteFavorite(String favoriteID) throws SQLException { + String SQL = "DELETE FROM FAVORITE WHERE favoriteid = ? "; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); + pstmt.setInt(1, Integer.valueOf(favoriteID)); + pstmt.execute(); + return pstmt.execute(); + } + + @Override + public List getAllFavoriteByProject(String projectID) throws SQLException { + Favorite favorite; + List favoriteList = new ArrayList(); + Connection conn = ips.getConnection(); + String query = "SELECT * FROM FAVORITE WHERE projectid = ? "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setInt(1, Integer.valueOf(projectID)); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + favorite = new Favorite(); + favorite.setQuery(rs.getString("query")); + favorite.setCreationDate(rs.getString("creationdate")); + favorite.setProjectID(String.valueOf(rs.getInt("projectid"))); + favorite.setId(rs.getString("favoriteid")); + favorite.setDescription(rs.getString("description")); + favorite.setName(rs.getString("favoritename")); + favorite.setType(rs.getString("type")); + favoriteList.add(favorite); + } + return favoriteList; + } + + @Override + public List getAllFavoriteSQLQueries(String projectID) throws SQLException { + Favorite favorite; + List favoriteList = new ArrayList(); + Connection conn = ips.getConnection(); + String query = "SELECT * FROM FAVORITE WHERE projectid = ? and type = 'SQL' "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setInt(1, Integer.valueOf(projectID)); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + favorite = new Favorite(); + favorite.setQuery(rs.getString("query")); + favorite.setCreationDate(rs.getString("creationdate")); + favorite.setProjectID(String.valueOf(rs.getInt("projectid"))); + favorite.setId(rs.getString("favoriteid")); + favorite.setDescription(rs.getString("description")); + favorite.setName(rs.getString("favoritename")); + favorite.setType(rs.getString("type")); + favoriteList.add(favorite); + } + return favoriteList; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/IFavoriteDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/IFavoriteDAO.java new file mode 100644 index 0000000..917a74b --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/dbschema/favorite/IFavoriteDAO.java @@ -0,0 +1,20 @@ +package fr.ensma.lias.rql.dao.dbschema.favorite; + +import java.sql.SQLException; +import java.util.List; + +import fr.ensma.lias.rql.dto.Favorite; + +/** + * @author Bilal REZKELLAH + */ +public interface IFavoriteDAO { + + String createFavorite(Favorite favorite) throws SQLException; + + boolean deleteFavorite(String favoriteID) throws SQLException; + + List getAllFavoriteByProject(String projectID) throws SQLException; + + List getAllFavoriteSQLQueries(String projectID) throws SQLException; +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/inmemory/InMemory.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/inmemory/InMemory.java new file mode 100644 index 0000000..f1af1ec --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/inmemory/InMemory.java @@ -0,0 +1,63 @@ +package fr.ensma.lias.rql.dao.inmemory; + +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Singleton; + +import fr.ensma.lias.rql.baseresults.BaseResult; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; + +/** + * @author Bilal REZKELLAH + */ +@Singleton +public class InMemory { + + private Map RqlQueryDB; + + private Map SqlQueryDB; + + private Map RqlBaseDB; + + private Map rqlParserDB; + + public Map getRqlParserDB() { + return rqlParserDB; + } + + public void setRqlParserDB(Map rqlParserDB) { + this.rqlParserDB = rqlParserDB; + } + + public Map getRqlQueryDB() { + return RqlQueryDB; + } + + public void setRqlQueryDB(Map rqlQueryDB) { + RqlQueryDB = rqlQueryDB; + } + + public Map getRqlBaseDB() { + return RqlBaseDB; + } + + public void setRqlBaseDB(Map rqlBaseDB) { + RqlBaseDB = rqlBaseDB; + } + + public InMemory() { + RqlQueryDB = new HashMap(); + SqlQueryDB = new HashMap(); + RqlBaseDB = new HashMap(); + rqlParserDB = new HashMap(); + } + + public Map getSqlQueryDB() { + return SqlQueryDB; + } + + public void setSqlQueryDB(Map sqlQueryDB) { + SqlQueryDB = sqlQueryDB; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/IPostgresSession.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/IPostgresSession.java new file mode 100644 index 0000000..ac7ad1f --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/IPostgresSession.java @@ -0,0 +1,12 @@ +package fr.ensma.lias.rql.dao.postgressession; + +import java.sql.Connection; + +/** + * @author Bilal REZKELLAH + */ +public interface IPostgresSession { + + Connection getConnection(); + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/PostgresSession.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/PostgresSession.java new file mode 100644 index 0000000..4da6202 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/postgressession/PostgresSession.java @@ -0,0 +1,42 @@ +package fr.ensma.lias.rql.dao.postgressession; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import javax.inject.Singleton; + +import fr.ensma.lias.rql.cfg.Configuration; + + +/** + * @author Bilal REZKELLAH + */ +@Singleton +public class PostgresSession implements IPostgresSession { + + Configuration cfg = new Configuration(); + private Connection cx; + + public PostgresSession() throws SQLException { + System.out.println(cfg.getConfiguration().rqlDbAdminLogin()); + cx = DriverManager.getConnection( + "jdbc:postgresql://" + cfg.getConfiguration().rqlDbHost() + ":" + cfg.getConfiguration().rqlDbPort() + + "/" + "rql", + cfg.getConfiguration().rqlDbAdminLogin(), cfg.getConfiguration().rqlDbAdminPwd()); + } + + @Override + public Connection getConnection() { + return cx; + } + + public Connection getCx() { + return cx; + } + + public void setCx(Connection cx) { + this.cx = cx; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/IProjectDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/IProjectDAO.java new file mode 100644 index 0000000..f56f11e --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/IProjectDAO.java @@ -0,0 +1,23 @@ +package fr.ensma.lias.rql.dao.project; + +import java.sql.SQLException; +import java.util.List; + +import fr.ensma.lias.rql.dto.Project; + +/** + * @author Bilal REZKELLAH + */ +public interface IProjectDAO { + + List getAllProjectByUser(String UserID) throws SQLException; + + String createProject(Project project) throws SQLException; + + Project getProjectById(String projectID) throws SQLException; + + boolean deleteProjectbyId(String projectID) throws SQLException; + + boolean updateProject(Project project) throws SQLException; + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/ProjectDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/ProjectDAO.java new file mode 100644 index 0000000..909da13 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/project/ProjectDAO.java @@ -0,0 +1,128 @@ +package fr.ensma.lias.rql.dao.project; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.dao.postgressession.IPostgresSession; +import fr.ensma.lias.rql.dao.userdao.IUserDAO; +import fr.ensma.lias.rql.dto.Project; + +/** + * @author Bilal REZKELLAH + */ +public class ProjectDAO implements IProjectDAO { + + @Inject + IConfiguration cfg; + + @Inject + IPostgresSession ips; + + @Inject + IUserDAO iuser; + + @Override + public List getAllProjectByUser(String UserID) throws SQLException { + Project project; + List projectList = new ArrayList(); + Connection conn = ips.getConnection(); + String query = "SELECT * FROM PROJECT WHERE userid = ? union select p.* from project p,collaborator c where c.userid = ? and c.projectid = p.projectid "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, UserID); + pstmt.setString(2, UserID); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + project = new Project(); + project.setName(rs.getString("projectname")); + project.setCreationDate(rs.getString("creationdate")); + project.setId(rs.getString("projectid")); + project.setCollaborators(iuser.getCollaborators(rs.getString("projectid"), UserID)); + project.setUserid(rs.getString("userid")); + project.setDescription(rs.getString("description")); + projectList.add(project); + } + return projectList; + } + + @Override + public String createProject(Project project) throws SQLException { + String SQL = "INSERT INTO PROJECT (projectname,creationdate,userid,description) " + "VALUES(?,?,?,?)"; + long id = 0; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); + pstmt.setString(1, project.getName()); + pstmt.setString(2, project.getCreationDate()); + pstmt.setString(3, project.getUserid()); + pstmt.setString(4, project.getDescription()); + int affectedRows = pstmt.executeUpdate(); + // check the affected rows + if (affectedRows > 0) { + // get the ID back + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + id = rs.getLong(1); + } + } + return Long.toString(id); + } + + @Override + public Project getProjectById(String projectID) throws SQLException { + Project project; + Connection conn = ips.getConnection(); + String query = "SELECT * FROM PROJECT WHERE projectid = ? "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setInt(1, Integer.valueOf(projectID)); + ResultSet rs = pstmt.executeQuery(); + rs.next(); + project = new Project(); + project.setName(rs.getString("projectname")); + project.setCreationDate(rs.getString("creationdate")); + project.setId(rs.getString("projectid")); + project.setUserid(rs.getString("userid")); + project.setDescription(rs.getString("description")); + + return project; + } + + @Override + public boolean deleteProjectbyId(String projectID) throws SQLException { + String SQL = "DELETE FROM PROJECT WHERE projectid = ? "; + String SQL2 = "DELETE FROM DATABASE WHERE projectid = ? "; + String SQL3 = "DELETE FROM collaborator WHERE projectid = ? "; + String SQL4 = "DELETE FROM favorite WHERE projectid = ? "; + + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL2); + pstmt.setInt(1, Integer.valueOf(projectID)); + pstmt.execute(); + pstmt = conn.prepareStatement(SQL3); + pstmt.setInt(1, Integer.valueOf(projectID)); + pstmt.execute(); + pstmt = conn.prepareStatement(SQL4); + pstmt.setInt(1, Integer.valueOf(projectID)); + pstmt.execute(); + pstmt = conn.prepareStatement(SQL); + pstmt.setInt(1, Integer.valueOf(projectID)); + return pstmt.execute(); + } + + @Override + public boolean updateProject(Project project) throws SQLException { + String SQL = "UPDATE PROJECT SET projectname = ?, description = ? WHERE projectid = ? "; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL); + pstmt.setString(1, project.getName()); + pstmt.setInt(3, Integer.valueOf(project.getId())); + pstmt.setString(2, project.getDescription()); + return pstmt.execute(); + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/IQueryDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/IQueryDAO.java new file mode 100644 index 0000000..1cca2d3 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/IQueryDAO.java @@ -0,0 +1,23 @@ +package fr.ensma.lias.rql.dao.query; + +import fr.ensma.lias.rql.baseresults.BaseResult; +import fr.ensma.lias.rql.dto.TypeQuery; +import fr.ensma.lias.rql.model.DataBaseConfig; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; + +/** + * @author Bilal REZKELLAH + */ +public interface IQueryDAO { + + TypeQuery createRQLQuery(String query, DataBaseConfig dbc) throws Exception; + + String getQueryByID(String id); + + BaseResult getBaseByID(String id); + + TypeQuery createSQLQuery(String query) throws Exception; + + RQLParser getParserByID(String id); + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/QueryDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/QueryDAO.java new file mode 100644 index 0000000..6b630cd --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/query/QueryDAO.java @@ -0,0 +1,84 @@ +package fr.ensma.lias.rql.dao.query; + +import java.sql.ResultSet; + +import javax.inject.Inject; + +import fr.ensma.lias.rql.baseresults.BaseResult; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.dao.inmemory.InMemory; +import fr.ensma.lias.rql.dto.QueryEnumType; +import fr.ensma.lias.rql.dto.TypeQuery; +import fr.ensma.lias.rql.model.DataBaseConfig; +import fr.ensma.lias.rql.rqlgrammar.RQLParser; +import fr.ensma.lias.rql.sql.SQLManager; + +/** + * @author Bilal REZKELLAH + */ +public class QueryDAO implements IQueryDAO { + + @Inject + InMemory myInstance; + + @Inject + IConfiguration cfg; + + @Override + public TypeQuery createRQLQuery(String query, DataBaseConfig dbc) throws Exception { + RQLParser parse = RQLParser.parse(query); + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + System.out.println(parse.mysqlQuery()); + System.out.println(parse.oracleQuery()); + String myQuery = ""; + if (dbc.getDataBaseType().equals("oracle")) { + myQuery = parse.oracleQuery(); + } else if (dbc.getDataBaseType().equals("postgresql")) { + myQuery = parse.postgresQuery(); + } else if (dbc.getDataBaseType().equals("mysql")) { + myQuery = parse.oracleQuery(); + } else { + } + ResultSet result = sql.execute(myQuery); + BaseResult base = new BaseResult(); + base.resultsToList(result); + long start = System.currentTimeMillis(); + String queryKey = Long.toString(start); + System.out.println(queryKey); + myInstance.getRqlParserDB().put(queryKey, parse); + myInstance.getRqlQueryDB().put(queryKey, query); + myInstance.getRqlBaseDB().put(queryKey, base); + sql.closeDB(); + return new TypeQuery(QueryEnumType.RQL, myQuery, queryKey, base.getContent(), parse.getAttributeList()); + } + + @Override + public TypeQuery createSQLQuery(String query) throws Exception { + long start = System.currentTimeMillis(); + String queryKey = Long.toString(start); + System.out.println(queryKey); + System.out.println(myInstance.getSqlQueryDB().size()); + myInstance.getSqlQueryDB().put(queryKey, query); + return new TypeQuery(QueryEnumType.SQL, null, queryKey, null, null); + } + + @Override + public String getQueryByID(String id) { + String query = myInstance.getRqlQueryDB().get(id); + return query; + } + + @Override + public BaseResult getBaseByID(String id) { + BaseResult base = myInstance.getRqlBaseDB().get(id); + return base; + } + + @Override + public RQLParser getParserByID(String id) { + return myInstance.getRqlParserDB().get(id); + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/IUserDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/IUserDAO.java new file mode 100644 index 0000000..b0b858d --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/IUserDAO.java @@ -0,0 +1,25 @@ +package fr.ensma.lias.rql.dao.userdao; + +import java.sql.SQLException; +import java.util.List; + +import fr.ensma.lias.rql.dto.User; + +/** + * @author Bilal REZKELLAH + */ +public interface IUserDAO { + + boolean ifUserNameExist(String userName) throws SQLException; + + String getPasswordHash(String userName) throws SQLException; + + List getAllUsers(String userid) throws SQLException; + + String createCollaborator(String projectID, String userID) throws SQLException; + + boolean deleteCollabortor(String projectID, String userID) throws SQLException; + + List getCollaborators(String projectID, String userID) throws SQLException; + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/UserDAO.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/UserDAO.java new file mode 100644 index 0000000..85abe1f --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dao/userdao/UserDAO.java @@ -0,0 +1,113 @@ +package fr.ensma.lias.rql.dao.userdao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import fr.ensma.lias.rql.dao.postgressession.IPostgresSession; +import fr.ensma.lias.rql.dto.User; + +/** + * @author Bilal REZKELLAH + */ +public class UserDAO implements IUserDAO { + + @Inject + IPostgresSession ips; + + @Override + public boolean ifUserNameExist(String userName) throws SQLException { + Connection conn = ips.getConnection(); + String query = "SELECT * FROM users WHERE username = ? "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, userName); + ResultSet rs = pstmt.executeQuery(); + return rs.isBeforeFirst(); + } + + @Override + public String getPasswordHash(String userName) throws SQLException { + Connection conn = ips.getConnection(); + String query = "SELECT hashpassword FROM users WHERE username = ? "; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, userName); + ResultSet rs = pstmt.executeQuery(); + rs.next(); + return rs.getString("hashpassword"); + } + + @Override + public List getAllUsers(String userid) throws SQLException { + Connection conn = ips.getConnection(); + List userList = new ArrayList(); + User user; + String query = "SELECT username,Lastname,Firstname FROM users WHERE username != ?"; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, userid); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + user = new User(); + user.setUsername(rs.getString("username")); + user.setLastName(rs.getString("lastname")); + user.setFirstName(rs.getString("firstname")); + userList.add(user); + } + return userList; + } + + @Override + public String createCollaborator(String projectID, String userID) throws SQLException { + String SQL = "INSERT INTO collaborator (projectid,userid) " + "VALUES(?,?)"; + long id = 0; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); + pstmt.setInt(1, Integer.valueOf(projectID)); + pstmt.setString(2, userID); + int affectedRows = pstmt.executeUpdate(); + // check the affected rows + if (affectedRows > 0) { + // get the ID back + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + id = rs.getLong(1); + } + } + return Long.toString(id); + } + + @Override + public boolean deleteCollabortor(String projectID, String userID) throws SQLException { + String SQL = "DELETE FROM collaborator WHERE projectid = ? and userid = ?"; + Connection conn = ips.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(SQL); + pstmt.setInt(1, Integer.valueOf(projectID)); + pstmt.setString(2, userID); + return pstmt.execute(); + } + + @Override + public List getCollaborators(String projectID, String userID) throws SQLException { + Connection conn = ips.getConnection(); + User user; + List userList = new ArrayList(); + String query = "select username,lastname,firstname from collaborator c, users u where c.userid = u.username and c.userid != ? and c.projectid = ?"; + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, userID); + pstmt.setInt(2, Integer.valueOf(projectID)); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + user = new User(); + user.setUsername(rs.getString("username")); + user.setFirstName(rs.getString("firstname")); + user.setLastName(rs.getString("lastname")); + userList.add(user); + } + return userList; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/MySqlNameNormalizer.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/MySqlNameNormalizer.java new file mode 100644 index 0000000..9094f18 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/MySqlNameNormalizer.java @@ -0,0 +1,21 @@ +package fr.ensma.lias.rql.dbimport; + +/** + * @author Bilal REZKELLAH + */ +public class MySqlNameNormalizer extends NameNormalizer { + + @Override + public String colNameNormalizer(String source) { + source = withoutSpecialChar(withoutAccents(source)).replace(" ", "_"); + while (source.endsWith("_")) { + source = source.substring(0, source.length() - 1); + } + while (source.startsWith("_")) { + source = source.substring(1, source.length()); + } + source = source.substring(0, Math.min(source.length(), 64)); + return source; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/NameNormalizer.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/NameNormalizer.java new file mode 100644 index 0000000..53021bf --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/NameNormalizer.java @@ -0,0 +1,20 @@ +package fr.ensma.lias.rql.dbimport; + +import java.text.Normalizer; + +/** + * @author Bilal REZKELLAH + */ +public abstract class NameNormalizer { + + public String withoutAccents(String source) { + String normalized = Normalizer.normalize(source, Normalizer.Form.NFD); + return normalized.replaceAll("[\u0300-\u036F]", ""); + } + + public String withoutSpecialChar(String source) { + return source.replaceAll("[^a-zA-Z0-9\\s]", "_"); + } + + public abstract String colNameNormalizer(String source); +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/OracleNameNormalizer.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/OracleNameNormalizer.java new file mode 100644 index 0000000..55965db --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/OracleNameNormalizer.java @@ -0,0 +1,21 @@ +package fr.ensma.lias.rql.dbimport; + +/** + * @author Bilal REZKELLAH + */ +public class OracleNameNormalizer extends NameNormalizer { + + @Override + public String colNameNormalizer(String source) { + source = withoutSpecialChar(withoutAccents(source)).replace(" ", ""); + while (source.endsWith("_")) { + source = source.substring(0, source.length() - 1); + } + while (source.startsWith("_")) { + source = source.substring(1, source.length()); + } + source = source.substring(0, Math.min(source.length(), 30)); + return source; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/PostgresNameNormalizer.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/PostgresNameNormalizer.java new file mode 100644 index 0000000..37f5295 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/dbimport/PostgresNameNormalizer.java @@ -0,0 +1,22 @@ +package fr.ensma.lias.rql.dbimport; + +/** + * @author Bilal REZKELLAH + */ +public class PostgresNameNormalizer extends NameNormalizer { + + @Override + public String colNameNormalizer(String source) { + + source = withoutSpecialChar(withoutAccents(source)).replace(" ", ""); + while (source.endsWith("_")) { + source = source.substring(0, source.length() - 1); + } + while (source.startsWith("_")) { + source = source.substring(1, source.length()); + } + source = source.substring(0, Math.min(source.length(), 60)); + return source; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/model/DataBaseConfig.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/model/DataBaseConfig.java new file mode 100644 index 0000000..3ed79c9 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/model/DataBaseConfig.java @@ -0,0 +1,93 @@ +package fr.ensma.lias.rql.model; + +/** + * @author Bilal REZKELLAH + */ +public class DataBaseConfig { + + private String projectid; + + private String dataBaseName; + + private String dataBaseHost; + + private Integer dataBasePort; + + private String dataBaseUser; + + private String dataBasePassword; + + private String dataBaseType; + + public String getDataBaseName() { + return dataBaseName; + } + + public void setDataBaseName(String dataBaseName) { + this.dataBaseName = dataBaseName; + } + + public DataBaseConfig(String projectid, String dataBaseName, String dataBaseHost, Integer dataBasePort, + String dataBaseUser, String dataBasePassword, String dataBaseType) { + super(); + this.projectid = projectid; + this.dataBaseName = dataBaseName; + this.dataBaseHost = dataBaseHost; + this.dataBasePort = dataBasePort; + this.dataBaseUser = dataBaseUser; + this.dataBasePassword = dataBasePassword; + this.dataBaseType = dataBaseType; + } + + public DataBaseConfig() { + } + + public String getDataBaseHost() { + return dataBaseHost; + } + + public void setDataBaseHost(String dataBaseHost) { + this.dataBaseHost = dataBaseHost; + } + + public Integer getDataBasePort() { + return dataBasePort; + } + + public void setDataBasePort(Integer dataBasePort) { + this.dataBasePort = dataBasePort; + } + + public String getDataBaseUser() { + return dataBaseUser; + } + + public void setDataBaseUser(String dataBaseUser) { + this.dataBaseUser = dataBaseUser; + } + + public String getDataBasePassword() { + return dataBasePassword; + } + + public void setDataBasePassword(String dataBasePassword) { + this.dataBasePassword = dataBasePassword; + } + + public String getDataBaseType() { + return dataBaseType; + } + + public void setDataBaseType(String dataBaseType) { + this.dataBaseType = dataBaseType; + } + + public String getProjectid() { + return projectid; + } + + public void setProjectid(String projectid) { + this.projectid = projectid; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/AuthenticationResourceImpl.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/AuthenticationResourceImpl.java new file mode 100644 index 0000000..d2a3942 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/AuthenticationResourceImpl.java @@ -0,0 +1,73 @@ +package fr.ensma.lias.rql.service; + +import java.sql.SQLException; +import java.util.Date; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.AuthToken; +import fr.ensma.lias.rql.RqlUtil; +import fr.ensma.lias.rql.api.AuthenticationResource; +import fr.ensma.lias.rql.api.NotYetImplementedException; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.RqlConfig; +import fr.ensma.lias.rql.dao.userdao.IUserDAO; +import fr.ensma.lias.rql.dto.Credentials; + +/** + * @author Bilal REZKELLAH + */ +public class AuthenticationResourceImpl implements AuthenticationResource { + + @Inject + IUserDAO iuser; + + @Inject + IConfiguration refConfiguration; + + @Override + public Response login(Credentials credentials) { + if (credentials == null || credentials.getUsername() == null || credentials.getUsername().isEmpty() + || credentials.getPassword() == null || credentials.getPassword().isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.BAD_REQUEST); + } + final RqlConfig configuration = refConfiguration.getConfiguration(); + try { + if (!iuser.ifUserNameExist(credentials.getUsername())) { + throw new WebApplicationException("User is not unauthorized.", Status.UNAUTHORIZED); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new WebApplicationException("Server Error.", Status.BAD_REQUEST); + + } + + String hashPassword = null; + try { + hashPassword = iuser.getPasswordHash(credentials.getUsername()); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new WebApplicationException("Server Error.", Status.BAD_REQUEST); + + } + if (RqlUtil.checkPassword(credentials.getPassword(), hashPassword)) { + AuthToken currentToken = new AuthToken(credentials.getUsername(), new Date()); + final String encryptToken = RqlUtil.encryptToken(currentToken, configuration.encryptPassword(), + configuration.encryptNoise()); + return Response.ok(encryptToken).build(); + } else { + throw new WebApplicationException("Password doesn't not match.", Status.UNAUTHORIZED); + } + } + + @Override + public Response logout() { + System.out.println("AuthenticationResourceImpl.logout()"); + throw new NotYetImplementedException(); + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/BearerTokenFilter.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/BearerTokenFilter.java new file mode 100644 index 0000000..a932c26 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/BearerTokenFilter.java @@ -0,0 +1,65 @@ +package fr.ensma.lias.rql.service; + +import java.io.IOException; +import java.util.Date; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.AuthToken; +import fr.ensma.lias.rql.RqlConstant; +import fr.ensma.lias.rql.RqlUtil; +import fr.ensma.lias.rql.api.TokenAuthenticated; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.RqlConfig; + +/** + * @author Bilal REZKELLAH + */ +@TokenAuthenticated +public class BearerTokenFilter implements ContainerRequestFilter { + + @Inject + IConfiguration refConfiguration; + + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + String token = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); + + final RqlConfig configuration = refConfiguration.getConfiguration(); + + final AuthToken decryptToken = RqlUtil.decryptToken(token, configuration.encryptPassword(), + configuration.encryptNoise()); + + if (decryptToken != null) { + final Date startDate = decryptToken.getStartDate(); + + if (startDate != null) { + final long diff = new Date().getTime() - startDate.getTime(); + if ((diff / 1000) < getSessionTimeOut(configuration.sessionTimeout())) { + if (!(decryptToken.getIdentifiant().equals(configuration.identificationUser()))) { + throw new WebApplicationException("Token is wrong.", Status.UNAUTHORIZED); + } + } else { + throw new WebApplicationException("Session timeout.", Status.UNAUTHORIZED); + } + } else { + throw new WebApplicationException("Token is wrong.", Status.UNAUTHORIZED); + } + } else { + throw new WebApplicationException("User is not unauthorized.", Status.UNAUTHORIZED); + } + } + + public static int getSessionTimeOut(String configurationValue) { + try { + return 60 * Integer.parseInt(configurationValue); + } catch (NumberFormatException e) { + return RqlConstant.SESSION_TIMEOUT_DEFAULT; + } + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/DataBaseImportImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/DataBaseImportImp.java new file mode 100644 index 0000000..4c6f60d --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/DataBaseImportImp.java @@ -0,0 +1,377 @@ +package fr.ensma.lias.rql.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; + +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.json.JSONObject; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import fr.ensma.lias.rql.api.DataBaseImport; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.cfg.SqlCoreConf; +import fr.ensma.lias.rql.core.IRql; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dto.FilePreview; +import fr.ensma.lias.rql.dto.SheetContent; +import fr.ensma.lias.rql.dto.TableImportResult; +import fr.ensma.lias.rql.model.DataBaseConfig; +import fr.ensma.lias.rql.sql.SQLManager; + +/** + * @author Bilal REZKELLAH + */ +public class DataBaseImportImp implements DataBaseImport { + + @Inject + IConfiguration cfg; + + @Inject + IRql irql; + + @Inject + IConfigurationDAO iconfig; + + private XSSFWorkbook workbook; + + @Override + public FilePreview uploadFile(InputStream file, FormDataContentDisposition fileDetail) { + FilePreview filePreview = new FilePreview(); + long key = 0; + File resultDir = new File(cfg.getConfiguration().tmpResultsDir()); + resultDir.mkdir(); + if (fileDetail == null || file == null) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } else { + Workbook workbook = null; + try { + key = System.currentTimeMillis(); + workbook = WorkbookFactory.create(file); + SheetContent sheeti = null; + for (int i = 0; i < workbook.getNumberOfSheets(); i++) { + sheeti = new SheetContent(); + sheeti.setRows(getXlsxToJsonarray(workbook, i)); + Sheet sheet = workbook.getSheetAt(i); + sheeti.setNbRow(sheet.getLastRowNum()); + Row titleRow = sheet.getRow(0); + List header = new ArrayList(); + DataFormatter formatter = new DataFormatter(); + for (int j = 0; j < titleRow.getLastCellNum(); j++) { + String val = formatter.formatCellValue(titleRow.getCell(j)); + header.add(val); + } + Set set = new LinkedHashSet<>(); + for (String str : header) { + if (!str.equals("")) { + String value = str; + // Iterate as long as you can't add the value indicating that we have + // already the value in the set + for (int i1 = 1; !set.add(value); i1++) { + value = str + i1; + } + } + } + header = new ArrayList(); + header.addAll(set); + System.out.println(set); + sheeti.setHeader(header); + sheeti.setTableName(workbook.getSheetName(i)); + filePreview.getSheetList().add(sheeti); + } + filePreview.setGoNext(true); + filePreview.setFileID(Long.toString(key)); + + } catch (EncryptedDocumentException | InvalidFormatException | IOException | NullPointerException e1) { + e1.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e1.getMessage()).build(); + throw new WebApplicationException(response); + } + FileOutputStream fileOut = null; + try { + fileOut = new FileOutputStream(cfg.getConfiguration().tmpResultsDir() + "/" + key + "tmpUpload.xlsx"); + workbook.write(fileOut); + fileOut.close(); + } catch (IOException e) { + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + return filePreview; + } + + public List getXlsxToJsonarray(Workbook wb, int sheetIndex) throws IOException, InvalidFormatException { + + Sheet sheet = wb.getSheetAt(sheetIndex); + Row titleRow = sheet.getRow(0); + Row dataRow = null; + List listObject = new ArrayList(); + ObjectMapper mapper = new ObjectMapper(); + JSONObject jtmp = null; + List header = new ArrayList(); + DataFormatter formatter = new DataFormatter(); + for (int j = 0; j < titleRow.getLastCellNum(); j++) { + String val = formatter.formatCellValue(titleRow.getCell(j)); + header.add(val); + } + Set set = new LinkedHashSet<>(); + for (String str : header) { + if (!str.equals("")) { + String value = str; + // Iterate as long as you can't add the value indicating that we have + // already the value in the set + for (int i1 = 1; !set.add(value); i1++) { + value = str + i1; + } + } + } + header = new ArrayList(); + header.addAll(set); + for (int i = 1; i <= Math.min(sheet.getLastRowNum(), 100); i++) { + jtmp = new JSONObject(); + dataRow = sheet.getRow(i); + for (int j = 0; j < header.size(); j++) { + + if (formatter.formatCellValue(dataRow.getCell(j)) == null) { + } else { + String val = header.get(j); + String val2 = formatter.formatCellValue(dataRow.getCell(j)); + jtmp.put(val, val2); + } + } + Object obj = mapper.readValue(jtmp.toString(), Object.class); + listObject.add(obj); + } + return listObject; + } + + public CellType getColType(XSSFSheet sheet, Integer index) { + Row rowi = sheet.getRow(1); + CellType cellType = null; + int rowIndex = 1; + cellType = rowi.getCell(index).getCellTypeEnum(); + if (cellType == CellType.BLANK) { + while (cellType == CellType.BLANK && rowIndex < sheet.getPhysicalNumberOfRows() - 1) { + rowi = sheet.getRow(++rowIndex); + cellType = rowi.getCell(index).getCellTypeEnum(); + } + if (rowIndex == sheet.getPhysicalNumberOfRows() - 1) { + cellType = CellType.STRING; + } + } + if (cellType == CellType.NUMERIC) { + rowIndex = 1; + while ((cellType == CellType.NUMERIC || cellType == CellType.BLANK) + && rowIndex < sheet.getPhysicalNumberOfRows() - 1) { + rowi = sheet.getRow(++rowIndex); + cellType = rowi.getCell(index).getCellTypeEnum(); + } + if (cellType != CellType.NUMERIC && cellType != CellType.BLANK) { + cellType = CellType.STRING; + } else { + + cellType = CellType.NUMERIC; + } + } + return cellType; + } + + public String cellTypeMap(CellType cellType, String dbType) { + if (cellType == CellType.STRING && dbType.equals("oracle")) { + return "VARCHAR2(200)"; + } else if (cellType == CellType.STRING && dbType.equals("postgresql")) { + return "TEXT"; + } else if (cellType == CellType.NUMERIC && dbType.equals("oracle")) { + return "NUMBER(20)"; + } else if (cellType == CellType.NUMERIC && dbType.equals("postgresql")) { + return "BIGINT"; + } else if (cellType == CellType.BOOLEAN) { + return "BOOLEAN"; + } else { + return null; + } + } + + @Override + public TableImportResult tableImport(String id, Integer sheetIndex, String tableName, String projectID, + String columnList) { + if (columnList.equals("[]") || columnList == null) { + Response response = Response.status(Status.BAD_REQUEST).entity("Please select one attribut at less") + .build(); + throw new WebApplicationException(response); + } + TableImportResult tir = null; + DataBaseConfig dbc = null; + try { + System.out.println(projectID); + dbc = iconfig.getConfigByID(projectID); + } catch (SQLException | IOException e3) { + // TODO Auto-generated catch block + e3.printStackTrace(); + } + SQLManager sql = new SQLManager(new SqlCoreConf(dbc.getDataBaseName(), dbc.getDataBaseHost(), + dbc.getDataBasePort(), dbc.getDataBaseType(), dbc.getDataBaseUser(), dbc.getDataBasePassword())); + PrintWriter writer = null; + try { + writer = new PrintWriter(cfg.getConfiguration().tmpResultsDir() + "/" + id + "_Script.txt", "UTF-8"); + } catch (FileNotFoundException | UnsupportedEncodingException e2) { + // TODO Auto-generated catch block + e2.printStackTrace(); + } + try { + sql.openDB(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + String createTable = null; + columnList = columnList.replace("[", "").replace("]", ""); + List columnRang = Arrays.asList(columnList.split(",")); + List intList = new ArrayList(); + List colTypeList = new ArrayList(); + if (columnRang.size() != 0) { + for (String s : columnRang) + if (!s.equals("")) + intList.add(Integer.valueOf(s)); + } + FileInputStream file; + try { + file = new FileInputStream(new File(cfg.getConfiguration().tmpResultsDir() + "/" + id + "tmpUpload.xlsx")); + workbook = new XSSFWorkbook(file); + XSSFSheet sheet = workbook.getSheetAt(sheetIndex); + tir = new TableImportResult(irql.normalizeName(tableName, dbc.getDataBaseType()), sheet.getLastRowNum(), + intList.size(), true); + for (int i = 0; i < intList.size(); i++) { + colTypeList.add(getColType(sheet, intList.get(i))); + } + Row titleRow = sheet.getRow(0); + createTable = "CREATE TABLE " + irql.normalizeName(tableName, dbc.getDataBaseType()) + " ("; + List header = new ArrayList(); + DataFormatter formatter = new DataFormatter(); + for (int j = 0; j < titleRow.getLastCellNum(); j++) { + String val = formatter.formatCellValue(titleRow.getCell(j)); + header.add(val); + } + Set set = new LinkedHashSet<>(); + for (String str : header) { + if (!str.equals("")) { + String value = str; + for (int i1 = 1; !set.add(value); i1++) { + value = str + i1; + } + } + } + header = new ArrayList(); + header.addAll(set); + for (int i = 0; i < intList.size(); i++) { + if (i == 0) { + createTable += irql.normalizeName(header.get(intList.get(i)), dbc.getDataBaseType()) + " " + + cellTypeMap(getColType(sheet, intList.get(i)), dbc.getDataBaseType()); + } else { + createTable += ", " + irql.normalizeName(header.get(intList.get(i)), dbc.getDataBaseType()) + " " + + cellTypeMap(colTypeList.get(i), dbc.getDataBaseType()); + + } + } + createTable += ")"; + writer.println(createTable); + irql.executeSqlQuery(createTable, dbc); + String insertRow = ""; + insertRow = "INSERT INTO " + irql.normalizeName(tableName, dbc.getDataBaseType()) + " ("; + for (int i = 0; i < intList.size(); i++) { + if (i == 0) { + insertRow += irql.normalizeName(header.get(intList.get(i)), dbc.getDataBaseType()); + } else { + insertRow += ", " + irql.normalizeName(header.get(intList.get(i)), dbc.getDataBaseType()); + } + } + insertRow += ") "; + String values = ""; + Iterator iteratorRow = sheet.iterator(); + if (iteratorRow.hasNext()) + iteratorRow.next(); + while (iteratorRow.hasNext()) { + values = insertRow + "VALUES("; + Row row = iteratorRow.next(); + for (int i = 0; i < intList.size(); i++) { + if (colTypeList.get(i) == CellType.STRING) { + String val = formatter.formatCellValue(row.getCell(intList.get(i))); + if (i == 0) { + values += "'" + val.replace("'", "") + "'"; + } else { + values += ", " + "'" + val.replace("'", "") + "'"; + } + } else if (colTypeList.get(i) == CellType.NUMERIC) { + Integer val = -1; + val = (int) row.getCell(intList.get(i)).getNumericCellValue(); + if (i == 0) { + values += val; + } else { + values += ", " + val; + } + } else if (colTypeList.get(i) == CellType.BOOLEAN) { + + } else { + boolean val = (boolean) row.getCell(intList.get(i)).getBooleanCellValue(); + if (i == 0) { + values += val; + } else { + values += ", " + val; + } + } + } + values += ")"; + writer.println(values); + sql.insertRow(values); + } + sql.closeDB(); + writer.close(); + + } catch (Exception e) { + System.out.println(e.getMessage()); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + + return tir; + } + + @Override + public Response scriptDownload(String id) { + ResponseBuilder rb = null; + File file = new File(cfg.getConfiguration().tmpResultsDir() + "/" + id + "_Script.txt"); + rb = Response.ok((Object) file); + rb.header("Content-Disposition", "attachment; filename=" + "/" + id + "_Script.txt"); + return rb.build(); + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/ProjectResourceImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/ProjectResourceImp.java new file mode 100644 index 0000000..8420b09 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/ProjectResourceImp.java @@ -0,0 +1,193 @@ +package fr.ensma.lias.rql.service; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.api.ProjectResource; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.core.IRql; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dao.dbschema.favorite.IFavoriteDAO; +import fr.ensma.lias.rql.dao.postgressession.IPostgresSession; +import fr.ensma.lias.rql.dao.project.IProjectDAO; +import fr.ensma.lias.rql.dao.userdao.IUserDAO; +import fr.ensma.lias.rql.dto.Favorite; +import fr.ensma.lias.rql.dto.Project; +import fr.ensma.lias.rql.dto.User; +import fr.ensma.lias.rql.model.DataBaseConfig; + +/** + * @author Bilal REZKELLAH + */ +public class ProjectResourceImp implements ProjectResource { + + @Inject + IProjectDAO iproject; + + @Inject + IUserDAO iuser; + + @Inject + IFavoriteDAO ifavorite; + + @Inject + IPostgresSession ips; + + @Inject + IConfigurationDAO icd; + + @Inject + IConfiguration cfg; + + @Inject + IRql irql; + + @Override + public List getAllProjectByUserID(String userID) { + + try { + return iproject.getAllProjectByUser(userID); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public String createNewProject(Project project) { + String date = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(new Date()); + project.setCreationDate(date); + String projectID = ""; + try { + if (project.getDbType().toLowerCase().equals("postgresql")) { + projectID = iproject.createProject(project); + String dbName = project.getName() + projectID; + DataBaseConfig dbc = new DataBaseConfig(projectID, + irql.normalizeName(dbName, project.getDbType().toLowerCase()).toLowerCase(), + cfg.getConfiguration().rqlDbHostMetier(), 5432, "postgres", "postgres", + project.getDbType().toLowerCase()); + icd.createConfig(dbc); + for (User user : project.getCollaborators()) { + iuser.createCollaborator(projectID, user.getUsername()); + } + String SQL = "CREATE DATABASE " + irql.normalizeName(dbName, project.getDbType().toLowerCase()); + Connection conn = DriverManager.getConnection( + "jdbc:postgresql://" + cfg.getConfiguration().rqlDbHostMetier() + ":" + + cfg.getConfiguration().rqlDbPort() + "/" + "postgres", + cfg.getConfiguration().rqlDbAdminLogin(), cfg.getConfiguration().rqlDbAdminPwd()); + PreparedStatement pstmt = conn.prepareStatement(SQL); + pstmt.execute(); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return projectID; + } + + @Override + public Project getProjectById(String id) { + try { + return iproject.getProjectById(id); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public boolean deleteProjectById(String id) { + try { + return iproject.deleteProjectbyId(id); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public boolean updateProject(Project project) { + // TODO Auto-generated method stub + try { + return iproject.updateProject(project); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public List getAllFavoriteByProject(String id) { + // TODO Auto-generated method stub + try { + return ifavorite.getAllFavoriteByProject(id); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public boolean deleteFavoriteById(String id) { + try { + return ifavorite.deleteFavorite(id); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public String createNewFavorite(Favorite favorite) { + try { + String date = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(new Date()); + favorite.setCreationDate(date); + if (irql.isRqlQuery(favorite.getQuery())) { + favorite.setType("RQL"); + } else { + favorite.setType("SQL"); + } + return ifavorite.createFavorite(favorite); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public List getAllFavoriteSqlQueries(String id) { + try { + return ifavorite.getAllFavoriteSQLQueries(id); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryConstructionImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryConstructionImp.java new file mode 100644 index 0000000..514357b --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryConstructionImp.java @@ -0,0 +1,32 @@ +package fr.ensma.lias.rql.service; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.api.QueryConstruction; +import fr.ensma.lias.rql.core.IRql; + +/** + * @author Bilal REZKELLAH + */ +public class QueryConstructionImp implements QueryConstruction { + + @Inject + IRql irql; + + @Override + public String getQuery(String QueryType, String isTable, String isALLData, String sqlQuery, String tableName, + String subsetWhere, String attributesList, String isConditional, String conditionalWhere, + String tolerence) { + if (QueryType == null || QueryType.isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } + String rqlQuery = ""; + rqlQuery = irql.constructQuery(QueryType, isTable, isALLData, sqlQuery, tableName, subsetWhere, attributesList, + isConditional.equals("true"), conditionalWhere, tolerence); + + return rqlQuery; + } + +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryResourceImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryResourceImp.java new file mode 100644 index 0000000..f8b58df --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/QueryResourceImp.java @@ -0,0 +1,131 @@ +package fr.ensma.lias.rql.service; + +import java.io.IOException; +import java.sql.SQLException; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import fr.ensma.lias.rql.api.QueryResource; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.core.IRql; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dao.inmemory.InMemory; +import fr.ensma.lias.rql.dao.query.IQueryDAO; +import fr.ensma.lias.rql.dto.CheckRuleResult; +import fr.ensma.lias.rql.dto.RQLResult; +import fr.ensma.lias.rql.dto.SQLResult; +import fr.ensma.lias.rql.dto.TypeQuery; +import fr.ensma.lias.rql.rqlgrammar.ParseException; + +/** + * @author Rezkellah Bilal + */ +public class QueryResourceImp implements QueryResource { + + @Inject + InMemory myInstance; + + @Inject + IConfiguration cfg; + + @Inject + IQueryDAO iquery; + + @Inject + IConfigurationDAO iconfig; + + @Inject + IRql irql; + + @Override + public SQLResult getResultSet(String ID, String ProjectID) throws JsonParseException, JsonMappingException, IOException { + if (ID == null || ID.isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } + System.out.println(ProjectID); + String query = myInstance.getSqlQueryDB().get(ID); + if (ID == null || ID.isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } + try { + SQLResult executeSqlQuery = irql.executeSqlQuery(query,iconfig.getConfigByID(ProjectID) ); + return executeSqlQuery; + } catch (SQLException e) { + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public TypeQuery createQuery(String query, String projectid) { + if (irql.isRqlQuery(query)) { + try { + return iquery.createRQLQuery(query, iconfig.getConfigByID(projectid)); + } catch (Exception e) { + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } else { + try { + return iquery.createSQLQuery(query); + } catch (Exception e) { + e.printStackTrace(); + throw new WebApplicationException("Query is bad.", Status.BAD_REQUEST); + } + } + } + + @Override + public RQLResult getAllRulesID(String id, String support, String confidence) { + try { + return irql.executeRqlQuery(id, Double.parseDouble(support), Double.parseDouble(confidence)); + } catch (Exception e) { + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public CheckRuleResult checkForThisRule(String id, String leftAttributes, String rightAttribute, String support, + String confidence, String projectID) { + long debut = System.currentTimeMillis(); + + try { + return irql.checkRule(debut, iconfig.getConfigByID(projectID), id, leftAttributes, rightAttribute, Double.parseDouble(support), + Double.parseDouble(confidence)); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new WebApplicationException("Query is bad.", Status.BAD_REQUEST); + } catch (NumberFormatException e) { + e.printStackTrace(); + throw new WebApplicationException("Query is bad.", Status.BAD_REQUEST); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new WebApplicationException("Connection faild", Status.BAD_REQUEST); + } catch (IOException e) { + e.printStackTrace(); + throw new WebApplicationException("Connection faild", Status.BAD_REQUEST); + + } + } + + @Override + public String isGoodConstructed(String query) { + try { + irql.testQuery(query); + } catch (Exception e) { + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + return "true"; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/SchemaResourceImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/SchemaResourceImp.java new file mode 100644 index 0000000..d336c8b --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/SchemaResourceImp.java @@ -0,0 +1,85 @@ +package fr.ensma.lias.rql.service; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.api.SchemaResource; +import fr.ensma.lias.rql.core.IRql; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dao.project.IProjectDAO; +import fr.ensma.lias.rql.dto.SchemaResult; +import fr.ensma.lias.rql.model.DataBaseConfig; + +/** + * @author Bilal REZKELLAH + */ +public class SchemaResourceImp implements SchemaResource { + + @Inject + IRql irql; + + @Inject + IConfigurationDAO iconfig; + + @Inject + IProjectDAO iproject; + + @Override + public SchemaResult getAllTables(String projectID) { + DataBaseConfig dbc = null; + try { + dbc = iconfig.getConfigByID(projectID); + } catch (SQLException | IOException e1) { + e1.printStackTrace(); + throw new WebApplicationException("Connexion faild.", Status.BAD_REQUEST); + + } + try { + return irql.getDataBaseSchema(dbc); + } catch (SQLException | IOException e) { + e.printStackTrace(); + throw new WebApplicationException("Schema Base Error.", Status.BAD_REQUEST); + } + } + + @Override + public List getAllTablesHeader(String projectID) { + DataBaseConfig dbc = null; + try { + dbc = iconfig.getConfigByID(projectID); + } catch (SQLException | IOException e1) { + e1.printStackTrace(); + throw new WebApplicationException("Connexion faild.", Status.BAD_REQUEST); + + } + try { + return irql.getDataBaseTablesHeader(dbc); + } catch (SQLException | IOException e) { + e.printStackTrace(); + throw new WebApplicationException("Schema Base Error.", Status.BAD_REQUEST); + } + } + + @Override + public List getAttributesList(String id, String queryType, String projectID) { + DataBaseConfig dbc = null; + try { + dbc = iconfig.getConfigByID(projectID); + } catch (SQLException | IOException e1) { + e1.printStackTrace(); + throw new WebApplicationException("Connexion faild.", Status.BAD_REQUEST); + + } + try { + return irql.getTableAttributesList(id, queryType, dbc); + } catch (SQLException | IOException e) { + e.printStackTrace(); + throw new WebApplicationException("Schema Base Error.", Status.BAD_REQUEST); + } + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/UserResourceImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/UserResourceImp.java new file mode 100644 index 0000000..632b7b8 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/UserResourceImp.java @@ -0,0 +1,65 @@ +package fr.ensma.lias.rql.service; + +import java.sql.SQLException; +import java.util.List; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import fr.ensma.lias.rql.api.UserResource; +import fr.ensma.lias.rql.dao.userdao.IUserDAO; +import fr.ensma.lias.rql.dto.User; + + +/** + * @author Bilal REZKELLAH + */ +public class UserResourceImp implements UserResource { + + @Inject + IUserDAO iuser; + + @Override + public List getAllCollaborarors(String userid) { + try { + return iuser.getAllUsers(userid); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public boolean deleteCollaborator(String projectid, String username) { + try { + return iuser.deleteCollabortor(projectid, username); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public String addCollaborator(String projectid, String username) { + try { + return iuser.createCollaborator(projectid, username); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + } + + @Override + public String getCollaborators(String projectid, String username) { + // TODO Auto-generated method stub + return null; + } +} diff --git a/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/XlsxResourceImp.java b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/XlsxResourceImp.java new file mode 100644 index 0000000..89f4e73 --- /dev/null +++ b/rql-backend/rql-server/src/main/java/fr/ensma/lias/rql/service/XlsxResourceImp.java @@ -0,0 +1,418 @@ +package fr.ensma.lias.rql.service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.SQLException; + +import javax.inject.Inject; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import fr.ensma.lias.rql.api.XlsxResource; +import fr.ensma.lias.rql.cfg.IConfiguration; +import fr.ensma.lias.rql.core.IRql; +import fr.ensma.lias.rql.dao.dbconfiguration.IConfigurationDAO; +import fr.ensma.lias.rql.dao.inmemory.InMemory; +import fr.ensma.lias.rql.dto.CheckRuleResult; +import fr.ensma.lias.rql.dto.RQLResult; +import fr.ensma.lias.rql.dto.RQLRow; +import fr.ensma.lias.rql.rqlgrammar.ParseException; +import fr.ensma.lias.rql.sql.SQLResultsRow; +import fr.ensma.lias.rql.sql.SQLRow; + +/** + * @author Bilal REZKELLAH + */ +public class XlsxResourceImp implements XlsxResource { + @Inject + IRql irql; + + @Inject + InMemory myInstance; + + @Inject + IConfiguration cfg; + + @Inject + IConfigurationDAO iconfig; + + RQLResult rqlResult; + + private Workbook workbook; + + @Override + public Response getRule(String id, String support, String confidence) { + ResponseBuilder rb = null; + try { + rqlResult = irql.executeRqlQuery(id, Double.parseDouble(support), Double.parseDouble(confidence)); + } catch (Exception e) { + System.out.println(e.getMessage()); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + workbook = new XSSFWorkbook(); + String query = myInstance.getRqlQueryDB().get(id); + // Create a Sheets + Sheet sheet = workbook.createSheet("Rules"); + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 12); + headerFont.setColor(IndexedColors.RED.getIndex()); + + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + + // Create a header row for exactRules + Row headerRow1 = sheet.createRow(0); + Row headerRow = sheet.createRow(1); + // Creating cells + Cell cell = headerRow.createCell(0); + cell.setCellValue("LeftAttributes"); + cell.setCellStyle(headerCellStyle); + + Cell cell2 = headerRow.createCell(1); + cell2.setCellValue("RightAttribut"); + cell2.setCellStyle(headerCellStyle); + + Cell cellquery = headerRow1.createCell(0); + cellquery.setCellValue("RQL Query"); + cellquery.setCellStyle(headerCellStyle); + + Cell cell2query = headerRow1.createCell(2); + cell2query.setCellValue(query); + // Create Other rows and cells with exactRules Data + int rowNum = 2; + for (RQLRow rqlrow : rqlResult.getexactRule()) { + Row row = sheet.createRow(rowNum++); + + row.createCell(0).setCellValue(String.join(" ", rqlrow.getLeftAttributes())); + + row.createCell(1).setCellValue(rqlrow.getRightAttribute()); + } + + // Resize all columns to fit the content size + for (int i = 0; i < 2; i++) { + sheet.autoSizeColumn(i); + } + + // Write the output to a file + FileOutputStream fileOut = null; + try { + fileOut = new FileOutputStream(cfg.getConfiguration().tmpResultsDir() + "/" + id + "poi.xlsx"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + workbook.write(fileOut); + } catch (IOException e) { + e.printStackTrace(); + } + try { + fileOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + File file = new File(cfg.getConfiguration().tmpResultsDir() + "/" + id + "poi.xlsx"); + rb = Response.ok((Object) file); + rb.header("Content-Disposition", "attachment; filename=" + "/" + id + "_Rules.xlsx"); + return rb.build(); + } + + @Override + public Response getCounterExample(String id, String leftAttributes, String rightAttribute, String support, + String confidence, String projectID) { + ResponseBuilder rb = null; + File resultDir = new File(cfg.getConfiguration().tmpResultsDir()); + resultDir.mkdir(); + long debut = System.currentTimeMillis(); + String query = myInstance.getRqlQueryDB().get(id); + CheckRuleResult crr = null; + try { + crr = irql.checkRule(debut, iconfig.getConfigByID(projectID), id, leftAttributes, rightAttribute, + Double.parseDouble(support), Double.parseDouble(confidence)); + } catch (ParseException | NumberFormatException | SQLException | IOException e) { + e.printStackTrace(); + throw new WebApplicationException("Query is bad.", Status.BAD_REQUEST); + } + + workbook = new XSSFWorkbook(); + // Create a Sheets + Sheet sheet = workbook.createSheet("CounterExamples1"); + Sheet sheet2 = workbook.createSheet("CounterExamples2"); + Sheet sheet3 = workbook.createSheet("CounterExamples3"); + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 12); + headerFont.setColor(IndexedColors.RED.getIndex()); + // Create a header row for counter examples + Row headerRow = sheet.createRow(1); + Row headerRow1 = sheet.createRow(0); + + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + // Creating cells + Cell cell = headerRow.createCell(0); + cell.setCellValue("LeftAttributes"); + cell.setCellStyle(headerCellStyle); + + Cell cell2 = headerRow.createCell(1); + cell2.setCellValue("RightAttribut"); + cell2.setCellStyle(headerCellStyle); + + Cell cellquery = headerRow1.createCell(0); + cellquery.setCellValue("RQL Query"); + cellquery.setCellStyle(headerCellStyle); + + Cell cellquery2 = headerRow1.createCell(2); + cellquery2.setCellValue(query); + // save the rule + Row row = sheet.createRow(2); + row.createCell(0).setCellValue(leftAttributes); + row.createCell(1).setCellValue(rightAttribute); + // Create Other rows and cells with counterExamples Data + Row headerRow2 = sheet.createRow(3); + headerCellStyle.setFont(headerFont); + // Creating cells + Cell cell1 = headerRow2.createCell(0); + cell1.setCellValue("Counter Example N°"); + cell1.setCellStyle(headerCellStyle); + for (int i = 0; i < crr.getCheckResult().getCounterExamples3().getHeader().size(); i++) { + cell1 = headerRow2.createCell(i + 1); + cell1.setCellValue(crr.getCheckResult().getCounterExamples3().getHeader().get(i)); + cell1.setCellStyle(headerCellStyle); + } + + int rowNum = 4; + for (SQLRow sqlrow : crr.getCheckResult().getCounterExamples3().getRows()) { + Row row1 = sheet.createRow(rowNum++); + + row1.createCell(0).setCellValue(Math.floor((rowNum - 5) / crr.getSummary().getTupleNB() + 1)); + + int cellNum = 1; + for (String cel : sqlrow.getCels()) { + row1.createCell(cellNum++).setCellValue(cel); + } + } + + // Resize all columns to fit the content size + for (int i = 0; i < crr.getCheckResult().getCounterExamples3().getHeader().size(); i++) { + sheet.autoSizeColumn(i); + } + + // Create a header row for counter examples + Row headerRow21 = sheet2.createRow(0); + // Creating cells + Cell cell21 = headerRow21.createCell(0); + cell21.setCellValue("LeftAttributes"); + cell21.setCellStyle(headerCellStyle); + + Cell cell22 = headerRow21.createCell(1); + cell22.setCellValue("RightAttribut"); + cell22.setCellStyle(headerCellStyle); + // save the rule + Row row21 = sheet2.createRow(1); + row21.createCell(0).setCellValue(leftAttributes); + row21.createCell(1).setCellValue(rightAttribute); + // Create Other rows and cells with counterExamples Data + Row headerRow22 = sheet2.createRow(2); + headerCellStyle.setFont(headerFont); + // Creating cells + Cell cell23 = headerRow22.createCell(0); + cell23.setCellValue("Counter Example N°"); + cell23.setCellStyle(headerCellStyle); + for (int i = 0; i < crr.getCheckResult().getCounterExamples().getHeader().size(); i++) { + cell23 = headerRow22.createCell(i + 1); + cell23.setCellValue(crr.getCheckResult().getCounterExamples().getHeader().get(i)); + cell23.setCellStyle(headerCellStyle); + } + + int rowNum2 = 3; + for (SQLRow sqlrow : crr.getCheckResult().getCounterExamples().getRows()) { + Row row1 = sheet2.createRow(rowNum2++); + + row1.createCell(0).setCellValue(Math.floor((rowNum2 - 4) / crr.getSummary().getTupleNB() + 1)); + + int cellNum = 1; + for (String cel : sqlrow.getCels()) { + row1.createCell(cellNum++).setCellValue(cel); + } + } + + // Resize all columns to fit the content size + for (int i = 0; i < crr.getCheckResult().getCounterExamples().getHeader().size(); i++) { + sheet2.autoSizeColumn(i); + } + + // Create a header row for counter examples + Row headerRow31 = sheet3.createRow(0); + // Creating cells + Cell cell31 = headerRow31.createCell(0); + cell31.setCellValue("LeftAttributes"); + cell31.setCellStyle(headerCellStyle); + + Cell cell32 = headerRow31.createCell(1); + cell32.setCellValue("RightAttribut"); + cell32.setCellStyle(headerCellStyle); + // save the rule + Row row31 = sheet3.createRow(1); + row31.createCell(0).setCellValue(leftAttributes); + row31.createCell(1).setCellValue(rightAttribute); + // Create Other rows and cells with counterExamples Data + Row headerRow32 = sheet3.createRow(2); + headerCellStyle.setFont(headerFont); + // Creating cells + Cell cell33 = headerRow32.createCell(0); + cell33.setCellValue("Counter Example N°"); + cell33.setCellStyle(headerCellStyle); + for (int i = 0; i < crr.getCheckResult().getCounterExamples2().getHeader().size(); i++) { + cell33 = headerRow32.createCell(i + 1); + cell33.setCellValue(crr.getCheckResult().getCounterExamples2().getHeader().get(i)); + cell33.setCellStyle(headerCellStyle); + } + + int rowNum3 = 3; + for (SQLRow sqlrow : crr.getCheckResult().getCounterExamples2().getRows()) { + Row row1 = sheet3.createRow(rowNum3++); + + row1.createCell(0).setCellValue(Math.floor((rowNum3 - 4) / crr.getSummary().getTupleNB() + 1)); + + int cellNum = 1; + for (String cel : sqlrow.getCels()) { + row1.createCell(cellNum++).setCellValue(cel); + } + } + + // Resize all columns to fit the content size + for (int i = 0; i < crr.getCheckResult().getCounterExamples2().getHeader().size(); i++) { + sheet3.autoSizeColumn(i); + } + + FileOutputStream fileOut = null; + try { + fileOut = new FileOutputStream(cfg.getConfiguration().tmpResultsDir() + "/" + id + "CounterExample.xlsx"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + workbook.write(fileOut); + } catch (IOException e) { + e.printStackTrace(); + } + try { + fileOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + File file = new File(cfg.getConfiguration().tmpResultsDir() + "/" + id + "CounterExample.xlsx"); + rb = Response.ok((Object) file); + rb.header("Content-Disposition", "attachment; filename=" + "/" + id + "_CounterExample.xlsx"); + return rb.build(); + } + + @Override + public Response getResultSet(String ID, String projectID) { + SQLResultsRow executeSqlQuery = null; + ResponseBuilder rb = null; + File resultDir = new File(cfg.getConfiguration().tmpResultsDir()); + resultDir.mkdir(); + workbook = new XSSFWorkbook(); + String query; + if (ID == null || ID.isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } + query = myInstance.getSqlQueryDB().get(ID); + if (ID == null || ID.isEmpty()) { + throw new WebApplicationException("Parameter is missing.", Status.NOT_FOUND); + } + try { + executeSqlQuery = irql.executeSqlQuery2(query, iconfig.getConfigByID(projectID)); + } catch (SQLException | IOException e) { + e.printStackTrace(); + Response response = Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build(); + throw new WebApplicationException(response); + } + + // Create a Sheets + Sheet sheet = workbook.createSheet("ResultSet"); + // Create a Font for styling header cells + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerFont.setFontHeightInPoints((short) 12); + headerFont.setColor(IndexedColors.RED.getIndex()); + // Create a CellStyle with the font + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setFont(headerFont); + // Create a header row for query + Row headerRow = sheet.createRow(0); + + // Creating cells + Cell cell = headerRow.createCell(0); + cell.setCellValue("SQL query"); + cell.setCellStyle(headerCellStyle); + + Cell cell2 = headerRow.createCell(1); + cell2.setCellValue(query); + + // Create a header row for query + Row headerRow2 = sheet.createRow(1); + int cellNum = 0; + for (String cel : executeSqlQuery.getHeader()) { + Cell cell1 = headerRow2.createCell(cellNum++); + cell1.setCellValue(cel); + cell1.setCellStyle(headerCellStyle); + } + + // Create Other rows and cells with exactRules Data + int rowNum = 2; + for (SQLRow sqlrow : executeSqlQuery.getRows()) { + Row row = sheet.createRow(rowNum++); + int cellNum1 = 0; + for (String cel : sqlrow.getCels()) { + row.createCell(cellNum1++).setCellValue(cel); + } + } + // Resize all columns to fit the content size + for (int i = 0; i < executeSqlQuery.getHeader().size(); i++) { + if (i != 1) + sheet.autoSizeColumn(i); + } + // Write the output to a file + FileOutputStream fileOut = null; + try { + fileOut = new FileOutputStream(cfg.getConfiguration().tmpResultsDir() + "/" + ID + "SQL.xlsx"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + try { + workbook.write(fileOut); + } catch (IOException e) { + e.printStackTrace(); + } + try { + fileOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + File file = new File(cfg.getConfiguration().tmpResultsDir() + "/" + ID + "SQL.xlsx"); + rb = Response.ok((Object) file); + rb.header("Content-Disposition", "attachment; filename=" + "/" + ID + "_ResultSet.xlsx"); + return rb.build(); + } +} diff --git a/rql-backend/rql-server/src/main/resources/META-INF/beans.xml b/rql-backend/rql-server/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..5e71dd7 --- /dev/null +++ b/rql-backend/rql-server/src/main/resources/META-INF/beans.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/rql-backend/rql-server/src/test/java/DELETE.me b/rql-backend/rql-server/src/test/java/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/rql-server/src/test/resources/DELETE.me b/rql-backend/rql-server/src/test/resources/DELETE.me new file mode 100644 index 0000000..e69de29 diff --git a/rql-backend/shd31/01conv.pl b/rql-backend/shd31/01conv.pl new file mode 100644 index 0000000..e6e26da --- /dev/null +++ b/rql-backend/shd31/01conv.pl @@ -0,0 +1,33 @@ +#!/usr/bin/perl + +# this script covert a 01 matrix to a to the transaction database, or +# adjacency matrix, +# each line is converted to the sequence of columns which has value 1. + +$ARGC = @ARGV; +if ( $ARGC < 0 ){ + printf ("01conv.pl: [separator] < input-file > output-file\n"); + exit (1); +} +$count = 0; +%numbers = (); + +$sep = " "; +if ( $ARGC >= 1 ){ $sep = $ARGV[0]; } + +while (){ + chomp; + @eles = split($sep, $_); + $all = @eles; + $c = 1; + foreach $item( @eles ) { + if ( $item ne "0" ){ + print "$c" ; + if ($c<$all){ print $sep; } + } + $c++; + } + print "\n"; +} + + diff --git a/rql-backend/shd31/aheap.c b/rql-backend/shd31/aheap.c new file mode 100644 index 0000000..0d5377f --- /dev/null +++ b/rql-backend/shd31/aheap.c @@ -0,0 +1,216 @@ +/* + array-based simple heap (fixex size) + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _aheap_c_ +#define _aheap_c_ + +#include"aheap.h" + +QSORT_TYPE (AHEAP_KEY, AHEAP_KEY) +QSORT_TYPE (AHEAP_ID, AHEAP_ID) +AHEAP INIT_AHEAP = {TYPE_AHEAP,NULL,0,0}; + +/* allocate memory */ +void AHEAP_alloc (AHEAP *H, AHEAP_ID num){ + AHEAP_ID i; +#ifdef ERROR_CHECK + if ( num<0 ) error_num ("size is out of range", num, EXIT); +#endif + *H = INIT_AHEAP; + if ( num>0 ) malloc2 (H->v, num*2, EXIT); + H->end = num; + ARY_FILL (H->v, 0, num*2, AHEAP_KEYHUGE); + for (i=0 ; ibase = i - num + 1; +} + +/* termination */ +void AHEAP_end (AHEAP *H){ + free2 (H->v); + *H = INIT_AHEAP; +} + +/* return the index of the leaf having the minimum key among the descendants + of the given node i. If several leaves with the smallest key are there, + return the minimum index among them if f=0, maximum index if f=1, and + random choice if f=2 */ +/* random choice version. choose one child to go down randomly for each node, + thus it is not uniformly random */ +/* node_ returns the ID of leaf */ +AHEAP_ID AHEAP_findmin_node_ (AHEAP *H, AHEAP_ID i, int f){ + while ( i < H->end-1 ){ + if ( H->v[i*2+1] == H->v[i] ) + if ( H->v[i*2+2] == H->v[i] ) + if ( f == 2 ) i = i*2 + 1 + rand()%2; + else i = i*2+1+f; + else i = i*2+1; + else i = i*2+2; + } + return (i); +} +AHEAP_ID AHEAP_findmin_node (AHEAP *H, AHEAP_ID i, int f){ + if ( H->end <= 0 ) return (-1); + return (AHEAP_IDX(*H, AHEAP_findmin_node_ (H, i, f))); +} +AHEAP_ID AHEAP_findmin_head (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 0) ); } +AHEAP_ID AHEAP_findmin_tail (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 1) ); } +AHEAP_ID AHEAP_findmin_rnd (AHEAP *H){ return (AHEAP_findmin_node (H, 0, 2) ); } + +/* return the index of the leaf having smaller value than a among the + descendants of the given node i. If several leaves with the smallest key + are there, return the minimum index among them if f=0, maximum index if f=1, + and random choice if f=2 */ +AHEAP_ID AHEAP_findlow_node (AHEAP *H, AHEAP_KEY a, AHEAP_ID i, int f){ + if ( H->end == 0 ) return (-1); + if ( H->v[0] > a ) return (-1); + while ( i < H->end-1 ){ + if ( f == 2 ) { + if ( H->v[i*2+1] <= a ) + if ( H->v[i*2+2] <= a ) i = i*2 + 1 + rand()%2; + else i = i*2+1; + else i = i*2+2; + } else if ( H->v[i*2+1] <= a ) i = i*2+1+f; else i = i*2+2-f; + } + return (AHEAP_IDX(*H, i) ); +} +AHEAP_ID AHEAP_findlow_head (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 0) ); } +AHEAP_ID AHEAP_findlow_tail (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 1) ); } +AHEAP_ID AHEAP_findlow_rnd (AHEAP *H, AHEAP_KEY a){ return (AHEAP_findlow_node (H, a, 0, 2) ); } + +/* return the index of the leaf having smaller value than a next/previous to + leaf i. return -1 if such a leaf does not exist */ +AHEAP_ID AHEAP_findlow_nxt (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){ + if ( H->end == 0 ) return (-1); + if ( i<0 || i>= H->end ) return ( AHEAP_findlow_head (H, a)); + for (i=AHEAP_LEAF(*H,i); i>0 ; i=(i-1)/2){ + /* i is the child of smaller index, and the key of the sibling of i is less than a */ + if ( i%2 == 1 && H->v[i+1] <= a ) return (AHEAP_findlow_node (H, a, i+1, 0) ); + } + return (-1); +} +AHEAP_ID AHEAP_findlow_prv (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){ + if ( H->end == 0 ) return (-1); + if ( i<0 || i>= H->end ) return ( AHEAP_findlow_head (H, a)); + for (i=AHEAP_LEAF(*H,i); i>0 ; i=(i-1)/2){ + /* i is the child of larger index, and the key of the sibling of i is less than a */ + if ( i%2 == 0 && H->v[i-1] <= a ) return (AHEAP_findlow_node (H, a, i-1, 1) ); + } + return (-1); +} + +/* change the key of node i to a /Add a to the key of node i, and update heap H */ +void AHEAP_chg (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){ + i = AHEAP_LEAF (*H, i); + H->v[i] = a; + AHEAP_update (H, i); +} +void AHEAP_add (AHEAP *H, AHEAP_ID i, AHEAP_KEY a){ + i = AHEAP_LEAF (*H, i); + H->v[i] += a; + AHEAP_update (H, i); +} + +/* update the ancestor of node i */ +void AHEAP_update (AHEAP *H, AHEAP_ID i){ + AHEAP_ID j; + AHEAP_KEY a = H->v[i]; + while ( i>0 ){ + j = i - 1 + (i%2)*2; /* j = the sibling of i */ + i = (i-1) / 2; + if ( H->v[j] < a ) a = H->v[j]; + if ( a == H->v[i] ) break; + H->v[i] = a; + } +} + +/* find the leaf with the minimum key value among the leaves having index + smaller/larger than i, or between i and j */ +AHEAP_ID AHEAP_upper_min (AHEAP *H, AHEAP_ID i){ + AHEAP_ID fi=0, j = AHEAP_LEAF (*H, H->end - 1); + AHEAP_KEY fm = AHEAP_KEYHUGE; + if ( i == 0 ) return (AHEAP_findmin_head (H) ); + i = AHEAP_LEAF (*H, i-1); + while ( i != j ){ + if ( i%2 ){ /* if i is the child with smaller index */ + if ( fm > H->v[i+1] ){ + fm = H->v[i+1]; + fi = i+1; + } + } + i = (i-1)/2; + if ( j == i ) break; /* stop if the right pointer and the left pointer are the same */ + j = (j-1)/2; + } + while ( fi < H->end-1 ) fi = fi*2 + (H->v[fi*2+1]<=fm?1:2); + return ( AHEAP_IDX(*H, fi) ); +} +AHEAP_ID AHEAP_lower_min (AHEAP *H, AHEAP_ID i){ + AHEAP_ID fi=0, j = AHEAP_LEAF (*H, 0); + AHEAP_KEY fm = AHEAP_KEYHUGE; + if ( i == H->end-1 ) return (AHEAP_findmin_head (H) ); + i = AHEAP_LEAF (*H, i+1); + while ( i != j ){ + if ( i%2 == 0 ){ /* if i is the child of larger index */ + if ( fm > H->v[i-1] ){ + fm = H->v[i-1]; + fi = i-1; + } + } + j = (j-1)/2; + if ( j == i ) break; /* stop if the right pointer and the left pointer are the same */ + i = (i-1)/2; + } + while ( fi < H->end-1 ) fi = fi*2 + (H->v[fi*2+1]<=fm?1:2); + return (AHEAP_IDX(*H, fi) ); +} + +/* find the index having the minimum among given two indices */ +AHEAP_ID AHEAP_interval_min (AHEAP *H, AHEAP_ID i, AHEAP_ID j){ + AHEAP_ID fi=0; + AHEAP_KEY fm = AHEAP_KEYHUGE; + if ( i == 0 ) return (AHEAP_lower_min (H, j) ); + if ( j == H->end-1 ) return (AHEAP_upper_min (H, i) ); + i = AHEAP_LEAF (*H, i-1); + j = AHEAP_LEAF (*H, j+1); + while ( i != j && i != j-1 ){ + if ( i%2 ){ /* if i is the child of smaller index */ + if ( fm > H->v[i+1] ){ + fm = H->v[i+1]; + fi = i+1; + } + } + i = (i-1)/2; + if ( j == i || j == i+1 ) break; /* stop if the right pointer and the left pointer are the same */ + if ( j%2 == 0 ){ /* if j is the child of larger index */ + if ( fm > H->v[j-1] ){ + fm = H->v[j-1]; + fi = j-1; + } + } + j = (j-1)/2; + } + while ( fi < H->end-1 ) + fi = fi*2 + (H->v[fi*2+1] <= fm?1:2); + return (AHEAP_IDX(*H, fi) ); +} + +/* print heap keys according to the structure of the heap */ +void AHEAP_print (AHEAP *H){ + AHEAP_ID i, j=1; + while ( j<=H->end*2-1 ){ + FLOOP (i, j-1, MIN(j, H->end)*2-1) printf (AHEAP_KEYF ",", H->v[i] ); + printf ("\n"); + j = j*2; + } +} + +#endif diff --git a/rql-backend/shd31/aheap.h b/rql-backend/shd31/aheap.h new file mode 100644 index 0000000..2d680e5 --- /dev/null +++ b/rql-backend/shd31/aheap.h @@ -0,0 +1,111 @@ +/* + array-based simple heap (fixed size) + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +/* bench mark + PentiumIII 500MHz, Memory 256MB Linux + values 0-1,000,000 : set & del & get 1,000,000 times + 2.55sec + + # rotation == 1/5 per 1 set/del + + *** simple array *** + value 0-1,000,000 set & set & set 1,000,000 times, + 0.88sec + */ + +#ifndef _aheap_h_ +#define _aheap_h_ + +#include"stdlib2.h" + +#ifndef AHEAP_KEY + #ifdef AHEAP_KEY_DOUBLE + #define AHEAP_KEY double + #define AHEAP_KEYHUGE DOUBLEHUGE + #define AHEAP_KEYF "%f" + #elif defined(AHEAP_KEY_WEIGHT) + #define AHEAP_KEY WEIGHT + #define AHEAP_KEYHUGE WEIGHTHUGE + #define AHEAP_KEYF WEIGHTF + #else +#define AHEAP_KEY int + #define AHEAP_KEYHUGE INTHUGE + #define AHEAP_KEYF "%d" + #endif +#endif + +#ifndef AHEAP_ID + #define AHEAP_ID int + #define AHEAP_ID_END INTHUGE + #define AHEAP_IDF "%d" +#endif + +#define AHEAP_IDX(H,i) (((i)+1-(H).base)%(H).end) +#define AHEAP_LEAF(H,i) (((i)+(H).base)%(H).end+(H).end-1) +#define AHEAP_H(H,i) (H).v[(((i)+(H).base)%(H).end+(H).end-1)] + +typedef struct { + unsigned char type; + AHEAP_KEY *v; /* array for heap key */ + int end; /* the number of maximum elements */ + int base; /* the constant for set 0 to the leftmost leaf */ +} AHEAP; + +QSORT_TYPE_HEADER (AHEAP_KEY, AHEAP_KEY) +QSORT_TYPE_HEADER (AHEAP_ID, AHEAP_ID) +extern AHEAP INIT_AHEAP; + +/* initialization. allocate memory for H and fill it by +infinity */ +void AHEAP_alloc (AHEAP *H, int num); +void AHEAP_end (AHEAP *H); + +/* return the index of the leaf having the minimum key among the descendants + of the given node i. If several leaves with the smallest key are there, + return the minimum index among them if f=0, maximum index if f=1, and + random choice if f=2 */ +AHEAP_ID AHEAP_findmin_node_ (AHEAP *H, AHEAP_ID i, int f); +AHEAP_ID AHEAP_findmin_node (AHEAP *H, AHEAP_ID i, int f); +AHEAP_ID AHEAP_findmin_head (AHEAP *H); +AHEAP_ID AHEAP_findmin_tail (AHEAP *H); +AHEAP_ID AHEAP_findmin_rnd (AHEAP *H); + +/* return the index of the leaf having smaller value than a among the + descendants of the given node i. If several leaves with the smallest key + are there, return the minimum index among them if f=0, maximum index if f=1, + and random choice if f=2 */ +AHEAP_ID AHEAP_findlow_node (AHEAP *H, AHEAP_KEY a, AHEAP_ID i, int f); +AHEAP_ID AHEAP_findlow_head (AHEAP *H, AHEAP_KEY a); +AHEAP_ID AHEAP_findlow_tail (AHEAP *H, AHEAP_KEY a); +AHEAP_ID AHEAP_findlow_rnd (AHEAP *H, AHEAP_KEY a); + +/* return the index of the leaf having smaller value than a next/previous to + leaf i. return -1 if such a leaf does not exist */ +AHEAP_ID AHEAP_findlow_nxt (AHEAP *H, AHEAP_ID i, AHEAP_KEY a); +AHEAP_ID AHEAP_findlow_prv (AHEAP *H, AHEAP_ID i, AHEAP_KEY a); + +/* change the key of node i to a /Add a to the key of node i, and update heap H */ +void AHEAP_chg (AHEAP *H, AHEAP_ID i, AHEAP_KEY a); +void AHEAP_add (AHEAP *H, AHEAP_ID i, AHEAP_KEY a); + +/* update the ancestor of node i */ +void AHEAP_update (AHEAP *H, AHEAP_ID i); + +/* find the leaf with the minimum key value among the leaves having index + smaller/larger than i, or between i and j */ +AHEAP_ID AHEAP_upper_min (AHEAP *H, AHEAP_ID i); +AHEAP_ID AHEAP_lower_min (AHEAP *H, AHEAP_ID i); +AHEAP_ID AHEAP_interval_min (AHEAP *H, AHEAP_ID i, AHEAP_ID j); + +/* print heap keys according to the structure of the heap */ +void AHEAP_print (AHEAP *H); + +#endif diff --git a/rql-backend/shd31/alist.c b/rql-backend/shd31/alist.c new file mode 100644 index 0000000..a6394e0 --- /dev/null +++ b/rql-backend/shd31/alist.c @@ -0,0 +1,637 @@ +/* + array-based list/multi-list library + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, pleas + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about codes for the users. */ + +#ifndef _alist_c_ +#define _alist_c_ + +#include"alist.h" +#include"stdlib2.c" +#include"undo.c" + +/* if error check is unnecessary, comment out the next line */ +//#define ERROR_CHECK + +ALIST INIT_ALIST = {TYPE_ALIST,NULL,NULL,0,0}; +MALIST INIT_MALIST = {TYPE_MALIST,NULL,NULL,0,NULL,NULL,0}; +QSORT_TYPE(ALIST_ID, ALIST_ID) +/************* initialization/termination ************/ + +/* initialization */ +void ALIST_alloc (ALIST *A, ALIST_ID siz){ + ALIST_ID i; + *A = INIT_ALIST; + malloc2 (A->prv, siz+1, EXIT); // allocate memory + malloc2 (A->nxt, siz+1, {free2(A->prv);EXIT;}); // allocate memory + A->end = siz; + A->prv[siz] = siz; // make empty list by connecting root to itself in bidirection + A->nxt[siz] = siz; + for ( i=0 ; iprv[i] = -1; // set prv[i]=-1 for each element since they are not inserted in the list +} + +/* termination */ +void ALIST_end (ALIST *A){ + mfree (A->prv, A->nxt); + *A = INIT_ALIST; +} + +/* copy list A2 to A1. If the size of A1 is less than current size of A2, error */ +void ALIST_cpy (ALIST *A1, ALIST *A2){ + ALIST_ID i; + ALIST_rmall (A1); + ALIST_DO_FORWARD (*A2, i){ +#ifdef ERROR_CHECK + if ( !ALIST_IS_ELM(*A1,i) ) + error ("ALIST_cpy: the size of A1 is smaller than current size of A2", EXIT); +#endif + ALIST_ins_tail (A1, i, 0); + } +} + +/* duplication */ +ALIST ALIST_dup (ALIST *A){ + ALIST AA; + ALIST_alloc (&AA, A->end); /* initialize the new list */ + ALIST_cpy (&AA, A); /* copy A to AA */ + return (AA); +} + + +/************* addition/deletion ************/ + +/* insert an element e next/previous to element i or haed/tail of the list + error is checked for already inserted elements or out of range */ +void ALIST_ins_nxt (ALIST *A, ALIST_ID e, ALIST_ID ee, int undo){ +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("ALIST_ins: e is out of range", e, EXIT); + if ( ee < 0 || ee > A->end ) error_num ("ALIST_ins: ee is out of range", ee, EXIT); + if ( A->prv[e] >= 0 ) error_num ("ALIST_ins: element is already in the list", e, EXIT); +#endif + + A->num++; /* increment the length of the list */ + A->nxt[e] = A->nxt[ee]; /* change the four links */ + A->prv[A->nxt[ee]] = e; + A->nxt[ee] = e; + A->prv[e] = ee; + if ( undo ) ALISTundo_ins (U_ALIST_rm, (void *)A, e, e); +} + +void ALIST_ins_prv (ALIST *A, ALIST_ID e, ALIST_ID ee, int undo){ +#ifdef ERROR_CHECK + if ( ee < 0 || ee > A->end ) error_num ("ALIST_ins_prv: ee is out of range", ee, EXIT); +#endif + ALIST_ins_nxt (A, e, A->prv[ee], undo); +} +void ALIST_ins_head (ALIST *A, ALIST_ID e, int undo){ ALIST_ins_prv (A, e, ALIST_HEAD(*A), undo);} +void ALIST_ins_tail (ALIST *A, ALIST_ID e, int undo){ ALIST_ins_nxt (A, e, ALIST_TAIL(*A), undo);} + +/* remove head/tail of the list. do nothing if e is root + with check removal of removed element/range check */ +void ALIST_rm (ALIST *A, ALIST_ID e, int undo){ +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("ALIST_rm: e is out of range", e, EXIT); + if ( A->prv[e] < 0 ) error_num ("ALIST_rm: element is not in the list", e, EXIT ); +#endif + if ( e == A->end ) return; + if ( undo ) ALISTundo_ins (U_ALIST_ins, (void *)A, e, A->prv[e]); + A->num--; /* decrement the length of the list */ + A->nxt[A->prv[e]] = A->nxt[e]; /* short cut the previous & next elements to e */ + A->prv[A->nxt[e]] = A->prv[e]; + A->prv[e] = -1; /* set prv[i]=-1 so that i is out */ +} + + +/* remove head/tail of the list, and return it. return root if empty list + with check removal of removed element/range check */ +ALIST_ID ALIST_rm_head (ALIST *A, int undo){ + ALIST_ID e = ALIST_HEAD(*A); /* set e to the head of list */ + if ( ALIST_IS_ELM(*A,e) ) ALIST_rm (A, e, undo); /* if e is element, remove e */ + return (e); +} + +ALIST_ID ALIST_rm_tail (ALIST *A, int undo){ + ALIST_ID e = ALIST_TAIL(*A); /* set e to the tail */ + if ( ALIST_IS_ELM(*A,e) ) ALIST_rm (A, e, undo); /* if e is element, remove e */ + return (e); +} + +/* re-insert removed element by ALIST_rm to its original position. precisely, + insert removed element e previous to the next element when e is in the list + with check insertion of non-removed element/range check */ +void ALIST_recov (ALIST *A, ALIST_ID e, int undo){ + ALIST_ID i; +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("ALIST_recov: e is out of range", e, EXIT); + if ( A->prv[e] >= 0 ) error_num ("ALIST_rm: recover element %d in the list\n", e, EXIT); +#endif + i = A->prv[A->nxt[e]]; /* i = element previous to the next to e */ + A->num++; /* increment the length of the list */ + A->nxt[i] = e; /* insert e by changing the links */ + A->prv[A->nxt[e]] = e; + A->prv[e] = i; /* re-set prv[e], since it was -1 */ + if ( undo ) ALISTundo_ins (U_ALIST_rm, (void *)A, e, -1); +} + +/* remove all elements in a list */ +void ALIST_rmall (ALIST *A){ + ALIST_ID i; + ALIST_DO_FORWARD (*A, i) A->prv[i] = -1; /* set prv[i]=-1 for all elements */ + A->num = 0; /* set length of the list to 0 */ + A->nxt[A->end] = A->end; /* make empty list */ + A->prv[A->end] = A->end; +} + +/************* print routines ************/ + +/* print all elements in a list + flag&1: not print newline after the print, flag&2: not print size, + flag&4: print all elements not in the list */ +void ALIST_print (ALIST *A, int flag){ + ALIST_ID i; + if ( flag&2 ) printf (ALIST_IDF": ", flag&4?A->end-A->num:A->num ); + if ( flag&4 ){ + FLOOP (i, 0, A->end) if ( A->prv[i] == -1 ) printf (ALIST_IDF",", i); + } else ALIST_DO_FORWARD (*A, i) printf (ALIST_IDF",", i); + if ( (flag&1) == 0 ) printf ("\n"); +} + +/************* search ************/ + +/* return the kth element next/previous to i */ +/* note that return i when k=1, and return root if root is reached */ +ALIST_ID ALIST_knxt (ALIST *A, ALIST_ID i, ALIST_ID k){ + for ( ; k>=1&& ALIST_IS_ELM(*A,i) ; k--) i = A->nxt[i]; /* go next k-1 times from i */ + return (i); +} +ALIST_ID ALIST_kprv (ALIST *A, ALIST_ID i, ALIST_ID k){ + for ( ; k>=1 && ALIST_IS_ELM(*A,i) ; k--) i = A->prv[i]; /* go previous k-1 times from i */ + return (i); +} + +/* return kth element from the head/tail. return the head/tail if k<1. + return root if k>current size */ +ALIST_ID ALIST_find_kth (ALIST *A, ALIST_ID k){ return (ALIST_knxt (A, ALIST_HEAD (*A), k-1) );} +ALIST_ID ALIST_find_tkth (ALIST *A, ALIST_ID k){ return (ALIST_kprv (A, ALIST_TAIL (*A), k-1) );} + +/* return element randomly chosen from all element in A */ +ALIST_ID ALIST_find_rnd (ALIST *A){ + ALIST_ID k = rand()%A->num +1; /* generate random number ranging the size of list */ + if ( k < A->num/2 ) return (ALIST_find_kth (A, k) ); + else return (ALIST_find_tkth (A, A->num-k+1) ); +} + +/* return the most tailmost element which does not exceed i. + return root if there is no such element */ +ALIST_ID ALIST_find_i (ALIST *A, ALIST_ID i){ + ALIST_ID e; + ALIST_DO_FORWARD (*A, e) if ( e>i ) break; + return ( A->prv[e] ); +} + +/* return the element most close to i and not exceed i */ +/* return -1 if no element does not exceed i */ +ALIST_ID ALIST_find_max_le_i (ALIST *A, ALIST_ID i){ + ALIST_ID e, m=-1; + ALIST_DO_FORWARD (*A, e) if ( e<=i ) ENMAX (m, e); + return (m); +} + +/* sort elements in the list by merge sort without recursion */ +/* increasing order if f==0 */ +void ALIST_sort ( ALIST *A, int f, int undo ){ + ALIST_ID k, i, ii, j1, j2; + for (k=1 ; knum; k=k*2){ /* twice the size of partial sequence to be sorted */ + i = ALIST_HEAD (*A); + while (1){ + j1 = ALIST_knxt (A, i, k-1); /* to merge from ith to (i+k-1)th and (i+k)th to (i+k+k)th, set pointers to the position */ + if ( !ALIST_IS_ELM (*A, j1) ) break; + j2 = ALIST_knxt(A, j1, k+1); + while (1){ + ii = A->nxt[j1]; + if ( i > ii ){ + ALIST_rm (A, ii, undo); + ALIST_ins_prv (A, ii, i, undo); /* insert ii previous to i if i>ii */ + if ( A->nxt[j1] == j2 ) break; + } else { + i = A->nxt[i]; /* finish if i reach to the last */ + if ( i == ii ) break; + } + } + i = j2; + } + } +} + +/************* rich operations ************/ + +/* remove elements in B from A */ +void ALIST_minus (ALIST *A, ALIST *B, int undo){ + ALIST_ID i; + ALIST_DO_FORWARD (*B, i) + if ( A->prv[i] >= 0 ) ALIST_rm (A, i, undo); +} + +/* remove elements not in B from A (intersection of A and B) */ +void ALIST_and (ALIST *A, ALIST *B, int undo){ + ALIST_ID i; + ALIST_DO_FORWARD (*A, i) + if ( B->prv[i] == -1 ) ALIST_rm (A, i, undo); +} + +/* concatinate A2 following to A1, A2 remains in ALIST_concat, not remain in ALIST_append */ +void ALIST_concat (ALIST *A1, ALIST *A2, int undo){ + ALIST_ID e; + ALIST_DO_FORWARD (*A2, e) ALIST_ins_tail (A1, e, undo); +} + +void ALIST_append (ALIST *A1, ALIST *A2, int undo){ + ALIST_ID e; + while (1){ + e = ALIST_rm_head (A2, undo); + if ( !ALIST_IS_ELM(*A2, e) ) return; + ALIST_ins_tail (A1, e, undo); + } +} + + +/***********************************************************************/ +/* Multi list structure */ +/***********************************************************************/ + + +/************* initialization/termination ************/ + +/* initialization. parameters are + pointer to the structure, #elements, #lists. No range check */ +void MALIST_alloc (MALIST *A, ALIST_ID siz, ALIST_ID list_siz){ + ALIST_ID i; + *A = INIT_MALIST; + malloc2 (A->prv, siz+list_siz, EXIT); + malloc2 (A->nxt, siz+list_siz, {MALIST_end(A);EXIT;}); + malloc2 (A->num, list_siz, {MALIST_end(A);EXIT;}); + malloc2 (A->list, siz, {MALIST_end(A);EXIT;}); + A->end = siz; + A->list_end = list_siz; + ARY_FILL (A->prv, 0, siz, -1); /* each element belongs no list */ + FLOOP (i, 0, list_siz){ + A->num[i] = 0; /* set the length of each list to 0 */ + A->prv[siz+i] = siz+i; /* set each list to the empty list */ + A->nxt[siz+i] = siz+i; + } +} + +/* termination */ +void MALIST_end (MALIST *A){ + mfree (A->prv, A->nxt, A->num, A->list); + *A = INIT_MALIST; +} + +/* copy AA to A1. error if max #elements in A1 is length of A2 */ +void MALIST_cpy (MALIST *A1, MALIST *A2){ + ALIST_ID l, e; + FLOOP (l, 0, A1->list_end) MALIST_rmall (A1, l); /* remove all elements in A1 */ + FLOOP (l, 0, A2->list_end){ /* For each list in A2 */ + if ( A2->num[l] >0 ){ /* if lth list is non-empty, do ... */ +#ifdef ERROR_CHECK + if ( A1->list_end <= l ) error ("MALIST_cpy: #lists in A1 < #lists in A2.", EXIT); +#endif + MALIST_DO_FORWARD (*A2, l, e){ /* cpoy lth element of list A2 */ + if ( MALIST_IS_ELM(*A1,e) ) MALIST_ins_tail (A1, l, e, 0); + error ("MALIST_cpy: #elements in A1 < #current elements in A2.", EXIT); + } + } + } +} + +/* duplication */ +MALIST MALIST_dup (MALIST *A){ + MALIST AA; + MALIST_alloc (&AA, A->end, A->list_end); /* initialize AA as same as A */ + MALIST_cpy (&AA, A); /* copy AA to A */ + return (AA); +} + + +/************* addition/deletion ************/ + +/* insert an element e previous/next to element ee or haed/tail of the list l + error is checked for already inserted elements or out of range */ +void MALIST_ins_nxt (MALIST *A, ALIST_ID e, ALIST_ID ee, int undo){ + ALIST_ID f, l; +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("MALIST_ins: e is out of range", e, EXIT); + if ( ee < 0 || ee >= A->end+A->list_end ) error_num ("MALIST_ins: ee is out of range", ee, EXIT); + if ( A->prv[e] >= 0 ) error_num ("MALIST_ins: element is already in some list", e, EXIT); +#endif + f = A->nxt[ee]; + if ( MALIST_IS_ELM(*A,ee) ) l=A->list[ee]; else l=ee-A->end; + A->num[l]++; /* increment the length of the list ee belongs */ + A->list[e] = l; /* set list[e] to the list ee belongs */ + A->nxt[e] = f; /* change the links to insert e */ + A->prv[f] = e; + A->nxt[ee] = e; + A->prv[e] = ee; + if ( undo ) ALISTundo_ins (U_MALIST_rm, (void *)A, e, -1); +} + +void MALIST_ins_prv (MALIST *A, ALIST_ID e, ALIST_ID ee, int undo){ +#ifdef ERROR_CHECK + if ( ee < 0 || ee >= A->end+A->list_end ) error_num ("MALIST_ins_prv: ee is out of range", ee, EXIT); +#endif + MALIST_ins_nxt (A, e, A->prv[ee], undo); +} + +/* insert an element e to the head/tail of the list l + error is checked for already inserted elements or out of range */ +void MALIST_ins_head ( MALIST *A, ALIST_ID l, ALIST_ID e, int undo ){ +#ifdef ERROR_CHECK + if ( l < 0 || l >= A->list_end ) error_num ("MALIST_ins_prv: l is out of range.%d\n", l, EXIT); +#endif + MALIST_ins_prv (A, e, MALIST_HEAD (*A, l), undo); +} + +void MALIST_ins_tail (MALIST *A, ALIST_ID l, ALIST_ID e, int undo){ +#ifdef ERROR_CHECK + if ( l < 0 || l >= A->list_end ) error_num ("MALIST_ins_prv: l is out of range", l, EXIT); +#endif + MALIST_ins_nxt (A, e, MALIST_TAIL (*A, l), undo); +} + +/* remove the head of l-th list, and return it. return the root if it is empty. no range check */ +ALIST_ID MALIST_rm_head (MALIST *A, ALIST_ID l, int undo){ + ALIST_ID e = MALIST_HEAD (*A,l); + if ( MALIST_IS_ELM(*A,e) ){ MALIST_rm (A, e, undo); return (e); } else return (-1); +} + +/* remove head/tail of the list, and return it. return root if empty list + with check removal of removed element/range check */ +ALIST_ID MALIST_rm_tail (MALIST *A, ALIST_ID l, int undo){ + ALIST_ID e = MALIST_TAIL(*A,l); + if ( MALIST_IS_ELM(*A,e) ){ MALIST_rm (A, e, undo); return (e); } else return (-1); +} + +/* remove an element e from A. + with check removal of removed element/range check */ +void MALIST_rm ( MALIST *A, ALIST_ID e, int undo ){ +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("MALIST_rm: e is out of range", e, EXIT); + if ( A->prv[e] < 0 ) error_num ("MALIST_rm: element is not in any list", e, EXIT); +#endif + if ( undo ) ALISTundo_ins (U_MALIST_ins, (void *)A, e, A->prv[e]); + A->num[A->list[e]]--; + A->nxt[A->prv[e]] = A->nxt[e]; + A->prv[A->nxt[e]] = A->prv[e]; + A->prv[e] = -1; +} + +/* re-insert removed element by MALIST_rm to its original position. precisely, + insert removed element e previous to the next element when e is in the list + with check insertion of non-removed element/range check */ +void MALIST_recov (MALIST *A, ALIST_ID e, int undo){ + ALIST_ID i, l; +#ifdef ERROR_CHECK + if ( e < 0 || e >= A->end ) error_num ("MALIST_recov: e is out of range", e, EXIT); + if ( A->prv[e] >= 0 ) error_num ("MALIST_rm: element %d is already in some list.\n", e, EXIT); +#endif + i = A->prv[A->nxt[e]]; + l = MALIST_IS_ELM(*A,i)? A->list[i]: i - A->end; + A->list[e] = l; + A->num[l]++; + A->prv[e] = i; + A->nxt[i] = e; + A->prv[A->nxt[e]] = e; + if ( undo ) ALISTundo_ins (U_MALIST_rm, (void *)A, e, 0); +} + +/* remove all elements in the lth list */ +void MALIST_rmall (MALIST *A, ALIST_ID l){ + ALIST_ID i; + MALIST_DO_FORWARD (*A, l, i) A->prv[i] = -1; + A->num[l] = 0; + A->nxt[A->end+l] = A->end+l; + A->prv[A->end+l] = A->end+l; +} + +/* move element e to the lth list + with check insertion of non-removed element/range check */ +void MALIST_mv (MALIST *A, ALIST_ID l, ALIST_ID e, int undo){ + MALIST_rm (A, e, undo); + MALIST_ins_tail (A, l, e, undo); +} +void MALIST_mv_head (MALIST *A, ALIST_ID l, ALIST_ID e, int undo){ + MALIST_rm (A, e, undo); + MALIST_ins_head (A, l, e, undo); +} + +/* move all elements in llth list to lth list. do nothing if l==ll */ +void MALIST_mvall (MALIST *A, ALIST_ID l, ALIST_ID ll, int undo){ + ALIST_ID i, ii; +#ifdef ERROR_CHECK + if ( l == ll ) return; +#endif + MALIST_DO_FORWARD2 (*A, ll, i, ii) MALIST_mv (A, l, i, undo); +} + +/************* print routine ************/ + +/* print lth list */ +void MALIST_print (MALIST *A, ALIST_ID l){ + ALIST_ID i; + MALIST_DO_FORWARD (*A, l, i) printf (ALIST_IDF",", i); + printf ("\n"); +} + +/* print all lists */ +void MALIST_print_all (MALIST *A){ + ALIST_ID l, i; + FLOOP (l, 0, A->list_end){ + printf ("%d:", l); + MALIST_DO_FORWARD (*A, l, i) printf (ALIST_IDF",", i); + printf ("\n"); + } +} + + +/************* n ************/ + +/* return kth element from the head/tail. return the head/tail if k<1. + return root if k>current size */ +/* for large k, pass through the root element. */ +ALIST_ID MALIST_find_kth (MALIST *A, ALIST_ID l, ALIST_ID k){ + int x = MALIST_HEAD(*A,l); /* set x to the head of lth list */ + for ( ; k>1 ; k--) x = A->nxt[x]; /* go next from x k-1 times */ + return (x); +} + +ALIST_ID MALIST_find_tkth (MALIST *A, ALIST_ID l, ALIST_ID k){ + ALIST_ID x = MALIST_TAIL(*A,l); /* set x to the tail of lth list */ + for ( ; k>1 ; k--) x = A->prv[x]; /* go forward from x k-1 times */ + return (x); +} + +/* return a random element of lth list */ +ALIST_ID MALIST_find_rnd (MALIST *A, ALIST_ID l){ + ALIST_ID k = rand() % A->num[l]+1; + if ( k < A->num[l]/2 ) return (MALIST_find_kth (A, l, k) ); + return (MALIST_find_tkth (A, l, A->num[l]-k+1) ); +} + +/* find minimum/maximum weight of the element in lth list. + weights are given by array odr. find minimum if f==0, otherwise find the maximum + if odr is NULL, use index as weights */ +ALIST_ID MALIST_find_min_odr ( MALIST *A, ALIST_ID l, ALIST_ID *odr, int f ){ + ALIST_ID m = -1, i; + MALIST_DO_FORWARD (*A, l, i){ + if ( m == -1 ) m = i; + else { + if ( f ){ + if ( odr ){ + if ( odr[m] < odr[i] ) m = i; + } else if ( m < i ) m = i; + } else if ( odr ){ + if ( odr[m] > odr[i] ) m = i; + } else if ( m > i ) m = i; + } + } + return (m); +} + +/* partition the sub-list from head to tail, in the l-th list so that the former part + is composed of elements smaller than ind + and the latter is the remaining. if f!=0, then reverse order */ +/* return the position at which idx should be placed */ +ALIST_ID MALIST_seg_partition (MALIST *A, ALIST_ID l, ALIST_ID head, ALIST_ID tail, ALIST_ID idx, int f, int undo){ + ALIST_ID e1, e2, e, k=head; +#ifdef ERROR_CHECK + if ( l < 0 || l >= A->list_end ) error_num ("MALIST_partition: l is out of range", l, EXIT0); +#endif + if ( head >= A->num[l] ) return (-1); + e1 = MALIST_find_kth (A, l, head); + if ( tail>A->num[l] ) e2 = MALIST_TAIL (*A, l); + else e2 = MALIST_find_kth (A, l, tail); + + while (1){ + while ( f? (e1>idx): (e1nxt[e1]; + k++; + if ( e1==e2 ) goto END; + } + while ( f? (e2<=idx): (e2>idx) ){ + e2 = A->prv[e2]; + if ( e1==e2 ) goto END; + } + e = A->prv[e1]; + MALIST_rm (A, e1, undo); + MALIST_ins_nxt (A, e1, e2, undo); + MALIST_rm (A, e2, undo); + MALIST_ins_nxt (A, e2, e, undo); + e=e1; e1=e2; e2=e; + } + END:; + return (k); +} + +/* partition the l-th list so that the former part is composed of elements smaller than ind + and the latter is the remaining. if f!=0, then reverse order */ +/* return the position at which idx should be placed */ +ALIST_ID MALIST_partition (MALIST *A, ALIST_ID l, ALIST_ID idx, int f, int undo){ + ALIST_ID e, e1, e2, k=1; +#ifdef ERROR_CHECK + if ( l < 0 || l >= A->list_end ) error_num ("MALIST_partition: l is out of range", l, EXIT0); +#endif + e1 = MALIST_HEAD ( *A, l ); + e2 = MALIST_TAIL ( *A, l ); + while (1){ + while ( f? (e1>idx): (e1nxt[e1]; + k++; + if ( e1==e2 ) goto END; + } + while ( f? (e2<=idx): (e2>idx) ){ + e2 = A->prv[e2]; + if ( e1==e2 ) goto END; + } + e = A->prv[e1]; + MALIST_rm (A, e1, undo); + MALIST_ins_nxt (A, e1, e2, undo); + MALIST_rm (A, e2, undo); + MALIST_ins_nxt (A, e2, e, undo); + e=e1; e1=e2; e2=e; + } + END:; + if ( e2 == MALIST_TAIL (*A, l) && ( f? (e2<=idx): (e2>idx) ) ) k++; + return (k); +} + +/* partition the l-th list so that any of the former k elements is smaller than any of the + lattter. if f!=0, then reverse order */ +/* return the k-th element */ +ALIST_ID MALIST_k_partition (MALIST *A, ALIST_ID l, ALIST_ID k, int f, int undo){ + ALIST_ID e, ee, head=1, tail=A->num[l], kk; +#ifdef ERROR_CHECK + if ( l < 0 || l >= A->list_end ) error_num ("MALIST_partition: l is out of range", l, EXIT0); +#endif + while (1){ + e = MALIST_find_kth (A, l, k); + if ( tail == head ) break; + kk = MALIST_seg_partition (A, l, head, tail, e, f, undo); + if ( kk == head ){ + if ( k == head ) return (e); + ee = MALIST_find_kth (A, l, head); + kk = A->prv[ee]; + MALIST_rm (A, ee, undo); + MALIST_ins_nxt (A, ee, e, undo); + MALIST_rm (A, e, undo); + MALIST_ins_nxt (A, e, kk, undo); + head++; + } + else if ( kk<=k ) head = kk; + else tail = kk-1; + } + return (e); +} + + + +/* sort lth list in the order of indices. increasing order if f==0, decreasing otherwise */ +void MALIST_sort (MALIST *A, ALIST_ID l, int f, int undo){ + ALIST_ID i, ii, j; + MALIST_DO_FORWARD2 (*A, l, i, ii){ + j=A->prv[i]; + MALIST_rm (A, i, undo); + if ( f ) while (MALIST_IS_ELM(*A, j) && jprv[j]; + else while (MALIST_IS_ELM(*A, j) && j>i ) j = A->prv[j]; + MALIST_ins_nxt (A, i, j, undo); + } +} + +void MALIST_sort_odr (MALIST *A, ALIST_ID l, ALIST_ID f, int *odr, int undo){ + ALIST_ID i, ii, j; + MALIST_DO_FORWARD2 (*A, l, i, ii){ + j = A->prv[i]; + MALIST_rm (A, i, undo); + if ( f ) while (MALIST_IS_ELM(*A, j) && odr[j]prv[j]; + else while (MALIST_IS_ELM(*A, j) && odr[j]>odr[i]) j = A->prv[j]; + MALIST_ins_nxt (A, i, j, undo); + } +} + +/* remove all elements included in ALIST B, from lth list of MALIST A */ +void MALIST_minus_ALIST ( MALIST *A, ALIST_ID l, ALIST *B ){ + ALIST_ID i; + ALIST_DO_FORWARD (*B, i) if ( A->list[i] == l ) MALIST_rm (A, i, 0); +} + + +#endif + + + diff --git a/rql-backend/shd31/alist.h b/rql-backend/shd31/alist.h new file mode 100644 index 0000000..6826783 --- /dev/null +++ b/rql-backend/shd31/alist.h @@ -0,0 +1,225 @@ +/* array-based list/multi-list library + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _alist_h_ +#define _alist_h_ + +#include"stdlib2.h" +#include"undo.h" + +#ifndef ALIST_ID + #ifdef ALIST_ID_LONG + #define ALIST_ID LONG + #define ALIST_ID_END LONGHUGE + #define ALIST_IDF LONGF + #else + #define ALIST_ID int + #define ALIST_ID_END INTHUGE + #define ALIST_IDF "%d" + #endif +#endif + +/* macros for getting head, tail of (multi) list */ +#define ALIST_HEAD(A) ((A).nxt[(A).end]) +#define ALIST_TAIL(A) ((A).prv[(A).end]) +#define MALIST_HEAD(A,l) ((A).nxt[(A).end+l]) +#define MALIST_TAIL(A,l) ((A).prv[(A).end+l]) + +/* macro to check if e is an element(or root element) */ +#define ALIST_IS_ELM(A,e) (e<(A).end) +#define MALIST_IS_ELM(A,e) (e<(A).end) + +/* macros for loops */ +/* each ***2 works correctly even when we remove the current element from the list */ +#define ALIST_DO_FORWARD(A,i) for((i)=(A).nxt[(A).end];(i)<(A).end;(i)=(A).nxt[(i)]) +#define ALIST_DO_FORWARD2(A,i,ii) for(i=(A).nxt[(A).end],ii=(A).nxt[i];(i)<(A).end;i=ii,ii=(A).nxt[i]) +#define ALIST_DO_BACKWARD(A,i) for((i)=(A).prv[(A).end];(i)<(A).end;i=(A).prv[(i)]) +#define ALIST_DO_BACKWARD2(A,i,ii) for((i)=(A).prv[(A).end],ii=(A).prv[i];(i)<(A).end;i=ii,ii=(A).prv[i]) +#define MALIST_DO_FORWARD(A,l,i) for((i)=(A).nxt[(A).end+l];(i)<(A).end;(i)=(A).nxt[(i)]) +#define MALIST_DO_FORWARD2(A,l,i,ii) for((i)=(A).nxt[(A).end+l],ii=(A).nxt[i];(i)<(A).end;i=ii,ii=(A).nxt[i]) +#define MALIST_DO_BACKWARD(A,l,i) for((i)=(A).prv[(A).end+l];(i)<(A).end;(i)=(A).prv[(i)]) +#define MALIST_DO_BACKWARD2(A,l,i,ii) for((i)=(A).prv[(A).end+l],ii=(A).prv[i];(i)<(A).end;i=ii,ii=(A).prv[i]) + +/* marco for getting the list number of a root element e */ +#define MALIST_LIST(A,e) ((e)-((A).end)) + +/* struct for array list. the "end"th element is the root of the list */ +/* the element e not included in the list is identified by "prv[e] = -1 */ +typedef struct { + unsigned char type; + int *prv; /* index of the previous element of each element */ + int *nxt; /* index of the next element of each element */ + int end; /* maximum number of elements */ + int num; /* the length of the current list */ +} ALIST; + +extern ALIST INIT_ALIST; +QSORT_TYPE_HEADER(ALIST_ID, ALIST_ID) + +/************* initialization/termination ************/ + +void ALIST_alloc (ALIST *A, ALIST_ID siz); /* initialization */ +void ALIST_end (ALIST *A); /* termination */ +void ALIST_cpy (ALIST *A1, ALIST *A2); /* copy A2 to A1 */ +ALIST ALIST_dup (ALIST *A); /* duplication */ + +/************* addition/deletion ************/ + +/* insert an element e previous/next to element i or haed/tail of the list + error is checked for already inserted elements or out of range */ +void ALIST_ins_nxt (ALIST *A, ALIST_ID e, ALIST_ID i, int undo); +void ALIST_ins_prv (ALIST *A, ALIST_ID e, ALIST_ID i, int undo); +void ALIST_ins_head (ALIST *A, ALIST_ID e, int undo); +void ALIST_ins_tail (ALIST *A, ALIST_ID e, int undo); + +/* remove head/tail of the list, and return it. return root if empty list + with check removal of removed element/range check */ +ALIST_ID ALIST_rm_head (ALIST *A, int undo); +ALIST_ID ALIST_rm_tail (ALIST *A, int undo); + +/* remove an element e from list A. + with check removal of removed element/range check */ +void ALIST_rm (ALIST *A, ALIST_ID e, int undo); + +/* re-insert removed element by ALIST_rm to its original position. precisely, + insert removed element e previous to the next element when e is in the list + with check insertion of non-removed element/range check */ +void ALIST_recov (ALIST *A, ALIST_ID e, int undo); + +/* remove all elements in a list */ +void ALIST_rmall (ALIST *A); + +/************* print routines ************/ + +/* print all elements in the list */ +void ALIST_print (ALIST *A, int flag); + +/************* search ************/ + +/* return the kth element next/previous to i */ +/* for large k, pass through the root element. */ +ALIST_ID ALIST_knxt (ALIST *A, ALIST_ID i, ALIST_ID k); +ALIST_ID ALIST_kprv (ALIST *A, ALIST_ID i, ALIST_ID k); + +/* return kth element from the head/tail. return the head/tail if k<1. + return root if k>current size */ +ALIST_ID ALIST_find_kth (ALIST *A, ALIST_ID k); +ALIST_ID ALIST_find_tkth (ALIST *A, ALIST_ID k); + +/* return element randomly chosen from all element in A */ +ALIST_ID ALIST_find_rnd (ALIST *A); + + +/* sort elements in the list by merge sort without recursion */ +/* increasing order if f==0 */ +void ALIST_sort (ALIST *A, int f, int undo); + +/* return the most tailmost element which does not exceed i. + return root if there is no such element */ +ALIST_ID ALIST_find_i (ALIST *A, ALIST_ID i); + +/************* rich operations ************/ + +/* remove elements in B/not in B from A */ +void ALIST_minus (ALIST *A, ALIST *B, int undo); +void ALIST_and (ALIST *A, ALIST *B, int undo); + +/* concatinate A2 following to A1, A2 remains in ALIST_concat, not remain in ALIST_append */ +void ALIST_append (ALIST *A1, ALIST *A2, int undo); +void ALIST_concat (ALIST *A1, ALIST *A2, int undo); + + + +/********************************************************************/ +/******************* ȌAMALIST *********************************/ +/********************************************************************/ + +/* structure for array based multi list. each element can belong to at most one list */ +typedef struct { + unsigned char type; + ALIST_ID *prv; /* previous element to i */ + ALIST_ID *nxt; /* next element to i */ + ALIST_ID end; /* total #of elements */ + ALIST_ID *num; /* current length of each list */ + ALIST_ID *list; /* index of the list that each element belongs. If not belong, -1 */ + ALIST_ID list_end; /* maximum #lists */ +} MALIST; + +extern MALIST INIT_MALIST; + +/************* initialization/termination ************/ + +void MALIST_alloc (MALIST *A, ALIST_ID siz, ALIST_ID list_siz); /* initialization with #elements siz, and #list list_siz */ +void MALIST_end (MALIST *A); /* termination */ +void MALIST_cpy (MALIST *A1, MALIST *A2); /* copy. with size overflow check */ +MALIST MALIST_dup (MALIST *A); /* duplication */ + + +/************* addition/deletion ************/ + +/* insert an element e previous/next to element ee or haed/tail of the list l + error is checked for already inserted elements or out of range */ +void MALIST_ins_nxt (MALIST *A, ALIST_ID e, ALIST_ID ee, int undo); +void MALIST_ins_prv (MALIST *A, ALIST_ID e, ALIST_ID ee, int undo); +void MALIST_ins_head (MALIST *A, ALIST_ID l, ALIST_ID e, int undo); +void MALIST_ins_tail (MALIST *A, ALIST_ID l, ALIST_ID e, int undo); + +/* remove head/tail of the list, and return it. return root if empty list + with check removal of removed element/range check */ +ALIST_ID MALIST_rm_head (MALIST *A, ALIST_ID l, int undo); +ALIST_ID MALIST_rm_tail (MALIST *A, ALIST_ID l, int undo); + +/* remove an element e from A. + with check removal of removed element/range check */ +void MALIST_rm (MALIST *A, ALIST_ID e, int undo); + +/* re-insert removed element by MALIST_rm to its original position. precisely, + insert removed element e previous to the next element when e is in the list + with check insertion of non-removed element/range check */ +void MALIST_recov (MALIST *A, ALIST_ID e, int undo); + +/* remove all elements in the lth list */ +void MALIST_rmall (MALIST *A, ALIST_ID l); + +/* move element e to the lth list + with check insertion of non-removed element/range check */ +void MALIST_mv (MALIST *A, ALIST_ID l, ALIST_ID e, int undo); +void MALIST_mv_head (MALIST *A, ALIST_ID l, ALIST_ID e, int undo); +/* move all elements in llth list to lth list. do nothing if l==ll */ +void MALIST_mvall (MALIST *A, ALIST_ID l, ALIST_ID ll, int undo); + +/************* print routines ************/ + +void MALIST_print (MALIST *A, ALIST_ID l); /* print lth list */ +void MALIST_print_all (MALIST *A); /* print all lists */ + +/************* search ************/ + +/* return the kth element from the head/tail of the lth list */ +ALIST_ID MALIST_find_kth (MALIST *A, ALIST_ID l, ALIST_ID k); +ALIST_ID MALIST_find_tkth (MALIST *A, ALIST_ID l, ALIST_ID k); + +/* return a random element of lth list */ +ALIST_ID MALIST_find_rnd (MALIST *A, ALIST_ID l); + +/* find minimum/maximum weight of the element in lth list. + weights are given by array odr. find minimum if f==0, otherwise find the maximum + if odr is NULL, use index as weights */ +ALIST_ID MALIST_find_min_odr (MALIST *A, ALIST_ID l, ALIST_ID *odr, int f); + +/* sort lth list in the order of indices/weights. increasing order if f==0, decreasing otherwise */ +void MALIST_sort (MALIST *A, ALIST_ID l, int f, int undo); +void MALIST_sort_odr (MALIST *A, ALIST_ID l, int f, int *odr, int undo); + +/* remove all elements included in ALIST B, from lth list of MALIST A */ +void MALIST_minus_ALIST (MALIST *A, ALIST_ID l, ALIST *B); + +#endif diff --git a/rql-backend/shd31/appendnum.pl b/rql-backend/shd31/appendnum.pl new file mode 100644 index 0000000..7012684 --- /dev/null +++ b/rql-backend/shd31/appendnum.pl @@ -0,0 +1,31 @@ +#!/usr/bin/perl + +#appendnum.pl appends the column number (column ID) to each item in each line +# the item-separator can be given by the first parameter +# input and output are done from/to standard input/output + +$ARGC = @ARGV; +if ( $ARGC < 0 ){ + printf ("appendnum.pl: [separator] < input-file > output-file\n"); + exit (1); +} +$count = 0; +%numbers = (); + +$sep = " "; +if ( $ARGC >= 1 ){ $sep = $ARGV[0]; } + +while (){ + chomp; + @eles = split($sep, $_); + $all = @eles; + $c = 0; + foreach $item( @eles ) { + if ( $item ne "" ){ + print "$item.$c" ; + $c++; + if ($c<$all){ print $sep; } + } + } + print "\n"; +} diff --git a/rql-backend/shd31/barray.c b/rql-backend/shd31/barray.c new file mode 100644 index 0000000..8c40cfe --- /dev/null +++ b/rql-backend/shd31/barray.c @@ -0,0 +1,238 @@ +/* + bit-array library + 12/Mar/2002 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _barray_c_ +#define _barray_c_ + +#include"barray.h" + +BARRAY INIT_BARRAY = {TYPE_BARRAY, NULL, 0, NULL, 0, 0, 0, 0}; + +/* initialization */ +void BARRAY_init (BARRAY *A, QUEUE_ID xsiz, VEC_ID t){ + A->xsiz = xsiz; + A->xend = (xsiz-1)/32+1; + A->end = A->t = t; + calloc2 (A->v, (A->xend)*t, EXIT); +} + +/* termination */ +void BARRAY_end (BARRAY *A){ + free2 (A->v); +} + +/* set from x1-th bit to x2-th bit to 1. x2 is also set to 1 */ +void BARRAY_set_interval (unsigned long *a, QUEUE_ID x1, QUEUE_ID x2){ + QUEUE_ID x=x1/32, i, xx=x2/32; + if ( x == xx ){ + for (i=x1%32 ; i<=x2%32 ; i++) BARY_SET (a, i); + } else { + a[x] |= BITMASK_UPPER1[x1%32]; + x++; + for ( ; xxsiz, A->t); + FLOOP (i, 0, A->t){ + FLOOP (j, 0, A->xsiz) printf (BARRAY_BIT (*A, j, i)?"1":"0"); + printf ("\n"); + } +} + +/* compare one long as bit sequence from k1-th bit to k2-th bit. + (_suf compares top to k-th bits, _pre compares k-th bits to the tail. + return minus value if A is small, 0 if same, plus value if B is small (same as "qsort") + the absolute value of the returned value is the first different bit +1 */ +int BARRAY_longcmp_suf (unsigned long a, unsigned long b, int k){ + unsigned long m = a^b; + for ( ; k<32 ; k++){ + if ( m&BITMASK_1[k] ){ + if ( a&BITMASK_1[k] ) return (k+1); + else return (-k-1); + } + } + return(0); +} +int BARRAY_longcmp_pre (unsigned long a, unsigned long b, int k ){ + unsigned long j, m = a^b; + FLOOP (j, 0, k+1){ + if ( m&BITMASK_1[j] ){ + if ( a&BITMASK_1[j] ) return (j+1); + else return (-j-1); + } + } + return(0); +} +int BARRAY_longcmp ( unsigned long a, unsigned long b, int k1, int k2){ + unsigned long m = a^b; + for ( ; k1<=k2 ; k1++){ + if ( m&BITMASK_1[k1] ){ + if ( a&BITMASK_1[k1] ) return (k1+1); + else return (-k1-1); + } + } + return(0); +} + +/* for return */ +int BARRAY_cmp_return (unsigned long a, unsigned long b){ + return ( b + (b<0?-a*32:b>0?a*32:0) ); +} + +int BARRAY_cmp (unsigned long *a, unsigned long *b, QUEUE_ID k){ + QUEUE_ID i=0; + while ( a[i] == b[i] ){ + i++; + if ( i > (k-1)/32 ) return (0); /* two are the same until the last */ + } + return ( BARRAY_cmp_return ( i, BARRAY_longcmp_pre (a[i], b[i], k%32))); +} + +/* set 1 for all positions in QUEUE Q */ +void BARRAY_set_subset (unsigned long *a, QUEUE *Q){ + QUEUE_INT *x; + MQUE_FLOOP (*Q, x) BIT_SET(a,*x); +} + +/* +int BARRAY_subcmp_ (unsigned long *a, unsigned long *b, QUEUE_ID k1, QUEUE_ID k2 ){ + int i=k1/32, m; + if ( i == k2/32 ) + return (BARRAY_cmp_return(i, BARRAY_longcmp(A->v[i], B->v[i], k1%32, k2%32))); + m = BARRAY_longcmp_suf ( A->v[i], B->v[i], k1%32 ); + if ( m != 0 ) return ( BARRAY_cmp_return ( i, m ) ); + + while ( A->v[i] == B->v[i] ){ + i++; + if ( i == k2/32 ) break; + } + return( BARRAY_cmp_return( i, BARRAY_longcmp_pre( A->v[i], B->v[i], k2%32))); +} +int BARRAY_subcmp (unsigned long *a, unsigned long *b, QUEUE_ID k1, QUEUE_ID k2, QUEUE_ID k){ +#ifdef ERROR_CHECK + if ( k1<0 || k1>=A->end ){ + printf ("BARRAY_subcmp: k1 is out of range. %d\n", k1 ); + exit(1); + } + if ( k2<0 || k2>=B->end ){ + printf ("BARRAY_subcmp: k2 is out of range. %d\n", k2 ); + exit(1); + } + if ( k+k1 >= A->end ) k = A->end - k1; + if ( k+k2 >= B->end ) k = B->end - k2; +#endif + while ( BARRAY_01(*A,k1) == BARRAY_01(*B,k2) ){ + if ( k1 == k ) return (0); + k1++; + k2++; + } + return ( BARRAY_BIT(*A,k1)? k1+1: -k1-1 ); +} +*/ + +/* load barray matrix, from 01 matrix file */ +/* if cr code is middle of a line, the rest is trancated (not filled), + and the following line will be read to a new line. */ +/* 0, -, ' ' will be 0, and the others will be 1 */ +/* support LOAD_TPOSE */ +void BARRAY_load (BARRAY *A){ + FILE2 fp; + size_t xmax=0, x=0, y=0, i=0; + int c, flag=0, f, ff; + + FILE2_open (fp, A->fname, "r", EXIT); + while ( (c = FILE2_getc (&fp)) >=0 ){ + if ( c=='\n' ){ + if ( flag == 2 ) flag = 0; + else flag = 1; + } else if ( c=='\r' ){ + if ( flag == 1 ) flag = 0; + else flag = 2; + } else { x++; flag = 0; } + if ( flag ){ i++; ENMAX (xmax, x); x=0; } + } + if ( A->flag & LOAD_TPOSE ) { y=xmax; xmax=i; i=y; } + BARRAY_init (A, xmax, i); + x = i = 0; + FILE2_reset (&fp); + while ( (c=FILE2_getc(&fp)) >=0 ){ + if ( c=='\n' ){ + if ( flag == 2 ) flag = 0; + else flag = 1; + } else if ( c=='\r' ){ + if ( flag == 1 ) flag = 0; + else flag = 2; + } else { + flag = 0; + f = (c=='0' || c==' ' || c=='-')?1:0; + ff = (A->flag&LOAD_COMP)?1:0; + if ( f^ff ){ + if ( A->flag & LOAD_TPOSE ) BARRAY_RESET (*A, i, x); + else BARRAY_RESET (*A, x, i); + } else if ( A->flag & LOAD_TPOSE ) BARRAY_SET (*A, i, x); + else BARRAY_SET (*A, x, i); + x++; + } + if ( flag ){ i++; x=0; } + } + FILE2_close (&fp); if(ERROR_MES) EXIT; +} + + +/* +main (){ + BARRAY A, B; + int i, j; + + BARRAY_init ( &A, 70 ); + BARRAY_init ( &B, 70 ); + A.a[0] = 0x1111ffff; + B.a[0] = 0x1111ffff; + A.a[1] = 0x1111f1ff; + B.a[1] = 0x1111ff1f; + printf ("%d\n", BARRAY_subcmp ( &A, &B, 26,30,40) ); + + BARRAY_set_interval ( &A, 0, 69); + BARRAY_reset_interval ( &A, 0, 63 ); + BARRAY_SET ( A,10 ); + BARRAY_SET ( A,20 ); + BARRAY_SET ( A,30 ); + BARRAY_SET ( A,40 ); + BARRAY_SET ( A,50 ); + BARRAY_SET ( A,60 ); + BARRAY_print ( &A ); +} +*/ + + +#endif + diff --git a/rql-backend/shd31/barray.h b/rql-backend/shd31/barray.h new file mode 100644 index 0000000..8b6b507 --- /dev/null +++ b/rql-backend/shd31/barray.h @@ -0,0 +1,74 @@ +/* + bit-array library + 12/Mar/2002 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _barray_h_ +#define _barray_h_ + +#include"queue.h" + + +typedef struct { + unsigned char type; // mark to identify type of the structure + char *fname; // input file name + int flag; // flag + + unsigned long *v; + VEC_ID end; + VEC_ID t; + QUEUE_ID xend; + QUEUE_ID xsiz; +} BARRAY; +extern BARRAY INIT_BARRAY; + +#define BARY_SET(a,x) ((a)[(x)/32]|=BITMASK_1[(x)%32]) +#define BARY_RESET(a,x) ((a)[(x)/32]&=BITMASK_31[(x)%32]) +#define BARY_BIT(a,x) ((a)[(x)/32]&BITMASK_1[(x)%32]) +#define BARY_01(a,x) (((a)[(x)/32]&BITMASK_1[(x)%32])/BITMASK_1[(x)%32]) +#define BARRAY_SET(A,x,y) ((A).v[(y)*(A).xend+(x)/32]|=BITMASK_1[(x)%32]) +#define BARRAY_RESET(A,x,y) ((A).v[(y)*(A).xend+(x)/32]&=BITMASK_31[(x)%32]) +#define BARRAY_BIT(A,x,y) ((A).v[(y)*(A).xend+(x)/32]&BITMASK_1[(x)%32]) +#define BARRAY_01(A,x,y) (((A).v[(y)*(A).xend+(x)/32]&BITMASK_1[(x)%32])/BITMASK_1[(x)%32]) + +/* initialization/termination */ +void BARRAY_init (BARRAY *A, QUEUE_ID x_end, VEC_ID t); +void BARRAY_end (BARRAY *A); + +/* set from x1-th bit to x2-th bit to 1/0. x2 is also set to 1/0 */ +void BARRAY_set_interval (unsigned long *a, QUEUE_ID x1, QUEUE_ID x2); +void BARRAY_reset_interval (unsigned long *a, QUEUE_ID x1, QUEUE_ID x2); + +/* print */ +void BARRAY_print (BARRAY *A); + + +/* compare one long as bit sequence from k1-th bit to k2-th bit. + (_suf compares top to k-th bits, _pre compares k-th bits to the tail. + return minus value if A is small, 0 if same, plus value if B is small (same as "qsort") + the absolute value of the returned value is the first different bit +1 */ +int BARRAY_longcmp_suf (unsigned long a, unsigned long b, int k); +int BARRAY_longcmp_pre (unsigned long a, unsigned long b, int k); +int BARRAY_longcmp (unsigned long a, unsigned long b, int k1, int k2); +/* for "return" */ +int BARRAY_cmp_return (unsigned long a, unsigned long b); + +/* compare bit sequence in the lexicographical order. + (compare from k1 to k2-th bits, compare k1-th to (k1+k)th bits of A and + k2-th to (k2+k)th bits of B) + return minus value if A is small, 0 if same, plus value if B is small (same as "qsort") + the absolute value of the returned value is the first different bit +1 */ +int BARRAY_cmp (unsigned long *a, unsigned long *b, QUEUE_ID k); +int BARRAY_subcmp_ (unsigned long *a, unsigned long *b, QUEUE_ID k1, QUEUE_ID k2); +int BARRAY_subcmp (unsigned long *a, unsigned long *b, QUEUE_ID k1, QUEUE_ID k2, QUEUE_ID k); + + +#endif + diff --git a/rql-backend/shd31/base.c b/rql-backend/shd31/base.c new file mode 100644 index 0000000..9699f65 --- /dev/null +++ b/rql-backend/shd31/base.c @@ -0,0 +1,92 @@ +/* + blocked memory allocation library + 12/Mar/2002 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _base_c_ +#define _base_c_ + +#include"base.h" + +BASE INIT_BASE = {TYPE_BASE,NULL,0,0,0,0,-1,NULL}; + +/* initialization, and allocate memory for header */ +void BASE_alloc (BASE *B, int unit, int block_siz){ + *B = INIT_BASE; + B->dellist = B; + B->unit = unit; + B->block_siz = block_siz; + B->num = block_siz; + B->block_num = -1; + calloc2 (B->base, 20, EXIT); + B->block_end = 20; +} + +/* termination */ +void BASE_end (BASE *B){ + int i; + FLOOP (i, 0, B->block_end) free2 (B->base[i]); + free2 (B->base); + *B = INIT_BASE; +} + +/* return pointer to the cell corresponding to the given index */ +void *BASE_pnt (BASE *B, size_t i){ + return ( B->base[i/BASE_BLOCK] + (i%BASE_BLOCK)*B->unit); +} +/* return index corresponding to the given pointer */ +size_t BASE_index (BASE *B, void *x){ + size_t i; + FLOOP (i, 0, (size_t)(B->block_end+1)){ + if ( ((char*)x)>= B->base[i] && ((char*)x)<=B->base[i]+B->unit*BASE_BLOCK ) + return ( i*BASE_BLOCK + ((size_t)(((char *)x) - B->base[i])) / B->unit); + } + return (0); +} + +/* increment the current memory block pointer and (re)allcate memory if necessary */ +void *BASE_get_memory (BASE *B, int i){ + B->num += i; + if ( B->num >= B->block_siz ){ /* if reach to the end of base array */ + B->num = i; /* allocate one more base array, and increment the counter */ + B->block_num++; + reallocx(B->base, B->block_end, B->block_num, NULL, EXIT0); + if ( B->base[B->block_num] == NULL ) + malloc2 (B->base[B->block_num], B->block_siz*B->unit, EXIT0); + return (B->base[B->block_num]); + } + return (B->base[B->block_num] + (B->num-i)*B->unit); +} + + +/* allocate new cell */ +void *BASE_new (BASE *B){ + char *x; + + /* use deleted cell if it exists */ + if ( B->dellist != ((void *)B) ){ + x = (char *)B->dellist; /* return the deleted cell */ + B->dellist = (void *)(*((char **)x)); /* increment the head of the list */ + } else { + /* take a new cell from the base array if no deleted one exists */ + x = (char *)BASE_get_memory (B, 1); + } + return (x); +} + +/* delete one cell. (add to the deleted list) */ +void BASE_del (BASE *B, void *x){ + *((void **)x) = B->dellist; + B->dellist = x; +} + +#endif + + diff --git a/rql-backend/shd31/base.h b/rql-backend/shd31/base.h new file mode 100644 index 0000000..61b7792 --- /dev/null +++ b/rql-backend/shd31/base.h @@ -0,0 +1,59 @@ +/* + blocked memory allocation library + 12/Mar/2002 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + + +#ifndef _base_h_ +#define _base_h_ + +#include"stdlib2.h" + +/* structure for base array */ +#define BASE_UNIT 16 +#define BASE_BLOCK 65536 + +typedef struct { + unsigned char type; + char **base; + int block_siz; // size of one block of memory + int block_num; // currently using block + int unit; // size of one unit memory + int num; // current position in a block + int block_end; // current end of the block + void *dellist; +} BASE; + +extern BASE INIT_BASE; + +/* initialization, and allocate memory for header */ +void BASE_alloc (BASE *B, int unit, int block_siz); + +/* termination */ +void BASE_end (BASE *B); + +/* return pointer to the cell corresponding to the given index */ +void *BASE_pnt (BASE *B, size_t i); + +/* return index corresponding to the given pointer */ +size_t BASE_index (BASE *B, void *x); + +/* increment the current memory block pointer and (re)allcate memory if necessary */ +void *BASE_get_memory (BASE *B, int i); + +/* allocate new cell */ +void *BASE_new (BASE *B); + +/* delete one cell. (add to the deleted list) */ +void BASE_del (BASE *B, void *x); + + +#endif + diff --git a/rql-backend/shd31/col_conv.pl b/rql-backend/shd31/col_conv.pl new file mode 100644 index 0000000..95fbffe --- /dev/null +++ b/rql-backend/shd31/col_conv.pl @@ -0,0 +1,101 @@ +#!/bin/perl + +#!/usr/bin/perl + +# according to the rule file, convert each item of each line to +# another item +# each line of the rule file is a rule for one column +# the ith line is for ith column +# the first item of each line means the type of conversion, of each column. + +# #: comment +# I: ignore the column; no item will be added +# S: string, the column is treated as a string +# P: the column is treated as a number. The following sequence of +# numbers means the boundaries, and when the number in a column exceeds +# the i-th number, then item XX_i is put. Thus, if the sequence is +# 1 5 8 11, and the number is 6, then the items put are XX_3 and XX_4, +# where XX is the column ID +# N: same as P, but items are put when the number is smaller than the boundaries. +# B: P and N +# M: items are put when the number in a column is smaller than a number in +# the former half, or bigger than a number in the latter half + + +# the intervals. The numbers will be classified according to the number +# ex) x y z, mean intervals (-inf, x), [x, y), [y,z), [z,+inf) + +# The separator for the rule-file is " ", but we can specify the separator +# of the number in the data file, by the second parameter + + +$ARGC = @ARGV; +$c=0; +if ( $ARGC < 1 ){ + printf ("col_conv.pl: rule-file [separator] < input-file > output-file\n"); + exit (1); +} +open ( RULEFILE, "<$ARGV[0]" ); +$c++; +$sep = " "; +if ( $ARGC > 1 ){ $sep = $ARGV[$c]; } + +@table = ; +$count = 0; +%numbers = (); +$clms=0; + +foreach $trans( @table ){ + chomp ( $trans ); + @eles = split(" ", $trans); + $type[$clms] = shift(@eles); + if ( $type[$clms] ne "#" ){ + if ( $type[$clms] ne "S" && $type[$clms] ne "I" ){ + $c=0; + foreach $cell(@eles){ + if ( $cell == 0 ){ + if (index ( $cell, "0") >= 0 ){ $bound[$clms] .= $cell." "; } + } else { $bound[$clms] .= $cell." "; } + $c++; + } + $bound_num[$clms]=$c; + } + $clms++; + } +} + +while (){ + chomp; + @eles = split($sep, $_); + $c=0; + foreach $cell(@eles){ + if ( $c >= $clms ){ + print $cell." "; + } elsif ( $type[$c] eq "S" ){ + print "($c)".$cell." "; + } elsif ( $type[$c] ne "I" ){ + @bnd=split(" ", $bound[$c]); + $cc=0; + foreach $bbb(@bnd){ + if ( ($type[$c] eq "P" || $type[$c] eq "B") && ($cell > $bbb) ){ + print "($c)>$bbb "; + } + if ( ($type[$c] eq "N" || $type[$c] eq "B") && ($cell < $bbb) ){ + print "($c)<$bbb "; + } + if ( ($type[$c] eq "M") && ($cell < $bbb) && ($cc < ($bound_num[$c]+1)/2) ){ + print "($c)<$bbb "; + } + if ( ($type[$c] eq "M") && ($cell > $bbb) && ($cc >= ($bound_num[$c]-1)/2)){ + print "($c)>$bbb "; + } + $cc++; + } + } + $c++; + } + print "\n"; +} + + + diff --git a/rql-backend/shd31/exec_shd b/rql-backend/shd31/exec_shd new file mode 100644 index 0000000..fca7c85 --- /dev/null +++ b/rql-backend/shd31/exec_shd @@ -0,0 +1,5 @@ +./transnum.pl __tmp1__ < $2 > __tmp2__ +./shd $1 $4 $5 $6 $7 $8 $9 __tmp2__ $3 __tmp3__ +touch __tmp3__ +./untransnum.pl __tmp1__ < __tmp3__ > $3 +rm -f __tmp1__ __tmp2__ __tmp3__ diff --git a/rql-backend/shd31/exec_shd_ b/rql-backend/shd31/exec_shd_ new file mode 100644 index 0000000..130e0b9 --- /dev/null +++ b/rql-backend/shd31/exec_shd_ @@ -0,0 +1,7 @@ +./appendnum.pl < $2 > __tmp4__ +./transnum.pl __tmp1__ < __tmp4__ > __tmp2__ +rm -f __tmp4__ +./shd $1 $4 $5 $6 $7 $8 $9 __tmp2__ __tmp3__ +touch __tmp3__ +./untransnum.pl __tmp1__ < __tmp3__ > $3 +rm -f __tmp1__ __tmp2__ __tmp3__ diff --git a/rql-backend/shd31/itemset.c b/rql-backend/shd31/itemset.c new file mode 100644 index 0000000..b7ae1f2 --- /dev/null +++ b/rql-backend/shd31/itemset.c @@ -0,0 +1,496 @@ +/* itemset search input/output common routines + 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +/* routines for itemset mining */ + +#ifndef _itemset_c_ +#define _itemset_c_ + +#include"itemset.h" +#include"queue.c" +#include"aheap.c" + +/* flush the write buffer, available for multi-core mode */ +void ITEMSET_flush (ITEMSET *I, FILE2 *fp){ + if ( !(I->flag&ITEMSET_MULTI_OUTPUT) || (fp->buf-fp->buf_org) > FILE2_BUFSIZ/2 ){ + SPIN_LOCK(I->multi_core, I->lock_output); + FILE2_flush (fp); + SPIN_UNLOCK(I->multi_core, I->lock_output); + } +} + +/* Output information about ITEMSET structure. flag&1: print frequency constraint */ +void ITEMSET_print (ITEMSET *I, int flag){ + if ( I->lb>0 || I->ublb > 0 ) print_err ("%d <= ", I->lb); + print_err ("itemsets "); + if ( I->ub < INTHUGE ) print_err (" <= %d\n", I->ub); + print_err ("\n"); + } + if ( flag&1 ){ + if ( I->frq_lb > -WEIGHTHUGE ) print_err (WEIGHTF" <=", I->frq_lb); + print_err (" frequency "); + if ( I->frq_ub < WEIGHTHUGE ) print_err (" <="WEIGHTF, I->frq_ub); + print_err ("\n"); + } +} + +/* ITEMSET initialization */ +void ITEMSET_init (ITEMSET *I){ + I->flag = 0; + I->progress = 0; + I->iters = I->iters2 = I->iters3 = 0; + I->solutions = I->solutions2 = I->max_solutions = I->outputs = I->outputs2 = 0; + I->topk.end = 0; + I->item_max = I->item_max_org = 0; + I->ub = I->len_ub = I->gap_ub = INTHUGE; + I->lb = I->len_lb = I->gap_lb = 0; + I->frq = I->pfrq = I->total_weight = 0; + I->ratio = I->prob = 0.0; + I->posi_ub = I->nega_ub = I->frq_ub = WEIGHTHUGE; + I->posi_lb = I->nega_lb = I->frq_lb = I->setrule_lb = -WEIGHTHUGE; + I->dir = 0; + I->target = INTHUGE; + I->prob_ub = I->ratio_ub = I->rposi_ub = 1; + I->prob_lb = I->ratio_lb = I->rposi_lb = 0; + I->itemflag = NULL; + I->perm = NULL; + I->item_frq = NULL; + I->sc = NULL; + I->X = NULL; + I->fp = NULL; + I->separator = ' '; + I->topk = INIT_AHEAP; + I->itemset = I->add = INIT_QUEUE; + I->set_weight = NULL; + I->set_occ = NULL; + + I->multi_iters = I->multi_iters2 = I->multi_iters3 = NULL; + I->multi_outputs = I->multi_outputs2 = NULL; + I->multi_solutions = I->multi_solutions2 = NULL; + I->multi_fp = NULL; + + I->multi_core = 0; +} + + +/* second initialization + topk.end>0 => initialize heap for topk mining */ +/* all pointers will be set to 0, but not for */ +/* if topK mining, set topk.end to "K" */ +void ITEMSET_alloc (ITEMSET *I, char *fname, PERM *perm, QUEUE_INT item_max, size_t item_max_org){ + LONG i; + size_t siz = (I->flag&ITEMSET_USE_ORG)?item_max_org+2: item_max+2; + int j; + + I->prob = I->ratio = 1.0; + I->frq = 0; + I->perm = perm; + if ( I->topk.end>0 ){ + AHEAP_alloc (&I->topk, I->topk.end); + FLOOP (i, 0, I->topk.end) AHEAP_chg (&I->topk, (AHEAP_ID)i, -WEIGHTHUGE); + I->frq_lb = -WEIGHTHUGE; + } else I->topk.v = NULL; + QUEUE_alloc (&I->itemset, (QUEUE_ID)siz); I->itemset.end = (QUEUE_ID)siz; + if ( I->flag&ITEMSET_ADD ) QUEUE_alloc (&I->add, (QUEUE_ID)siz); + calloc2 (I->sc, siz+2, goto ERR); + if ( I->flag&ITEMSET_SET_RULE ){ + calloc2 (I->set_weight, siz, goto ERR); + if ( I->flag&(ITEMSET_TRSACT_ID+ITEMSET_MULTI_OCC_PRINT) ) + calloc2 (I->set_occ, siz, goto ERR); + } + I->iters = I->iters2 = I->solutions = 0; + I->item_max = item_max; + I->item_max_org = (QUEUE_INT)item_max_org; + if ( fname ){ + if ( strcmp (fname, "-") == 0 ) I->fp = stdout; + else fopen2 (I->fp, fname, (I->flag&ITEMSET_APPEND)?"a":"w", goto ERR); + } else I->fp = 0; + if ( I->flag&ITEMSET_ITEMFRQ ) + malloc2 (I->item_frq, item_max+2, goto ERR); + if ( I->flag&ITEMSET_RULE ){ + calloc2 (I->itemflag, item_max+2, goto ERR); + } + I->total_weight = 1; + j = MAX(I->multi_core,1); + calloc2 (I->multi_iters, j*7, goto ERR); + I->multi_iters2 = I->multi_iters + j; + I->multi_iters3 = I->multi_iters2 + j; + I->multi_outputs = I->multi_iters3 + j; + I->multi_outputs2 = I->multi_outputs + j; + I->multi_solutions = I->multi_outputs2 + j; + I->multi_solutions2 = I->multi_solutions + j; + + malloc2 (I->multi_fp, j, goto ERR); + FLOOP (i, 0, j) + FILE2_open_ (I->multi_fp[i], I->fp, goto ERR); +#ifdef MULTI_CORE + if ( I->multi_core > 0 ){ + pthread_spin_init (&I->lock_counter, PTHREAD_PROCESS_PRIVATE); + pthread_spin_init (&I->lock_sc, PTHREAD_PROCESS_PRIVATE); + pthread_spin_init (&I->lock_output, PTHREAD_PROCESS_PRIVATE); + } +#endif + return; + ERR:; + ITEMSET_end (I); + EXIT; +} + +/* sum the counters computed by each thread */ +void ITEMSET_merge_counters (ITEMSET *I){ + int i; + FLOOP (i, 0, MAX(I->multi_core,1)){ + I->iters += I->multi_iters[i]; + I->iters2 += I->multi_iters2[i]; + I->iters3 += I->multi_iters3[i]; + I->outputs += I->multi_outputs[i]; + I->outputs2 += I->multi_outputs2[i]; + I->solutions += I->multi_solutions[i]; + I->solutions2 += I->multi_solutions2[i]; + if ( I->multi_fp[i].buf ) FILE2_flush_last (&I->multi_fp[i]); + } + ARY_FILL (I->multi_iters, 0, MAX(I->multi_core,1)*7, 0); +} + +/*******************************************************************/ +/* termination of ITEMSET */ +/*******************************************************************/ +void ITEMSET_end (ITEMSET *I){ + int i; + QUEUE_end (&I->itemset); + QUEUE_end (&I->add); + AHEAP_end (&I->topk); + fclose2 (I->fp); + mfree (I->sc, I->item_frq, I->itemflag, I->perm, I->set_weight, I->set_occ); + + if ( I->multi_fp ) + FLOOP (i, 0, MAX(I->multi_core,1)) free2 (I->multi_fp[i].buf); + mfree (I->multi_iters, I->multi_fp); +#ifdef MULTI_CORE + if ( I->multi_core>0 ){ + pthread_spin_destroy(&I->lock_counter); + pthread_spin_destroy(&I->lock_sc); + pthread_spin_destroy(&I->lock_output); + } +#endif + ITEMSET_init (I); +} + +/*******************************************************************/ +/* output at the termination of the algorithm */ +/* print #of itemsets of size k, for each k */ +/*******************************************************************/ +void ITEMSET_last_output (ITEMSET *I){ + QUEUE_ID i; + LONG n=0, nn=0; + + ITEMSET_merge_counters (I); + if ( !(I->flag&SHOW_MESSAGE) ) return; // "no message" is specified + if ( I->topk.end > 0 ){ + i = AHEAP_findmin_head (&I->topk); + fprint_WEIGHT (stdout, AHEAP_H (I->topk, i)); + printf ("\n"); + return; + } + FLOOP (i, 0, I->itemset.end+1){ + n += I->sc[i]; + if ( I->sc[i] != 0 ) nn = i; + } + if ( n!=0 ){ + printf (LONGF "\n", n); + FLOOP (i, 0, nn+1) printf (LONGF "\n", I->sc[i]); + } + print_err ("iters=" LONGF, I->iters); + if ( I->flag&ITEMSET_ITERS2 ) print_err (", iters2=" LONGF, I->iters2); + print_err ("\n"); +} + +/* output frequency, coverage */ +void ITEMSET_output_frequency (ITEMSET *I, int core_id){ + FILE2 *fp = &I->multi_fp[core_id]; + if ( I->flag&(ITEMSET_FREQ+ITEMSET_PRE_FREQ) ){ + if ( I->flag&ITEMSET_FREQ ) FILE2_putc (fp, ' '); + FILE2_print_WEIGHT (fp, I->frq, 4, '('); + FILE2_putc (fp, ')'); + if ( I->flag&ITEMSET_PRE_FREQ ) FILE2_putc (fp, ' '); + } + if ( I->flag&ITEMSET_OUTPUT_POSINEGA ){ // output positive sum, negative sum in the occurrence + FILE2_putc (fp, ' '); + FILE2_print_WEIGHT (fp, I->pfrq, 4, '('); + FILE2_print_WEIGHT (fp, I->pfrq-I->frq, 4, ','); + FILE2_print_WEIGHT (fp, I->pfrq/(2*I->pfrq-I->frq), 4, ','); + FILE2_putc (fp, ')'); + } +} + +#ifdef _trsact_h_ +void ITEMSET_output_occ (ITEMSET *I, QUEUE *occ, int core_id){ + QUEUE_ID i; + QUEUE_INT *x; + FILE2 *fp = &I->multi_fp[core_id]; + TRSACT *TT = (TRSACT *)(I->X); + VEC_ID j, ee = TT->rows_org; + int flag = I->flag&(ITEMSET_TRSACT_ID+ITEMSET_MULTI_OCC_PRINT); + + i=0; MQUE_FLOOP_ (*occ, x, TT->occ_unit){ + if ( (I->flag&ITEMSET_RM_DUP_TRSACT)==0 || *x != ee ){ + FILE2_print_int (fp, TT->trperm? TT->trperm[*x]: *x, I->separator); + if (flag == ITEMSET_MULTI_OCC_PRINT ){ + FLOOP (j, 1, (VEC_ID)(TT->occ_unit/sizeof(QUEUE_INT))) + FILE2_print_int (fp, *(x+j), I->separator); + } else if ( flag == (ITEMSET_MULTI_OCC_PRINT+ITEMSET_TRSACT_ID) ){ + FILE2_print_int (fp, *(x+1), I->separator); + } + } + ee = *x; + if ( (++i)%256==0 ) ITEMSET_flush (I, fp); + } + FILE2_putc (fp, '\n'); +} +#endif + +/* output an itemset to the output file */ +void ITEMSET_output_itemset (ITEMSET *I, QUEUE *occ, int core_id){ + QUEUE_ID i; + QUEUE_INT e; +#ifdef _agraph_h_ + QUEUE_INT ee; +#endif + + FILE2 *fp = &I->multi_fp[core_id]; + + I->multi_outputs[core_id]++; + if ( (I->flag&SHOW_PROGRESS ) && (I->multi_outputs[core_id]%(ITEMSET_INTERVAL) == 0) ) + print_err ("---- " LONGF " solutions in " LONGF " candidates\n", + I->multi_solutions[core_id], I->multi_outputs[core_id]); + if ( I->itemset.t < I->lb || I->itemset.t > I->ub ) return; + if ( (I->flag&ITEMSET_IGNORE_BOUND)==0 && (I->frq < I->frq_lb || I->frq > I->frq_ub) ) return; + if ( (I->flag&ITEMSET_IGNORE_BOUND)==0 && (I->pfrq < I->posi_lb || I->pfrq > I->posi_ub || (I->frq - I->pfrq) > I->nega_ub || (I->frq - I->pfrq) < I->nega_lb) ) return; + + I->multi_solutions[core_id]++; + if ( I->max_solutions>0 && I->multi_solutions[core_id] > I->max_solutions ){ + ITEMSET_last_output (I); + ERROR_MES = "reached to maximum number of solutions"; + EXIT; + } + if ( I->topk.v ){ + e = AHEAP_findmin_head (&(I->topk)); + if ( I->frq > AHEAP_H (I->topk, e) ){ + AHEAP_chg (&(I->topk), e, I->frq); + e = AHEAP_findmin_head (&(I->topk)); + I->frq_lb = AHEAP_H (I->topk, e); + } + } else if ( I->fp ){ + if ( I->flag&ITEMSET_PRE_FREQ ) ITEMSET_output_frequency (I, core_id); + if ( (I->flag & ITEMSET_NOT_ITEMSET) == 0 ){ +#ifdef _agraph_h_ + if ( I->flag&ITEMSET_OUTPUT_EDGE ){ + FLOOP (i, 0, I->itemset.t){ + e = I->itemset.v[i]; + ee = AGRAPH_INC_FROM(*((AGRAPH *)(I->X)), e, I->dir); + FILE2_print_int (fp, I->perm? I->perm[ee]: ee, '(' ); + ee = AGRAPH_INC_TO(*((AGRAPH *)(I->X)), e, I->dir); + FILE2_print_int (fp, I->perm? I->perm[ee]: ee, I->separator); + FILE2_putc (fp, ')'); + if ( iitemset.t-1 ) FILE2_putc (fp, I->separator); + if ( (i+1)%256==0 ) ITEMSET_flush (I, fp); + } + goto NEXT; + } +#endif + FLOOP (i, 0, I->itemset.t){ + e = I->itemset.v[i]; + FILE2_print_int (fp, I->perm? I->perm[e]: e, i==0? 0: I->separator); + if ( (i+1)%256==0 ) ITEMSET_flush (I, fp); + } +#ifdef _agraph_h_ + NEXT:; +#endif + } + if ( !(I->flag&ITEMSET_PRE_FREQ) ) ITEMSET_output_frequency (I, core_id); + if ( ((I->flag & ITEMSET_NOT_ITEMSET) == 0) || (I->flag&ITEMSET_FREQ) || (I->flag&ITEMSET_PRE_FREQ) ) FILE2_putc (fp, '\n'); + +#ifdef _trsact_h_ + if (I->flag&(ITEMSET_TRSACT_ID+ITEMSET_MULTI_OCC_PRINT)) ITEMSET_output_occ (I, occ, core_id); +#endif + } + I->sc[I->itemset.t]++; + ITEMSET_flush (I, fp); +} + +/* output itemsets with adding all combination of "add" + at the first call, i has to be "add->t" */ +void ITEMSET_solution_iter (ITEMSET *I, QUEUE *occ, int core_id){ + QUEUE_ID t=I->add.t; + if ( I->itemset.t > I->ub ) return; + ITEMSET_output_itemset (I, occ, core_id); +if ( ERROR_MES ) return; + BLOOP (I->add.t, I->add.t, 0){ + QUE_INS (I->itemset, I->add.v[I->add.t]); + ITEMSET_solution_iter (I, occ, core_id); +if ( ERROR_MES ) return; + I->itemset.t--; + } + I->add.t = t; +} + +void ITEMSET_solution (ITEMSET *I, QUEUE *occ, int core_id){ + QUEUE_ID i; + LONG s; + if ( I->itemset.t > I->ub ) return; + if ( I->flag & ITEMSET_ALL ){ + if ( I->fp || I->topk.v ) ITEMSET_solution_iter (I, occ, core_id); + else { + s=1; FLOOP (i, 0, I->add.t+1){ + I->sc[I->itemset.t+i] += s; + s = s*(I->add.t-i)/(i+1); + } + } + } else { + FLOOP (i, 0, I->add.t) QUE_INS (I->itemset, I->add.v[i]); + ITEMSET_output_itemset (I, occ, core_id); + I->itemset.t -= I->add.t; + } +} + +/*************************************************************************/ +/* ourput a rule */ +/*************************************************************************/ +void ITEMSET_output_rule (ITEMSET *I, QUEUE *occ, double p1, double p2, size_t item, int core_id){ + FILE2 *fp = &I->multi_fp[core_id]; + if ( fp->fp && !(I->topk.v) ){ + FILE2_print_real (fp, p1, 4, '('); + FILE2_print_real (fp, p2, 4, ','); + FILE2_putc (fp, ')'); + FILE2_print_int (fp, I->perm[item], I->separator); + FILE2_puts (fp, " <= "); + } + if ( I->flag & ITEMSET_RULE ){ + if ( I->flag & ITEMSET_RULE_ADD ) ITEMSET_solution (I, occ, core_id); + else ITEMSET_output_itemset (I, occ, core_id); + } else ITEMSET_solution (I, occ, core_id); +} +/*************************************************************************/ +/* check all rules for a pair of itemset and item */ +/*************************************************************************/ +void ITEMSET_check_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, size_t item, int core_id){ + double p = w[item]/I->frq, pp, ff; +// printf ("[ratio] %f, p=%f, (%f/ %f), %d(%d) <= ", I->ratio_lb, p, w[item], I->frq, I->perm[item], I->itemflag[item]); + if ( I->itemflag[item]==1 ) return; + if ( w[item] <= -WEIGHTHUGE ) p = 0; + pp = p; ff = I->item_frq[item]; + if ( I->flag & ITEMSET_RULE_SUPP ){ pp = w[item]; ff *= I->total_weight; } + + if ( I->flag & (ITEMSET_RULE_FRQ+ITEMSET_RULE_INFRQ)){ + if ( (I->flag & ITEMSET_RULE_FRQ) && p < I->ratio_lb ) return; + if ( (I->flag & ITEMSET_RULE_INFRQ) && p > I->ratio_ub ) return; + ITEMSET_output_rule (I, occ, p, ff, item, core_id); + } else if ( I->flag & (ITEMSET_RULE_RFRQ+ITEMSET_RULE_RINFRQ) ){ + if ( (I->flag & ITEMSET_RULE_RFRQ) && (1-p) > I->ratio_lb * (1-I->item_frq[item]) ) return; + if ( (I->flag & ITEMSET_RULE_RINFRQ) && p > I->ratio_ub * I->item_frq[item] ) return; + ITEMSET_output_rule (I, occ, pp, ff, item, core_id); + } +} + +/*************************************************************************/ +/* check all rules for an itemset and all items */ +/*************************************************************************/ +void ITEMSET_check_all_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, QUEUE *jump, WEIGHT total, int core_id){ + QUEUE_ID i, t; + QUEUE_INT e, f=0, *x; + WEIGHT d = I->frq/total; + + // checking out of range for itemset size and (posi/nega) frequency + if ( I->itemset.t+I->add.t < I->lb || I->itemset.t>I->ub || (!(I->flag&ITEMSET_ALL) && I->itemset.t+I->add.t>I->ub)) return; + if ( !(I->flag&ITEMSET_IGNORE_BOUND) && (I->frq < I->frq_lb || I->frq > I->frq_ub) ) return; + if ( !(I->flag&ITEMSET_IGNORE_BOUND) && (I->pfrq < I->posi_lb || I->pfrq > I->posi_ub || (I->frq - I->pfrq) > I->nega_ub || (I->frq - I->pfrq) < I->nega_lb) ) return; + + if ( I->flag&ITEMSET_SET_RULE ){ // itemset->itemset rule for sequence mining + FLOOP (i, 0, I->itemset.t-1){ + if ( I->frq/I->set_weight[i] >= I->setrule_lb && I->fp ){ + I->sc[i]++; + if ( I->flag&ITEMSET_PRE_FREQ ) ITEMSET_output_frequency (I, core_id); + FLOOP (t, 0, I->itemset.t){ + FILE2_print_int (&I->multi_fp[core_id], I->itemset.v[t], t?I->separator:0); + if ( t == i ){ + FILE2_putc (&I->multi_fp[core_id], ' '); + FILE2_putc (&I->multi_fp[core_id], '='); + FILE2_putc (&I->multi_fp[core_id], '>'); + } + } + if ( !(I->flag&ITEMSET_PRE_FREQ) ) ITEMSET_output_frequency ( I, core_id); + FILE2_putc (&I->multi_fp[core_id], ' '); + FILE2_print_real (&I->multi_fp[core_id], I->frq/I->set_weight[i], 4, '('); + FILE2_putc (&I->multi_fp[core_id], ')'); + FILE2_putc (&I->multi_fp[core_id], '\n'); +#ifdef _trsact_h_ + if ( I->flag&(ITEMSET_TRSACT_ID+ITEMSET_MULTI_OCC_PRINT) ){ + ITEMSET_output_occ (I, I->set_occ[i], core_id); + } +#endif + ITEMSET_flush (I, &I->multi_fp[core_id]); + } + } + } + // constraint of relational frequency + if ( ((I->flag&ITEMSET_RFRQ)==0 || d >= I->prob_lb * I->prob ) + && ((I->flag&ITEMSET_RINFRQ)==0 || d <= I->prob * I->prob_ub) ){ + if ( I->flag&ITEMSET_RULE ){ // rule mining routines + if ( I->itemset.t == 0 ) return; + if ( I->target < I->item_max ){ + MQUE_FLOOP (*jump, x){ + if ( *x == I->target ){ + ITEMSET_check_rule (I, w, occ, *x, core_id); if (ERROR_MES) return; + } + } +// ITEMSET_check_rule (I, w, occ, I->target, core_id); if (ERROR_MES) return; + } else { + if ( I->flag & (ITEMSET_RULE_FRQ + ITEMSET_RULE_RFRQ) ){ + if ( I->add.t>0 ){ +// if ( I->itemflag[I->add.v[0]] ) // for POSI_EQUISUPP (occ_w[e] may not be 100%, in the case) + f = I->add.v[I->add.t-1]; t = I->add.t; I->add.t--; + FLOOP (i, 0, t){ + e = I->add.v[i]; + I->add.v[i] = f; + ITEMSET_check_rule (I, w, occ, e, core_id); if (ERROR_MES) return; + I->add.v[i] = e; + } + I->add.t++; + } + MQUE_FLOOP (*jump, x) + ITEMSET_check_rule (I, w, occ, *x, core_id); if (ERROR_MES) return; + } else { + if ( I->flag & (ITEMSET_RULE_INFRQ + ITEMSET_RULE_RINFRQ) ){ +// ARY_FLOOP ( *jump, i, e ) I->itemflag[e]--; + FLOOP (i, 0, I->item_max){ + if ( I->itemflag[i] != 1 ){ + ITEMSET_check_rule (I, w, occ, i, core_id); if (ERROR_MES) return; + } + } +// ARY_FLOOP ( *jump, i, e ) I->itemflag[e]++; +// } +// ARY_FLOOP ( *jump, i, e ) ITEMSET_check_rule (I, w, occ, e); + } + } + } + } else { // usual mining (not rule mining) + if ( I->fp && (I->flag&(ITEMSET_RFRQ+ITEMSET_RINFRQ))){ + FILE2_print_real (&I->multi_fp[core_id], d, 4, '['); + FILE2_print_real (&I->multi_fp[core_id], I->prob, 4, ','); + FILE2_putc (&I->multi_fp[core_id], ']'); + } + ITEMSET_solution (I, occ, core_id); + } + } +} + +#endif diff --git a/rql-backend/shd31/itemset.h b/rql-backend/shd31/itemset.h new file mode 100644 index 0000000..0611242 --- /dev/null +++ b/rql-backend/shd31/itemset.h @@ -0,0 +1,157 @@ +/* itemset search input/output common routines + 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +/* routines for itemset mining */ + +#ifndef _itemset_h_ +#define _itemset_h_ + +#include"stdlib2.h" +#include"queue.h" +#define AHEAP_KEY_WEIGHT +#include"aheap.h" + + +typedef struct { + int a; + QUEUE itemset; // current operating itemset + QUEUE add; // for equisupport (hypercube decomposition) + int ub, lb; // upper/lower bounds for the itemset size + WEIGHT frq, pfrq, frq_ub, frq_lb; // upper/lower bounds for the frequency + WEIGHT rposi_lb, rposi_ub, posi_lb, posi_ub, nega_ub, nega_lb; // upper/lower bounds for the sum of positive/negative weights + WEIGHT setrule_lb; // frequency lower bound for set rule + double ratio, prob; // confidence and independent probability of the current pattern + double ratio_ub, ratio_lb, prob_ub, prob_lb; // upper/lower bounds for confidence and independent probability + QUEUE_INT target; // target item for rule mining + char *itemflag; // 1 if it is include in the pattern (and 2 if included in add) + WEIGHT *item_frq; // frequency of each item + WEIGHT total_weight; // total weight of the input database + int len_ub, len_lb; // upper/lower bounds for the length of the pattern + int gap_ub, gap_lb; // upper/lower bounds for the gaps in the pattern + LONG *sc; // #itemsets classified by the sizes + QUEUE_INT item_max, item_max_org; // (original) maximum item + AHEAP topk; // heap for topk mining. valid if topk->h is not NULL + int flag; // flag for various functions + PERM *perm; // permutation array for output itemset: item => original item + FILE *fp; // file pointer to the output file + char separator; // separator of items output + int progress; + LONG iters, iters2, iters3; //iterations + LONG solutions, solutions2; // number of solutions output + LONG outputs, outputs2; // #calls of ITEMSET_output_itemset or ITEMSET_solusion + LONG max_solutions; // maximum solutions to be output + void *X; // pointer to the original data + int dir; // direction flag for AGRAPH & SGRAPH + + int multi_core; // number of processors + LONG *multi_iters, *multi_iters2, *multi_iters3; //iterations + LONG *multi_solutions, *multi_solutions2; // number of solutions output + LONG *multi_outputs, *multi_outputs2; // #calls of ITEMSET_output_itemset or ITEMSET_solusion + FILE2 *multi_fp; // output file2 pointer for multi-core mode + WEIGHT *set_weight; // the frequency of each prefix of current itemset + QUEUE **set_occ; // the occurrence of each prefix of current itemset + +#ifdef MULTI_CORE + pthread_spinlock_t lock_counter; // couneter locker for jump counter + pthread_spinlock_t lock_sc; // couneter locker for score counter + pthread_spinlock_t lock_output; // couneter locker for #output +#endif +} ITEMSET; + +/* parameters for ITEMSET.flag */ + +#define ITEMSET_ITERS2 4 // output #iters2 +#define ITEMSET_PRE_FREQ 8 // output frequency preceding to each itemset +#define ITEMSET_FREQ 16 // output frequency following to each itemset +#define ITEMSET_ALL 32 // concat all combinations of "add" to each itemset + +#define ITEMSET_TRSACT_ID 64 // output transaction ID's in occurrences +#define ITEMSET_OUTPUT_EDGE 128 // output itemset as edge set (refer AGRAPH) +#define ITEMSET_IGNORE_BOUND 256 // ignore constraint for frequency +#define ITEMSET_RM_DUP_TRSACT 512 // remove duplicated transaction ID's +#define ITEMSET_MULTI_OCC_PRINT 1024 //print each component of occ + // TRSACT_ID+MULTI_OCC_PRINT means print first two components of occ +#define ITEMSET_NOT_ITEMSET 2048 // do not print itemset to the output file +#define ITEMSET_RULE_SUPP 4096 // output confidence and item frquency by abusolute value +#define ITEMSET_OUTPUT_POSINEGA 8192 // output negative/positive frequencies +#define ITEMSET_MULTI_OUTPUT 16384 // for multi-core mode +#define ITEMSET_USE_ORG 32768 // use item_max_org to the size of use +#define ITEMSET_ITEMFRQ 65536 // allocate item_frq +#define ITEMSET_ADD 131072 // allocate add + +#define ITEMSET_RULE_FRQ 262144 +#define ITEMSET_RULE_INFRQ 524288 +#define ITEMSET_RULE_RFRQ 1048576 +#define ITEMSET_RULE_RINFRQ 2097152 +#define ITEMSET_RFRQ 4194304 +#define ITEMSET_RINFRQ 8388608 +#define ITEMSET_POSI_RATIO 16777216 +#define ITEMSET_SET_RULE 134217728 + +#define ITEMSET_APPEND 268435456 // append the output to the fiile +#define ITEMSET_RULE_ADD 536870912 // append items in add to the solution, for rule output + +//#define ITEMSET_RULE (ITEMSET_RULE_FRQ + ITEMSET_RULE_INFRQ + ITEMSET_RULE_RFRQ + ITEMSET_RULE_RINFRQ + ITEMSET_RFRQ + ITEMSET_RINFRQ + ITEMSET_SET_RULE) // for check any rule is true +#define ITEMSET_RULE (ITEMSET_RULE_FRQ + ITEMSET_RULE_INFRQ + ITEMSET_RULE_RFRQ + ITEMSET_RULE_RINFRQ + ITEMSET_SET_RULE) // for check any rule is true + +#ifndef ITEMSET_INTERVAL +#define ITEMSET_INTERVAL 500000 +#endif + +/* Output information about ITEMSET structure. flag&1: print frequency constraint */ +void ITEMSET_print (ITEMSET *II, int flag); + +/* topk.end>0 => initialize heap for topk mining */ +/* all pointers will be set to 0, but not for */ +/* if topK mining, set topk.end to "K" */ +void ITEMSET_init (ITEMSET *I); +void ITEMSET_alloc (ITEMSET *I, char *fname, PERM *perm, QUEUE_INT item_max, size_t item_max_org); +void ITEMSET_end (ITEMSET *I); + +/* sum the counters computed by each thread */ +void ITEMSET_merge_counters (ITEMSET *I); + +/*******************************************************************/ +/* output at the termination of the algorithm */ +/* print #of itemsets of size k, for each k */ +/*******************************************************************/ +void ITEMSET_last_output (ITEMSET *I); + +/* output frequency, coverage */ +void ITEMSET_output_frequency (ITEMSET *I, int core_id); + +/* output an itemset to the output file */ +void ITEMSET_output_itemset (ITEMSET *I, QUEUE *occ, int core_id); + +/* output itemsets with adding all combination of "add" + at the first call, i has to be "add->t" */ +void ITEMSET_solution (ITEMSET *I, QUEUE *occ, int core_id); + +/*************************************************************************/ +/* ourput a rule */ +/*************************************************************************/ +void ITEMSET_output_rule (ITEMSET *I, QUEUE *occ, double p1, double p2, size_t item, int core_id); + +/*************************************************************************/ +/* check all rules for a pair of itemset and item */ +/*************************************************************************/ +void ITEMSET_check_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, size_t item, int core_id); + +/*************************************************************************/ +/* check all rules for an itemset and all items */ +/*************************************************************************/ +void ITEMSET_check_all_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, QUEUE *jump, WEIGHT total, int core_id); + +#endif + + + + diff --git a/rql-backend/shd31/makefile b/rql-backend/shd31/makefile new file mode 100644 index 0000000..3853521 --- /dev/null +++ b/rql-backend/shd31/makefile @@ -0,0 +1,2 @@ +SHD: shd.c problem.c itemset.c queue.c aheap.c stdlib2.c undo.c alist.c base.c vec.c + gcc -O3 -Os -s -o shd shd.c diff --git a/rql-backend/shd31/problem.c b/rql-backend/shd31/problem.c new file mode 100644 index 0000000..8bae8b8 --- /dev/null +++ b/rql-backend/shd31/problem.c @@ -0,0 +1,350 @@ +/* Common problem input/output routines /structure + 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +/***************************************************/ + +#ifndef _problem_c_ +#define _problem_c_ + +#include"problem.h" + +#include"stdlib2.c" +#include"queue.c" +#include"itemset.c" + +void PROBLEM_error (){ + ERROR_MES = "command explanation"; + EXIT; +} + +/*************************************************************************/ +/* PROBLEM and ITEMSET initialization */ +/*************************************************************************/ +void PROBLEM_init (PROBLEM *P){ + P->start_time = clock(); + RAND_INIT; + ERROR_MES = NULL; + + P->problem = P->problem2 = 0; + P->prog = 0; + P->prog2 = 0; + P->input_fname = P->input_fname2 = P->output_fname = P->output_fname2 = NULL; + P->workdir = P->workdir2 = NULL; + P->weight_fname = P->header_fname = P->table_fname = P->sc_fname = NULL; + P->position_fname = P->position2_fname = NULL; + P->outperm_fname = NULL; + + P->root = 0; + P->dir = P->edge_dir = 0; + P->th = P->th2 = P->th3 = 0; + P->ratio = P->ratio2 = 0; + P->num = P->siz = P->dim = P->len = P->width = P->height = 0; + P->rows = 0; + P->clms = 0; + P->gap_ub = INTHUGE; + P->gap_lb = 0; + P->xmax = P->ymax = P->pxmax = P->pymax = 0; + P->cost = P->cost2 = 0; + + ITEMSET_init (&P->II); + ITEMSET_init (&P->II2); + + P->vf = P->dep = NULL; + P->ff = INIT_QUEUE; + + P->shift = NULL; + P->occ_w = P->occ_pw = P->occ_w2 = P->occ_pw2 = NULL; + P->buf = P->buf_org = NULL; + P->buf_end = 0; + + P->itemjump = P->itemcand = P->vecjump = P->veccand = INIT_QUEUE; // for delivery + P->itemchr = P->vecchr = NULL; + P->OQ = P->OQ2 = P->VQ = P->VQ2 = NULL; // for delivery + P->itemary = NULL; + P->itemmark = P->itemflag = P->vecmark = P->vecflag = NULL; // mark for vector + P->occ_t = P->vecary = NULL; + P->oo = INIT_QUEUE; + P->vecw = NULL; + + P->pat = NULL; + P->plen = P->perr = 0; + +#ifdef _base_h_ + P->B = INIT_BASE; +#endif + +#ifdef _alist_h_ + P->occ = INIT_MALIST; + P->itemlist = INIT_ALIST; + P->veclist = INIT_ALIST; +#endif + +#ifdef _trsact_h_ + TRSACT_init (&P->TT); + TRSACT_init (&P->TT2); +#endif +#ifdef _sgraph_h_ + P->SG = INIT_SGRAPH; + P->SG2 = INIT_SGRAPH; +#endif +#ifdef _agraph_h_ + P->AG = INIT_AGRAPH; + P->AG2 = INIT_AGRAPH; +#endif +#ifdef _seq_h_ + SEQ_init (&P->SS); + SEQ_init (&P->SS2); +#endif +#ifdef _pos_h_ + POS_init (&P->PS); + POS_init (&P->PS2); + P->PS.S = &P->SS; + P->PS2.S = &P->SS2; + P->PS.I = &P->II; + P->PS2.I = &P->II; +#endif +#ifdef _fstar_h_ + P->FS = INIT_FSTAR; + P->FS2 = INIT_FSTAR; +#endif + +#ifdef _vec_h_ + P->MM = INIT_MAT; + P->MM2 = INIT_MAT; + P->SM = INIT_SMAT; + P->SM2 = INIT_SMAT; + P->FF = INIT_SETFAMILY; + P->FF2 = INIT_SETFAMILY; +#endif + +#ifdef _barray_h_ + P->BA = INIT_BARRAY; + P->BA2 = INIT_BARRAY; +#endif +} + +/*************************************************************************/ +/* PROBLEM load */ +/*************************************************************************/ +void PROBLEM_load (PROBLEM *P){ + int f=0; + ITEMSET *II = &P->II; +/******************************/ +#ifdef _trsact_h_ + if ( P->TT.fname ){ TRSACT_load (&P->TT); if (ERROR_MES) goto ERR; } + if ( P->TT2.fname ){ TRSACT_load (&P->TT2); if (ERROR_MES) goto ERR; } +#endif +#ifdef _sgraph_h_ + if ( P->SG.fname ){ SGRAPH_load (&P->SG); if (ERROR_MES) goto ERR; } + if ( P->SG2.fname ){ SGRAPH_load (&P->SG); if (ERROR_MES) goto ERR; } +#endif +#ifdef _agraph_h_ + if ( P->AG.fname ){ AGRAPH_load (&P->AG); if (ERROR_MES) goto ERR;} + if ( P->AG2.fname ){ AGRAPH_load (&P->AG2); if (ERROR_MES) goto ERR; } +#endif +#ifdef _fstar_h_ + if ( P->FS.fname ){ FSTAR_load (&P->FS); if (ERROR_MES) goto ERR; } + if ( P->FS2.fname ){ FSTAR_load (&P->FS2); if (ERROR_MES) goto ERR; } +#endif +#ifdef _vec_h_ + if ( P->MM.fname ){ MAT_load (&P->MM); if (ERROR_MES) goto ERR; } + if ( P->MM2.fname ){ MAT_load (&P->MM2); if (ERROR_MES) goto ERR; } + if ( P->SM.fname ){ SMAT_load (&P->SM); if (ERROR_MES) goto ERR; } + if ( P->SM2.fname ){ SMAT_load (&P->SM2); if (ERROR_MES) goto ERR; } + if ( P->FF.fname ){ SETFAMILY_load (&P->FF); if (ERROR_MES) goto ERR; } + if ( P->FF2.fname ){ SETFAMILY_load (&P->FF2); if (ERROR_MES) goto ERR; } + if ( P->FF.wfname ){ SETFAMILY_load_weight (&P->FF); if (ERROR_MES) goto ERR; } + if ( P->FF2.wfname ){ SETFAMILY_load_weight (&P->FF2); if (ERROR_MES) goto ERR; } + if ( P->FF.cwfname ){ SETFAMILY_load_column_weight (&P->FF); if (ERROR_MES) goto ERR; } + if ( P->FF2.cwfname ){ SETFAMILY_load_column_weight (&P->FF2); if (ERROR_MES) goto ERR; } + if ( P->FF.rwfname ){ SETFAMILY_load_row_weight (&P->FF); if (ERROR_MES) goto ERR; } + if ( P->FF2.rwfname ){ SETFAMILY_load_row_weight (&P->FF2); if (ERROR_MES) goto ERR; } +#endif +#ifdef _seq_h_ + if ( P->SS.fname ){ SEQ_load (&P->SS); if (ERROR_MES) goto ERR; } + if ( P->SS2.fname ){ SEQ_load (&P->SS2); if (ERROR_MES) goto ERR; } +#endif +#ifdef _barray_h_ + if ( P->BA.fname ){ BARRAY_load (&P->BA); if (ERROR_MES) goto ERR; } + if ( P->BA2.fname ){ BARRAY_load (&P->BA2); if (ERROR_MES) goto ERR; } +#endif + if (P->input_fname){ f=1; print_mes (II, " input: %s", P->input_fname); } + if (P->weight_fname){ f=1; print_mes (II, " weight: %s", P->weight_fname); } + if (P->output_fname){ f=1; print_mes (II, " output to: %s",P->output_fname); } + if ( f ) print_mes (II, "\n"); + +/******************************/ + + if ( !ERROR_MES ) return; + ERR:; + PROBLEM_end (P); + EXIT; +} + +/* termination of problem */ +void PROBLEM_end (PROBLEM *P){ + ITEMSET *II = &P->II; + +#ifdef _trsact_h_ + TRSACT_end (&P->TT); + TRSACT_end (&P->TT2); +#endif +#ifdef _sgraph_h_ + SGRAPH_end (&P->SG); + SGRAPH_end (&P->SG2); +#endif +#ifdef _agraph_h_ + AGRAPH_end (&P->AG); + AGRAPH_end (&P->AG2); +#endif +#ifdef _seq_h_ + SEQ_end (&P->SS); + SEQ_end (&P->SS2); +#endif +#ifdef _fstar_h_ + FSTAR_end (&P->FS); + FSTAR_end (&P->FS2); +#endif +#ifdef _vec_h_ + MAT_end (&P->MM); + MAT_end (&P->MM2); + SMAT_end (&P->SM); + SMAT_end (&P->SM2); + SETFAMILY_end (&P->FF); + SETFAMILY_end (&P->FF2); +#endif +#ifdef _pos_h_ + POS_end (&P->PS); + POS_end (&P->PS2); +#endif +#ifdef _barray_h_ + BARRAY_end (&P->BA); + BARRAY_end (&P->BA2); +#endif + +/******************************/ + + mfree (P->vf, P->dep); + QUEUE_end (&P->ff); + + ITEMSET_end (II); + ITEMSET_end (&P->II2); + + if ( P->occ_pw2 != P->occ_pw && P->occ_pw2 != P->occ_w2 ) free2 (P->occ_pw2); + if ( P->occ_w2 != P->occ_w ) free2 (P->occ_w2); + if ( P->occ_pw != P->occ_w ) free2 (P->occ_pw); + mfree (P->shift, P->occ_t, P->occ_w); + + if ( P->OQ ) free2 (P->OQ[0].v); + if ( P->OQ2 ) free2 (P->OQ2[0].v); + if ( P->VQ ) free2 (P->VQ[0].v); + if ( P->VQ2 ) free2 (P->VQ2[0].v); + mfree (P->OQ, P->OQ2, P->VQ, P->VQ2, P->itemchr, P->vecchr); + + mfree (P->itemary, P->itemflag, P->itemmark, P->vecary, P->vecflag, P->vecmark, P->vecw); + QUEUE_end (&P->itemcand); + QUEUE_end (&P->itemjump); + + QUEUE_end (&P->veccand); + QUEUE_end (&P->vecjump); + QUEUE_end (&P->oo); + + free2 (P->buf_org); + +#ifdef _alist_h_ + MALIST_end (&P->occ); + ALIST_end (&P->itemlist); + ALIST_end (&P->veclist); +#endif + +#ifdef _undo_h_ + ALISTundo_end (); +#endif + + P->end_time = clock(); + if ( print_time_flag ) + print_mes (II, "computation_time= %3f\n", ((double)(P->end_time-P->start_time))/CLOCKS_PER_SEC); + + PROBLEM_init (P); +} + +/* allocate arrays and structures */ +void PROBLEM_alloc (PROBLEM *P, QUEUE_ID siz, QUEUE_ID siz2, size_t siz3, PERM *perm, int f){ + PERM *p; +#ifdef _alist_h_ + ALIST_ID i=0; +#endif + int j; + + if ( f&PROBLEM_SHIFT ) calloc2 (P->shift, siz+2, goto ERR); + if ( f&PROBLEM_OCC_T ) calloc2 (P->occ_t, siz+2, goto ERR); + if ( f&(PROBLEM_OCC_W+PROBLEM_OCC_PW) ) calloc2 (P->occ_w, siz+2, goto ERR); + if ( f&PROBLEM_OCC_PW ) calloc2 (P->occ_pw, siz+2, goto ERR); + else P->occ_pw = P->occ_w; + if ( f&PROBLEM_OCC_W2 ){ + calloc2 (P->occ_w2, siz+2, goto ERR); + if ( f&PROBLEM_OCC_PW ) calloc2 (P->occ_pw2, siz+2, goto ERR); + else P->occ_pw2 = P->occ_w2; + } else { P->occ_w2 = P->occ_w; P->occ_pw2 = P->occ_pw; } + + if ( f&PROBLEM_ITEMFLAG ) calloc2 (P->itemflag, siz+2, goto ERR); + if ( f&PROBLEM_ITEMMARK ) calloc2 (P->itemmark, siz+2, goto ERR); + if ( f&PROBLEM_ITEMARY ) calloc2(P->itemary, siz+2, goto ERR); + if ( f&PROBLEM_ITEMCHR ) calloc2(P->itemchr, siz+2, goto ERR); + if ( f&PROBLEM_ITEMJUMP ) QUEUE_alloc (&P->itemjump, siz+2); + if ( f&PROBLEM_ITEMCAND ) QUEUE_alloc (&P->itemcand, siz+2); + + if ( f&PROBLEM_VECFLAG ) calloc2 (P->vecflag, siz2+2, goto ERR); + if ( f&PROBLEM_VECMARK ) calloc2 (P->vecmark, siz2+2, goto ERR); + if ( f&PROBLEM_VECARY ) calloc2 (P->vecary, siz2+2, goto ERR); + if ( f&PROBLEM_VECCHR ) calloc2 (P->vecchr, siz2+2, goto ERR); + if ( f&PROBLEM_VECJUMP ) QUEUE_alloc (&P->vecjump, siz2+2); + if ( f&PROBLEM_VECCAND ) QUEUE_alloc (&P->veccand, siz2+2); + if ( f&PROBLEM_VECW ) calloc2 (P->vecw, siz2+2, goto ERR); + +#ifdef _alist_h_ + if ( f&PROBLEM_ITEMLIST ) ALIST_alloc (&P->itemlist, siz+2); + if ( f&PROBLEM_VECLIST ) ALIST_alloc (&P->veclist, siz2+2); + + if ( f&PROBLEM_OCC3 ){ + MALIST_alloc (&P->occ, siz, siz2+2); // element=> +if ( ERROR_MES ) goto ERR; + if ( f&PROBLEM_OCC2 ){ + FLOOP (i, 0, siz) MALIST_ins_tail (&P->occ, (f&PROBLEM_OCC1)?siz2: 0, i, 0); + } + } +#endif + + // set outperm + if ( P->outperm_fname ){ + ARY_LOAD (p, int, j, P->outperm_fname, 1, EXIT); + if ( perm ){ + FLOOP (j, 0, siz) perm[j] = p[perm[j]]; + free2 (p); + } else perm = p; + } + ITEMSET_alloc (&P->II, P->output_fname, perm, siz, siz3); + if ( P->II.targetII.perm ) + FLOOP (j, 0, P->II.item_max){ if ( P->II.target == P->II.perm[j] ){ P->II.target = j; break; } } + +#ifdef _undo_h_ + ALISTundo_init (); +#endif + + return; + ERR:; + PROBLEM_end (P); + EXIT; +} + +#endif + + diff --git a/rql-backend/shd31/problem.h b/rql-backend/shd31/problem.h new file mode 100644 index 0000000..6b0a366 --- /dev/null +++ b/rql-backend/shd31/problem.h @@ -0,0 +1,177 @@ +/* Common problem input/output routines /structure + 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +/***************************************************/ + +#ifndef _problem_h_ +#define _problem_h_ + +#include"stdlib2.h" +#include"queue.h" +#include"itemset.h" + +#define PROBLEM_FREQSET 1 +#define PROBLEM_MAXIMAL 2 +#define PROBLEM_CLOSED 4 +#define PROBLEM_EX_MAXIMAL 8 +#define PROBLEM_EX_CLOSED 16 +#define PROBLEM_DOC 32 + +/***** parameters for PROBLEM initialization, given to flag *****/ + +#define PROBLEM_PRINT_DENSE 4 // print density threshold +#define PROBLEM_PRINT_SHRINK 8 // print properties of shrinked database +#define PROBLEM_PRINT_FRQ 16 // print density threshold +#define PROBLEM_NORMALIZE 32 // print density threshold + +#define PROBLEM_ITEMARY 128 // alloc itemary +#define PROBLEM_ITEMJUMP 256 // alloc itemjump +#define PROBLEM_ITEMFLAG 512 // alloc itemflag +#define PROBLEM_ITEMMARK 1024 // alloc itemmark +#define PROBLEM_ITEMCAND 2048 // alloc itemcand +#define PROBLEM_VECARY 4096 // alloc itemary +#define PROBLEM_VECJUMP 8192 // alloc vecjump +#define PROBLEM_VECFLAG 16384 // alloc vecflag +#define PROBLEM_VECMARK 32768 // alloc vecmark +#define PROBLEM_VECCAND 65536 // alloc veccand +#define PROBLEM_ITEMCHR 131072 //alloc itemchr +#define PROBLEM_VECCHR 262144 //alloc vecchr +//4194304 +#define PROBLEM_OCC_T 524288 // alloc occ_t +#define PROBLEM_SHIFT 1048576 // allocate shift +#define PROBLEM_OCC_W 2097152 // weight/positive-weight sum for items +#define PROBLEM_OCC_PW 4194304 // weight/positive-weight sum for items +#define PROBLEM_OCC_W2 8388608 // weight/positive-weight sum for items +#define PROBLEM_ITEMLIST 16777216 // alist for items +#define PROBLEM_VECLIST 33554432 // alist for vecs +#define PROBLEM_VECW 67108864 // weight array for vecs + +#define PROBLEM_OCC1 16 // alloc occ +#define PROBLEM_OCC2 32 // alloc occ and ins all to list 0 +#define PROBLEM_OCC3 48 // alloc occ and ins all to list "siz" + +typedef struct { + clock_t start_time, end_time; + int problem, problem2; + LONG prog; + int prog2; + double dense; + char *input_fname, *input_fname2; + char *output_fname, *output_fname2; + char *workdir, *workdir2; + + char *weight_fname; + char *table_fname, *table2_fname; + char *outperm_fname, *outperm_fname2; + char *header_fname, *position_fname, *position2_fname, *sc_fname; + + ITEMSET II, II2; + QUEUE ff; // for agraph search + int *vf, *dep; // for agraph search + + int root, dir, edge_dir; + double th, th2, th3; // thresholds + double ratio, ratio2; // ratio + int num, siz, dim, len, width, height, gap_ub, gap_lb; + int xmax, ymax, pxmax, pymax; + QUEUE_INT clms; + VEC_ID rows; + WEIGHT cost, cost2; + + QUEUE_ID **shift; + QUEUE itemjump, itemcand, vecjump, veccand, *OQ, *OQ2, *VQ, *VQ2; // for delivery + QUEUE_INT *itemary; + char *itemchr, *vecchr; + int *itemmark, *itemflag, *vecmark, *vecflag; // mark for vector + VEC_ID *vecary, *occ_t; + WEIGHT *occ_w, *occ_pw, *occ_w2, *occ_pw2, *vecw; + QUEUE oo; + QUEUE_INT *buf, *buf_org; + size_t buf_end; + + char *pat; // pattern string + int plen, perr; // pattern length and #error allowed + +#ifdef _base_h_ + BASE B; +#endif + +#ifdef _alist_h_ + ALIST itemlist, veclist; +#endif + +#ifdef _alist_h_ + MALIST occ; +#endif + +#ifdef _sgraph_h_ + SGRAPH SG, SG2; +#endif + +#ifdef _agraph_h_ + AGRAPH AG, AG2; +#endif + +#ifdef _trsact_h_ + TRSACT TT, TT2; +#endif + +#ifdef _seq_h_ + SEQ SS, SS2; +#endif +#ifdef _pos_h_ + POS PS, PS2; +#endif + +#ifdef _fstar_h_ + FSTAR FS, FS2; +#endif + +#ifdef _vec_h_ + MAT MM, MM2; + SMAT SM, SM2; + SETFAMILY FF, FF2; +#endif + +#ifdef _barray_h_ + BARRAY BA; + BARRAY BA2; +#endif + +} PROBLEM; + + +/***** print filename information ****/ +void PROBLEM_print (PROBLEM *P); + +/***** print usage of the program *****/ +void PROBLEM_error (); + +/***** read parameters given by command line *****/ +void PROBLEM_read_param (int argc, char *argv[], PROBLEM *P); + +/***** PROBLEM and ITEMSET initialization *****/ +/* all pointers are set to NULL, but don't touch filenames */ +void PROBLEM_init (PROBLEM *P); + +/***** PROBLEM initialization: load the files given by filenames ******/ +void PROBLEM_load (PROBLEM *P); + +/***** allocate memory according to flag *****/ +void PROBLEM_alloc (PROBLEM *PP, QUEUE_ID siz, QUEUE_ID siz2, size_t siz3, PERM *p, int f); + +/* termination of problem */ +void PROBLEM_end (PROBLEM *PP); + + +#endif + + diff --git a/rql-backend/shd31/queue.c b/rql-backend/shd31/queue.c new file mode 100644 index 0000000..d961b44 --- /dev/null +++ b/rql-backend/shd31/queue.c @@ -0,0 +1,528 @@ +/* Library of queue: spped priority implementation + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _queue_c_ +#define _queue_c_ + + +#include"queue.h" +#include"stdlib2.c" + +QSORT_TYPE(QUEUE_INT, QUEUE_INT) +QSORT_TYPE(QUEUE_ID, QUEUE_ID) +QUEUE INIT_QUEUE = {TYPE_QUEUE,NULL,0,0,0}; +QUEUE_INT *common_QUEUE_INTp; + +/* initialization, not fill the memory by 0 */ +void QUEUE_alloc (QUEUE *Q, QUEUE_ID siz){ + *Q = INIT_QUEUE; + Q->end = siz+1; + malloc2 (Q->v, siz+1, EXIT); +} + +/* termination processing */ +void QUEUE_end (QUEUE *Q){ + free2 (Q->v); + *Q = INIT_QUEUE; +} + +/* tranpose the matrix ; counting/transpose/memory_allocate */ +void QUEUE_delivery(QUEUE *OQ, VEC_ID *c, QUEUE *jump, QUEUE *Q, QUEUE *occ, VEC_ID t, QUEUE_INT M){ VEC_ID i, e; + QUEUE_INT *x; + FLOOP(i, 0, occ? occ->t: t){ + e = occ? occ->v[i]: i; + if ( c ){ + if ( jump ){ MLOOP (x, Q[e].v, M){ if ( c[*x]==0 ) QUE_INS (*jump, *x); c[*x]++; } + } else { MLOOP (x, Q[e].v, M){ c[*x]++; }} + } else { + if ( jump ){ MLOOP (x, Q[e].v, M){ if ( OQ[*x].t==0 ) QUE_INS (*jump, *x); QUE_INS (OQ[*x], e); } + } else MLOOP (x, Q[e].v, M){ QUE_INS (OQ[*x], e); } + } + } +} + +/* sort a QUEUE with WEIGHT, with already allocated memory */ +void QUEUE_perm_WEIGHT (QUEUE *Q, WEIGHT *w, PERM *invperm, int flag){ + WEIGHT y; + if ( w ){ + qsort_perm__QUEUE_INT (Q->v, Q->t, invperm, flag); + ARY_INVPERMUTE_ (w, invperm, y, Q->t); + } + qsort_QUEUE_INT (Q->v, Q->t, flag); +} + +/* remove (or unify) the consecutive same ID's in a QUEUE (duplication delete, if sorted) */ +void QUEUE_rm_dup_WEIGHT (QUEUE *Q, WEIGHT *w){ + VEC_ID j, jj=0; + if ( w ){ + FLOOP (j, 1, Q->t){ + if ( Q->v[j-1] != Q->v[j] ){ + Q->v[++jj] = Q->v[j]; + w[jj] = w[j]; + } else w[jj] += w[j]; + } + } else FLOOP (j, 1, Q->t){ + if ( Q->v[j-1] != Q->v[j] ) Q->v[++jj] = Q->v[j]; + } + if ( Q->t>0 ) Q->t = jj+1; +} + +/***********************************************************************/ +/* duplicate occ's in jump, ( copy occ's to allocated QUEUE array) */ +/* Q[i].end := original item, clear each original occ */ +/* buffer size is multiplied by u */ +/*******************************************************/ +void QUEUE_occ_dup (QUEUE *jump, QUEUE **QQ, QUEUE *Q, WEIGHT **ww, WEIGHT *w, WEIGHT **ppw, WEIGHT *pw, int u){ + QUEUE_ID i, l=QUEUE_LENGTH_(*jump); + size_t cnt=0; + QUEUE_INT e, *x; + char *buf; + int unit = sizeof(*Q) + (w?sizeof(*w):0) + (pw?sizeof(*pw):0); + + ENMAX (u, sizeof(*x)); + MQUE_FLOOP (*jump, x) cnt += Q[*x].t; + if ( cnt == 0 ){ *QQ=NULL; return; } + malloc2 (buf, l*unit + (cnt+l)*u, EXIT); + *QQ = (QUEUE*)buf; buf += sizeof(*Q) *l; + if ( w ){ *ww = (WEIGHT *)buf; buf += sizeof(*w)*l; } + if ( pw ){ *ppw = (WEIGHT *)buf; buf += sizeof(*pw)*l; } + for (i=0 ; it ; i++){ + e = jump->v[i]; + (*QQ)[i].end = e; + (*QQ)[i].v = (QUEUE_INT *)buf; + (*QQ)[i].t = Q[e].t; + memcpy (buf, Q[e].v, (Q[e].t+1)*u); + buf += (Q[e].t+1) *u; + if ( w ) (*ww)[i] = w[e]; + if ( pw ) (*ppw)[i] = pw[e]; + } +} + + +/* return the position of the first element having value e. return -1 if no such element exists */ +LONG QUEUE_ele (QUEUE *Q, QUEUE_INT e){ + QUEUE_INT *x; + MQUE_FLOOP (*Q, x) + if ( *x == e ) return (x - Q->v); + return (-1); +} + +/* insert an element to the tail */ +void QUEUE_ins_ (QUEUE *Q, QUEUE_INT e){ + Q->v[Q->t] = e; + Q->t++; +} +void QUEUE_ins (QUEUE *Q, QUEUE_INT e){ + Q->v[Q->t] = e; + QUEUE_INCREMENT (*Q, Q->t); + if (Q->s == Q->t ) error_num ("QUEUE_ins: overflow", Q->s, EXIT); +} + +/* insert an element to the head */ +void QUEUE_ins_head_ (QUEUE *Q, QUEUE_INT e){ + Q->s--; + Q->v[Q->s] = e; +} +void QUEUE_ins_head (QUEUE *Q, QUEUE_INT e){ + QUEUE_DECREMENT(*Q,Q->s); + Q->v[Q->s] = e; + if (Q->s == Q->t ) error_num ("QUEUE_ins_head: underflow", Q->s, EXIT); +} + +/* extract an element from the head, without checking underflow */ +QUEUE_INT QUEUE_ext_ (QUEUE *Q){ + (Q->s)++; + return (Q->v[Q->s-1]); +} +QUEUE_INT QUEUE_ext (QUEUE *Q){ + QUEUE_INT e; + if (Q->s == Q->t ) error_num ("QUEUE_ext: empty queue", Q->s, EXIT0); + e = Q->v[Q->s]; + QUEUE_INCREMENT(*Q,Q->s); + return ( e); +} + +/* extract an element from the tail, without checking underflow */ +QUEUE_INT QUEUE_ext_tail_ (QUEUE *Q){ + (Q->t)--; + return (Q->v[Q->t]); +} +QUEUE_INT QUEUE_ext_tail (QUEUE *Q){ + if ( Q->s == Q->t ) error_num ("QUEUE_ext_tail: empty queue", Q->s, EXIT0); + QUEUE_DECREMENT(*Q,Q->t); + return (Q->v[Q->t]); +} + +/* remove the j-th element and replace it by the tail */ +void QUEUE_rm_ (QUEUE *Q, QUEUE_ID j){ + Q->t--; + Q->v[j] = Q->v[Q->t]; +} +void QUEUE_rm (QUEUE *Q, QUEUE_ID j){ + if ( Q->s <= Q->t ){ + if ( j < Q->s || j >= Q->t ) error ("QUEUE_rm: j is out of queue", EXIT); + } else if ( j < Q->s && j >= Q->t ) error ("QUEUE_rm: j is out of queue", EXIT); + QUEUE_DECREMENT(*Q,Q->t); + Q->v[j] = Q->v[Q->t]; +} + +/* remove the j-th element and replace it by the head */ +void QUEUE_rm_head_ (QUEUE *Q, QUEUE_ID j){ + Q->v[j] = Q->v[Q->s]; + Q->s++; +} +void QUEUE_rm_head (QUEUE *Q, QUEUE_ID j){ + if ( Q->s <= Q->t ){ + if ( j < Q->s || j >= Q->t ) error ("QUEUE_rm: j is out of queue", EXIT); + } else if ( j < Q->s && j >= Q->t ) error ("QUEUE_rm: j is out of queue", EXIT); + Q->v[j] = Q->v[Q->s]; + QUEUE_INCREMENT(*Q,Q->s); +} + +/* remove the j-th element and shift the following elements to fill the gap */ +int QUEUE_rm_ele_ (QUEUE *Q, QUEUE_INT e){ + QUEUE_ID i; + QUEUE_F_LOOP (*Q, i){ + if ( Q->v[i] == e ){ + memcpy ( &(Q->v[i]), &(Q->v[i+1]), (Q->t-i-1)*sizeof(QUEUE_INT)); + Q->t--; + return (1); + } + } + return (0); +} +/* insert e to the position determined by the increasing order of elements */ +void QUEUE_ins_ele_ (QUEUE *Q, QUEUE_INT e){ + QUEUE_ID i; + QUEUE_INT ee; + QUEUE_BE_LOOP_ (*Q, i, ee){ + if ( eev[i+1] = ee; + } + Q->v[i+1] = e; + Q->t++; +} + +/* Append Q2 to the tail of Q1. Q2 will not be deleted */ +void QUEUE_concat_ (QUEUE *Q1, QUEUE *Q2){ + memcpy ( &(Q1->v[Q1->t]), &(Q2->v[Q2->s]), (Q2->t-Q2->s)*sizeof(QUEUE_INT)); + Q1->t += Q2->t-Q2->s; +} +void QUEUE_concat (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID e = Q2->s; + while ( e != Q2->t){ + QUEUE_ins (Q1, Q2->v[e]); + QUEUE_INCREMENT(*Q2,e); + } +} +/* Append Q2 to the tail of Q1. Q2 will be deleted */ +void QUEUE_append_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_concat_ (Q1, Q2); + QUEUE_RMALL (*Q2); +} +void QUEUE_append (QUEUE *Q1, QUEUE *Q2){ // more improvement can be + while ( Q2->s != Q2->t ) + QUEUE_ins (Q1, QUEUE_ext(Q2)); +} + +/* Append from j to jj th elements to the tail of Q1. Q2 will not be deleted */ +void QUEUE_subconcat_ (QUEUE *Q1, QUEUE *Q2, QUEUE_ID j, QUEUE_ID jj){ + for ( ; j<=jj ; j++){ + Q1->v[Q1->t] = Q2->v[j]; + Q1->t++; + } +} +void QUEUE_subconcat (QUEUE *Q1, QUEUE *Q2, QUEUE_ID j, QUEUE_ID jj){ + while (1){ + QUEUE_ins (Q1, Q2->v[j]); + if ( j == jj ) break; + QUEUE_INCREMENT(*Q2,j); + } +} + +/* initialize Q1 by length of Q2, and copy Q2 to Q1 */ +void QUEUE_store_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_alloc (Q1, QUEUE_LENGTH(*Q2)); + QUEUE_concat_ (Q1, Q2); +} +void QUEUE_store (QUEUE *Q1, QUEUE *Q2){ + QUEUE_alloc (Q1, QUEUE_LENGTH(*Q2)); + QUEUE_concat (Q1, Q2); +} +/* copy Q2 to Q1 and delete Q2 */ +void QUEUE_restore_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_RMALL (*Q1); + QUEUE_concat_ (Q1, Q2); + QUEUE_end (Q2); +} +void QUEUE_restore (QUEUE *Q1, QUEUE *Q2){ + QUEUE_RMALL (*Q1); + QUEUE_concat (Q1, Q2); + QUEUE_end (Q2); +} + +/* copy Q2 to Q1 */ +void QUEUE_cpy_ (QUEUE *Q1, QUEUE *Q2){ + Q1->s = Q1->t = 0; + QUEUE_concat_ (Q1, Q2); +} +void QUEUE_cpy (QUEUE *Q1, QUEUE *Q2){ + QUEUE_RMALL (*Q1); + QUEUE_concat (Q1, Q2); +} + +/* compare two queues */ +int QUEUE_cmp_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_INT *x, *y=Q2->v; + MQUE_FLOOP (*Q1, x){ + if ( *x != *y ) return (0); + y++; + } + return (1); +} + +/* copy l elements of Q2 starting from s2 to the s1th position of Q1. + size of Q1 is not increasing */ +void QUEUE_subcpy_ (QUEUE *Q1, QUEUE_ID s1, QUEUE *Q2, QUEUE_ID s2, QUEUE_ID l){ + memcpy ( &(Q1->v[s1]), &(Q2->v[s2]), (l-s2)*sizeof(QUEUE_INT)); +} +void QUEUE_subcpy (QUEUE *Q1, QUEUE_ID s1, QUEUE *Q2, QUEUE_ID s2, QUEUE_ID l){ + for ( ; s2!=l ; QUEUE_INCREMENT(*Q1,s1),QUEUE_INCREMENT(*Q2,s2) ) + Q1->v[s1] = Q2->v[s2]; + Q1->v[s1] = Q2->v[s2]; +} + +/* duplicate Q2 to Q1. The memory size will be the length of Q2 */ +QUEUE QUEUE_dup_ (QUEUE *Q){ + QUEUE QQ; + QUEUE_alloc (&QQ, MAX(Q->t+1, Q->end-1)); + QUEUE_cpy_ (&QQ, Q); + return (QQ); +} + +/* merge Q1 and Q2 by insert all elements of Q2 to Q1 with deleting duplications. Both Q1 and Q2 have to be sorted in increasing order */ +void QUEUE_merge_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->t-1, j=Q2->t-1, t=i+j-Q2->s+1; + QUEUE_INT ei, ej; + if ( i+1 == Q1->s || j+1 == Q2->s ){ + QUEUE_concat_ (Q1, Q2); + return; + } + Q1->t = t+1; + ei = Q1->v[i]; + ej = Q2->v[j]; + while (1){ + if ( ei > ej ){ + Q1->v[t] = ei; + if ( i == Q1->s ){ + QUEUE_subcpy_ (Q1, Q1->s, Q2, Q2->s, j); + return; + } + i--; + ei = Q1->v[i]; + } else { + Q1->v[t] = ej; + if ( j == Q2->s ) return; + j--; + ej = Q2->v[j]; + } + t--; + } +} +void QUEUE_merge (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->t, j=Q2->t; + QUEUE_INT ei, ej; + QUEUE_ID t = (Q1->t + QUEUE_LENGTH(*Q2)-1) % Q1->end; + if ( QUEUE_LENGTH(*Q1) + QUEUE_LENGTH(*Q2) >= Q1->end ){ + print_err ("QUEUE_merge: overflow Q1->end="QUEUE_INTF", Q1length="QUEUE_INTF", Q2length="QUEUE_INTF"\n", Q1->end, QUEUE_LENGTH(*Q1), QUEUE_LENGTH(*Q2)); + exit (1); + } + if ( i == Q1->s || j == Q2->s ){ + QUEUE_concat (Q1, Q2); + return; + } + + Q1->t = t; + QUEUE_DECREMENT(*Q1,i); + QUEUE_DECREMENT(*Q2,j); + ei = Q1->v[i]; + ej = Q2->v[j]; + while (1){ + if ( ei > ej ){ + Q1->v[t] = ei; + if ( i == Q1->s ){ + QUEUE_subcpy (Q1, Q1->s, Q2, Q2->s, (j+Q2->end-Q2->s)%Q2->end); + return; + } + QUEUE_DECREMENT(*Q1,i); + ei = Q1->v[i]; + } else { + Q1->v[t] = ej; + if ( j == Q2->s ) return; + QUEUE_DECREMENT(*Q2,j); + ej = Q2->v[j]; + } + QUEUE_DECREMENT(*Q1,t); + } +} + +/* delete all elements of Q1 included in Q2. + both Q1 and Q2 have to be sorted in increasing order */ +void QUEUE_minus_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->s, i2 = Q2->s, ii=Q1->s; + while ( i != Q1->t && i2 != Q2->t){ + if (Q1->v[i] > Q2->v[i2] ) i2++; + else { + if (Q1->v[i] < Q2->v[i2] ){ + Q1->v[ii] = Q1->v[i]; + ii++; + } + i++; + } + } + while ( i != Q1->t ){ + Q1->v[ii] = Q1->v[i]; + i++; + ii++; + } + Q1->t = ii; +} +void QUEUE_minus (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->s, i2 = Q2->s, ii=Q1->s; + while ( i != Q1->t && i2 != Q2->t ){ + if ( Q1->v[i] > Q2->v[i2] ) QUEUE_INCREMENT (*Q2, i2); + else { + if ( Q1->v[i] < Q2->v[i2] ){ + Q1->v[ii] = Q1->v[i]; + QUEUE_INCREMENT (*Q1, ii); + } + QUEUE_INCREMENT (*Q1, i); + } + } + while ( i != Q1->t ){ + Q1->v[ii] = Q1->v[i]; + QUEUE_INCREMENT (*Q1, i); + QUEUE_INCREMENT (*Q1, ii); + } + Q1->t = ii; +} + +/* Delete all elements of Q1 which are not included in Q2. + both Q1 and Q2 have to be sorted in increasing order */ +QUEUE_ID QUEUE_intsec_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->s, i2 = Q2->s, c=0; + while ( i != Q1->t ){ + if ( Q1->v[i] > Q2->v[i2] ){ + if ( ++i2 == Q2->t ) break; + } else { + if ( Q1->v[i] == Q2->v[i2] ) c++; + i++; + } + } + return (c); +} +void QUEUE_and_ (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->s, i2 = Q2->s, ii=Q1->s; + while ( i != Q1->t ){ + if ( Q1->v[i] > Q2->v[i2] ){ + if ( ++i2 == Q2->t ) break; + } else { + if ( Q1->v[i] == Q2->v[i2] ) Q1->v[ii++] = Q1->v[i]; + i++; + } + } + Q1->t = ii; +} +void QUEUE_and (QUEUE *Q1, QUEUE *Q2){ + QUEUE_ID i=Q1->s, i2 = Q2->s, ii=Q1->s; + while ( i != Q1->t && i2 != Q2->t){ + if ( Q1->v[i] > Q2->v[i2] ) QUEUE_INCREMENT (*Q2, i2); + else { + if ( Q1->v[i] == Q2->v[i2] ){ + Q1->v[ii] = Q1->v[i]; + QUEUE_INCREMENT (*Q1, ii); + } + QUEUE_INCREMENT (*Q1, i); + } + } + Q1->t = ii; +} + +/* insertion sort */ +void QUEUE_sort (QUEUE *Q){ + QUEUE_ID i = Q->s, j, jj; + QUEUE_INT e; + if ( i== Q->t ) return; + QUEUE_INCREMENT(*Q,i); + for ( ; i!=Q->t ; QUEUE_INCREMENT(*Q,i) ){ + e=Q->v[i]; + j=i; + while (1){ + jj = j; + QUEUE_DECREMENT(*Q,j); + if ( Q->v[j] <= e ) { Q->v[jj] = e; break; } + Q->v[jj] = Q->v[j]; + if ( j == Q->s) { Q->v[j] = e; break; } + } + } +} + + +/* print a queue */ +void QUEUE_print (QUEUE *Q){ + QUEUE_ID i; + for ( i=Q->s ; i!=Q->t ; ){ + printf (QUEUE_INTF" ", Q->v[i]); + QUEUE_INCREMENT(*Q,i); + } + printf ("\n"); +} +/* permutation version */ +void QUEUE_perm_print (QUEUE *Q, QUEUE_ID *q){ + QUEUE_ID i; + for ( i=Q->s ; i!=Q->t ; ){ + printf (QUEUE_INTF" ", q[Q->v[i]]); + QUEUE_INCREMENT(*Q,i); + } + printf ("\n"); +} +void QUEUE_printn (QUEUE *Q){ + QUEUE_ID i; + for ( i=Q->s ; i!=Q->t ; ){ + printf (QUEUE_INTF" ", Q->v[i]); + QUEUE_INCREMENT(*Q,i); + } +} +void QUEUE_perm_printn (QUEUE *Q, QUEUE_ID *q){ + QUEUE_ID i; + for ( i=Q->s ; i!=Q->t ; ){ + printf (QUEUE_INTF" ",q[Q->v[i]]); + QUEUE_INCREMENT(*Q,i); + } +} +void QUEUE_print_ (QUEUE *Q){ + QUEUE_ID i; + printf("s="QUEUE_IDF",t="QUEUE_INTF": ", Q->s, Q->t); + for ( i=Q->s ; i!=Q->t ; ){ + printf (QUEUE_INTF" ",Q->v[i]); + QUEUE_INCREMENT(*Q,i); + } + printf ("\n"); +} + +void QUEUE_print__ (QUEUE *Q){ + QUEUE_ID i; + printf("s="QUEUE_IDF",t="QUEUE_IDF": ", Q->s, Q->t); + for ( i=Q->s ; i!=Q->t ; i++ ) printf (QUEUE_INTF" ",Q->v[i]); + printf ("\n"); +} + +#endif diff --git a/rql-backend/shd31/queue.h b/rql-backend/shd31/queue.h new file mode 100644 index 0000000..39c2797 --- /dev/null +++ b/rql-backend/shd31/queue.h @@ -0,0 +1,176 @@ +/* Library of queue: spped priority implementation + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _queue_h_ +#define _queue_h_ + +#include"stdlib2.h" + +#ifndef QUEUE_INT + #ifdef QUEUE_INT_LONG + #define QUEUE_INT LONG // define the type before if change is needed + #define QUEUE_INTHUGE LONGHUGE // comment out if QUEUE_INT is "short" + #define QUEUE_INTF LONGF + #else + #define QUEUE_INT int // define the type before if change is needed + #define QUEUE_INTHUGE INTHUGE // comment out if QUEUE_INT is "short" + #define QUEUE_INTF "%d" + #endif +#endif + +#ifndef QUEUE_ID + #ifdef QUEUE_ID_LONG + #define QUEUE_ID LONG // define the type before if change is needed + #define QUEUE_IDHUGE LONGHUGE // comment out if QUEUE_INT is "short" + #define QUEUE_IDF LONGF + #else + #define QUEUE_ID int // define the type before if change is needed + #define QUEUE_IDHUGE INTHUGE // comment out if QUEUE_INT is "short" + #define QUEUE_IDF "%d" + #endif +#endif +#define SWAP_QUEUE_INT(a,b) (common_QUEUE_INT=a,a=b,b=common_QUEUE_INT) +#define SWAP_QUEUE_ID(a,b) (common_QUEUE_ID=a,a=b,b=common_QUEUE_ID) + +typedef struct { + unsigned char type; // type of the structure + QUEUE_INT *v; // pointer to the array + QUEUE_ID end; // the length of the array + QUEUE_ID t; // end position+1 + QUEUE_ID s; // start position +} QUEUE; + +/* QUEUE stores at most end-1 elements. Overflow occurs after inserting end-1 elements */ + +#define QUEUE_INCREMENT(Q,i) ((i)=((i)>=(Q).end-1)?0:(i)+1) +#define QUEUE_DECREMENT(Q,i) ((i)=(i)==0?(Q).end-1:(i)-1) +#define QUEUE_LENGTH(Q) (((Q).t-(Q).s+(Q).end)%(Q).end) +#define QUEUE_LENGTH_(Q) ((Q).t-(Q).s) + +/* macro for loop w.r.t., QUEUE */ +#define QUEUE_F_LOOP(Q,i) for((i)=(Q).s;(i)!=(Q).t;((i)=((i)>=(Q).end-1)?0:(i)+1)) +#define QUEUE_F_LOOP_(Q,i) for((i)=(Q).s;(i)<(Q).t;(i)++) +#define QUEUE_FE_LOOP(Q,i,x) for((i)=(Q).s,x=(Q).v[i];(i)!=(Q).t;((i)=((i)>=(Q).end-1)?0:(i)+1),x=(Q).v[i]) +#define QUEUE_FE_LOOP_(Q,i,x) for((i)=(Q).s,x=(Q).v[i];(i)<(Q).t;(i)++,x=(Q).v[i]) +#define QUEUE_B_LOOP(Q,i) for((i)=(Q).t==0?(Q).end-1:(Q).t-1;(i)!=(Q).s;(i)=(i)==0?(Q).end-1:(i)-1) +#define QUEUE_B_LOOP_(Q,i) for((i)=(Q).t-1;(i)>=(Q).s;(i)--) +#define QUEUE_BE_LOOP(Q,i,x) for((i)=(Q).t==0?(Q).end-1:(Q).t-1,x=(Q).v[i];(i)!=(Q).s;(i)=(i)==0?(Q).end-1:(i)-1,x=(Q).v[i]) +#define QUEUE_BE_LOOP_(Q,i,x) for((i)=(Q).t-1;((i)>=(Q).s)?((x=(Q).v[i])||1):0;(i)--) + +#define QUEUE_RMALL(Q) ((Q).t=(Q).s) +#define QUEUE_RMALL_(Q) ((Q).t=0) +#define QUEUE_HEAD(Q) ((Q).v[(Q).s]) +#define QUEUE_TAIL_(Q) ((Q).v[(Q).t-1]) + +extern QUEUE INIT_QUEUE; +extern QUEUE_INT common_QUEUE_INT, *common_QUEUE_INTp; +QSORT_TYPE_HEADER(QUEUE_INT, QUEUE_INT) +QSORT_TYPE_HEADER(QUEUE_ID, QUEUE_ID) + + +/* initialization, not fill the memory by 0 */ +void QUEUE_alloc (QUEUE *Q, QUEUE_ID siz); + +/* termination processing */ +void QUEUE_end (QUEUE *Q); + +/* delivery: transpose that matrinx (transaction database) Q. Each row of the + transposed matrix is called occurrence. + +variables to be set. +OQ:array for occurrences, c: for counting frequency, jump: list of items with non-empty OQ +if c!=NULL, count the frequency and set to c, and set occurrences to OQ, otherwise. +if jump==NULL, then the list of non-empty item will not be generated +Q:matrix, of an array of QUEUE, occ: list of rows of Q to be scaned, t; maximum ID of the + row to be scaned; if occ==NULL, occ will be ignored, otherwise t will be ignored. + M: end mark of each QUEUE. */ +void QUEUE_delivery(QUEUE *OQ, VEC_ID *c, QUEUE *jump, QUEUE *Q, QUEUE *occ, VEC_ID t, QUEUE_INT M); +/* sort a QUEUE with WEIGHT, with already allocated memory (size have to no less than the size of QUEUE) */ +void QUEUE_perm_WEIGHT (QUEUE *Q, WEIGHT *w, PERM *invperm, int flag); + +/* remove (or unify) the consecutive same ID's in a QUEUE (duplication delete, if sorted) */ +void QUEUE_rm_dup_WEIGHT (QUEUE *Q, WEIGHT *w); + +/***********************************************************************/ +/* duplicate occ's in jump, ( copy occ's to allocated QUEUE array) */ +/* Q[i].end := original item, clear each original occ */ +/* buffer size is multiplied by u */ +/*******************************************************/ + + +void QUEUE_occ_dup (QUEUE *jump, QUEUE **QQ, QUEUE *Q, WEIGHT **ww, WEIGHT *w, WEIGHT **ppw, WEIGHT *pw, int u); + +/* return the position of the first element having value e. return -1 if no such element exists */ +LONG QUEUE_ele (QUEUE *Q, QUEUE_INT e); + +/* insert an element to the tail/head */ +void QUEUE_ins_ (QUEUE *Q, QUEUE_INT e); +void QUEUE_ins (QUEUE *Q, QUEUE_INT e); +void QUEUE_ins_head_ (QUEUE *Q, QUEUE_INT e); +void QUEUE_ins_head (QUEUE *Q, QUEUE_INT e); + +/* extract an element from the head/tail, without checking the underflow */ +QUEUE_INT QUEUE_ext_ (QUEUE *Q); +QUEUE_INT QUEUE_ext (QUEUE *Q); +QUEUE_INT QUEUE_ext_tail_ (QUEUE *Q); +QUEUE_INT QUEUE_ext_tail (QUEUE *Q); + +/* remove the j-th element and replace it by the tail/head or shift */ +void QUEUE_rm_ (QUEUE *Q, QUEUE_ID j); +void QUEUE_rm (QUEUE *Q, QUEUE_ID j); +void QUEUE_rm_head_ (QUEUE *Q, QUEUE_ID j); +void QUEUE_rm_head (QUEUE *Q, QUEUE_ID j); +int QUEUE_rm_ele_ (QUEUE *Q, QUEUE_INT e); + +/* Append Q2 to the tail of Q1. Q2 will (not) be deleted */ +void QUEUE_append_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_append (QUEUE *Q1, QUEUE *Q2); +void QUEUE_concat_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_concat (QUEUE *Q1, QUEUE *Q2); + +/* Append from j to jj th elements to the tail of Q1. Q2 will not be deleted */ +void QUEUE_subconcat_ (QUEUE *Q1, QUEUE *Q2, QUEUE_ID j, QUEUE_ID jj); +void QUEUE_subconcat (QUEUE *Q1, QUEUE *Q2, QUEUE_ID j, QUEUE_ID jj); + +/* initialize Q1 by length of Q2, and copy Q2 to Q1 */ +void QUEUE_store_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_store (QUEUE *Q1, QUEUE *Q2); +/* copy Q2 to Q1 and delete Q2 */ +void QUEUE_restore_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_restore (QUEUE *Q1, QUEUE *Q2); + +/* copy Q2 to Q1 */ +void QUEUE_cpy_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_cpy (QUEUE *Q1, QUEUE *Q2); +QUEUE QUEUE_dup_ (QUEUE *Q); +/* copy l elements of Q2 starting from s2 to the s1th position of Q1. + size of Q1 is not increasing */ +void QUEUE_subcpy_ (QUEUE *Q1, QUEUE_ID s1, QUEUE *Q2, QUEUE_ID s2, QUEUE_ID l); +void QUEUE_subcpy (QUEUE *Q1, QUEUE_ID s1, QUEUE *Q2, QUEUE_ID s2, QUEUE_ID l); + +/* merge/minum/intersection of Q1 and Q2, and set Q1 to it. + Both Q1 and Q2 have to be sorted in increasing order */ +void QUEUE_merge_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_merge (QUEUE *Q1, QUEUE *Q2); +void QUEUE_minus_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_minus (QUEUE *Q1, QUEUE *Q2); +void QUEUE_and_ (QUEUE *Q1, QUEUE *Q2); +void QUEUE_and (QUEUE *Q1, QUEUE *Q2); + +/* insertion sort */ +void QUEUE_sort (QUEUE *Q); + + /* print */ +void QUEUE_print (QUEUE *Q); +void QUEUE_print_ (QUEUE *Q); + + +#endif diff --git a/rql-backend/shd31/readme.txt b/rql-backend/shd31/readme.txt new file mode 100644 index 0000000..91afdb2 --- /dev/null +++ b/rql-backend/shd31/readme.txt @@ -0,0 +1,603 @@ +###################################################################### +SHD: Sparse Hypergraph Dualization Aug/8/2007 + Coded by Takeaki Uno, e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html +###################################################################### + +** This program is available for only academic use, basically. ** +** Anyone can modify this program, but he/she has to write down ** +** the change of the modification on the top of the source code. ** +** Neither contact nor appointment to Takeaki Uno is needed. ** +** If one wants to re-distribute this code, do not forget to ** +** refer the newest code, and show the link to homepage ** +** of Takeaki Uno, to notify the news about SHD for the users. ** +** For the commercial use, please make a contact to Takeaki Uno. ** + +################################ +#### Problem Definition #### +################################ + +(The readers who are not familiar to the notion of hypergraph, see the +equivalent problems written below.) + +Let H=(V,F) be a hypergraph with vertex set V and hyperedge set F. +A hyperedge is a subset of vertex set V, thus F is a subset family +defined on V. F may include several identical hyperedges. A subset H +of V is called a hitting set of F if the intersection of H and any is +non-empty. A hitting set is called minimal if it is not included in +any other hitting set. The dual H'=(V,F') of H is the hypergraph such +that F' is the correction of minimal hitting sets of F. For example, +when V={1,2,3,4}, F={ {1,2}, {1,3}, {2,3,4} }, {1,3,4} is a hitting set +but not minimal, and {2,3} is a minimal hitting set. The dual of H=(V,F) +is given by F'={ {1,2}, {1,3}, {1,4}, {2,3} }. The problem dualization +is to compute the dual of the given hypergraph H=(V,F). + +Dualization is equivalent to the following problems: + +== (1) minimal hitting set enumeration == +Let V be a set of items. A transaction is a subset of V. A transaction +database is a collection of transactions which may include several +identical transactions. A transaction database is a subset family +defined on V. The problem is to output all minimal hitting sets of +given transaction database (or equivalently subset family). + +== (2) minimal set covering enumeration == +For a subset family Y defined on a set X, a set cover S is a subset of +Y such that the union of the member of S is equal to Y (Y=\cup_{A\in S}). +A set covering is called minimal if it is included in no other set +covering. Let us regard Y as a vertex set, and consider a hyperedge +B(x) for each element x of X such that B(x) is the collection of +subsets in X which include x. Then, for the hyperedge set (set family) +F={B(x) | x\in X}, a hitting set of F is a set cover of Y, and vice versa. +Thus, enumerating minimal set coverings is equivalent to the dualization. + +== (3) minimal uncovered set enumeration == +For a subset family Y defined on a set X, let an uncovered set +be a subset of X which is not included in any member of Y. A minimal +uncovered set is one which is included in no other uncovered set. +The problem is to enumerate minimal uncovered sets of Y. +Let !Y be the complement of Y, which is the collection of the complement +of subsets in Y, that is, !Y = {!y | y\in Y}, where !y = X-y is the +complement of y. For a subset y and S, S is not included in y if and +only if S and !y have non-empty intersection. Thus, an uncovered set +of Y is a hitting set of !Y, and vice versa, thus the minimal uncovered +set enumeration is equivalent to the minimal hitting set enumeration. + +== (4) circuit enumeration for independent system == +A subset family F is called an independent system if for any member X +of F, any its subset is also a member of F. A member of F is called an +independent set. An independent set is called a maximal independent set +if it is included in no other independent set. A set is called dependent +if it is not in F. A circuit is a minimal dependent set, i.e., a dependent +set which properly contains no other dependent set. If an independent +system is given by the set of maximal independent sets of F, then +the enumeration of circuits of F is equivalent to the enumeration of +uncovered set of F. The problem of enumerating maximal independent +sets from the set of circuits is also equivalent to dualization, +because for !F, the circuit set of !F is the set of maximal independent +sets of F, and the set of maximal independent sets of !F is the circuit +set of F. + +== (5) Computing negative border from positive border == +A function is called Boolean function if it maps members of sets 2^V +to 0 or 1. A Boolean function B is called monotone (resp., anti-monotone) +if it satisfies that for any set X with B(X)=0 (resp., B(X)=1), +any subset X' of X satisfies B(X)=0 (resp., B(X)=1). +For a monotone function B, a subset X is called positive border +if B(X)=0 and no Y, B(Y)=0 properly includes X, and is called negative +border if B(X)=1 and no Y, B(Y)=1 is properly included in X. For given +the set of positive borders, the problem of enumerating negative borders +is equivalent to dualization, because the problem is equivalent to +uncovered set enumeration (3) and circuit enumeration (4). +The enumeration of positive borders from the negative borders can be +done by enumerating uncovered sets for the collection of the complement +of negative borders. + +== (6) DNF<->CNS transformation == +A DNF is a formula all whose clauses are composed of literals +connected by "or", and all clauses are connected by "and". A CNF is a +formula all whose clauses are composed of literals connected by "and", +and all clauses are connected by "or". Any formula can be represented +in both DNF formula and CNF formula. Let D be a DNF formula composed +of variables x1,...,xn and clauses C1,...,Cm. A DNF/CNF is called +monotone if no clause contains literal with ``not''. Then, S is a +hitting set to the clauses of D if and only if the assignment obtained +by setting literals in S to true gives a true assignment of D. Let H +be a minimal CNF formula equivalent to D. H has to include any minimal +hitting set as its clause, since any clause has to contain at least +one literal of each clause of D. Thus, computing minimal CNF +equivalent H has to include all minimal hitting sets of D. In the +same reason, computing the minimal DNF from a CNF is equivalent to +the dualization. + + +################################## +#### Mathematical Aspects #### +################################## + +- Finding the minimum cardinality hitting set is known to be NP-hard, + it is the same for finding the minimum cardinality set covering. +- Finding one minimal hitting set is done in O(||F||) time. +- There is no known output polynomial time algorithm for dualization. + Its existence is a famous open problem. + + +##################### +#### Usage #### +##################### + + ==== How to Compile ==== +Unzip the file into arbitrary directory, and execute "make". +Then you can see "shd" (or shd.exe) in the same directory. + + ==== Command Line Options ==== +To execute SHD, just type shd and give some parameters as follows. + +% shd 09Dcq input-filename [output-filename] + +"%" is not needed to type. It is a symbol to represent command line. +To see a simple explanation, just execute "shd" without parameters. + +"input-filename" is the filename of the input transaction database. +The 1st letter of input-filename must not be '-'. Otherwise it is +regarded as an option. The input file format is written below. +"output-filename" is the name of file to write the hyperedge (minimal +hitting set) the program finds. You can omit the output file to +see only the number of minimal hitting sets classified by the +cardinality. If the output file name is "-", the solutions will be +output to the standard output. + +The first parameter is given to the program to indicate the task and +the method. + + _: no output to standard output (including messages w.r.t. input data) + (solve uncovered set enumeration problem) + %: show progress of the computation + +: if the output file exists, append the solutions to the output file + 0: normal version (reverse search approach) + 9: straightforward version + D: depth-first search version + P: do not execute the pruning algorithm + c: take the complement of the input file + t: transpose the database so that item i will be transaction i, thus + if item i is included in j-th transaction, then item j will be + included in i-th transaction. + +0 and 9 can not be given simultaneously, but any other combination +is accepted. D command switches to the algorithm to a branch-and-bound +type depth first search algorithm, and P and R inactivate puring +algorithm and data reduction algorithm, respectively. These commands +are basically for evaluating the performance of the algorithm, thus +usually just giving 0 or D is sufficient. + + -# [num]:stop after outputting [num] solutions + -, [char]: give the separator of the numbers in the output + the numbers in the output file are separated by the given + character [char]. + -Q [filename]: replace the output numbers + according to the permutation table written in the file of + [filename], replace the numbers in the output. The numbers in the + file can be separated by any non-numeric character such as newline + character. + -l [num]:output trees/graphs with at least [num] vertices + -u [num]:output trees/graphs with at most [num] vertices + +Examples) + +- dualize "tt.dat" by normal version, and output to "out" + +% shd 0 tt.dat out + +- dualize "ttt.dat" by straightforward depth-first search version, and +make no output file + +% shd 9D ttt.dat + +- enumerate minimal uncovered sets of "tt.dat" and output to "min.out" + by depth-first search version + +% shd Dc tt.dat min.out + + +############################### +#### Input File Format #### +############################### + +The vertex set must be numbers ranging from 0 to n. They do not have to be +consecutive numbers from 0 to n, but the program considers that the vertex +set is {0,...,n}, thus uses memory linear in n. Thus they should be +consecutive, for the efficiency. In the case of uncovered set enumeration, +all numbers from 0 to n can be a part of uncovered sets. + +Each line (row) of the input file is corresponding to a hyperedge (subset, +or transaction). The vertices (items, or elements) included in a hyperedge +is listed in a line. The separator of numbers can be any non-numeric letter, +such as "," " " ":" "a", etc. + +Example) ( "[EOF]" is the end of file ) +0 1 2 +1 +2 3 4 +4,1 2 3 +2,1 +[EOF] + +################################################################# +#### Use General Names for Variables and Other Formats #### +################################################################# + +We can transform variable names in general strings to numbers so that we +can input the data to the program, by some script files. + +-- transnum.pl table-file [separator] < input-file > output-file +Read file from standard input, and give a unique number to each name written +by general strings (such as ABC, ttt), and transform every string name to +a number, and output it to standard output. The mapping from string names to +numbers is output to table-file. The default character for the separator of +the string names is " "(space). It can be changed by giving a character for +the option [separator]. For example, A,B is a string name, if the separator +is space, but if we set the separator to ",", it is regarded as two names +A and B. This is executed by "transnum.pl table-file "," < input-file...". + +-- untransnum.pl table-file < input-file > output-file +According to the table-file output by transnum.pl, un-transform numbers to +string names. The output of the program is composed of numbers, thus +it is used if we want to transform to the original string names. +It reads file from standard output, and output to the standard output. + +-- appendnum.pl +When we want to distinct the same words in different columns, use this +script. This append column number to each words, so we can distinct them. +Then, by using transnum.pl, we transform the strings to numbers. + +-- transpose.pl +Transpose the file. In the other words, consider the file as an adjacency +matrix of a bipartite graph, and output the transposed matrix, or exchange +the positions of vertices and hyperedges. For an input file, output the +file in which the i-th line corresponds to item i, and includes the +numbers j such that i is included in the j-th line of the input file. + +######################################### +#### Batch Files for Simple use #### +######################################### + +For general string names, we have several batch files scripts for basic usages +"exec_shd", "exec_shd_", "sep_shd", or "sep_shd_". For example, when a hypergraph +with "general item names" is, + +dog pig cat +cat mouse +cat mouse dog pig +cow horse +horse mouse dog +[EOF] + +All these replace strings in the input database by numbers, execute SHD, +and replace the numbers in the output file by the original strings. +The usage of the scripts are + +% exec_shd [FCMfIq] input-filename support output-filename [options] + +You have to specify F, C or M, and output filename. The separator of the +items is " " (blank, space). If you want to use other character as a +separator, use "sep_shd". The usage is + +% sep_shd separator [FCMfIq] input-filename support output-filename [options] + +Almost same as "exec_shd" but you have to specify separator at the fourth +parameter. "exec_lcm_" and "sep_lcm_" are both for the aim to distinct +the same items in the different columns. For example, it is used to the +database such that different items are there in different columns, but +some special symbols, such as "- is for missing data", are used commonly. +An example is; + +A true small +C true - +A false middle +B - - +C - middle +A true - +[EOF] + +In the output file, the items are followed by "." and numbers where +the numbers are the column number. For example, "dog.0" means the item +"dog" on the 0th(first) column. + +The usage of them are the same as "exec_shd" and "sep_shd", respectively. +The scripts use files of the names "__tmp1__", "__tmp2__", and "__tmp3__", +The file of these names will be deleted after the execution. + +Example) + +% exec_shd 0 test2.dat out.dat + +% sep_shd_ "," Dc test3.dat out.dat + + +############################# +#### Output Format #### +############################# + +When the program is executed, the program prints out the #items, +#transactions, and other features of the input database to standard +error. After the termination of the enumeration, it outputs the total +number of itemsets found (frequent/closed/maximal itemsets), and the +numbers of itemsets of each size. For example, if there are 4 frequent +itemsets of size 1, 2 frequent itemsets of size 3, and 1 frequent itemset +of size 3, then the output to standard output will be, + +9 <= total #hyperedges +0 <= #hyperedges of size 0 +4 <= #hyperedges of size 1 +3 <= #hyperedges of size 2 +1 <= #hyperedges of size 3 + +If "q" is given in the first parameter, these do not appear in the +standard output. + +If output-filename was given, then the hyperedges found are written to +the output file. Each line of the output file is the list of vertices +included in a hyperedge, separated by " ". For example, + +1 5 10 2 4 + +which means hyperedge {1,2,4,5,10} is in the dual. +In the output file, the vertices in each row are not sorted. If you want +to sort it, use the script "sortout.pl". The usage is just, + +% sortout.pl < input-file > output-file + +"input-file" is the name of file to which SHD outputs, and the sorted +output will be written in the file of the name "output-file". +The vertices of each hyperedge will be sorted in the increasing order of +the vertex ID's, and all the hyperedges (lines) will be also sorted, by the +lexicographical order (considered as a string). +(Actually, you can specify separator like sortout.pl ","). + + + +########################### +#### Performance #### +########################### + +The performance of SHD is stable, for both computation time and memory use. +The initialization and preprocess time of SHD is linear in the size of +input hypergraph. The computation time is intuitively linear in the product +of (output hyperedges) and (number of input hyperedges). + +Memory usage of SHD is very stable. It is an advantage compared to other +implementations. The memory usage of SHD is almost linear in the size of +the input database. Approximately SHD uses integers at most three times +as much as the database size, which is the sum of the sizes of each hyperedge. +The memory usage of the other implementations increases as the increase +of the number of hyperedges, but that of SHD does not. + + +\###################################################### +#### Introductions to Hypergraph Dualization #### +####################################################### + +under construction. + + + +################################################### +#### Algorithms and Implementation Issue #### +################################################### + +The algorithm consists two search methods and one fast minimality +checking algorithm. First we explain fast minimality check. + + + === minimality check === + +When we have a set S, it is easy to confirm that S is a hitting set of F +or not. First, put a mark to all vertices included in S, and for each +hyperedge, look at the marks of all vertices included in it. In this way, +the computation time is O(||F||) where ||F|| is the sum of the sizes +of the hyperedges in F. +If there is a hyperedge such that no vertex of it has a mark, then +S is not a hitting set. Confirming that S is a minimal hitting set or +not is the next task. A straightforward method for the task is to check +whether S-v is a hitting set or not for all vertices v in S. In this way +we need O(||F|| \times |S|) time. Instead of that, we use a +characterization for the minimality. For a vertex v in S, if a hyperedge H +includes only v among vertices of S, i.e., S\cap H = {v}, we call H +"critical hyperedge" of v. If v has no critical hyperedge, S-v is also +a hitting set, thus the existence of critical hyperedge assures that +v can not remove from the set. Thus, S is a minimal hitting set if and +only if every vertex in S has a critical hyperedge. + +Let us see an example. Suppose that hypergraph H=(V,F) is +V={1,2,3,4}, F={ {1,2}, {1,3}, {2,3,4} }, and S = {1,3,4} is a hitting set. +{1,2} is a critical hyperedge of 1, {1,3} is a critical hyperedge of 3, +but 4 has no critical hyperedge. It means that {1,3,4} - 4 has intersection +to all hyperedges. Actually, {1,3} is a hitting set. For {1,3}, again, +1 has a critical hyperedge {1,2}, and 3 has a critical hyperedge {1,3}, +then the removal of any vertex from {1,3} yields non-hitting set, thus +{1,3} is a minimal hitting set. + +We denote the set of critical hyperedges of vertex v by crit(v,S). +A hyperedge can be a critical hyperedge for at most one vertex, thus +the sum ||crit()|| of the sizes of crit() for all vertices does not +exceed |F|. For a hyperedge H, computing the vertex v such that H is a +critical hyperedge of v, or confirm that H is critical hyperedge of no +vertex, can be done in O(|H|) time by computing S\cap H (by looking at +marks on each vertex of H). Thus, computing all critical hyperedges +for all vertices can be done in O(||F||) time. + +For each vertex v, let Occ(v) be the set of hyperedges including v. +For a vertex set S, let uncov(S) be the set of hyperedges having empty +intersection to S. S is a hitting set if and only if uncov(S) is an +empty set. Suppose that S is not a hitting set, and each vertex in S +has at least one critical hyperedge, i.e., for any u in S, crit(u) != +emptyset, and consider an addition of vertex v to S. Then, we can see +(a) uncov(S+v) = uncov(S) - Occ(v) +(b) crit(v,S+v) = uncov(S) \cap Occ(v) +(c) for u in S, crit(u,S+v) = crit(u,S) - Occ(v) +Then, by marking all hyperedges in Occ(v), we can compute all crit() +in O(|Occ(v)| + ||crit()|| ). + +Let us see an example. Suppose that hypergraph H=(V,F) is +V={1,2,3,4,5}, F = { {1,3}, {1,4}, {1,2,3}, {2,3}, {2,4,5}, {3,4}, {4,5} }, +and S={1,2}, v=3. Then, uncov(S) = { {3,4}, {4,5} }, crit(1,S) = +{ {1,3}, {1,4} }, crit(2,S) = { {2,3}, {2,4,5} }, and Occ(v) = +{ {1,3}, {1,2,3}, {2,3}, {3,4} }. Then, for S+3, + +(a) uncov(S+3) = {{3,4}, {4,5}} - {{1,3}, {1,2,3}, {2,3}, {3,4}} = {{4,5}} +(b) crit(3,S+3) = {{3,4}, {4,5}} \cap {{1,3}, {1,2,3}, {2,3}, {3,4}} = {{3,4}} +(c) crit(1,S+3) = {{1,3}, {1,4}} - {{1,3}, {1,2,3}, {2,3}, {3,4}} = {{1,4}} +(c) crit(2,S+3) = {{2,3}, {2,4,5}} - {{1,3}, {1,2,3}, {2,3}, {3,4}} = {{2,4,5}} + + + === simple depth-first search method === +Using the above minimality check, we develop an depth-first search +type algorithm. The strategy is very simple. We start by setting S to +an empty set, and adding a vertex to S one by one, with keeping the +condition that any vertex in S has at least one critical hyperedge. +When S is a hitting set, S is a minimal hitting set, thus we output it. +To avoid the duplication, in each iteration, we add only vertices +larger than the maximum index vertex in S, denoted by tail(S). +The algorithm is written as follows. + +Algorithm SHDdfs_straight (S, crit(), uncov(S)) +1. if uncov(S) is empty, then output S and return; +2. for each vertex v>tail(S), + 2-1. compute uncov(S+v) and crit() for S+v, + 2-2. if crit(u,S+v) is non-empty for any vertex u in S + then call SHDdfs_straight (S+v, crit(), uncov(S+v)) + +We can examine this algorithm by giving options 9D for SHD, i.e., + execute "shd 9D input-file output-file". +To improve the efficiency, we use several techniques for maintaining crit, +explained as follows, and a pruning technique. Their combination gives +our first algorithm. + +The correctness of the algorithm is as follows. For hypergraph H=(V,F), +let Z(H) be the set of vertex sets S such that any vertex in S has at +least one critical hyperedge. Observe that by removing a vertex from S, +no vertex loses its critical hyperedge, i.e., crit(u,S) is included in +crit(u, S-v) for any vertex v. This comes from above property (c). +Thus, any X in Z(H), any subset of X is also in Z(H), thereby monotone. +For example, for hypergraph H(V,E), V={1,2,3,4}, F={ {1,2}, {1,3}, {2,3,4} }, + Z(H) = { {1}, {2} , {3}, {4}, {1,2}, {1,3}, {1,4}, {2,3} } +A minimal hitting set is a maximal element (positive border) in Z(H). +Thus, by the algorithm, any X in Z(H) is generated by X-tail(X), thus +it enumerates all the elements in Z(H). + + === finding violating vertices === +For vertex set S in Z(H), we call a vertex v addible if S+v is in Z(H). +The algorithm adds vertices and update crit, +to check whether the addition is in Z(H) or not. Here we show an efficient +way for the check. For a vertex u in S and v not in S, crit(u, S+v) is +an empty set if and only if any critical hyperedge of u includes v, i.e., +crit(u,S)\subseteq Occ(v), equivalently crit(u,S)\cap Occ(v) = crit(u,S). +For given u, computing crit(u,S)\cap Occ(v) for all v can be done +in O(||cirt(u,S)||) time by occurrence deliver. Thus, by performing +occurrence deliver for critical hyperedges of all vertices in S, +we can obtain the vertices v satisfying that S+v is in Z(H). +This can be done O(||cirt()||) time, which is faster than +computing crit() for each vertex v not in S. + + + === pruning technique === +Suppose that we have a set S each whose vertex has at least one critical +hyperedge, and E={v1,...,vk} be a hyperedge in uncov(S). Then, we know +that any minimal hitting set includes at least one vertex in E. Thus, +we can divide the minimal hitting sets into several groups G1,...,Gk +where Gi is the group of minimal hitting sets including vi but not +including v1,...,v{i-1}. For enumerating minimal hitting sets in Gi, +we put marks on vertices v1,...,v{i-1} not to choose them. Then, the +algorithm is written as follows. The marks of vertices are cleared at +the initialization. + +Algorithm SHDdfs (S, crit(), uncov(S)) +1. if uncov(S) is empty, then output S and return +2. compute all unmarked addible vertices to S +3. choose a hyperedge E from uncov(S) which includes the least + unmarked addible vertices +4. for each unmarked addible vertex v in E, put a mark +5. compute crit\cap Occ(v) ,uncov(S)\cap Occ(v) for all addible + unmarked vertices by occurrence deliver +6. for each unmarked addible vertex v in E, + 6-1 call SHDdfs_straight (S+v, crit(), uncov(S+v)) + 6-2 clear bucket of v, and erase mark on v + +We can execute this algorithm by giving option as +"shd D input-file output-file". + + + === reverse search method === +The next search strategy is based on a technique so called reverse search. +Suppose that hyperedges of H is {E1,...,Em}, and we denote the hypergraph +having hyperedges E1,...,Ei by Hi. Let mincrit(v,S) be the minimum index +hyperedge in crit(v,S). For a vertex subset S in Z(H), +we define the core hyperedge core_h(S) by the hyperedge Ei such that +For hyperedges E1,...,Ei, S is not in Z(H{i-1}) but is in Z(Hi). +Ei is maximum one among the minimum critical hyperedges of all vertices, +i.e., Ei = max_{u\in S} mincrit (u,S), thus core_h(S) is +defined uniquely. Thereby, the core hyperedge is always a critical +hyperedge of a vertex. We say the vertex core vertex and denote it by +core_v(S). We define the parent P(S) of S by S - core_v(S). + +For example, for hypergraph H(V,E), V={1,2,3,4}, F={ {1,2}, {1,3}, {2,3,4} }, + Z(H) = { emptyset, {1}, {2} , {3}, {4}, {1,2}, {1,3}, {1,4}, {2,3} }, +the parent of {1}, {2}, {3}, {4} is the emptyset, and the parent of {1,2}, +{1,3}, {1,4} is {1}, and the parent of {2,3} is {2}. +The core hyperedge of {2,3} is {1,3}, and the core vertex is 3. + +This parent child relation is acyclic, and except for the empty set, +any vertex set in Z(H) has its parent, thus it forms a tree. +Here we consider a search method which moves from parent to children +recursively in a depth-first search manner. Suppose that S+v is a child +of S. Then, the core hyperedge of S+v is the minimum index hyperedge E in +uncov(S). Thus, v has to be included in E. Conversely, for S in Z(H), +let E be the minimum index hyperedge in uncov(S). Then, any child of S +is obtained by adding a vertex v in E to S. Suppose that v is a vertex +in E. If S+v is in Z(H), then mincrit(v,S) = Ei. When hyperedge set +F = { {1,2}, {1,3}, {2,3,4} } and S={2}, the minimum hyperedge in +uncov(S) is {1,3}. Both S+1 and S+3 are in Z(H). The core hyperedge of +{2,3} is {1,3} and the core vertex is 3, thus {2} is the parent of {2,3}. +However, the core hyperedge of {1,2} is {2,3,4}, it differs from {1,3}. +The core vertex of {1,2} is 2, thus the parent of {1,2} is {1}. +Therefore, S+v is a child of S if and only if mincrit(u,S+v) has no larger +index than mincrit(u,S+v). This holds when no vertex u in S loses all +its critical hyperedges by adding v, i.e., for each vertex u in S, +at least one critical hyperedge whose index is less than mincrit(v,S+v) +(minimum hyperedge in uncov(S)) does not include v. This can be checked +by occurrence deliver in the same way. The following algorithm traverses +the tree induced by this parent child relation. + +Algorithm SHD (S, crit(), uncov(S)) +1. if uncov(S) is empty, then output S and return; +2. Ei := minimum index hyperedge in uncov(S) +3. for each vertex v in Ei, + 3-1. compute uncov(S+v) and crit() for S+v, + 3-2. if crit(u,S+v) is non-empty for any vertex u in S + and mincrit(u,S+v) is less than Ei, + then call SHD (S+v, crit(), uncov(S+v)) + +We can examine this algorithm by giving options 9 for SHD, i.e., + execute "shd 9 input-file output-file". +To improve the efficiency, we use the same technique above. +We can examine the improved algorithm by giving options 0 for SHD, i.e., + execute "shd 0 input-file output-file". + + +############################### +#### Acknowledgments #### +############################### + +We thank to Ken Satoh of National Institute of Informatics Japan, Hiroki +Arimura of Hokkaido University for their contribution for the research, +A part of the research of SHD is supported by Grant-in-aid from the +Ministry of Education, Science, Sport and Culture of Japan +(Monbu-Kagaku-Sho). We also thank Dr. Renato Vimieiro for a bug report. + + + +########################## +#### References #### +########################## + + diff --git a/rql-backend/shd31/sep_shd b/rql-backend/shd31/sep_shd new file mode 100644 index 0000000..3be5bc2 --- /dev/null +++ b/rql-backend/shd31/sep_shd @@ -0,0 +1,5 @@ +./transnum.pl __tmp1__ $1 < $3 > __tmp2__ +./shd $2 $5 $6 $7 $8 $9 __tmp2__ __tmp3__ +touch __tmp3__ +./untransnum.pl __tmp1__ < __tmp3__ > $4 +rm -f __tmp1__ __tmp2__ __tmp3__ diff --git a/rql-backend/shd31/sep_shd_ b/rql-backend/shd31/sep_shd_ new file mode 100644 index 0000000..2467ad6 --- /dev/null +++ b/rql-backend/shd31/sep_shd_ @@ -0,0 +1,7 @@ +./appendnum.pl $1 < $3 > __tmp4__ +./transnum.pl __tmp1__ $1 < __tmp4__ > __tmp2__ +rm -f __tmp4__ +./shd $2 $5 $6 $7 $8 $9 __tmp2__ __tmp3__ +touch __tmp3__ +./untransnum.pl __tmp1__ < __tmp3__ > $4 +rm -f __tmp1__ __tmp2__ __tmp3__ diff --git a/rql-backend/shd31/shd.c b/rql-backend/shd31/shd.c new file mode 100644 index 0000000..ba9ae49 --- /dev/null +++ b/rql-backend/shd31/shd.c @@ -0,0 +1,788 @@ +/* Scalable Hypergraph Dualization algorithm */ +/* 2004/4/10 Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, do not forget to + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about SHD for the users. + For the commercial use, please make a contact to Takeaki Uno. */ + + + +#ifndef _shd_c_ +#define _shd_c_ + +#include"alist.c" +#include"barray.c" +#include"vec.c" +#include"barray.c" +#include"problem.c" + +#define SHD_STRAIGHT 1 +#define SHD_DFS 2 +#define SHD_COMPLEMENT 4 +#define SHD_NO_BITMAP 16 +#define SHD_PRUNE 32 + +void SHD_error (){ + ERROR_MES = "command explanation"; + print_err ("SHD: 09DSqc [options] input-filename [output-filename]\n\ +%%:show progress, _:no message, +:write solutions in append mode\n\ +c:complement input, P:no pruning, B:no bitmap\n\ +0:normal version, D:dfs version, 9:naive-minimality-check version\n\ +t:transpose the database so that i-th transaction will be item i\n\ +[options]\n\ +-l [num]:output itemsets with size at least [num]\n\ +-u [num]:output itemsets with size at most [num]\n\ +-S [num]:stop after outputting [num] solutions\n\ +-, [char]:give the separator of the numbers in the output\n\ +-Q [filename]:replace the output numbers according to the permutation table given by [filename]\n\ +# the 1st letter of input-filename cannot be '-'.n\ +# if the output file name is -, the solutions will be output to standard output.\n"); + EXIT; +} + + +/***********************************************************************/ +/* read parameters given by command line */ +/***********************************************************************/ +void SHD_read_param (int argc, char *argv[], PROBLEM *PP){ + ITEMSET *II = &PP->II; + int c=1; + if ( argc < c+2 ){ SHD_error (); return; } + PP->problem |= SHD_PRUNE; + if ( !strchr (argv[c], '_') ){ II->flag |= SHOW_MESSAGE; PP->FF.flag |= SHOW_MESSAGE; } + if ( strchr (argv[c], '%') ) II->flag |= SHOW_PROGRESS; + if ( strchr (argv[c], '+') ) II->flag |= ITEMSET_APPEND; + if ( strchr (argv[c], '9') ) PP->problem |= SHD_STRAIGHT; + if ( strchr (argv[c], 'D') ) PP->problem |= SHD_DFS; + if ( strchr (argv[c], 's') ) PP->FF.flag |= (LOAD_SIZSORT + LOAD_DECROWSORT); // sort trsacts + else if ( strchr(argv[c], 'S') ) PP->FF.flag |= LOAD_SIZSORT; // sort trsacts increase order + if ( strchr (argv[c], 'c') ) PP->problem |= SHD_COMPLEMENT; + if ( strchr (argv[c], 't') ) PP->FF.flag |= LOAD_TPOSE; + if ( strchr (argv[c], 'P') ) PP->problem -= SHD_PRUNE; + if ( strchr (argv[c], 'B') ) PP->problem |= SHD_NO_BITMAP; + c++; + + while ( argv[c][0] == '-' ){ + switch (argv[c][1]){ + case 'K': II->topk.end = atoi (argv[c+1]); + break; case 'l': II->lb = atoi (argv[c+1]); + break; case 'u': II->ub = atoi(argv[c+1]); + break; case '#': II->max_solutions = atoi(argv[c+1]); + break; case ',': II->separator = argv[c+1][0]; + break; case 'Q': PP->outperm_fname = argv[c+1]; + break; default: goto NEXT; + } + c += 2; + if ( argc < c+1 ){ SHD_error (); return; } + } + + NEXT:; + PP->FF.fname = argv[c]; + if ( argc>c+1 ) PP->output_fname = argv[c+1]; +} + +int SHD_redundant_check (PROBLEM *PP, QUEUE_ID v, VEC_ID tt){ + QUEUE_INT i, *x, *y, *y_end = PP->OQ[v].v+PP->OQ[v].t, flag = 1, t; + for (y_end=PP->OQ[v].v ; *y_endOQ[v].v+PP->OQ[v].t ; y_end++); + FLOOP (i, 0, PP->FF.clms){ + if ( i == v ) continue; + y = PP->OQ[v].v; t= -1; + MQUE_FLOOP (PP->OQ[i], x){ + if ( *x>=tt ) break; + if ( y >= y_end ) goto END; + if ( *x != *y ) goto END; + t = *x; + y++; + } +// if ( y == y_end ){ flag++; printf ("OK(%d %d) %d\n", v, i, y_end-PP->OQ[v].v); continue; } + if ( y == y_end ){ flag++; continue; } + END:; +//if ( t>-1 && t<1000) printf ("fail (%d %d) = %d %d %d\n", v, i, t, *x, *y); + } + return (flag); +} + +/***************************************************************************/ +/***************************************************************************/ +/***************************************************************************/ + +/**************************************/ +/* straightforward minimality check */ +/* if a subset II->itemset - {i} has intersection to any subset from + 0 to tt, return 0. Otherwise, II->itemset is minimal hitting set + and return 1 */ +/**************************************/ +int SHDstraight_minimality_check (PROBLEM *PP, VEC_ID tt){ + VEC_ID j; + QUEUE_INT *x, *xx, *y; + MQUE_FLOOP (PP->II.itemset, x){ // for each item e, + ARY_FILL (PP->vecmark, 0, tt+1, 0); + MQUE_FLOOP (PP->II.itemset, xx){ // for each item ee!=e + if ( x==xx ) continue; + MQUE_FLOOP ( PP->OQ[*xx], y){ + if ( *y>tt ) break; + PP->vecmark[*y] = 1; // mark transaction including ee + } + } + FLOOP (j, 0, tt+1) if ( PP->vecmark[j]==0 ) goto END; // if a transaction includes no item, then II->itemset-{e} is not minimal +// printf ("okasii %d\n", tt); + return (0); + END:; + } + return (1); +} + +int SHD_minimality_check (PROBLEM *PP, VEC_ID tt){ + VEC_ID i, flag = 1; + QUEUE_ID m; + QUEUE_INT *x, mm=0; + MQUE_FLOOP (PP->II.itemset, x) PP->itemchr[*x] = 2; + + FLOOP (i, 0, tt+1){ + m=0; MQUE_FLOOP (PP->FF.v[i], x) + if ( PP->itemchr[*x] > 1 ){ m++; mm=*x; } + if ( m == 1 ) PP->itemchr[mm] = 3; + } + MQUE_FLOOP (PP->II.itemset, x){ + if ( PP->itemchr[*x] == 2 ) flag = 0; + PP->itemchr[*x] = 1; + } + return (flag); +} +LONG SHD_hitting_check (PROBLEM *PP, VEC_ID tt){ + VEC_ID i; + QUEUE_INT *x; + + MQUE_FLOOP (PP->II.itemset, x) PP->itemchr[*x] = 2; + FLOOP (i, 0, tt+1){ + MQUE_FLOOP (PP->FF.v[i], x) + if ( PP->itemchr[*x] > 1 ) goto END; + printf ("not a hitting set\n"); return (i); + END:; + } + MQUE_FLOOP (PP->II.itemset, x) PP->itemchr[*x] = 1; + return (-1); +} + +/*************************************************************************/ +/* iteration of SHD reverse search with straightforward minimality check */ +/*************************************************************************/ +void SHDstraight (PROBLEM *PP, VEC_ID tt){ + ITEMSET *II = &PP->II; + QUEUE_INT *x; + II->iters++; + + if ( tt == PP->FF.t ){ ITEMSET_output_itemset (II, NULL, 0); return; } + MQUE_FLOOP (PP->FF.v[tt], x) + if ( PP->itemchr[*x] == 1 ){ SHDstraight (PP, tt+1); return; } // tt includes an item of II->itemset, thus go to lower level. + MQUE_FLOOP (PP->FF.v[tt], x){ + QUE_INS (II->itemset, *x); + PP->itemchr[*x] = 1; + if ( SHD_minimality_check(PP, tt) ) SHDstraight (PP, tt+1); + PP->itemchr[*x] = 0; + II->itemset.t--; + } +} + + + +/**************************************/ +/* straightforward minimality check for complement */ +/* if a subset II->itemset - {i} has intersection to any subset from + 0 to tt, return 0. Otherwise, II->itemset is minimal hitting set + and return 1 */ +/* return 1 if minimal */ +/**************************************/ +int SHDstraight_minimality_check_ (PROBLEM *PP, VEC_ID tt){ + QUEUE_INT *x, *xx, *y; + VEC_ID i; +//printf ("########### "); QUEUE_print__ (&PP->II.itemset); + MQUE_FLOOP (PP->II.itemset, x){ // for each item *x, + ARY_FILL (PP->vecmark, 0, tt+1, 0); // clear transaction counter + MQUE_FLOOP (PP->II.itemset, xx){ // for each item *xx!=*x + if ( x==xx ) continue; + MQUE_FLOOP (PP->OQ[*xx], y){ + if ( *y>tt ) break; + PP->vecmark[*y]++; // increase the counter of transaction including ee + } + } +// FLOOP (i, 0, tt+1) printf ("(%d): %d<%d\n", *x, PP->vecmark[i], PP->II.itemset.t-1); + FLOOP (i, 0, tt+1) if ( PP->vecmark[i]==PP->II.itemset.t-1 ) goto END; // if counter is |II->itemset|-1 (including all except for e), then transaction ii includes II->itemset + return (0); + END:; + } + return (1); +} + + +/*************************************************************************/ +/* iteration of SHD (complement) reverse search with straightforward minimality check */ +/* find all minimal itemsets included in no transactions */ +/*************************************************************************/ +void SHDstraight_ (PROBLEM *PP, VEC_ID tt){ + ITEMSET *II = &PP->II; + QUEUE_INT *x, e; + QUEUE_ID i=0, k=0; + + II->iters++; + if ( tt == PP->FF.t ){ ITEMSET_output_itemset (II, NULL, 0); return; } + MQUE_FLOOP (PP->FF.v[tt], x) if ( PP->itemchr[*x]==1 ) k++; + if ( kitemset.t ){ SHDstraight_ (PP, tt+1); return; } // transaction tt does not include II->itemset + FLOOP (e, 0, PP->FF.clms){ + if ( PP->FF.v[tt].v[i]==e ){ i++; continue; } + QUE_INS (II->itemset, e); + if ( SHDstraight_minimality_check_(PP, tt) ){ + PP->itemchr[e] = 1; + SHDstraight_ (PP, tt+1); + PP->itemchr[e] = 0; + } + II->itemset.t--; + } +} + + + +/*************************************************************************/ +/*************************************************************************/ + +/*************************************************************************/ +/* return (minimum) transaction having no intersection to II->itemset */ +/* return -1 if any transaction has non-empty intersection to II->itemset */ +/*************************************************************************/ +LONG SHDdfs_straight_bottom_check (PROBLEM *PP){ + QUEUE_INT *x, *xx; + VEC_ID i; + ARY_FILL (PP->vecmark, 0, PP->FF.t, 1); + MQUE_FLOOP (PP->II.itemset, x) + MQUE_FLOOP (PP->OQ[*x], xx) PP->vecmark[*xx] = 0; + FLOOP (i, 0, PP->FF.t) if ( PP->vecmark[i] ) return (i); + return (-1); +} + +/*************************************************************************/ +/* iteration of SHD backtrack with straightforward minimality check */ +/*************************************************************************/ +void SHDdfs_straight (PROBLEM *PP, QUEUE_INT item){ + ITEMSET *II = &PP->II; + QUEUE_INT i; + II->iters++; + if ( SHDdfs_straight_bottom_check(PP) == -1 ) + { ITEMSET_output_itemset (II, NULL, 0); return; } + FLOOP (i, 0, item){ + QUE_INS (II->itemset, i); + if ( SHDstraight_minimality_check(PP, PP->FF.t-1) ) + SHDdfs_straight (PP, i); + II->itemset.t--; + } +} + + + +/**************************************************************/ +/**************************************************************/ +/**************************************************************/ +/**************************************************************/ + +void SHD_clear_flag (PROBLEM *PP, QUEUE_ID js){ + while (PP->itemjump.t > PP->itemjump.s ) + PP->itemchr[PP->itemjump.v[--PP->itemjump.t]] = 0; + PP->itemjump.s = js; +} + +/*************************************************************************/ +/* return (minimum) transaction including II->itemset */ +/* return -1 if any transaction has non-empty intersection to II->itemset */ +/*************************************************************************/ + +LONG SHDdfs_straight_bottom_check_ (PROBLEM *PP){ + VEC_ID i; + QUEUE_INT *x, *xx; + ARY_FILL (PP->vecmark, 0, PP->FF.t, 0); + MQUE_FLOOP (PP->II.itemset, x) + MQUE_FLOOP (PP->OQ[*x], xx) PP->vecmark[*xx]++; + FLOOP (i, 0, PP->FF.t) + if ( PP->vecmark[i]==PP->II.itemset.t ) return (i); + return (-1); +} + +/*************************************************************************/ +/* iteration of SHD backtrack with straightforward minimality check + for complement input */ +/*************************************************************************/ +void SHDdfs_straight_ (PROBLEM *PP, QUEUE_INT item){ + QUEUE_INT i; + PP->II.iters++; +//printf ("%d :::", item); QUEUE_print__ ( &PP->II.itemset ); + if ( SHDdfs_straight_bottom_check_(PP) == -1 ) + { ITEMSET_output_itemset (&PP->II, NULL, 0); return; } + FLOOP (i, 0, item){ + QUE_INS (PP->II.itemset, i); + if ( SHDstraight_minimality_check_ (PP, PP->FF.t-1) ) + SHDdfs_straight_ (PP, i); + PP->II.itemset.t--; + } +} + + + + + +/*****************************************************/ +/* SHD with simple crit update */ +/*****************************************************/ + +/* check minimality condition */ +void SHD_crit_check (PROBLEM *PP, QUEUE_INT tt){ + MALIST *A = &PP->occ; + QUEUE_INT *x, *t, j, m=0, th = MALIST_HEAD (*A, PP->FF.clms); + unsigned long *a; + + MQUE_FLOOP (PP->FF.v[tt], x){ + if ( PP->itemchr[*x] ){ if ( PP->itemchr[*x]==4 ) PP->II.iters3++; continue; } + PP->II.iters2++; + if ( PP->BA.v && PP->num < PP->OQ[*x].t ){ + m=0; MQUE_FLOOP (PP->II.itemset, t){ + a = &PP->BA.v[(*x) * PP->BA.xend]; + for (j=MALIST_HEAD(*A, *t) ; jend ; j=A->nxt[j]){ +// if ( !(a[j/32]&BITMASK_1[j%32]) ){ + if ( !(a[j/32]&(1<<(j&31))) ){ + ENMAX (m, j); + if ( m > th ) goto END; + goto NEXT; + } + } + m = A->end; + goto END; + NEXT:; + } + } else { + MQUE_FLOOP (PP->OQ[*x], t) PP->FF.v[*t].end = *x; + m=0; MQUE_FLOOP (PP->II.itemset, t){ + for (j=MALIST_HEAD(*A, *t) ; jend ; j=A->nxt[j]){ + if ( PP->FF.v[j].end != *x ){ + ENMAX (m, j); + if ( m > th ) goto END; + goto NEXT2; + } + } + m = A->end; + goto END; + NEXT2:; + } + } + END:; + + if ( m <= th ){ + m=0; MALIST_DO_FORWARD (*A, PP->FF.clms, j) + if ( PP->FF.v[j].end != *x ){ m = 1; break; } + if ( m == 0 ){ + QUE_INS (PP->II.itemset, *x); + ITEMSET_output_itemset (&PP->II, NULL, 0); + PP->II.itemset.t--; + PP->itemchr[*x] = 4; + QUE_INS (PP->itemjump, *x); + } + } else if ( m >= PP->FF.t ){ PP->itemchr[*x] = 4; QUE_INS (PP->itemjump, *x); } + else PP->itemchr[*x] = 1; + } +} + + +/* crit update */ +int SHD_update (PROBLEM *PP, QUEUE_INT e){ + MALIST *A = &PP->occ; + QUEUE_INT j, *t, ttt = MALIST_HEAD(*A, PP->FF.clms); + ALIST_ID tail = A->end + e; // anchor element of list e + unsigned long *a; + + if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) != SHD_PRUNE ) PP->II.iters2++; + if ( PP->BA.v && PP->num < PP->OQ[e].t ){ // bitmap version, when bitmap matrix exists, and PP->OQ[e] is larger than crit + a = &PP->BA.v[e * PP->BA.xend]; + MALIST_DO_FORWARD (*A, PP->FF.clms, j){ + if ( a[j/32]&(1<<(j&31)) ){ + A->list[j] = e; + QUE_INS (PP->vecjump, A->prv[j]); // undo list for uncov + A->nxt[A->prv[j]] = A->nxt[j]; + A->prv[A->nxt[j]] = A->prv[j]; + A->prv[j] = tail; + A->nxt[tail] = j; + tail = j; + } + } + MQUE_FLOOP (PP->II.itemset, t){ + MALIST_DO_FORWARD (*A, *t, j){ + if ( a[j/32]&(1<<(j&31)) ){ + A->nxt[A->prv[j]] = A->nxt[j]; + A->prv[A->nxt[j]] = A->prv[j]; + PP->vecchr[j] = 1; + QUE_INS (PP->veccand, j); // undo list for crit + } + } + } + } else { // set operation version + MQUE_FLOOP (PP->OQ[e], t){ // loop for hyperedges including e + if ( A->list[*t] == PP->FF.clms ){ // t is covered by no item in ITEMSET + A->list[*t] = e; // insert t to the crit list of e + QUE_INS (PP->vecjump, A->prv[*t]); // undo list for uncov + A->nxt[A->prv[*t]] = A->nxt[*t]; + A->prv[A->nxt[*t]] = A->prv[*t]; + A->prv[*t] = tail; + A->nxt[tail] = *t; + tail = *t; + } else if ( PP->vecchr[*t] ) continue; + else { + A->nxt[A->prv[*t]] = A->nxt[*t]; + A->prv[A->nxt[*t]] = A->prv[*t]; + PP->vecchr[*t] = 1; + QUE_INS (PP->veccand, *t); // undo list for crit + } + } + } + PP->num -= PP->veccand.t - PP->veccand.s; // update #hyperedges in (crit+uncov) + A->nxt[tail] = A->end + e; A->prv[A->end + e] = tail; + if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) == SHD_PRUNE ) return(0); + MQUE_FLOOP (PP->II.itemset, t) + if ( MALIST_HEAD (*A, *t) >= PP->FF.t ) return (PP->FF.t); + if ( !(PP->problem&SHD_DFS) ) MQUE_FLOOP (PP->II.itemset, t){ + if ( MALIST_HEAD (*A, *t) > ttt ) return (1); + } + return (0); +} + + +/* recover the update of crit */ +void SHD_recov (PROBLEM *PP, QUEUE_INT e){ + QUEUE_INT *x; + MALIST *A = &PP->occ; + ALIST_ID tt=MALIST_TAIL(*A, e), ttt=A->prv[tt]; // anchor of list e + + MQUE_SBLOOP (PP->vecjump, x){ // for uncov + A->list[tt] = PP->FF.clms; + A->nxt[tt] = A->nxt[*x]; A->nxt[*x] = tt; + A->prv[tt] = *x; A->prv[A->nxt[tt]] = tt; + tt = ttt; ttt = A->prv[tt]; + } + PP->vecjump.t = PP->vecjump.s; + MQUE_SBLOOP (PP->veccand, x){ // for crit + A->nxt[A->prv[*x]] = *x; A->prv[A->nxt[*x]] = *x; + PP->vecchr[*x] = 0; + } + PP->num += PP->veccand.t - PP->veccand.s; // update #hyperedges in (crit+uncov) + PP->veccand.t = PP->veccand.s; +} + + +/* main routine for SHD with simple crit update */ +void SHD (PROBLEM *PP){ + QUEUE *CAND = &PP->itemcand; + VEC_ID tt = MALIST_HEAD (PP->occ, PP->FF.clms); + QUEUE_INT *x, flag, f=PP->problem&SHD_DFS, item; + QUEUE_ID jt, js=PP->itemjump.s, cs=CAND->s, vs=PP->veccand.s, us=PP->vecjump.s; + + // find the transaction with minimum un-deleted vertices, and check whether there is a hyperedge with no un-deleted vertex +QUEUE_INT i, ii; +if (f){ + item = PP->FF.clms; + ii=0; MALIST_DO_FORWARD (PP->occ, PP->FF.clms, i){ + flag = 0; + MQUE_FLOOP (PP->FF.v[i], x) if ( PP->itemchr[*x] == 0 ) flag++; +// if ( f ){ + if ( flag < item ){ item = flag; tt = i; if ( flag==1 ) break;} +// } else { +// if ( flag==0 ){ +// MQUE_FLOOP (PP->FF.v[tt], x) if ( PP->itemchr[*x] == 1 ) PP->itemchr[*x] = 0; +// goto END; +// } +// } + } +} + +// ITEMSET_output_itemset (&PP->II, NULL, 0); // output a solution + +///////// redundancy counting +//item = 1; MQUE_FLOOP (PP->II.itemset, x) item *= SHD_redundant_check (PP, *x, tt); +//if ( item>1 ){ printf ("redandancy %d %d::: ", item, tt); QUEUE_print__ (&PP->II.itemset); } +//////// + + PP->II.outputs2 += PP->II.itemset.t; + PP->II.iters++; // + CAND->s = CAND->t; PP->itemjump.s = PP->itemjump.t; + PP->veccand.s = PP->veccand.t; PP->vecjump.s = PP->vecjump.t; + + if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) == SHD_PRUNE ) SHD_crit_check (PP, tt); + + // make the list of the vertices to be added (recover the vertex mark, when 0 mode) +PP->II.solutions += PP->FF.v[tt].t; // counter + ARY_REALLOCZ (*CAND, PP->FF.v[tt].t + CAND->t, EXIT); + MQUE_FLOOP (PP->FF.v[tt], x){ + if ( PP->itemchr[*x] == 0 ){ + QUE_INS (*CAND, *x); + if ( f ) PP->itemchr[*x] = 4; + } else if ( PP->itemchr[*x] == 1 ) PP->itemchr[*x] = 0; + else if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) != SHD_PRUNE ) PP->II.iters3++; + } + + for (jt=CAND->t ; jt > CAND->s ; ){ +//printf ("call %d: %d\n", *x, PP->itemchr[*x]); + // update crit // + item = CAND->v[--jt]; + + flag = SHD_update (PP, item); // +PP->II.solutions2 += PP->OQ[item].t; // counter + if ( flag >= PP->FF.t && (PP->problem&SHD_PRUNE) ){ + PP->itemchr[item] = 4; QUE_INS (PP->itemjump, item); + } else if ( flag ){ PP->itemchr[item] = 0; + } else { + QUE_INS (PP->II.itemset, item); PP->itemchr[item] = 4; + if ( MALIST_IS_ELM (PP->occ, MALIST_HEAD(PP->occ, PP->FF.clms)) ) SHD (PP); // recursion + else ITEMSET_output_itemset (&PP->II, NULL, 0); // output a solution + PP->itemchr[item] = 0; PP->II.itemset.t--; + } + SHD_recov (PP, item); + } + + MQUE_SLOOP (PP->itemjump, x) PP->itemchr[*x] = 0; + CAND->t = CAND->s; CAND->s = cs; + PP->itemjump.t = PP->itemjump.s; PP->itemjump.s = js; + PP->veccand.s = vs; PP->vecjump.s = us; +} + +/*************************************************************************/ +/* SHD for complement input */ +/*************************************************************************/ + +/* check minimality condition */ +void SHDC_crit_check (PROBLEM *PP, QUEUE_INT tt, QUEUE_INT prv){ + QUEUE_INT *x = PP->FF.v[tt].v, *t, item, m, u, b=PP->II.itemset.t-1; + + FLOOP (item, 0, PP->FF.clms){ + if ( item == *x ){ x++; continue; } + if ( PP->itemchr[item] ){ if ( PP->itemchr[*x]==4 ) PP->II.iters3++; continue; } + PP->II.iters2++; + u = PP->FF.t; MQUE_FLOOP (PP->II.itemset, t) PP->itemary[*t] = PP->FF.t; + MQUE_FLOOP (PP->OQ[item], t){ + if ( PP->vecflag[*t] < b ) continue; + if ( PP->vecflag[*t] == b ){ // for crit + if ( PP->vecmark[*t] == PP->FF.clms ) ENMIN (PP->itemary[prv], *t); + else ENMIN (PP->itemary[PP->vecmark[*t]], *t); + } else ENMIN (u, *t); // for uncov + } + m = 0; MQUE_FLOOP (PP->II.itemset, t) ENMAX (m, PP->itemary[*t]); + if ( m <= tt ){ + if ( u == PP->FF.t ){ + QUE_INS (PP->II.itemset, item); + ITEMSET_output_itemset (&PP->II, NULL, 0); + PP->II.itemset.t--; + PP->itemchr[item] = 4; + QUE_INS (PP->itemjump, item); + } + } else if ( m >= PP->FF.t ){ PP->itemchr[item] = 4; QUE_INS (PP->itemjump, item); } + else PP->itemchr[item] = 1; + } +} + +/* crit update for DFS version */ +int SHDC_update (PROBLEM *PP, QUEUE_INT e, QUEUE_INT *u, QUEUE_INT *h, QUEUE_INT prv){ + QUEUE_INT *t, z, b=PP->II.itemset.t-1; + + if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) != SHD_PRUNE ) PP->II.iters2++; + *u = PP->FF.t; + MQUE_FLOOP (PP->II.itemset, t) PP->itemary[*t] = PP->FF.t; +//fprintf (stderr, "%d::: ", e); QUEUE_print__ (&PP->OQ[e]); + MQUE_FLOOP (PP->OQ[e], t){ + if ( PP->vecflag[*t] < b ) continue; + if ( PP->vecflag[*t] == b ){ // for crit + if ( PP->vecmark[*t] == PP->FF.clms ) PP->vecmark[*t] = prv; + ENMIN (PP->itemary[PP->vecmark[*t]], *t); + } else ENMIN (*u, *t); // for uncov + PP->vecflag[*t]++; // increament to write "latest" + } + z = 0; MQUE_FLOOP (PP->II.itemset, t) ENMAX (z, PP->itemary[*t]); +//printf ("flag=%d, *u=%d\n", z, *u); + return (z); +} + +/* recover the update of crit, for DFS version (simpler) */ +void SHDC_recov (PROBLEM *PP, QUEUE_INT e, QUEUE_INT prv){ + QUEUE_INT *t, b=PP->II.itemset.t; + MQUE_FLOOP (PP->OQ[e], t){ + if ( PP->vecflag[*t] < b ) continue; + PP->vecflag[*t]--; + if ( PP->vecmark[*t] == prv ) PP->vecmark[*t] = PP->FF.clms; + } +} + +/* main routine for SHD with simple crit update */ +void SHDC (PROBLEM *PP, QUEUE_INT prv, VEC_ID tt){ + QUEUE *CAND = &PP->itemcand; + QUEUE_INT u=0, *x, flag, f=PP->problem&SHD_DFS, item;// *y; + QUEUE_ID jt, js=PP->itemjump.s, cs=CAND->s; // vt=PP->veccand.t; + +// printf ("ITEMSET "); QUEUE_print__ (&PP->II.itemset); +// printf ("tt=%d\n", tt); +// FLOOP (flag, 0, 6) printf (" %d", PP->itemchr[flag]); printf ("\n"); + PP->II.iters++; // + CAND->s = CAND->t; PP->itemjump.s = PP->itemjump.t; + + if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) == SHD_PRUNE ) SHDC_crit_check (PP, tt, prv); + + ARY_REALLOCZ (*CAND, (PP->FF.clms-PP->FF.v[tt].t) + CAND->t, EXIT); + +PP->II.solutions += PP->FF.clms; // counter + x = PP->FF.v[tt].v; + FLOOP (item, 0, PP->FF.clms){ + if ( item == *x ){ x++; continue; } + if ( PP->itemchr[item] == 0 ){ + QUE_INS (*CAND, item); + if ( f ) PP->itemchr[item] = 4; + } else if ( PP->itemchr[item] == 1 ) PP->itemchr[item] = 0; + else if ( (PP->problem&(SHD_DFS+SHD_PRUNE)) != SHD_PRUNE ) PP->II.iters3++; + } + + if ( f ) tt = PP->FF.t-1; + for ( jt=CAND->t ; jt > CAND->s ; ){ +//printf ("call %d: %d\n", *x, PP->itemchr[*x]); + // update crit // + item = CAND->v[--jt]; +PP->II.solutions2 += PP->OQ[item].t; // counter + if ((flag=SHDC_update (PP,item,&u,&PP->OQ[item].t,prv))>=PP->FF.t && (PP->problem&SHD_PRUNE)){ + PP->itemchr[item] = 4; QUE_INS (PP->itemjump, item); + } else if ( flag > tt ){ PP->itemchr[item] = 0; + } else { + QUE_INS (PP->II.itemset, item); PP->itemchr[item] = 4; + if ( u < PP->FF.t ) SHDC (PP, item, u); // recursion + else ITEMSET_output_itemset (&PP->II, NULL, 0); // output a solution + PP->itemchr[item] = 0; PP->II.itemset.t--; + } + SHDC_recov (PP, item, prv); + } + + MQUE_SLOOP (PP->itemjump, x) PP->itemchr[*x] = 0; + CAND->t = CAND->s; CAND->s = cs; + PP->itemjump.t = PP->itemjump.s; PP->itemjump.s = js; // PP->veccand.t = vt; +} + +/* find all hitting set of size 1, and remove them from the data */ +void SHD_output_single (PROBLEM *PP){ + QUEUE_INT item, *xx, *x; + VEC_ID t; + + FLOOP (item, 0, PP->FF.clms){ + if ( ( !(PP->problem&SHD_COMPLEMENT) && PP->OQ[item].t == PP->FF.t ) + || ( (PP->problem&SHD_COMPLEMENT) && PP->OQ[item].t == 0) ){ + QUE_INS (PP->II.itemset, item); + ITEMSET_output_itemset (&PP->II, NULL, 0); // output a solution + PP->II.itemset.t--; + PP->itemchr[item] = 4; // forbid to add + } + } + FLOOP (t, 0, PP->FF.t){ + xx = PP->FF.v[t].v; + MQUE_FLOOP (PP->FF.v[t], x){ + if ( PP->itemchr[*x] == 0 ){ + if ( x != xx ) *xx = *x; + xx++; + } + } + PP->FF.v[t].t = xx - PP->FF.v[t].v; + } +} + + +/*************************************************************************/ +/* main of SHD */ +/*************************************************************************/ +int SHD_main (int argc, char *argv[]){ + PROBLEM PP; + int f=0; + QUEUE_INT i; + + PROBLEM_init (&PP); + SHD_read_param (argc, argv, &PP); +if ( ERROR_MES ) return (1); + + PP.FF.flag |= LOAD_RM_DUP + LOAD_INCSORT; +// + TRSACT_DELIVERY; + PROBLEM_load (&PP); +if ( ERROR_MES ) goto END; + if ( PP.problem & SHD_STRAIGHT ) f |= PROBLEM_VECMARK; + else { + f |= PROBLEM_ITEMJUMP; + if ( PP.problem & SHD_COMPLEMENT ) f |= PROBLEM_VECMARK +PROBLEM_VECFLAG +PROBLEM_ITEMARY; + else f |= PROBLEM_VECCHR + PROBLEM_VECCAND + PROBLEM_VECJUMP; + } + PROBLEM_alloc (&PP, PP.FF.clms, PP.FF.t, PP.FF.t, NULL, PROBLEM_ITEMCHR + PROBLEM_ITEMCAND + f); + +// delivery + ARY_FILL (PP.itemcand.v, 0, PP.FF.clms+1, 0); + QUEUE_delivery(NULL, PP.itemcand.v, NULL, PP.FF.v, NULL, PP.FF.t, PP.FF.clms); + MQUE_ALLOC (PP.OQ, PP.FF.clms, PP.itemcand.v, 0, 1, EXIT); + QUEUE_delivery (PP.OQ, NULL, NULL, PP.FF.v, NULL, PP.FF.t, PP.FF.clms); + FLOOP (i, 0, PP.FF.clms) PP.OQ[i].v[PP.OQ[i].t] = PP.FF.t; // put endmark + if ( (PP.problem&(SHD_DFS+SHD_PRUNE)) == SHD_PRUNE ) + FLOOP (i, 0, PP.FF.t) PP.FF.v[i].end = PP.FF.clms; + if ( !(PP.problem&SHD_STRAIGHT) ) SHD_output_single (&PP); // output all minimal hitting sets of size one + PP.num = PP.FF.t; // #hyperedges in ( crit and uncov) + + // initialization for bitmap matrix + if ( !(PP.problem&(SHD_NO_BITMAP+SHD_COMPLEMENT)) && ((size_t)PP.FF.clms)*PP.FF.t/64 <= PP.FF.eles ){ + BARRAY_init (&PP.BA, PP.FF.t, PP.FF.clms); + i=0; FLOOP (f, 0, PP.FF.clms){ + BARRAY_set_subset (&PP.BA.v[i], &PP.OQ[f]); + i += PP.BA.xend; + } + } // SETFAMILY_to_BARRAY (&PP.BA, &PP.FF); + + if ( (PP.problem & SHD_STRAIGHT) == 0 ){ + if ( PP.problem & SHD_COMPLEMENT ){ + ARY_FILL (PP.vecmark, 0, PP.FF.t, PP.FF.clms); +// QUEUE_alloc (&PP.veccand, PP.FF.clms); +// FLOOP (i, 0, PP.FF.clms) QUE_INS (PP.veccand, i); + } else { + MALIST_alloc (&PP.occ, PP.FF.t, PP.FF.clms+2); // element=> + FLOOP (i, 0, PP.FF.t) MALIST_ins_tail (&PP.occ, PP.FF.clms, i, 0); + } + } + +/////// +//FLOOP (i, 0, PP.FF.clms) SHD_redundant_check (&PP, i, PP.FF.t); + +////// + +// main routines + if ( PP.problem&SHD_STRAIGHT ){ + if ( PP.problem&SHD_DFS ) + if ( PP.problem&SHD_COMPLEMENT ) SHDdfs_straight_(&PP, PP.FF.clms); + else SHDdfs_straight (&PP, PP.FF.clms); + else if ( PP.problem&SHD_COMPLEMENT ) SHDstraight_(&PP, 0); else SHDstraight (&PP, 0); + } else { + if ( PP.problem&SHD_COMPLEMENT ) SHDC (&PP, 0, 0); + else SHD (&PP); + } + + ITEMSET_last_output (&PP.II); + print_mes (&PP.II, "#iterations= %lld ,#min_check= %lld ,#pruning= %lld\n", PP.II.iters, PP.II.iters2, PP.II.iters3); + print_mes (&PP.II, "ave_cost_for_F(e)= %f ,ave_cost_for_CAND= %f ,ave_internal_sol.= %f\n", ((double)PP.II.solutions2)/PP.II.iters, ((double)PP.II.solutions)/PP.II.iters, ((double)PP.II.outputs2)/PP.II.iters); + END:; + PROBLEM_end (&PP); + + return (ERROR_MES?1:0); +} + +/*******************************************************************************/ +#ifndef _NO_MAIN_ +#define _NO_MAIN_ +int main (int argc, char *argv[]){ + return (SHD_main (argc, argv)); +} +#endif +/*******************************************************************************/ + +#endif + + diff --git a/rql-backend/shd31/sortout.pl b/rql-backend/shd31/sortout.pl new file mode 100644 index 0000000..7f7e8c6 --- /dev/null +++ b/rql-backend/shd31/sortout.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl + +# input: a file each whose line is a sequence of numbers +# output: the file obtained by (1) sorting each line in increasing order, +# (2) sort the lines in the increasing order (as strings ) +# the input file is read from standard input, and the result is output to +# the standard output +# We can specify the separator of the number, by the first parameter + +$ARGC = @ARGV; +if ( $ARGC < 0 ){ + printf ("sortout.pl: [separator] < input-file > output-file\nif separator is '-', do not sort the lines"); + exit (1); +} +$count = 0; +%numbers = (); +$m=0; +$linesort = 1; + +$sep = " "; +if ( $ARGC > 0 ){ + if ( $ARGV[0] eq "-" ){ $linesort = 0; } + else { $sep = $ARGV[0]; } +} +while (){ + chomp; + @eles = split($sep, $_); + @eles = sort { $a <=> $b } (@eles); + foreach $cell(@eles){ + if ( $cell == 0 ){ + if (index ( $cell, "0") >= 0 ){ $lines2[$m] .= $cell." "; } + } else { $lines2[$m] .= $cell." "; } + } + $m++; +} +if ( $linesort == 1 ){ @lines2 = sort (@lines2); } +for ( $mm=0 ; $mm<$m ; $mm++ ){ + print "$lines2[$mm]\n"; +} + + diff --git a/rql-backend/shd31/stdlib2.c b/rql-backend/shd31/stdlib2.c new file mode 100644 index 0000000..5473d12 --- /dev/null +++ b/rql-backend/shd31/stdlib2.c @@ -0,0 +1,1282 @@ +/* library for standard macros and functions */ +/* by Takeaki Uno 2/22/2002, e-mail: uno@nii.jp + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + +#ifndef _stdlib2_c_ +#define _stdlib2_c_ + +#include"stdlib2.h" +#ifdef MTWISTER +#include"dSFMT.c" +#endif + +size_t common_size_t; +INT common_INT, common_INT2; +char *common_charp, *common_pnt; +FILE *common_FILE; +FILE2 common_FILE2; +PERM common_PERM; +char common_comm[1024], common_comm2[1024], *common_argv[100]; // max. command length = 2048, max. #params = 100 + +char *ERROR_MES = NULL; +int print_time_flag=0; +PARAMS internal_params; +#ifdef MULTI_CORE +int SPIN_LOCK_dummy; +#endif +FILE2 INIT_FILE2 = {TYPE_FILE2,NULL,NULL,NULL,NULL,0}; +VEC INIT_VEC = {TYPE_VEC,NULL,0,0}; +FILE_COUNT INIT_FILE_COUNT = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,0,0,NULL,NULL,0,0,NULL,NULL}; +short FILE2_POW[5] = {1, 10, 100, 1000, 10000}; + +QSORT_TYPE (int, int) +QSORT_TYPE (uint, unsigned int) +QSORT_TYPE (double, double) +QSORT_TYPE (char, char) +QSORT_TYPE (uchar, unsigned char) +QSORT_TYPE (short, short) +QSORT_TYPE (ushort, unsigned short) +QSORT_TYPE (WEIGHT, WEIGHT) +QSORT_TYPE (LONG, LONG) +QSORT_TYPE (VEC_ID, VEC_ID) +QSORT_TYPE (VEC_VAL, VEC_VAL) +QSORT_TYPE (VEC_VAL2, VEC_VAL2) +QSORT_TYPE (FILE_COUNT_INT, FILE_COUNT_INT) + + /* bitmasks, used for bit operations */ +int BITMASK_UPPER1[32] = { 0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8, + 0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80, + 0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800, + 0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000, + 0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000, + 0xfff00000, 0xffe00000, 0xffc00000, 0xff800000, + 0xff000000, 0xfe000000, 0xfc000000, 0xf8000000, + 0xf0000000, 0xe0000000, 0xc0000000, 0x80000000 }; +int BITMASK_UPPER1_[32] = { 0xfffffffe, 0xfffffffc, 0xfffffff8, 0xfffffff0, + 0xffffffe0, 0xffffffc0, 0xffffff80, 0xffffff00, + 0xfffffe00, 0xfffffc00, 0xfffff800, 0xfffff000, + 0xffffe000, 0xffffc000, 0xffff8000, 0xffff0000, + 0xfffe0000, 0xfffc0000, 0xfff80000, 0xfff00000, + 0xffe00000, 0xffc00000, 0xff800000, 0xff000000, + 0xfe000000, 0xfc000000, 0xf8000000, 0xf0000000, + 0xe0000000, 0xc0000000, 0x80000000, 0x00000000 }; + +int BITMASK_LOWER1[32] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, + 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, + 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, + 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, + 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, + 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, + 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, + 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff }; +int BITMASK_LOWER1_[32] = { 0x00000001, 0x00000003, 0x00000007, 0x0000000f, + 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, + 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, + 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, + 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, + 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, + 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, + 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; + +int BITMASK_1[32] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000 }; +int BITMASK_31[32] = { 0xfffffffe, 0xfffffffd, 0xfffffffb, 0xfffffff7, + 0xffffffef, 0xffffffdf, 0xffffffbf, 0xffffff7f, + 0xfffffeff, 0xfffffdff, 0xfffffbff, 0xfffff7ff, + 0xffffefff, 0xffffdfff, 0xffffbfff, 0xffff7fff, + 0xfffeffff, 0xfffdffff, 0xfffbffff, 0xfff7ffff, + 0xffefffff, 0xffdfffff, 0xffbfffff, 0xff7fffff, + 0xfeffffff, 0xfdffffff, 0xfbffffff, 0xf7ffffff, + 0xefffffff, 0xdfffffff, 0xbfffffff, 0x7fffffff }; + +int BITMASK_16[8] = { 0x0000000f, 0x000000f0, 0x00000f00, 0x0000f000, + 0x000f0000, 0x00f00000, 0x0f000000, 0xf0000000 }; +int BITMASK_UPPER16[8] = { 0xffffffff, 0xfffffff0, 0xffffff00, 0xfffff000, + 0xffff0000, 0xfff00000, 0xff000000, 0xf0000000 }; +int BITMASK_LOWER16[8] = { 0x0000000f, 0x000000ff, 0x00000fff, 0x0000ffff, + 0x000fffff, 0x00ffffff, 0x0fffffff, 0xffffffff }; +int BITMASK_FACT16[8] = { 0x1, 0x10, 0x100, 0x1000, + 0x10000, 0x100000, 0x1000000,0x10000000 }; + + +/* free many pointers */ +void mfree_(void *x, ...){ + va_list argp; + void *a; + va_start (argp, x); + while((a = va_arg(argp, void *)) != (void*)1){ free2 (a); } + va_end (argp); +} +/* free many pointers */ +void mfree2_(void *x, ...){ + va_list argp; + void *a; + va_start (argp, x); + while((a = va_arg(argp, void *)) != (void*)1){ free2 (*((char **)a)); } + va_end (argp); +} +/* remove many files */ +void mremove_ (char *x, ...){ + va_list argp; + char *a; + va_start (argp, x); + while((a = va_arg(argp, char *))){ + sprintf (common_comm, "%s%s", x, a); + remove (common_comm); + } + va_end (argp); +} + +/* compute the minimum prime no less than n */ +#define MINPRIME_END 6000 +LONG min_prime (LONG n){ + LONG i, j=30, k; + char f[MINPRIME_END]; + while(1) { + FLOOP (i, 0, j) f[i]=0; + for ( i=3 ; i*i < n+j ; i+=2 ) + for ( k=((n+i-1)/i)*i ; k>19))^(t^(t>>8)) ); +} + +/***********************************************************************/ +/***********************************************************************/ +#ifdef USE_MATH +#define NORMAL_RAND_BASE 2147483648LL + +double SQRT(double x){ +#ifdef USE_SIMD + __m128d a; + a = _mm_load1_pd (&x); + _mm_sqrt_pd (a); + _mm_storel_pd (&x, a); +#else + x = sqrt (x); +#endif + return (x); +} +/* make two random numbers under normal distribution N(0,1) */ +void rand_mk_2normal (double *a, double *b){ + double r1, r2; + do { + r1 = RAND1; + } while (r1==0); + r2 = RAND1; + r1 = sqrt(-log(r1)*2); + r2 *= 2*PI; + *a = r1*sin(r2); + *b = r1*cos(r2); +} + +/* make a random point on a supersphere of d-dim., and set to double array already allocated */ +void rand_d_gaussian (double *p, int d){ + int i; + double a, b; + for (i=0 ; i 0.000001 ){ + if ( sphere_prob (d, (t+s)/2) > m ) s = (t+s)/2; + else t = (t+s)/2; + } + return (s); +} + + +#endif + +/******************** file I/O routines ********************************/ + +int FILE_err; /* signals 0: for normal termination + 1: read a number, then encountered a newline, + 2: read a number, then encountered the end-of-file + 5: read no number, and encountered a newline + 6: read no number, and encountered the end-of-file */ + + +void FILE2_flush (FILE2 *fp){ + if ( fp->buf > fp->buf_org+FILE2_BUFSIZ/2 ){ + fwrite (fp->buf_org, fp->buf-fp->buf_org, 1, fp->fp); + *fp->buf_org = *fp->buf; + fp->buf = fp->buf_org; + } +} +void FILE2_flush_last (FILE2 *fp){ + if ( fp->bit > 0 ) fp->buf++; + if ( fp->buf > fp->buf_org ){ + fwrite ( fp->buf_org, fp->buf-fp->buf_org, 1, fp->fp); + fp->buf = fp->buf_org; + } +} +void FILE2_close (FILE2 *fp){ + fclose2 (fp->fp); + free2 (fp->buf_org); + fp->buf = fp->buf_end = 0; +} +void FILE2_closew (FILE2 *fp){ + FILE2_flush_last (fp); + fclose2 (fp->fp); + free2 (fp->buf_org); + fp->buf = fp->buf_end = 0; +} +void FILE2_reset (FILE2 *fp){ + fp->buf = fp->buf_org; + fp->buf_end = fp->buf_org-1; + fseek (fp->fp, 0, SEEK_SET); +} +/* fast file routine, getc, putc, puts, */ +int FILE2_getc (FILE2 *fp){ + int c; + if ( fp->buf >= fp->buf_end ){ + if ( (fp->buf_end < fp->buf_org+FILE2_BUFSIZ) && (fp->buf_end>=fp->buf_org) ){ FILE_err=2; return (-1); } + fp->buf = fp->buf_org; + fp->buf_end = fp->buf_org + fread (fp->buf, 1, FILE2_BUFSIZ, fp->fp); + return (FILE2_getc (fp)); + } + c = (unsigned char)(*(fp->buf)); + fp->buf++; + return (c); +} +void FILE2_puts (FILE2 *fp, char *s){ + while ( *s != 0 ){ + *(fp->buf) = *s; + s++; + fp->buf++; + } +} +void FILE2_putc (FILE2 *fp, char c){ + *(fp->buf) = c; + fp->buf++; +} +int FILE2_getbit (FILE2 *fp){ + int a; + unsigned char *p; + if ( fp->buf >= fp->buf_end ){ + if ( (fp->buf_end < fp->buf_org+FILE2_BUFSIZ) && (fp->buf_end>=fp->buf_org) ){ FILE_err=2; return (-1); } + fp->buf = fp->buf_org; + fp->buf_end = fp->buf_org + fread (fp->buf, 1, FILE2_BUFSIZ, fp->fp); + } + p = (unsigned char *)fp->buf; a = (*p) %2; (*p) /=2; + if ( (++fp->bit) == 8 ){ fp->bit = 0; fp->buf++; } + return (a); +} +void FILE2_putbit (FILE2 *fp, int a){ // a is non-zero => 1 + if ( a ){ + a = 1 << fp->bit; + *fp->buf |= a; + } + if ( (++fp->bit) == 8 ){ + fp->bit = 0; + fp->buf++; + FILE2_flush (fp); + *fp->buf = 0; + } +} + +/* fast file routine, print number, c is the char to be printed preceding to the number + if c==0, nothing will be printed preceding the number + if len<0 then the #digits following '.' does not change (filed by '0') */ +void STR_print_int (char **s, LONG n, char c){ + LONG nn = n; + char *ss; + if ( c ){ **s = c; (*s)++; } + if ( n == 0 ){ **s = '0'; (*s)++; return; } + if ( n < 0 ){ **s = '-'; (*s)++; n = -n; } + while ( nn>99999 ){ nn /= 1000000; (*s)+=6; } + while ( nn>99 ){ nn /= 1000; (*s)+=3; } + while ( nn>0 ){ nn /= 10; (*s)++; } + ss = (*s)-1; + **s = 0; + while ( n>0 ){ *ss = '0'+(char)(n%10); ss--; n/=10; } +} +void STR_print_int_ (char **s, LONG n, int len, char c){ + char *ss; + if ( c ){ **s = c; (*s)++; } + if ( n == 0 ){ **s = '0'; (*s)++; return; } + if ( n < 0 ){ **s = '-'; (*s)++; n = -n; } + (*s)+=len; + ss = (*s)-1; + **s = 0; + while ( len>0 ){ *ss = '0'+(char)(n%10); ss--; n/=10; len--; } +} +void FILE2_print_int (FILE2 *fp, LONG n, char c){ + STR_print_int (&(fp->buf), n, c); +} +/* print a real number to string pointed by *s, + (print_reale prints in format "x.xxxxxe+10e" + [len] is #decimal digits to be printed + for speeding up, give 10^{len} as [len], when len >1 */ +void STR_print_reale (char **s, double n, int len, char c){ + int flag=0, d=0, dd; + LONG nn; + + if ( len >= 100 ) nn = len; + else { + nn = 1; + while ( len >= 9 ){ nn *= 1000000000; len -= 9; } + while ( len >= 3 ){ nn *= 1000; len -= 3; } + while ( len >= 1 ){ nn *= 10; len --; } + } + + if ( c ){ **s = c; (*s)++; } + if ( n<0 ){ **s = c; (*s)++; n = -n; } + if ( n<1 ){ + flag = 1; + while ( n < 0.00000001 ){ d+=9; n *= 1000000000;} + while ( n < 0.01 ){ d+=3; n *= 1000;} + while ( n < 1 ){ d++; n *= 10;} + } else { + while ( n >= 1000000000 ){ d+=9; n /= 1000000000;} + while ( n >= 1000 ){ d+=3; n /= 1000;} + while ( n >= 10 ){ d++; n /= 10;} + } + + dd = n; **s = '0' + dd; (*s)++; n -= dd; + **s = '.'; (*s)++; + nn = n*nn; STR_print_int (s, nn, 0); + while ( *(*s -1) == '0' ) (*s)--; + if ( *(*s -1) == '.' ) (*s)--; + **s = 'e'; (*s)++; **s = flag? '-': '+'; (*s)++; + STR_print_int (s, d, 0); + **s = 0; +} +void FILE2_print_reale (FILE2 *fp, double n, int len, char c){ + STR_print_reale (&(fp->buf), n, len, c); +} +/* print a real number to string pointed by *s */ +void STR_print_real (char **s, double n, int len, char c){ + int flag=1, d=0, dd, ll = len; + LONG nn; + + if ( c ){ **s = c; (*s)++; } + if ( n<0 ){ **s = '-'; (*s)++; n = -n; } + if ( n<1 ){ **s = '0'; (*s)++; } + else { + while ( n > (1LL<<60) ){ d++; n /= (1000000000000000000LL);} + nn = n; STR_print_int (s, nn, 0); + BLOOP (d, d, 0) FLOOP (dd, 0, 18){ **s = '0'; (*s)++; } + n -= nn; + } + if ( len == 0 ) return; // no decimal digits + **s = '.'; (*s)++; + if ( len<0 ){ len = -len; flag = 0; } + nn = 1; + if ( len >= 100 ) nn = len; + else { + while ( len >= 6 ){ nn *= 1000000; len -= 6; } + while ( len >= 3 ){ nn *= 1000; len -= 3; } + while ( len >= 1 ){ nn *= 10; len --; } + } + nn = n*nn; + STR_print_int_ (s, nn, ll, 0); + if ( flag ){ + while ( *(*s -1) == '0' ) (*s)--; + if ( *(*s -1) == '.' ) (*s)--; + } + **s = 0; +} +void FILE2_print_real (FILE2 *fp, double n, int len, char c){ + STR_print_real (&(fp->buf), n, len, c); +} +void FILE2_print_real__ (FILE2 *fp, double n, int len, char c){ + int i=0, flag=1, d=0, dd=0; + char *back; + LONG nn; + + if ( c ) FILE2_putc (fp, c); + if ( n<0 ){ FILE2_putc (fp, '-'); n *= -1; } + if ( n<1 ){ *(fp->buf) = '0'; fp->buf++; } + else { + while ( n > (1LL<<60) ){ d++; n /= (1000000000000000000LL);} + nn = n; FILE2_print_int (fp, nn, 0); + BLOOP (d, d, 0) FLOOP (dd, 0, 18) FILE2_putc (fp, '0'); + n -= nn; + } + if ( len == 0 ) return; // no digits smaller than 1 + *(fp->buf) = '.'; back = fp->buf; + fp->buf++; + if ( len<0 ){ len = -len; flag = 0; } + for (d=0 ; len>0 ; len--){ + if ( d==0 ){ + d = 4; + n *= 10000.0; + dd = n; + n -= dd; + } + if ( --d > 0 ){ + i = dd/FILE2_POW[d]; + dd -= i*FILE2_POW[d]; + } + *(fp->buf) = '0'+i; + fp->buf++; + if ( i>0 ) back = fp->buf; + } + if ( flag ) fp->buf = back; +} +void FILE2_print_real_ (FILE2 *fp, double n, int len, char c){ + int i=0, flag=1; + double j=1; + char *back; + + if ( c ) FILE2_putc (fp, c); + if ( n<0 ){ FILE2_putc (fp, '-'); n *= -1; } + while ( n >= j ) j*=10; + if ( j==1 ){ *(fp->buf) = '0'; fp->buf++; } + else while ( j>1 ){ + j /= 10; + i = (int)(n/j); + *(fp->buf) = '0'+i; + n -= j*i; + fp->buf++; + } + *(fp->buf) = '.'; back = fp->buf; + fp->buf++; + if ( len<0 ){ len = -len; flag = 0; } + for ( ; len>0 ; len--){ + n *= 10.0; + i = (int)n; + *(fp->buf) = '0'+i; + n -= i; + fp->buf++; + if ( i>0 ) back = fp->buf; + } + if ( flag ) fp->buf = back; +} +/******/ +void FILE2_print_WEIGHT (FILE2 *fp, WEIGHT w, int len, char c){ +#ifdef WEIGHT_DOUBLE + FILE2_print_real(fp, w, len, c); +#else + FILE2_print_int(fp, w, c); +#endif +} + +// print integer to file in a bit string manner +// first bit 0 -> 0to127 +// 10 -> 128 to 16384+127 +// 110 -> 16384+128 to 32*65536+16384+127 +// 1110 -> ... to 16* +// max: limit of the bit length +void FILE2_print_mpint (FILE2 *fp, LONG a, int max, int skip){ + int i=0, bb; + LONG b, x=0; + bb = 1<= b ){ x += b; b *= bb; i++; if ( (i+1)*skip >= max ) break; } + a -= x; + FLOOP (x, 0, i) FILE2_putbit (fp, 1); // length of the integer + if ( (i+1)*skip < max ) FILE2_putbit (fp, 0); // end mark + else for ( ; max < (i+1)*skip ; max++, b/=2); + for (b/=2 ; b>0 ; b/=2) FILE2_putbit (fp, (a&b)>0); +} + +LONG FILE2_read_mpint (FILE2 *fp, int max, int skip){ + LONG a, b, x=0; + int i=0, j, bb; + for (b=bb=1<= max ){ + for ( ; max < (i+2)*skip ; max++, b/=2); + break; + } + } + for (a=0 ; b>1 ; b/=2) a = a*2 + FILE2_getbit(fp); + return (a+x); +} +/* print lowest k bits to file */ +void FILE2_print_intbit (FILE2 *fp, LONG a, int k){ + LONG b= 1LL << (k-1); + while (b>0){ FILE2_putbit (fp, (a&b)>0); b /= 2; } +} +/* read k bits from file as integer */ +LONG FILE2_read_intbit (FILE2 *fp, int k){ + LONG a=0; + while (k-->0){ a = a*2 + FILE2_getbit (fp); } + return (a); +} + +#define FILE2_READ_CH(v) \ + +//#define FILE2_READ_(v) + +/* Read an integer/a double from the file and return it, + with read through the non-numeric letters. + If it reaches to the end-of-file just after reading a number, then set FILE_err=2, + if it reads a newline just after reading a number, then set FILE_err=1. + If read either the end-of-file or newline before reading an integer, + return 5, and 6 */ +FILE_LONG FILE2_read_int (FILE2 *fp){ + FILE_LONG item; + int sign=1, ch; + FILE_err = 0; + while (1){ + ch = FILE2_getc(fp); + if ( ch>='0' && ch<='9' ) break; + if ( ch == '\n' ){ FILE_err = 5; return (-INTHUGE); } + if ( ch < 0 ){ FILE_err = 6; return (-INTHUGE); } + if ( ch=='-' ) sign = -1; + } + for (item=ch-'0' ; 1 ; item=item*10 +ch-'0'){ + ch = FILE2_getc(fp); + if ( ch<'0' || ch>'9' ){ + if ( ch == '\n' ) FILE_err = 1; + if ( ch < 0 ) FILE_err = 2; + return (item*sign); + } + } +} +double FILE2_read_double (FILE2 *fp){ + double item, geta=1; + int sign=1, ch, n=0, d, flag=0; + FILE_err = 0; + while (1){ + ch = FILE2_getc(fp); + if ( ch<'0' || ch>'9' ){ + if ( ch == '\n' ){ FILE_err = 5; return (-DOUBLEHUGE); } + if ( ch < 0 ){ FILE_err = 6; return (-DOUBLEHUGE); } + if ( ch=='-' ) sign = -1; + else if ( ch=='.' ){ flag = 1; geta = 0.1; } + else { sign = 1; geta = 1; flag = 0; } + } else break; + } + item = 0; d = 0; item = ch-'0'; if ( flag ) item /= 10; + + while (1){ + ch = FILE2_getc(fp); + if ( ch < '0' || ch > '9' ){ + if ( ch == '\n' ){ FILE_err = 1; break; } + else if ( ch < 0 ){ FILE_err = 2; break; } + else if ( ch == '.' ){ // decimal + if ( flag ) break; // second decimal; illigal syntax + if ( d ) item = item * FILE2_POW[d] + n; + flag = 1; n = 0; d = 0; + } else if ( (ch & 0xdf) == 'E' ){ // power + if ( d ){ + if ( flag ) item += geta * n / FILE2_POW[d]; + else item = item * FILE2_POW[d] + n; + } + flag = n = 0; + ch = FILE2_getc(fp); + if ( ch == '-' ){ flag = 1; ch = FILE2_getc(fp); } // power is minus + else if ( ch == '+' ) ch = FILE2_getc(fp); // power is plus + else if ( ch < '0' || ch > '9') break; + for ( n=ch-'0' ; 1 ; n=n*10 + ch-'0' ){ + ch = FILE2_getc(fp); + if ( ch<'0' || ch>'9' ){ + if ( ch == '\n' ) FILE_err = 1; + if ( ch < 0 ) FILE_err = 2; + if ( flag ){ + while ( n>=9 ){ item /= 1000000000.0; n -= 9; } + while ( n>=3 ){ item /= 1000.0; n -= 3; } + while ( n>=1 ){ item /= 10.0; n --; } + } else { + while ( n>=9 ){ item *= 1000000000.0; n -= 9; } + while ( n>=3 ){ item *= 1000.0; n -= 3; } + while ( n>=1 ){ item *= 10.0; n --; } + } + return (item*sign); + } + } + } else break; + } else { + if ( n>0 ) n *= 10; + n += ch - '0'; + if ( ++d == 5 ){ + if ( flag ){ + geta /= 100000.0; + item += geta * n; + } else item = item * 100000.0 + n; + n = d = 0; + } + } + } + if ( d ){ + if ( flag ) item += geta * n / FILE2_POW[d]; + else item = item * FILE2_POW[d] + n; + } + return (item*sign); +} +double FILE2_read_double_ (FILE2 *fp){ + double item, geta=1; + int sign=1, ch; + FILE_err = 0; + while (1){ + ch = FILE2_getc(fp); + if ( ch < 0 ){ FILE_err = 6; return (-DOUBLEHUGE); } + if ( ch == '\n' ){ FILE_err = 5; return (-DOUBLEHUGE); } + if ( ch=='-' ) sign *= -1; + else if ( ch=='.' ) geta = 0.1; + else if ( ch>='0' && ch<='9' ) break; + else { sign = 1; geta = 1; } + } + + item = geta * (ch-'0'); + if ( geta < 1.0 ) geta *= .1; + while (1){ + ch = FILE2_getc(fp); + if ( ch == '\n' ){ FILE_err = 1; return (item*sign); } + if ( ch<0 ){ FILE_err = 2; return (item*sign); } + if ( ch == '.' ) geta = .1; + else if ( (ch < '0') || (ch > '9')) return (item*sign); + else if ( geta < 1.0 ){ + item += geta*(ch-'0'); + geta *= 0.1; + } else item = item*10 + (ch-'0'); + } +} + +/* string has to have non-numeric alphabet until its end */ +FILE_LONG STR_read_int (char **s){ + FILE_LONG item; + int flag =1; + FILE_err = 0; + while (1) { + if ( **s == '\n' ){ FILE_err = 5; return (-INTHUGE); } + if ( **s=='-' ) flag = -1; + if ( **s >= '0' && **s <= '9' ) break; + (*s)++; + } + for ( item=(int)((**s)-'0') ; 1 ; item=item*10 +(int)((**s)-'0') ){ + (*s)++; + if ( ((**s) < '0') || ((**s) > '9')){ + if ( (**s) == '\n' ) FILE_err = 1; + return (flag*item); + } + } +} +double STR_read_double (char **s){ + double item, geta=1; + int sign=1; + FILE_err = 0; + while (1){ + if ( **s == '\n' ){ FILE_err = 5; return (-DOUBLEHUGE); } + if ( **s == '-' ) sign *= -1; + else if ( **s == '.' ) geta = 0.1; + else if ( **s >= '0' && **s <= '9' ) break; + else { sign = 1; geta = 1; } + (*s)++; + } + + item = geta * (**s-'0'); + if ( geta < 1.0 ) geta *= .1; + while (1){ + if ( **s == '\n' ){ FILE_err = 1; return (item*sign); } + if ( **s == '.' ) geta = .1; + else if ( (**s < '0') || (**s > '9')) return (item*sign); + else if ( geta < 1.0 ){ + item += geta*(**s - '0'); + geta *= 0.1; + } else item = item*10 + (**s-'0'); + (*s)++; + } +} + +/* read a WEIGHT from file */ +WEIGHT FILE2_read_WEIGHT (FILE2 *fp){ +#ifdef WEIGHT_DOUBLE + return (FILE2_read_double(fp)); +#else + return ((WEIGHT)FILE2_read_int(fp)); +#endif +} + +/* read through the file until newline or EOF */ +void FILE2_read_until_newline (FILE2 *fp){ + int ch; + if (FILE_err & 3) return; + while (1){ + ch = FILE2_getc (fp); + if ( ch == '\n' ){ FILE_err = 5; return; } + if ( ch < 0 ){ FILE_err = 6; return; } + } +} + +void STR_copy_until_newline (char **s, size_t *x, size_t *end, FILE2 *fp){ + int ch; + char *start = fp->buf; + while (1){ + if ( FILE_err & 3 ) return; + ch = FILE2_getc (fp); + if ( ch == '\n' ) FILE_err = 5; + else if ( ch < 0 ){ FILE_err = 6; if ( fp->buf == start ) return; } // + else if ( fp->buf < fp->buf_end ) continue; + + if ( start == fp->buf_end ) start = fp->buf_org; + if ( (*x) + fp->buf - start >= *end ){ + *end = MAX((*x) + fp->buf - start+64, (*end)*2); + realloc2 (*s, *end, EXIT); + } + memcpy (&(*s)[*x], start, fp->buf-start); + (*x) += fp->buf - start; + if ( FILE_err & 3 ) return; + start = fp->buf; + } +} + +void FILE2_printf (FILE2 *fp, char *mes, ...){ + va_list argp; + va_start (argp, mes); + sprintf (fp->buf, mes, argp); + va_end (argp); +} + +/* print a real number in a good style */ +void fprint_real (FILE *fp, double f){ + char s[200]; + size_t i; + i = sprintf (s, "%f", f); + while ( s[i-1] == '0' ) i--; + if ( s[i-1] == '.' ) i--; + s[i] = 0; + fprintf (fp, s); +} +void print_real (double f){ + fprint_real (stdout, f); +} + +void fprint_WEIGHT (FILE *fp, WEIGHT f){ +#ifdef WEIGHT_DOUBLE + fprint_real (fp, f); +#else + fprintf (fp, "%d", f); +#endif +} +void print_WEIGHT (WEIGHT f){ + fprint_WEIGHT (stdout, f); +} + +/* count the clms, rows, items, each row size, each column size */ +/* file types can be, array list and element list*/ +/* support transpose */ +FILE_COUNT FILE2_count (FILE2 *fp, int flag, int skip_rows, int int_rows, int skip_clms, int int_clms, FILE_COUNT_INT row_limit){ + FILE_COUNT_INT k=0, j, x, y, t=0; + int fr = flag&FILE_COUNT_ROWT, fc = flag&FILE_COUNT_CLMT; + int fe = flag&LOAD_ELE, ft = flag&LOAD_TPOSE; + FILE_COUNT C = INIT_FILE_COUNT; + C.flag = flag; + + FLOOP (j, 0, skip_rows) FILE2_read_until_newline (fp); + if ( flag & (FILE_COUNT_NUM+FILE_COUNT_GRAPHNUM) ){ + C.clms = (FILE_COUNT_INT)FILE2_read_int (fp); + C.rows = (flag & FILE_COUNT_NUM)? (FILE_COUNT_INT)FILE2_read_int (fp): C.clms; + C.eles = (FILE_COUNT_INT)FILE2_read_int (fp); + if ( !(flag & (FILE_COUNT_ROWT + FILE_COUNT_CLMT)) ) return (C); + FILE2_read_until_newline (fp); + } + do { + if ( fe ){ + FLOOP (j, 0, skip_clms){ FILE2_read_double (fp); if ( FILE_err&3 ) goto ROW_END; } + x = (FILE_COUNT_INT)FILE2_read_int (fp); if ( FILE_err&3 ) goto ROW_END; + y = (FILE_COUNT_INT)FILE2_read_int (fp); if ( FILE_err&4 ) goto ROW_END; + FILE2_read_until_newline (fp); + } else { + if ( k==0 ) FLOOP (j, 0, skip_clms){ FILE2_read_double (fp); if (FILE_err&3) goto ROW_END; } + x = t; + y = (FILE_COUNT_INT)FILE2_read_int (fp); if (FILE_err&4 ) goto ROW_END; + FLOOP (j, 0, int_clms){ FILE2_read_double (fp); if (FILE_err&3 ) break; } + k++; + } + + if ( ft ) SWAP_FILE_COUNT_INT (x, y); + if ( y >= C.clms ){ + C.clms = y+1; + if ( fc ) reallocx (C.clmt, C.clm_end, C.clms, 0, goto END); + } + if ( x >= C.rows ){ + C.rows = x+1; + if ( fr ) reallocx (C.rowt, C.row_end, C.rows, 0, goto END); + } + if ( x < C.clm_btm || C.eles == 0 ) C.clm_btm = x; + if ( y < C.row_btm || C.eles == 0 ) C.row_btm = y; + if ( fc ) C.clmt[y]++; + if ( fr ) C.rowt[x]++; + C.eles++; + + ROW_END:; + if ( !fe && (FILE_err&1) ){ + t++; C.rows = t; + ENMAX (C.clm_max, k); + ENMAX (C.clm_min, k); + FLOOP (j, 0, int_rows) FILE2_read_until_newline (fp); + if ( row_limit>0 && t>=row_limit ) break; + } else if ( row_limit>0 && C.eles>=row_limit ) break; + + } while ( (FILE_err&2)==0 ); + END:; + if ( fr ){ + reallocx (C.rowt, C.row_end, C.rows, 0, goto END); + ARY_MAX (C.row_max, k, C.rowt, 0, C.rows); + ARY_MIN (C.row_min, k, C.rowt, 0, C.rows); + } + if ( fe && C.clmt ){ + if ( fc ) reallocx (C.clmt, C.clm_end, C.clms, 0, goto END); + ARY_MAX (C.clm_max, k, C.clmt, 0, C.clms); + ARY_MIN (C.clm_min, k, C.clmt, 0, C.clms); + } + if ( ERROR_MES ) mfree (C.rowt, C.clmt); + return (C); +} + + +/* SLIST:very simple one-sided list */ +void SLIST_init (int *l, int num, int siz){ + malloc2 (l, num+siz, EXIT); + ARY_FILL (l, num, num+siz, -1); +} +void SLIST_end (int *l){ free (l); } +#define SLIST_INS(l,m,e) (l[e]=l[m],l[m]=e); + +/* qsort according to "->t" */ +int qsort_cmp_VECt (const void *x, const void *y){ + if ( ((VEC *)x)->t < ((VEC *)y)->t ) return (-1); + else return ( ((VEC *)x)->t > ((VEC *)y)->t); +} +int qsort_cmp__VECt (const void *x, const void *y){ + if ( ((VEC *)x)->t > ((VEC *)y)->t ) return (-1); + else return ( ((VEC *)x)->t < ((VEC *)y)->t); +} +void qsort_VECt (VEC *v, size_t siz, int unit){ + if ( unit == 1 || unit==-1 ) unit *= sizeof (VEC); + if ( unit < 0 ) qsort (v, siz, -unit, qsort_cmp__VECt); + else qsort (v, siz, unit, qsort_cmp_VECt); +} + +int qqsort_cmp_VECt (const void *x, const void *y){ + if ( QQSORT_ELEt(VEC,x) < QQSORT_ELEt(VEC,y) ) return (-1); + else return ( QQSORT_ELEt(VEC,x) > QQSORT_ELEt(VEC,y) ); +} +int qqsort_cmp__VECt (const void *x, const void *y){ + if ( QQSORT_ELEt(VEC,x) > QQSORT_ELEt(VEC,y) ) return (-1); + else return ( QQSORT_ELEt(VEC,x) < QQSORT_ELEt(VEC,y) ); +} +void qsort_perm__VECt (VEC *v, size_t siz, PERM *perm, int unit){ + if ( unit == 1 || unit==-1 ) unit *= sizeof(VEC); + common_int=MAX(unit,-unit); common_pnt=(char *)v; + if (unit<0) qsort (perm, siz, sizeof(PERM), qqsort_cmp__VECt); + else qsort (perm, siz, sizeof(PERM), qqsort_cmp_VECt); +} + +PERM *qsort_perm_VECt (VEC *v, size_t siz, int unit){ + PERM *perm; + malloc2 (perm, siz, EXIT0); + ARY_INIT_PERM (perm, siz); + qsort_perm__VECt (v, siz, perm, unit); + return(perm); +} + +#ifdef STDLIB2_RADIX_SORT // radix sort with 1M byte static memory + +#define RADIX_SORT_BUCKET_SIZ 2048 +/* sort of integer array with combination of radix sort and quick sort */ +/* flag&1: sort in decreasing order */ + +// sort by lower bits +void intarray_sort_iter (unsigned int *a, size_t siz, int unit){ + static size_t cnt[RADIX_SORT_BUCKET_SIZ], cnt2[RADIX_SORT_BUCKET_SIZ], init_flag = 1; + size_t k, x; + int i, ii, j, flag=1; + static char bbuf[1000], bbuf2[1000]; + char *aa, *aaa, *aa_end, *buf, *buf2; + + if ( siz<1000 ){ qsort_uint ( a, siz, unit); return; } + if ( unit <0 ){ unit = -unit; flag = -1; } + if ( unit == 1 ) unit = sizeof (int); + buf = bbuf; buf2 = bbuf2; + if ( init_flag == 1 ){ + init_flag = 0; + ARY_FILL (cnt, 0, RADIX_SORT_BUCKET_SIZ, 0); + } + // count elements of each number + for ( aa=(char*)a,aa_end=aa+siz*unit ; aalet_cnt[dep][cc], S->let_cnt[dep+1][cc]); + memcpy ( buf2, aaa, unit); + memcpy ( aaa, buf, unit); + SWAP_PNT ( buf, buf2); + cnt2[j]++; + } + memcpy ( aa, buf, unit); + } + cnt[i]=0; // difference!! + } +} +// sort by middle bits +void intarray_sort_iter_ ( unsigned int *a, size_t siz, int unit){ + static size_t cnt[RADIX_SORT_BUCKET_SIZ], cnt2[RADIX_SORT_BUCKET_SIZ], init_flag = 1; + int i, ii, j, flag=1; + size_t k, x; + static char bbuf[1000], bbuf2[1000]; + char *aa, *aaa, *aa_end, *buf, *buf2; + + if ( siz<1000 ){ qsort_uint ( a, siz, unit); return; } + buf = bbuf; buf2 = bbuf2; + if ( unit <0 ){ unit = -unit; flag = -1; } + if ( unit == 1 ) unit = sizeof (int); + if ( init_flag == 1 ){ + init_flag = 0; + ARY_FILL ( cnt, 0, RADIX_SORT_BUCKET_SIZ, 0); + } + // count elements of each number + for ( aa=(char*)a,aa_end=aa+siz*unit ; aalet_cnt[dep][cc], S->let_cnt[dep+1][cc]); + memcpy (buf2, aaa, unit); + memcpy (aaa, buf, unit); + SWAP_PNT (buf, buf2); + cnt2[j]++; + } + memcpy (aa, buf, unit); + } + } + k=0; FLOOP (i, 0, RADIX_SORT_BUCKET_SIZ){ + ii = flag==1? i: RADIX_SORT_BUCKET_SIZ-i-1; + intarray_sort_iter ( (unsigned int*)(((char*)a)+unit*k), cnt[ii]-k, unit*flag); + k = cnt[ii]; + cnt[i]=0; + } +} + +// sort by upper bits +void intarray_sort ( unsigned int *a, size_t siz, int unit){ + static size_t cnt[RADIX_SORT_BUCKET_SIZ], cnt2[RADIX_SORT_BUCKET_SIZ], init_flag = 1; + int i, ii, j, flag=1; + size_t k, x; + static char bbuf[1000], bbuf2[1000]; + char *aa, *aaa, *aa_end, *buf, *buf2; + + if ( siz<1000 ){ qsort_uint ( a, siz, unit); return; } + if ( unit <0 ){ unit = -unit; flag = -1; } + if ( unit == 1 ) unit = sizeof (int); + buf = bbuf; buf2 = bbuf2; + if ( init_flag == 1){ + init_flag = 0; + ARY_FILL (cnt, 0, RADIX_SORT_BUCKET_SIZ, 0); + } + // count elements of each number + for ( aa=(char*)a,aa_end=aa+siz*unit ; aalet_cnt[dep][cc], S->let_cnt[dep+1][cc]); + memcpy (buf2, aaa, unit); + memcpy (aaa, buf, unit); + SWAP_PNT (buf, buf2); + cnt2[j]++; + } + memcpy ( aa, buf, unit); + } + } + k=0; FLOOP (i, 0, RADIX_SORT_BUCKET_SIZ){ + ii = flag==1? i: RADIX_SORT_BUCKET_SIZ-i-1; + intarray_sort_iter_ ( (unsigned int*)(((char*)a)+unit*k), cnt[ii]-k, unit*flag); + k = cnt[ii]; + cnt[i]=0; + } + +/* + for ( i=0 ; i= 0 ){ + t = l[k]; + l[k] = ll[t]; + ll[t] = perm[i]; + i++; + } + } + memcpy (perm, ll, sizeof(int)*siz); + free ( ll); + free ( l); + return ( perm); + } else { + i=0; FLOOP (k, 0, m-mm){ + while ( l[k] >= 0 ){ + t = l[k]; + l[k] = ll[t]; + ll[t] = i; + i++; + } + } + free (l); + return (ll); + } +} + +/* permutate structure array *tt of unit size unit of size num, according to perm array *pp */ +/* num has to be +#include +#include +#include +#include +#include + +#ifdef USE_SIMD +#include // use MMX-SSE2; +#endif + + +#if defined(__cplusplus) && defined(__GNUC__) + #define _cplusplus_ +#endif + +#ifdef MULTI_CORE +#include +#include +#endif +#define CORE_MAX 16 + +/* comment out the following line if no error check is needed */ +//#define ERROR_CHECK +/* comment out the following if exit is not needed after each error routine */ +//#define ERROR_RET + +#ifdef ERROR_RET // definition of the process for errors + #define EXIT return + #define EXIT0 return(0) +#else + #define EXIT exit(1) + #define EXIT0 exit(1) +#endif + +// for dealing with files more than 2GB +#define _LARGEFILE_SOURCE +#define _FILE_OFFSET_BITS 64 + +#ifndef NULL + #define NULL 0 +#endif + +#ifdef MTWISTER + #define RANDOM ((long)(dsfmt_gv_genrand_close_open()*2147483648LL)) + #define RAND1 dsfmt_gv_genrand_close_open() + #define RAND_INIT dsfmt_gv_init_gen_rand(514346237) +#elif defined(__GNUC__) + #define RANDOM xor128() + #define RAND1 ((double)xor128())/4294967296.0 + #define RAND_INIT xor128() +#else + #define RANDOM rand() + #define RAND1 ((double)rand())/2147483648.0 + #define RAND_INIT srand(0) +#endif + + +// 64bit integer +#ifdef LONG_32 + #define LONG int + #define LONGHUGE INTHUGE + #define LONGF "%d" +#elif !defined(LONG) + #define LONG long long + #define LONGHUGE 9000000000000000000LL + #define LONGF "%lld" +#endif + +// actual int (most proper sized integer, for the processor) +#ifdef INT_64 + #define INT LONG + #define INTF LONGF +#else + #define INT int + #define INTF "%d" +#endif + +#ifndef FILE_LONG + #define FILE_LONG LONG + #define FILE_LONGHUGE LONGHUGE + #define FILE_LONGF LONGF +#endif + +#define UINTHUGE 4000000000U +#define INTHUGE 2000000000 +#define USHORTHUGE 32767 +#define SHORTHUGE 65535 +#define DOUBLEHUGE 999999999999999999999999999999.9 +#define ISEQUAL_VALUE 0.0000001 +#define ISEQUAL_VALUE2 0.00001 +#define PI 3.1415926535897932384647950288 +#define PI_INT 31416 +#define NPE 2.718281828459045235360287471352 +#define NPE_INT 27183 + +#ifndef WEIGHT + #ifdef WEIGHT_DOUBLE + #define WEIGHT double + #define WEIGHTHUGE DOUBLEHUGE + #define WEIGHTF "%f" + #else // define WEIGHT by int if it's undefined + #define WEIGHT int + #define WEIGHTHUGE INTHUGE + #define WEIGHTF "%d" + #endif +#endif + +#ifndef PERM + #ifdef PERM_LONG + #define PERM LONG + #define PERMHUGE LONGHUGE + #define PERMF LONGF + #else + #define PERM int + #define PERMHUGE INTHUGE + #define PERMF "%d" + #endif +#endif + + +extern size_t common_size_t; +extern INT common_INT, common_INT2; +extern char *common_pnt, *common_charp; +extern FILE *common_FILE; +extern WEIGHT common_WEIGHT, *common_WEIGHTp; +extern char *ERROR_MES; +extern int print_time_flag; +extern char common_comm[], common_comm2[], *common_argv[]; +typedef struct { + int i1, i2, i3, i4, i5, i6, i7, i8, i9; + LONG l1, l2, l3, l4, l5, l6, l7, l8, l9; + double d1, d2, d3, d4, d5, d6, d7, d8, d9; + char *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9; + void *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9; +} PARAMS; +extern PARAMS internal_params; + +/* lock&unlock for multi-core mode */ +#ifdef MULTI_CORE + extern int SPIN_LOCK_dummy; + #define SPIN_LOCK(b,a) (SPIN_LOCK_dummy=(((b)>1)&&pthread_spin_lock(&(a)))) + #define SPIN_UNLOCK(b,a) (SPIN_LOCK_dummy=(((b)>1)&&pthread_spin_unlock(&(a)))) +#else + #define SPIN_LOCK(b,a) + #define SPIN_UNLOCK(b,a) +#endif + +#define TYPE_VEC 1 +#define TYPE_MAT 2 +#define TYPE_SVEC 3 +#define TYPE_SMAT 4 +#define TYPE_QUEUE 5 +#define TYPE_SETFAMILY 6 +#define TYPE_TRSACT 7 +#define TYPE_ALIST 8 +#define TYPE_MALIST 9 +#define TYPE_AGRAPH 10 +#define TYPE_SGRAPH 11 +#define TYPE_AHEAP 12 +#define TYPE_BASE 13 +#define TYPE_FSTAR 14 +#define TYPE_SEQ 15 +#define TYPE_BARRAY 16 + +#define TYPE_FILE2 32 + +#define ADDR_FLOOR16(x) do{common_charp=((char *)x)+15;x=(typeof(x))(common_charp-(((size_t)common_charp)&15));}while(0) +double SQRT(double x); + +/* random */ +#define rnd(a) (random()%(a)) +#define prob(a) ((random()%65536)<(int)((a)*65536.0)) + +#define MARK 1 +#define UNMARK 0 +#define TRUE 1 +#define FALSE 0 + +/* equal/inequal with allowing numerical error for double */ +#define ISEQUAL(a,b) ((a)-(b)ISEQUAL_VALUE) +#define ISLESS(a,b) ((b)-(a)>ISEQUAL_VALUE) +#define RANGE(a,b,c) (((a)<=(b))&&((b)<=(c))) +#define BITRM(a,b) ((a)-=((a)&(b))); + +/* macro for getting maximum/minimum of two values */ +#define MAX(a,b) (((a)>(b))?(a):(b)) +#define ENMAX(a,b) ((a)=(((a)>(b))?(a):(b))) +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define ENMIN(a,b) ((a)=(((a)<(b))?(a):(b))) + +/* error routine */ +#define error(mes,x) do{ERROR_MES=mes;fprintf(stderr,"%s\n",mes);x;}while(0) +#define error_num(mes,n,x) do{ERROR_MES=mes;fprintf(stderr,"%s: %g\n",mes,(double)(n));x;}while(0) +#define error_range(f,x,y,mes) do{if(!RANGE((x),(f),(y))){ERROR_MES=mes;fprintf(stderr,"%s: %g\n",mes,(double)(f));EXIT;}}while(0) +#define error_str(mes,s,x) do{ERROR_MES=mes;fprintf(stderr,"%s: %s\n",mes,s);x;}while(0) +#define print_err(...) fprintf(stderr,__VA_ARGS__) +#define print_mes(S,...) do{if(((S)->flag)&1)fprintf(stderr,__VA_ARGS__);}while(0) +//#define print_fname(s,fname,...) do{if(fname)fprintf(stderr,s,fname,__VA_ARGS__);}while(0) +#define print_fname(s,fname,...) do{if(fname)fprintf(stderr,s,fname);}while(0) +#define mfree(...) mfree_(NULL, __VA_ARGS__, (void *)1) +#define mfree2(...) mfree2_(NULL, __VA_ARGS__, (void *)1) + + +/* basic array operations and loops */ +#define ARY_FILL(f,start,end,c) do{for(common_size_t=(size_t)(start);common_size_t<(size_t)(end);common_size_t++)(f)[common_size_t]=(c);}while(0) +//#define ARY_FLOOP(V,i,x) for( (i)=0,x=(V).v[0] ; (i)<(V).t ; (i)++,x=(V).v[i]) +//#define ARY_BLOOP(V,i,x) for( (i)=(V).t-1,x=i>0?(V).v[i]:0 ; (i)>=0 ; (i)--,(x)=(i)>0?(V).v[i]:0) +#define FLOOP(i,x,y) for ((i)=(x) ; (i)<(y) ; (i)++) +#define BLOOP(i,x,y) for ((i)=(x) ; ((i)--)>(y) ; ) +#define MLOOP(z,x,M) for ((z)=(x) ; *(z)<(M) ; (z)++) +/* binary search: return maximum index no larger than c */ +#define BIN_SRCH(x,a,s,t,c) \ + do {\ + x=s; common_size_t=t; while ( x=(size_t)(end)){reallocx_(f,end,MAX((end)*2+16,(i)+1),e,x);end=MAX((end)*2,(i)+1);}}while(0) +#define reallocz(f,end,i,x) do{if((size_t)(i)>=(size_t)(end)){end=MAX((end)*2,(i)+1);realloc2(f,end,x);}}while(0) +#define realloci(f,i,x) do{if(!((i)&((i)-1)))realloc2(f,(i)*2+1,x);}while(0) + +/* basic array operations */ +#define ARY_REALLOCX(f,i,e,x) reallocz((f).v,(f).end,i,e,x) +#define ARY_REALLOCZ(f,i,x) reallocz((f).v,(f).end,i,x) +#define ARY_DUP(f,p,end,x) do{malloc2(f,end,x);memcpy(f,p,sizeof(*(f))*(end));}while(0) +#define ARY_MAX(m,i,f,x,y) do{(m)=(f)[x];(i)=(x);FLOOP(common_INT,(x)+1,(y))if((m)<(f)[common_INT]){(i)=common_INT;(m)=(f)[i];}}while(0) +#define ARY_MIN(m,i,f,x,y) do{(m)=(f)[x];(i)=(x);FLOOP(common_INT,(x)+1,y)if((m)>(f)[common_INT]){(i)=common_INT;(m)=(f)[i];}}while(0) +#define ARY_SUM(f,v,x,y) do{(f)=0;FLOOP(common_INT,x,y)(f)+=(v)[common_INT];}while(0) +#define ARY_NORM(f,v,b) do{(f)=0;FLOOP(common_INT,0,b)(f)+=(v)[common_INT]*(v)[common_INT];(f)=sqrt(f);}while(0) +#define ARY_NORMALIZE(v,b) do{ARY_NORM(common_double,v,b);FLOOP(common_INT,0,b)(v)[common_INT]/=common_double;}while(0) +#define ARY_INPRO(f,u,v,b) do{(f)=0;for (common_INT=0 ; common_INT<(b)-3 ; common_INT+=4) (f)+=(u)[common_INT]*(v)[common_INT] + (u)[common_INT+1]*(v)[common_INT+1] + (u)[common_INT+2]*(v)[common_INT+2] + (u)[common_INT+3]*(v)[common_INT+3]; if (common_INT+1<(b)){(f)+=(u)[common_INT]*v[common_INT]+(u)[common_INT+1]*(v)[common_INT+1]; if (common_INT+2<(b)) (f)+=(u)[common_INT+2]*(v)[common_INT+2];} else if (common_INT<(b)) (f)+=(u)[common_INT]*(v)[common_INT];}while(0) +#define ARY_DIST(f,u,v,b) do{(f)=0;for (common_INT=0 ; common_INT<(b) ; common_INT++) (f)+=((u)[common_INT]-(v)[common_INT])*((u)[common_INT]-(v)[common_INT]); (f)=sqrt(f);}while(0) + + +/* macros for permutation arrays */ +#define ARY_INIT_PERM(f,end) do{FLOOP(common_INT,0,(INT)end)(f)[common_INT]=common_INT;}while(0) +#define ARY_INV_PERM_(f,p,end) do{ARY_FILL(f,0,end,-1);FLOOP(common_INT,0,end)if((p)[common_INT]>=0&&(p)[common_INT]<(end))(f)[(p)[common_INT]]=common_INT;}while(0) +#define ARY_INV_PERM(f,p,end,x) do{malloc2(f,end,x);ARY_INV_PERM_(f,p,end);}while(0) +#define ARY_RND_PERM_(f,end) do{(f)[0]=0;FLOOP(common_INT,1,end){common_INT2=rnd(common_INT+1);(f)[common_INT]=(f)[common_INT2];(f)[common_INT2]=common_INT;}}while(0) +#define ARY_RND_PERM(f,end,x) do{malloc2(f,end,x);ARY_RND_PERM_(f,end);}while(0) + /* permute f so that f[i]=f[p[i]] (inverse perm). p will be destroyed (filled by end) */ +#define ARY_INVPERMUTE_(f,p,s,end) do{ FLOOP(common_INT,0,end){ if ( (p)[common_INT]<(end) ){ (s)=(f)[common_INT]; do { common_INT2=common_INT; common_INT=(p)[common_INT]; (f)[common_INT2]=(f)[common_INT]; (p)[common_INT2]=end; }while ( (p)[common_INT]<(end) ); (f)[common_INT2] = (s);}}}while(0) + /* permute f so that f[i]=f[p[i]] (inverse perm). not destroy p by allocating tmp memory */ +#define ARY_INVPERMUTE(f,p,s,end,x) do{ calloc2(common_pnt,end,x);FLOOP(common_INT,0,end){ if ( common_pnt[common_INT]==0 ){ (s)=(f)[common_INT]; do{ common_INT2=common_INT; common_INT=(p)[common_INT]; (f)[common_INT2]=(f)[common_INT]; common_pnt[common_INT2]=1; }while( common_pnt[common_INT]==0 ); (f)[common_INT2] = (s);}} free(common_pnt); }while(0) +//#define ARY_PERM(f,p,s,mark,end) do{FLOOP(common_size_t,0,end){ }}while(0) + +/* macros for printing (writing to file) arrays */ +#define ARY_PRINT(f,x,y,a) do{FLOOP(common_size_t,x,y)printf(a,(f)[common_size_t]);printf("\n");}while(0) +#define ARY_FPRINT(fp,f,x,y,a) do{FLOOP(common_size_t,(size_t)x,(size_t)y)fprintf((FILE *)fp,a,(f)[common_size_t]);fputc('\n',(FILE *)fp);}while(0) + +#define ST_MAX(m,i,S,a,x,y) do{(m)=(S)[x].a;(i)=(x);FLOOP(common_INT,(x)+1,y)if((m)<(S)[common_INT].a){(i)=common_INT;(m)=(S)[i].a;}}while(0) +#define ST_MIN(m,i,S,a,x,y) do{(m)=(S)[x].a;(i)=(x);FLOOP(common_INT,(x)+1,y)if((m)>(S)[common_INT].a){(i)=common_INT;(m)=(S)[i].a;}}while(0) +#define ST_SUM(k,S,a,x,y) do{(k)=0;FLOOP(common_INT,x,y)(k)+=(S)[common_INT].a;}while(0) +#define ST_FILL(S,a,start,end,c) do{for(common_INT=(start);common_INT<(end);common_INT++)(S)[common_INT].a = (c);}while(0) +#define ST_PRINT(S,a,x,y,f) do{FLOOP(common_size_t,x,y)printf(f,(S)[common_size_t].a );printf("\n");}while(0) + + +/* macros for QUE type structure (have .s, .t, .v) */ +#define QUE_EXP(f,a,x) do{reallocx((f).v,a,(f).end,(f).t,e,x);}while(0) +#define QUE_INS(f,b) do{(f).v[(f).t++]=(b);}while(0) +#define QUE_INSZ(f,a,x) do{reallocz((f).v,(f).end,(f).t+1,x);ARY_INS(f,a);}while(0) +#define QUE_INIT_PERM(f,end) do{ARY_INIT_PERM((f).v,(end));(f).t=(end);(f).s=0;}while(0) + +/* a macro for open files with exiting if an error occurs */ +#ifdef _MSC_ + #define fopen2(f,a,b,x) do{fopen_s(&f,a,b);if(!f){ERROR_MES="file open error";fprintf(stderr,"file open error: file name %s, open mode %s\n",a,b);x;}}while(0) +#else + #define fopen2(f,a,b,x) do{if(!((f)=fopen(a,b))){ERROR_MES="file open error";fprintf(stderr,"file open error: file name %s, open mode %s\n",a,b);x;}}while(0) +#endif +#define FILE2_open(f,a,b,x) do{if(a)fopen2((f).fp,a,b,x);else(f).fp=NULL;malloc2((f).buf_org,FILE2_BUFSIZ+1,x);(f).buf=(f).buf_org;(f).buf_end=(f).buf_org-1;(f).bit=0;*(f).buf=0;}while(0) +#define FILE2_open_(f,a,x) do{(f).fp=a;malloc2((f).buf_org,FILE2_BUFSIZ+1,x);(f).buf=(f).buf_org;(f).buf_end=(f).buf_org-1;(f).bit=0;*(f).buf=0;}while(0) + +/* macros for allocating memory with exiting if an error occurs */ +#define free2(a) do{if(a){free(a);(a)=NULL;}}while(0) +#define free2d(a) do{if(a){free2((a)[0]);free(a);(a)=NULL;}}while(0) +#define fclose2(a) do{if(a){fclose(a);(a)=NULL;}}while(0) + +/* macros for reading integers from file, d=0 read one-line, d=1 read all file */ +//#define ARY_SCAN(k,a,fp,d) do{(k)=0;do{do{FILE2_read_##a(&(fp));}while((FILE_err&6)==8-(d)*4);if(FILE_err&(4-2*(d)))break;(k)++;}while((FILE_err&(3-(d)))==0);}while(0) +#define ARY_SCAN(num,type,fp,d) do{(num)=0;do{do{FILE2_read_##type(&(fp));}while((FILE_err&((d)*5))==5);if(RANGE(5+(int)(d),FILE_err,6))break;(num)++;}while((FILE_err&(3-(int)(d)))==0);}while(0) +#define ARY_READ_LINE(f,type,num,fp) do{(num)=0;do{(f)[num]=FILE2_read_##type(&(fp));(num)+=(FILE_err&4)?0:1;}while((FILE_err&3)==0);}while(0) +#define ARY_READ(f,type,num,fp) do{FLOOP(common_size_t,0,(size_t)num){do{(f)[common_size_t]=FILE2_read_##type(&(fp));}while((FILE_err&6)==4);if(FILE_err&2)break;}}while(0) +#define ARY_LOAD(f,type,num,fname,d,x) do{FILE2_open(common_FILE2,fname,"r",x);ARY_SCAN(num,type,common_FILE2,d);malloc2(f,(num)+1,x);FILE2_reset(&common_FILE2);ARY_READ(f,type,num,common_FILE2);FILE2_close(&common_FILE2);}while(0) +#define ARY_WRITE(n,f,num,q,x) do{fopen2(common_FILE,n,"w",x);ARY_FPRINT(common_FILE,f,0,num,q);fclose(common_FILE);}while(0) + +#ifndef MQUE_ONEMORE + #define MQUE_ONEMORE 1 +#endif + +/* macros for generalized queue; end mark is necessary for INTSEC */ +#define MQUE_FLOOP(V,z) for((z)=(V).v;(z)<(V).v+(V).t ; (z)++) +#define MQUE_FLOOP2(V,z,zz) for((z)=(V).v,(zz)=(z)+(V).t;(z)<(zz) ; (z)++) +#define MQUE_BLOOP(V,z) for((z)=(V).v+(V).t-1;(z)>=(V).v ; (z)--) +#define MQUE_SLOOP(V,z) for((z)=(V).v+(V).s;(z)<(V).v+(V).t ; (z)++) +#define MQUE_SLOOP2(V,z,zz) for((z)=(V).v+(V).s,(zz)=(z)+(V).t;(z)<(zz) ; (z)++) +#define MQUE_SBLOOP(V,z) for((z)=(V).v+(V).t-1;(z)>=(V).v+(V).s ; (z)--) + +#ifdef _cplusplus_ + #define MQUE_FLOOP_(V,z,s) for((z)=(V).v ; (char *)(z)<((char *)(V).v)+(V).t*(s) ; (z)=(typeof(z))(((char *)(z))+(s))) +#else + #define MQUE_FLOOP_(V,z,s) for((z)=(V).v ; (char *)(z)<((char *)(V).v)+(V).t*(s) ; (z)=(void *)(((char *)(z))+(s))) +#endif + +#define MQUE_MLOOP(V,z,M) for((z)=(V).v; *((QUEUE_INT *)z)<(M) ; (z)++) + +/// !!! errr MQUE_INTSEC !!!!! +#define MQUE_INTSEC(f,U,V) do{\ +common_INT=0;(f)=0;\ +FLOOP(common_INT2,0,(U).t){\ + while(*((QUEUE_INT *)(&((V).v[common_INT])))<*((QUEUE_INT *)(&((U).v[common_INT2])))&&common_INT<(V).t){ \ + if (++common_INT >= (V).t) break;\ + }if(*((QUEUE_INT *)(&((V).v[common_INT])))==*((QUEUE_INT *)(&((U).v[common_INT2]))))(f)++;\ +}}while(0) +#define MQUE_UNION(f,U,V) do{MQUE_INTSEC(f,U,V);(f)=(U).t+(V).t-(f);}while(0) +#define MQUE_DIF(f,U,V) do{MQUE_INTSEC(f,U,V);(f)=(U).t+(V).t-(f)-(f);}while(0) +#define MQUE_RM_DUP(V) do{\ +if((V).t>1){\ + common_INT=1;\ + FLOOP(common_INT2,1,(V).t){\ + if ( *((QUEUE_INT *)(&((V).v[common_INT2-1]))) != *((QUEUE_INT *)(&((V).v[common_INT2]))) ) (V).v[common_INT++]=(V).v[common_INT2];\ + } (V).t=common_INT;\ + }\ +}while(0) + +#define MQUE_UNIFY(V,a) do{\ +if((V).t>1){\ + common_INT=0;\ + FLOOP(common_INT2,1,(V).t){\ + if ( *((QUEUE_INT *)(&((V).v[common_INT2-1]))) != *((QUEUE_INT *)(&((V).v[common_INT2]))) ) (V).v[++common_INT]=(V).v[common_INT2];\ + else *((a*)(((QUEUE_INT *)(&((V).v[common_INT2])))+1)) += *((a*)(((QUEUE_INT *)(&((V).v[common_INT2])))+1));\ + } (V).t=common_INT+1;\ +}}while(0) + + + + +#ifndef VEC_VAL + #ifdef VEC_VAL_CHAR + #define VEC_VAL char + #define VEC_VAL2 LONG + #define VEC_VAL_END 128 + #define VEC_VAL2_END LONGHUGE + #define VEC_VALF "%hhd" + #elif defined(VEC_VAL_UCHAR) + #define VEC_VAL unsigned char + #define VEC_VAL2 LONG + #define VEC_VAL_END 256 + #define VEC_VAL2_END LONGHUGE + #define VEC_VALF "%hhu" + #elif defined(VEC_VAL_INT) + #define VEC_VAL int + #define VEC_VAL2 LONG + #define VEC_VAL_END INTHUGE + #define VEC_VAL2_END LONGHUGE + #define VEC_VALF "%d" + #else + #define VEC_VAL double + #define VEC_VAL2 double + #define VEC_VAL_END DOUBLEHUGE + #define VEC_VAL2_END DOUBLEHUGE + #define VEC_VALF "%f" + #endif +#endif + +#ifndef VEC_ID + #ifdef VEC_ID_LONG + #define VEC_ID LONG + #define VEC_ID_END LONGHUGE + #define VEC_IDF LONGF + #else + #define VEC_ID int + #define VEC_ID_END INTHUGE + #define VEC_IDF "%d" + #endif +#endif + +/* vector */ +typedef struct { + unsigned char type; // mark to identify type of the structure + VEC_VAL *v; + VEC_ID end; + VEC_ID t; +} VEC; + +extern VEC INIT_VEC; +extern PERM common_PERM, *common_PERMp; +extern VEC_VAL common_VEC_VAL, *common_VEC_VALp; +extern VEC_ID common_VEC_ID; + +/* tranpose the matrix ; counting/transpose/memory_allocate */ +#define MQUE_DELIVERY_CNT(c,jump,f,y,M) do{ \ +FLOOP(common_VEC_ID, 0, (f).t){ \ + MQUE_MLOOP( (f).v[common_VEC_ID], y, M){ \ + if( (c)[*((QUEUE_INT *)y)] == 0 ) ARY_INS(jump, *((QUEUE_INT *)y)); \ + (c)[*((QUEUE_INT *)y)]++; \ + } \ +}}while(0) +#define MQUE_DELIVERY(occ,jump,f,y,M) do{ \ +FLOOP (common_VEC_ID, 0, (f).t){ \ + MQUE_MLOOP ((f).v[common_VEC_ID], y, M){ \ + if( (occ)[*((QUEUE_INT *)y)].t == 0 ) ARY_INS( jump, *((QUEUE_INT *)y)); \ + ARY_INS( (occ)[*((QUEUE_INT *)y)], common_VEC_ID); \ + } \ +}}while(0) + + // allocate QUEUE of QUEUE, according to rows (cells of "ext" will be add to each row) +#ifdef _cplusplus_ +#define MQUE_ALLOC(Q,rows,rowt,unit,ext,x) do{ \ +common_size_t=0; \ +FLOOP (common_VEC_ID, 0, rows) common_size_t += rowt[common_VEC_ID]; \ +calloc2 (Q, (rows)+1, x); \ +malloc2 (common_pnt, (common_size_t+(rows)*(ext)+2)*((unit)internal) of rows and columns +} FILE_COUNT; + +extern FILE_COUNT INIT_FILE_COUNT; + +/* count the clms, rows, items, each row size, each column size */ +/* file types can be, array list and element list*/ +/* support transpose */ +FILE_COUNT FILE2_count (FILE2 *fp, int flag, int skip_rows, int int_rows, int skip_clms, int int_clms, FILE_COUNT_INT row_limit); + +/******************* integer array routines **************************/ + +/******************************* permutation routines ****************/ +/* permutation is given by an integer array */ + +/* sort an array of size "siz", composed of a structure of size "unit" byte + in the order of perm */ +/* use temporary memory of siz*unit byte */ +//void perm_struct (void *a, int unit, int *perm, size_t siz); + +/* SLIST:very simple one-sided list */ +void SLIST_init (int *l, int num, int siz); +void SLIST_end (int *l); +#define SLIST_INS(l,m,e) (l[e]=l[m],l[m]=e); + +#define QQSORT_ELE(a,x) ((a *)(&(common_pnt[(*((PERM *)(x)))*common_int]))) +#define QQSORT_ELEt(a,x) (((a *)&(common_pnt[(*((PERM *)(x)))*common_int]))->t) +/* quick sort macros */ +#define QSORT_TYPE(a,b) \ +b common_##a; \ +int qsort_cmp_##a (const void *x, const void *y){ \ + if ( *((b *)x) < *((b *)y) ) return (-1); else return ( *((b *)x) > *((b *)y) ); \ +} \ +int qsort_cmp__##a (const void *x, const void *y){ \ + if ( *((b *)x) > *((b *)y) ) return (-1); else return ( *((b *)x) < *((b *)y) ); \ +} \ +int qqsort_cmp_##a (const void *x, const void *y){ \ + b *xx=QQSORT_ELE(b,x), *yy=QQSORT_ELE(b,y); \ + if ( *xx < *yy ) return (-1); \ + else return ( *xx > *yy ); \ +} \ +int qqsort_cmp__##a (const void *x, const void *y){ \ + b *xx=QQSORT_ELE(b,x), *yy=QQSORT_ELE(b,y); \ + if ( *xx > *yy ) return (-1); \ + else return ( *xx < *yy ); \ +} \ +void qsort_##a (b *v, size_t siz, int unit){ \ + if ( unit == 1 || unit==-1 ) unit *= sizeof (b); \ + if (unit<0) qsort (v, siz, -unit, qsort_cmp__##a); else qsort (v, siz, unit, qsort_cmp_##a); \ +} \ +void qsort_perm__##a (b *v, size_t siz, PERM *perm, int unit){ \ + ARY_INIT_PERM(perm,(INT)siz); \ + if ( unit == 1 || unit==-1 ) unit *= sizeof (b); \ + common_int=MAX(unit,-unit); common_pnt=(char *)v; \ + if (unit<0) qsort (perm, siz, sizeof(PERM), qqsort_cmp__##a); \ + else qsort (perm, siz, sizeof(PERM), qqsort_cmp_##a); \ +} \ +PERM *qsort_perm_##a (b *v, size_t siz, int unit){ \ + PERM *perm; malloc2(perm, siz, EXIT0); \ + qsort_perm__##a (v, siz, perm, unit); return(perm); \ +} \ +size_t bin_search_##a (b *v, b u, size_t siz, int unit){ \ + size_t s=0, t; \ + b n; \ + if ( unit == 1 ) unit *= sizeof (b); \ + while (1){ \ + if ( siz-s <= 2 ){ \ + if ( u <= *((b *)(((char *)v)+unit*s)) ) return (s);\ + if ( siz == s+1 || u <= *((b *)(((char *)v)+unit*(s+1))) ) return (s+1);\ + return (s+2);\ + }\ + t = (s+siz) /2; \ + n = *((b *)(((char *)v)+unit*t));\ + if ( u < n ) siz = t; else s = t;\ + }\ +} +// bin search returns the position that is equal to u, or the smallest in larger's + +#define QSORT_TYPE_HEADER(a,b) \ +extern b common_##a; \ +int qsort_cmp_##a (const void *x, const void *y); \ +int qsort_cmp__##a (const void *x, const void *y); \ +int qqsort_cmp_##a (const void *x, const void *y); \ +int qqsort_cmp__##a (const void *x, const void *y); \ +void qsort_##a(b *v, size_t siz, int unit); \ +void qsort_perm__##a (b *v, size_t siz, PERM *perm, int unit); \ +PERM *qsort_perm_##a (b *v, size_t siz, int unit); \ +size_t bin_search_##a (b *v, b u, size_t siz, int unit); + +QSORT_TYPE_HEADER(int, int) +QSORT_TYPE_HEADER(uint, unsigned int) +QSORT_TYPE_HEADER(double, double) +QSORT_TYPE_HEADER(char, char) +QSORT_TYPE_HEADER(uchar, unsigned char) +QSORT_TYPE_HEADER(short, short) +QSORT_TYPE_HEADER(ushort, unsigned short) +QSORT_TYPE_HEADER(WEIGHT, WEIGHT) +QSORT_TYPE_HEADER(LONG, LONG) +QSORT_TYPE_HEADER(VEC_ID, VEC_ID) +QSORT_TYPE_HEADER(VEC_VAL, VEC_VAL) +QSORT_TYPE_HEADER(VEC_VAL2, VEC_VAL2) +QSORT_TYPE_HEADER(FILE_COUNT_INT, FILE_COUNT_INT) + +int qsort_cmp_VECt (const void *x, const void *y); +int qsort_cmp__VECt (const void *x, const void *y); +void qsort_VECt (VEC *v, size_t siz, int unit); +int qqsort_cmp_VECt (const void *x, const void *y); +int qqsort_cmp__VECt (const void *x, const void *y); +void qsort_perm__VECt (VEC *v, size_t siz, PERM *perm, int unit); +PERM *qsort_perm_VECt (VEC *v, size_t siz, int unit); + +/* swap macro for integer, double, char, and pointer */ +#define SWAP_INT(a,b) (common_LONG=a,a=b,b=common_LONG) +#define SWAP_DOUBLE(a,b) (common_double=a,a=b,b=common_double) +#define SWAP_size_t(a,b) (common_size_t=a,a=b,b=common_size_t) +#ifdef _cplusplus_ + #define SWAP_PNT(a,b) (common_pnt=(typeof(common_pnt))a,a=(typeof(a))b,b=(typeof(b))common_pnt) +#else + #define SWAP_PNT(a,b) (common_pnt=(void *)a,a=(void *)b,b=(void *)common_pnt) +#endif + +#define SWAP_VEC_ID(a,b) (common_VEC_ID=a,a=b,b=common_VEC_ID) +#define SWAP_FILE_COUNT_INT(a,b) (common_FILE_COUNT_INT=a,a=b,b=common_FILE_COUNT_INT) + +/* sort index(int)/WEIGHT array and return the indices of the result */ +/* perm[i*2] := rank of ith cell */ +/* perm[i*2+1] := index of ith smallest cell */ +/* flag!=NULL => opposite direction sort */ + +//int *int_index_sort (int *w, size_t siz, int flag); +//int *WEIGHT_index_sort (WEIGHT *w, size_t siz, int flag); + +/* radix sort for array of structures, by their integer members + ranging from mm to m */ +/* sort array "perm" according to (int/void*) array "a". + if perm==NULL, allocate memory and for perm */ +/* return the permutation array of the result of the sorting + in the decreasing order if unit<0 (unimplemented!!!) */ +int *radix_sort (void *a, size_t siz, int unit, int mm, int m, int *perm); + +/* permutate structure array *tt of unit size unit of size num, according to perm array *pp */ +/* num has to be output-file\n"); + exit (1); +} +open ( TABLEFILE, ">$ARGV[0]" ); +#@lines = ; +$count = 1; +%numbers = (); +$c=1; +$numflag=0; + +$sep = " "; +$ignore[1] = $ignore[2] = $ignore[3] = $ignore[4] = $ignore[5] = $ignore[6] = $ignore[7] = $ignore[8] = $ignore[9] = 0; + +while ( $ARGC > $c ){ + if ( $ARGV[$c] eq "-1" ){ $ignore[1] = 1; } + elsif ( $ARGV[$c] eq "-2" ){ $ignore[2] = 1; } + elsif ( $ARGV[$c] eq "-3" ){ $ignore[3] = 1; } + elsif ( $ARGV[$c] eq "-4" ){ $ignore[4] = 1; } + elsif ( $ARGV[$c] eq "-5" ){ $ignore[5] = 1; } + elsif ( $ARGV[$c] eq "-6" ){ $ignore[6] = 1; } + elsif ( $ARGV[$c] eq "-7" ){ $ignore[7] = 1; } + elsif ( $ARGV[$c] eq "-8" ){ $ignore[8] = 1; } + elsif ( $ARGV[$c] eq "-9" ){ $ignore[9] = 1; } + elsif ( $ARGV[$c] eq "-n" ){ + $numflag = 1; + $count = 2; + print TABLEFILE "1 __numbers__\n"; + } + else { $sep = $ARGV[$c]; } + $c++; +} + +while (){ + $_ =~ s/[\r\n]//g; + chomp; + $_ =~ s/$sep$sep/$sep/g; + $_ =~ s/\t/$sep/g; + @eles = split($sep, $_); + $all = @eles; + $c = 1; + foreach $item( @eles ) { + if ( $c < 10 && $ignore[$c] == 1 ){ + if ( $item ne "" ){ + print $item; + if ($c<$all){ print " ";} + $c++; + } + } else { + if ( $item ne "" ){ + if ( $numflag==1 ){ + $item2 = $item; + $item2 =~ s/[0-9]//g; + if ( $item2 eq "" ){ + print "1"; + if ($c<$all){ print " ";} + $c++; + next; + } + } + if (!exists $numbers{$item}) { + $numbers{$item} = $count; + print TABLEFILE "$count $item\n"; + $count++; + } + print "$numbers{$item}"; + if ($c<$all){ print " ";} + $c++; + } + } + } + print "\n" +} diff --git a/rql-backend/shd31/transpose.pl b/rql-backend/shd31/transpose.pl new file mode 100644 index 0000000..625f48e --- /dev/null +++ b/rql-backend/shd31/transpose.pl @@ -0,0 +1,33 @@ +#!/usr/bin/perl + +#transpose.pl transposes the set-family-file/01 matrix)/transaction-data +# from horizontal representation to virtical representation +# if a number x is wrtten in yth line in the input file, then y is written in +# the xth line in the output file. +# Both input and output file are from/to standard input/output + +$ARGC = @ARGV; +if ( $ARGC < 0 ){ + printf ("transpose.pl [separator] < input-file > output-file\n"); + exit (1); +} +$count = 0; +$m = 0; + +$sep = " "; +if ( $ARGC > 0 ){ $sep = $ARGV[0]; } + +while (){ + chomp; + @eles = split($sep, $_); + $all = @eles; + foreach $item( @eles ){ + push ( @{$t[$item]}, $count ); + if ( $item > $m ){ $m = $item; } + } + $count++; +} + +for ( $i=0 ; $i<=$m ; $i++ ){ print "@{$t[$i]}\n";} + + diff --git a/rql-backend/shd31/undo.c b/rql-backend/shd31/undo.c new file mode 100644 index 0000000..011a696 --- /dev/null +++ b/rql-backend/shd31/undo.c @@ -0,0 +1,95 @@ +/****************************/ + +/* ALIST-based UNDO operators for library functions + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* available for ALIST and AGRAPH */ + +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + + +/* NOTICE: include all libraries before including "undo.c". + only the libraries include before is considered, and will be availabale. */ + +#ifndef _undo_c_ +#define _undo_c_ + +#include"undo.h" +#include"base.c" + +ALIST_UNDO *ALISTundo_list; +BASE ALISTundo_base; + +/* initialization of UNDO list */ +void ALISTundo_init (){ + BASE_alloc (&ALISTundo_base, sizeof(ALIST_UNDO), 16384); + ALISTundo_list = (ALIST_UNDO *)(&ALISTundo_list); +} + +/* termination */ +void ALISTundo_end (){ + BASE_end (&ALISTundo_base); +} + +/* store one operation by inserting to UNDO list */ +void ALISTundo_ins ( ALIST_TYPE type, void *s, UNDO_INT i, UNDO_INT j){ + ALIST_UNDO *m; + m = (ALIST_UNDO *)BASE_new ( &ALISTundo_base); + m->type = type; + m->s = s; + m->i = i; + m->j = j; + m->nxt = ALISTundo_list; + ALISTundo_list = m; +} + +/* One undo. return 0 if list is empty, or STOPmark appears, return non-zero otherwise. */ +int ALISTundo_iter (){ + ALIST_UNDO *m; + if ( ALISTundo_list == (ALIST_UNDO *)(&ALISTundo_list) ) return (0); + m = ALISTundo_list; + ALISTundo_list = m->nxt; + switch ( m->type ){ + case U_STOP: BASE_del (&ALISTundo_base, m); return (0); + case U_MALIST_rm: MALIST_rm ( (MALIST *)(m->s), m->i, 0); + break; case U_MALIST_ins: MALIST_ins_nxt ( (MALIST *)(m->s), m->i, m->j, 0); + break; case U_ALIST_rm: ALIST_rm ( (ALIST *)(m->s), m->i, 0); + break; case U_ALIST_ins: ALIST_ins_nxt ( (ALIST *)(m->s), m->i, m->j, 0); +#ifdef _agraph_h_ + break; case U_AGRAPH_edge_num: ((AGRAPH *)(m->s))->edge_num += m->i; + break; case U_AGRAPH_arc_num: ((AGRAPH *)(m->s))->arc_num += m->i; break; +#endif + } + BASE_del (&ALISTundo_base, m); + return (1); +} + +/* continuously undo until STOPmark appears */ +void ALISTundo (){ while ( ALISTundo_iter () ); } + +/* clear UNDO list until STOPmark appears, or become empty list */ +void ALISTundo_clear (){ + ALIST_UNDO *m; + while (1){ + if ( ALISTundo_list == (ALIST_UNDO *)(&ALISTundo_list) ) return; + m = ALISTundo_list; + ALISTundo_list = m->nxt; + if ( m->type == U_STOP ){ + BASE_del (&ALISTundo_base, m); + return; + } + BASE_del (&ALISTundo_base, m); + } +} + +/* insert STOPmark in UNDO list */ +void ALISTundo_ins_stop (){ ALISTundo_ins (U_STOP, NULL, -1, -1);} + +#endif + diff --git a/rql-backend/shd31/undo.h b/rql-backend/shd31/undo.h new file mode 100644 index 0000000..c5ed4cb --- /dev/null +++ b/rql-backend/shd31/undo.h @@ -0,0 +1,72 @@ +/* ALIST-based UNDO operators for library functions + 12/Apr/2001 by Takeaki Uno e-mail:uno@nii.jp, + homepage: http://research.nii.ac.jp/~uno/index.html */ +/* available for ALIST and AGRAPH */ + +/* This program is available for only academic use, basically. + Anyone can modify this program, but he/she has to write down + the change of the modification on the top of the source code. + Neither contact nor appointment to Takeaki Uno is needed. + If one wants to re-distribute this code, please + refer the newest code, and show the link to homepage of + Takeaki Uno, to notify the news about the codes for the users. */ + + +#ifndef _undo_h_ +#define _undo_h_ + +#ifdef ALIST_ID_LONG + #define UNDO_INT LONG + #define UNDO_INT_END LONGHUGE +#else + #define UNDO_INT int + #define UNDO_INT_END INTHUGE +#endif + +#include"base.h" +#include"alist.h" + +/* structure for Undo information */ +typedef struct _ALIST_UNDO { + struct _ALIST_UNDO *nxt; + char type; + void *s; + UNDO_INT i; + UNDO_INT j; +} ALIST_UNDO; + +/* enuemration type for Undo operations */ +typedef enum { + U_STOP, + U_MALIST_ins, + U_MALIST_rm, + U_ALIST_ins, + U_ALIST_rm, + U_AGRAPH_edge_num, + U_AGRAPH_arc_num, +} ALIST_TYPE; + +/* initialization of UNDO list */ +void ALISTundo_init (); + +/* termination */ +void ALISTundo_end (); + +/* store one operation by inserting to UNDO list */ +void ALISTundo_ins ( ALIST_TYPE type, void *s, UNDO_INT i, UNDO_INT j); + +/* One undo. return 0 if list is empty, or STOPmark appears, return non-zero otherwise. */ +int ALISTundo_iter (); + +/* continuously undo until STOPmark appears */ +void ALISTundo (); + +/* clear UNDO list until STOPmark appears, or become empty list */ +void ALISTundo_clear (); + +/* insert STOPmark in UNDO list */ +void ALISTundo_ins_stop (); + + +#endif + diff --git a/rql-backend/shd31/untransnum.pl b/rql-backend/shd31/untransnum.pl new file mode 100644 index 0000000..1690413 --- /dev/null +++ b/rql-backend/shd31/untransnum.pl @@ -0,0 +1,51 @@ +#!/usr/bin/perl + +# transform the numbers to the strings according to the table file +# basically, this script is for untransform the numbers transformed by +# the transnum.pl + +use Text::ParseWords; + +$ARGC = @ARGV; +if ( $ARGC < 1 ){ + # error routine + printf ("untransnum.pl: output-table-file [separator] < input-file > output-file\n"); + exit (1); +} + # initialization +open (TABLEFILE, "<$ARGV[0]" ); +%numbers = (); +$c=0; +$sep=" "; $sep2=" "; +if ( $ARGC >1 ){ $sep = $ARGV[1]; } # separator +if ( $ARGC >2 ){ $sep2 = $ARGV[2]; } # separator + + # read transform-table +while (){ + chomp; + $e0 = $_; $e1 = $_; + $e0 =~ s/ .*$//; + $e1 =~ s/^[^ ]* //; + $numbers{$e0} = $e1; + $c++; +} + + # read transform-file +while (){ + $_ =~ s/[\r\n]//g; + chomp; + $_ =~ s/$sep$sep/$sep/g; + @eles = split($sep, $_); + $all = @eles; + $c = 0; + foreach $item( @eles ){ + if ( $item < 0 ){ + print "*"; + } elsif (!exists $numbers{$item}) { + print "$item"; + } else { print "$numbers{$item}"; } + $c++; + if ($c<$all){ print $sep2;} + } + print "\n" +} diff --git a/rql-backend/shd31/vec.c b/rql-backend/shd31/vec.c new file mode 100644 index 0000000..e60dd60 --- /dev/null +++ b/rql-backend/shd31/vec.c @@ -0,0 +1,731 @@ +/* library for vector and sparse vector, and matrix */ +/* Takeaki Uno 27/Dec/2008 */ + +#ifndef _vec_c_ +#define _vec_c_ + +#include"vec.h" +#include"stdlib2.c" +#include"queue.c" + +MAT INIT_MAT = {TYPE_MAT,NULL,0,NULL,0,0,NULL,NULL,0,0,NULL,NULL}; +SVEC INIT_SVEC_ELE = {0,0}; +SVEC INIT_SVEC = {TYPE_SVEC,NULL,0,0}; +SMAT INIT_SMAT = {TYPE_SMAT,NULL,0,NULL,0,0,NULL,NULL,0,0,0}; +SETFAMILY INIT_SETFAMILY = INIT_SETFAMILY_; + +QSORT_TYPE (SVEC_VAL, SVEC_VAL) +QSORT_TYPE (SVEC_VAL2, SVEC_VAL2) + +/* allocate memory according to rows and rowt */ +void VEC_alloc (VEC *V, VEC_ID clms){ + *V = INIT_VEC; + V->end = clms; + calloc2 (V->v, clms+1, EXIT); +} + +/* terminate routine for VEC */ +void VEC_end (VEC *V){ + free2 (V->v); + *V = INIT_VEC; +} + +/* allocate memory according to rows and rowt */ +void MAT_alloc (MAT *M, VEC_ID rows, VEC_ID clms){ + VEC_ID i, clms2 = clms+(clms%2?1:2); + calloc2 (M->v, rows+1, EXIT); + calloc2 (M->buf_org, clms2 * (rows+1)+4, {free(M->v);EXIT;}); + M->buf = M->buf_org; ADDR_FLOOR16(M->buf); + M->end = rows; + M->clms = clms; + FLOOP (i, 0, rows){ + M->v[i].end = M->v[i].t = clms; + M->v[i].v = M->buf + i*(clms2); +// printf ("%p %p\n", M->buf, M->v[i].v); + } +} + +/* terminate routine for MAT */ +void MAT_end (MAT *M){ + free2 (M->buf_org); + free2 (M->buf2_org); + free2 (M->v); + *M = INIT_MAT; +} + +/* allocate memory */ +void SVEC_alloc (SVEC *V, VEC_ID end){ + *V = INIT_SVEC; + calloc2 (V->v, end+1, EXIT); + V->end = end; + V->t = 0; +} + +/* terminate routine for SVEC */ +void SVEC_end (SVEC *V){ + free2 (V->v); + *V = INIT_SVEC; +} + +/* allocate memory according to rows and rowt */ +void SMAT_alloc (SMAT *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles){ + VEC_ID i; + if ( eles == 0 ) ARY_SUM (M->ele_end, rowt, 0, rows); else M->ele_end = eles; + calloc2 (M->buf, M->ele_end*((M->flag&LOAD_DBLBUF)?2:1) +rows +2, EXIT); + malloc2 (M->v, rows+1, {free(M->buf);EXIT;}); + ARY_FILL (M->v, 0, rows, INIT_SVEC); + M->end = rows; + M->clms = clms; + if ( rowt ){ + FLOOP (i, 0, rows){ + M->v[i].v = i? M->v[i-1].v + rowt[i-1] +1: M->buf; + M->v[i].end = rowt[i]; + } + } +} + +/* terminate routine for MAT */ +void SMAT_end (SMAT *M){ + free2 (M->buf); + free2 (M->buf2); + free2 (M->v); + *M = INIT_SMAT; +} + + + +/* allocate memory according to rows and rowt */ +/* if eles == 0, compute eles from rowt and rows */ +void SETFAMILY_alloc (SETFAMILY *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles){ + VEC_ID i; + char *buf; + if ( eles == 0 ) ARY_SUM (M->ele_end, rowt, 0, rows); else M->ele_end = eles; + calloc2 (buf, (M->ele_end*((M->flag&LOAD_DBLBUF)?2:1) +((M->flag&LOAD_DBLBUF)?MAX(rows,clms):rows)+2)*M->unit, EXIT); + M->buf = (QUEUE_INT *)buf; + malloc2 (M->v, rows+1, {free(M->buf);EXIT;}); + ARY_FILL (M->v, 0, rows, INIT_QUEUE); + M->end = rows; + M->clms = clms; + if ( rowt ){ + FLOOP (i, 0, rows){ + M->v[i].v = (QUEUE_INT *)buf; + buf += (rowt[i] +1)*M->unit; + M->v[i].end = rowt[i]+1; + } + } +} + +/* allocate memory according to rows and rowt */ +/* if eles == 0, compute eles from rowt and rows */ +void SETFAMILY_alloc_weight (SETFAMILY *M){ + VEC_ID i; + calloc2 (M->w, M->end +1, EXIT); + calloc2 (M->wbuf, M->ele_end*((M->flag&LOAD_DBLBUF)?2:1)+1, {free(M->w);EXIT;}); + FLOOP (i, 1, M->t) M->w[i] = i? M->w[i-1] + M->v[i-1].t: M->wbuf; +} + +/* terminate routine for MAT */ +void SETFAMILY_end (SETFAMILY *M){ + mfree (M->buf, M->buf2, M->v, M->rw, M->cw, M->wbuf, M->w); + *M = INIT_SETFAMILY; +} + +/****************************************************************/ +/****************************************************************/ +/****************************************************************/ + +/* read binary file for MAT */ +/* each unit-byte will be one number. if unit<0, the sign of unit is flipped, and each value is minesed the half of the maximum */ +void MAT_load_bin (MAT *M, FILE2 *fp, int unit){ + VEC_ID flag=0, i, j, jj; + size_t siz=0; + VEC_VAL z, neg=0; + + if ( unit < 0 ){ + unit = -unit; flag = 1; neg=128; + FLOOP (jj, 0, unit-1) neg *= 256; + } + if ( M->t == 0 ){ // determine #rows if M->t is 0 (not specified) + fseek(fp->fp, 0, SEEK_END); + siz = ftell(fp->fp); + fseek(fp->fp, 0, SEEK_SET); + M->t = (VEC_ID)(siz / unit / M->clms); + if ( M->flag & LOAD_TPOSE ) SWAP_VEC_ID (M->t, M->clms); + } + MAT_alloc (M, M->t, M->clms); if (ERROR_MES) return; + M->end = M->t; + FLOOP (i, 0, M->t){ + FLOOP (j, 0, M->clms){ + z=0; FLOOP (jj, 0, unit){ z *= 256; z += FILE2_getc (fp); } + if ( flag ) z -= neg; + if ( M->flag & LOAD_TPOSE ) M->v[j].v[i] = z; + else M->v[i].v[j] = z; + } + } +} + +/* segmentation fault for illegal files */ +/* count/read the number in file for MAT */ +/* if *rows>0, only read count the numbers in a row, for the first scan. */ +void MAT_file_load (MAT *M, FILE2 *fp){ + QUEUE_ID c; + VEC_ID t=0; + double p; + + for (t=0 ; (FILE_err&2)==0 ; t++){ + ARY_SCAN (c, double, *fp, 0); + if ( M->flag & LOAD_TPOSE ){ + if ( M->t == 0 ){ M->t = c; if ( M->clms>0 ) break; } + } else if ( M->clms == 0 ){ M->clms = c; if ( M->t>0 ) break; } + if ( c == 0 ) t--; + } + if ( M->flag & LOAD_TPOSE ){ if ( M->clms==0 ) M->clms = t;} else if ( M->t==0 ) M->t = t; + FILE2_reset (fp); + M->end = M->t; + MAT_alloc (M, M->t, M->clms); if (ERROR_MES) return; + FLOOP (t, 0, (M->flag&LOAD_TPOSE)? M->clms: M->t){ + FLOOP (c, 0, (M->flag&LOAD_TPOSE)? M->t: M->clms){ + p = FILE2_read_double(fp); + if ( FILE_err==1 || FILE_err==2 ) break; + if ( M->flag&LOAD_TPOSE ) M->v[c].v[t] = p; + else M->v[t].v[c] = p; + if ( FILE_err==5 || FILE_err==6 ) break; + } + FLOOP (c, c, (M->flag&LOAD_TPOSE)? M->t: M->clms){ + if ( M->flag&LOAD_TPOSE ) M->v[c].v[t] = 0; + else M->v[t].v[c] = 0; + } + if ( !FILE_err ) FILE2_read_until_newline (fp); + } +} + +/* load file with switching the format according to the flag */ +void MAT_load (MAT *M){ + FILE2 fp = INIT_FILE2; + int unit=0; +#ifdef USE_MATH + VEC_ID i; +#endif + if ( M->flag & VEC_LOAD_BIN ) unit = 1; + else if ( M->flag & VEC_LOAD_BIN2 ) unit = 2; + else if ( M->flag & VEC_LOAD_BIN4 ) unit = 4; + if ( M->flag & VEC_LOAD_CENTERIZE ) unit = -unit; + + FILE2_open (fp, M->fname, "rb", EXIT); + if ( unit ) MAT_load_bin (M, &fp, unit); + else MAT_file_load (M, &fp); + + FILE2_close (&fp); if (ERROR_MES) EXIT; +#ifdef USE_MATH + if ( M->flag&VEC_NORMALIZE ) FLOOP (i, 0, M->t) ARY_NORMALIZE (M->v[i].v,M->v[i].t); +#endif + print_mes (M, "mat: %s ,#rows %d ,#clms %d\n", M->fname, M->t, M->clms); +} + + +/* scan file and read the numbers for SMAT */ +/* flag&1? SMAT, SETFAMILY, flag&2? tuple list format: array list :*/ +void SMAT_file_load (SMAT *M, FILE2 *fp){ + SVEC_VAL z=0; + VEC_ID flag= (M->type==TYPE_SMAT), t, x, y; + FILE_COUNT C; + + C = FILE2_count (fp, (M->flag&(LOAD_ELE+LOAD_TPOSE)) | FILE_COUNT_ROWT, 0, 0, 0, 0, 0); + if ( M->clms == 0 ) M->clms = C.clms; + if ( M->t == 0 ) M->t = C.rows; + if ( flag ) SMAT_alloc (M, M->t, C.rowt, M->clms, 0); + else SETFAMILY_alloc ((SETFAMILY *)M, M->t, C.rowt, M->clms, 0); + free2 (C.rowt); + if ( ERROR_MES ) return; + FILE2_reset (fp); + t=0; + do { + if ( M->flag&LOAD_ELE ){ + x = (VEC_ID)FILE2_read_int (fp); + y = (VEC_ID)FILE2_read_int (fp); + if ( flag ) z = FILE2_read_double (fp); + if ( FILE_err&4 ) goto LOOP_END2; + FILE2_read_until_newline (fp); + } else { + x = t; + y = (VEC_ID)FILE2_read_int (fp); + if ( FILE_err&4 ) goto LOOP_END2; + if ( flag ) z = FILE2_read_double (fp); + } + if ( M->flag&LOAD_TPOSE ) SWAP_VEC_ID (x, y); +// printf ("%d %d %d %d\n", x, M->t, y, M->clms); + if ( y >= M->clms || x >= M->t ) goto LOOP_END2; +// printf ("## %d %d\n", x, y); + if ( flag ){ + M->v[x].v[M->v[x].t].i = y; + M->v[x].v[M->v[x].t].a = z; + M->v[x].t++; + } else QUE_INS (((SETFAMILY *)M)->v[x], y); + LOOP_END2:; + if ( !(M->flag&LOAD_ELE) && (FILE_err&3) ){ t++; if ( t >= M->t ) break; } + } while ( (FILE_err&2)==0 ); +} + +/* scan file and read the numbers for SMAT */ +/* flag&1? SMAT, SETFAMILY, flag&2? tuple list format: array list :*/ +void SETFAMILY_load_weight (SETFAMILY *M){ + FILE2 fp = INIT_FILE2; + VEC_ID i; + QUEUE_ID j; + if ( M->flag&LOAD_TPOSE ) error ("transope and weight can't be specified simultaneously", EXIT); + FILE2_open (fp, M->wfname, "r", EXIT); + SETFAMILY_alloc_weight (M); + FLOOP (i, 0, M->t){ + FLOOP (j, 0, M->v[i].t) + M->w[i][j] = (WEIGHT)FILE2_read_double (&fp); + FILE2_read_until_newline (&fp); + } +} + +void SETFAMILY_load_column_weight (SETFAMILY *M){ + int i; +#ifdef WEIGHT_DOUBLE + ARY_LOAD (M->cw, double, i, M->cwfname, 1, EXIT); +#else + ARY_LOAD (M->cw, int, i, M->cwfname, 1, EXIT); +#endif + if ( i < M->clms ){ realloc2 (M->cw, M->clms+1, EXIT); ARY_FILL (M->cw, i, M->clms+1, 0); } +} + +void SETFAMILY_load_row_weight (SETFAMILY *M){ + int i; +#ifdef WEIGHT_DOUBLE + ARY_LOAD (M->rw, double, i, M->rwfname, 1, EXIT); +#else + ARY_LOAD (M->rw, int, i, M->rwfname, 1, EXIT); +#endif + if ( i < M->t ){ realloc2 (M->rw, M->t+1, EXIT); ARY_FILL (M->rw, i, M->t+1, 0); } +} + + +/* load file with switching the format according to the flag */ +void SMAT_load (SMAT *M){ + FILE2 fp = INIT_FILE2; + VEC_ID i; + M->type = TYPE_SMAT; + FILE2_open (fp, M->fname, "r", EXIT); + SMAT_file_load (M, &fp); + FILE2_close (&fp); if (ERROR_MES) EXIT; + FLOOP (i, 0, M->t) M->v[i].v[M->v[i].t].i = M->clms; // end mark + +#ifdef USE_MATH + if ( M->flag&VEC_NORMALIZE ) FLOOP (i, 0, M->t) SVEC_normalize (&M->v[i]); // normalize +#endif + if (M->flag&LOAD_INCSORT) + FLOOP (i, 0, M->t) qsort_VEC_ID ((VEC_ID *)(M->v[i].v), M->v[i].t, sizeof(SVEC_ELE)); + if (M->flag&LOAD_DECSORT) + FLOOP (i, 0, M->t) qsort_VEC_ID ((VEC_ID *)(M->v[i].v), M->v[i].t, -(int)sizeof(SVEC_ELE)); + if (M->flag&LOAD_RM_DUP) + FLOOP (i, 0, M->t) MQUE_UNIFY (M->v[i], SVEC_VAL); + M->eles = M->ele_end; + print_mes (M, "smat: %s ,#rows %d ,#clms %d ,#eles %zd\n", M->fname, M->t, M->clms, M->eles); + +} + +/* sort and duplication check */ +void SETFAMILY_sort (SETFAMILY *M){ + VEC_ID i; + PERM *p; + WEIGHT *ww; + QUEUE Q; + int flag = (M->flag&LOAD_INCSORT)? 1: ((M->flag&LOAD_DECSORT)? -1: 0); + if ( flag ){ // sort items in each row + malloc2 (p, M->clms, EXIT); + FLOOP (i, 0, M->t) + QUEUE_perm_WEIGHT (&M->v[i], M->w?M->w[i]:NULL, p, flag); + free (p); + } + flag = ((M->flag&LOAD_SIZSORT)? ((M->flag&LOAD_DECROWSORT)? -1: 1): 0) *sizeof(QUEUE); + if ( flag ){ // sort the rows + p = qsort_perm_VECt ((VEC *)M->v, M->t, flag); + if ( M->w ) ARY_INVPERMUTE_ (M->w, p, ww, M->t); + ARY_INVPERMUTE (M->v, p, Q, M->t, EXIT); + free (p); + } + if (M->flag&LOAD_RM_DUP){ // unify the duplicated edges + FLOOP (i, 0, M->t) + QUEUE_rm_dup_WEIGHT (&M->v[i], M->w?M->w[i]:NULL); + } +} + +/* scan file and load the data from file to SMAT structure */ +void SETFAMILY_load (SETFAMILY *M){ + FILE2 fp = INIT_FILE2; + VEC_ID i; + M->type = TYPE_SETFAMILY; + FILE2_open (fp, M->fname, "r", EXIT); + SMAT_file_load ((SMAT *)M, &fp); + FILE2_close (&fp); if(ERROR_MES) EXIT; + print_mes (M, "setfamily: %s ,#rows %d ,#clms %d ,#eles %zd", M->fname, M->t, M->clms, M->eles); + if ( !(M->flag&LOAD_ELE) && M->wfname ){ + SETFAMILY_load_weight (M); if ( ERROR_MES ){ SETFAMILY_end (M); EXIT; } + print_mes (M, " ,weightfile %s", M->wfname); + } + print_mes (M, "\n"); + + SETFAMILY_sort (M); + FLOOP (i, 0, M->t) M->v[i].v[M->v[i].t] = M->clms; // end mark + M->eles = M->ele_end; + +} + +/* print routines */ +void MAT_print (FILE *fp, MAT *M){ + VEC *V; + MQUE_FLOOP (*M, V) ARY_FPRINT (fp, V->v, 0, V->t, VEC_VALF" "); +} +void SVEC_print (FILE *fp, SVEC *V){ + SVEC_ELE *x; + MQUE_FLOOP (*V, x) fprintf (fp, "("QUEUE_IDF","SVEC_VALF") ", (*x).i, (*x).a); + fputc ('\n', fp); +} +void SMAT_print (FILE *fp, SMAT *M){ + SVEC *V; + MQUE_FLOOP (*M, V) SVEC_print (fp, V); +} +void SETFAMILY_print (FILE *fp, SETFAMILY *M){ + QUEUE *V; + MQUE_FLOOP (*M, V) ARY_FPRINT (fp, V->v, 0, V->t, QUEUE_INTF" "); +} + +/* +void SETFAMILY_print_WEIGHT (FILE *fp, SETFAMILY *M){ + if ( M->w ){ + printf (","); fprint_WEIGHT (stdout, M->w[i][j]); } + printf ("\n"); +} +*/ + +/****************************************************************/ +/** Inner product routines **************************************/ +/****************************************************************/ +SVEC_VAL2 SVEC_inpro (SVEC *V1, SVEC *V2){ + VEC_ID i1, i2=0; + SVEC_VAL2 sum=0; + FLOOP (i1, 0, V1->t){ + while (V2->v[i2].i < V1->v[i1].i) i2++; + if (V2->v[i2].i == V1->v[i1].i) sum += ((SVEC_VAL2)V2->v[i2].a)*V1->v[i1].a; + } + return (sum); +} + + +/* get ith vector */ +void *MVEC_getvec (void *M, int i, int flag){ + MAT *MM = (MAT *)M; + if (MM->type==TYPE_MAT) return (&MM->v[i]); + if (MM->type==TYPE_SMAT) return (&((SVEC *)M)->v[i]); + if (MM->type==TYPE_SETFAMILY) return (&((QUEUE *)M)->v[i]); + return (NULL); +} + +/* compute the inner product of two vectors */ +double VEC_inpro (VEC *V1, VEC *V2){ + VEC_VAL sum=0; + VEC_VAL *v1 = V1->v, *v2 = V2->v, *v_end = v1 + MIN (V1->end, V2->end), *vv=v_end-1; +#ifdef USE_SIMD + __m128d u1, u2, u3; + double r[2]; + if ( v1 < vv ){ + u3 = _mm_load_pd (v1); v1 += 2; + u2 = _mm_load_pd (v2); v2 += 2; + u3 = _mm_mul_pd (u3, u2); + while ( v1 < vv ){ + u1 = _mm_load_pd (v1); v1 += 2; + u2 = _mm_load_pd (v2); v2 += 2; + u1 = _mm_mul_pd (u1, u2); + u3 = _mm_add_pd (u3, u1); + } + _mm_storeu_pd (r, u3); + sum = r[0]+r[1]; + _mm_empty(); + } +#else + VEC_VAL a0, a1; + while ( v1 < vv ){ + a0 = *v1 * *v2; v1++; v2++; + a1 = *v1 * *v2; v1++; v2++; + sum += a0 + a1; + } +#endif + if ( v1 < v_end ){ sum += *v1 * *v2; } + return (sum); +} + +/* compute the l1-norm of two vectors */ +double VEC_l1dist (VEC *V1, VEC *V2){ + VEC_ID i, end=MIN(V1->end,V2->end); + double sum=0; + FLOOP (i, 0, end) sum += abs (((double)V1->v[i])- ((double)V2->v[i])); + return (sum); +} + +/* compute the l-infinity-norm of two vectors */ +double VEC_linfdist (VEC *V1, VEC *V2){ + VEC_ID i, end=MIN(V1->end,V2->end); + double m=0; + FLOOP (i, 0, end) ENMAX (m, abs (((double)V1->v[i])- ((double)V2->v[i]))); + return (m); +} + +double SETFAMILY_resemblance (QUEUE *Q1, QUEUE *Q2){ + int *x, *y=Q2->v, *yy = y+Q2->t, s=0; + MQUE_FLOOP (*Q1, x){ + while ( *y < *x ){ if ( ++y == yy ) goto END; } + if ( *y == *x ){ s++; if ( ++y == yy ) goto END; } + } + END:; + return ( ((double)s) / ((double)(Q1->t + Q2->t))); +} + + +#ifdef USE_MATH + +/****************************************************************/ +/** Norm computation and normalization ************************/ +/****************************************************************/ +double SVEC_norm (SVEC *V){ + SVEC_ELE *v; + double sum=0; + MQUE_FLOOP (*V, v) sum += ((double)(v->a)) * (v->a); + return (sqrt(sum)); +} +void SVEC_normalize (SVEC *V){ + SVEC_ELE *v; + double norm = SVEC_norm (V); + MQUE_FLOOP (*V, v) v->a /= norm; +} + +double VEC_norm (VEC *V){ + return (sqrt (VEC_inpro (V, V))); +} + +void VEC_normalize (VEC *V){ + double norm = VEC_norm (V); + VEC_VAL *v = V->v, *v_end = v + V->end; +#ifdef USE_SIMD + __m128d u1, u2; + while ( v < v_end ){ + u1 = _mm_load_pd (v); + u2 = _mm_load1_pd (&norm); + u1 = _mm_div_pd (u1, u2); + _mm_storeu_pd (v, u1); + } + _mm_empty(); + if ( v < v_end ) *v /= norm; +#else + while ( v < v_end ) *v /= norm; +#endif +} + +/****************************************************************/ +/** Euclidean distance routines *********************************/ +/****************************************************************/ + +/* compute the Euclidean distance of two vectors (VEC) */ +double VEC_eucdist_ (VEC *V1, VEC *V2){ + double sum=0, a0; + VEC_VAL *v1 = V1->v, *v2 = V2->v, *v_end = v1 + MIN (V1->end, V2->end), *vv=v_end-1; +#ifdef USE_SIMD + __m128d u1, u2, u3; + double r[2]; + if ( v1 < vv ){ + u3 = _mm_load_pd (v1); v1 += 2; + u2 = _mm_load_pd (v2); v2 += 2; + u3 = _mm_sub_pd (u3, u2); + u3 = _mm_mul_pd (u3, u3); + while ( v1 < vv ){ + u1 = _mm_load_pd (v1); v1 += 2; + u2 = _mm_load_pd (v2); v2 += 2; + u1 = _mm_sub_pd (u1, u2); + u1 = _mm_mul_pd (u1, u1); + u3 = _mm_add_pd (u3, u1); + } + _mm_storeu_pd (r, u3); + sum = r[0]+r[1]; + _mm_empty(); + } +#else + double a1; + while ( v1 < vv ){ + a0 = *v1 - *v2; v1++; v2++; + a1 = *v1 - *v2; v1++; v2++; + sum += a0*a0 + a1*a1; + } +#endif + if ( v1 < v_end ){ a0 = *v1 - *v2; sum += a0*a0; } + return (sum); +} + +double VEC_eucdist (VEC *V1, VEC *V2){ + double p = SQRT (VEC_eucdist_ (V1, V2)); +#ifdef USE_SIMD + _mm_empty (); +#endif + return (p); +} + +/* compute the Euclidean distance of two vectors (SVEC)*/ +double SVEC_eucdist_ (SVEC *V1, SVEC *V2){ + VEC_ID i1, i2; + double sum=0, a; + for ( i1=i2=0 ; i1t && i2t ; ){ + if (V2->v[i2].i > V1->v[i1].i) a = V1->v[i1].a; + else if (V2->v[i2].i < V1->v[i1].i) a = V2->v[i2].a; + else a = ((double)V2->v[i2].a) - ((double)V1->v[i1].a); + sum += a*a; + } + return (sum); +} + +double SVEC_eucdist (SVEC *V1, SVEC *V2){ + return (sqrt (SVEC_eucdist (V1, V2))); +} + +/* compute the Euclidean distance of two vectors (VEC * SVEC)*/ +double VEC_SVEC_eucdist (VEC *V1, SVEC *V2){ + VEC_ID i, i2=0; + double sum=0, a; + FLOOP (i, 0, V1->end){ + if ( i < V2->v[i2].i ) a = V1->v[i]; + else { a = ((double)V1->v[i]) - ((double)V2->v[i2].a); i2++; } + sum += a*a; + } + return (sqrt(sum)); +} + +/**********************************************************/ +/* Euclidean distance of vector and set */ +double VEC_QUEUE_eucdist (VEC *V, QUEUE *Q){ + VEC_ID i; + QUEUE_ID i2=0; + double sum=0, a; + FLOOP (i, 0, V->end){ + if ( i < Q->v[i2] ) a = V->v[i]; + else { a = ((double)V->v[i]) - 1.0; i2++; } + sum += a*a; + } + return (sqrt(sum)); +} + +/* compute Euclidean distance of two sets */ +double QUEUE_eucdist (QUEUE *Q1, QUEUE *Q2){ + double f; + MQUE_UNION(f, *Q1, *Q2); + return (sqrt(f)); +} + +double MVEC_norm (void *V){ + VEC *VV = (VEC *)V; + double p; + if (VV->type==TYPE_VEC){ ARY_NORM (p, VV->v, VV->t); return (p); } + if (VV->type==TYPE_SVEC) return (SVEC_norm ((SVEC *)V)); + if (VV->type==TYPE_QUEUE) return (sqrt(((QUEUE*)V)->t)); + return (0.0); +} + +double MMAT_norm_i (void *M, int i){ + MAT *MM = (MAT *)M; + double p; + if (MM->type==TYPE_MAT){ ARY_NORM (p, MM->v[i].v, MM->v[i].t); return (p); } + if (MM->type==TYPE_SMAT) return (SVEC_norm (&((SMAT *)M)->v[i])); + if (MM->type==TYPE_SETFAMILY) return (sqrt (((SETFAMILY *)M)->v[i].t)); + return (0.0); +} + +double MVEC_eucdist (void *V, void *U){ + VEC *VV = (VEC *)V; + double p; + if (VV->type==TYPE_VEC) return (VEC_eucdist ((VEC *)V, (VEC *)U)); + if (VV->type==TYPE_SVEC) return (SVEC_eucdist ((SVEC *)V, (SVEC *)U)); + if (VV->type==TYPE_QUEUE){ MQUE_DIF (p, *((QUEUE *)V), *((QUEUE *)U)); return (sqrt(p));} + return (0.0); +} + +double MMAT_eucdist_ij (void *M, int i, int j){ + MAT *MM=(MAT *)M; + double p; + if (MM->type==TYPE_MAT) return (VEC_eucdist ( &MM->v[i], &MM->v[j] )); + if (MM->type==TYPE_SMAT) return (SVEC_eucdist ( &((SMAT *)M)->v[i], &((SMAT *)M)->v[j])); + if (MM->type==TYPE_SETFAMILY){ MQUE_DIF (p, ((SETFAMILY *)M)->v[i], ((SETFAMILY *)M)->v[j]); return (sqrt(p)); } + return (0.0); +} + + +#endif + +/**********************************************************/ +/** multi-vector routines ******************************/ +/**********************************************************/ + +/* compute the inner product, Euclidean distance for multi vector */ +double MVEC_inpro (void *V, void *U){ + VEC *VV = (VEC *)V, *UU = (VEC *)U; + double p; + if (VV->type==TYPE_VEC){ + if (UU->type==TYPE_VEC){ ARY_INPRO (p, VV->v, UU->v, VV->t); return (p); } + if (UU->type==TYPE_SVEC){ ARY_SVEC_INPRO (p, *((SVEC *)U), VV->v); return (p); } + if (UU->type==TYPE_QUEUE){ ARY_QUEUE_INPRO (p, *((QUEUE *)U), VV->v); return (p); } + } + if (VV->type==TYPE_SVEC){ + if (UU->type==TYPE_VEC){ ARY_SVEC_INPRO (p, *((SVEC *)V), UU->v); return (p);} + if (UU->type==TYPE_SVEC) return (SVEC_inpro ((SVEC *)V, (SVEC *)U)); +// if (UU->type==TYPE_QUEUE) return (VEC_QUEUE_inpro (V, U)); + } + if (VV->type==TYPE_QUEUE){ + if (UU->type==TYPE_VEC){ ARY_QUEUE_INPRO (p, *((QUEUE *)V), UU->v); return (p); } +// else if (UU->type==TYPE_SVEC) return (SVEC_inpro (V, U)); + if (UU->type==TYPE_QUEUE){ MQUE_INTSEC (p, *((QUEUE *)V), *((QUEUE *)U)); return (p);} + } + return (0.0); +} + +double MVEC_double_inpro (void *V, double *w){ + VEC *VV = (VEC *)V; + double p; + if (VV->type==TYPE_VEC){ ARY_INPRO (p, VV->v, w, VV->t); return (p); } + if (VV->type==TYPE_SVEC){ ARY_SVEC_INPRO (p, *((SVEC *)V), w); return (p); } + if (VV->type==TYPE_QUEUE){ ARY_QUEUE_INPRO (p, *((QUEUE *)V), w); return (p); } + return (0.0); +} + +/* compute the inner product, euclidean distance for i,jth vector */ +double MMAT_inpro_ij (void *M, int i, int j){ + MAT *MM = (MAT *)M; + double p; + if (MM->type==TYPE_MAT){ ARY_INPRO (p, MM->v[i].v, MM->v[j].v, MM->v[j].t); return (p); } + if (MM->type==TYPE_SMAT) return (SVEC_inpro (&((SMAT *)M)->v[i], &((SMAT *)M)->v[j])); + if (MM->type==TYPE_SETFAMILY){ + p = QUEUE_intsec_ (&((SETFAMILY *)M)->v[i], &((SETFAMILY *)M)->v[j]); return (p); } + return (0.0); +} + +double MMAT_double_inpro_i (void *M, int i, double *w){ + MAT *MM = (MAT *)M; + double p; + if (MM->type==TYPE_MAT){ ARY_INPRO (p, MM->v[i].v, w, MM->v[i].t); return (p); } + if (MM->type==TYPE_SMAT){ ARY_SVEC_INPRO (p, ((SMAT *)M)->v[i], w); return (p); } + if (MM->type==TYPE_SETFAMILY){ ARY_QUEUE_INPRO (p, ((SETFAMILY *)M)->v[i], w); return (p); } + return (0.0); +} + +#ifdef _barray_h_ +void SETFAMILY_to_BARRAY (BARRAY *A, SETFAMILY *F){ + VEC_ID t; + size_t i=0; + BARRAY_init (A, F->clms, F->t); + FLOOP (t, 0, F->t){ + BARRAY_set_subset (&A->v[i], &F->v[t]); + i += A->xend; + } +} +#endif + +#endif + + diff --git a/rql-backend/shd31/vec.h b/rql-backend/shd31/vec.h new file mode 100644 index 0000000..7f8dab8 --- /dev/null +++ b/rql-backend/shd31/vec.h @@ -0,0 +1,171 @@ +/* library for sparse vector */ +/* Takeaki Uno 27/Dec/2008 */ + +#ifndef _vec_h_ +#define _vec_h_ + +//#define USE_MATH + +#include"math.h" +#include"queue.h" + +#ifndef SVEC_VAL + #ifdef SVEC_VAL_INT + #define SVEC_VAL int + #define SVEC_VAL2 LONG + #define SVEC_VAL_END INTHUGE + #define SVEC_VAL2_END LONGHUGE + #define SVEC_VALF "%d" + #else + #define SVEC_VAL double + #define SVEC_VAL2 double + #define SVEC_VAL_END DOUBLEHUGE + #define SVEC_VAL2_END DOUBLEHUGE + #define SVEC_VALF "%f" + #endif +#endif + +#define VEC_LOAD_BIN 16777216 // read binary file +#define VEC_LOAD_BIN2 33554432 // read binary file with 2byte for each number +#define VEC_LOAD_BIN4 67108864 // read binary file with 4byte for each number +#define VEC_LOAD_CENTERIZE 134217728 // read binary file, and minus the half(128) from each number +#define VEC_NORMALIZE 268435456 // read binary file, and minus the half(128) from each number + +/* matrix */ +typedef struct { + unsigned char type; // mark to identify type of the structure + char *fname; // input file name + int flag; // flag + + VEC *v; + VEC_ID end; + VEC_ID t; + VEC_VAL *buf, *buf2; + VEC_ID clms; + size_t eles; + VEC_VAL *buf_org, *buf2_org; +} MAT; + +/* sparse vector, element */ +typedef struct { + QUEUE_ID i; + SVEC_VAL a; +} SVEC_ELE; + +/* sparse vector, vector */ +typedef struct { + unsigned char type; // mark to identify type of the structure + SVEC_ELE *v; + VEC_ID end; + VEC_ID t; +} SVEC; + +/* sparse vector, matrix */ +typedef struct { + unsigned char type; // mark to identify type of the structure + char *fname; // input file name + int flag; // flag + + SVEC *v; + VEC_ID end; + VEC_ID t; + SVEC_ELE *buf, *buf2; + VEC_ID clms; + size_t eles, ele_end; +} SMAT; + +/* set family */ +typedef struct { + unsigned char type; // mark to identify type of the structure + char *fname; // input file name + int flag; // flag + + QUEUE *v; + VEC_ID end; + VEC_ID t; + QUEUE_INT *buf, *buf2; + VEC_ID clms; + size_t eles, ele_end; + WEIGHT *cw, *rw, **w, *wbuf; + int unit; + char *wfname, *cwfname, *rwfname; // weight file name +} SETFAMILY; + +#define INIT_SETFAMILY_ {TYPE_SETFAMILY,NULL,0,NULL,0,0,NULL,NULL,0,0,0,NULL,NULL,NULL,NULL,sizeof(QUEUE_INT),NULL,NULL,NULL} + +extern MAT INIT_MAT; +extern SVEC INIT_SVEC; +extern SMAT INIT_SMAT; +extern SETFAMILY INIT_SETFAMILY; + +QSORT_TYPE_HEADER (SVEC_VAL, SVEC_VAL) +QSORT_TYPE_HEADER (SVEC_VAL2, SVEC_VAL2) + +#define ARY_QUEUE_INPRO(f,U,V) do{(f)=0;FLOOP(common_QUEUE_ID, 0, (QUEUE_ID)(U).t)(f)+=(V)[(U).v[common_QUEUE_ID]];}while(0) +#define ARY_SVEC_INPRO(f,U,V) do{(f)=0;FLOOP(common_VEC_ID, 0, (VEC_ID)(U).t)(f)+=((double)(U).v[common_VEC_ID].a)*(V)[(U).v[common_VEC_ID].i];}while(0) + +/* terminate routine for VEC */ +void VEC_end (VEC *V); +void MAT_end (MAT *M); +void SVEC_end (SVEC *V); +void SMAT_end (SMAT *M); +void SETFAMILY_end (SETFAMILY *M); + +/* allocate memory according to rows and rowt */ +void VEC_alloc (VEC *V, VEC_ID clms); +void MAT_alloc (MAT *M, VEC_ID rows, VEC_ID clms); +void SVEC_alloc (SVEC *V, VEC_ID end); +void SMAT_alloc (SMAT *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles); +void SETFAMILY_alloc (SETFAMILY *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles); +void SETFAMILY_alloc_weight (SETFAMILY *M); + +/* count/read the number in file for MAT */ +/* if *rows>0, only read count the numbers in a row, for the first scan. */ +void MAT_load_bin (MAT *M, FILE2 *fp, int unit); +void MAT_file_load (MAT *M, FILE2 *fp); +void MAT_load (MAT *M); +void SMAT_load (SMAT *M); +void SETFAMILY_load (SETFAMILY *M); +void SETFAMILY_load_weight (SETFAMILY *M); +void SETFAMILY_load_row_weight (SETFAMILY *M); +void SETFAMILY_load_column_weight (SETFAMILY *M); + +void MAT_print (FILE *fp, MAT *M); +void SVEC_print (FILE *fp, SVEC *M); +void SMAT_print (FILE *fp, SMAT *M); +void SETFAMILY_print (FILE *fp, SETFAMILY *M); +void SETFAMILY_print_weight (FILE *fp, SETFAMILY *M); + + +/* norm, normalization **************************/ +double SVEC_norm (SVEC *V); +void SVEC_normalize (SVEC *V); + +/* inner product **************************/ +SVEC_VAL2 SVEC_inpro (SVEC *V1, SVEC *V2); + +/** Euclidean distance routines *********************************/ +double VEC_eucdist (VEC *V1, VEC *V2); +double SVEC_eucdist (SVEC *V1, SVEC *V2); +double VEC_SVEC_eucdist (VEC *V1, SVEC *V2); +double QUEUE_eucdist (QUEUE *Q1, QUEUE *Q2); +double VEC_QUEUE_eucdist (VEC *V, QUEUE *Q); + +void VEC_rand_gaussian (VEC *V); + +double VEC_linfdist (VEC *V1, VEC *V2); + +/* compute the inner product, Euclidean distance for multi vector */ +double MVEC_norm (void *V); +double MVEC_inpro (void *V, void *U); +double MVEC_double_inpro (void *V, double *p); +double MVEC_eucdist (void *V, void *U); + +/* compute the inner product, euclidean distance for i,jth vector */ +double MMAT_inpro_ij (void *M, int i, int j); +double MMAT_double_inpro_i (void *M, int i, double *p); +double MMAT_eucdist_ij (void *M, int i, int j); +double MMAT_norm_i (void *M, int i); + + +#endif diff --git a/rql-ui/.babelrc b/rql-ui/.babelrc new file mode 100644 index 0000000..9390d16 --- /dev/null +++ b/rql-ui/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"], + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] + } + } +} diff --git a/rql-ui/.editorconfig b/rql-ui/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/rql-ui/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/rql-ui/.eslintignore b/rql-ui/.eslintignore new file mode 100644 index 0000000..e2192c5 --- /dev/null +++ b/rql-ui/.eslintignore @@ -0,0 +1,5 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ diff --git a/rql-ui/.eslintrc.js b/rql-ui/.eslintrc.js new file mode 100644 index 0000000..a7e6ac8 --- /dev/null +++ b/rql-ui/.eslintrc.js @@ -0,0 +1,33 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + "globals": { + "$": true, + "jQuery": true, + "jquery": true, + "window": true, + "document": true + }, + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + jquery: true, + }, + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + extends: 'standard', + // required to lint *.vue files + plugins: [ + 'html' + ], + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/rql-ui/.gitignore b/rql-ui/.gitignore new file mode 100644 index 0000000..dfb4167 --- /dev/null +++ b/rql-ui/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test/unit/coverage/ +/test/e2e/reports/ +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/rql-ui/.postcssrc.js b/rql-ui/.postcssrc.js new file mode 100644 index 0000000..eee3e92 --- /dev/null +++ b/rql-ui/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/rql-ui/Dockerfile b/rql-ui/Dockerfile new file mode 100644 index 0000000..25d8d75 --- /dev/null +++ b/rql-ui/Dockerfile @@ -0,0 +1,22 @@ +FROM node:20 AS build-node-stage + +WORKDIR /work +ADD package.json /work +ADD package-lock.json /work +RUN ["npm", "install"] + +ADD .eslintrc.js /work +ADD .postcssrc.js /work +ADD index.html /work +ADD static /work/static/ +ADD config /work/config/ +ADD build /work/build/ +ADD src /work/src/ +RUN ["npm", "run", "build"] + +FROM nginx:latest + +COPY --from=build-node-stage /work/dist/ /usr/share/nginx/html/ +ADD default.conf /etc/nginx/conf.d + +LABEL maintainer="Bilal REZKELLAH" \ No newline at end of file diff --git a/rql-ui/build/build.js b/rql-ui/build/build.js new file mode 100644 index 0000000..e3a20f9 --- /dev/null +++ b/rql-ui/build/build.js @@ -0,0 +1,49 @@ +"use strict"; +require("./check-versions")(); + +process.env.NODE_ENV = "production"; + +const ora = require("ora"); +const rm = require("rimraf"); +const path = require("path"); +const chalk = require("chalk"); +const webpack = require("webpack"); +const config = require("../config"); +const webpackConfig = require("./webpack.prod.conf"); + +const spinner = ora("building for production..."); +spinner.start(); + +rm( + path.join(config.build.assetsRoot, config.build.assetsSubDirectory), + (err) => { + if (err) throw err; + webpack(webpackConfig, (err, stats) => { + spinner.stop(); + if (err) throw err; + process.stdout.write( + stats.toString({ + colors: true, + modules: false, + children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. + chunks: false, + chunkModules: false, + }) + "\n\n" + ); + + if (stats.hasErrors()) { + console.log(chalk.red(" Build failed with errors.\n")); + process.exit(1); + } + + console.log(chalk.cyan(" Build complete.\n")); + console.log( + chalk.yellow( + " Tip: built files are meant to be served over an HTTP server.\n" + + " Opening index.html over file:// won't work.\n" + ) + ); + process.exit(0); + }); + } +); diff --git a/rql-ui/build/check-versions.js b/rql-ui/build/check-versions.js new file mode 100644 index 0000000..3ef972a --- /dev/null +++ b/rql-ui/build/check-versions.js @@ -0,0 +1,54 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') + +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + + console.log() + process.exit(1) + } +} diff --git a/rql-ui/build/logo.png b/rql-ui/build/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/rql-ui/build/logo.png differ diff --git a/rql-ui/build/utils.js b/rql-ui/build/utils.js new file mode 100644 index 0000000..e534fb0 --- /dev/null +++ b/rql-ui/build/utils.js @@ -0,0 +1,101 @@ +'use strict' +const path = require('path') +const config = require('../config') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const packageConfig = require('../package.json') + +exports.assetsPath = function (_path) { + const assetsSubDirectory = process.env.NODE_ENV === 'production' + ? config.build.assetsSubDirectory + : config.dev.assetsSubDirectory + + return path.posix.join(assetsSubDirectory, _path) +} + +exports.cssLoaders = function (options) { + options = options || {} + + const cssLoader = { + loader: 'css-loader', + options: { + sourceMap: options.sourceMap + } + } + + const postcssLoader = { + loader: 'postcss-loader', + options: { + sourceMap: options.sourceMap + } + } + + // generate loader string to be used with extract text plugin + function generateLoaders (loader, loaderOptions) { + const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] + + if (loader) { + loaders.push({ + loader: loader + '-loader', + options: Object.assign({}, loaderOptions, { + sourceMap: options.sourceMap + }) + }) + } + + // Extract CSS when that option is specified + // (which is the case during production build) + if (options.extract) { + return ExtractTextPlugin.extract({ + use: loaders, + fallback: 'vue-style-loader' + }) + } else { + return ['vue-style-loader'].concat(loaders) + } + } + + // https://vue-loader.vuejs.org/en/configurations/extract-css.html + return { + css: generateLoaders(), + postcss: generateLoaders(), + less: generateLoaders('less'), + sass: generateLoaders('sass', { indentedSyntax: true }), + scss: generateLoaders('sass'), + stylus: generateLoaders('stylus'), + styl: generateLoaders('stylus') + } +} + +// Generate loaders for standalone style files (outside of .vue) +exports.styleLoaders = function (options) { + const output = [] + const loaders = exports.cssLoaders(options) + + for (const extension in loaders) { + const loader = loaders[extension] + output.push({ + test: new RegExp('\\.' + extension + '$'), + use: loader + }) + } + + return output +} + +exports.createNotifierCallback = () => { + const notifier = require('node-notifier') + + return (severity, errors) => { + if (severity !== 'error') return + + const error = errors[0] + const filename = error.file && error.file.split('!').pop() + + notifier.notify({ + title: packageConfig.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/rql-ui/build/vue-loader.conf.js b/rql-ui/build/vue-loader.conf.js new file mode 100644 index 0000000..33ed58b --- /dev/null +++ b/rql-ui/build/vue-loader.conf.js @@ -0,0 +1,22 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' +const sourceMapEnabled = isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + cssSourceMap: sourceMapEnabled, + cacheBusting: config.dev.cacheBusting, + transformToRequire: { + video: ['src', 'poster'], + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/rql-ui/build/webpack.base.conf.js b/rql-ui/build/webpack.base.conf.js new file mode 100644 index 0000000..1f4f47e --- /dev/null +++ b/rql-ui/build/webpack.base.conf.js @@ -0,0 +1,92 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +const createLintingRule = () => ({ + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter'), + emitWarning: !config.dev.showEslintErrorsInOverlay + } +}) + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + } + }, + module: { + rules: [ + ...(config.dev.useEslint ? [createLintingRule()] : []), + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + }, + node: { + // prevent webpack from injecting useless setImmediate polyfill because Vue + // source contains it (although only uses it if it's native). + setImmediate: false, + // prevent webpack from injecting mocks to Node native modules + // that does not make sense for the client + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty', + child_process: 'empty' + } +} diff --git a/rql-ui/build/webpack.dev.conf.js b/rql-ui/build/webpack.dev.conf.js new file mode 100644 index 0000000..070ae22 --- /dev/null +++ b/rql-ui/build/webpack.dev.conf.js @@ -0,0 +1,95 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const path = require('path') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') +const portfinder = require('portfinder') + +const HOST = process.env.HOST +const PORT = process.env.PORT && Number(process.env.PORT) + +const devWebpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) + }, + // cheap-module-eval-source-map is faster for development + devtool: config.dev.devtool, + + // these devServer options should be customized in /config/index.js + devServer: { + clientLogLevel: 'warning', + historyApiFallback: { + rewrites: [ + { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, + ], + }, + hot: true, + contentBase: false, // since we use CopyWebpackPlugin. + compress: true, + host: HOST || config.dev.host, + port: PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + overlay: config.dev.errorOverlay + ? { warnings: false, errors: true } + : false, + publicPath: config.dev.assetsPublicPath, + proxy: config.dev.proxyTable, + quiet: true, // necessary for FriendlyErrorsPlugin + watchOptions: { + poll: config.dev.poll, + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.dev.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + // publish the new Port, necessary for e2e tests + process.env.PORT = port + // add port to devServer config + devWebpackConfig.devServer.port = port + + // Add FriendlyErrorsPlugin + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ + compilationSuccessInfo: { + messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], + }, + onErrors: config.dev.notifyOnErrors + ? utils.createNotifierCallback() + : undefined + })) + + resolve(devWebpackConfig) + } + }) +}) diff --git a/rql-ui/build/webpack.prod.conf.js b/rql-ui/build/webpack.prod.conf.js new file mode 100644 index 0000000..2f17259 --- /dev/null +++ b/rql-ui/build/webpack.prod.conf.js @@ -0,0 +1,149 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') +const UglifyJsPlugin = require('uglifyjs-webpack-plugin') + +const env = process.env.NODE_ENV === 'testing' + ? require('../config/test.env') + : require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true, + usePostCSS: true + }) + }, + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + new UglifyJsPlugin({ + uglifyOptions: { + compress: { + warnings: false + } + }, + sourceMap: config.build.productionSourceMap, + parallel: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css'), + // Setting the following option to `false` will not extract CSS from codesplit chunks. + // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. + // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, + // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 + allChunks: true, + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: config.build.productionSourceMap + ? { safe: true, map: { inline: false } } + : { safe: true } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: process.env.NODE_ENV === 'testing' + ? 'index.html' + : config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vendor modules does not change + new webpack.HashedModuleIdsPlugin(), + // enable scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + // This instance extracts shared chunks from code splitted chunks and bundles them + // in a separate chunk, similar to the vendor chunk + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }), + + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/rql-ui/config/dev.env.js b/rql-ui/config/dev.env.js new file mode 100644 index 0000000..a9b12b4 --- /dev/null +++ b/rql-ui/config/dev.env.js @@ -0,0 +1,8 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"', + ROOT_API: '"http://localhost:9992"' +}) diff --git a/rql-ui/config/index.js b/rql-ui/config/index.js new file mode 100644 index 0000000..9649abf --- /dev/null +++ b/rql-ui/config/index.js @@ -0,0 +1,76 @@ +'use strict' +// Template version: 1.2.8 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-module-eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + cssSourceMap: true, + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/rql', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + } +} diff --git a/rql-ui/config/prod.env.js b/rql-ui/config/prod.env.js new file mode 100644 index 0000000..cbfbc7a --- /dev/null +++ b/rql-ui/config/prod.env.js @@ -0,0 +1,5 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"', + ROOT_API: '"server"' +} diff --git a/rql-ui/default.conf b/rql-ui/default.conf new file mode 100644 index 0000000..37943d6 --- /dev/null +++ b/rql-ui/default.conf @@ -0,0 +1,25 @@ +server { + listen 80 default_server; + listen [::]:80 default_server; + + root /usr/share/nginx/html; + + index index.html; + + server_name localhost; + + location / { + try_files $uri $uri/ @rewrites; + } + + location @rewrites { + rewrite ^(.+)$ /index.html last; + } + + location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { + # Some basic cache-control for static files to be sent to the browser + expires max; + add_header Pragma public; + add_header Cache-Control "public, must-revalidate, proxy-revalidate"; + } +} \ No newline at end of file diff --git a/rql-ui/index.html b/rql-ui/index.html new file mode 100644 index 0000000..8f107ee --- /dev/null +++ b/rql-ui/index.html @@ -0,0 +1,16 @@ + + + + + + + + + RQL Manager + + +
+ + + + diff --git a/rql-ui/package-lock.json b/rql-ui/package-lock.json new file mode 100644 index 0000000..3e006ac --- /dev/null +++ b/rql-ui/package-lock.json @@ -0,0 +1,18342 @@ +{ + "name": "rql-ui", + "version": "1.1.0-SNAPSHOT", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rql-ui", + "version": "1.1.0-SNAPSHOT", + "dependencies": { + "axios": "^0.18.0", + "bootstrap": "^4.0.0-beta.3", + "bootstrap-vue": "^1.4.1", + "jquery-mobile": "^1.5.0-alpha.1", + "material-design-icons-iconfont": "^3.0.3", + "mockjs": "^1.0.1-beta3", + "moment": "^2.21.0", + "semantic-ui-css": "^2.2.12", + "sortable": "^2.0.0", + "vue": "^2.5.2", + "vue-carousel": "^0.6.5", + "vue-clip": "^1.0.0", + "vue-dual-list": "^1.0.0", + "vue-form-wizard": "^0.8.4", + "vue-good-table": "^1.20.2", + "vue-json-excel": "^0.1.7", + "vue-materialize-datatable": "^0.7.3", + "vue-mover": "^0.3.0", + "vue-multiselect": "^2.0.8", + "vue-resource": "^1.3.5", + "vue-resource-mock": "0.0.8", + "vue-router": "^3.0.1", + "vue-select": "^2.4.0", + "vue-strap": "^1.1.40", + "vue-xlsx-table": "^1.2.8", + "vue-xlsx-table-components": "^1.0.1", + "vue2-autocomplete-js": "^0.2.2", + "vue2-datatable-component": "^2.2.2", + "vuetable-2": "^1.7.2", + "vuetify": "^1.0.11" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^7.1.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-jest": "^21.0.2", + "babel-loader": "^7.1.1", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^2.0.1", + "chromedriver": "^2.27.2", + "copy-webpack-plugin": "^4.0.1", + "cross-spawn": "^5.0.1", + "css-loader": "^0.28.0", + "eslint": "^3.19.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-html": "^3.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "jest": "^21.2.0", + "jest-serializer-vue": "^0.3.0", + "jquery": "^1.12.4", + "nightwatch": "^0.9.12", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-jest": "^1.0.2", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dependencies": { + "mime-types": "~2.1.16", + "negotiator": "0.6.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", + "dev": true, + "dependencies": { + "acorn": "^4.0.3" + } + }, + "node_modules/acorn-dynamic-import/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "dependencies": { + "acorn": "^4.0.4" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "dependencies": { + "acorn": "^3.0.4" + } + }, + "node_modules/acorn-jsx/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adler-32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.0.0.tgz", + "integrity": "sha1-KHKKcXVvYpZm3RZTzYB5Op3xhlE=", + "dependencies": { + "concat-stream": "", + "exit-on-epipe": "", + "printj": "" + }, + "bin": { + "adler32": "bin/adler32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/adler-32/node_modules/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/adler-32/node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "dependencies": { + "extend": "~3.0.0", + "semver": "~5.0.1" + } + }, + "node_modules/agent-base/node_modules/semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true, + "peerDependencies": { + "ajv": ">=4.10.0" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "dependencies": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "node_modules/append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "dependencies": { + "default-require-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "node_modules/asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "dependencies": { + "lodash": "^4.14.0" + } + }, + "node_modules/async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/autoprefixer": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.4.tgz", + "integrity": "sha512-am8jJ7Rbh1sy7FvLvNxxQScWvhv2FwLAS3bIhvrZpx9HbX5PEcc/7v6ecgpWuiu0Dwlj+p/z/1boHd8x60JFwA==", + "dev": true, + "dependencies": { + "browserslist": "^2.10.2", + "caniuse-lite": "^1.0.30000784", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.15", + "postcss-value-parser": "^3.2.3" + }, + "bin": { + "autoprefixer-info": "bin/autoprefixer-info" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "node_modules/axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" + } + }, + "node_modules/babel-core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "dependencies": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==", + "dev": true + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "dev": true, + "dependencies": { + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" + }, + "peerDependencies": { + "babel-core": "^6.0.0 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "dev": true, + "dependencies": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "babel-core": "6 || 7 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0-rc", + "webpack": "2 || 3" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-dynamic-import": "^6.18.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.7.5", + "test-exclude": "^4.1.1" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", + "dev": true + }, + "node_modules/babel-plugin-jsx-event-modifiers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz", + "integrity": "sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg==", + "dev": true + }, + "node_modules/babel-plugin-jsx-v-model": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz", + "integrity": "sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-jsx": "^6.18.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/babel-plugin-jsx-vue-functional": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-vue-functional/-/babel-plugin-jsx-vue-functional-2.1.0.tgz", + "integrity": "sha1-VjCgyG/hkE0owwRl5r8c9xI1ojk=", + "dev": true + }, + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "node_modules/babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "node_modules/babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "node_modules/babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "node_modules/babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "node_modules/babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "dependencies": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-vue-jsx": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.5.0.tgz", + "integrity": "sha512-5vCg8K7aiiLwrFJ45ZF/b4cIiFpGAoYL5uNZpbgiZFptBc5LkueBCQXTVexrd1IFlpTV7XndqFjtWjcJ54JGUQ==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "peerDependencies": { + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.8.0" + } + }, + "node_modules/babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dependencies": { + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "node_modules/babel-polyfill/node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "node_modules/babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "node_modules/babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "dependencies": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "node_modules/babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "dependencies": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "node_modules/babel-preset-vue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-vue/-/babel-preset-vue-1.2.1.tgz", + "integrity": "sha512-a/Z+6SJ4GXyAoCMfYidDH6OzXnccPNJ5nEaPMjALqCkP9SJkqxz9V0uUS//sGuWszcD8kibdwJRzU+brl8DdFQ==", + "dev": true, + "dependencies": { + "babel-helper-vue-jsx-merge-props": "^2.0.2", + "babel-plugin-jsx-event-modifiers": "^2.0.2", + "babel-plugin-jsx-v-model": "^2.0.1", + "babel-plugin-jsx-vue-functional": "^2.1.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-vue-jsx": "^3.5.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-preset-vue-app": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/babel-preset-vue-app/-/babel-preset-vue-app-1.3.2.tgz", + "integrity": "sha512-PLyyyVdrvgL4szMF7D5SuUhy85aBzy0+s5MO2QhpTwVqfW0qVaPFJi6K3d25CKz1nOV437JgpVvPj1W6tLGJ5g==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-env": "^1.6.0", + "babel-preset-vue": "^1.2.1", + "babel-runtime": "^6.20.0" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base62": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.1.tgz", + "integrity": "sha512-xVtfFHNPUzpCNHygpXFGMlDk3saxXLQcOOQzAAk6ibvlAHgT6WKXLv9rMFhcyEK1n9LuDmp/LxyGW/Fm9L8++g==", + "engines": { + "node": "*" + } + }, + "node_modules/base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "dependencies": { + "hoek": "4.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/bootstrap": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.3.tgz", + "integrity": "sha512-/Qe1Q2d1muLEZRX2iCteMQHZBBAm6ZIjJ9FcBYK/xLr05+HvDtBOVBN+Cz7mCNZuy0zr+y5artZHM05W7mIz6g==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.12.9" + } + }, + "node_modules/bootstrap-vue": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-1.4.1.tgz", + "integrity": "sha512-TXQ28trpKPkdJS/SlcvKOS5DTWxUPkyhGf19urUG1r6Cq6YrzNI+kMipzGpj46XFlYu0WUutzOa9KraYyPLDBQ==", + "hasInstallScript": true, + "dependencies": { + "lodash.startcase": "^4.4.0", + "opencollective": "^1.0.3", + "popper.js": "^1.12.9", + "vue-functional-data-merge": "^2.0.3" + }, + "peerDependencies": { + "vue": "^2.4.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/browser-split": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/browser-split/-/browser-split-0.0.0.tgz", + "integrity": "sha1-QUGcrvdpdVkp3VGJZ9PuwKYmJ3E=" + }, + "node_modules/browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.1.tgz", + "integrity": "sha512-Gp4oJOQOby5TpOJJuUtCrGE0KSJOUYVa/I+/3eD/TRWEK8jqZuJPAK1t+VuG6jp0keudrqtxlH4MbYbmylun9g==", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30000789", + "electron-to-chromium": "^1.3.30" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "deprecated": "This version of 'buffer' is out-of-date. You must update to v4.9.2 or newer", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.2.tgz", + "integrity": "sha512-dljb7dk1jqO5ogE+dRpoR9tpHYv5xz9vPSNunh1+0wRuNdYxmzp9WmsyokgW/DUF1FDRVA/TMsmxt027R8djbQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^1.3.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.1", + "ssri": "^5.0.0", + "unique-filename": "^1.1.0", + "y18n": "^3.2.1" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "dependencies": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-api/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/caniuse-db": { + "version": "1.0.30000791", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000791.tgz", + "integrity": "sha1-Bnh/VsrvQwChfjXRN0RxI731Nvk=", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30000791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000791.tgz", + "integrity": "sha1-jjV0Xv1IOj4ju301CZAybSMZ/BY=", + "dev": true + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cfb": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-0.11.1.tgz", + "integrity": "sha1-qW248nKmw/uZ27sj70EiP0i+Hqc=", + "dependencies": { + "commander": "" + }, + "bin": { + "cfb": "bin/cfb.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/commander": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==" + }, + "node_modules/chai-nightwatch": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz", + "integrity": "sha1-HKVt52jTwIaP5/wvTTLC/olOa+k=", + "dev": true, + "dependencies": { + "assertion-error": "1.0.0", + "deep-eql": "0.1.3" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "node_modules/chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "node_modules/chromedriver": { + "version": "2.34.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.34.1.tgz", + "integrity": "sha512-ivXrPKKtnX442J8Lkbhb8hJ5+lelzAqrAI9VjVs3/iujm396JnJYXGGGjniPXvQeLVE3HDIWwsHu8goIUq3rMQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "del": "^3.0.0", + "extract-zip": "^1.6.5", + "kew": "^0.7.0", + "mkdirp": "^0.5.1", + "request": "^2.83.0" + }, + "bin": { + "chromedriver": "bin/chromedriver" + } + }, + "node_modules/ci-info": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", + "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "dev": true + }, + "node_modules/clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clap/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/class-list": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/class-list/-/class-list-0.1.1.tgz", + "integrity": "sha1-m5dFGSxBebXaCg12M2WOPHDXlss=", + "dependencies": { + "indexof": "0.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "dependencies": { + "source-map": "0.5.x" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "dependencies": { + "restore-cursor": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-spinners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/cliui/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "dependencies": { + "q": "^1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/codepage": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.8.1.tgz", + "integrity": "sha1-8aAJ1SYdwnVGKLrLb7vw5uKr/6o=", + "dependencies": { + "commander": "", + "concat-stream": "", + "exit-on-epipe": "", + "voc": "" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage/node_modules/commander": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==" + }, + "node_modules/codepage/node_modules/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/codepage/node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "dependencies": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "dependencies": { + "color-name": "^1.1.1" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "dependencies": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "dependencies": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "bin": { + "commonize": "bin/commonize" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commoner/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "dev": true, + "dependencies": { + "mime-db": ">= 1.30.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.11", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "deprecated": "Use whatwg-mimetype instead", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-xlcFiW/U7KrpS6dFuWq3r8Wb7koJx7QVc7LDFCosqkikaVSxkaYOnwDLwilbjrszZ0LYZXThDAJKcQCSrvdShQ==", + "dev": true, + "dependencies": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^0.2.15", + "lodash": "^4.3.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "pify": "^3.0.0", + "serialize-javascript": "^1.4.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js." + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/cosmiconfig/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/crc-32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.0.2.tgz", + "integrity": "sha1-CVB5hO6bzOO9G4hh8N6KsQroGH0=", + "dependencies": { + "exit-on-epipe": "", + "printj": "" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc-32/node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "dependencies": { + "boom": "5.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cryptiles/node_modules/boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "dependencies": { + "hoek": "4.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-loader": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.8.tgz", + "integrity": "sha512-4jGj7Ag6WUZ5lQyE4te9sJLn0lgkz6HI3WDE4aw98AkW1IAKXPP4blTpPeorlLDpNsYvojo0SYgRJOdz2KbuAw==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.1.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "engines": { + "node": ">=0.12.0 || >= 4.3.0 < 5.0.0 || >=5.10" + } + }, + "node_modules/css-loader/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-loader/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/css-loader/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "dependencies": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "node_modules/css-selector-tokenizer/node_modules/regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + } + }, + "node_modules/cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "dependencies": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "node_modules/cssnano/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "dependencies": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/cssnano/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/cssnano/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cssnano/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/cssnano/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "dependencies": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "bin": { + "csso": "bin/csso" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "node_modules/d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.9" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true + }, + "node_modules/date-fns": { + "version": "2.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.7.tgz", + "integrity": "sha1-JFrRb5V2Tqur+ywKQf1dAzwg5Xo=" + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "dependencies": { + "type-detect": "0.1.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "dependencies": { + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "dependencies": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "dependencies": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "node_modules/degenerator/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "dependencies": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/del/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "node_modules/detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dependencies": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "node_modules/diacriticless": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/diacriticless/-/diacriticless-1.0.1.tgz", + "integrity": "sha1-592peMKRlgm7SK7h78XeajN71MM=" + }, + "node_modules/diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-packet/node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "dependencies": { + "utila": "~0.3" + } + }, + "node_modules/dom-converter/node_modules/utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "dependencies": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "deprecated": "update to domelementtype@1.3.1", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", + "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/downloadjs": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz", + "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=" + }, + "node_modules/dropzone": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-4.3.0.tgz", + "integrity": "sha1-SLC48q0JKHLktTW2cqfD8aHWfJE=" + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", + "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "dependencies": { + "jsbn": "~0.1.0" + } + }, + "node_modules/editorconfig": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", + "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.0.5", + "commander": "^2.9.0", + "lru-cache": "^3.2.0", + "semver": "^5.1.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-releases": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", + "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", + "deprecated": "this package is no longer updated, please fetch version information from https://releases.electronjs.org/releases.json instead", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", + "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", + "dev": true, + "dependencies": { + "electron-releases": "^2.1.0" + } + }, + "node_modules/elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dependencies": { + "iconv-lite": "~0.4.13" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "node_modules/envify": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", + "integrity": "sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=", + "dependencies": { + "jstransform": "^11.0.3", + "through": "~2.3.4" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.1.tgz", + "integrity": "sha1-oyArj7AxFKqbQKDjZp5IsrZaAQo=", + "dev": true, + "dependencies": { + "stackframe": "^1.0.3" + } + }, + "node_modules/es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "dependencies": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", + "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "dev": true, + "dependencies": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.5.6" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true, + "peerDependencies": { + "eslint": ">=3.19.0", + "eslint-plugin-import": ">=2.2.0", + "eslint-plugin-node": ">=4.2.2", + "eslint-plugin-promise": ">=3.5.0", + "eslint-plugin-standard": ">=3.0.0" + } + }, + "node_modules/eslint-friendly-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", + "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-friendly-formatter/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-friendly-formatter/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-friendly-formatter/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/eslint-friendly-formatter/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "node_modules/eslint-loader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "deprecated": "This loader has been deprecated. Please use eslint-webpack-plugin", + "dev": true, + "dependencies": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + }, + "peerDependencies": { + "eslint": ">=1.6.0 <5.0.0" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "dependencies": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.2.tgz", + "integrity": "sha512-sSuafathF6ImPrzF2vUKEJY6Llq06d/riMTMzlsruDRDhNsQMYp2viUKo+jx+JRr1QevskeUpQcuptp2gN1XVQ==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.2", + "semver": "^5.4.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "dependencies": { + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.1.1", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "2.x - 4.x" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "dependencies": { + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", + "semver": "5.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": ">=3.1.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true, + "peerDependencies": { + "eslint": ">=3.19.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "dependencies": { + "acorn": "^5.2.1", + "acorn-jsx": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "dependencies": { + "estraverse": "^4.0.0" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "dependencies": { + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "dependencies": { + "original": ">=0.0.5" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "dependencies": { + "merge": "^1.1.3" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", + "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "jest-diff": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0" + } + }, + "node_modules/express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.2", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "~1.3.1", + "type-is": "~1.6.15", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "deprecated": "Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin", + "dev": true, + "dependencies": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^3.1.0" + } + }, + "node_modules/extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "dependencies": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "dependencies": { + "bser": "^2.0.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "dependencies": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-loader": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz", + "integrity": "sha512-873ztuL+/hfvXbLDJ262PGO6XjERnybJu2gW1/5j8HUfxSiFJI9Hj/DhZ50ZGRUxBvuNiazb/cM2rh9pqrxP6Q==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "dependencies": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "node_modules/filesize": { + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", + "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "dev": true, + "dependencies": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "dependencies": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat-cache/node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat-cache/node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "node_modules/follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "dependencies": { + "debug": "^3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/follow-redirects/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frac": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.0.6.tgz", + "integrity": "sha1-mg38I5VoUqizIGI7688b6eoEgik=", + "dependencies": { + "voc": "" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/friendly-errors-webpack-plugin": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.6.1.tgz", + "integrity": "sha1-4yeBxHIvVGoGqbXXp8+ihSA3XXA=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-length": "^1.0.1" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.5.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.21", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.10.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.1.10", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.7", + "dev": true, + "inBundle": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "dependencies": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "optional": true + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/fuse.js": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-2.7.4.tgz", + "integrity": "sha1-luQg/efvARrEnCWKYhMU/ldlNvk=" + }, + "node_modules/generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", + "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "3", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "node_modules/gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "dependencies": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^2.6" + } + }, + "node_modules/handlebars/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handlebars/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/handlebars/node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/handlebars/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "dependencies": { + "function-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==", + "engines": { + "node": "*" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "dev": true, + "dependencies": { + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" + }, + "engines": { + "node": ">=4.5.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true, + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/html-minifier": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.8.tgz", + "integrity": "sha512-WX7D6PB9PFq05fZ1/CyxPUuyqXed6vh2fGOM80+zJT5wAO93D/cUjLs0CcbBFjQmlwmCgRvl97RurtArIpOnkw==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.12.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "deprecated": "out of support", + "dev": true, + "dependencies": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "peerDependencies": { + "webpack": "1 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dependencies": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "dependencies": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", + "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", + "dev": true, + "dependencies": { + "agent-base": "2", + "debug": "2", + "extend": "3" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "dependencies": { + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "dependencies": { + "agent-base": "2", + "debug": "2", + "extend": "3" + } + }, + "node_modules/hyperscript": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/hyperscript/-/hyperscript-1.0.7.tgz", + "integrity": "sha1-2I7TxRk0xtb6NbKr/XwA8QCCD2U=", + "dependencies": { + "browser-split": "0.0.0", + "class-list": "~0.1.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "node_modules/icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "node_modules/import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "dependencies": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "dependencies": { + "meow": "^3.3.0" + }, + "bin": { + "internal-ip": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "node_modules/invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", + "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "dependencies": { + "ci-info": "^1.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-my-json-valid": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", + "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", + "deprecated": "catastrophic backtracking in regexes could potentially lead to REDOS attack, upgrade to 2.17.2 as soon as possible", + "dev": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "node_modules/is-odd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", + "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-odd/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "dependencies": { + "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", + "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "dev": true + }, + "node_modules/is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "dependencies": { + "html-comment-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "dev": true, + "dependencies": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "node_modules/istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "dependencies": { + "append-transform": "^0.4.0" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "dependencies": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" + } + }, + "node_modules/istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "dependencies": { + "handlebars": "^4.0.3" + } + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", + "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", + "dev": true, + "dependencies": { + "jest-cli": "^21.2.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest-changed-files": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", + "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", + "dev": true, + "dependencies": { + "throat": "^4.0.0" + } + }, + "node_modules/jest-config": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", + "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^21.2.1", + "jest-environment-node": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "jest-validate": "^21.2.1", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-diff": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", + "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "node_modules/jest-environment-jsdom": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", + "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", + "dev": true, + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" + } + }, + "node_modules/jest-environment-node": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", + "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", + "dev": true, + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" + } + }, + "node_modules/jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "dev": true + }, + "node_modules/jest-haste-map": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", + "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", + "dev": true, + "dependencies": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^21.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0", + "worker-farm": "^1.3.1" + } + }, + "node_modules/jest-jasmine2": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", + "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "expect": "^21.2.1", + "graceful-fs": "^4.1.11", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-snapshot": "^21.2.1", + "p-cancelable": "^0.3.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", + "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-message-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", + "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" + } + }, + "node_modules/jest-mock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", + "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", + "dev": true + }, + "node_modules/jest-regex-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", + "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", + "dev": true + }, + "node_modules/jest-resolve": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", + "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", + "dev": true, + "dependencies": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "is-builtin-module": "^1.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", + "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", + "dev": true, + "dependencies": { + "jest-regex-util": "^21.2.0" + } + }, + "node_modules/jest-runner": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", + "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", + "dev": true, + "dependencies": { + "jest-config": "^21.2.1", + "jest-docblock": "^21.2.0", + "jest-haste-map": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-util": "^21.2.1", + "pify": "^3.0.0", + "throat": "^4.0.0", + "worker-farm": "^1.3.1" + } + }, + "node_modules/jest-runner/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", + "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", + "dev": true, + "dependencies": { + "babel-core": "^6.0.0", + "babel-jest": "^21.2.0", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^9.0.0" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-serializer-vue": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-0.3.0.tgz", + "integrity": "sha512-Id1x3XabYu2r6BnmTfGk2tY172BEqR+vAzSvPk4VF8HyVqwebxZQbqiZ/giAtCnRSqi6lzxuyvzQbwQ6bo6Hbg==", + "dev": true, + "dependencies": { + "pretty": "2.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", + "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", + "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "jest-message-util": "^21.2.1", + "jest-mock": "^21.2.0", + "jest-validate": "^21.2.1", + "mkdirp": "^0.5.1" + } + }, + "node_modules/jest-util/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest/node_modules/ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", + "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^21.2.0", + "jest-config": "^21.2.1", + "jest-environment-jsdom": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve-dependencies": "^21.2.0", + "jest-runner": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-snapshot": "^21.2.1", + "jest-util": "^21.2.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^3.0.0", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^9.0.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest/node_modules/string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jquery": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.12.4.tgz", + "integrity": "sha1-AeHfuikP5z3rp3zurLD5ui/sngw=" + }, + "node_modules/jquery-browserify": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/jquery-browserify/-/jquery-browserify-1.8.1.tgz", + "integrity": "sha1-DeqddBpPQRWuGYDEUxsiUCmRoBU=" + }, + "node_modules/jquery-mobile": { + "version": "1.5.0-alpha.1", + "resolved": "https://registry.npmjs.org/jquery-mobile/-/jquery-mobile-1.5.0-alpha.1.tgz", + "integrity": "sha1-KoQQ1X873re5ad4vTancOQb5kZ4=", + "dependencies": { + "jquery": ">=1.8.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/js-base64": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", + "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", + "dev": true + }, + "node_modules/js-beautify": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.5.tgz", + "integrity": "sha512-9OhfAqGOrD7hoQBLJMTA+BKuKmoEtTJXzZ7WDF/9gvjtey1koVLuZqIY6c51aPDjbNdNtIXAkiWKVhziawE9Og==", + "dev": true, + "dependencies": { + "config-chain": "~1.1.5", + "editorconfig": "^0.13.2", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + } + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "node_modules/jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "dependencies": { + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "deprecated": "Please use the native JSON object instead of JSON 3", + "dev": true + }, + "node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jstransform": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", + "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", + "dependencies": { + "base62": "^1.1.0", + "commoner": "^0.10.1", + "esprima-fb": "^15001.1.0-dev-harmony-fb", + "object-assign": "^2.0.0", + "source-map": "^0.4.2" + }, + "bin": { + "jstransform": "bin/jstransform" + }, + "engines": { + "node": ">=0.8.8" + } + }, + "node_modules/jstransform/node_modules/esprima-fb": { + "version": "15001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", + "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jstransform/node_modules/object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jstransform/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "node_modules/killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.4", + "webpack-sources": "^1.0.1" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "dependencies": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + } + }, + "node_modules/loader-fs-cache/node_modules/find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "node_modules/lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "node_modules/lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "dependencies": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._baseassign": "^3.0.0", + "lodash._basefor": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "node_modules/lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "node_modules/lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "node_modules/lodash._stack": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz", + "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "node_modules/lodash.clone": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", + "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=", + "dev": true, + "dependencies": { + "lodash._baseclone": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "node_modules/lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "node_modules/lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz", + "integrity": "sha1-bBpYbmxWR7DmTi15gUG4g2FYvoo=", + "dev": true, + "dependencies": { + "lodash._baseclone": "^4.0.0", + "lodash._stack": "^4.0.0", + "lodash.isplainobject": "^4.0.0", + "lodash.keysin": "^4.0.0", + "lodash.mergewith": "^4.0.0", + "lodash.rest": "^4.0.0" + } + }, + "node_modules/lodash.defaultsdeep/node_modules/lodash._baseclone": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", + "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", + "dev": true + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.keysin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz", + "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "node_modules/lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/macaddress": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", + "dev": true + }, + "node_modules/make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/material-design-icons-iconfont": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-3.0.3.tgz", + "integrity": "sha1-FUoQhAR9Ticjf6f1o34Qdc7qbfI=" + }, + "node_modules/math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/md5.js/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dependencies": { + "mime-db": "~1.30.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/mississippi": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^1.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", + "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "deprecated": "Critical bug fixed in v2.0.1, please upgrade to the latest version.", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", + "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", + "dev": true + }, + "node_modules/mocha-nightwatch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz", + "integrity": "sha1-kby5s73gV912d8eBJeSR5Y1mZHw=", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "bin": { + "_mocha-nightwatch": "bin/_mocha", + "mocha-nightwatch": "bin/mocha" + }, + "engines": { + "node": ">= 0.10.x", + "npm": ">= 1.4.x" + } + }, + "node_modules/mocha-nightwatch/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/mocha-nightwatch/node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/mocha-nightwatch/node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha-nightwatch/node_modules/glob": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha-nightwatch/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha-nightwatch/node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "node_modules/mocha-nightwatch/node_modules/supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mockjs": { + "version": "1.0.1-beta3", + "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.0.1-beta3.tgz", + "integrity": "sha1-0jTzwnJWOXVk8slVFC6JGQlTcgk=", + "dependencies": { + "commander": "*" + }, + "bin": { + "random": "bin/random" + } + }, + "node_modules/moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multicast-dns": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz", + "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==", + "dev": true, + "dependencies": { + "dns-packet": "^1.0.1", + "thunky": "^0.1.0" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "node_modules/nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", + "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "is-odd": "^1.0.0", + "kind-of": "^5.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "dependencies": { + "xml-char-classes": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nightwatch": { + "version": "0.9.19", + "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.19.tgz", + "integrity": "sha1-S9l1cnPTC4RfBIR6mLcb6bt8Szs=", + "dev": true, + "dependencies": { + "chai-nightwatch": "~0.1.x", + "ejs": "2.5.7", + "lodash.clone": "3.0.3", + "lodash.defaultsdeep": "4.3.2", + "minimatch": "3.0.3", + "mkpath": "1.0.0", + "mocha-nightwatch": "3.2.2", + "optimist": "0.6.1", + "proxy-agent": "2.0.0", + "q": "1.4.1" + }, + "bin": { + "nightwatch": "bin/nightwatch" + } + }, + "node_modules/nightwatch/node_modules/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nightwatch/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.1.1.tgz", + "integrity": "sha1-CFJGRe5AOd7cPcwd18a5eeBhnkQ=", + "dev": true, + "dependencies": { + "clone": "2.x", + "lodash": "4.x" + }, + "engines": { + "node": ">= 0.4.6" + } + }, + "node_modules/node-cache/node_modules/clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/node-fetch": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node_modules/node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "semver": "^5.3.0", + "shellwords": "^0.1.0", + "which": "^1.2.12" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", + "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz", + "integrity": "sha512-smRWXzkvxw72VquyZ0wggySl7PFUtoDhvhpdwgESXxUrH7vVhhp9asfup1+rVLrhsl7L45Ee1Q/l5R2Ul4MwUg==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/observable": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/observable/-/observable-1.3.1.tgz", + "integrity": "sha1-PSogOxQw2vak1tNvI2zBPm7Vu04=" + }, + "node_modules/obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opencollective": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "dependencies": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "bin": { + "oc": "dist/bin/opencollective.js", + "opencollective": "dist/bin/opencollective.js" + } + }, + "node_modules/opencollective/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opencollective/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opencollective/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/inquirer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "dependencies": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.1", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "node_modules/opencollective/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/opencollective/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node_modules/opencollective/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opencollective/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dependencies": { + "is-promise": "^2.1.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/opencollective/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opencollective/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true, + "bin": { + "opener": "opener.js" + } + }, + "node_modules/opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==", + "dev": true, + "dependencies": { + "cssnano": "^3.4.0", + "last-call-webpack-plugin": "^2.1.2" + } + }, + "node_modules/optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", + "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.0", + "log-symbols": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "dependencies": { + "url-parse": "1.0.x" + } + }, + "node_modules/original/node_modules/url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "dependencies": { + "querystringify": "0.0.x", + "requires-port": "1.0.x" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pac-proxy-agent": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", + "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==", + "dev": true, + "dependencies": { + "agent-base": "2", + "debug": "2", + "extend": "3", + "get-uri": "2", + "http-proxy-agent": "1", + "https-proxy-agent": "1", + "pac-resolver": "~2.0.0", + "raw-body": "2", + "socks-proxy-agent": "2" + } + }, + "node_modules/pac-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz", + "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=", + "dev": true, + "dependencies": { + "co": "~3.0.6", + "degenerator": "~1.0.2", + "ip": "1.0.1", + "netmask": "~1.0.4", + "thunkify": "~2.1.1" + } + }, + "node_modules/pac-resolver/node_modules/co": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", + "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "dependencies": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "dependencies": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "node_modules/popper.js": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz", + "integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1" + }, + "node_modules/portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "dependencies": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", + "integrity": "sha512-m758RWPmSjFH/2MyyG3UOW1fgYbR9rtdzz5UNJnlm7OLtu4B2h9C6gi+bE4qFKghsBRFfZT8NzoQBs6JhLotoA==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "source-map": "^0.6.1", + "supports-color": "^5.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "dependencies": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "node_modules/postcss-calc/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-calc/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-calc/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-calc/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "dependencies": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/postcss-colormin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-colormin/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-colormin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "dependencies": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "node_modules/postcss-convert-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-convert-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-convert-values/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "dependencies": { + "postcss": "^5.0.14" + } + }, + "node_modules/postcss-discard-comments/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-comments/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "dependencies": { + "postcss": "^5.0.14" + } + }, + "node_modules/postcss-discard-empty/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-empty/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "dependencies": { + "postcss": "^5.0.16" + } + }, + "node_modules/postcss-discard-overridden/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-overridden/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "dependencies": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-discard-unused/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-filter-plugins": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4", + "uniqid": "^4.0.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-filter-plugins/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-filter-plugins/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-import": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", + "integrity": "sha1-qWLi34LTvFptpqOGhBdHIE9B71s=", + "dev": true, + "dependencies": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "node_modules/postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.10.tgz", + "integrity": "sha512-xQaDcEgJ/2JqFY18zpFkik8vyYs7oS5ZRbrjvDqkP97k2wYWfPT4+qA0m4o3pTSCsz0u26PNqs8ZO9FRUWAqrA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.3.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "node_modules/postcss-merge-idents/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-idents/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-merge-longhand/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-longhand/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "dependencies": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", + "dev": true, + "dependencies": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/postcss-merge-rules/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-merge-rules/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "node_modules/postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "node_modules/postcss-minify-font-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-font-values/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "dependencies": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-gradients/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-minify-params/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-params/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-params/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-minify-selectors/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "dependencies": { + "postcss": "^5.0.5" + } + }, + "node_modules/postcss-normalize-charset/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-normalize-charset/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "node_modules/postcss-normalize-url/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-normalize-url/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "node_modules/postcss-ordered-values/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-ordered-values/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "node_modules/postcss-reduce-idents/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-idents/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "dependencies": { + "postcss": "^5.0.4" + } + }, + "node_modules/postcss-reduce-initial/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-initial/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "node_modules/postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "dependencies": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "node_modules/postcss-svgo/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-svgo/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-unique-selectors/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-url": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.0.tgz", + "integrity": "sha512-VBP6uf6iL3AZra23nkPkOEkS/5azj1xf/toRrjfkolfFEgg9Gyzg9UhJZeIsz12EGKZTNVeGbPa2XtaZm/iZvg==", + "dev": true, + "dependencies": { + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "node_modules/postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "node_modules/postcss-zindex/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-zindex/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/postcss-zindex/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-zindex/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.10.2.tgz", + "integrity": "sha512-TcdNoQIWFoHblurqqU6d1ysopjq7UX0oRcT/hJ8qvBAELiYWn+Ugf0AXdnzISEJ7vuhNnQ98N8jR8Sh53x4IZg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "dependencies": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "node_modules/pretty-format": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", + "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.5.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz", + "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=", + "dev": true, + "dependencies": { + "agent-base": "2", + "debug": "2", + "extend": "3", + "http-proxy-agent": "1", + "https-proxy-agent": "1", + "lru-cache": "~2.6.5", + "pac-proxy-agent": "1", + "socks-proxy-agent": "2" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", + "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.6.tgz", + "integrity": "sha512-BurGAcvezsINL5US9T9wGHHcLNrG6MCp//ECtxron3vcR+Rfx5Anqq7HbZXNJvFQli8FGVsWCAvywEJFV5Hx/Q==", + "dev": true, + "dependencies": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.0.tgz", + "integrity": "sha512-6MYypjOvtiXhBSTOD0Zs5eNjCGfnqi5mPsCsW+dgKTxrZzQMZQNpBo3XRkLx7id753f3EeyHLBqzqqUymIolgw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "node_modules/randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "node_modules/recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dependencies": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "dependencies": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + } + }, + "node_modules/reduce-css-calc/node_modules/balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "node_modules/reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "dependencies": { + "balanced-match": "^0.4.2" + } + }, + "node_modules/reduce-function-call/node_modules/balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", + "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "dependencies": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + } + }, + "node_modules/renderkid/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/renderkid/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/renderkid/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/renderkid/node_modules/utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "dependencies": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "dependencies": { + "once": "^1.3.0" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "node_modules/rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/sane": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz", + "integrity": "sha512-OSJxhHO0CgPUw3lUm3GhfREAfza45smvEI9ozuFrxKG10GHVo0ryW9FK5VYlLvxj0SV7HVKHW0voYJIRu27GWg==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": ">=0.6.0" + }, + "optionalDependencies": { + "fsevents": "^1.1.1" + } + }, + "node_modules/sane/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "dependencies": { + "ajv": "^5.0.0" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selenium-server": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.8.1.tgz", + "integrity": "sha512-Ym66mGUUFN0YUceazRQldtxm6mMmcvFY/XAX/FI+wxAPF3692W/lu1HKB7AMb1MK0s+qWYjtiXrT4eFjtNIekg==", + "dev": true, + "bin": { + "selenium": "bin/selenium" + } + }, + "node_modules/selfsigned": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", + "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "dev": true, + "dependencies": { + "node-forge": "0.6.33" + } + }, + "node_modules/semantic-ui-css": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.2.12.tgz", + "integrity": "sha512-RrA3k6hya+kEMDmVLT38SBTDQD8FgdnFi16eMPuQ1N1xUOoBxKzr+HZASb7Zo3xlMvkYqEWvPIp58Wjl6Zcsfg==", + "dependencies": { + "jquery": "x.*" + } + }, + "node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "node_modules/serve-favicon": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", + "dependencies": { + "etag": "~1.7.0", + "fresh": "0.3.0", + "ms": "0.7.2", + "parseurl": "~1.3.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-favicon/node_modules/etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-favicon/node_modules/fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-favicon/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "dependencies": { + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "deprecated": "Critical bug fixed in v3.0.1, please upgrade to the latest version.", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "node_modules/sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "iojs": "*", + "node": ">=0.11.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "engines": { + "node": ">= 0.10.15", + "npm": ">= 1.3.5" + } + }, + "node_modules/snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "dev": true, + "dependencies": { + "hoek": "4.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "node_modules/sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "dependencies": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "deprecated": "If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0", + "dev": true, + "dependencies": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + }, + "engines": { + "node": ">= 0.10.0", + "npm": ">= 1.3.5" + } + }, + "node_modules/socks-proxy-agent": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", + "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==", + "dev": true, + "dependencies": { + "agent-base": "2", + "extend": "3", + "socks": "~1.1.5" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sortable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sortable/-/sortable-2.0.0.tgz", + "integrity": "sha1-NLNUK0KQTFm4RU9VFIoPT2AYaUM=", + "dependencies": { + "hyperscript": "~1.0.1", + "jquery-browserify": "~1.8.1", + "observable": "~1.3.1" + } + }, + "node_modules/sortablejs": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.7.0.tgz", + "integrity": "sha1-gKKyNwq9Vo4c7IwnETHvMKkE+ig=" + }, + "node_modules/source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "dependencies": { + "spdx-license-ids": "^1.0.2" + } + }, + "node_modules/spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "node_modules/spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "node_modules/spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "engines": [ + "node >= 0.7.0" + ], + "dependencies": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + } + }, + "node_modules/spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "dependencies": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/ssf": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.9.4.tgz", + "integrity": "sha1-jlepjBnbvx7dU/D4yef9UksPbJw=", + "dependencies": { + "colors": "0.6.2", + "frac": "~1.0.6", + "voc": "" + }, + "bin": { + "ssf": "bin/ssf.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ssf/node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "getpass": "^0.1.1" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + }, + "optionalDependencies": { + "bcrypt-pbkdf": "^1.0.0", + "ecc-jsbn": "~0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + } + }, + "node_modules/ssri": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.0.0.tgz", + "integrity": "sha512-728D4yoQcQm1ooZvSbywLkV1RjfITZXh0oWrhM/lnsx3nAHx7LsRGJWB/YyvoceAYRq98xqbstiN4JBv1/wNHg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true, + "dependencies": { + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "node_modules/table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "node_modules/thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "node_modules/thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "node_modules/time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", + "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "regex-not": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.15" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/uglify-js": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.5.tgz", + "integrity": "sha512-ZebM2kgBL/UI9rKeAbsS2J0UPPv7SBy5hJNZml/YxB1zC6JK8IztcPs+cxilE4pu0li6vadVSFqiO7xFTKuSrg==", + "dev": true, + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "node_modules/uglifyjs-webpack-plugin": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.6.tgz", + "integrity": "sha512-VUja+7rYbznEvUaeb8IxOCTUrq4BCb1ml0vffa+mfwKtrAwlqnU0ENF14DtYltV1cxd/HSuK51CCA/D/8kMQVw==", + "dev": true, + "dependencies": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.2", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true, + "peerDependencies": { + "ajv": "^5.0.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/schema-utils": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.3.tgz", + "integrity": "sha512-sgv/iF/T4/SewJkaVpldKC4WjSkz0JsOh2eKtxCPpCO1oR05+7MOF+H476HVRbLArkgA7j5TRJJ4p2jdFkUGQQ==", + "dev": true, + "dependencies": { + "ajv": "^5.0.0", + "ajv-keywords": "^2.1.0" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/uglify-es": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.5.tgz", + "integrity": "sha512-7IvaFuYtfbcXm0fGb13mmRYVQdzQDXETAtvYHbCDPt2V88Y8l2HaULOyW6ueoYA0JhGIcLK7dtHkDcBWySqnBw==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dev": true, + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "deprecated": "Critical bug fixed in v3.0.1, please upgrade to the latest version.", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqid": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "dependencies": { + "macaddress": "^0.2.8" + } + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "mime": "1.3.x" + }, + "peerDependencies": { + "file-loader": "*" + } + }, + "node_modules/url-loader/node_modules/mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "dependencies": { + "querystringify": "~1.0.0", + "requires-port": "~1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url-parse/node_modules/querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + }, + "node_modules/url-pattern": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz", + "integrity": "sha1-BAkpJHGyTyPFDWWkeTF5PStaz8E=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use/node_modules/lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "dependencies": { + "set-getter": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "dependencies": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "dependencies": { + "indexof": "0.0.1" + } + }, + "node_modules/voc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/voc/-/voc-1.1.0.tgz", + "integrity": "sha512-fthgd8OJLqq8vPcLjElTk6Rcl2e3v5ekcXauImaqEnQqd5yUWKg1+ZOBgS2KTWuVKcuvZMQq4TDptiT1uYddUA==", + "bin": { + "voc": "voc.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vue": { + "version": "2.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.13.tgz", + "integrity": "sha512-3D+lY7HTkKbtswDM4BBHgqyq+qo8IAEE8lz8va1dz3LLmttjgo0FxairO4r1iN2OBqk8o1FyL4hvzzTFEdQSEw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details." + }, + "node_modules/vue-carousel": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/vue-carousel/-/vue-carousel-0.6.5.tgz", + "integrity": "sha1-8E5Ehc5qwkBOr/GGkj960FeDkgU=" + }, + "node_modules/vue-clip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-clip/-/vue-clip-1.0.0.tgz", + "integrity": "sha1-woOZ6kyklXo5EIZYTVBUinQ0CYA=", + "dependencies": { + "dropzone": "^4.3.0", + "lodash.clone": "^4.5.0" + } + }, + "node_modules/vue-clip/node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "node_modules/vue-dual-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-dual-list/-/vue-dual-list-1.0.0.tgz", + "integrity": "sha512-2X9E5iOzVw/edsYrmKvBlMeetusbM5nzNB+Pv3WlLVzGMC5A4OBwLW3SAS55kAGNsKEexWpeUdPaZz1IADEkew==", + "dependencies": { + "express": "4.15.2", + "serve-favicon": "2.3.2", + "vue": "^2.2.6", + "vue-material": "^0.7.1", + "vue-router": "^2.3.1" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/vue-dual-list/node_modules/debug": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", + "integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E=", + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/vue-dual-list/node_modules/express": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.2.tgz", + "integrity": "sha1-rxB/wUhQRFfy3Kmm8lcdcSm5ezU=", + "dependencies": { + "accepts": "~1.3.3", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "~1.0.2", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.1", + "depd": "~1.1.0", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.0", + "finalhandler": "~1.0.0", + "fresh": "0.5.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.1", + "path-to-regexp": "0.1.7", + "proxy-addr": "~1.1.3", + "qs": "6.4.0", + "range-parser": "~1.2.0", + "send": "0.15.1", + "serve-static": "1.12.1", + "setprototypeof": "1.0.3", + "statuses": "~1.3.1", + "type-is": "~1.6.14", + "utils-merge": "1.0.0", + "vary": "~1.1.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/vue-dual-list/node_modules/finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vue-dual-list/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/vue-dual-list/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/vue-dual-list/node_modules/fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/vue-dual-list/node_modules/ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vue-dual-list/node_modules/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/vue-dual-list/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "node_modules/vue-dual-list/node_modules/proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "dependencies": { + "forwarded": "~0.1.0", + "ipaddr.js": "1.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/vue-dual-list/node_modules/qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/vue-dual-list/node_modules/send": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.1.tgz", + "integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18=", + "dependencies": { + "debug": "2.6.1", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.0", + "fresh": "0.5.0", + "http-errors": "~1.6.1", + "mime": "1.3.4", + "ms": "0.7.2", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/vue-dual-list/node_modules/serve-static": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.1.tgz", + "integrity": "sha1-dEOpZePO1kes61Y5+ga/TRu+ADk=", + "dependencies": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.15.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/vue-dual-list/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/vue-dual-list/node_modules/utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vue-dual-list/node_modules/vue-router": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-2.8.1.tgz", + "integrity": "sha512-MC4jacHBhTPKtmcfzvaj2N7g6jgJ/Z/eIjZdt+yUaUOM1iKC0OUIlO/xCtz6OZFFTNUJs/1YNro2GN/lE+nOXA==" + }, + "node_modules/vue-form-wizard": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/vue-form-wizard/-/vue-form-wizard-0.8.4.tgz", + "integrity": "sha512-/Zk1+B7bz7qHFJ16mwu021lpPXWf/9Tlr2mTNG3J7M0Hdy3rgA802lWsbKYySns0B0qtsD8BYGjQ2Wyxgg+4uw==", + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/vue-functional-data-merge": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-2.0.4.tgz", + "integrity": "sha512-Q7OBltO35UEYnRxLcweulhi37/kYVfToqSrsdsbwM5os2DjRB1+k9YKtYcZEdjTUTC+QIqCMjqxggRn1mMoC1w==" + }, + "node_modules/vue-good-table": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/vue-good-table/-/vue-good-table-1.20.2.tgz", + "integrity": "sha512-rSbO2BPAYE5sv2+lWhQdiEdAUVOuXIdEVt2PZJptWPwyUqpaFjUlnhslFtvXVMd0I9dRGI19JovPl8bHSYH71g==", + "dependencies": { + "babel-runtime": "^6.26.0", + "date-fns": "^2.0.0-alpha.7", + "diacriticless": "1.0.1", + "lodash.clone": "^4.5.0", + "lodash.foreach": "^4.5.0" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/vue-good-table/node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "node_modules/vue-hot-reload-api": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.2.4.tgz", + "integrity": "sha512-e+ThJMYmZg4D9UnrLcr6LQxGu6YlcxkrmZGPCyIN4malcNhdeGGKxmFuM5y6ICMJJxQywLfT8MM1rYZr4LpeLw==", + "dev": true + }, + "node_modules/vue-jest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-1.4.0.tgz", + "integrity": "sha512-X5YXTXcpklijK3wXG/CiW8Frkz+YPBjR+//FD5rcmlnmEelz+8AQpKA8vhbAHJx3gOhA2tkWt8XEjvxq1S0heg==", + "dev": true, + "dependencies": { + "babel-core": "^6.25.0", + "babel-preset-vue-app": "^1.3.1", + "chalk": "^2.1.0", + "find-babel-config": "^1.1.0", + "js-beautify": "^1.6.14", + "node-cache": "^4.1.1", + "object-assign": "^4.1.1", + "source-map": "^0.5.6", + "tsconfig": "^7.0.0", + "vue-template-es2015-compiler": "^1.5.3" + }, + "peerDependencies": { + "vue": "^2.x", + "vue-template-compiler": "^2.x" + } + }, + "node_modules/vue-jest/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-json-excel": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/vue-json-excel/-/vue-json-excel-0.1.7.tgz", + "integrity": "sha1-yezD33O7dh9IEHaxfE9H+cj+iC8=", + "dependencies": { + "downloadjs": "^1.4.7" + } + }, + "node_modules/vue-loader": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.0.tgz", + "integrity": "sha512-kDXRgglOOltghngrDFS/YfFew7e0d8fkvPHLYAfLgur7GW0cBt+J0fpBReWY2pixA09dL13abfE4fECyRH4HGg==", + "dev": true, + "dependencies": { + "consolidate": "^0.14.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "lru-cache": "^4.1.1", + "postcss": "^6.0.8", + "postcss-load-config": "^1.1.0", + "postcss-selector-parser": "^2.0.0", + "prettier": "^1.7.0", + "resolve": "^1.4.0", + "source-map": "^0.6.1", + "vue-hot-reload-api": "^2.2.0", + "vue-style-loader": "^3.0.0", + "vue-template-es2015-compiler": "^1.6.0" + }, + "peerDependencies": { + "css-loader": "*", + "vue-template-compiler": "^2.0.0" + } + }, + "node_modules/vue-material": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/vue-material/-/vue-material-0.7.5.tgz", + "integrity": "sha512-MRtEeeOnMBVxaVoGoXcwupgdxqa3DyGDGXAA/7wzMRgQ4dWFNTlaS+p5434068dBJT7EofZe5La/ONKYivL2XQ==", + "peerDependencies": { + "vue": "^2.4.2" + } + }, + "node_modules/vue-materialize-datatable": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/vue-materialize-datatable/-/vue-materialize-datatable-0.7.3.tgz", + "integrity": "sha512-qOVaUPfNbmBFzZgHYsWl8n2XwsG4H1Y2yz9U0pdm/wcbNeN1lcfcAhCEq5A0a3AaxdefETnk01ndjw60iT9ixg==", + "dependencies": { + "babel-runtime": "^6.0.0", + "fuse.js": "^2.6.2", + "vue": "^1.0.21" + } + }, + "node_modules/vue-materialize-datatable/node_modules/vue": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/vue/-/vue-1.0.28.tgz", + "integrity": "sha1-7S/weyAL3hXIepDvhyfO6n04Vn0=", + "dependencies": { + "envify": "^3.4.0" + } + }, + "node_modules/vue-mover": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vue-mover/-/vue-mover-0.3.0.tgz", + "integrity": "sha512-/gfhHVMKkCwB/0dkNh7f2ArC8lIaCyanJGNYOnvszZYSFdPsL+AyL/4iudjR07ciHYc7KWtlMl9z755KfxMZSA==", + "dependencies": { + "sortablejs": "^1.6.1", + "vue": "^2.4.4" + } + }, + "node_modules/vue-multiselect": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.0.8.tgz", + "integrity": "sha512-OKdWOwCLXiDGHVaYqWZXx4s2YNqOmfIqFMTd0Y3SzCcFIp19d7UeLB4UVZvIHammzMX4qrQ3yAzNHJmE0ApgHA==", + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/vue-resource": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/vue-resource/-/vue-resource-1.3.5.tgz", + "integrity": "sha512-m9UC5q0Mcd6MphEVVPCeC609XrsWHatmT39UKhE3oQz1GojnjbyReU1ggX9uQqM6FB81XXFX/GU28yMHJ69O7w==", + "dependencies": { + "got": "^7.1.0" + } + }, + "node_modules/vue-resource-mock": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/vue-resource-mock/-/vue-resource-mock-0.0.8.tgz", + "integrity": "sha512-E8v11UZxX6SmVSdEKX9vAhxyCTs+w7wFK/qVIuLZkCBrAPJ7YOc2zOOF3gFPBlok9bUJ/1wjW/zj2XgXf9VhaA==", + "dependencies": { + "qs": "^6.3.0", + "url-pattern": "^1.0.3" + }, + "peerDependencies": { + "vue-resource": "^0.9.x || ^1.x" + } + }, + "node_modules/vue-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", + "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" + }, + "node_modules/vue-select": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-2.4.0.tgz", + "integrity": "sha512-WxQc7t65ht3YSwSgcSdHFU8cSOWKpvH6n1B/Z9ua44hMB2oVcy0Mieu4qjMPrYx3AQQ8Y8F+pfNIylRZ0t3IVA==", + "peerDependencies": { + "vue": "2.x" + } + }, + "node_modules/vue-strap": { + "version": "1.1.40", + "resolved": "https://registry.npmjs.org/vue-strap/-/vue-strap-1.1.40.tgz", + "integrity": "sha1-CRGDz66p5Fbop6CSudxpeowYQwI=", + "dependencies": { + "bootstrap": "^3.3.7", + "vue": "^1.0.26" + } + }, + "node_modules/vue-strap/node_modules/bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", + "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=", + "engines": { + "node": ">=0.10.1" + } + }, + "node_modules/vue-strap/node_modules/vue": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/vue/-/vue-1.0.28.tgz", + "integrity": "sha1-7S/weyAL3hXIepDvhyfO6n04Vn0=", + "dependencies": { + "envify": "^3.4.0" + } + }, + "node_modules/vue-style-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.0.3.tgz", + "integrity": "sha512-P/ihpaZKU23T1kq3E0y4c+F8sbm1HQO69EFYoLoGMSGVAHroHsGir/WQ9qUavP8dyFYHmXenzHaJ/nqd8vfaxw==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.5.13", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.13.tgz", + "integrity": "sha512-15HWSgIxrGUcV0v7QRen2Y3fQsbgxXwMvjT/5XKMO0ANmaCcNh7y2OeIDTAuSGeosjb9+E1Pn2PHZ61VQWEgBQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz", + "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", + "dev": true + }, + "node_modules/vue-xlsx-table": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/vue-xlsx-table/-/vue-xlsx-table-1.2.8.tgz", + "integrity": "sha512-shvWAgdc6jozucmEoeCoBLBL3x9t9AYrTnJdP6lr56UTs6HEnt8bzzstWh31nGP3dKEXHZVzsy9bBAMPCLSvZQ==", + "dependencies": { + "xlsx": "^0.9.3" + } + }, + "node_modules/vue-xlsx-table-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-xlsx-table-components/-/vue-xlsx-table-components-1.0.1.tgz", + "integrity": "sha1-M77rME1C646FHLTeEZvI1NYpvWo=", + "dependencies": { + "vue": "^2.4.4", + "xlsx": "^0.9.3" + } + }, + "node_modules/vue2-autocomplete-js": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/vue2-autocomplete-js/-/vue2-autocomplete-js-0.2.2.tgz", + "integrity": "sha1-t6GILZeMsJJbuHjV6g3UdVomH5U=", + "dependencies": { + "vue": "^2.4.2" + } + }, + "node_modules/vue2-datatable-component": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vue2-datatable-component/-/vue2-datatable-component-2.2.2.tgz", + "integrity": "sha1-Jlb71msAQzHlqbChsfDEWh5c8tU=", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/vuetable-2": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/vuetable-2/-/vuetable-2-1.7.2.tgz", + "integrity": "sha512-9DRNDGt4qNhVdYs+5Vcc9B/8TwUsoEeXq1W7rDgazbkX2BqdZoV3DaZ/H6QbO2xlHBXZiwJcjPQ1k4qMe48R4w==", + "dependencies": { + "axios": "^0.15.3" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/vuetable-2/node_modules/axios": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.0.0" + } + }, + "node_modules/vuetable-2/node_modules/follow-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dependencies": { + "debug": "^2.2.0" + } + }, + "node_modules/vuetify": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.0.11.tgz", + "integrity": "sha512-R+wi3AnT1OCbHLhbZWlKUZmiamS+6jAy0gPTbtmRFXJOXWTV5DGMSyRWktjrpq6pxEEdEaJyGmOeurPYmnGxmg==", + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + }, + "peerDependencies": { + "vue": "^2.5.0" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "dependencies": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/watch/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "dependencies": { + "async": "^2.1.2", + "chokidar": "^1.7.0", + "graceful-fs": "^4.1.2" + } + }, + "node_modules/wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "dependencies": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.2.tgz", + "integrity": "sha1-Y+2G63HMTNqG9o5oWoRTC6ASZEk=", + "dev": true, + "dependencies": { + "acorn": "^5.1.1", + "chalk": "^1.1.3", + "commander": "^2.9.0", + "ejs": "^2.5.6", + "express": "^4.15.2", + "filesize": "^3.5.9", + "gzip-size": "^3.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "opener": "^1.4.3", + "ws": "^4.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "dependencies": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "engines": { + "node": ">=0.6" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.10.1.tgz", + "integrity": "sha512-R9iZOrbIIsP2mw2j172HVjf479Zb9kcG0chjzHRrE/4M333NZ+3jOWRWJMGEQXwJzUtRNvVKzX2o27qM59TIhQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "^3.4.1", + "strip-ansi": "^4.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">=4.7" + }, + "peerDependencies": { + "webpack": "^2.2.0 || ^3.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", + "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.0.tgz", + "integrity": "sha512-OgXCNv2U6TnG04D3tth0gsvdbV4zdbxFG3sYUqcoQMoEFVd1j1pZR6TZ8iknC45o9IJ6PeQI/J6wT/+cHcniAw==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.3.tgz", + "integrity": "sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz", + "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.0", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.0", + "nanomatch": "^1.2.5", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true, + "peerDependencies": { + "ajv": "^5.0.0" + } + }, + "node_modules/webpack/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/webpack/node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/webpack/node_modules/uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + }, + "peerDependencies": { + "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0" + } + }, + "node_modules/webpack/node_modules/yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/webpack/node_modules/yargs/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/yargs/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/webpack/node_modules/yargs/node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.19" + } + }, + "node_modules/whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/worker-farm": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", + "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.4", + "xtend": "^4.0.1" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.0.0.tgz", + "integrity": "sha512-QYslsH44bH8O7/W2815u5DpnCpXWpEK44FmaHffNwgJI4JMaSZONgPBTOfrxJ29mXKbXak+LsJ2uAkDTYq2ptQ==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/xlsx": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.9.13.tgz", + "integrity": "sha1-WGHRHhCh+ZtvK0keLRGad3fQZuc=", + "deprecated": "this version is no longer supported. More info at https://cdn.sheetjs.com/xlsx/", + "dependencies": { + "adler-32": "~1.0.0", + "cfb": "~0.11.1", + "codepage": "~1.8.0", + "commander": "~2.9.0", + "crc-32": "~1.0.2", + "exit-on-epipe": "~1.0.0", + "ssf": "~0.9.1" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhashjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.1.tgz", + "integrity": "sha1-m76b6JYUKXbfo0wGGy0GjEPTDeA=", + "dev": true, + "dependencies": { + "cuint": "latest" + } + }, + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/yargs/node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "dependencies": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/rql-ui/package.json b/rql-ui/package.json new file mode 100644 index 0000000..58a35a0 --- /dev/null +++ b/rql-ui/package.json @@ -0,0 +1,116 @@ +{ + "name": "rql-ui", + "version": "1.1.0-SNAPSHOT", + "description": "A Vue.js project", + "author": "", + "private": true, + "scripts": { + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev", + "unit": "jest --config test/unit/jest.conf.js --coverage", + "e2e": "node test/e2e/runner.js", + "test": "npm run unit && npm run e2e", + "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", + "build": "node build/build.js" + }, + "dependencies": { + "axios": "^0.18.0", + "bootstrap": "^4.0.0-beta.3", + "bootstrap-vue": "^1.4.1", + "jquery-mobile": "^1.5.0-alpha.1", + "material-design-icons-iconfont": "^3.0.3", + "mockjs": "^1.0.1-beta3", + "moment": "^2.21.0", + "semantic-ui-css": "^2.2.12", + "sortable": "^2.0.0", + "vue": "^2.5.2", + "vue-carousel": "^0.6.5", + "vue-clip": "^1.0.0", + "vue-dual-list": "^1.0.0", + "vue-form-wizard": "^0.8.4", + "vue-good-table": "^1.20.2", + "vue-json-excel": "^0.1.7", + "vue-materialize-datatable": "^0.7.3", + "vue-mover": "^0.3.0", + "vue-multiselect": "^2.0.8", + "vue-resource": "^1.3.5", + "vue-resource-mock": "0.0.8", + "vue-router": "^3.0.1", + "vue-select": "^2.4.0", + "vue-strap": "^1.1.40", + "vue-xlsx-table": "^1.2.8", + "vue-xlsx-table-components": "^1.0.1", + "vue2-autocomplete-js": "^0.2.2", + "vue2-datatable-component": "^2.2.2", + "vuetable-2": "^1.7.2", + "vuetify": "^1.0.11" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^7.1.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-jest": "^21.0.2", + "babel-loader": "^7.1.1", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^2.0.1", + "chromedriver": "^2.27.2", + "copy-webpack-plugin": "^4.0.1", + "cross-spawn": "^5.0.1", + "css-loader": "^0.28.0", + "eslint": "^3.19.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-html": "^3.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "jest": "^21.2.0", + "jest-serializer-vue": "^0.3.0", + "jquery": "^1.12.4", + "nightwatch": "^0.9.12", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-jest": "^1.0.2", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/rql-ui/src/App.vue b/rql-ui/src/App.vue new file mode 100644 index 0000000..7a16f2a --- /dev/null +++ b/rql-ui/src/App.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/rql-ui/src/assets/RQL.css b/rql-ui/src/assets/RQL.css new file mode 100644 index 0000000..622d426 --- /dev/null +++ b/rql-ui/src/assets/RQL.css @@ -0,0 +1,516 @@ +fieldset[disabled] .multiselect { + pointer-events: none + } + + .multiselect__spinner { + position: absolute; + right: 1px; + top: 1px; + width: 48px; + height: 35px; + background: #fff; + display: block + } + + .multiselect__spinner:after, + .multiselect__spinner:before { + position: absolute; + content: ""; + top: 50%; + left: 50%; + margin: -8px 0 0 -8px; + width: 16px; + height: 16px; + border-radius: 100%; + border-color: #08a4ff transparent transparent; + border-style: solid; + border-width: 2px; + box-shadow: 0 0 0 1px transparent + } + + .multiselect__spinner:before { + animation: a 2.4s cubic-bezier(.41, .26, .2, .62); + animation-iteration-count: infinite + } + + .multiselect__spinner:after { + animation: a 2.4s cubic-bezier(.51, .09, .21, .8); + animation-iteration-count: infinite + } + + .multiselect__loading-enter-active, + .multiselect__loading-leave-active { + transition: opacity .4s ease-in-out; + opacity: 1 + } + + .multiselect__loading-enter, + .multiselect__loading-leave-active { + opacity: 0 + } + + .multiselect, + .multiselect__input, + .multiselect__single { + font-family: inherit; + font-size: 8pt; + -ms-touch-action: manipulation; + touch-action: manipulation + } + + .multiselect { + box-sizing: content-box; + display: block; + position: relative; + width: 100%; + min-height: 40px; + text-align: left; + color: #35495e + } + + .multiselect * { + box-sizing: border-box + } + + .multiselect:focus { + outline: none + } + + .multiselect--disabled { + opacity: .6 + } + + .multiselect--active { + z-index: 1 + } + + .multiselect--active:not(.multiselect--above) .multiselect__current, + .multiselect--active:not(.multiselect--above) .multiselect__input, + .multiselect--active:not(.multiselect--above) .multiselect__tags { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 + } + + .multiselect--active .multiselect__select { + transform: rotate(180deg) + } + + .multiselect--above.multiselect--active .multiselect__current, + .multiselect--above.multiselect--active .multiselect__input, + .multiselect--above.multiselect--active .multiselect__tags { + border-top-left-radius: 0; + border-top-right-radius: 0 + } + + .multiselect__input, + .multiselect__single { + position: relative; + display: inline-block; + min-height: 30px; + line-height: 20px; + border: none; + border-radius: 5px; + background: #fff; + padding: 0 0 0 5px; + width: 100%; + transition: border .1s ease; + box-sizing: border-box; + margin-bottom: 8px; + vertical-align: top + } + + .multiselect__tag~.multiselect__input, + .multiselect__tag~.multiselect__single { + width: auto + } + + .multiselect__input:hover, + .multiselect__single:hover { + border-color: #cfcfcf + } + + .multiselect__input:focus, + .multiselect__single:focus { + border-color: #a8a8a8; + outline: none + } + + .multiselect__single { + padding-left: 6px; + margin-bottom: 8px + } + + .multiselect__tags-wrap { + display: inline + } + + .multiselect__tags { + max-height: 80px; + display: block; + padding: 8px 40px 0 8px; + border-radius: 5px; + border: 1px solid #e8e8e8; + background: #fff; + overflow: auto; + } + + .multiselect__tag { + position: relative; + display: inline-block; + padding: 4px 26px 4px 10px; + border-radius: 5px; + margin-right: 10px; + color: #fff; + line-height: 1; + background: #009688; + margin-bottom: 5px; + white-space: nowrap; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis + } + + .multiselect__tag-icon { + cursor: pointer; + margin-left: 7px; + position: absolute; + right: 0; + top: 0; + bottom: 0; + font-weight: 700; + font-style: normal; + width: 22px; + text-align: center; + line-height: 22px; + transition: all .2s ease; + border-radius: 5px + } + + .multiselect__tag-icon:after { + content: "\D7"; + color: #fff; + font-size: 14px + } + + .multiselect__tag-icon:focus, + .multiselect__tag-icon:hover { + background: #009688 + } + + .multiselect__tag-icon:focus:after, + .multiselect__tag-icon:hover:after { + color: #fff + } + + .multiselect__current { + min-height: 40px; + overflow: hidden; + padding: 8px 12px 0; + padding-right: 30px; + white-space: nowrap; + border-radius: 5px; + border: 1px solid #e8e8e8 + } + + .multiselect__current, + .multiselect__select { + line-height: 16px; + box-sizing: border-box; + display: block; + margin: 0; + text-decoration: none; + cursor: pointer + } + + .multiselect__select { + position: absolute; + width: 40px; + height: 38px; + right: 1px; + top: 1px; + padding: 4px 8px; + text-align: center; + transition: transform .2s ease + } + + .multiselect__select:before { + position: relative; + right: 0; + top: 65%; + color: #999; + margin-top: 4px; + border-style: solid; + border-width: 5px 5px 0; + border-color: #999 transparent transparent; + content: "" + } + + .multiselect__placeholder { + color: #adadad; + display: inline-block; + margin-bottom: 10px; + padding-top: 2px + } + + .multiselect--active .multiselect__placeholder { + display: none + } + + .multiselect__content-wrapper { + position: absolute; + display: block; + background: #fff; + width: 100%; + max-height: 240px; + overflow: auto; + border: 1px solid #e8e8e8; + border-top: none; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + z-index: 1; + -webkit-overflow-scrolling: touch + } + + .multiselect__content { + list-style: none; + display: inline-block; + padding: 0; + margin: 0; + min-width: 100%; + vertical-align: top + } + + .multiselect--above .multiselect__content-wrapper { + bottom: 100%; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: none; + border-top: 1px solid #e8e8e8 + } + + .multiselect__content::webkit-scrollbar { + display: none + } + + .multiselect__element { + display: block + } + + .multiselect__option { + display: block; + padding: 12px; + min-height: 40px; + line-height: 16px; + text-decoration: none; + text-transform: none; + vertical-align: middle; + position: relative; + cursor: pointer; + white-space: nowrap + } + + .multiselect__option:after { + top: 0; + right: 0; + position: absolute; + line-height: 40px; + padding-right: 12px; + padding-left: 20px + } + + .multiselect__option--highlight { + background: #009688; + outline: none; + color: #fff + } + + .multiselect__option--highlight:after { + content: attr(data-select); + background: #009688; + color: #fff + } + + .multiselect__option--selected { + background: #f3f3f3; + color: #355e46; + font-weight: 700 + } + + .multiselect__option--selected:after { + content: attr(data-selected); + color: silver + } + + .multiselect__option--selected.multiselect__option--highlight { + background: #ff6a6a; + color: #fff + } + + .multiselect__option--selected.multiselect__option--highlight:after { + background: #ff6a6a; + content: attr(data-deselect); + color: #fff + } + + .multiselect--disabled { + background: #ededed; + pointer-events: none + } + + .multiselect--disabled .multiselect__current, + .multiselect--disabled .multiselect__select, + .multiselect__option--disabled { + background: #ededed; + color: #a6a6a6 + } + + .multiselect__option--disabled { + cursor: text; + pointer-events: none + } + + .multiselect__option--disabled.multiselect__option--highlight { + background: #dedede!important + } + + .multiselect-enter-active, + .multiselect-leave-active { + transition: all .15s ease + } + + .multiselect-enter, + .multiselect-leave-active { + opacity: 0 + } + + .multiselect__strong { + margin-bottom: 8px; + line-height: 20px; + display: inline-block; + vertical-align: top + } + + [dir=rtl] .multiselect { + text-align: right + } + + [dir=rtl] .multiselect__select { + right: auto; + left: 1px + } + + [dir=rtl] .multiselect__tags { + padding: 8px 8px 0 40px + } + + [dir=rtl] .multiselect__content { + text-align: right + } + + [dir=rtl] .multiselect__option:after { + right: auto; + left: 0 + } + + [dir=rtl] .multiselect__clear { + right: auto; + left: 12px + } + + [dir=rtl] .multiselect__spinner { + right: auto; + left: 1px + } + @keyframes a { + 0% { + transform: rotate(0) + } + to { + transform: rotate(2turn) + } + } + + .loader { + border: 16px solid #f3f3f3; + border-radius: 50%; + border-top: 16px solid #424242; + width: 120px; + height: 120px; + -webkit-animation: spin 2s linear infinite; + /* Safari */ + animation: spin 2s linear infinite; + margin: auto; + margin-top: 2%; + + } + + @-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } + } + + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + .select-style { + border: 1.2px solid #233; + border-radius: 2px; + overflow: hidden; + height: 30px; + font-size: 10pt; + font-weight: bold; + color: #fff; + background-color: #007aff; + } + + .select-style select { + padding: 5px 8px; + width: 130%; + border: none; + box-shadow: none; + background: transparent; + background-image: none; + -webkit-appearance: none; + } + + .select-style select:focus { + outline: none; + } + + option[disabled] { + color: #000001; + background-color: #fff; + font-size: 9pt; + font-weight: bold; + border: 5px; + border: #000001; + } + .rqlError{ + margin-left:5%; + margin-top: 20px; + background-color:#CD3645; + color:#fff + } + .sqlError { + margin-left: 5%; + margin-right: 5%; + background-color: #CD3645; + color: #fff; + } + b-list-group-item{ + font-size: 8pt; + } + .no-margin-top { + margin-top:0% + } diff --git a/rql-ui/src/assets/bg.jpg b/rql-ui/src/assets/bg.jpg new file mode 100644 index 0000000..73d4f23 Binary files /dev/null and b/rql-ui/src/assets/bg.jpg differ diff --git a/rql-ui/src/assets/favicon.ico b/rql-ui/src/assets/favicon.ico new file mode 100644 index 0000000..7399cd5 Binary files /dev/null and b/rql-ui/src/assets/favicon.ico differ diff --git a/rql-ui/src/assets/favicon.png b/rql-ui/src/assets/favicon.png new file mode 100644 index 0000000..2e9c62a Binary files /dev/null and b/rql-ui/src/assets/favicon.png differ diff --git a/rql-ui/src/assets/graphicloads_filetype_excel_xls-6.png b/rql-ui/src/assets/graphicloads_filetype_excel_xls-6.png new file mode 100644 index 0000000..dd4d61f Binary files /dev/null and b/rql-ui/src/assets/graphicloads_filetype_excel_xls-6.png differ diff --git a/rql-ui/src/assets/graphicloads_filetype_pdf-6.png b/rql-ui/src/assets/graphicloads_filetype_pdf-6.png new file mode 100644 index 0000000..6d2754a Binary files /dev/null and b/rql-ui/src/assets/graphicloads_filetype_pdf-6.png differ diff --git a/rql-ui/src/assets/graphicloads_filetype_txt-6.png b/rql-ui/src/assets/graphicloads_filetype_txt-6.png new file mode 100644 index 0000000..b5c9261 Binary files /dev/null and b/rql-ui/src/assets/graphicloads_filetype_txt-6.png differ diff --git a/rql-ui/src/assets/tick.png b/rql-ui/src/assets/tick.png new file mode 100644 index 0000000..6c7cb8d Binary files /dev/null and b/rql-ui/src/assets/tick.png differ diff --git a/rql-ui/src/components/CheckRule.vue b/rql-ui/src/components/CheckRule.vue new file mode 100644 index 0000000..fa0fc67 --- /dev/null +++ b/rql-ui/src/components/CheckRule.vue @@ -0,0 +1,427 @@ + + + + diff --git a/rql-ui/src/components/DataBaseSchema.vue b/rql-ui/src/components/DataBaseSchema.vue new file mode 100644 index 0000000..5f0b104 --- /dev/null +++ b/rql-ui/src/components/DataBaseSchema.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/rql-ui/src/components/DatabaseTableImport.vue b/rql-ui/src/components/DatabaseTableImport.vue new file mode 100644 index 0000000..769b4a4 --- /dev/null +++ b/rql-ui/src/components/DatabaseTableImport.vue @@ -0,0 +1,517 @@ + + + + + + diff --git a/rql-ui/src/components/Login.vue b/rql-ui/src/components/Login.vue new file mode 100644 index 0000000..4c3fcf6 --- /dev/null +++ b/rql-ui/src/components/Login.vue @@ -0,0 +1,231 @@ + + + + + \ No newline at end of file diff --git a/rql-ui/src/components/Project.vue b/rql-ui/src/components/Project.vue new file mode 100644 index 0000000..b1b5c1c --- /dev/null +++ b/rql-ui/src/components/Project.vue @@ -0,0 +1,669 @@ + + + + + diff --git a/rql-ui/src/components/QueryArea.vue b/rql-ui/src/components/QueryArea.vue new file mode 100644 index 0000000..71dae9d --- /dev/null +++ b/rql-ui/src/components/QueryArea.vue @@ -0,0 +1,886 @@ + + + + + + diff --git a/rql-ui/src/components/RulesArea.vue b/rql-ui/src/components/RulesArea.vue new file mode 100644 index 0000000..8ff498d --- /dev/null +++ b/rql-ui/src/components/RulesArea.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/rql-ui/src/components/SqlArea.vue b/rql-ui/src/components/SqlArea.vue new file mode 100644 index 0000000..75c8050 --- /dev/null +++ b/rql-ui/src/components/SqlArea.vue @@ -0,0 +1,290 @@ + + + + + + \ No newline at end of file diff --git a/rql-ui/src/components/UtilsMixins.vue b/rql-ui/src/components/UtilsMixins.vue new file mode 100644 index 0000000..7503a94 --- /dev/null +++ b/rql-ui/src/components/UtilsMixins.vue @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/rql-ui/src/components/VueDualList.vue b/rql-ui/src/components/VueDualList.vue new file mode 100644 index 0000000..e92a0ae --- /dev/null +++ b/rql-ui/src/components/VueDualList.vue @@ -0,0 +1,151 @@ + + + + + \ No newline at end of file diff --git a/rql-ui/src/components/Workspace.vue b/rql-ui/src/components/Workspace.vue new file mode 100644 index 0000000..31c7318 --- /dev/null +++ b/rql-ui/src/components/Workspace.vue @@ -0,0 +1,337 @@ + + + + diff --git a/rql-ui/src/components/vue-materialize-datatable/package.json b/rql-ui/src/components/vue-materialize-datatable/package.json new file mode 100644 index 0000000..3016667 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/package.json @@ -0,0 +1,78 @@ +{ + "_from": "vue-materialize-datatable", + "_id": "vue-materialize-datatable@0.7.3", + "_inBundle": false, + "_integrity": "sha512-qOVaUPfNbmBFzZgHYsWl8n2XwsG4H1Y2yz9U0pdm/wcbNeN1lcfcAhCEq5A0a3AaxdefETnk01ndjw60iT9ixg==", + "_location": "/vue-materialize-datatable", + "_phantomChildren": { + "envify": "3.4.1" + }, + "_requested": { + "type": "tag", + "registry": true, + "raw": "vue-materialize-datatable", + "name": "vue-materialize-datatable", + "escapedName": "vue-materialize-datatable", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/vue-materialize-datatable/-/vue-materialize-datatable-0.7.3.tgz", + "_shasum": "1a7aa048f0a9bc8b4df9b6c2b90b371d009bb8f2", + "_spec": "vue-materialize-datatable", + "_where": "C:\\Raedt\\CaldersV1\\rql\\rql-ui", + "author": { + "name": "Yousef Sultan", + "email": "yousef.su.2000@gmail.com" + }, + "bugs": { + "url": "https://github.com/MicroDroid/vue-materialize-datatable/issues" + }, + "bundleDependencies": false, + "dependencies": { + "babel-runtime": "^6.0.0", + "fuse.js": "^2.6.2", + "vue": "^1.0.21" + }, + "deprecated": false, + "description": "Datatable for VueJS with Materialize", + "devDependencies": { + "babel-core": "^6.0.0", + "babel-loader": "^6.0.0", + "babel-plugin-transform-runtime": "^6.0.0", + "babel-preset-es2015": "^6.0.0", + "babel-preset-stage-2": "^6.0.0", + "babel-register": "^6.0.0", + "css-loader": "^0.23.0", + "node-sass": "^3.8.0", + "sass-loader": "^4.0.0", + "vue-html-loader": "^1.2.3", + "vue-loader": "^8.3.0", + "vue-style-loader": "^1.0.0", + "webpack": "^1.12.2" + }, + "homepage": "https://github.com/MicroDroid/vue-materialize-datatable", + "keywords": [ + "Vue", + "Datatable", + "Materialize", + "Table Component" + ], + "license": "MIT", + "main": "./src/DataTable.vue", + "name": "vue-materialize-datatable", + "private": false, + "repository": { + "type": "git", + "url": "git+https://github.com/MicroDroid/vue-materialize-datatable.git" + }, + "scripts": { + "build": "webpack", + "demo": "cd docs && webpack" + }, + "version": "0.7.3" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/DataTable.vue b/rql-ui/src/components/vue-materialize-datatable/src/DataTable.vue new file mode 100644 index 0000000..a12c920 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/DataTable.vue @@ -0,0 +1,563 @@ + + + + + diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/ar.json b/rql-ui/src/components/vue-materialize-datatable/src/locales/ar.json new file mode 100644 index 0000000..4a607f8 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/ar.json @@ -0,0 +1,7 @@ +{ + "rows_per_page": "عدد النتائج كل صفحة", + "out_of_pages": "من أصل", + "all": "الكل", + "__is_rtl": true, + "search_data": "Search data" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/br.json b/rql-ui/src/components/vue-materialize-datatable/src/locales/br.json new file mode 100644 index 0000000..c10ca0d --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/br.json @@ -0,0 +1,6 @@ +{ + "rows_per_page": "Linhas por página", + "out_of_pages": "de", + "all": "Todos", + "search_data": "Pesquisar" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/cat.json b/rql-ui/src/components/vue-materialize-datatable/src/locales/cat.json new file mode 100644 index 0000000..3593768 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/cat.json @@ -0,0 +1,6 @@ +{ + "rows_per_page": "Files per pàgina", + "out_of_pages": "de", + "all": "Totes", + "search_data": "Buscar dades" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/en.json b/rql-ui/src/components/vue-materialize-datatable/src/locales/en.json new file mode 100644 index 0000000..3c79294 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/en.json @@ -0,0 +1,6 @@ +{ + "rows_per_page": "Results per page", + "out_of_pages": "of", + "all": "All", + "search_data": "Search" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/es.json b/rql-ui/src/components/vue-materialize-datatable/src/locales/es.json new file mode 100644 index 0000000..8c7e33f --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/es.json @@ -0,0 +1,6 @@ +{ + "rows_per_page": "Filas por página", + "out_of_pages": "de", + "all": "Todas", + "search_data": "Buscar datos" +} diff --git a/rql-ui/src/components/vue-materialize-datatable/src/locales/index.js b/rql-ui/src/components/vue-materialize-datatable/src/locales/index.js new file mode 100644 index 0000000..a9825c7 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/src/locales/index.js @@ -0,0 +1,7 @@ +module.exports = { + en: require('./en.json'), + ar: require('./ar.json'), + es: require('./es.json'), + br: require('./br.json'), + cat: require('./cat.json') +} diff --git a/rql-ui/src/components/vue-materialize-datatable/webpack.config.js b/rql-ui/src/components/vue-materialize-datatable/webpack.config.js new file mode 100644 index 0000000..eb008a2 --- /dev/null +++ b/rql-ui/src/components/vue-materialize-datatable/webpack.config.js @@ -0,0 +1,29 @@ +var path = require('path'); +var webpack = require('webpack'); + +module.exports = { + entry: './src/DataTable.vue', + + output: { + path: path.resolve(__dirname, './dist'), + filename: 'vue-datatable.js' + }, + + module: { + loaders: [ + { + test: /\.js$/, + loader: 'babel', + exclude: /node_modules/, + include: [path.resolve(__dirname, './src')] + }, + { test: /\.vue$/, loader: 'vue'} + ] + }, + + vue: { + loaders: { + scss: "vue-style!css!sass" + } + }, +} diff --git a/rql-ui/src/directives/Dropdown.js b/rql-ui/src/directives/Dropdown.js new file mode 100644 index 0000000..0eac3ba --- /dev/null +++ b/rql-ui/src/directives/Dropdown.js @@ -0,0 +1,27 @@ +export default { + bind: function (el, binding) { + let ddToggle = el.querySelector('.dropdown-toggle') + let ddMenu = el.querySelector('.dropdown-menu') + let closeOnMenuClick = binding.modifiers.closeOnMenuClick + + ddToggle.addEventListener('click', function (evt) { + evt.preventDefault() + let isShown = el.classList.contains('show') + setTimeout(() => { + el.classList.toggle('show', !isShown) + ddMenu.classList.toggle('show', !isShown) + }) + }) + + window.addEventListener('click', function () { + el.classList.remove('show') + ddMenu.classList.remove('show') + }) + + ddMenu.addEventListener('click', function (evt) { + if (!closeOnMenuClick) { + evt.stopPropagation() + } + }) + } +} diff --git a/rql-ui/src/directives/Expandable.js b/rql-ui/src/directives/Expandable.js new file mode 100644 index 0000000..39825fb --- /dev/null +++ b/rql-ui/src/directives/Expandable.js @@ -0,0 +1,54 @@ +let directive = { + dom: null, + scrollbarTransition: { + el: null, + handler: null + }, + inserted: (el, binding) => { + let items = binding.value.menuItems + let scrollbar = binding.value.refs.Scrollbar + let childClassName = binding.value.childClassName + let childHeight = binding.value.childHeight + directive.dom = { + elements: document.getElementsByClassName(childClassName), + handlers: [] + } + let parentId = binding.value.parentId + directive.scrollbarTransition.el = document.getElementById(parentId).getElementsByClassName('vue-scrollbar-transition')[0] + + directive.scrollbarTransition.handler = event => { + scrollbar.calculateSize() + } + + directive.scrollbarTransition.el.addEventListener('transitionend', directive.scrollbarTransition.handler) + + let expandHandler = item => { + return event => { + if (!item.meta.expanded) { + scrollbar.scrollToY(scrollbar.top - childHeight * item.children.length) + } else { + scrollbar.scrollToY(scrollbar.top + childHeight) + } + scrollbar.calculateSize() + } + } + + for (let i = 0; i < items.length; i++) { + let item = items[i] + let domItem = directive.dom.elements[i] + directive.dom.handlers.push(expandHandler(item)) + if (item.children) { + domItem.addEventListener('transitionend', directive.dom.handlers[i]) + } + } + }, + unbind: () => { + directive.scrollbarTransition.el.removeEventListener('transitionend', directive.scrollbarTransition.handler) + + for (let i = 0; i < directive.dom.elements.length; i++) { + directive.dom.elements[i].removeEventListener('transitionend', directive.dom.handlers[i]) + } + } +} + +module.exports = directive diff --git a/rql-ui/src/directives/ResizeHandler.js b/rql-ui/src/directives/ResizeHandler.js new file mode 100644 index 0000000..92735c2 --- /dev/null +++ b/rql-ui/src/directives/ResizeHandler.js @@ -0,0 +1,26 @@ +import store from 'vuex-store' + +export default { + inserted: function (el) { + let getWindowMatch = () => { + return window.matchMedia(store.getters.config.windowMatchSizeLg).matches + } + + let prevMatchlg = getWindowMatch() + + el.addEventListener('transitionend', function () { + store.dispatch('isToggleWithoutAnimation', false) + }) + + window.addEventListener('resize', function () { + if (getWindowMatch() && !prevMatchlg) { + store.dispatch('toggleSidebar', true) + } else if (!getWindowMatch() && prevMatchlg) { + store.dispatch('isToggleWithoutAnimation', true) + store.dispatch('toggleSidebar', false) + } + prevMatchlg = getWindowMatch() + }) + } +} + diff --git a/rql-ui/src/directives/StickyScroll.js b/rql-ui/src/directives/StickyScroll.js new file mode 100644 index 0000000..99f1a58 --- /dev/null +++ b/rql-ui/src/directives/StickyScroll.js @@ -0,0 +1,48 @@ +export default { + bind: (el, binding) => { + let duration = binding.value.duration || 500 + let isAnimated = binding.value.animate + + let observer = new MutationObserver(scrollToBottom) + let config = { childList: true } + observer.observe(el, config) + + function animateScroll (duration) { + let start = el.scrollTop + let end = el.scrollHeight + let change = end - start + let increment = 20 + + function easeInOut (currentTime, start, change, duration) { + currentTime /= duration / 2 + if (currentTime < 1) { + return change / 2 * currentTime * currentTime + start + } + currentTime -= 1 + return -change / 2 * (currentTime * (currentTime - 2) - 1) + start + } + + function animate (elapsedTime) { + elapsedTime += increment + var position = easeInOut(elapsedTime, start, change, duration) + el.scrollTop = position + + if (elapsedTime < duration) { + setTimeout(function () { + animate(elapsedTime) + }, increment) + } + } + + animate(0) + } + + function scrollToBottom () { + if (isAnimated) { + animateScroll(duration) + } else { + el.scrollTop = el.scrollHeight + } + } + } +} diff --git a/rql-ui/src/fonts/Glyphter.eot b/rql-ui/src/fonts/Glyphter.eot new file mode 100644 index 0000000..9c9f36e Binary files /dev/null and b/rql-ui/src/fonts/Glyphter.eot differ diff --git a/rql-ui/src/fonts/Glyphter.svg b/rql-ui/src/fonts/Glyphter.svg new file mode 100644 index 0000000..50ada49 --- /dev/null +++ b/rql-ui/src/fonts/Glyphter.svg @@ -0,0 +1 @@ +Generated by Glyphter \ No newline at end of file diff --git a/rql-ui/src/fonts/Glyphter.ttf b/rql-ui/src/fonts/Glyphter.ttf new file mode 100644 index 0000000..9d68d8a Binary files /dev/null and b/rql-ui/src/fonts/Glyphter.ttf differ diff --git a/rql-ui/src/fonts/Glyphter.woff b/rql-ui/src/fonts/Glyphter.woff new file mode 100644 index 0000000..397ba40 Binary files /dev/null and b/rql-ui/src/fonts/Glyphter.woff differ diff --git a/rql-ui/src/fonts/glyphicons-halflings-regular.eot b/rql-ui/src/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/rql-ui/src/fonts/glyphicons-halflings-regular.eot differ diff --git a/rql-ui/src/fonts/glyphicons-halflings-regular.svg b/rql-ui/src/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/rql-ui/src/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rql-ui/src/fonts/glyphicons-halflings-regular.ttf b/rql-ui/src/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/rql-ui/src/fonts/glyphicons-halflings-regular.ttf differ diff --git a/rql-ui/src/fonts/glyphicons-halflings-regular.woff b/rql-ui/src/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/rql-ui/src/fonts/glyphicons-halflings-regular.woff differ diff --git a/rql-ui/src/fonts/glyphicons-halflings-regular.woff2 b/rql-ui/src/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/rql-ui/src/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/rql-ui/src/main.js b/rql-ui/src/main.js new file mode 100644 index 0000000..ac51704 --- /dev/null +++ b/rql-ui/src/main.js @@ -0,0 +1,32 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import BootstrapVue from 'bootstrap-vue/dist/bootstrap-vue.esm' +import App from './App' +import router from './router' +import VueResource from 'vue-resource' +import vSelect from 'vue-select' +import 'bootstrap/dist/css/bootstrap.css' +import 'bootstrap-vue/dist/bootstrap-vue.css' +import 'semantic-ui-css/semantic.min.css' +import VueCarousel from 'vue-carousel' +import VueClip from 'vue-clip' +import VueFormWizard from 'vue-form-wizard' +import 'vue-form-wizard/dist/vue-form-wizard.min.css' + +require('./assets/RQL.css') +Vue.use(VueResource) +Vue.http.options.emulateJSON = true +Vue.use(BootstrapVue) +Vue.use(VueCarousel) +Vue.use(VueClip) +Vue.use(VueFormWizard) +Vue.component('v-select', vSelect) +window.bus = new Vue() +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + template: '', + components: { App } +}) diff --git a/rql-ui/src/router/index.js b/rql-ui/src/router/index.js new file mode 100644 index 0000000..e672ac4 --- /dev/null +++ b/rql-ui/src/router/index.js @@ -0,0 +1,62 @@ +import Vue from 'vue' +import Router from 'vue-router' + +import Workspace from '@/components/Workspace' +import DatabaseTableImport from '@/components/DatabaseTableImport' +import Login from '@/components/Login' +import Project from '@/components/Project' + +Vue.use(Router) + +const router = new Router({ + mode: 'history', + base: '/rql', + routes: [ + { + path: '/login', + name: 'Login', + component: Login + }, + { + path: '/workspace', + name: 'Workspace', + component: Workspace + }, + { + path: '/project', + name: 'Project', + component: Project + }, + { + path: '/DatabaseTableImport', + name: 'DatabaseTableImport', + component: DatabaseTableImport + }, + { + path: '/*', + redirect: { name: 'Login' } + } + ] +}) + +router.beforeEach((to, from, next) => { + if (to.path === '/login') { + next() + } + var token = localStorage.getItem('TOKEN') + var projectID = localStorage.getItem('PROJECTID') + if (token !== null) { + next() + } else { + next({path: '/login'}) + } + if (projectID !== null) { + next() + } else if (from.path !== '/project') { + next({path: '/project'}) + } else { + next() + } +}) + +export default router diff --git a/rql-ui/src/sass/_base.scss b/rql-ui/src/sass/_base.scss new file mode 100644 index 0000000..a019138 --- /dev/null +++ b/rql-ui/src/sass/_base.scss @@ -0,0 +1,40 @@ +html { + height: 100%; +} +body { + min-height: 100%; +} + +//Util classes +.ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.widget-viewport-height { + height: $widget-viewport-height; +} + +.none { + display: none; +} + +.pointer { + cursor: pointer; +} + +a:not([href]):not([tabindex]) { + color: $white; + cursor: pointer; +} + +a:not([href]):not([tabindex]):hover { + color: $white; + cursor: pointer; +} + +a:not([href]):not([tabindex]):focus { + color: $white; + cursor: pointer; +} diff --git a/rql-ui/src/sass/_fonts.scss b/rql-ui/src/sass/_fonts.scss new file mode 100644 index 0000000..737ee10 --- /dev/null +++ b/rql-ui/src/sass/_fonts.scss @@ -0,0 +1,46 @@ +// Fonts // +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro); + +@font-face { + font-family: 'Vuestic Icons'; + src: url('#{$icon-font-path}/Glyphter.eot'); + src: url('#{$icon-font-path}/Glyphter.eot?#iefix') format('embedded-opentype'), + url('#{$icon-font-path}/Glyphter.woff') format('woff'), + url('#{$icon-font-path}/Glyphter.ttf') format('truetype'), + url('#{$icon-font-path}/Glyphter.svg#Glyphter') format('svg'); + font-weight: normal; + font-style: normal; +} + +.vuestic-icon { + line-height: 1; +} + +.vuestic-icon:before{ + display: inline-block; + font-family: 'Vuestic Icons'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.vuestic-icon-comments:before{content:'\0041';} +.vuestic-icon-components:before{content:'\0042';} +.vuestic-icon-dashboard:before{content:'\0043';} +.vuestic-icon-extras:before{content:'\0044';} +.vuestic-icon-files:before{content:'\0045';} +.vuestic-icon-forms:before{content:'\0046';} +.vuestic-icon-graph:before{content:'\0047';} +.vuestic-icon-auth:before{content:'\0048';} +.vuestic-icon-image:before{content:'\0049';} +.vuestic-icon-maps:before{content:'\004a';} +.vuestic-icon-music:before{content:'\004b';} +.vuestic-icon-settings:before{content:'\004c';} +.vuestic-icon-statistics:before{content:'\004d';} +.vuestic-icon-tables:before{content:'\004e';} +.vuestic-icon-time:before{content:'\004f';} +.vuestic-icon-ui-elements:before{content:'\0050';} +.vuestic-icon-user:before{content:'\0051';} +.vuestic-icon-video:before{content:'\0052';} diff --git a/rql-ui/src/sass/_glyphicons.scss b/rql-ui/src/sass/_glyphicons.scss new file mode 100644 index 0000000..b3e02cb --- /dev/null +++ b/rql-ui/src/sass/_glyphicons.scss @@ -0,0 +1,307 @@ +// +// Glyphicons for Bootstrap +// +// Since icons are fonts, they can be placed anywhere text is placed and are +// thus automatically sized to match the surrounding child. To use, create an +// inline element with the appropriate classes, like so: +// +// Star + +@at-root { + // Import the fonts + @font-face { + font-family: 'Glyphicons Halflings'; + src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot')); + src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'), + url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg'); + } +} + +// Catchall baseclass +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Individual icons +.glyphicon-asterisk { &:before { content: "\002a"; } } +.glyphicon-plus { &:before { content: "\002b"; } } +.glyphicon-euro, +.glyphicon-eur { &:before { content: "\20ac"; } } +.glyphicon-minus { &:before { content: "\2212"; } } +.glyphicon-cloud { &:before { content: "\2601"; } } +.glyphicon-envelope { &:before { content: "\2709"; } } +.glyphicon-pencil { &:before { content: "\270f"; } } +.glyphicon-glass { &:before { content: "\e001"; } } +.glyphicon-music { &:before { content: "\e002"; } } +.glyphicon-search { &:before { content: "\e003"; } } +.glyphicon-heart { &:before { content: "\e005"; } } +.glyphicon-star { &:before { content: "\e006"; } } +.glyphicon-star-empty { &:before { content: "\e007"; } } +.glyphicon-user { &:before { content: "\e008"; } } +.glyphicon-film { &:before { content: "\e009"; } } +.glyphicon-th-large { &:before { content: "\e010"; } } +.glyphicon-th { &:before { content: "\e011"; } } +.glyphicon-th-list { &:before { content: "\e012"; } } +.glyphicon-ok { &:before { content: "\e013"; } } +.glyphicon-remove { &:before { content: "\e014"; } } +.glyphicon-zoom-in { &:before { content: "\e015"; } } +.glyphicon-zoom-out { &:before { content: "\e016"; } } +.glyphicon-off { &:before { content: "\e017"; } } +.glyphicon-signal { &:before { content: "\e018"; } } +.glyphicon-cog { &:before { content: "\e019"; } } +.glyphicon-trash { &:before { content: "\e020"; } } +.glyphicon-home { &:before { content: "\e021"; } } +.glyphicon-file { &:before { content: "\e022"; } } +.glyphicon-time { &:before { content: "\e023"; } } +.glyphicon-road { &:before { content: "\e024"; } } +.glyphicon-download-alt { &:before { content: "\e025"; } } +.glyphicon-download { &:before { content: "\e026"; } } +.glyphicon-upload { &:before { content: "\e027"; } } +.glyphicon-inbox { &:before { content: "\e028"; } } +.glyphicon-play-circle { &:before { content: "\e029"; } } +.glyphicon-repeat { &:before { content: "\e030"; } } +.glyphicon-refresh { &:before { content: "\e031"; } } +.glyphicon-list-alt { &:before { content: "\e032"; } } +.glyphicon-lock { &:before { content: "\e033"; } } +.glyphicon-flag { &:before { content: "\e034"; } } +.glyphicon-headphones { &:before { content: "\e035"; } } +.glyphicon-volume-off { &:before { content: "\e036"; } } +.glyphicon-volume-down { &:before { content: "\e037"; } } +.glyphicon-volume-up { &:before { content: "\e038"; } } +.glyphicon-qrcode { &:before { content: "\e039"; } } +.glyphicon-barcode { &:before { content: "\e040"; } } +.glyphicon-tag { &:before { content: "\e041"; } } +.glyphicon-tags { &:before { content: "\e042"; } } +.glyphicon-book { &:before { content: "\e043"; } } +.glyphicon-bookmark { &:before { content: "\e044"; } } +.glyphicon-print { &:before { content: "\e045"; } } +.glyphicon-camera { &:before { content: "\e046"; } } +.glyphicon-font { &:before { content: "\e047"; } } +.glyphicon-bold { &:before { content: "\e048"; } } +.glyphicon-italic { &:before { content: "\e049"; } } +.glyphicon-text-height { &:before { content: "\e050"; } } +.glyphicon-text-width { &:before { content: "\e051"; } } +.glyphicon-align-left { &:before { content: "\e052"; } } +.glyphicon-align-center { &:before { content: "\e053"; } } +.glyphicon-align-right { &:before { content: "\e054"; } } +.glyphicon-align-justify { &:before { content: "\e055"; } } +.glyphicon-list { &:before { content: "\e056"; } } +.glyphicon-indent-left { &:before { content: "\e057"; } } +.glyphicon-indent-right { &:before { content: "\e058"; } } +.glyphicon-facetime-video { &:before { content: "\e059"; } } +.glyphicon-picture { &:before { content: "\e060"; } } +.glyphicon-map-marker { &:before { content: "\e062"; } } +.glyphicon-adjust { &:before { content: "\e063"; } } +.glyphicon-tint { &:before { content: "\e064"; } } +.glyphicon-edit { &:before { content: "\e065"; } } +.glyphicon-share { &:before { content: "\e066"; } } +.glyphicon-check { &:before { content: "\e067"; } } +.glyphicon-move { &:before { content: "\e068"; } } +.glyphicon-step-backward { &:before { content: "\e069"; } } +.glyphicon-fast-backward { &:before { content: "\e070"; } } +.glyphicon-backward { &:before { content: "\e071"; } } +.glyphicon-play { &:before { content: "\e072"; } } +.glyphicon-pause { &:before { content: "\e073"; } } +.glyphicon-stop { &:before { content: "\e074"; } } +.glyphicon-forward { &:before { content: "\e075"; } } +.glyphicon-fast-forward { &:before { content: "\e076"; } } +.glyphicon-step-forward { &:before { content: "\e077"; } } +.glyphicon-eject { &:before { content: "\e078"; } } +.glyphicon-chevron-left { &:before { content: "\e079"; } } +.glyphicon-chevron-right { &:before { content: "\e080"; } } +.glyphicon-plus-sign { &:before { content: "\e081"; } } +.glyphicon-minus-sign { &:before { content: "\e082"; } } +.glyphicon-remove-sign { &:before { content: "\e083"; } } +.glyphicon-ok-sign { &:before { content: "\e084"; } } +.glyphicon-question-sign { &:before { content: "\e085"; } } +.glyphicon-info-sign { &:before { content: "\e086"; } } +.glyphicon-screenshot { &:before { content: "\e087"; } } +.glyphicon-remove-circle { &:before { content: "\e088"; } } +.glyphicon-ok-circle { &:before { content: "\e089"; } } +.glyphicon-ban-circle { &:before { content: "\e090"; } } +.glyphicon-arrow-left { &:before { content: "\e091"; } } +.glyphicon-arrow-right { &:before { content: "\e092"; } } +.glyphicon-arrow-up { &:before { content: "\e093"; } } +.glyphicon-arrow-down { &:before { content: "\e094"; } } +.glyphicon-share-alt { &:before { content: "\e095"; } } +.glyphicon-resize-full { &:before { content: "\e096"; } } +.glyphicon-resize-small { &:before { content: "\e097"; } } +.glyphicon-exclamation-sign { &:before { content: "\e101"; } } +.glyphicon-gift { &:before { content: "\e102"; } } +.glyphicon-leaf { &:before { content: "\e103"; } } +.glyphicon-fire { &:before { content: "\e104"; } } +.glyphicon-eye-open { &:before { content: "\e105"; } } +.glyphicon-eye-close { &:before { content: "\e106"; } } +.glyphicon-warning-sign { &:before { content: "\e107"; } } +.glyphicon-plane { &:before { content: "\e108"; } } +.glyphicon-calendar { &:before { content: "\e109"; } } +.glyphicon-random { &:before { content: "\e110"; } } +.glyphicon-comment { &:before { content: "\e111"; } } +.glyphicon-magnet { &:before { content: "\e112"; } } +.glyphicon-chevron-up { &:before { content: "\e113"; } } +.glyphicon-chevron-down { &:before { content: "\e114"; } } +.glyphicon-retweet { &:before { content: "\e115"; } } +.glyphicon-shopping-cart { &:before { content: "\e116"; } } +.glyphicon-folder-close { &:before { content: "\e117"; } } +.glyphicon-folder-open { &:before { content: "\e118"; } } +.glyphicon-resize-vertical { &:before { content: "\e119"; } } +.glyphicon-resize-horizontal { &:before { content: "\e120"; } } +.glyphicon-hdd { &:before { content: "\e121"; } } +.glyphicon-bullhorn { &:before { content: "\e122"; } } +.glyphicon-bell { &:before { content: "\e123"; } } +.glyphicon-certificate { &:before { content: "\e124"; } } +.glyphicon-thumbs-up { &:before { content: "\e125"; } } +.glyphicon-thumbs-down { &:before { content: "\e126"; } } +.glyphicon-hand-right { &:before { content: "\e127"; } } +.glyphicon-hand-left { &:before { content: "\e128"; } } +.glyphicon-hand-up { &:before { content: "\e129"; } } +.glyphicon-hand-down { &:before { content: "\e130"; } } +.glyphicon-circle-arrow-right { &:before { content: "\e131"; } } +.glyphicon-circle-arrow-left { &:before { content: "\e132"; } } +.glyphicon-circle-arrow-up { &:before { content: "\e133"; } } +.glyphicon-circle-arrow-down { &:before { content: "\e134"; } } +.glyphicon-globe { &:before { content: "\e135"; } } +.glyphicon-wrench { &:before { content: "\e136"; } } +.glyphicon-tasks { &:before { content: "\e137"; } } +.glyphicon-filter { &:before { content: "\e138"; } } +.glyphicon-briefcase { &:before { content: "\e139"; } } +.glyphicon-fullscreen { &:before { content: "\e140"; } } +.glyphicon-dashboard { &:before { content: "\e141"; } } +.glyphicon-paperclip { &:before { content: "\e142"; } } +.glyphicon-heart-empty { &:before { content: "\e143"; } } +.glyphicon-link { &:before { content: "\e144"; } } +.glyphicon-phone { &:before { content: "\e145"; } } +.glyphicon-pushpin { &:before { content: "\e146"; } } +.glyphicon-usd { &:before { content: "\e148"; } } +.glyphicon-gbp { &:before { content: "\e149"; } } +.glyphicon-sort { &:before { content: "\e150"; } } +.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } } +.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } } +.glyphicon-sort-by-order { &:before { content: "\e153"; } } +.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } } +.glyphicon-sort-by-attributes { &:before { content: "\e155"; } } +.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } } +.glyphicon-unchecked { &:before { content: "\e157"; } } +.glyphicon-expand { &:before { content: "\e158"; } } +.glyphicon-collapse-down { &:before { content: "\e159"; } } +.glyphicon-collapse-up { &:before { content: "\e160"; } } +.glyphicon-log-in { &:before { content: "\e161"; } } +.glyphicon-flash { &:before { content: "\e162"; } } +.glyphicon-log-out { &:before { content: "\e163"; } } +.glyphicon-new-window { &:before { content: "\e164"; } } +.glyphicon-record { &:before { content: "\e165"; } } +.glyphicon-save { &:before { content: "\e166"; } } +.glyphicon-open { &:before { content: "\e167"; } } +.glyphicon-saved { &:before { content: "\e168"; } } +.glyphicon-import { &:before { content: "\e169"; } } +.glyphicon-export { &:before { content: "\e170"; } } +.glyphicon-send { &:before { content: "\e171"; } } +.glyphicon-floppy-disk { &:before { content: "\e172"; } } +.glyphicon-floppy-saved { &:before { content: "\e173"; } } +.glyphicon-floppy-remove { &:before { content: "\e174"; } } +.glyphicon-floppy-save { &:before { content: "\e175"; } } +.glyphicon-floppy-open { &:before { content: "\e176"; } } +.glyphicon-credit-card { &:before { content: "\e177"; } } +.glyphicon-transfer { &:before { content: "\e178"; } } +.glyphicon-cutlery { &:before { content: "\e179"; } } +.glyphicon-header { &:before { content: "\e180"; } } +.glyphicon-compressed { &:before { content: "\e181"; } } +.glyphicon-earphone { &:before { content: "\e182"; } } +.glyphicon-phone-alt { &:before { content: "\e183"; } } +.glyphicon-tower { &:before { content: "\e184"; } } +.glyphicon-stats { &:before { content: "\e185"; } } +.glyphicon-sd-video { &:before { content: "\e186"; } } +.glyphicon-hd-video { &:before { content: "\e187"; } } +.glyphicon-subtitles { &:before { content: "\e188"; } } +.glyphicon-sound-stereo { &:before { content: "\e189"; } } +.glyphicon-sound-dolby { &:before { content: "\e190"; } } +.glyphicon-sound-5-1 { &:before { content: "\e191"; } } +.glyphicon-sound-6-1 { &:before { content: "\e192"; } } +.glyphicon-sound-7-1 { &:before { content: "\e193"; } } +.glyphicon-copyright-mark { &:before { content: "\e194"; } } +.glyphicon-registration-mark { &:before { content: "\e195"; } } +.glyphicon-cloud-download { &:before { content: "\e197"; } } +.glyphicon-cloud-upload { &:before { content: "\e198"; } } +.glyphicon-tree-conifer { &:before { content: "\e199"; } } +.glyphicon-tree-deciduous { &:before { content: "\e200"; } } +.glyphicon-cd { &:before { content: "\e201"; } } +.glyphicon-save-file { &:before { content: "\e202"; } } +.glyphicon-open-file { &:before { content: "\e203"; } } +.glyphicon-level-up { &:before { content: "\e204"; } } +.glyphicon-copy { &:before { content: "\e205"; } } +.glyphicon-paste { &:before { content: "\e206"; } } +// The following 2 Glyphicons are omitted for the time being because +// they currently use Unicode codepoints that are outside the +// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle +// non-BMP codepoints in CSS string escapes, and thus can't display these two icons. +// Notably, the bug affects some older versions of the Android Browser. +// More info: https://github.com/twbs/bootstrap/issues/10106 +// .glyphicon-door { &:before { content: "\1f6aa"; } } +// .glyphicon-key { &:before { content: "\1f511"; } } +.glyphicon-alert { &:before { content: "\e209"; } } +.glyphicon-equalizer { &:before { content: "\e210"; } } +.glyphicon-king { &:before { content: "\e211"; } } +.glyphicon-queen { &:before { content: "\e212"; } } +.glyphicon-pawn { &:before { content: "\e213"; } } +.glyphicon-bishop { &:before { content: "\e214"; } } +.glyphicon-knight { &:before { content: "\e215"; } } +.glyphicon-baby-formula { &:before { content: "\e216"; } } +.glyphicon-tent { &:before { content: "\26fa"; } } +.glyphicon-blackboard { &:before { content: "\e218"; } } +.glyphicon-bed { &:before { content: "\e219"; } } +.glyphicon-apple { &:before { content: "\f8ff"; } } +.glyphicon-erase { &:before { content: "\e221"; } } +.glyphicon-hourglass { &:before { content: "\231b"; } } +.glyphicon-lamp { &:before { content: "\e223"; } } +.glyphicon-duplicate { &:before { content: "\e224"; } } +.glyphicon-piggy-bank { &:before { content: "\e225"; } } +.glyphicon-scissors { &:before { content: "\e226"; } } +.glyphicon-bitcoin { &:before { content: "\e227"; } } +.glyphicon-btc { &:before { content: "\e227"; } } +.glyphicon-xbt { &:before { content: "\e227"; } } +.glyphicon-yen { &:before { content: "\00a5"; } } +.glyphicon-jpy { &:before { content: "\00a5"; } } +.glyphicon-ruble { &:before { content: "\20bd"; } } +.glyphicon-rub { &:before { content: "\20bd"; } } +.glyphicon-scale { &:before { content: "\e230"; } } +.glyphicon-ice-lolly { &:before { content: "\e231"; } } +.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } } +.glyphicon-education { &:before { content: "\e233"; } } +.glyphicon-option-horizontal { &:before { content: "\e234"; } } +.glyphicon-option-vertical { &:before { content: "\e235"; } } +.glyphicon-menu-hamburger { &:before { content: "\e236"; } } +.glyphicon-modal-window { &:before { content: "\e237"; } } +.glyphicon-oil { &:before { content: "\e238"; } } +.glyphicon-grain { &:before { content: "\e239"; } } +.glyphicon-sunglasses { &:before { content: "\e240"; } } +.glyphicon-text-size { &:before { content: "\e241"; } } +.glyphicon-text-color { &:before { content: "\e242"; } } +.glyphicon-text-background { &:before { content: "\e243"; } } +.glyphicon-object-align-top { &:before { content: "\e244"; } } +.glyphicon-object-align-bottom { &:before { content: "\e245"; } } +.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } } +.glyphicon-object-align-left { &:before { content: "\e247"; } } +.glyphicon-object-align-vertical { &:before { content: "\e248"; } } +.glyphicon-object-align-right { &:before { content: "\e249"; } } +.glyphicon-triangle-right { &:before { content: "\e250"; } } +.glyphicon-triangle-left { &:before { content: "\e251"; } } +.glyphicon-triangle-bottom { &:before { content: "\e252"; } } +.glyphicon-triangle-top { &:before { content: "\e253"; } } +.glyphicon-console { &:before { content: "\e254"; } } +.glyphicon-superscript { &:before { content: "\e255"; } } +.glyphicon-subscript { &:before { content: "\e256"; } } +.glyphicon-menu-left { &:before { content: "\e257"; } } +.glyphicon-menu-right { &:before { content: "\e258"; } } +.glyphicon-menu-down { &:before { content: "\e259"; } } +.glyphicon-menu-up { &:before { content: "\e260"; } } diff --git a/rql-ui/src/sass/_icons-styles.scss b/rql-ui/src/sass/_icons-styles.scss new file mode 100644 index 0000000..74454db --- /dev/null +++ b/rql-ui/src/sass/_icons-styles.scss @@ -0,0 +1,54 @@ +@import url(http://weloveiconfonts.com/api/?family=brandico|entypo|fontelico|iconicfill|iconicstroke|maki|openwebicons|typicons|zocial); + +/* brandico */ +[class*="brandico-"]:before { + font-family: 'brandico', sans-serif; + font-style: normal; +} + +/* entypo */ +[class*="entypo-"]:before { + font-family: 'entypo', sans-serif; + font-style: normal; +} + +/* fontelico */ +[class*="fontelico-"]:before { + font-family: 'fontelico', sans-serif; + font-style: normal; +} + +/* iconicfill */ +[class*="iconicfill-"]:before { + font-family: 'IconicFill', sans-serif; + font-style: normal; +} + +/* iconicstroke */ +[class*="iconicstroke-"]:before { + font-family: 'IconicStroke', sans-serif; + font-style: normal; +} + +/* maki */ +[class*="maki-"]:before { + font-family: 'maki', sans-serif; + font-style: normal; +} + +/* openwebicons */ +[class*="openwebicons-"]:before { + font-family: 'OpenWeb Icons', sans-serif; + font-style: normal; +} + +/* typicons */ +[class*="typicons-"]:before { + font-family: 'Typicons', sans-serif; + font-style: normal; +} + +/* zocial */ +[class*="zocial-"]:before { + font-family: 'zocial', sans-serif; +} diff --git a/rql-ui/src/sass/_icons.scss b/rql-ui/src/sass/_icons.scss new file mode 100644 index 0000000..c8595d4 --- /dev/null +++ b/rql-ui/src/sass/_icons.scss @@ -0,0 +1,76 @@ +.i-nav-notification { + display: inline-block; + height: 32px; + width: 22px; + background: url('assets/icons/nav-notification.png') no-repeat center center; +} + +.i-nav-messages { + display: inline-block; + height: 21px; + width: 26px; + background: url('assets/icons/nav-messages.png') no-repeat center center; +} + +.i-vuestic { + display: inline-block; + width: 129px; + height: 15.4px; + background: url('assets/icons/vuestic.svg') no-repeat center center; +} + +.i-menu-expanded { + display: inline-block; + width: 24px; + height: 20px; + background: url('assets/icons/menu-expanded.svg') no-repeat center center; +} + +.i-menu-collapsed { + display: inline-block; + width: 24px; + height: 20px; + background: url('assets/icons/menu-collapsed.svg') no-repeat center center; +} + +.i-vuestic-fresh { + display: inline-block; + width: 51px; + height: 48px; + background: url('assets/icons/vuestic-fresh.svg') no-repeat center center; +} + +.i-vuestic-clean-code { + display: inline-block; + width: 56px; + height: 50px; + background: url('assets/icons/vuestic-clean-code.svg') no-repeat center center; +} + +.i-vuestic-free { + display: inline-block; + width: 45px; + height: 51px; + background: url('assets/icons/vuestic-free.svg') no-repeat center center; +} + +.i-vuestic-responsive { + display: inline-block; + width: 47.5px; + height: 49px; + background: url('assets/icons/vuestic-responsive.svg') no-repeat center center; +} + +.i-vuestic-rich { + display: inline-block; + width: 57px; + height: 55px; + background: url('assets/icons/vuestic-rich.svg') no-repeat center center; +} + +.i-vuestic-vue { + display: inline-block; + width: 55px; + height: 47.8px; + background: url('assets/icons/vuestic-vue.svg') no-repeat center center; +} diff --git a/rql-ui/src/sass/_material-forms.scss b/rql-ui/src/sass/_material-forms.scss new file mode 100644 index 0000000..c7bb104 --- /dev/null +++ b/rql-ui/src/sass/_material-forms.scss @@ -0,0 +1,357 @@ +$shadow-inset: inset 0 2px 2px 0 rgba(0,0,0,.14); +$shadow-0: 0 0 1px rgba(0, 0, 0, 0); +$shadow-2: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); +$shadow-3: 0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12); +$shadow-4: 0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2); +$shadow-6: 0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2); +$shadow-8: 0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2); + +// Font Sizes +$mf-font-size: 1rem !default; +$mf-active-font-size: $mf-font-size * 0.6 !default; +$mf-active-top: -$mf-font-size * 0.6 !default; + +// Margin & Paddings +$mf-gap: $mf-font-size * 1.5 !default; +$mf-min-height: 2.25rem; +$mf-spacer: $mf-font-size / 8 !default; +$mf-fieldset-margin: 0 0 $mf-gap * 2 !default; +$mf-checkbox-gap: $mf-font-size * 2 !default; +$mf-checkbox-top: 0 !default; +$mf-radio-margin: $mf-font-size / -4 !default; +$mf-icon-gutter: 1.375rem; +$mf-icon-top: 0.4375rem; + + // Colors +$mf-input-color: $body-color !default; +$mf-border-color: #999 !default; +$mf-label-color: lighten($mf-border-color, 10%) !default; +$mf-active-color: darken($mf-border-color, 10%) !default; +$mf-focus-color: $brand-primary !default; +$mf-error-color: $brand-danger !default; +$mf-focus-border-color: $charcoal !default; + +// Animation +$mf-transition-speed: 0.28s !default; + + +.button-container { + text-align: center; +} + +// The Styles for the form +fieldset { + //margin: $mf-fieldset-margin; + padding: 0; + border: none; +} + +.form-group { + position: relative; + display: flex; + flex-direction: row; + min-height: $mf-min-height; + margin-top: ($mf-font-size * 0.2); + margin-bottom: ($mf-gap * 1.5); + + .input-group { + align-self: flex-end; + } + + .input-icon { + position: absolute; + top: $mf-icon-top; + color: $mf-label-color; + } + + @include text-emphasis-variant(".text-secondary", $mf-label-color); + + .input-group { + position: relative; + display: block; + } + + &.select-form-group { + .dropdown-toggle::after { + display: none; + } + + .dropdown-menu { + width: 100%; + } + + .dropdown-item { + cursor: pointer; + justify-content: space-between; + + .selected-icon { + display: none; + margin-left: 0.35rem; + } + + &.selected { + color: $mf-focus-color; + + .selected-icon { + display: inline-block; + } + } + } + + .input-icon { + color: $mf-active-color; + font-size: 0.8rem; + top: 1rem; + } + + .bar::before { + display: none; + } + } + + &.form-group-w-btn { + .btn { + align-self: flex-end; + } + } + + &.with-icon-right { + input { + padding-right: $mf-icon-gutter; + } + + .icon-right { + right: 0; + } + } + + &.with-icon-left { + input, + textarea + { + padding-left: $mf-icon-gutter; + + ~ .control-label { + padding-left: $mf-icon-gutter; + } + } + + select, + input:focus, + input:valid, + input.form-file, + input.has-value, + textarea:focus, + textarea:valid, + textarea.form-file, + textarea.has-value { + color: $mf-input-color; + + ~ .control-label { + padding-left: 0; + } + } + + .icon-left { + left: 0; + } + } + + .error-icon, .valid-icon { + display: none; + } +} + +.form-inline { + > .form-group, + > .btn { + display: inline-block; + margin-bottom: 0; + } +} + +.form-help { + margin-top: $mf-spacer; + margin-left: $mf-spacer; + color: $mf-label-color; + font-size: $mf-active-font-size; + + .form-group & { + position: absolute; + width: 100%; + } + + .checkbox & { + position: relative; + margin-bottom: $mf-font-size; + } +} + +.form-group { + // scss-lint:disable QualifyingElement, NestingDepth + input, textarea.chat { + height: ($mf-font-size * 1.9); + } + + textarea { + resize: none; + } + + select { + width: 100%; + font-size: $mf-font-size; + height: ($mf-font-size * 1.6); + padding: $mf-spacer $mf-spacer ($mf-spacer / 2); + background: none; + border: none; + line-height: 1.6; + box-shadow: none; + } + + .control-label { + position: absolute; + top: ($mf-font-size / 4); + left: 0; + max-width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + pointer-events: none; + padding-left: $mf-spacer; + z-index: 1; + color: $mf-label-color; + font-size: $mf-font-size; + font-weight: normal; + transition: all $mf-transition-speed ease; + } + + .bar { + position: relative; + border-bottom: ($mf-font-size / 16) solid $mf-border-color; + display: block; + + &::before { + content: ''; + height: ($mf-font-size / 8); + width: 0; + left: 50%; + bottom: ($mf-font-size / -16); + position: absolute; + background: $mf-focus-border-color; + transition: left $mf-transition-speed ease, width $mf-transition-speed ease; + z-index: 2; + } + } + + input, + textarea { + display: block; + background: none; + padding: $mf-spacer $mf-spacer ($mf-spacer / 2); + font-size: $mf-font-size; + border-width: 0; + border-color: transparent; + line-height: 1.9; + width: 100%; + color: transparent; + transition: all $mf-transition-speed ease; + box-shadow: none; + } + + input[type="file"] { + line-height: 1; + + ~ .bar { + display: none; + } + } + + &.show input, + select, + input:focus, + input:valid, + input.form-file, + input.has-value, + textarea:focus, + textarea:valid, + textarea.form-file, + textarea.has-value { + color: $mf-input-color; + + ~ .control-label { + font-size: $mf-active-font-size; + color: $mf-focus-color; + font-weight: 600; + text-transform: uppercase; + top: $mf-active-top; + left: 0; + } + } + + select, + input, + textarea { + &:focus { + outline: none; + + ~ .control-label { + color: $mf-focus-color; + } + + ~ .bar { + &::before { + width: 100%; + left: 0; + } + } + } + } +} + +.valid { + .legend.legend, + &.form-group .control-label.control-label { + // Prevent !importantRule + color: $mf-focus-color; + } + + .valid-icon { + display: inline-block; + color: $mf-focus-color; + } +} + +.has-error { + .legend.legend, + &.form-group .control-label.control-label { + // Prevent !importantRule + color: $mf-error-color; + } + + .error-icon { + display: inline-block; + color: $mf-error-color; + } + + &.form-group { + .icon-right { + color: $mf-error-color; + } + } + + &.form-group, + &.checkbox { + .form-help, + .helper { + color: $mf-error-color; + } + } + + .bar { + &::before { + background: $mf-error-color; + left: 0; + width: 100%; + } + } +} diff --git a/rql-ui/src/sass/_mixins.scss b/rql-ui/src/sass/_mixins.scss new file mode 100644 index 0000000..2997700 --- /dev/null +++ b/rql-ui/src/sass/_mixins.scss @@ -0,0 +1,59 @@ +@mixin theme-button-variant($color, $background, $border, $shadow) { + $hover-bg: lighten($background, 10%); + $disabled-bg: darken($background, 15%); + $active-bg: darken($background, 15%); + $disabled-color: darken($background, 30%); + + background-color: $background; + color: $color; + box-shadow: $shadow; + border: $border; + + &:hover{ + color: $color; + background-color: $hover-bg; + } + + &.active, + &:active, + &:not([disabled]):not(.disabled):active, + &:not([disabled]):not(.disabled).active { + background-color: $active-bg; + box-shadow: $shadow; + color: $color; + + &:focus { + box-shadow: $shadow; + } + } + + &[disabled], &[disabled]:hover { + background-color: $disabled-bg; + color: $disabled-color; + opacity: 0.5; + } +} + +@mixin circle-progress-bar($progressColor, $size, $width, $startColor: $gray-lighter, $innerColor: $white) { + + + $step: 1; + $loops: round(100 / $step); + $increment: 360 / $loops; + $half: round($loops / 2); + + @for $i from 0 through $loops { + &.progress-bar.value-#{$i*$step} { + @if $i < $half { + $nextdeg: 90deg + ( $increment * $i ); + background-image: linear-gradient(90deg, $startColor 50%, transparent 50%, transparent), + linear-gradient($nextdeg, $progressColor 50%, $startColor 50%, $startColor); + } + @else { + $nextdeg: -90deg + ( $increment * ( $i - $half ) ); + background-image: linear-gradient($nextdeg, $progressColor 50%, transparent 50%, transparent), + linear-gradient(270deg, $progressColor 50%, $startColor 50%, $startColor); + } + } + } +} diff --git a/rql-ui/src/sass/_override-bootstrap.scss b/rql-ui/src/sass/_override-bootstrap.scss new file mode 100644 index 0000000..ac60bec --- /dev/null +++ b/rql-ui/src/sass/_override-bootstrap.scss @@ -0,0 +1,465 @@ +//Navbar +.navbar .navbar-nav > .nav-item > .nav-link { + padding-right: 38px; + padding-left: 38px; + line-height: 0; +} + +.navbar .navbar-nav > .nav-item { + display: flex; + align-items: center; +} + +//Typography +h1, .h1 { + margin-bottom :2.25rem; +} +h2, .h2 { + margin-bottom :2rem; +} +h3, .h3 { + margin-bottom :1.5rem; +} +h4, .h4 { + margin-bottom :1rem; +} + +.blockquote { + padding: 0 ($spacer *1.625); + margin: 2.5rem 0 2.5rem 1rem; + border-left: $blockquote-border-width solid $blockquote-border-color; + line-height: 2rem; + color: $blockquote-small-color; + font-style: oblique; +} + +.blockquote-footer { + &::before { + content: "--- "; // em dash, nbsp + } +} + + + +//Buttons + +.btn { + box-shadow: $btn-box-shadow; + font-family: inherit; + letter-spacing: 3px; + text-transform: uppercase; + cursor: pointer; + + &.dropdown-toggle.theme-toggle { + @include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-line-height, $btn-border-radius); + } + + &:focus, &:active, &.focus { + box-shadow: $btn-box-shadow; + } +} + +.btn.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-base, $btn-line-height-sm, $btn-border-radius); +} + +.btn.btn-micro { + @include button-size($btn-padding-y-micro, $btn-padding-x-micro, $font-size-smaller, $btn-line-height-sm, $btn-border-radius); +} + +.btn.btn-primary { + @include theme-button-variant($white, theme-color("primary"), $btn-border, $btn-box-shadow); + + &.hover { + background-color: lighten(theme-color("primary"), 10%) !important; + color: $white; + } + + &.focus { + background-color: darken(theme-color("primary"), 15%); + color: $white; + } +} + +.btn.btn-secondary { + @include theme-button-variant($white, theme-color("primary"), $btn-secondary-theme-border, none); + + color: theme-color("primary"); + border: $btn-secondary-theme-border; + background-color: $white; + + &[disabled], &[disabled]:hover { + background-color: $white; + color: theme-color("primary"); + border: 2px solid theme-color("primary"); + } + + &:hover { + border: 2px solid lighten(theme-color("primary"), 10%); + } + + &.hover { + border: 2px solid lighten(theme-color("primary"), 10%) !important; + background-color: lighten(theme-color("primary"), 10%) !important; + color: $white; + } + + &:active, &:focus, &.focus { + border: 2px solid darken(theme-color("primary"), 15%) !important; + background-color: darken(theme-color("primary"), 15%) !important; + color: $white; + } + +} + +.btn.btn-danger { + @include theme-button-variant($white, theme-color("danger"), $btn-border, $btn-box-danger-shadow); +} + +.btn.btn-warning { + @include theme-button-variant($white, theme-color("warning"), $btn-border, $btn-box-warning-shadow); +} + +.btn.btn-info { + @include theme-button-variant($white, theme-color("info"), $btn-border, $btn-box-info-shadow); + } + +.btn.btn-success { + @include theme-button-variant($white, theme-color("primary"), $btn-border, $btn-box-success-shadow); +} + +.btn.btn-dark { + @include theme-button-variant($white, theme-color("dark"), $btn-border, $btn-box-dark-shadow); +} + +.btn.btn-pale { + @include theme-button-variant($white, theme-color("pale"), $btn-border, $btn-box-pale-shadow); + &:hover { + background-color: lighten(theme-color("pale"), 5%); + &:focus, &:active, &.active { + background-color: darken(theme-color("pale"), 15%); + } + } +} + +.btn.btn-with-icon { + position: relative; + padding: $btn-padding-y $btn-with-icon-padding-x; + .btn-with-icon-content { + display: flex; + align-items: center; + justify-content: center; + margin-left: $btn-with-icon-text-margin; + } + + i { + position: absolute; + left: $btn-with-icon-padding-x; + top: $btn-with-icon-icon-top; + font-size: $btn-with-icon-icon-size; + } + + &.rounded-icon { + width: $btn-with-icon-rounded-size; + height: $btn-with-icon-rounded-size; + border-radius: 50%; + padding: 0; + + i { + left: $btn-with-icon-rounded-icon-left; + } + + &.btn-micro { + height: $btn-with-icon-rounded-size-micro; + width: $btn-with-icon-rounded-size-micro; + flex: none; + + i { + font-size: $btn-with-icon-rounded-font-micro; + left: $btn-with-icon-rounded-position-left; + top: $btn-with-icon-rounded-position-top; + } + } + } +} + +.btn-group { + box-shadow: $btn-box-shadow; + border-radius: $btn-border-radius; + .btn { + padding-left: $btn-group-button-padding-x; + padding-right: $btn-group-button-padding-x; + box-shadow: none; + } +} + +.btn.dropdown-toggle { + position: relative; + + .arrow-down { + position: absolute; + font-size: $btn-dd-arrow-size; + right: 1rem; + top: calc(50% - #{$btn-dd-arrow-size}/1.4); + } + + &::after { + display: none; + } +} + +.btn-group { + color: $white; +} + +// Dropdowns & Selects +.dropdown-menu { + border-radius: 0; + padding: $dropdown-menu-padding-y $dropdown-menu-padding-x; + background: transparent; + border: none; + .dropdown-menu-content{ + background-color: $dropdown-background; + box-shadow: $dropdown-box-shadow; + } +} + +.dropdown-item { + display: flex; + flex-direction: row; + align-items: center; + height: $dropdown-item-height; + font-size: $font-size-sm; +} + +//Grid + +.row > .col-8-custom { + @include media-breakpoint-between(md, xl) { + width: 12.5%; + } + + @include media-breakpoint-only(sm) { + width: 25%; + } + + @include media-breakpoint-only(xs){ + width: 100%; + } +} + +//Icons +.error-icon { + display: inline-block; + color: $theme-red; +} + +.success-icon { + display: inline-block; + color: $vue-green; +} + +//Tables +.table-striped { + tbody tr:nth-of-type(odd) { + background-color: $striped-row-odd; + } + tbody tr:nth-of-type(even) { + background-color: $striped-row; + } +} + +.table { + + thead tr { + border-bottom: 2px solid rgb(85, 85, 85); + color: $vue-green; + font-size: 14px; + font-weight: bold; + text-transform: uppercase; + } + + td, th, thead th, thead td { + border: none; + vertical-align: middle !important; + padding: .5rem; + } + + .badge { + vertical-align: text-top; + } + + .table-info { + background-color: #dcf1ff; + } + + .table-warning { + background-color: #fff1c8; + } + + .table-success, .table-success > td, .table-success > th { + background-color: #c8fac6; + } + + .table-danger { + background-color: #ffcece; + } + +} + +.first-td-padding { + td:first-child { + @extend .pl-4; + } +} + +.sort-icon { + float: none !important; + margin-left: .2rem; + top: 1px; + font-size: 1rem; +} + +th.sortable:hover { + color: $vue-green !important; + opacity: .6; +} + +//Badges +@mixin badge-variant($bg) { + color: $white; + background-color: $bg; + + &[href] { + @include hover-focus { + color: $white; + text-decoration: none; + background-color: darken($bg, 10%); + } + } +} + +.badge { + min-width: $badge-min-width; + display: inline-block; + font-weight: bold; + text-transform: uppercase; + font-size: .625rem; + color: $white; + letter-spacing: .0625rem; +} + +.badge-violet { + @include badge-variant($theme-violet); +} + +.badge-dark-blue { + @include badge-variant($dark-blue); +} + +.badge-success { + @include badge-variant($badge-success-bg); +} + +//Alerts + +.alert { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + + .badge { + margin-right: 0.63rem; + } + + &.with-close { + padding-right: $with-close-pr; + } + + .alert-close { + position: absolute; + right: 20px; + font-size: $font-size-base; + top: calc(50% - #{$font-size-base}/2); + cursor: pointer; + } +} + +.alert-success { + box-shadow: $alert-success-shadow; + + .alert-close { + color: $brand-primary; + } +} + +.alert-warning { + box-shadow: $alert-warning-shadow; + + .alert-close { + color: $brand-warning; + } +} + +.alert-danger { + box-shadow: $alert-danger-shadow; + + .alert-close { + color: $brand-danger; + } +} + +.alert-info { + box-shadow: $alert-info-shadow; + + .alert-close { + color: $brand-info; + } +} + +@function get-alert-def($type, $csspart) { + @if $csspart == 'bg' { + @if $type == 'success' { + @return $alert-success-bg; + } @else if $type == 'danger' { + @return $alert-danger-bg; + } @else if $type == 'warning' { + @return $alert-warning-bg; + } @else if $type == 'info' { + @return $alert-info-bg; + } + + @return theme-color-level($type, -10); + } @else if $csspart == 'border' { + @if $type == 'success' { + @return $alert-success-border; + } @else if $type == 'danger' { + @return $alert-danger-border; + } @else if $type == 'warning' { + @return $alert-warning-border; + } @else if $type == 'info' { + @return $alert-info-border; + } + + @return theme-color-level($type, -9); + } @else if $csspart == 'color' { + @if $type == 'success' { + @return $alert-success-text; + } @else if $type == 'danger' { + @return $alert-danger-text; + } @else if $type == 'warning' { + @return $alert-warning-text; + } @else if $type == 'info' { + @return $alert-info-text; + } + + @return theme-color-level($type, 6); + } +} + +@each $color, $value in $theme-colors { + .alert-#{$color} { + @include alert-variant(get-alert-def($color, 'bg'), get-alert-def($color, 'border'), get-alert-def($color, 'color')); + } +} diff --git a/rql-ui/src/sass/_override-custom-libs.scss b/rql-ui/src/sass/_override-custom-libs.scss new file mode 100644 index 0000000..182af56 --- /dev/null +++ b/rql-ui/src/sass/_override-custom-libs.scss @@ -0,0 +1,167 @@ +.abc-checkbox, .abc-radio { + margin-bottom: 20px; + + label { + .abc-label-text { + display: inline-block; + position: relative; + top: 2px; + padding-left: 13px; + } + + &::before{ + width: 22px; + height: 22px; + border: 2px solid $input-border-color; + @include transition(border 0.15s ease-in-out, color 0.15s ease-in-out, background-color 0.15s ease-in-out); + } + + } +} + +.abc-checkbox { + padding-left: 20px; + + label{ + &::before{ + border-radius: 0; + @include transition(border 0.15s ease-in-out, color 0.15s ease-in-out, background-color 0.15s ease-in-out); + } + + &::after { + width: 20px; + height: 20px; + top: 2px; + left: 2px; + } + } + + input[type="checkbox"], + input[type="radio"] { + + &:focus + label::before{ + outline: none; + } + + + &:checked + label::after{ + font-family: "Ionicons"; + content: "\F2BC"; + font-size: 15px; + } + + &:disabled + label{ + opacity: 0.5; + } + } +} + +.abc-radio { + + label { + + &::after { + width: 10px; + height: 10px; + top: 7.5px; + left: 6px; + } + } + + input[type="radio"] { + + &:focus + label::before { + outline: none; + } + } +} + +//Medium Editor +.medium-editor-toolbar, +.medium-editor-toolbar-form, +.medium-editor-toolbar-actions, +.medium-editor-toolbar-anchor-preview { + background-color: $brand-primary; + border-radius: $btn-border-radius; + box-shadow: $btn-box-shadow; +} + +.medium-editor-toolbar { + max-width: 80%; + box-shadow: none; + .medium-editor-toolbar-actions { + overflow: hidden; + } + + .medium-editor-action { + @extend .btn.btn-primary; + height: $medium-editor-button-size; + padding: $btn-padding-y $btn-group-button-padding-x; + box-shadow: none; + border-radius: 0; + + &.medium-editor-button-active { + background-color: darken($brand-primary, 15%); + } + } +} + +.medium-editor-toolbar-form { + color: $white; + overflow: hidden; + + .medium-editor-toolbar-input { + height: $medium-editor-button-size; + background: $brand-primary; + box-sizing: border-box; + color: $white; + padding-left: 16px; + width: 220px; + + &::-webkit-input-placeholder { + color: rgba($white, .8); + } + &:-moz-placeholder { /* Firefox 18- */ + color: rgba($white, .8); + } + &::-moz-placeholder { /* Firefox 19+ */ + color: rgba($white, .8); + } + &:-ms-input-placeholder { + color: rgba($white, .8); + } + } + + a { + color: $white; + transform: translateY(2px); + } + + .medium-editor-toolbar-close { + margin-right: 16px; + } +} + +.medium-toolbar-arrow-under:after { + border-color: $brand-primary transparent transparent transparent; + top: $medium-editor-button-size; +} + +.medium-toolbar-arrow-over:before { + border-color: transparent transparent $brand-primary transparent; +} + +.medium-editor-toolbar-anchor-preview { + @include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-line-height, $btn-border-radius); + .medium-editor-toolbar-anchor-preview { + margin: 0; + } +} + +.medium-editor-anchor-preview { + max-width: 50%; + a { + color: $white; + text-decoration: none; + } +} diff --git a/rql-ui/src/sass/_typography.scss b/rql-ui/src/sass/_typography.scss new file mode 100644 index 0000000..e4e0c03 --- /dev/null +++ b/rql-ui/src/sass/_typography.scss @@ -0,0 +1,113 @@ +h1, h2, h3, h4, h5, h6, strong, b { + font-weight: 600; +} + +.vue-highlighted-text { + background-color: $vue-turquoise; +} + +.vue-selected-text, ::selection { + background-color: $brand-primary; + color: $white; +} + +ul.vue-list-inner, ol.vue-list-inner { + li:first-child { + margin-top: 1.5rem; + } + + li:last-child { + padding-bottom: 0; + } +} + +ul.vue-unordered { + padding : 0; + list-style-type : none; + + ul { + padding : 0; + list-style-type : none; + } + + li { + padding-left : 1.563rem; + padding-bottom :1.5rem; + &::before { + content : ""; + display : inline-block; + width : 0.75rem; + height : 0.75rem; + position : relative; + right : 1.563rem; + top : 0.0625rem; + margin-right : -0.75em; + border-radius : 0.75rem; + background-color : $vue-green; + } + + li { + &::before { + background-color : $white; + border : 2.5px solid $vue-green; + } + } + } +} + +ol.vue-ordered { + padding : 0; + counter-reset : olCounter; + + li { + list-style : none; + padding-left : 1.563rem; + padding-bottom :1.5rem; + } + + > li:before { + counter-increment : olCounter; + content : counter(olCounter) ". "; + display : inline-block; + width : 0.75rem; + height : 0.75rem; + position : relative; + right : 1.563rem; + top : 0.0625rem; + margin-right : -0.75em; + } + + ul { + padding : 0; + list-style-type : none; + li { + padding-left : 1.563rem; + &::before { + content : ""; + display : inline-block; + width : 0.75rem; + height : 0.75rem; + position : relative; + right : 1.563rem; + top : 0.0625rem; + margin-right : -0.75em; + border-radius : 0.75rem; + background-color : $vue-green; + } + + } + } + +} + +.vue-misc { + margin-top: 5.625rem; + margin-bottom: 2rem; +} + +//Well +.well { + padding : 1.9rem 2.2rem 1.9rem 1.6rem; + // background-color : #f7f7f7; + background-color: $light-gray; +} diff --git a/rql-ui/src/sass/_variables.scss b/rql-ui/src/sass/_variables.scss new file mode 100644 index 0000000..3b1de52 --- /dev/null +++ b/rql-ui/src/sass/_variables.scss @@ -0,0 +1,348 @@ +// Colors // +$gray-light: #acb5be !default; +$light-gray: #eee; +$lighter-gray: #ddd; +$charcoal: #555; +$darkest-gray: #333; +$almost-black: #161616; +$vue-green: #4ae387; +$light-green: #c8f9c5; +$light-blue: #dcf1ff; +$light-yellow: #fff1c8; +$light-pink: #ffcece; +$vue-darkest-blue: #34495e; +$vue-turquoise: #dbf9e7; +$white: #fff; +$theme-red: #e34a4a; +$theme-orange: #f7cc36; +$theme-blue: #4ab2e3; +$theme-violet: #db76df; +$theme-pale: #d9d9d9; +$brand-primary: $vue-green !default; +$brand-danger: $theme-red; +$brand-warning: $theme-orange; +$brand-info: $theme-blue; +$brand-success: $vue-green; +$light-gray2: #eff4f5; +$dark-gray: #282828; +$gray: #adb3b9; +$violet: #db76df; +$dark-blue: #0045b6; +$breadcrumbs-gray: #b4b4b4; + +$colors-map: ( + brand-danger: $brand-danger, + brand-primary: $brand-primary, + brand-info: $brand-info, + brand-success: $brand-success, + brand-warning: $brand-warning, + black: black, + white: white, + lighter-gray: $lighter-gray +); + +$theme-colors: ( + "primary": $brand-primary, + "secondary": $white, + "success": $light-green, + "info": $brand-info, + "warning": $brand-warning, + "danger": $brand-danger, + "light": $light-gray2, + "dark": $almost-black, + "pale": $theme-pale +); + +// Layout // +$body-bg : $light-gray; +$top-nav-bg : $darkest-gray; +$body-color : $vue-darkest-blue !default; +$layout-padding : 24px; +$layout-padding-right : 44px; + +$top-nav-height : 72px; +$nav-padding-left : $layout-padding; +$nav-padding-right : $layout-padding-right; +$navbar-brand-container-left: 75px; + +$sidebar-bg : $darkest-gray; +$sidebar-width : 225px; +$sidebar-top : calc(#{$top-nav-height} + #{$layout-padding}); +$sidebar-left : $layout-padding; + +$content-wrap-ml : calc(#{$sidebar-left} + #{$sidebar-width} + 35px); +$content-wrap-pr : $layout-padding-right; +$content-wrap-pt : $layout-padding; +$content-wrap-pb : $layout-padding; + +$greeny-box-shadow: 0 4px 9.6px 0.4px rgba($vue-green, .5); + +$min-z-index : -1000; + +//Auth +$auth-wallpaper-ivuestic-h: 2.625rem; +$auth-wallpaper-oblique-line: $dark-gray; + +//Mobile Layout +$top-mobile-nav-height: 5.625rem; +$layout-mobile-padding: 0.1875rem; +$layout-mobile-padding-right: .375rem; + +$sidebar-mobile-width: calc(100% - #{$layout-mobile-padding-right}); +$sidebar-mobile-top: $top-mobile-nav-height+$layout-mobile-padding; +$sidebar-mobile-left: $layout-mobile-padding; +$content-mobile-wrap-margin: 1.125rem; +$sidebar-mobile-z-index: 1000; + +$content-mobile-wrap-pl: 1rem; +$content-mobile-wrap-pr : 1rem; +$content-mobile-wrap-pt : 2rem; +$content-mobile-wrap-pb : $layout-padding; +$content-mobile-wrap: $content-mobile-wrap-pt $content-mobile-wrap-pr $content-mobile-wrap-pb $content-mobile-wrap-pl; + +$nav-mobile-padding-h : .875rem; +$nav-mobile-pt: 3rem; +$nav-mobile-pb: 1.375rem; +$nav-mobile-brand-width: 4rem; +$nav-mobile-brand-top: .875rem; +$nav-mobile-brand-left: calc(50% - #{$nav-mobile-brand-width}); + +$droppdown-mobile-mp: 1.9375rem; +$dropdown-mobile-show-b: 2rem; + +//Auth mobile +$auth-mobile-nav-ivuestic-h: 1.5rem; +$auth-mobile-main-h: calc(100% - #{$top-mobile-nav-height}); +$auth-content-padding-t: 2.875rem; + + +// Typography +// ------------------------- + +//$text-color: $gray !default; + +$font-family-sans-serif : 'Source Sans Pro', sans-serif !default; + +$font-size-root : 16px; + +$font-size-base : 1rem !default; +$font-size-larger : 1.2rem; +$font-size-large : 1.5rem; +$font-size-mini : 0.8rem; + +$font-weight-bold : 700 !default; +$font-weight-semi-bold : 600 !default; +$font-weight-normal : 400 !default; +$font-weight-thin : 300 !default; +$font-weight-base : $font-weight-thin !default; + +$font-size-smaller : 85% !default; + +$font-size-h1 : 2.625rem !default; +$font-size-h2 : 2.25rem !default; +$font-size-h3 : 1.75rem !default; +$font-size-h4 : 1.375rem !default; + +$headings-line-height : 1 !default; + +$blockquote-border-color : $vue-green; +$blockquote-small-color: $gray-light; +$blockquote-border-width : 0.375rem; +$blockquote-font-size : 1.5rem; +//Navbar +$navbar-dd-item-height : 48px; + +//Breadcrumbs +$breadcrumbs-height : 54px; +$breadcrumbs-arrow-font: 0.7rem; +$breadcrumbs-arrow-content: "\f054"; + +//Sidebar +$sidebar-link-height : 64px; +$sidebar-submenu-link-height : 48px; +$sidebar-link-pl : 25px; +$sidebar-submenu-link-pl : 74px; +$sidebar-link-active-bg : $almost-black; +$sidebar-arrow-right : 16px; +$sidebar-menu-item-icon-size : 19px; +$sidebar-viewport-height: calc(100vh - #{$top-nav-height} - #{$content-wrap-pt} - #{$content-wrap-pb}); + +$sidebar-hidden-top : -150px; +$sidebar-hidden-top-mobile : $sidebar-mobile-top; +$sidebar-hidden-height-mobile: 0; +$sidebar-box-shadow: 0px 8px 14.72px 1.28px rgba(#65a977, 0.3); + +//Widgets +$widget-bg : $white; +$widget-padding : 1.5625rem; +$widget-larger-padding: 45px; +$widget-box-shadow : 0px 4px 70px -18px rgba(112, 112, 112, 1); +$widget-danger-shadow: 0px 4px 70px -16px $brand-danger; +$widget-info-shadow: 0px 4px 70px -16px $brand-info; +$widget-viewport-height : $sidebar-viewport-height; +$widget-header-border: 2px solid $light-gray; +$widget-header-height: 55px; +$widget-body-no-header-height: 100%; +$widget-body-with-header-height: calc(100% - #{$widget-header-height}); +$widget-mb: 1.875rem; +$info-widget-border: 0.5rem solid $brand-primary; + +// Links +$link-color: $brand-primary; +$link-hover-color: lighten($link-color, 10%); +$link-hover-decoration: none; + +//Buttons +$input-btn-border-width: 0px; +$btn-line-height: 1.25; +$btn-line-height-sm: $btn-line-height; +$btn-padding-x: 3.9rem; +$btn-padding-y: 1.1rem; +$btn-padding-y-sm: 0.7rem; +$btn-padding-x-sm: 2.5rem; +$btn-padding-y-micro: 0.625rem; +$btn-padding-x-micro: 1.8rem; +$btn-with-icon-text-margin: 1.875rem; +$btn-with-icon-padding-x: 2.8125rem; +$btn-with-icon-rounded-size: 3.5rem; +$btn-with-icon-rounded-size-micro: 2.25rem; +$btn-with-icon-rounded-font-micro: 1.5rem; +$btn-with-icon-rounded-position-top: .4rem; +$btn-with-icon-rounded-position-left: .46rem; +$btn-with-icon-icon-top: .75rem; +$btn-with-icon-rounded-icon-left: 1.23rem; +$btn-with-icon-icon-size: 2rem; +$btn-group-button-padding-x: 1.53rem; +$btn-box-shadow: $greeny-box-shadow; +$btn-box-danger-shadow: 0px 4px 70px -16px $brand-danger; +$btn-box-warning-shadow: 0px 4px 70px -16px $brand-warning; +$btn-box-success-shadow: $greeny-box-shadow; +$btn-box-info-shadow: 0px 4px 70px -16px $brand-info; +$btn-box-pale-shadow: 0px 4px 70px -16px $theme-pale; +$btn-box-dark-shadow: 0px 4px 70px -16px $almost-black; +$btn-border-radius: 1.875rem; +$btn-dark-color: $white; +$btn-dark-bg: $darkest-gray; +$btn-dark-border: $darkest-gray; +$btn-pale-bg: $theme-pale; +$btn-pale-color: $white; +$btn-dd-arrow-size: 1rem; +$btn-border: none; +$btn-secondary-theme-border: 2px solid $brand-primary; + +//Dropdowns +$dropdown-link-color : $white; +$dropdown-box-shadow : $greeny-box-shadow; +$dropdown-background: $darkest-gray; +$dropdown-link-color: $white; +$dropdown-link-hover-color: $white; +$dropdown-link-hover-bg: $almost-black; +$dropdown-link-active-color: $white; +$dropdown-link-active-bg: $almost-black; +$dropdown-item-padding-x: 25px; +$dropdown-item-padding-y: 0; +$dropdown-item-height: 40px; +$dropdown-menu-padding-y: 10px; +$dropdown-menu-padding-x: 0; +$dropdown-min-width: 15rem; +$dropdown-simple-visible-items: 4; +$dropdown-multi-visible-items: 4; +$dropdown-show-b: 1.125rem; + +//Modals +$modal-header-padding-x: $widget-padding; +$modal-header-padding-y: 0; +$modal-header-height: $widget-header-height; +$modal-header-border: $widget-header-border; +$modal-content-border-width: 0; +$modal-content-border-radius: 0; +$modal-inner-padding: 25px; +$modal-footer-btns-padding-bottom: 20px; +$modal-footer-btns-margin-x: 10px; +$modal-md: 650px; +$modal-lg: 850px; + +//Forms +$input-border-color: $lighter-gray; +$input-bg-disabled: $white; + +$vuestic-switch-bg: $brand-primary; +$vuestic-switch-padding: 0.313rem 2.375rem; +$vuestic-switch-border-size: 0.125rem; + +//Progress Bars +$progress-bar-value-font-size: 0.6875rem; +$progress-bar-circle-diameter: 3.125rem; +$progress-bar-circle-bw: .0678rem; +$progress-bar-circle-overlay-diameter: calc(#{$progress-bar-circle-diameter} - 2*#{$progress-bar-circle-bw}); +$progress-bar-vertical-height: 5.75rem; +$progress-bar-width-thin: .125rem; +$progress-bar-width-basic: .5rem; +$progress-bar-width-thick: 1.5rem; + +//Tables +$table-bg-accent: $white; +$table-border-width: 0; +$table-border-color: #eceeef; +$striped-row-odd: $white; +$striped-row: $light-gray2; +$state-success-bg: #c8fac6; +$state-danger-bg: #ffcece; +$state-warning-bg: #fff1c8; +$state-info-bg: #dcf1ff; + +//Badges +$badge-padding-y: 0.28rem; +$badge-min-width: 5rem; +$badge-font-size: 0.7rem; +$badge-success-bg: $brand-success; +$badge-warning-bg: $theme-orange; +$badge-danger-bg: $theme-red; +$badge-info-bg: $theme-blue; + +//Alerts +$alert-padding-x: 1.25rem !default; +$alert-padding-y: .75rem !default; +$alert-margin-bottom: $widget-mb; +$with-close-pr: 3.125rem; + +$alert-border-radius: 0; +$alert-border-width: 0; + +$alert-success-bg: $light-green; +$alert-success-text: $body-color; +$alert-success-border: transparent; +$alert-success-shadow: 0px 4px 9.6px 0.4px rgba(79, 206, 145, 0.5); + +$alert-info-bg: $light-blue; +$alert-info-text: $body-color; +$alert-info-border: transparent; +$alert-info-shadow: 0px 4px 9.6px 0.4px rgba(79, 142, 206, 0.5); + +$alert-warning-bg: $light-yellow; +$alert-warning-text: $body-color; +$alert-warning-border: transparent; +$alert-warning-shadow: 0px 4px 9.6px 0.4px rgba(206, 178, 79, 0.5); + +$alert-danger-bg: $light-pink; +$alert-danger-text: $body-color; +$alert-danger-border: transparent; +$alert-danger-shadow: 0px 4px 9.6px 0.4px rgba(206, 79, 79, 0.5); + +//Icons +$bootstrap-sass-asset-helper: false; +$icon-font-name: 'glyphicons-halflings-regular'; +$icon-font-svg-id: 'glyphicons_halflingsregular'; +$icon-font-path: './fonts/'; + +//Tabs + +$tab-content-pt: 3.125rem; +$tab-content-pb: 1.5rem; + +//PreLoader +$vuestic-preloader-left: calc(50% - 140px/2); +$vuestic-preloader-top: calc(50% - 104px/2); + +//Medium Editor +$medium-editor-button-size: $btn-padding-y * 2 + $font-size-base * $btn-line-height; diff --git a/rql-ui/src/sass/main.scss b/rql-ui/src/sass/main.scss new file mode 100644 index 0000000..60ec4ad --- /dev/null +++ b/rql-ui/src/sass/main.scss @@ -0,0 +1,23 @@ +@import "~normalize.css"; + +@import "mixins"; +@import "variables"; +@import "fonts"; + +@import "~bootstrap/scss/bootstrap"; +@import "~font-awesome/css/font-awesome.css"; + +@import "~ionicons/dist/css/ionicons.css"; +@import "~awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.scss"; +@import "~medium-editor/src/sass/medium-editor"; +@import "_icons-styles.scss"; + +@import "base"; +@import "typography"; +@import "icons"; +@import "material-forms"; + +@import "override-bootstrap"; +@import "override-custom-libs"; + +@import "glyphicons"; diff --git a/rql-ui/static/.gitkeep b/rql-ui/static/.gitkeep new file mode 100644 index 0000000..e69de29