diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e001028dc23..dfd5ecccd2d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v2 with: - node-version: '15' + node-version: '16' - name: Setup Cache for Node.js uses: actions/cache@v2 diff --git a/cnf/build.bnd b/cnf/build.bnd index 1abe3c9cf6d..27af124751a 100644 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -60,7 +60,7 @@ buildpath: \ osgi.annotation;version='7.0.0',\ osgi.core;version='7.0.0',\ osgi.cmpn;version='7.0.0',\ - slf4j.api;version='1.7.30',\ + slf4j.api;version='1.7.32',\ com.google.guava;version='30.1.1',\ com.google.gson;version='2.8.7' @@ -85,7 +85,7 @@ testpath: \ Edge_Controller_PVinverter;member=${filter;${p};io\.openems\.edge\.controller\.pvinverter\..*},\ Edge_Ess;member=${filter;${p};io\.openems\.edge\.ess\..*},\ Edge_Evcs;member=${filter;${p};io\.openems\.edge\.evcs\..*|io\.openems\.wrapper\.eu\.chargetime\.ocpp},\ - Edge_Multiple;member=${filter;${p};io\.openems\.edge\.fenecon\..*|io\.openems\.edge\.goodwe|io\.openems\.edge\.kostal\.piko|io\.openems\.edge\.tesla\.*|io\.openems\.edge\.solaredge},\ + Edge_Multiple;member=${filter;${p};io\.openems\.edge\.fenecon\..*|io\.openems\.edge\.goodwe|io\.openems\.edge\.kostal\.piko|io\.openems\.edge\.tesla\..*|io\.openems\.edge\.solaredge|io\.openems\.edge\.bosch\..*},\ Edge_IO;member=${filter;${p};io\.openems\.edge\.io\..*|io\.openems\.edge\.controller\.channelthreshold|io\.openems\.edge\.controller\.chp\..*|io\.openems\.edge\.controller\.highloadtimeslot},\ Edge_Meter;member=${filter;${p};io\.openems\.edge\.meter\..*},\ Edge_Predictor;member=${filter;${p};io\.openems\.edge\.predictor\..*},\ diff --git a/cnf/checkstyle.xml b/cnf/checkstyle.xml index da949c5bff7..1ed435b2f14 100644 --- a/cnf/checkstyle.xml +++ b/cnf/checkstyle.xml @@ -18,9 +18,9 @@ - + @@ -140,9 +140,9 @@ - + @@ -167,8 +167,8 @@ - + @@ -201,6 +201,7 @@ + diff --git a/cnf/pom.xml b/cnf/pom.xml index eee944c974c..258eb4d8170 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -147,6 +147,12 @@ org.apache.felix.eventadmin 1.6.2 + + + org.apache.felix + org.apache.felix.framework + 7.0.1 + @@ -208,11 +214,6 @@ org.eclipse.paho.mqttv5.client 1.2.5 - - org.eclipse.platform - org.eclipse.osgi - 3.16.300 - org.influxdb influxdb-java @@ -223,6 +224,17 @@ Java-WebSocket 1.5.2 + + + org.jsoup + jsoup + 1.10.2 + + + org.osgi + org.osgi.framework + 1.10.0 + org.msgpack msgpack-core @@ -273,12 +285,12 @@ org.slf4j slf4j-api - 1.7.30 + 1.7.32 org.slf4j slf4j-simple - 1.7.30 + 1.7.32 diff --git a/doc/modules/ROOT/pages/single_document.adoc b/doc/modules/ROOT/pages/single_document.adoc index 03f4f9f8828..c104cb51843 100644 --- a/doc/modules/ROOT/pages/single_document.adoc +++ b/doc/modules/ROOT/pages/single_document.adoc @@ -1,7 +1,7 @@ = OpenEMS - Open Energy Management System ifndef::toc[] (c) 2020 OpenEMS Association e.V. -Version 2021.13.0 +Version 2021.14.0 :sectnums: :sectnumlevels: 4 :toc: diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 498625d1a82..c8c7525b07e 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -1,4 +1,4 @@ --runfw: org.eclipse.osgi +-runfw: org.apache.felix.framework;version='[7.0.1,7.0.1]' -runee: JavaSE-1.8 -runprovidedcapabilities: ${native_capability} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/AddEdgeToUserRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/AddEdgeToUserRequest.java new file mode 100644 index 00000000000..8d38068a7ac --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/AddEdgeToUserRequest.java @@ -0,0 +1,63 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +/** + * Adds a Edge to a User. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": UUID,
+ *   "method": "addEdgeToUser",
+ *   "params": {
+ *      "setupPassword": string
+ *   }
+ * }
+ * 
+ */ +public class AddEdgeToUserRequest extends JsonrpcRequest { + + public static final String METHOD = "addEdgeToUser"; + + /** + * Create {@link AddEdgeToUserRequest} from a template {@link JsonrpcRequest}. + * + * @param r the template {@link JsonrpcRequest} + * @return the {@link AddEdgeToUserRequest} + * @throws OpenemsNamedException on parse error + */ + public static AddEdgeToUserRequest from(JsonrpcRequest r) throws OpenemsNamedException { + JsonObject p = r.getParams(); + String setupPassword = JsonUtils.getAsString(p, "setupPassword"); + return new AddEdgeToUserRequest(r, setupPassword); + } + + private final String setupPassword; + + public AddEdgeToUserRequest(String setupPassword) { + super(METHOD); + this.setupPassword = setupPassword; + } + + private AddEdgeToUserRequest(JsonrpcRequest request, String setupPassword) { + super(request, METHOD); + this.setupPassword = setupPassword; + } + + @Override + public JsonObject getParams() { + return JsonUtils.buildJsonObject() // + .addProperty("setupPassword", this.setupPassword) // + .build(); + } + + public String getSetupPassword() { + return this.setupPassword; + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetSetupProtocolRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetSetupProtocolRequest.java new file mode 100644 index 00000000000..49d4951c965 --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetSetupProtocolRequest.java @@ -0,0 +1,49 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +public class GetSetupProtocolRequest extends JsonrpcRequest { + + public static final String METHOD = "getSetupProtocol"; + + /** + * Create {@link GetSetupProtocolRequest} from a template + * {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return Created {@link GetSetupProtocolRequest} + */ + public static GetSetupProtocolRequest from(JsonrpcRequest request) throws OpenemsNamedException { + JsonObject params = request.getParams(); + + return new GetSetupProtocolRequest(request, JsonUtils.getAsInt(params, "setupProtocolId")); + } + + private final int setupProtocolId; + + private GetSetupProtocolRequest(JsonrpcRequest request, int setupProtocolId) { + super(request, METHOD); + this.setupProtocolId = setupProtocolId; + } + + @Override + public JsonObject getParams() { + return JsonUtils.buildJsonObject() // + .addProperty("setupProtocolId", this.setupProtocolId) // + .build(); + } + + /** + * Gets the Setup Protocol ID. + * + * @return the Setup Protocol ID + */ + public int getSetupProtocolId() { + return this.setupProtocolId; + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetUserInformationRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetUserInformationRequest.java new file mode 100644 index 00000000000..31b824c1a37 --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/GetUserInformationRequest.java @@ -0,0 +1,43 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.jsonrpc.base.JsonrpcRequest; + +/** + * Gets the User Information. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": UUID,
+ *   "method": "getUserInformation",
+ *   "params": {}
+ * }
+ * 
+ */ +public class GetUserInformationRequest extends JsonrpcRequest { + + public static final String METHOD = "getUserInformation"; + + /** + * Create {@link GetUserInformationRequest} from a template + * {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return Created {@link GetUserInformationRequest} + */ + public static GetUserInformationRequest from(JsonrpcRequest request) { + return new GetUserInformationRequest(request); + } + + private GetUserInformationRequest(JsonrpcRequest request) { + super(request, METHOD); + } + + @Override + public JsonObject getParams() { + return new JsonObject(); + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/RegisterUserRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/RegisterUserRequest.java new file mode 100644 index 00000000000..3adf0d3b58c --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/RegisterUserRequest.java @@ -0,0 +1,46 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +public class RegisterUserRequest extends JsonrpcRequest { + + public static final String METHOD = "registerUser"; + + /** + * Create {@link RegisterUserRequest} from a template {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return Created {@link RegisterUserRequest} + */ + public static RegisterUserRequest from(JsonrpcRequest request) throws OpenemsNamedException { + JsonObject params = request.getParams(); + + return new RegisterUserRequest(request, JsonUtils.getAsJsonObject(params, "user")); + } + + private final JsonObject jsonObject; + + private RegisterUserRequest(JsonrpcRequest request, JsonObject jsonObject) { + super(request, METHOD); + this.jsonObject = jsonObject; + } + + @Override + public JsonObject getParams() { + return this.jsonObject; + } + + /** + * Gets the User Registration information as {@link JsonObject}. + * + * @return the {@link JsonObject} + */ + public JsonObject getJsonObject() { + return this.jsonObject; + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SetUserInformationRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SetUserInformationRequest.java new file mode 100644 index 00000000000..8b28ce227dd --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SetUserInformationRequest.java @@ -0,0 +1,76 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +/** + * Sets the User Information. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": UUID,
+ *   "method": "setUserInformation",
+ *   "params": {
+ *     "user": {
+ *       "firstname": string,
+ *       "lastname": string,
+ *       "email": string,
+ *       "phone": string,
+ *       "address": {
+ *         "street": string,
+ *         "city": string,
+ *         "zip": string,
+ *         "country": string
+ *       },
+ *       "company": {
+ *         "name": string
+ *       }
+ *     }
+ *   }
+ * }
+ * 
+ */ +public class SetUserInformationRequest extends JsonrpcRequest { + + public static final String METHOD = "setUserInformation"; + + /** + * Create {@link SetUserInformationRequest} from a template + * {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return Created {@link SetUserInformationRequest} + * @throws OpenemsNamedException on parse error + */ + public static SetUserInformationRequest from(JsonrpcRequest request) throws OpenemsNamedException { + JsonObject params = request.getParams(); + + return new SetUserInformationRequest(request, JsonUtils.getAsJsonObject(params, "user")); + } + + private final JsonObject jsonObject; + + private SetUserInformationRequest(JsonrpcRequest request, JsonObject jsonObject) { + super(request, METHOD); + this.jsonObject = jsonObject; + } + + @Override + public JsonObject getParams() { + return this.jsonObject; + } + + /** + * Gets the User Information as {@link JsonObject}. + * + * @return the {@link JsonObject} + */ + public JsonObject getJsonObject() { + return this.jsonObject; + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SubmitSetupProtocolRequest.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SubmitSetupProtocolRequest.java new file mode 100644 index 00000000000..13c27d7f46e --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/request/SubmitSetupProtocolRequest.java @@ -0,0 +1,105 @@ +package io.openems.backend.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +/** + * Submits the Setup Protocol. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": UUID,
+ *   "method": "submitSetupProtocol",
+ *   "params": {
+ *     "protocol": {
+ *       "edge": {
+ *         "id": string
+ *       }, 
+ *       "customer": {
+ *         "firstname": string,
+ *         "lastname": string,
+ *         "email": string,
+ *         "phone": string,
+ *         "address": {
+ *           "street": string,
+ *           "city": string,
+ *           "zip": string,
+ *           "country": string
+ *         },
+ *         "company": {
+ *          "name": string
+ *         }
+ *       },
+ *       "location": {
+ *         "firstname": string,
+ *         "lastname": string,
+ *         "email": string,
+ *         "phone": string,
+ *         "address": {
+ *           "street": string,
+ *           "city": string,
+ *           "zip": string,
+ *           "country": string
+ *         },
+ *         "company": {
+ *          "name": string
+ *         }
+ *       },
+ *       "lots": [{
+ *         "category": string,
+ *         "name": string,
+ *         "serialNumber": string
+ *       }],
+ *       "items": [{
+ *         "category": string,
+ *         "name": string,
+ *         "value": string
+ *       }]
+ *     }
+ *   }
+ * }
+ * 
+ */ +public class SubmitSetupProtocolRequest extends JsonrpcRequest { + + public static final String METHOD = "submitSetupProtocol"; + + /** + * Create {@link SubmitSetupProtocolRequest} from a template + * {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return Created {@link SubmitSetupProtocolRequest} + * @throws OpenemsNamedException on parse error + */ + public static SubmitSetupProtocolRequest from(JsonrpcRequest request) throws OpenemsNamedException { + JsonObject params = request.getParams(); + return new SubmitSetupProtocolRequest(request, JsonUtils.getAsJsonObject(params, "protocol")); + } + + private final JsonObject jsonObject; + + private SubmitSetupProtocolRequest(JsonrpcRequest request, JsonObject jsonObject) { + super(request, METHOD); + this.jsonObject = jsonObject; + } + + @Override + public JsonObject getParams() { + return this.jsonObject; + } + + /** + * Gets the Setup Protocol information as {@link JsonObject}. + * + * @return the {@link JsonObject} + */ + public JsonObject getJsonObject() { + return this.jsonObject; + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/AddEdgeToUserResponse.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/AddEdgeToUserResponse.java new file mode 100644 index 00000000000..30ce30a1c3b --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/AddEdgeToUserResponse.java @@ -0,0 +1,45 @@ +package io.openems.backend.common.jsonrpc.response; + +import java.util.UUID; + +import com.google.gson.JsonObject; + +import io.openems.backend.common.jsonrpc.request.AddEdgeToUserRequest; +import io.openems.backend.common.metadata.Edge; +import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess; +import io.openems.common.utils.JsonUtils; + +/** + * Represents a JSON-RPC Response for {@link AddEdgeToUserRequest}. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": "UUID",
+ *   "result": {
+ *     "edge": Edge
+ *   }
+ * }
+ * 
+ */ +public class AddEdgeToUserResponse extends JsonrpcResponseSuccess { + + private final Edge edge; + + public AddEdgeToUserResponse(Edge edge) { + this(UUID.randomUUID(), edge); + } + + public AddEdgeToUserResponse(UUID id, Edge edge) { + super(id); + this.edge = edge; + } + + @Override + public JsonObject getResult() { + return JsonUtils.buildJsonObject() // + .add("edge", this.edge.toJsonObject()) // + .build(); + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetEdgesChannelsValuesResponse.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetEdgesChannelsValuesResponse.java index a1c42bb4d93..b0f46c0ab7e 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetEdgesChannelsValuesResponse.java +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetEdgesChannelsValuesResponse.java @@ -40,6 +40,13 @@ public GetEdgesChannelsValuesResponse(UUID id) { super(id); } + /** + * Adds a Value to the JSON-RPC Response. + * + * @param edgeId the Edge-ID + * @param channel the {@link ChannelAddress} + * @param value the value + */ public void addValue(String edgeId, ChannelAddress channel, JsonElement value) { this.values.put(edgeId, channel, value); } diff --git a/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetUserInformationResponse.java b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetUserInformationResponse.java new file mode 100644 index 00000000000..67564d25451 --- /dev/null +++ b/io.openems.backend.common/src/io/openems/backend/common/jsonrpc/response/GetUserInformationResponse.java @@ -0,0 +1,82 @@ +package io.openems.backend.common.jsonrpc.response; + +import java.util.Map; +import java.util.UUID; + +import com.google.gson.JsonObject; + +import io.openems.backend.common.jsonrpc.request.GetUserInformationRequest; +import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess; +import io.openems.common.utils.JsonUtils; +import io.openems.common.utils.ObjectUtils; + +/** + * Represents a JSON-RPC Response for {@link GetUserInformationRequest}. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": "UUID",
+ *   "result": {
+ *     "user": {
+ *       "firstname": string,
+ *       "lastname": string,
+ *       "email": string,
+ *       "phone": string,
+ *       "address": {
+ *         "street": string,
+ *         "city": string,
+ *         "zip": string,
+ *         "country": string
+ *       },
+ *       "company": {
+ *         "name": string
+ *       }
+ *     }
+ *   }
+ * }
+ * 
+ */ +public class GetUserInformationResponse extends JsonrpcResponseSuccess { + + private final Map userInformation; + + public GetUserInformationResponse(UUID id, Map userInformation) { + super(id); + this.userInformation = userInformation; + } + + @Override + public JsonObject getResult() { + JsonObject companyJson = JsonUtils.buildJsonObject() // + .addProperty("name", ObjectUtils.getAsString(this.userInformation.get("commercial_company_name"))) // + .build(); + + String country = null; + Object[] array = ObjectUtils.getAsObjectArrray(this.userInformation.get("country_id")); + if (array.length > 2) { + country = ObjectUtils.getAsString(array[2]).toLowerCase(); + } + + JsonObject addressJson = JsonUtils.buildJsonObject() // + .addProperty("street", ObjectUtils.getAsString(this.userInformation.get("street"))) // + .addProperty("zip", ObjectUtils.getAsString(this.userInformation.get("zip"))) // + .addProperty("city", ObjectUtils.getAsString(this.userInformation.get("city"))) // + .addProperty("country", country) // + .build(); + + JsonObject userJson = JsonUtils.buildJsonObject() // + .addProperty("firstname", ObjectUtils.getAsString(this.userInformation.get("firstname"))) // + .addProperty("lastname", ObjectUtils.getAsString(this.userInformation.get("lastname"))) // + .addProperty("email", ObjectUtils.getAsString(this.userInformation.get("email"))) // + .addProperty("phone", ObjectUtils.getAsString(this.userInformation.get("phone"))) // + .add("address", addressJson) // + .add("company", companyJson) // + .build(); + + return JsonUtils.buildJsonObject() // + .add("user", userJson) // + .build(); + } + +} diff --git a/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java b/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java index 02054af641d..afaa47d046c 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java +++ b/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java @@ -10,8 +10,10 @@ import org.osgi.annotation.versioning.ProviderType; import com.google.common.collect.HashMultimap; +import com.google.gson.JsonObject; import io.openems.common.channel.Level; +import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; import io.openems.common.types.ChannelAddress; @@ -107,6 +109,14 @@ public default Edge getEdgeOrError(String edgeId) throws OpenemsException { } } + /** + * Get an Edge by Edge-SetupPassword. + * + * @param setupPassword to find Edge + * @return Edge as a Optional + */ + public abstract Optional getEdgeBySetupPassword(String setupPassword); + /** * Gets the User for the given User-ID. * @@ -122,6 +132,42 @@ public default Edge getEdgeOrError(String edgeId) throws OpenemsException { */ public abstract Collection getAllEdges(); + /** + * Assigns Edge with given setupPassword to the logged in user and returns it. + * + *

+ * If the setupPassword is invalid, an OpenemsNamedException is thrown. + * + * @param user the {@link User} + * @param setupPassword the Setup-Password + * @return the Edge for the given Setup-Password + * @throws OpenemsNamedException on error + */ + public default Edge addEdgeToUser(User user, String setupPassword) throws OpenemsNamedException { + Optional optEdge = this.getEdgeBySetupPassword(setupPassword); + if (!optEdge.isPresent()) { + throw OpenemsError.COMMON_AUTHENTICATION_FAILED.exception(); + } + + Edge edge = optEdge.get(); + this.addEdgeToUser(user, edge); + + return edge; + } + + /** + * Assigns Edge to current user. + * + *

+ * If assignment fails, an OpenemsNamedException is thrown. + * + * @param user The {@link User} + * @param edge The {@link Edge} + * + * @throws OpenemsNamedException on error + */ + public void addEdgeToUser(User user, Edge edge) throws OpenemsNamedException; + /** * Helper method for creating a String of all active State-Channels by Level. * @@ -178,4 +224,50 @@ public static String activeStateChannelsToString( return result.toString(); } + /** + * Gets information about the given user {@link User}. + * + * @param user {@link User} to read information + * @return {@link Map} about the user + * @throws OpenemsNamedException on error + */ + public Map getUserInformation(User user) throws OpenemsNamedException; + + /** + * Update the given user {@link User} with new information {@link JsonObject}. + * + * @param user {@link User} to update + * @param jsonObject {@link JsonObject} information about the user + * @throws OpenemsNamedException on error + */ + public void setUserInformation(User user, JsonObject jsonObject) throws OpenemsNamedException; + + /** + * Returns the Setup Protocol PDF for the given id. + * + * @param user {@link User} the current user + * @param setupProtocolId the setup protocol id to search + * @return the Setup Protocol PDF as a byte array + * @throws OpenemsNamedException on error + */ + public byte[] getSetupProtocol(User user, int setupProtocolId) throws OpenemsNamedException; + + /** + * Submit the installation assistant protocol. + * + * @param user {@link User} the current user + * @param jsonObject {@link JsonObject} the setup protocol + * @return id of created setup protocol + * @throws OpenemsNamedException on error + */ + public int submitSetupProtocol(User user, JsonObject jsonObject) throws OpenemsNamedException; + + /** + * Register a user. + * + * @param jsonObject {@link JsonObject} that represents an user + * @throws OpenemsNamedException on error + */ + public void registerUser(JsonObject jsonObject) throws OpenemsNamedException; + } diff --git a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java index 86cb7e94060..8b9be0bfc93 100644 --- a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java +++ b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java @@ -19,12 +19,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + import io.openems.backend.common.metadata.AbstractMetadata; import io.openems.backend.common.metadata.Edge; import io.openems.backend.common.metadata.Edge.State; import io.openems.backend.common.metadata.Metadata; import io.openems.backend.common.metadata.User; import io.openems.common.channel.Level; +import io.openems.common.exceptions.NotImplementedException; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.session.Role; @@ -104,15 +107,18 @@ public Optional getEdgeIdForApikey(String apikey) { Optional idOpt = DummyMetadata.parseNumberFromName(apikey); int id; String edgeId; + String setupPassword; if (idOpt.isPresent()) { edgeId = apikey; id = idOpt.get(); + setupPassword = edgeId; } else { // create new ID id = this.nextEdgeId.incrementAndGet(); edgeId = "edge" + id; + setupPassword = edgeId; } - MyEdge edge = new MyEdge(edgeId, apikey, "OpenEMS Edge #" + id, State.ACTIVE, "", "", Level.OK, + MyEdge edge = new MyEdge(edgeId, apikey, setupPassword, "OpenEMS Edge #" + id, State.ACTIVE, "", "", Level.OK, new EdgeConfig()); edge.onSetConfig(config -> { this.logInfo(this.log, "Edge [" + edgeId + "]. Update config: " @@ -123,6 +129,19 @@ public Optional getEdgeIdForApikey(String apikey) { } + @Override + public Optional getEdgeBySetupPassword(String setupPassword) { + Optional optEdge = this.edges.values().stream() + .filter(edge -> edge.getSetupPassword().equals(setupPassword)).findFirst(); + + if (optEdge.isPresent()) { + MyEdge edge = optEdge.get(); + return Optional.of(edge); + } + + return Optional.empty(); + } + @Override public Optional getEdge(String edgeId) { Edge edge = this.edges.get(edgeId); @@ -151,4 +170,35 @@ private static Optional parseNumberFromName(String name) { } return Optional.empty(); } + + @Override + public void addEdgeToUser(User user, Edge edge) throws OpenemsNamedException { + throw new NotImplementedException("DummyMetadata.addEdgeToUser()"); + } + + @Override + public Map getUserInformation(User user) throws OpenemsNamedException { + throw new NotImplementedException("DummyMetadata.getUserInformation()"); + } + + @Override + public void setUserInformation(User user, JsonObject jsonObject) throws OpenemsNamedException { + throw new NotImplementedException("DummyMetadata.setUserInformation()"); + } + + @Override + public byte[] getSetupProtocol(User user, int setupProtocolId) throws OpenemsNamedException { + throw new IllegalArgumentException("DummyMetadata.getSetupProtocol() is not implemented"); + } + + @Override + public int submitSetupProtocol(User user, JsonObject jsonObject) { + throw new IllegalArgumentException("DummyMetadata.submitSetupProtocol() is not implemented"); + } + + @Override + public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { + throw new IllegalArgumentException("DummyMetadata.registerUser() is not implemented"); + } + } diff --git a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MyEdge.java b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MyEdge.java index bbf310e2e04..247da599887 100644 --- a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MyEdge.java +++ b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/MyEdge.java @@ -7,15 +7,21 @@ public class MyEdge extends Edge { private final String apikey; + private final String setupPassword; - public MyEdge(String id, String apikey, String comment, State state, String version, String producttype, - Level sumState, EdgeConfig config) { + public MyEdge(String id, String apikey, String setupPassword, String comment, State state, String version, + String producttype, Level sumState, EdgeConfig config) { super(id, comment, state, version, producttype, sumState, config); this.apikey = apikey; + this.setupPassword = setupPassword; } public String getApikey() { - return apikey; + return this.apikey; + } + + public String getSetupPassword() { + return this.setupPassword; } } diff --git a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java index 9792c323be8..900cf2aecc0 100644 --- a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java +++ b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java @@ -32,6 +32,7 @@ import io.openems.backend.common.metadata.Metadata; import io.openems.backend.common.metadata.User; import io.openems.common.channel.Level; +import io.openems.common.exceptions.NotImplementedException; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.session.Role; @@ -125,6 +126,17 @@ public synchronized Optional getEdgeIdForApikey(String apikey) { return Optional.empty(); } + @Override + public synchronized Optional getEdgeBySetupPassword(String setupPassword) { + this.refreshData(); + for (MyEdge edge : this.edges.values()) { + if (edge.getSetupPassword().equals(setupPassword)) { + return Optional.of(edge); + } + } + return Optional.empty(); + } + @Override public synchronized Optional getEdge(String edgeId) { this.refreshData(); @@ -169,6 +181,7 @@ private synchronized void refreshData() { edges.add(new MyEdge(// entry.getKey(), // Edge-ID JsonUtils.getAsString(edge, "apikey"), // + JsonUtils.getAsString(edge, "setuppassword"), // JsonUtils.getAsString(edge, "comment"), // State.ACTIVE, // State "", // Version @@ -197,4 +210,34 @@ private static User generateUser() { FileMetadata.USER_GLOBAL_ROLE, new TreeMap<>()); } + @Override + public void addEdgeToUser(User user, Edge edge) throws OpenemsNamedException { + throw new NotImplementedException("FileMetadata.addEdgeToUser()"); + } + + @Override + public Map getUserInformation(User user) throws OpenemsNamedException { + throw new NotImplementedException("FileMetadata.getUserInformation()"); + } + + @Override + public void setUserInformation(User user, JsonObject jsonObject) throws OpenemsNamedException { + throw new NotImplementedException("FileMetadata.setUserInformation()"); + } + + @Override + public byte[] getSetupProtocol(User user, int setupProtocolId) throws OpenemsNamedException { + throw new IllegalArgumentException("FileMetadata.getSetupProtocol() is not implemented"); + } + + @Override + public int submitSetupProtocol(User user, JsonObject jsonObject) { + throw new IllegalArgumentException("FileMetadata.submitSetupProtocol() is not implemented"); + } + + @Override + public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { + throw new IllegalArgumentException("FileMetadata.registerUser() is not implemented"); + } + } diff --git a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/MyEdge.java b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/MyEdge.java index eb94aad6dfe..ba950b32dd7 100644 --- a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/MyEdge.java +++ b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/MyEdge.java @@ -7,15 +7,21 @@ public class MyEdge extends Edge { private final String apikey; + private final String setupPassword; - public MyEdge(String id, String apikey, String comment, State state, String version, String producttype, - Level sumState, EdgeConfig config) { + public MyEdge(String id, String apikey, String setupPassword, String comment, State state, String version, + String producttype, Level sumState, EdgeConfig config) { super(id, comment, state, version, producttype, sumState, config); this.apikey = apikey; + this.setupPassword = setupPassword; } public String getApikey() { - return apikey; + return this.apikey; + } + + public String getSetupPassword() { + return this.setupPassword; } } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java index f6eea9289f1..2f940210394 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java @@ -31,6 +31,7 @@ public static String getSqlQueryFields(Field[] fields) { public enum EdgeDevice implements Field { ID("id", true), // APIKEY("apikey", true), // + SETUP_PASSWORD("setup_password", true), // NAME("name", true), // COMMENT("comment", true), // STATE("state", true), // @@ -78,6 +79,7 @@ public int index() { public boolean isQuery() { return this.query; } + } /** @@ -129,6 +131,7 @@ public int index() { public boolean isQuery() { return this.query; } + } /** @@ -175,5 +178,399 @@ public int index() { public boolean isQuery() { return this.query; } + + } + + /** + * The EdgeDeviceUserRole-Model. + */ + public enum EdgeDeviceUserRole implements Field { + DEVICE_ID("device_id", false), // + USER_ID("user_id", false), // + ROLE("role", false); + + public static final String ODOO_MODEL = "edge.device_user_role"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private EdgeDeviceUserRole(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + + } + + public enum User implements Field { + LOGIN("login", true), // + PASSWORD("password", true), // + PARTNER("partner_id", true), // + GLOBAL_ROLE("global_role", true), // + GROUPS("groups_id", true); + + public static final String ODOO_MODEL = "res.users"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private User(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + + public enum Partner implements Field { + FIRSTNAME("firstname", true), // + LASTNAME("lastname", true), // + EMAIL("email", true), // + PHONE("phone", true), // + COMPANY_NAME("commercial_company_name", true), // + NAME("name", true), // + IS_COMPANY("is_company", true), // + PARENT("parent_id", true), // + STREET("street", true), // + ZIP("zip", true), // + CITY("city", true), // + COUNTRY("country_id", true), // + ADDRESS_TYPE("type", true), // + LANGUAGE("lang", true); + + public static final String ODOO_MODEL = "res.partner"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private Partner(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + + } + + public enum Country implements Field { + NAME("name", true), // + CODE("code", true); + + public static final String ODOO_MODEL = "res.country"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private Country(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + + public enum SetupProtocol implements Field { + CUSTOMER("customer_id", true), // + DIFFERENT_LOCATION("different_location_id", true), // + INSTALLER("installer_id", true), // + EDGE("edge_device_id", true); + + public static final String ODOO_MODEL = "edge.setup_protocol"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private SetupProtocol(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + + public enum SetupProtocolProductionLot implements Field { + SETUP_PROTOCOL("setup_protocol_id", true), // + SEQUENCE("sequence", true), // + LOT("lot_id", true); + + public static final String ODOO_MODEL = "edge.setup_protocol_production_lot"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private SetupProtocolProductionLot(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + + public enum SetupProtocolItem implements Field { + SETUP_PROTOCOL("setup_protocol_id", true), // + SEQUENCE("sequence", true); + + public static final String ODOO_MODEL = "edge.setup_protocol_item"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private SetupProtocolItem(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + + public enum StockProductionLot implements Field { + SERIAL_NUMBER("name", true), // + PRODUCT("product_id", true); + public static final String ODOO_MODEL = "stock.production.lot"; + public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); + + private static final class StaticFields { + private static int nextQueryIndex = 1; + } + + private final int queryIndex; + private final String id; + + /** + * Holds information if this Field should be queried from and written to + * Database. + */ + private final boolean query; + + private StockProductionLot(String id, boolean query) { + this.id = id; + this.query = query; + if (query) { + this.queryIndex = StaticFields.nextQueryIndex++; + } else { + this.queryIndex = -1; + } + } + + @Override + public String id() { + return this.id; + } + + @Override + public int index() { + return this.queryIndex; + } + + @Override + public boolean isQuery() { + return this.query; + } + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java index 0d4f2c2415d..e577befe02d 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java @@ -2,6 +2,7 @@ import java.sql.SQLException; import java.util.Collection; +import java.util.Map; import java.util.NavigableMap; import java.util.Optional; import java.util.TreeMap; @@ -24,6 +25,7 @@ import io.openems.backend.common.metadata.Metadata; import io.openems.backend.common.metadata.User; import io.openems.backend.metadata.odoo.odoo.OdooHandler; +import io.openems.backend.metadata.odoo.odoo.OdooUserRole; import io.openems.backend.metadata.odoo.postgres.PostgresHandler; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; @@ -129,6 +131,15 @@ public Optional getEdgeIdForApikey(String apikey) { } } + @Override + public Optional getEdgeBySetupPassword(String setupPassword) { + Optional optEdgeId = this.odooHandler.getEdgeIdBySetupPassword(setupPassword); + if (!optEdgeId.isPresent()) { + return Optional.empty(); + } + return this.getEdge(optEdgeId.get()); + } + @Override public Optional getEdge(String edgeId) { return Optional.ofNullable(this.edgeCache.getEdgeFromEdgeId(edgeId)); @@ -176,4 +187,42 @@ public void logWarn(Logger log, String message) { public void logError(Logger log, String message) { super.logError(log, message); } + + @Override + public void addEdgeToUser(User user, Edge edge) throws OpenemsNamedException { + this.odooHandler.assignEdgeToUser((MyUser) user, (MyEdge) edge, OdooUserRole.INSTALLER); + } + + @Override + public Map getUserInformation(User user) throws OpenemsNamedException { + return this.odooHandler.getUserInformation((MyUser) user); + } + + @Override + public void setUserInformation(User user, JsonObject jsonObject) throws OpenemsNamedException { + this.odooHandler.setUserInformation((MyUser) user, jsonObject); + } + + @Override + public byte[] getSetupProtocol(User user, int setupProtocolId) throws OpenemsNamedException { + return this.odooHandler.getOdooSetupProtocolReport(setupProtocolId); + } + + @Override + public int submitSetupProtocol(User user, JsonObject jsonObject) throws OpenemsNamedException { + return this.odooHandler.submitSetupProtocol((MyUser) user, jsonObject); + } + + @Override + public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { + OdooUserRole role = OdooUserRole.OWNER; + + Optional optRole = JsonUtils.getAsOptionalString(jsonObject, "role"); + if (optRole.isPresent()) { + role = OdooUserRole.getRole(optRole.get()); + } + + this.odooHandler.registerUser(jsonObject, role); + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/Domain.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/Domain.java index 6b5eea5bddb..1a84447b662 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/Domain.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/Domain.java @@ -1,5 +1,7 @@ package io.openems.backend.metadata.odoo.odoo; +import io.openems.backend.metadata.odoo.Field; + public class Domain { protected final String field; protected final String operator; @@ -10,4 +12,8 @@ public Domain(String field, String operator, Object value) { this.operator = operator; this.value = value; } + + public Domain(Field field, String operator, Object value) { + this(field.id(), operator, value); + } } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java index 40701861fb9..088b9809e63 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java @@ -1,5 +1,8 @@ package io.openems.backend.metadata.odoo.odoo; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -10,17 +13,23 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.openems.backend.metadata.odoo.Config; import io.openems.backend.metadata.odoo.Field; +import io.openems.backend.metadata.odoo.Field.Partner; +import io.openems.backend.metadata.odoo.Field.SetupProtocol; +import io.openems.backend.metadata.odoo.Field.SetupProtocolItem; import io.openems.backend.metadata.odoo.MyEdge; +import io.openems.backend.metadata.odoo.MyUser; import io.openems.backend.metadata.odoo.OdooMetadata; -import io.openems.backend.metadata.odoo.odoo.OdooUtils.SuccessResponseAndHeaders; -import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; import io.openems.common.utils.JsonUtils; +import io.openems.common.utils.ObjectUtils; +import io.openems.common.utils.PasswordUtils; public class OdooHandler { @@ -68,6 +77,75 @@ public void addChatterMessage(MyEdge edge, String message) { } } + /** + * Returns Edge by setupPassword, otherwise an empty {@link Optional}. + * + * @param setupPassword to find Edge + * @return Edge or empty {@link Optional} + */ + public Optional getEdgeIdBySetupPassword(String setupPassword) { + Domain filter = new Domain(Field.EdgeDevice.SETUP_PASSWORD, "=", setupPassword); + + try { + int[] search = OdooUtils.search(this.credentials, Field.EdgeDevice.ODOO_MODEL, filter); + if (search.length == 0) { + return Optional.empty(); + } + + Map read = OdooUtils.readOne(this.credentials, Field.EdgeDevice.ODOO_MODEL, search[0], + Field.EdgeDevice.NAME); + + String name = (String) read.get(Field.EdgeDevice.NAME.id()); + if (name == null) { + return Optional.empty(); + } + + return Optional.of(name); + } catch (OpenemsException e) { + this.parent.logInfo(this.log, "Unable to find edge by setup passowrd [" + setupPassword + "]"); + } + + return Optional.empty(); + } + + /** + * Assigns the given user with given {@link OdooUserRole} to the Edge. If Edge + * already assigned to user exit method. + * + * @param user the Odoo user + * @param edge the Odoo edge + * @param userRole the Odoo user role + * @throws OpenemsNamedException on error + */ + public void assignEdgeToUser(MyUser user, MyEdge edge, OdooUserRole userRole) throws OpenemsNamedException { + this.assignEdgeToUser(user.getOdooId(), edge.getOdooId(), userRole); + this.parent.authenticate(user.getToken()); + } + + /** + * Assigns the given user with given {@link OdooUserRole} to the Edge. If Edge + * already assigned to user exit method. + * + * @param userId the Odoo user id + * @param edgeId the Odoo edge + * @param userRole the Odoo user role + * @throws OpenemsException on error + */ + private void assignEdgeToUser(int userId, int edgeId, OdooUserRole userRole) throws OpenemsException { + int[] found = OdooUtils.search(this.credentials, Field.EdgeDeviceUserRole.ODOO_MODEL, + new Domain(Field.EdgeDeviceUserRole.USER_ID, "=", userId), + new Domain(Field.EdgeDeviceUserRole.DEVICE_ID, "=", edgeId)); + + if (found.length > 0) { + return; + } + + OdooUtils.create(this.credentials, Field.EdgeDeviceUserRole.ODOO_MODEL, // + new FieldValue(Field.EdgeDeviceUserRole.USER_ID, userId), // + new FieldValue(Field.EdgeDeviceUserRole.DEVICE_ID, edgeId), // + new FieldValue(Field.EdgeDeviceUserRole.ROLE, userRole.getOdooRole())); + } + /** * Authenticates a user using Username and Password. * @@ -77,23 +155,7 @@ public void addChatterMessage(MyEdge edge, String message) { * @throws OpenemsNamedException on login error */ public String authenticate(String username, String password) throws OpenemsNamedException { - JsonObject request = JsonUtils.buildJsonObject() // - .addProperty("jsonrpc", "2.0") // - .addProperty("method", "call") // - .add("params", JsonUtils.buildJsonObject() // - .addProperty("db", "v12") // - .addProperty("login", username) // - .addProperty("password", password) // - .build()) // - .build(); - SuccessResponseAndHeaders response = OdooUtils - .sendJsonrpcRequest(this.credentials.getUrl() + "/web/session/authenticate", request); - Optional sessionId = getFieldFromSetCookieHeader(response.headers, "session_id"); - if (!sessionId.isPresent()) { - throw OpenemsError.COMMON_AUTHENTICATION_FAILED.exception(); - } else { - return sessionId.get(); - } + return OdooUtils.login(this.credentials, username, password); } /** @@ -154,4 +216,527 @@ public static Optional getFieldFromSetCookieHeader(Map getUserInformation(MyUser user) throws OpenemsNamedException { + int partnerId = this.getOdooPartnerId(user); + + Map odooPartner = OdooUtils.readOne(this.credentials, Field.Partner.ODOO_MODEL, partnerId, + Field.Partner.FIRSTNAME, // + Field.Partner.LASTNAME, // + Field.Partner.EMAIL, // + Field.Partner.PHONE, // + Field.Partner.STREET, // + Field.Partner.ZIP, // + Field.Partner.CITY, // + Field.Partner.COUNTRY, // + Field.Partner.COMPANY_NAME); + + Object[] odooCountryId = ObjectUtils.getAsObjectArrray(odooPartner.get("country_id")); + if (odooCountryId.length > 1) { + Map countryCode = OdooUtils.readOne(this.credentials, Field.Country.ODOO_MODEL, + (Integer) odooCountryId[0], Field.Country.CODE); + + Optional optCode = ObjectUtils.getAsOptionalString(countryCode.get("code")); + if (optCode.isPresent()) { + Object[] countryElement = Arrays.copyOf(odooCountryId, odooCountryId.length + 1); + countryElement[2] = countryCode.get("code"); + + odooPartner.put("country_id", countryElement); + } + } + + return odooPartner; + } + + /** + * Update the given {@link MyUser} with information from {@link JsonObject}. + * + * @param user the {@link MyUser} to update + * @param userJson the {@link JsonObject} information to update + * @throws OpenemsException on error + */ + public void setUserInformation(MyUser user, JsonObject userJson) throws OpenemsNamedException { + Map fieldValues = new HashMap<>(); + fieldValues.putAll(this.updateAddress(userJson)); + fieldValues.putAll(this.updateCompany(user, userJson)); + + JsonUtils.getAsOptionalString(userJson, "firstname") // + .ifPresent(firstname -> fieldValues.put(Field.Partner.FIRSTNAME.id(), firstname)); + JsonUtils.getAsOptionalString(userJson, "lastname") // + .ifPresent(lastname -> fieldValues.put(Field.Partner.LASTNAME.id(), lastname)); + JsonUtils.getAsOptionalString(userJson, "email") // + .ifPresent(email -> fieldValues.put(Field.Partner.EMAIL.id(), email)); + JsonUtils.getAsOptionalString(userJson, "phone") // + .ifPresent(phone -> fieldValues.put(Field.Partner.PHONE.id(), phone)); + + int odooPartnerId = this.getOdooPartnerId(user.getOdooId()); + OdooUtils.write(this.credentials, Field.Partner.ODOO_MODEL, new Integer[] { odooPartnerId }, fieldValues); + } + + /** + * Get address to update for an Odoo user. + * + * @param addressJson {@link JsonObject} to get the fields to update + * @return Fields to update + * @throws OpenemsException on error + */ + private Map updateAddress(JsonObject addressJson) throws OpenemsException { + Optional optAddress = JsonUtils.getAsOptionalJsonObject(addressJson, "address"); + if (!optAddress.isPresent()) { + return new HashMap<>(); + } + JsonObject address = optAddress.get(); + + Map addressFields = new HashMap<>(); + addressFields.put("type", "private"); + JsonUtils.getAsOptionalString(address, "street") // + .ifPresent(street -> addressFields.put(Field.Partner.STREET.id(), street)); + JsonUtils.getAsOptionalString(address, "zip") // + .ifPresent(zip -> addressFields.put(Field.Partner.ZIP.id(), zip)); + JsonUtils.getAsOptionalString(address, "city") // + .ifPresent(city -> addressFields.put(Field.Partner.CITY.id(), city)); + + Optional optCountryCode = JsonUtils.getAsOptionalString(address, "country"); + if (optCountryCode.isPresent()) { + String countryCode = optCountryCode.get().toUpperCase(); + + int[] countryFound = OdooUtils.search(this.credentials, Field.Country.ODOO_MODEL, // + new Domain(Field.Country.CODE, "=", countryCode)); + if (countryFound.length == 1) { + addressFields.put(Field.Partner.COUNTRY.id(), countryFound[0]); + } else { + this.log.info("Country with code [" + countryCode + "] not found"); + } + } + + return addressFields; + } + + /** + * Get company to update for an Odoo user. Checks if the given company exits in + * Odoo and assign the company to the Odoo user. Otherwise a new company will be + * created in Odoo. + * + * @param companyJson {@link JsonObject} to get the fields to update + * @return Fields to update + * @throws OpenemsException on error + */ + private Map updateCompany(JsonObject companyJson) throws OpenemsException { + return this.updateCompany(null, companyJson); + } + + /** + * Get company to update for an Odoo user. If given user is not null, check the + * users company with the new company name for equality. Both are equal nothing + * to update. Otherwise the new company will be assigned to the user or the new + * company will be created in Odoo. + * + * @param user {@link MyUser} to check company name + * @param companyJson {@link JsonObject} to get the fields to update + * @return Fields to update + * @throws OpenemsException on error + */ + private Map updateCompany(MyUser user, JsonObject companyJson) throws OpenemsException { + Optional optCompany = JsonUtils.getAsOptionalJsonObject(companyJson, "company"); + if (!optCompany.isPresent()) { + return new HashMap<>(); + } + Optional optCompanyName = JsonUtils.getAsOptionalString(optCompany.get(), "name"); + if (!optCompanyName.isPresent()) { + return new HashMap<>(); + } + String jsonCompanyName = optCompanyName.get(); + + if (user != null) { + Map odooPartner = OdooUtils.readOne(this.credentials, Field.Partner.ODOO_MODEL, // + this.getOdooPartnerId(user.getOdooId()), // + Field.Partner.COMPANY_NAME); + + Optional optPartnerCompanyName = ObjectUtils + .getAsOptionalString(odooPartner.get(Field.Partner.COMPANY_NAME.id())); + if (optPartnerCompanyName.isPresent()) { + if (jsonCompanyName.equals(optPartnerCompanyName.get())) { + return new HashMap<>(); + } + } + } + + int[] companyFound = OdooUtils.search(this.credentials, Field.Partner.ODOO_MODEL, // + new Domain(Field.Partner.IS_COMPANY, "=", true), + new Domain(Field.Partner.COMPANY_NAME, "=", jsonCompanyName)); + + Map companyFields = new HashMap<>(); + if (companyFound.length > 0) { + companyFields.put(Field.Partner.PARENT.id(), companyFound[0]); + } else { + int createdCompany = OdooUtils.create(this.credentials, Field.Partner.ODOO_MODEL, // + new FieldValue<>(Field.Partner.IS_COMPANY, true), + new FieldValue<>(Field.Partner.NAME, jsonCompanyName)); + companyFields.put(Field.Partner.PARENT.id(), createdCompany); + } + + return companyFields; + } + + /** + * Returns the Odoo report for a setup protocol. + * + * @param setupProtocolId the Odoo setup protocol id + * @return report as a byte array + * @throws OpenemsNamedException on error + */ + public byte[] getOdooSetupProtocolReport(int setupProtocolId) throws OpenemsNamedException { + return OdooUtils.getOdooReport(this.credentials, "edge.report_edge_setup_protocol_template", setupProtocolId); + } + + /** + * Save the Setup Protocol to Odoo. + * + * @param user {@link MyUser} current user + * @param setupProtocolJson {@link SetupProtocol} the setup protocol + * @return the Setup Protocol ID + * @throws OpenemsNamedException on error + */ + public int submitSetupProtocol(MyUser user, JsonObject setupProtocolJson) throws OpenemsNamedException { + JsonObject userJson = JsonUtils.getAsJsonObject(setupProtocolJson, "customer"); + JsonObject edgeJson = JsonUtils.getAsJsonObject(setupProtocolJson, "edge"); + + String edgeId = JsonUtils.getAsString(edgeJson, "id"); + int[] foundEdge = OdooUtils.search(this.credentials, Field.EdgeDevice.ODOO_MODEL, + new Domain(Field.EdgeDevice.NAME, "=", edgeId)); + if (foundEdge.length != 1) { + throw new OpenemsException("Edge not found for id [" + edgeId + "]"); + } + + String password = PasswordUtils.generateRandomPassword(24); + int odooUserId = this.createOdooUser(userJson, password); + + int customerId = this.getOdooPartnerId(odooUserId); + int installerId = this.getOdooPartnerId(user); + this.assignEdgeToUser(odooUserId, foundEdge[0], OdooUserRole.OWNER); + + int protocolId = this.createSetupProtocol(setupProtocolJson, foundEdge[0], customerId, installerId); + + try { + this.sendSetupProtocolMail(user, protocolId, edgeId); + } catch (OpenemsNamedException ex) { + this.log.warn("Unable to send email", ex); + } + + return protocolId; + } + + /** + * Call Odoo api to send mail via Odoo. + * + * @param user the Odoo user + * @param protocolId the Odoo setup protocol id + * @param edgeId the Odoo edge + * @throws OpenemsNamedException on error + */ + private void sendSetupProtocolMail(MyUser user, int protocolId, String edgeId) throws OpenemsNamedException { + OdooUtils.sendAdminJsonrpcRequest(this.credentials, "/openems_backend/sendSetupProtocolEmail", + JsonUtils.buildJsonObject() // + .add("params", JsonUtils.buildJsonObject() // + .addProperty("setupProtocolId", protocolId) // + .addProperty("edgeId", edgeId) // + .build()) // + .build()); + } + + /** + * Create an Odoo user and return thats id. If user already exists the user will + * be updated and return the user id. + * + * @param userJson the {@link Partner} to create user + * @param password the password to set for the new user + * @return the Odoo user id + * @throws OpenemsNamedException on error + */ + private int createOdooUser(JsonObject userJson, String password) throws OpenemsNamedException { + Map customerFields = new HashMap<>(); + customerFields.putAll(this.updateAddress(userJson)); + customerFields.putAll(this.updateCompany(userJson)); + + JsonUtils.getAsOptionalString(userJson, "firstname") // + .ifPresent(firstname -> customerFields.put(Field.Partner.FIRSTNAME.id(), firstname)); + JsonUtils.getAsOptionalString(userJson, "lastname") // + .ifPresent(lastname -> customerFields.put(Field.Partner.LASTNAME.id(), lastname)); + + String email = JsonUtils.getAsString(userJson, "email"); + JsonUtils.getAsOptionalString(userJson, "email") // + .ifPresent(mail -> customerFields.put(Field.Partner.EMAIL.id(), mail)); + JsonUtils.getAsOptionalString(userJson, "phone") // + .ifPresent(phone -> customerFields.put(Field.Partner.PHONE.id(), phone)); + + int[] userFound = OdooUtils.search(this.credentials, Field.User.ODOO_MODEL, + new Domain(Field.User.LOGIN, "=", email)); + + if (userFound.length == 1) { + int userId = userFound[0]; + OdooUtils.write(this.credentials, Field.User.ODOO_MODEL, new Integer[] { userId }, customerFields); + return userId; + } else { + customerFields.put(Field.User.LOGIN.id(), email); + customerFields.put(Field.User.PASSWORD.id(), password); + customerFields.put(Field.User.GLOBAL_ROLE.id(), OdooUserRole.OWNER.getOdooRole()); + customerFields.put(Field.User.GROUPS.id(), OdooUserRole.OWNER.toOdooIds()); + int createdUserId = OdooUtils.create(this.credentials, Field.User.ODOO_MODEL, customerFields); + + this.sendRegistrationMail(createdUserId, password); + return createdUserId; + } + } + + /** + * Create a setup protocol in Odoo. + * + * @param jsonObject {@link SetupProtocol} to create + * @param edgeId the Edge-ID + * @param customerId Odoo customer id to set + * @param installerId Odoo installer id to set + * @return the Odoo id of created setup protocol + * @throws OpenemsException on error + */ + private int createSetupProtocol(JsonObject jsonObject, int edgeId, int customerId, int installerId) + throws OpenemsException { + Integer locationId = null; + + Optional jsonLocation = JsonUtils.getAsOptionalJsonObject(jsonObject, "location"); + if (jsonLocation.isPresent()) { + JsonObject location = jsonLocation.get(); + + Map locationFields = new HashMap<>(); + locationFields.putAll(this.updateAddress(location)); + locationFields.putAll(this.updateCompany(location)); + + JsonUtils.getAsOptionalString(location, "firstname") // + .ifPresent(firstname -> locationFields.put(Field.Partner.FIRSTNAME.id(), firstname)); + JsonUtils.getAsOptionalString(location, "lastname") // + .ifPresent(lastname -> locationFields.put(Field.Partner.LASTNAME.id(), lastname)); + JsonUtils.getAsOptionalString(location, "email") // + .ifPresent(mail -> locationFields.put(Field.Partner.EMAIL.id(), mail)); + JsonUtils.getAsOptionalString(location, "phone") // + .ifPresent(phone -> locationFields.put(Field.Partner.PHONE.id(), phone)); + + locationId = OdooUtils.create(this.credentials, Field.Partner.ODOO_MODEL, locationFields); + } + + Map setupProtocolFields = new HashMap<>(); + setupProtocolFields.put(Field.SetupProtocol.CUSTOMER.id(), customerId); + setupProtocolFields.put(Field.SetupProtocol.DIFFERENT_LOCATION.id(), locationId); + setupProtocolFields.put(Field.SetupProtocol.INSTALLER.id(), installerId); + setupProtocolFields.put(Field.SetupProtocol.EDGE.id(), edgeId); + + int setupProtocolId = OdooUtils.create(this.credentials, Field.SetupProtocol.ODOO_MODEL, setupProtocolFields); + + Optional lots = JsonUtils.getAsOptionalJsonArray(jsonObject, "lots"); + if (lots.isPresent()) { + this.createSetupProtocolProductionLots(setupProtocolId, lots.get()); + } + Optional items = JsonUtils.getAsOptionalJsonArray(jsonObject, "items"); + if (items.isPresent()) { + this.createSetupProtocolItems(setupProtocolId, items.get()); + } + + return setupProtocolId; + } + + /** + * Create production lots for the given setup protocol id. + * + * @param setupProtocolId assign to the lots + * @param lots list of setup protocol production lots to create + * @throws OpenemsException on error + */ + private void createSetupProtocolProductionLots(int setupProtocolId, JsonArray lots) throws OpenemsException { + List serialNumbersNotFound = new ArrayList<>(); + for (int i = 0; i < lots.size(); i++) { + JsonElement lot = lots.get(i); + + Map lotFields = new HashMap<>(); + lotFields.put(Field.SetupProtocolProductionLot.SETUP_PROTOCOL.id(), setupProtocolId); + lotFields.put(Field.SetupProtocolProductionLot.SEQUENCE.id(), i); + + JsonUtils.getAsOptionalString(lot, "category") // + .ifPresent(category -> lotFields.put("category", category)); + JsonUtils.getAsOptionalString(lot, "name") // + .ifPresent(name -> lotFields.put("name", name)); + + Optional optSerialNumber = JsonUtils.getAsOptionalString(lot, "serialNumber"); + if (optSerialNumber.isPresent()) { + int[] lotId = OdooUtils.search(this.credentials, Field.StockProductionLot.ODOO_MODEL, // + new Domain(Field.StockProductionLot.SERIAL_NUMBER, "=", optSerialNumber.get())); + + if (lotId.length > 0) { + lotFields.put(Field.SetupProtocolProductionLot.LOT.id(), lotId[0]); + OdooUtils.create(this.credentials, Field.SetupProtocolProductionLot.ODOO_MODEL, lotFields); + } else { + serialNumbersNotFound.add(lot); + } + } + + } + + this.createNotFoundSerialNumbers(setupProtocolId, serialNumbersNotFound); + } + + /** + * Create for the given serial numbers that were not found a + * {@link SetupProtocolItem}. + * + * @param setupProtocolId the protocol id + * @param serialNumbers not found serial numbers + * @throws OpenemsException on error + */ + private void createNotFoundSerialNumbers(int setupProtocolId, List serialNumbers) + throws OpenemsException { + for (int i = 0; i < serialNumbers.size(); i++) { + Map setupProtocolItem = new HashMap<>(); + setupProtocolItem.put(Field.SetupProtocolItem.SETUP_PROTOCOL.id(), setupProtocolId); + setupProtocolItem.put(Field.SetupProtocolItem.SEQUENCE.id(), i); + setupProtocolItem.put("category", "Seriennummern wurden im System nicht gefunden"); + + JsonElement item = serialNumbers.get(i); + JsonUtils.getAsOptionalString(item, "name") // + .ifPresent(name -> setupProtocolItem.put("name", name)); + JsonUtils.getAsOptionalString(item, "serialNumber") // + .ifPresent(serialNumber -> setupProtocolItem.put("value", serialNumber)); + + OdooUtils.create(this.credentials, Field.SetupProtocolItem.ODOO_MODEL, setupProtocolItem); + } + } + + /** + * Create items for the given setup protocol id. + * + * @param setupProtocolId assign to the items + * @param items list of setup protocol items to create + * @throws OpenemsException on error + */ + private void createSetupProtocolItems(int setupProtocolId, JsonArray items) throws OpenemsException { + for (int i = 0; i < items.size(); i++) { + JsonElement item = items.get(i); + + Map setupProtocolItem = new HashMap<>(); + setupProtocolItem.put(Field.SetupProtocolItem.SETUP_PROTOCOL.id(), setupProtocolId); + setupProtocolItem.put(Field.SetupProtocolItem.SEQUENCE.id(), i); + + JsonUtils.getAsOptionalString(item, "category") // + .ifPresent(category -> setupProtocolItem.put("category", category)); + JsonUtils.getAsOptionalString(item, "name") // + .ifPresent(name -> setupProtocolItem.put("name", name)); + JsonUtils.getAsOptionalString(item, "value") // + .ifPresent(value -> setupProtocolItem.put("value", value)); + + OdooUtils.create(this.credentials, Field.SetupProtocolItem.ODOO_MODEL, setupProtocolItem); + } + } + + /** + * Gets the referenced Odoo partner id for an Odoo user. + * + * @param user the Odoo user + * @return the Odoo partner id + * @throws OpenemsException on error + */ + private int getOdooPartnerId(MyUser user) throws OpenemsException { + return this.getOdooPartnerId(user.getOdooId()); + } + + /** + * Gets the referenced Odoo partner id for an Odoo user id. + * + * @param odooUserId of the Odoo user + * @return the Odoo partner id + * @throws OpenemsException on error + */ + private int getOdooPartnerId(int odooUserId) throws OpenemsException { + Map odooUser = OdooUtils.readOne(this.credentials, Field.User.ODOO_MODEL, odooUserId, + Field.User.PARTNER); + + Optional odooPartnerId = OdooUtils.getOdooRefernceId(odooUser.get(Field.User.PARTNER.id())); + + if (!odooPartnerId.isPresent()) { + throw new OpenemsException("Odoo partner not found for user ['" + odooUserId + "']"); + } + + return odooPartnerId.get(); + } + + /** + * Register an user in Odoo with the given {@link OdooUserRole}. + * + * @param jsonObject {@link JsonObject} that represents an user + * @param role {@link OdooUserRole} to set for the user + * @throws OpenemsNamedException on error + */ + public void registerUser(JsonObject jsonObject, OdooUserRole role) throws OpenemsNamedException { + Optional optEmail = JsonUtils.getAsOptionalString(jsonObject, "email"); + if (!optEmail.isPresent()) { + throw new OpenemsException("No email specified"); + } + String email = optEmail.get(); + + int[] userFound = OdooUtils.search(this.credentials, Field.User.ODOO_MODEL, // + new Domain(Field.User.LOGIN, "=", email)); + if (userFound.length > 0) { + throw new OpenemsException("User already exists with email [" + email + "]"); + } + + Map userFields = new HashMap<>(); + userFields.put(Field.User.LOGIN.id(), email); + userFields.put(Field.Partner.EMAIL.id(), email); + userFields.put(Field.User.GLOBAL_ROLE.id(), role.getOdooRole()); + userFields.put(Field.User.GROUPS.id(), role.toOdooIds()); + userFields.putAll(this.updateAddress(jsonObject)); + userFields.putAll(this.updateCompany(jsonObject)); + + JsonUtils.getAsOptionalString(jsonObject, "firstname") // + .ifPresent(firstname -> userFields.put("firstname", firstname)); + JsonUtils.getAsOptionalString(jsonObject, "lastname") // + .ifPresent(lastname -> userFields.put("lastname", lastname)); + JsonUtils.getAsOptionalString(jsonObject, "phone") // + .ifPresent(phone -> userFields.put("phone", phone)); + JsonUtils.getAsOptionalString(jsonObject, "password") // + .ifPresent(password -> userFields.put("password", password)); + + int createdUserId = OdooUtils.create(this.credentials, Field.User.ODOO_MODEL, userFields); + this.sendRegistrationMail(createdUserId); + } + + /** + * Call Odoo api to send registration mail via Odoo. + * + * @param odooUserId Odoo user id to send the mail + * @throws OpenemsNamedException error + */ + private void sendRegistrationMail(int odooUserId) throws OpenemsNamedException { + this.sendRegistrationMail(odooUserId, null); + } + + /** + * Call Odoo api to send registration mail via Odoo. + * + * @param odooUserId Odoo user id to send the mail + * @param password password for the user + * @throws OpenemsNamedException error + */ + private void sendRegistrationMail(int odooUserId, String password) throws OpenemsNamedException { + OdooUtils.sendAdminJsonrpcRequest(this.credentials, "/openems_backend/sendRegistrationEmail", + JsonUtils.buildJsonObject() // + .add("params", JsonUtils.buildJsonObject() // + .addProperty("userId", odooUserId) // + .addProperty("password", password) // + .build()) // + .build()); + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserGroup.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserGroup.java new file mode 100644 index 00000000000..70ae323bce9 --- /dev/null +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserGroup.java @@ -0,0 +1,18 @@ +package io.openems.backend.metadata.odoo.odoo; + +public enum OdooUserGroup { + + // XXX PORTAL id might differ between different Odoo databases + PORTAL(65); + + private final int groupId; + + private OdooUserGroup(int groupId) { + this.groupId = groupId; + } + + public int getGroupId() { + return this.groupId; + } + +} diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserRole.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserRole.java new file mode 100644 index 00000000000..dc683d84f1c --- /dev/null +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUserRole.java @@ -0,0 +1,74 @@ +package io.openems.backend.metadata.odoo.odoo; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import io.openems.common.exceptions.OpenemsException; + +public enum OdooUserRole { + + ADMIN("admin"), // + INSTALLER("installer", OdooUserGroup.PORTAL), // + OWNER("owner", OdooUserGroup.PORTAL), // + GUEST("guest"); + + private final String odooRole; + private final OdooUserGroup[] odooGroups; + + OdooUserRole(String odooRole, OdooUserGroup... odooGroups) { + this.odooRole = odooRole; + this.odooGroups = odooGroups; + } + + /** + * Get the Odoo role. + * + * @return Odoo role + */ + public String getOdooRole() { + return this.odooRole; + } + + /** + * Get the specified Odoo groups for the role. + * + * @return Groups for an Odoo role + */ + public OdooUserGroup[] getOdooGroups() { + return this.odooGroups; + } + + /** + * Transform the specified Odoo group objects to a list of IDs. + * + * @return The Odoo groups as a list of IDs. + */ + public List toOdooIds() { + return Arrays.stream(this.odooGroups) // + .map(OdooUserGroup::getGroupId) // + .collect(Collectors.toList()); + } + + /** + * Get the {@link OdooUserRole} for the given role as {@link String}. + * + * @param role as {@link String} to parse + * @return The Odoo role + * @throws OpenemsException if role does not exist + */ + public static OdooUserRole getRole(String role) throws OpenemsException { + role = role.toLowerCase(); + + if (role.equals("admin")) { + return OdooUserRole.ADMIN; + } else if (role.equals("installer")) { + return OdooUserRole.INSTALLER; + } else if (role.equals("owner")) { + return OdooUserRole.OWNER; + } else { + throw new OpenemsException("Role [" + role + "] does not exist"); + } + } + +} diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUtils.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUtils.java index 1d99aba4e55..8c96c4703f7 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUtils.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooUtils.java @@ -11,11 +11,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; +import com.google.common.io.ByteStreams; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -165,6 +167,50 @@ public static SuccessResponseAndHeaders sendJsonrpcRequest(String url, String co } } + /** + * Sends a request with admin privileges. + * + * @param credentials the Odoo credentials + * @param url to send the request + * @param request to send + * @throws OpenemsNamedException on error + */ + protected static void sendAdminJsonrpcRequest(Credentials credentials, String url, JsonObject request) + throws OpenemsNamedException { + String session = login(credentials, "admin", credentials.getPassword()); + sendJsonrpcRequest(credentials.getUrl() + url, "session_id=" + session, request); + } + + /** + * Authenticates a user using Username and Password. + * + * @param credentials used to get Odoo url + * @param username the Username + * @param password the Password + * @return the session_id + * @throws OpenemsNamedException on login error + */ + protected static String login(Credentials credentials, String username, String password) + throws OpenemsNamedException { + JsonObject request = JsonUtils.buildJsonObject() // + .addProperty("jsonrpc", "2.0") // + .addProperty("method", "call") // + .add("params", JsonUtils.buildJsonObject() // + .addProperty("db", "v12") // + .addProperty("login", username) // + .addProperty("password", password) // + .build()) // + .build(); + SuccessResponseAndHeaders response = OdooUtils + .sendJsonrpcRequest(credentials.getUrl() + "/web/session/authenticate", request); + Optional sessionId = OdooHandler.getFieldFromSetCookieHeader(response.headers, "session_id"); + if (!sessionId.isPresent()) { + throw OpenemsError.COMMON_AUTHENTICATION_FAILED.exception(); + } else { + return sessionId.get(); + } + } + private static Object executeKw(String url, Object[] params) throws XmlRpcException, MalformedURLException { final XmlRpcClient client = new XmlRpcClient(); XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); @@ -422,6 +468,53 @@ protected static void addChatterMessage(Credentials credentials, String model, i } } + /** + * Create a record in Odoo. + * + * @param credentials the Odoo credentials + * @param model the Oddo model + * @param fieldValues fields and values that should be written + * @return Odoo id of created record + * @throws OpenemsException on error + */ + protected static int create(Credentials credentials, String model, FieldValue... fieldValues) + throws OpenemsException { + Map paramsFieldValues = new HashMap<>(); + for (FieldValue fieldValue : fieldValues) { + paramsFieldValues.put(fieldValue.getField().id(), fieldValue.getValue()); + } + + return create(credentials, model, paramsFieldValues); + } + + /** + * Create a record in Odoo. + * + * @param credentials the Odoo credentials + * @param model the Oddo model + * @param fieldValues fields and values that should be written + * @return Odoo id of created record + * @throws OpenemsException on error + */ + protected static int create(Credentials credentials, String model, Map fieldValues) + throws OpenemsException { + String action = "create"; + + Object[] params = new Object[] { credentials.getDatabase(), credentials.getUid(), credentials.getPassword(), + model, action, new Object[] { fieldValues } }; + + try { + Object resultObj = (Object) executeKw(credentials.getUrl(), params); + if (resultObj == null) { + throw new OpenemsException("Not created."); + } + + return OdooUtils.getAsInteger(resultObj); + } catch (Throwable e) { + throw new OpenemsException("Unable to write to Odoo: " + e.getMessage()); + } + } + /** * Update a record in Odoo. * @@ -444,16 +537,32 @@ public static void write(Credentials credentials, String model, Integer[] ids, F // } // System.out.println(b.toString()); - // Create request params - String action = "write"; // Add fieldValues Map paramsFieldValues = new HashMap<>(); for (FieldValue fieldValue : fieldValues) { paramsFieldValues.put(fieldValue.getField().id(), fieldValue.getValue()); } + + write(credentials, model, ids, paramsFieldValues); + } + + /** + * Update a record in Odoo. + * + * @param credentials the Odoo credentials + * @param model the Odoo model + * @param ids ids of model to update + * @param fieldValues fields and values that should be written + * @throws OpenemsException on error + */ + protected static void write(Credentials credentials, String model, Integer[] ids, Map fieldValues) + throws OpenemsException { + // Create request params + String action = "write"; + // Create request params Object[] params = new Object[] { credentials.getDatabase(), credentials.getUid(), credentials.getPassword(), - model, action, new Object[] { ids, paramsFieldValues } }; + model, action, new Object[] { ids, fieldValues } }; try { // Execute XML request Boolean resultObj = (Boolean) executeKw(credentials.getUrl(), params); @@ -492,4 +601,58 @@ protected static Integer getAsInteger(Object object) { return null; } } + + /** + * Return the odoo reference id as a {@link Integer}, otherwise empty + * {@link Optional}. + * + * @param object the odoo reference to extract + * @return the odoo reference id or empty {@link Optional} + */ + protected static Optional getOdooRefernceId(Object object) { + if (object != null && object instanceof Object[]) { + Object[] odooRefernce = (Object[]) object; + + if (odooRefernce[0] != null && odooRefernce[0] instanceof Integer) { + return Optional.of((Integer) odooRefernce[0]); + } + } + + return Optional.empty(); + } + + /** + * Returns a Odoo report as a byte array. Search for the given template id in + * combination with the concrete report id. + * + * @param credentials the Odoo credentialss + * @param report the Odoo template id + * @param id the Odoo report id + * @return the Odoo report as a byte array + * @throws OpenemsNamedException on error + */ + protected static byte[] getOdooReport(Credentials credentials, String report, int id) + throws OpenemsNamedException { + String session = login(credentials, "admin", credentials.getPassword()); + + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) new URL( + credentials.getUrl() + "/report/pdf/" + report + "/" + id + "?session_id=" + session) + .openConnection(); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setRequestMethod("GET"); + connection.setDoOutput(true); + + return ByteStreams.toByteArray(connection.getInputStream()); + } catch (Exception e) { + throw OpenemsError.GENERIC.exception(e.getMessage()); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + } diff --git a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java index 24d66640ebd..5cc4b44232e 100644 --- a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java +++ b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java @@ -1,5 +1,6 @@ package io.openems.backend.uiwebsocket.impl; +import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -8,6 +9,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; + +import io.openems.backend.common.jsonrpc.request.AddEdgeToUserRequest; +import io.openems.backend.common.jsonrpc.request.GetSetupProtocolRequest; +import io.openems.backend.common.jsonrpc.request.GetUserInformationRequest; +import io.openems.backend.common.jsonrpc.request.RegisterUserRequest; +import io.openems.backend.common.jsonrpc.request.SetUserInformationRequest; +import io.openems.backend.common.jsonrpc.request.SubmitSetupProtocolRequest; +import io.openems.backend.common.jsonrpc.response.AddEdgeToUserResponse; +import io.openems.backend.common.jsonrpc.response.GetUserInformationResponse; +import io.openems.backend.common.metadata.Edge; import io.openems.backend.common.metadata.User; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; @@ -21,8 +33,10 @@ import io.openems.common.jsonrpc.request.SubscribeChannelsRequest; import io.openems.common.jsonrpc.request.SubscribeSystemLogRequest; import io.openems.common.jsonrpc.response.AuthenticateResponse; +import io.openems.common.jsonrpc.response.Base64PayloadResponse; import io.openems.common.jsonrpc.response.EdgeRpcResponse; import io.openems.common.session.Role; +import io.openems.common.utils.JsonUtils; public class OnRequest implements io.openems.common.websocket.OnRequest { @@ -46,6 +60,9 @@ public CompletableFuture run(WebSocket ws, Jso case AuthenticateWithPasswordRequest.METHOD: return this.handleAuthenticateWithPasswordRequest(wsData, AuthenticateWithPasswordRequest.from(request)); + + case RegisterUserRequest.METHOD: + return this.handleRegisterUserReuqest(wsData, RegisterUserRequest.from(request)); } // should be authenticated @@ -55,10 +72,24 @@ public CompletableFuture run(WebSocket ws, Jso case LogoutRequest.METHOD: result = this.handleLogoutRequest(wsData, user, LogoutRequest.from(request)); break; - case EdgeRpcRequest.METHOD: result = this.handleEdgeRpcRequest(wsData, user, EdgeRpcRequest.from(request)); break; + case AddEdgeToUserRequest.METHOD: + result = this.handleAddEdgeToUserRequest(user, AddEdgeToUserRequest.from(request)); + break; + case GetUserInformationRequest.METHOD: + result = this.handleGetUserInformationRequest(user, GetUserInformationRequest.from(request)); + break; + case SetUserInformationRequest.METHOD: + result = this.handleSetUserInformationRequest(user, SetUserInformationRequest.from(request)); + break; + case GetSetupProtocolRequest.METHOD: + result = this.handleGetSetupProtocolRequest(user, GetSetupProtocolRequest.from(request)); + break; + case SubmitSetupProtocolRequest.METHOD: + result = this.handleSubmitSetupProtocolRequest(user, SubmitSetupProtocolRequest.from(request)); + break; } if (result != null) { @@ -123,6 +154,21 @@ private CompletableFuture handleAuthentication(WsData ws User.generateEdgeMetadatas(user, this.parent.metadata))); } + /** + * Handles a {@link RegisterUserRequest}. + * + * @param wsData the WebSocket attachment + * @param request the {@link RegisterUserRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleRegisterUserReuqest(WsData wsData, + RegisterUserRequest request) throws OpenemsNamedException { + this.parent.metadata.registerUser(request.getJsonObject()); + + return CompletableFuture.completedFuture(new GenericJsonrpcResponseSuccess(request.getId())); + } + /** * Handles a {@link LogoutRequest}. * @@ -163,7 +209,7 @@ private User assertUser(WsData wsData, JsonrpcRequest request) throws OpenemsNam } /** - * Handles an EdgeRpcRequest. + * Handles an {@link EdgeRpcRequest}. * * @param wsData the WebSocket attachment * @param user the authenticated {@link User} @@ -211,7 +257,7 @@ private CompletableFuture handleEdgeRpcRequest(WsData wsData, U } /** - * Handles a SubscribeChannelsRequest. + * Handles a {@link SubscribeChannelsRequest}. * * @param wsData the WebSocket attachment * @param edgeId the Edge-ID @@ -249,4 +295,83 @@ private CompletableFuture handleSubscribeSystemLogReques return this.parent.edgeWebsocket.handleSubscribeSystemLogRequest(edgeId, user, token, request); } + /** + * Handles an {@link AddEdgeToUserRequest}. + * + * @param user the {@link User} + * @param request the {@link AddEdgeToUserRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleAddEdgeToUserRequest(User user, AddEdgeToUserRequest request) + throws OpenemsNamedException { + Edge edge = this.parent.metadata.addEdgeToUser(user, request.getSetupPassword()); + + return CompletableFuture.completedFuture(new AddEdgeToUserResponse(request.getId(), edge)); + } + + /** + * Handles a {@link GetUserInformationRequest}. + * + * @param user the {@link User} + * @param request the {@link GetUserInformationRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleGetUserInformationRequest(User user, + GetUserInformationRequest request) throws OpenemsNamedException { + Map userInformation = this.parent.metadata.getUserInformation(user); + + return CompletableFuture.completedFuture(new GetUserInformationResponse(request.getId(), userInformation)); + } + + /** + * Handles a {@link SetUserInformationRequest}. + * + * @param user the {@link User}r + * @param request the {@link SetUserInformationRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleSetUserInformationRequest(User user, + SetUserInformationRequest request) throws OpenemsNamedException { + this.parent.metadata.setUserInformation(user, request.getJsonObject()); + + return CompletableFuture.completedFuture(new GenericJsonrpcResponseSuccess(request.getId())); + } + + /** + * Handles a {@link SubmitSetupProtocolRequest}. + * + * @param user the {@link User}r + * @param request the {@link SubmitSetupProtocolRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleSubmitSetupProtocolRequest(User user, + SubmitSetupProtocolRequest request) throws OpenemsNamedException { + int protocolId = this.parent.metadata.submitSetupProtocol(user, request.getJsonObject()); + + JsonObject response = JsonUtils.buildJsonObject() // + .addProperty("setupProtocolId", protocolId) // + .build(); + + return CompletableFuture.completedFuture(new GenericJsonrpcResponseSuccess(request.getId(), response)); + } + + /** + * Handles a {@link GetSetupProtocolRequest}. + * + * @param user the {@link User}r + * @param request the {@link GetSetupProtocolRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleGetSetupProtocolRequest(User user, + GetSetupProtocolRequest request) throws OpenemsNamedException { + byte[] protocol = this.parent.metadata.getSetupProtocol(user, request.getSetupProtocolId()); + + return CompletableFuture.completedFuture(new Base64PayloadResponse(request.getId(), protocol)); + } + } diff --git a/io.openems.common/resources/templates/device-modbus/$srcDir$/$basePackageDir$/Config.java b/io.openems.common/resources/templates/device-modbus/$srcDir$/$basePackageDir$/Config.java index 88c057255e5..a197f3b2585 100644 --- a/io.openems.common/resources/templates/device-modbus/$srcDir$/$basePackageDir$/Config.java +++ b/io.openems.common/resources/templates/device-modbus/$srcDir$/$basePackageDir$/Config.java @@ -24,8 +24,8 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; - + String Modbus_target() default "(enabled=true)"; + String webconsole_configurationFactory_nameHint() default "$projectName$ [{id}]"; } \ No newline at end of file diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 55e3bd30a27..18d96164dad 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -20,7 +20,7 @@ public class OpenemsConstants { * * This is usually the number of the sprint within the year */ - public final static short VERSION_MINOR = 13; + public final static short VERSION_MINOR = 14; /** * The patch version of OpenEMS. diff --git a/io.openems.common/src/io/openems/common/utils/JsonUtils.java b/io.openems.common/src/io/openems/common/utils/JsonUtils.java index a83016ee0c2..8f9a43f4571 100644 --- a/io.openems.common/src/io/openems/common/utils/JsonUtils.java +++ b/io.openems.common/src/io/openems/common/utils/JsonUtils.java @@ -1298,22 +1298,40 @@ public static Object getAsType(OpenemsType type, JsonElement j) throws OpenemsNa if (j.isJsonNull()) { return null; } - switch (type) { - case BOOLEAN: - return JsonUtils.getAsBoolean(j); - case DOUBLE: - return JsonUtils.getAsDouble(j); - case FLOAT: - return JsonUtils.getAsFloat(j); - case INTEGER: - return JsonUtils.getAsInt(j); - case LONG: - return JsonUtils.getAsLong(j); - case SHORT: - return JsonUtils.getAsShort(j); - case STRING: - return JsonUtils.getAsString(j); + + if (j.isJsonPrimitive()) { + switch (type) { + case BOOLEAN: + return JsonUtils.getAsBoolean(j); + case DOUBLE: + return JsonUtils.getAsDouble(j); + case FLOAT: + return JsonUtils.getAsFloat(j); + case INTEGER: + return JsonUtils.getAsInt(j); + case LONG: + return JsonUtils.getAsLong(j); + case SHORT: + return JsonUtils.getAsShort(j); + case STRING: + return JsonUtils.getAsString(j); + } + } + + if (j.isJsonObject() || j.isJsonArray()) { + switch (type) { + case BOOLEAN: + case DOUBLE: + case FLOAT: + case INTEGER: + case LONG: + case SHORT: + break; + case STRING: + return j.toString(); + } } + throw new NotImplementedException( "Converter for value [" + j + "] to class type [" + type + "] is not implemented."); } @@ -1393,4 +1411,34 @@ public static void prettyPrint(JsonElement j) { System.out.println(json); } + /** + * Check if the given {@link JsonElement} is an empty JsonObject {}. + * + * @param j the {@link JsonElement} to check + * @return true if is empty, otherwise false + */ + public static boolean isEmptyJsonObject(JsonElement j) { + if (j != null && j.isJsonObject()) { + JsonObject object = j.getAsJsonObject(); + return object.size() == 0; + } + + return false; + } + + /** + * Check if the given {@link JsonElement} is an empty JsonArray []. + * + * @param j the {@link JsonElement} to check + * @return true if is empty, otherwise false + */ + public static boolean isEmptyJsonArray(JsonElement j) { + if (j != null && j.isJsonArray()) { + JsonArray array = j.getAsJsonArray(); + return array.size() == 0; + } + + return false; + } + } diff --git a/io.openems.common/src/io/openems/common/utils/ObjectUtils.java b/io.openems.common/src/io/openems/common/utils/ObjectUtils.java new file mode 100644 index 00000000000..f943f32b780 --- /dev/null +++ b/io.openems.common/src/io/openems/common/utils/ObjectUtils.java @@ -0,0 +1,62 @@ +package io.openems.common.utils; + +import java.util.Optional; + +public class ObjectUtils { + + /** + * Cast and return the given {@link Object} as a {@link String}. If given object + * is no {@link String} it will return null. + * + * @param object to cast an return as {@link String} + * @return a {@link String} or null + */ + public static String getAsString(Object object) { + if (object != null && object instanceof String) { + return (String) object; + } + + return null; + } + + /** + * Gets the given {@link Object} as a {@link Optional} {@link String}. + * + * @param object to get as {@link Optional} + * @return the {@link Optional} {@link String} value + */ + public static Optional getAsOptionalString(Object object) { + return Optional.ofNullable(getAsString(object)); + } + + /** + * Cast and return the given {@link Object} as a {@link Integer}. If given + * object is no {@link Integer} it will return null. + * + * @param object to cast an return as {@link Integer} + * @return a {@link Integer} or null + */ + public static Integer getAsInteger(Object object) { + if (object != null && object instanceof Integer) { + return (Integer) object; + } + + return null; + } + + /** + * Cast and return the given {@link Object} as a {@link Object} array. If given + * object is no {@link Object} array it will return an empty array. + * + * @param object to cast an return as {@link Object} array + * @return a {@link Object} array or empty array + */ + public static Object[] getAsObjectArrray(Object object) { + if (object != null && object instanceof Object[]) { + return (Object[]) object; + } + + return new Object[] {}; + } + +} diff --git a/io.openems.common/src/io/openems/common/utils/PasswordUtils.java b/io.openems.common/src/io/openems/common/utils/PasswordUtils.java new file mode 100644 index 00000000000..9f663b64766 --- /dev/null +++ b/io.openems.common/src/io/openems/common/utils/PasswordUtils.java @@ -0,0 +1,22 @@ +package io.openems.common.utils; + +import java.security.SecureRandom; + +public class PasswordUtils { + + /** + * Generate a random alphabetic numeric password with given length. + * + * @param length of the Password + * @return Generated Password + */ + public static String generateRandomPassword(int length) { + SecureRandom random = new SecureRandom(); + + return random.ints(48, 122) // + .filter(i -> Character.isAlphabetic(i) || Character.isDigit(i)) // + .limit(length) // + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) // + .toString(); + } +} diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 95bf4a7ffcd..cdf28d695c2 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -1,4 +1,4 @@ --runfw: org.eclipse.osgi +-runfw: org.apache.felix.framework;version='[7.0.1,7.0.1]' -runee: JavaSE-1.8 -runprovidedcapabilities: ${native_capability} @@ -35,6 +35,7 @@ bnd.identity;id='io.openems.edge.batteryinverter.refu88k',\ bnd.identity;id='io.openems.edge.batteryinverter.sunspec',\ bnd.identity;id='io.openems.edge.battery.soltaro',\ + bnd.identity;id='io.openems.edge.bosch.bpts5hybrid',\ bnd.identity;id='io.openems.edge.bridge.mbus',\ bnd.identity;id='io.openems.edge.bridge.modbus',\ bnd.identity;id='io.openems.edge.bridge.onewire',\ @@ -131,6 +132,7 @@ bnd.identity;id='io.openems.edge.meter.weidmueller',\ bnd.identity;id='io.openems.edge.onewire.thermometer',\ bnd.identity;id='io.openems.edge.predictor.persistencemodel',\ + bnd.identity;id='io.openems.edge.predictor.similardaymodel',\ bnd.identity;id='io.openems.edge.pvinverter.cluster',\ bnd.identity;id='io.openems.edge.pvinverter.kaco.blueplanet',\ bnd.identity;id='io.openems.edge.pvinverter.sma',\ @@ -164,6 +166,7 @@ io.openems.edge.batteryinverter.kaco.blueplanetgridsave;version=snapshot,\ io.openems.edge.batteryinverter.refu88k;version=snapshot,\ io.openems.edge.batteryinverter.sunspec;version=snapshot,\ + io.openems.edge.bosch.bpts5hybrid;version=snapshot,\ io.openems.edge.bridge.mbus;version=snapshot,\ io.openems.edge.bridge.modbus;version=snapshot,\ io.openems.edge.bridge.onewire;version=snapshot,\ @@ -266,6 +269,7 @@ io.openems.edge.onewire.thermometer;version=snapshot,\ io.openems.edge.predictor.api;version=snapshot,\ io.openems.edge.predictor.persistencemodel;version=snapshot,\ + io.openems.edge.predictor.similardaymodel;version=snapshot,\ io.openems.edge.pvinverter.api;version=snapshot,\ io.openems.edge.pvinverter.cluster;version=snapshot,\ io.openems.edge.pvinverter.kaco.blueplanet;version=snapshot,\ @@ -303,6 +307,7 @@ org.apache.felix.webconsole;version='[4.6.2,4.6.3)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ + org.jsoup;version='[1.10.2,1.10.3)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.openmuc.jmbus;version='[3.3.0,3.3.1)',\ org.openmuc.jrxtx;version='[1.0.1,1.0.2)',\ diff --git a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/BatteryProtection.java b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/BatteryProtection.java index 5689735a788..4147f61ec55 100644 --- a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/BatteryProtection.java +++ b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/BatteryProtection.java @@ -300,6 +300,9 @@ protected BatteryProtection(Battery battery, ChargeMaxCurrentHandler chargeMaxCu this.battery = battery; this.chargeMaxCurrentHandler = chargeMaxCurrentHandler; this.dischargeMaxCurrentHandler = dischargeMaxCurrentHandler; + + this.battery.getChargeMaxCurrentChannel().setMetaInfo("Battery-Protection"); + this.battery.getDischargeMaxCurrentChannel().setMetaInfo("Battery-Protection"); } /** diff --git a/io.openems.edge.battery.bmw/src/io/openems/edge/battery/bmw/Config.java b/io.openems.edge.battery.bmw/src/io/openems/edge/battery/bmw/Config.java index 7acb2213e6d..afa7774e300 100644 --- a/io.openems.edge.battery.bmw/src/io/openems/edge/battery/bmw/Config.java +++ b/io.openems.edge.battery.bmw/src/io/openems/edge/battery/bmw/Config.java @@ -32,7 +32,7 @@ long errorDelay() default 600; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Max Start Attempts", description = "Sets the counter how many time the system should try to start") int maxStartAttempts() default 5; diff --git a/io.openems.edge.battery.bydcommercial/src/io/openems/edge/battery/bydcommercial/Config.java b/io.openems.edge.battery.bydcommercial/src/io/openems/edge/battery/bydcommercial/Config.java index 8f3966cdb34..aea196a1ab2 100644 --- a/io.openems.edge.battery.bydcommercial/src/io/openems/edge/battery/bydcommercial/Config.java +++ b/io.openems.edge.battery.bydcommercial/src/io/openems/edge/battery/bydcommercial/Config.java @@ -64,7 +64,7 @@ * @return String */ @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; /** * The webconsole_configurationFactory_nameHint. diff --git a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/Config.java b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/Config.java index 4e3391fcf08..6ef5a5042cc 100644 --- a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/Config.java +++ b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/Config.java @@ -29,7 +29,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Battery FENECON Home [{id}]"; diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java index d66eecc718b..3a396135318 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java @@ -57,7 +57,7 @@ int minimalCellVoltage() default 2800; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "BMS Soltaro Cluster Version B [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImpl.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImpl.java index dacf2bf9ffe..0315fc653ce 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImpl.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImpl.java @@ -1,8 +1,8 @@ package io.openems.edge.battery.soltaro.cluster.versionc; -import java.util.HashSet; import java.util.Optional; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.atomic.AtomicReference; import org.osgi.service.cm.ConfigurationAdmin; @@ -31,8 +31,8 @@ import io.openems.edge.battery.soltaro.cluster.versionc.statemachine.Context; import io.openems.edge.battery.soltaro.cluster.versionc.statemachine.StateMachine; import io.openems.edge.battery.soltaro.cluster.versionc.statemachine.StateMachine.State; -import io.openems.edge.battery.soltaro.common.batteryprotection.BatteryProtectionDefinitionSoltaro3500Wh; import io.openems.edge.battery.soltaro.common.batteryprotection.BatteryProtectionDefinitionSoltaro3000Wh; +import io.openems.edge.battery.soltaro.common.batteryprotection.BatteryProtectionDefinitionSoltaro3500Wh; import io.openems.edge.battery.soltaro.common.enums.ModuleType; import io.openems.edge.battery.soltaro.single.versionc.enums.PreChargeControl; import io.openems.edge.battery.soltaro.versionc.SoltaroBatteryVersionC; @@ -89,7 +89,7 @@ public class ClusterVersionCImpl extends AbstractOpenemsModbusComponent implemen private final StateMachine stateMachine = new StateMachine(State.UNDEFINED); private Config config; - private Set racks = new HashSet<>(); + private TreeSet racks = new TreeSet<>(); private BatteryProtection batteryProtection = null; public ClusterVersionCImpl() { @@ -381,18 +381,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { // getModbusProtocol, and it is using racks... for (Rack r : this.racks) { protocol.addTasks(// - // Single Cluster Control Registers (running without Master BMS) - new FC6WriteRegisterTask(r.offset + 0x0010, // - m(this.rack(r, RackChannel.PRE_CHARGE_CONTROL), new UnsignedWordElement(r.offset + 0x0010)) // - ), // - new FC16WriteRegistersTask(r.offset + 0x000B, // - m(this.rack(r, RackChannel.EMS_ADDRESS), new UnsignedWordElement(r.offset + 0x000B)), // - m(this.rack(r, RackChannel.EMS_BAUDRATE), new UnsignedWordElement(r.offset + 0x000C)) // - ), // - new FC6WriteRegisterTask(r.offset + 0x00F4, // - m(this.rack(r, RackChannel.EMS_COMMUNICATION_TIMEOUT), - new UnsignedWordElement(r.offset + 0x00F4)) // - ), // + new FC3ReadRegistersTask(r.offset + 0x000B, Priority.LOW, // m(this.rack(r, RackChannel.EMS_ADDRESS), new UnsignedWordElement(r.offset + 0x000B)), // m(this.rack(r, RackChannel.EMS_BAUDRATE), new UnsignedWordElement(r.offset + 0x000C)), // @@ -407,6 +396,19 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { new UnsignedWordElement(r.offset + 0x00F4)) // ), + // Single Cluster Control Registers (running without Master BMS) + new FC6WriteRegisterTask(r.offset + 0x0010, // + m(this.rack(r, RackChannel.PRE_CHARGE_CONTROL), new UnsignedWordElement(r.offset + 0x0010)) // + ), // + new FC6WriteRegisterTask(r.offset + 0x00F4, // + m(this.rack(r, RackChannel.EMS_COMMUNICATION_TIMEOUT), + new UnsignedWordElement(r.offset + 0x00F4)) // + ), // + new FC16WriteRegistersTask(r.offset + 0x000B, // + m(this.rack(r, RackChannel.EMS_ADDRESS), new UnsignedWordElement(r.offset + 0x000B)), // + m(this.rack(r, RackChannel.EMS_BAUDRATE), new UnsignedWordElement(r.offset + 0x000C)) // + ), // + // Single Cluster Control Registers (General) new FC6WriteRegisterTask(r.offset + 0x00CC, // m(this.rack(r, RackChannel.SYSTEM_TOTAL_CAPACITY), @@ -732,11 +734,8 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { new UnsignedWordElement(r.offset + 0x400)), // m(this.rack(r, RackChannel.LEVEL2_CELL_OVER_VOLTAGE_RECOVER), new UnsignedWordElement(r.offset + 0x401)), // - m(new UnsignedWordElement(r.offset + 0x402)) // - .m(this.rack(r, RackChannel.LEVEL2_SYSTEM_OVER_VOLTAGE_PROTECTION), - ElementToChannelConverter.SCALE_FACTOR_2) // [mV] - .m(Battery.ChannelId.CHARGE_MAX_VOLTAGE, ElementToChannelConverter.SCALE_FACTOR_MINUS_1) // [V] - .build(), // + m(this.rack(r, RackChannel.LEVEL2_SYSTEM_OVER_VOLTAGE_PROTECTION), + new UnsignedWordElement(r.offset + 0x402)), // m(this.rack(r, RackChannel.LEVEL2_SYSTEM_OVER_VOLTAGE_RECOVER), new UnsignedWordElement(r.offset + 0x403), ElementToChannelConverter.SCALE_FACTOR_2), // m(this.rack(r, RackChannel.LEVEL2_SYSTEM_CHARGE_OVER_CURRENT_PROTECTION), diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/Config.java index 742db185882..955d6a4b758 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/Config.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/Config.java @@ -114,7 +114,7 @@ * @return String */ @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; /** * Gets the webconsole_configurationFactory_nameHint. diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java index 3536fee03c7..3ebea8f973a 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java @@ -50,7 +50,7 @@ BatteryState batteryState() default BatteryState.DEFAULT; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "BMS Soltaro Single Rack Version A [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java index 9d1eaa081db..10d9f3f499e 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java @@ -145,7 +145,7 @@ * @return Modbus_target */ @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; /** * Return the webconsole_configurationFactory_nameHint. diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionc/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionc/Config.java index a768d510724..2b34119e05d 100644 --- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionc/Config.java +++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionc/Config.java @@ -114,7 +114,7 @@ * @return Modbus_target */ @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; /** * Return the webconsole_configurationFactory_nameHint. diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionb/ClusterVersionBTest.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionb/ClusterVersionBTest.java index f23129080e0..cbb1adaa66c 100644 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionb/ClusterVersionBTest.java +++ b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionb/ClusterVersionBTest.java @@ -1,9 +1,7 @@ package io.openems.edge.battery.soltaro.cluster.versionb; -import org.junit.Before; import org.junit.Test; -import io.openems.edge.battery.soltaro.cluster.versionc.ResetChannelSources; import io.openems.edge.battery.soltaro.common.enums.BatteryState; import io.openems.edge.battery.soltaro.common.enums.ModuleType; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; @@ -15,11 +13,6 @@ public class ClusterVersionBTest { private static final String BATTERY_ID = "battery0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new ClusterVersionB()) // diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImplTest.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImplTest.java index 28e762f829b..75bcef0675a 100644 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImplTest.java +++ b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ClusterVersionCImplTest.java @@ -1,6 +1,5 @@ package io.openems.edge.battery.soltaro.cluster.versionc; -import org.junit.Before; import org.junit.Test; import io.openems.edge.battery.soltaro.common.enums.ModuleType; @@ -14,11 +13,6 @@ public class ClusterVersionCImplTest { private static final String BATTERY_ID = "battery0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new ClusterVersionCImpl()) // @@ -30,9 +24,9 @@ public void test() throws Exception { .setModuleType(ModuleType.MODULE_3_5_KWH) // .setStartStop(StartStopConfig.AUTO) // .setNumberOfSlaves(0) // - .setRack1Used(false) // - .setRack2Used(false) // - .setRack3Used(false) // + .setRack1Used(true) // + .setRack2Used(true) // + .setRack3Used(true) // .setRack4Used(false) // .setRack5Used(false) // .build()) // diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ResetChannelSources.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ResetChannelSources.java deleted file mode 100644 index 503a70540d9..00000000000 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/cluster/versionc/ResetChannelSources.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.openems.edge.battery.soltaro.cluster.versionc; - -import io.openems.edge.battery.api.Battery; -import io.openems.edge.battery.protection.BatteryProtection; -import io.openems.edge.battery.soltaro.cluster.SoltaroCluster; -import io.openems.edge.common.channel.ChannelId; - -/** - * Reset Channel sources to avoid 'Unable to add Modbus mapping' errors on - * running all tests at once. - */ -public class ResetChannelSources { - - public static void run() { - resetChannelSources(Battery.ChannelId.values()); - resetChannelSources(BatteryProtection.ChannelId.values()); - resetChannelSources(SoltaroCluster.ChannelId.values()); - } - - private static void resetChannelSources(ChannelId[] channelIds) { - for (ChannelId channelId : channelIds) { - channelId.doc().source(null); - } - } - -} diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versiona/SingleRackTest.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versiona/SingleRackTest.java index d41c4898c7e..1cb9c66f722 100644 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versiona/SingleRackTest.java +++ b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versiona/SingleRackTest.java @@ -1,9 +1,7 @@ package io.openems.edge.battery.soltaro.single.versiona; -import org.junit.Before; import org.junit.Test; -import io.openems.edge.battery.soltaro.cluster.versionc.ResetChannelSources; import io.openems.edge.battery.soltaro.common.enums.BatteryState; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.test.ComponentTest; @@ -14,11 +12,6 @@ public class SingleRackTest { private static final String BATTERY_ID = "battery0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new SingleRack()) // diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionb/SingleRackVersionBImplTest.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionb/SingleRackVersionBImplTest.java index 6725532fb13..092cc01973c 100644 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionb/SingleRackVersionBImplTest.java +++ b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionb/SingleRackVersionBImplTest.java @@ -1,9 +1,7 @@ package io.openems.edge.battery.soltaro.single.versionb; -import org.junit.Before; import org.junit.Test; -import io.openems.edge.battery.soltaro.cluster.versionc.ResetChannelSources; import io.openems.edge.battery.soltaro.common.enums.ModuleType; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.startstop.StartStopConfig; @@ -16,11 +14,6 @@ public class SingleRackVersionBImplTest { private static final String BATTERY_ID = "battery0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new SingleRackVersionBImpl()) // diff --git a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionc/SingleRackVersionCImplTest.java b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionc/SingleRackVersionCImplTest.java index c907e4dc1ae..3ab3252ded9 100644 --- a/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionc/SingleRackVersionCImplTest.java +++ b/io.openems.edge.battery.soltaro/test/io/openems/edge/battery/soltaro/single/versionc/SingleRackVersionCImplTest.java @@ -1,9 +1,7 @@ package io.openems.edge.battery.soltaro.single.versionc; -import org.junit.Before; import org.junit.Test; -import io.openems.edge.battery.soltaro.cluster.versionc.ResetChannelSources; import io.openems.edge.battery.soltaro.common.enums.ModuleType; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.startstop.StartStopConfig; @@ -15,11 +13,6 @@ public class SingleRackVersionCImplTest { private static final String BATTERY_ID = "battery0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new SingleRackVersionCImpl()) // diff --git a/io.openems.edge.batteryinverter.api/src/io/openems/edge/batteryinverter/api/HybridManagedSymmetricBatteryInverter.java b/io.openems.edge.batteryinverter.api/src/io/openems/edge/batteryinverter/api/HybridManagedSymmetricBatteryInverter.java index fb9df511140..c437ec3d204 100644 --- a/io.openems.edge.batteryinverter.api/src/io/openems/edge/batteryinverter/api/HybridManagedSymmetricBatteryInverter.java +++ b/io.openems.edge.batteryinverter.api/src/io/openems/edge/batteryinverter/api/HybridManagedSymmetricBatteryInverter.java @@ -2,6 +2,7 @@ import org.osgi.annotation.versioning.ProviderType; +import io.openems.common.channel.PersistencePriority; import io.openems.common.channel.Unit; import io.openems.common.types.OpenemsType; import io.openems.edge.common.channel.Doc; @@ -39,6 +40,7 @@ public enum ChannelId implements io.openems.edge.common.channel.ChannelId { DC_DISCHARGE_POWER(Doc.of(OpenemsType.INTEGER) // .unit(Unit.WATT) // .text(POWER_DOC_TEXT) // + .persistencePriority(PersistencePriority.HIGH) // ), /** * DC Charge Energy. @@ -50,7 +52,9 @@ public enum ChannelId implements io.openems.edge.common.channel.ChannelId { * */ DC_CHARGE_ENERGY(Doc.of(OpenemsType.LONG) // - .unit(Unit.WATT_HOURS)), + .unit(Unit.WATT_HOURS) // + .persistencePriority(PersistencePriority.HIGH) // + ), /** * DC Discharge Energy. * @@ -61,7 +65,9 @@ public enum ChannelId implements io.openems.edge.common.channel.ChannelId { * */ DC_DISCHARGE_ENERGY(Doc.of(OpenemsType.LONG) // - .unit(Unit.WATT_HOURS)),; + .unit(Unit.WATT_HOURS) // + .persistencePriority(PersistencePriority.HIGH) // + ); private final Doc doc; diff --git a/io.openems.edge.batteryinverter.kaco.blueplanetgridsave/src/io/openems/edge/batteryinverter/kaco/blueplanetgridsave/Config.java b/io.openems.edge.batteryinverter.kaco.blueplanetgridsave/src/io/openems/edge/batteryinverter/kaco/blueplanetgridsave/Config.java index 110537aa802..ccacdf58560 100644 --- a/io.openems.edge.batteryinverter.kaco.blueplanetgridsave/src/io/openems/edge/batteryinverter/kaco/blueplanetgridsave/Config.java +++ b/io.openems.edge.batteryinverter.kaco.blueplanetgridsave/src/io/openems/edge/batteryinverter/kaco/blueplanetgridsave/Config.java @@ -29,7 +29,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Battery-Inverter KACO blueplanet gridsave [{id}]"; diff --git a/io.openems.edge.batteryinverter.refu88k/src/io/openems/edge/batteryinverter/refu88k/Config.java b/io.openems.edge.batteryinverter.refu88k/src/io/openems/edge/batteryinverter/refu88k/Config.java index 50f12485815..b65ebf63e7f 100644 --- a/io.openems.edge.batteryinverter.refu88k/src/io/openems/edge/batteryinverter/refu88k/Config.java +++ b/io.openems.edge.batteryinverter.refu88k/src/io/openems/edge/batteryinverter/refu88k/Config.java @@ -32,7 +32,7 @@ StartStopConfig startStop() default StartStopConfig.AUTO; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Watchdog", description = "Sets the watchdog timer interval in seconds, 0=disable") int watchdoginterval() default 0; diff --git a/io.openems.edge.batteryinverter.sunspec/src/io/openems/edge/batteryinverter/sunspec/Config.java b/io.openems.edge.batteryinverter.sunspec/src/io/openems/edge/batteryinverter/sunspec/Config.java index 63907168eda..9f83d153962 100644 --- a/io.openems.edge.batteryinverter.sunspec/src/io/openems/edge/batteryinverter/sunspec/Config.java +++ b/io.openems.edge.batteryinverter.sunspec/src/io/openems/edge/batteryinverter/sunspec/Config.java @@ -26,7 +26,7 @@ int readFromCommonBlockNo() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Battery-Inverter SunSpec [{id}]"; diff --git a/io.openems.edge.bosch.bpts5hybrid/.classpath b/io.openems.edge.bosch.bpts5hybrid/.classpath new file mode 100644 index 00000000000..7a6fc254361 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/io.openems.edge.bosch.bpts5hybrid/.gitignore b/io.openems.edge.bosch.bpts5hybrid/.gitignore new file mode 100644 index 00000000000..c2b941a96de --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/.gitignore @@ -0,0 +1,2 @@ +/bin_test/ +/generated/ diff --git a/io.openems.edge.bosch.bpts5hybrid/.project b/io.openems.edge.bosch.bpts5hybrid/.project new file mode 100644 index 00000000000..cc1c0271c97 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/.project @@ -0,0 +1,23 @@ + + + io.openems.edge.bosch.bpts5hybrid + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + diff --git a/io.openems.edge.bosch.bpts5hybrid/bnd.bnd b/io.openems.edge.bosch.bpts5hybrid/bnd.bnd new file mode 100644 index 00000000000..5a62b121efc --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/bnd.bnd @@ -0,0 +1,22 @@ +Bundle-Name: OpenEMS Edge Bosch BPT-S 5 Hybrid +Bundle-Vendor: OpenEMS Association e.V. +Bundle-License: https://opensource.org/licenses/EPL-2.0 +Bundle-Version: 1.0.0.${tstamp} + +-buildpath: \ + ${buildpath},\ + io.openems.common,\ + io.openems.edge.common,\ + io.openems.edge.ess.api;version=latest,\ + io.openems.edge.meter.api;version=latest,\ + org.eclipse.jetty.client;version='9.4.35',\ + org.eclipse.jetty.http;version='9.4.35',\ + org.eclipse.jetty.util;version='9.4.35',\ + org.jsoup;version='1.10.2',\ + +-testpath: \ + ${testpath},\ + org.eclipse.jetty.client,\ + org.eclipse.jetty.http,\ + org.eclipse.jetty.util,\ + org.eclipse.jetty.io,\ diff --git a/io.openems.edge.bosch.bpts5hybrid/readme.adoc b/io.openems.edge.bosch.bpts5hybrid/readme.adoc new file mode 100644 index 00000000000..9cfa19139fa --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/readme.adoc @@ -0,0 +1,3 @@ += Bosch BPT-S 5 Hybrid + +https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.bosch.bpts5hybrid[Source Code icon:github[]] \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java new file mode 100644 index 00000000000..a4f8af4f97d --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java @@ -0,0 +1,212 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.api.ContentResponse; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.util.StringContentProvider; +import org.eclipse.jetty.http.HttpHeader; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; + +public class BoschBpts5HybridApiClient { + + private static final String POST_REQUEST_DATA = "action=get.hyb.overview&flow=1"; + private static final String REQUEST_LOG_BOOK_VIEW = "&action=get.logbookview&page=0&id=&type=BATTERY&dtype="; + private static final String GET_VALUES_URL_PART = "/cgi-bin/ipcclient.fcgi?"; + private static String BASE_URL; + private String wui_sid; + private Integer pvLeistungWatt = Integer.valueOf(0); + private Integer soc = Integer.valueOf(0); + private Integer einspeisung = Integer.valueOf(0); + private Integer batterieLadeStrom = Integer.valueOf(0); + private Integer verbrauchVonPv = Integer.valueOf(0); + private Integer verbrauchVonBatterie = Integer.valueOf(0); + private Integer strombezugAusNetz = Integer.valueOf(0); + private HttpClient httpClient; + + public BoschBpts5HybridApiClient(String ipaddress) { + BASE_URL = "http://"+ipaddress; + httpClient = new HttpClient(); + httpClient.setConnectTimeout(5000); + httpClient.setFollowRedirects(true); + try { + httpClient.start(); + } catch (Exception e) { + e.printStackTrace(); + } + connect(); + } + + public void connect() { + try { + wui_sid = getWuiSidRequest(); + } catch (OpenemsNamedException e) { + wui_sid = ""; + e.printStackTrace(); + } + } + + private String getWuiSidRequest() throws OpenemsNamedException { + try { + ContentResponse response = httpClient.GET(BASE_URL); + + int status = response.getStatus(); + if(status < 300) { + String body = response.getContentAsString(); + return extractWuiSidFromBody(body); + } else { + throw new OpenemsException( + "Error while reading from Bosch BPT-S 5. Response code: " + status); + } + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new OpenemsException( + "Unable to read from Bosch BPT-S 5. " + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + + private String extractWuiSidFromBody(String body) throws OpenemsException { + int index = body.indexOf("WUI_SID="); + + if(index < 0) { + throw new OpenemsException( + "Error while extracting WUI_SID. Body was= " + body); + } + + return body.substring(index + 9, index + 9 + 15); + } + + public void retreiveValues() throws OpenemsException { + Request postRequest = httpClient.POST(BASE_URL+GET_VALUES_URL_PART+wui_sid); + postRequest.timeout(5, TimeUnit.SECONDS); + postRequest.header(HttpHeader.CONTENT_TYPE, "text/plain"); + postRequest.content(new StringContentProvider(POST_REQUEST_DATA)); + + ContentResponse response; + + try { + response = postRequest.send(); + + int status = response.getStatus(); + + if (status < 300) { + extractValuesFromAnswer(response.getContentAsString()); + } else { + throw new OpenemsException( + "Error while reading from Bosch BPT-S 5. Response code: " + status); + } + } catch (InterruptedException | TimeoutException | ExecutionException | OpenemsNamedException e) { + throw new OpenemsException( + "Unable to read from Bosch BPT-S 5. " + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + + public int retreiveBatterieStatus() throws OpenemsException { + try { + ContentResponse response = httpClient.GET(BASE_URL+GET_VALUES_URL_PART+wui_sid+REQUEST_LOG_BOOK_VIEW); + + int status = response.getStatus(); + if(status < 300) { + String content = response.getContentAsString(); + Document document = Jsoup.parse(content); + Element tableNode = document.select("table").get(0); + Element firstRow = tableNode.select("tr").get(0); + String firstRowText = firstRow.text(); + if(firstRowText.contains("Störung") && !firstRowText.contains("Keine")) { + return 1; + } + else { + return 0; + } + } else { + throw new OpenemsException( + "Error while reading from Bosch BPT-S 5. Response code: " + status); + } + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new OpenemsException( + "Unable to read from Bosch BPT-S 5. " + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + + private void extractValuesFromAnswer(String body) throws OpenemsNamedException { + if(body.contains("session invalid")) { + getWuiSidRequest(); + return; + } + + String[] values = body.split("\\|"); + +// pvLeistungProzent = Integer.valueOf(values[1]); + + pvLeistungWatt = parseWattValue(values[2]); + + soc = Integer.valueOf(values[3]); + +// autarkieGrad = Float.valueOf(values[5]).floatValue(); + +// currentOverallConsumption = parseWattValue(values[6]); + +// gridStatusString = values[7]; + +// systemStatusString = values[9]; + + batterieLadeStrom = parseWattValue(values[10]); + + einspeisung = parseWattValue(values[11]); + + verbrauchVonPv = parseWattValue(values[12]); + + verbrauchVonBatterie = parseWattValue(values[13]); + + if(values.length<15) { + strombezugAusNetz = 0; + } + else { + strombezugAusNetz = parseWattValue(values[14]); + } + } + + private Integer parseWattValue(String inputString) { + if(inputString.trim().length() == 0 || inputString.contains("nbsp;")) { + return Integer.valueOf(0); + } + + String wattString = inputString.replace("kW", " ").replace("von"," ").trim(); + return Integer.valueOf((int) (Float.parseFloat(wattString) * 1000.0f)); + } + + public Integer getCurrentSoc() { + return soc; + } + + public Integer getCurrentChargePower() { + return batterieLadeStrom; + } + + public Integer getCurrentStromAusNetz() { + return strombezugAusNetz; + } + + public Integer getCurrentEinspeisung() { + return einspeisung; + } + + public Integer getCurrentDischargePower() { + return verbrauchVonBatterie; + } + + public Integer getCurrentPvProduction() { + return pvLeistungWatt; + } + + public Integer getCurrentVerbrauchVonPv() { + return verbrauchVonPv; + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCore.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCore.java new file mode 100644 index 00000000000..043e0553529 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCore.java @@ -0,0 +1,71 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import java.util.Optional; + +import io.openems.common.channel.Level; +import io.openems.edge.bosch.bpts5hybrid.ess.BoschBpts5HybridEss; +import io.openems.edge.bosch.bpts5hybrid.meter.BoschBpts5HybridMeter; +import io.openems.edge.bosch.bpts5hybrid.pv.BoschBpts5HybridPv; +import io.openems.edge.common.channel.Doc; +import io.openems.edge.common.channel.StateChannel; +import io.openems.edge.common.channel.value.Value; +import io.openems.edge.common.component.OpenemsComponent; + +public interface BoschBpts5HybridCore extends OpenemsComponent { + + public void setEss(BoschBpts5HybridEss ess); + + public void setPv(BoschBpts5HybridPv boschBpts5HybridPv); + + public void setMeter(BoschBpts5HybridMeter boschBpts5HybridMeter); + + public Optional getEss(); + + public Optional getPv(); + + public Optional getMeter(); + + public enum CoreChannelId implements io.openems.edge.common.channel.ChannelId { + SLAVE_COMMUNICATION_FAILED(Doc.of(Level.FAULT)); + + private final Doc doc; + + private CoreChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + } + + /** + * Gets the Channel for {@link ChannelId#SLAVE_COMMUNICATION_FAILED}. + * + * @return the Channel + */ + public default StateChannel getSlaveCommunicationFailedChannel() { + return this.channel(CoreChannelId.SLAVE_COMMUNICATION_FAILED); + } + + /** + * Gets the Slave Communication Failed State. See + * {@link ChannelId#SLAVE_COMMUNICATION_FAILED}. + * + * @return the Channel {@link Value} + */ + public default Value getSlaveCommunicationFailed() { + return this.getSlaveCommunicationFailedChannel().value(); + } + + /** + * Internal method to set the 'nextValue' on + * {@link ChannelId#SLAVE_COMMUNICATION_FAILED} Channel. + * + * @param value the next value + */ + public default void _setSlaveCommunicationFailed(boolean value) { + this.getSlaveCommunicationFailedChannel().setNextValue(value); + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImpl.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImpl.java new file mode 100644 index 00000000000..89e7ca15c00 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImpl.java @@ -0,0 +1,109 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import java.io.IOException; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventConstants; +import org.osgi.service.event.EventHandler; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.edge.bosch.bpts5hybrid.ess.BoschBpts5HybridEss; +import io.openems.edge.bosch.bpts5hybrid.meter.BoschBpts5HybridMeter; +import io.openems.edge.bosch.bpts5hybrid.pv.BoschBpts5HybridPv; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Bosch.BPTS5Hybrid.Core", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE, // + property = { // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE // + } // +) +public class BoschBpts5HybridCoreImpl extends AbstractOpenemsComponent + implements BoschBpts5HybridCore, OpenemsComponent, EventHandler { + + @Reference + private ConfigurationAdmin cm; + + private BoschBpts5HybridReadWorker worker = null; + + private AtomicReference ess = new AtomicReference<>(); + private AtomicReference pv = new AtomicReference<>(); + private AtomicReference meter = new AtomicReference<>(); + + public BoschBpts5HybridCoreImpl() { + super(// + OpenemsComponent.ChannelId.values(), // + CoreChannelId.values()); + } + + @Activate + void activate(ComponentContext context, Config config) throws ConfigurationException, IOException { + super.activate(context, config.id(), config.alias(), config.enabled()); + this.worker = new BoschBpts5HybridReadWorker(this, config.ipaddress(), config.interval()); + this.worker.activate(config.id()); + } + + @Deactivate + protected void deactivate() { + if (this.worker != null) { + this.worker.deactivate(); + } + super.deactivate(); + } + + @Override + public void handleEvent(Event event) { + if (!this.isEnabled() || this.worker == null) { + return; + } + + switch (event.getTopic()) { + case EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE: + this.worker.triggerNextRun(); + break; + } + } + + public void setEss(BoschBpts5HybridEss boschBpts5HybridEss) { + this.ess.set(boschBpts5HybridEss); + } + + public Optional getEss() { + return Optional.ofNullable(ess.get()); + } + + @Override + public void setPv(BoschBpts5HybridPv boschBpts5HybridPv) { + this.pv.set(boschBpts5HybridPv); + } + + @Override + public Optional getPv() { + return Optional.ofNullable(pv.get()); + } + + @Override + public void setMeter(BoschBpts5HybridMeter boschBpts5HybridMeter) { + this.meter.set(boschBpts5HybridMeter); + } + + @Override + public Optional getMeter() { + return Optional.ofNullable(meter.get()); + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridReadWorker.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridReadWorker.java new file mode 100644 index 00000000000..35cbb2076a4 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridReadWorker.java @@ -0,0 +1,83 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import java.time.LocalDateTime; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.openems.common.exceptions.OpenemsException; +import io.openems.common.worker.AbstractCycleWorker; + +public class BoschBpts5HybridReadWorker extends AbstractCycleWorker{ + + private final Logger log = LoggerFactory.getLogger(BoschBpts5HybridReadWorker.class); + private final BoschBpts5HybridCoreImpl parent; + private final BoschBpts5HybridApiClient apiClient; + private int refreshIntervalSeconds; + private LocalDateTime refreshTime; + + public BoschBpts5HybridReadWorker(BoschBpts5HybridCoreImpl parent, String ipaddress, int interval) { + this.parent = parent; + this.refreshIntervalSeconds = interval; + this.apiClient = new BoschBpts5HybridApiClient(ipaddress); + } + + @Override + public void activate(String name) { + super.activate(name); + this.refreshTime = LocalDateTime.now(); + } + + @Override + protected void forever() throws Throwable { + if (this.refreshTime.plusSeconds(refreshIntervalSeconds).isBefore(LocalDateTime.now())) { + this.refreshTime = LocalDateTime.now(); + + try { + this.apiClient.retreiveValues(); + int batterieStatus = this.apiClient.retreiveBatterieStatus(); + if(batterieStatus == 0) { + this.parent._setSlaveCommunicationFailed(false); + } + else { + this.parent._setSlaveCommunicationFailed(true); + } + } catch (OpenemsException e) { + log.error(e.getMessage()); + this.parent._setSlaveCommunicationFailed(true); + this.apiClient.connect(); + return; + } + } + + this.parent.getEss().ifPresent(ess -> { + if(this.apiClient.getCurrentDischargePower() > 0) { + ess._setActivePower(this.apiClient.getCurrentDischargePower() + this.apiClient.getCurrentVerbrauchVonPv()); + } + else { + int currentDirectUsageOfPv = this.apiClient.getCurrentVerbrauchVonPv() + this.apiClient.getCurrentEinspeisung(); + ess._setActivePower(currentDirectUsageOfPv); + } + ess._setSoc(this.apiClient.getCurrentSoc()); + }); + + this.parent.getPv().ifPresent(pv -> { + pv._setActualPower(this.apiClient.getCurrentPvProduction()); + }); + + this.parent.getMeter().ifPresent(meter -> { + if(this.apiClient.getCurrentStromAusNetz() > 0) { + meter._setActivePower(this.apiClient.getCurrentStromAusNetz()); + } + else { + if(this.apiClient.getCurrentEinspeisung() > 0) { + meter._setActivePower(-1 * this.apiClient.getCurrentEinspeisung()); + } + else{ + meter._setActivePower(0); + } + } + }); + } + +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/Config.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/Config.java new file mode 100644 index 00000000000..877e909cc2a --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/Config.java @@ -0,0 +1,28 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + + +@ObjectClassDefinition(// + name = "Bosch BPT-S 5 Core", // + description = "Bosch BPT-S 5 Hybrid core component") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "boschBpts5hybridCore0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "IP-Address", description = "IPv4 address of the Bosch BPT-S 5 Hybrid") + String ipaddress() default "192.168.178.22"; + + @AttributeDefinition(name = "Update Interval", description = "Update interval in seconds") + int interval() default 2; + + String webconsole_configurationFactory_nameHint() default "Bosch BPT-S 5 Hybrid Core [{id}]"; +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEss.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEss.java new file mode 100644 index 00000000000..efadd0a58f2 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEss.java @@ -0,0 +1,94 @@ +package io.openems.edge.bosch.bpts5hybrid.ess; + +import java.io.IOException; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventConstants; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCore; +import io.openems.edge.common.channel.Doc; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.api.SymmetricEss; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Bosch.BPTS5Hybrid.Ess", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE, // + property = { // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_EXECUTE_WRITE // + } // +) +public class BoschBpts5HybridEss extends AbstractOpenemsComponent implements SymmetricEss, OpenemsComponent { + + private final int CAPACITY = 8_800; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private BoschBpts5HybridCore core; + + @Reference + private ConfigurationAdmin cm; + + public BoschBpts5HybridEss() { + super(// + OpenemsComponent.ChannelId.values(), // + SymmetricEss.ChannelId.values(), // + ChannelId.values() // + ); + this._setCapacity(CAPACITY); // TODO: get from read worker + } + + @Activate + void activate(ComponentContext context, Config config) + throws OpenemsNamedException, ConfigurationException, IOException { + super.activate(context, config.id(), config.alias(), config.enabled()); + + // update filter for 'core' + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "core", config.core_id())) { + return; + } + this.core.setEss(this); + } + + @Deactivate + protected void deactivate() { + if (this.core != null) { + this.core.setEss(null); + } + super.deactivate(); + } + + @Override + public String debugLog() { + return "SoC:" + this.getSoc().asString() // + + "|L:" + this.getActivePower().asString(); + } + + public enum ChannelId implements io.openems.edge.common.channel.ChannelId { + ; + private final Doc doc; + + private ChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/Config.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/Config.java new file mode 100644 index 00000000000..03cf296b632 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/ess/Config.java @@ -0,0 +1,27 @@ +package io.openems.edge.bosch.bpts5hybrid.ess; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(// + name = "Bosch BPT-S 5 ESS", // + description = "Bosch BPT-S 5 Hybrid energy storage system - ESS") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "ess0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "Core-ID", description = "Component-ID of \"Bosch BPT-S 5 Hybrid Core\" component ?") + String core_id() default "boschBpts5hybridCore0"; + + @AttributeDefinition(name = "Core target filter", description = "This is auto-generated by 'Core-ID'.") + String core_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "Bosch BPT-S 5 Hybrid ESS [{id}]"; +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeter.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeter.java new file mode 100644 index 00000000000..203b7e19877 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeter.java @@ -0,0 +1,95 @@ +package io.openems.edge.bosch.bpts5hybrid.meter; + +import java.io.IOException; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventConstants; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCore; +import io.openems.edge.common.channel.Doc; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.meter.api.MeterType; +import io.openems.edge.meter.api.SymmetricMeter; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Bosch.BPTS5Hybrid.Meter", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE, // + property = { // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_EXECUTE_WRITE // + } // +) +public class BoschBpts5HybridMeter extends AbstractOpenemsComponent implements SymmetricMeter, OpenemsComponent{ + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private BoschBpts5HybridCore core; + + @Reference + private ConfigurationAdmin cm; + + public BoschBpts5HybridMeter() { + super(// + OpenemsComponent.ChannelId.values(), // + SymmetricMeter.ChannelId.values(),// + ChannelId.values() // + ); + } + + @Activate + void activate(ComponentContext context, Config config) throws OpenemsNamedException, ConfigurationException, IOException { + super.activate(context, config.id(), config.alias(), config.enabled()); + + // update filter for 'core' + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "core", config.core_id())) { + return; + } + this.core.setMeter(this); + } + + @Deactivate + protected void deactivate() { + if (this.core != null) { + this.core.setMeter(null); + } + super.deactivate(); + } + + @Override + public String debugLog() { + return "Meter: Power:" + this.getActivePower().get(); + } + + public enum ChannelId implements io.openems.edge.common.channel.ChannelId { + ; + private final Doc doc; + + private ChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + } + + @Override + public MeterType getMeterType() { + return MeterType.GRID; + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/Config.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/Config.java new file mode 100644 index 00000000000..260fceea4b3 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/meter/Config.java @@ -0,0 +1,27 @@ +package io.openems.edge.bosch.bpts5hybrid.meter; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(// + name = "Bosch BPT-S 5 Meter", // + description = "Bosch BPT-S 5 Hybrid energy storage system - Meter component") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "meter0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "Core-ID", description = "Component-ID of \"Bosch BPT-S 5 Hybrid Core\" component ?") + String core_id() default "boschBpts5hybridCore0"; + + @AttributeDefinition(name = "Core target filter", description = "This is auto-generated by 'Core-ID'.") + String core_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "Bosch BPT-S 5 Hybrid Meter [{id}]"; +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPv.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPv.java new file mode 100644 index 00000000000..6d38cd186cb --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPv.java @@ -0,0 +1,92 @@ +package io.openems.edge.bosch.bpts5hybrid.pv; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.EventConstants; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCore; +import io.openems.edge.common.channel.Doc; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.ess.dccharger.api.EssDcCharger; + +import java.io.IOException; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Bosch.BPTS5Hybrid.Pv", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE, // + property = { // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_EXECUTE_WRITE // + } // +) +public class BoschBpts5HybridPv extends AbstractOpenemsComponent implements EssDcCharger, OpenemsComponent{ + + private final int PEAK_POWER = 5_500; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + private BoschBpts5HybridCore core; + + @Reference + private ConfigurationAdmin cm; + + public BoschBpts5HybridPv() { + super(// + OpenemsComponent.ChannelId.values(), // + EssDcCharger.ChannelId.values(),// + ChannelId.values() // + ); + this._setMaxActualPower(PEAK_POWER); //TODO: get from read worker + } + + @Activate + void activate(ComponentContext context, Config config) throws OpenemsNamedException, ConfigurationException, IOException { + super.activate(context, config.id(), config.alias(), config.enabled()); + + // update filter for 'core' + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "core", config.core_id())) { + return; + } + this.core.setPv(this); + } + + @Deactivate + protected void deactivate() { + if (this.core != null) { + this.core.setEss(null); + } + super.deactivate(); + } + + @Override + public String debugLog() { + return "PV:" + this.getActualPower().asString(); + } + + public enum ChannelId implements io.openems.edge.common.channel.ChannelId { + ; + private final Doc doc; + + private ChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + } +} diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/Config.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/Config.java new file mode 100644 index 00000000000..3fffb967b92 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/pv/Config.java @@ -0,0 +1,27 @@ +package io.openems.edge.bosch.bpts5hybrid.pv; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(// + name = "Bosch BPT-S 5 PV", // + description = "Bosch BPT-S 5 Hybrid energy storage system - PV component") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "charger0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "Core-ID", description = "Component-ID of \"Bosch BPT-S 5 Hybrid Core\" component ?") + String core_id() default "boschBpts5hybridCore0"; + + @AttributeDefinition(name = "Core target filter", description = "This is auto-generated by 'Core-ID'.") + String core_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "Bosch BPT-S 5 Hybrid PV [{id}]"; +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/.gitignore b/io.openems.edge.bosch.bpts5hybrid/test/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImplTest.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImplTest.java new file mode 100644 index 00000000000..0016e3dbc9c --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridCoreImplTest.java @@ -0,0 +1,23 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import org.junit.Test; + +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; + +public class BoschBpts5HybridCoreImplTest { + + private static final String CORE_ID = "core0"; + + @Test + public void test() throws Exception { + new ComponentTest(new BoschBpts5HybridCoreImpl()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .activate(MyConfig.create() // + .setId(CORE_ID) // + .setIpaddress("127.0.0.1") // + .setInterval(2) // + .build()) // + ; + } +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/MyConfig.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/MyConfig.java new file mode 100644 index 00000000000..cedfbf17dfb --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/core/MyConfig.java @@ -0,0 +1,63 @@ +package io.openems.edge.bosch.bpts5hybrid.core; + +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + public static class Builder { + private String id = null; + private String modbusId = null; + public String ipaddress; + public int interval; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setIpaddress(String ipaddress) { + this.ipaddress = ipaddress; + return this; + } + + public Builder setInterval(int interval) { + this.interval = interval; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String ipaddress() { + return this.builder.ipaddress; + } + + @Override + public int interval() { + return this.builder.interval; + } + +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEssTest.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEssTest.java new file mode 100644 index 00000000000..2cc138b0caf --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/BoschBpts5HybridEssTest.java @@ -0,0 +1,34 @@ +package io.openems.edge.bosch.bpts5hybrid.ess; + +import org.junit.Test; + +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCoreImpl; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; + +public class BoschBpts5HybridEssTest { + + private static final String CORE_ID = "core0"; + private static final String ESS_ID = "ess0"; + + @Test + public void test() throws Exception { + BoschBpts5HybridCoreImpl core = new BoschBpts5HybridCoreImpl(); + new ComponentTest(new BoschBpts5HybridCoreImpl()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .activate(io.openems.edge.bosch.bpts5hybrid.core.MyConfig.create() // + .setId(CORE_ID) // + .setIpaddress("127.0.0.1") // + .setInterval(2) // + .build()); // + + new ComponentTest(new BoschBpts5HybridEss()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("core", core) // + .activate(MyConfig.create() // + .setId(ESS_ID) // + .setCoreId(CORE_ID) // + .build()) // + ; + } +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/MyConfig.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/MyConfig.java new file mode 100644 index 00000000000..9bcff8f1db0 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/ess/MyConfig.java @@ -0,0 +1,57 @@ +package io.openems.edge.bosch.bpts5hybrid.ess; + +import io.openems.common.utils.ConfigUtils; +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id = null; + public String coreId; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCoreId(String coreId) { + this.coreId = coreId; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String core_id() { + return this.builder.coreId; + } + + @Override + public String core_target() { + return ConfigUtils.generateReferenceTargetFilter(this.id(), this.core_id()); + } + +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeterTest.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeterTest.java new file mode 100644 index 00000000000..066a955a29b --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/BoschBpts5HybridMeterTest.java @@ -0,0 +1,34 @@ +package io.openems.edge.bosch.bpts5hybrid.meter; + +import org.junit.Test; + +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCoreImpl; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; + +public class BoschBpts5HybridMeterTest { + + private static final String CORE_ID = "core0"; + private static final String METER_ID = "meter0"; + + @Test + public void test() throws Exception { + BoschBpts5HybridCoreImpl core = new BoschBpts5HybridCoreImpl(); + new ComponentTest(new BoschBpts5HybridCoreImpl()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .activate(io.openems.edge.bosch.bpts5hybrid.core.MyConfig.create() // + .setId(CORE_ID) // + .setIpaddress("127.0.0.1") // + .setInterval(2) // + .build()); // + + new ComponentTest(new BoschBpts5HybridMeter()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("core", core) // + .activate(MyConfig.create() // + .setId(METER_ID) // + .setCoreId(CORE_ID) // + .build()) // + ; + } +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/MyConfig.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/MyConfig.java new file mode 100644 index 00000000000..d03ebf8e596 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/meter/MyConfig.java @@ -0,0 +1,57 @@ +package io.openems.edge.bosch.bpts5hybrid.meter; + +import io.openems.common.utils.ConfigUtils; +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id = null; + public String coreId; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCoreId(String coreId) { + this.coreId = coreId; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String core_id() { + return this.builder.coreId; + } + + @Override + public String core_target() { + return ConfigUtils.generateReferenceTargetFilter(this.id(), this.core_id()); + } + +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPvTest.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPvTest.java new file mode 100644 index 00000000000..21b71389758 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/BoschBpts5HybridPvTest.java @@ -0,0 +1,34 @@ +package io.openems.edge.bosch.bpts5hybrid.pv; + +import org.junit.Test; + +import io.openems.edge.bosch.bpts5hybrid.core.BoschBpts5HybridCoreImpl; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; + +public class BoschBpts5HybridPvTest { + + private static final String CORE_ID = "core0"; + private static final String CHARGER_ID = "charger0"; + + @Test + public void test() throws Exception { + BoschBpts5HybridCoreImpl core = new BoschBpts5HybridCoreImpl(); + new ComponentTest(new BoschBpts5HybridCoreImpl()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .activate(io.openems.edge.bosch.bpts5hybrid.core.MyConfig.create() // + .setId(CORE_ID) // + .setIpaddress("127.0.0.1") // + .setInterval(2) // + .build()); // + + new ComponentTest(new BoschBpts5HybridPv()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("core", core) // + .activate(MyConfig.create() // + .setId(CHARGER_ID) // + .setCoreId(CORE_ID) // + .build()) // + ; + } +} \ No newline at end of file diff --git a/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/MyConfig.java b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/MyConfig.java new file mode 100644 index 00000000000..69e0d65e4e2 --- /dev/null +++ b/io.openems.edge.bosch.bpts5hybrid/test/io/openems/edge/bosch/bpts5hybrid/pv/MyConfig.java @@ -0,0 +1,57 @@ +package io.openems.edge.bosch.bpts5hybrid.pv; + +import io.openems.common.utils.ConfigUtils; +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id = null; + public String coreId; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setCoreId(String coreId) { + this.coreId = coreId; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String core_id() { + return this.builder.coreId; + } + + @Override + public String core_target() { + return ConfigUtils.generateReferenceTargetFilter(this.id(), this.core_id()); + } + +} \ No newline at end of file diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/AbstractOpenemsModbusComponent.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/AbstractOpenemsModbusComponent.java index 3be71e6858b..ee15745e4d2 100644 --- a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/AbstractOpenemsModbusComponent.java +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/AbstractOpenemsModbusComponent.java @@ -265,7 +265,22 @@ public ChannelMapper(T element) { */ public ChannelMapper m(io.openems.edge.common.channel.ChannelId channelId, ElementToChannelConverter converter) { + return this.m(channelId, converter, new ChannelMetaInfo(element.getStartAddress())); + } + + /** + * Maps the given element 1-to-1 to the Channel identified by channelId. + * + * @param channelId the Channel-ID + * @param converter the {@link ElementToChannelConverter} + * @param channelMetaInfo an object that holds meta information about the + * Channel + * @return the element parameter + */ + public ChannelMapper m(io.openems.edge.common.channel.ChannelId channelId, + ElementToChannelConverter converter, ChannelMetaInfo channelMetaInfo) { Channel channel = channel(channelId); + channel.setMetaInfo(channelMetaInfo); this.channelMaps.put(channel, converter); return this; } @@ -363,7 +378,7 @@ public T build() { * Creates a ChannelMapper that can be used with builder pattern inside the * protocol definition. * - * @param the type of the {@link AbstractModbusElement}d + * @param the type of the {@link AbstractModbusElement}d * @param element the ModbusElement * @return a {@link ChannelMapper} */ @@ -394,32 +409,33 @@ protected final > T m(io.openems.edge.common. return this.m(channelId, element, ElementToChannelConverter.DIRECT_1_TO_1); } + /** + * Maps the given element 1-to-1 to the Channel identified by channelId. + * + * @param the type of the {@link AbstractModbusElement}d + * @param channelId the Channel-ID + * @param element the ModbusElement + * @param channelMetaInfo an object that holds meta information about the + * Channel + * @return the element parameter + */ + protected final > T m(io.openems.edge.common.channel.ChannelId channelId, + T element, ChannelMetaInfo channelMetaInfo) { + return this.m(channelId, element, ElementToChannelConverter.DIRECT_1_TO_1, channelMetaInfo); + } + /** * Maps the given element to the Channel identified by channelId, applying the * given @link{ElementToChannelConverter}. * - * @param the type of the {@link AbstractModbusElement}d - * @param channelId the Channel-ID - * @param element the ModbusElement - * @param converter the ElementToChannelConverter - * @param ignoreDuplicatedSource set to - * {@link ModbusChannelSource#IGNORE_DUPLICATED_SOURCE} - * to ignore the check for channels with multiple - * mapped modbus registers + * @param the type of the {@link AbstractModbusElement}d + * @param channelId the Channel-ID + * @param element the ModbusElement + * @param converter the ElementToChannelConverter * @return the element parameter */ protected final > T m(io.openems.edge.common.channel.ChannelId channelId, - T element, ElementToChannelConverter converter, - ModbusChannelSource.IgnoreDuplicatedSource ignoreDuplicatedSource) { - if (ignoreDuplicatedSource != null) { - try { - channelId.doc().source(new ModbusChannelSource(element.getStartAddress())); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException( - "Unable to add Modbus mapping for [" + channelId.id() + "]: " + e.getMessage()); - } - } - + T element, ElementToChannelConverter converter) { return new ChannelMapper(element) // .m(channelId, converter) // .build(); @@ -429,15 +445,19 @@ protected final > T m(io.openems.edge.common. * Maps the given element to the Channel identified by channelId, applying the * given @link{ElementToChannelConverter}. * - * @param the type of the {@link AbstractModbusElement} - * @param channelId the Channel-ID - * @param element the ModbusElement - * @param converter the {@link ElementToChannelConverter} + * @param the type of the {@link AbstractModbusElement}d + * @param channelId the Channel-ID + * @param element the ModbusElement + * @param converter the ElementToChannelConverter + * @param channelMetaInfo an object that holds meta information about the + * Channel * @return the element parameter */ protected final > T m(io.openems.edge.common.channel.ChannelId channelId, - T element, ElementToChannelConverter converter) { - return this.m(channelId, element, converter, null); + T element, ElementToChannelConverter converter, ChannelMetaInfo channelMetaInfo) { + return new ChannelMapper(element) // + .m(channelId, converter, channelMetaInfo) // + .build(); } public enum BitConverter { diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfo.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfo.java new file mode 100644 index 00000000000..f7b69b9c100 --- /dev/null +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfo.java @@ -0,0 +1,47 @@ +package io.openems.edge.bridge.modbus.api; + +import java.util.Objects; + +/** + * Describes a Channel that has a read- or read-and-write-mapping to one Modbus + * Register. + */ +public class ChannelMetaInfo { + + /** + * Holds the Address for Modbus Read Register. + */ + protected final int address; + + public ChannelMetaInfo(int address) { + this.address = address; + } + + @Override + public String toString() { + StringBuilder b = new StringBuilder(); + b.append("0x").append(Integer.toHexString(this.address)); + return b.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(this.address); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ChannelMetaInfo other = (ChannelMetaInfo) obj; + return this.address == other.address; + } + +} diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ModbusChannelSource.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoBit.java similarity index 55% rename from io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ModbusChannelSource.java rename to io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoBit.java index 309bd8c9e59..05d0fabad22 100644 --- a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ModbusChannelSource.java +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoBit.java @@ -2,34 +2,18 @@ import java.util.Objects; -public class ModbusChannelSource { - - /** - * This can be used in {@link AbstractOpenemsModbusComponent} to ignore the - * check for duplicated source mappings. - */ - public static final IgnoreDuplicatedSource IGNORE_DUPLICATED_SOURCE = new IgnoreDuplicatedSource(); - - protected static class IgnoreDuplicatedSource { - } - - /** - * Holds the Start-Address of the Modbus Register. - */ - private final int address; +/** + * Describes a Channel that has a read-mapping to a Modbus Coil. + */ +public class ChannelMetaInfoBit extends ChannelMetaInfo { /** * Holds the index of the bit inside the Register if applicable. */ private final int bit; - public ModbusChannelSource(int address) { - this.address = address; - this.bit = -1; - } - - public ModbusChannelSource(int address, int bit) { - this.address = address; + public ChannelMetaInfoBit(int address, int bit) { + super(address); this.bit = bit; } @@ -59,7 +43,7 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) { return false; } - ModbusChannelSource other = (ModbusChannelSource) obj; + ChannelMetaInfoBit other = (ChannelMetaInfoBit) obj; return this.address == other.address && this.bit == other.bit; } diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoReadAndWrite.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoReadAndWrite.java new file mode 100644 index 00000000000..ae6cff010a0 --- /dev/null +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelMetaInfoReadAndWrite.java @@ -0,0 +1,49 @@ +package io.openems.edge.bridge.modbus.api; + +import java.util.Objects; + +/** + * Describes a Channel that has a read-and-write-mapping to two Modbus + * Registers. + */ +public class ChannelMetaInfoReadAndWrite extends ChannelMetaInfo { + + /** + * Holds the Address for Modbus Write Register. + */ + private final int writeAddress; + + public ChannelMetaInfoReadAndWrite(int readAddress, int writeAaddress) { + super(readAddress); + this.writeAddress = writeAaddress; + } + + @Override + public String toString() { + StringBuilder b = new StringBuilder(); + b.append("READ:0x").append(Integer.toHexString(this.address)); + b.append(" | WRITE:0x").append(Integer.toHexString(this.writeAddress)); + return b.toString(); + } + + @Override + public int hashCode() { + return Objects.hash(this.address, this.writeAddress); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ChannelMetaInfoReadAndWrite other = (ChannelMetaInfoReadAndWrite) obj; + return this.address == other.address && this.writeAddress == other.writeAddress; + } + +} diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelToElementConverter.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelToElementConverter.java new file mode 100644 index 00000000000..c555352403e --- /dev/null +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ChannelToElementConverter.java @@ -0,0 +1,260 @@ +package io.openems.edge.bridge.modbus.api; + +import java.util.function.Function; + +/** + * Provides Functions to convert from Element to Channel and back. Also has some + * static convenience functions to facilitate conversion. + */ +public class ChannelToElementConverter implements Function { + + /** + * Converts directly 1-to-1 between Channel and Element. + */ + public static final ChannelToElementConverter DIRECT_1_TO_1 = new ChannelToElementConverter(value -> value); + + private final Function function; + + public ChannelToElementConverter(Function function) { + this.function = function; + } + + @Override + public Object apply(Object t) { + return this.function.apply(t); + } +// /** +// * Applies a scale factor of -1. Converts value [1] to [0.1]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_MINUS_1 = new ElementToChannelScaleFactorConverter(-1); +// +// /** +// * Applies a scale factor of -2. Converts value [1] to [0.01]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_MINUS_2 = new ElementToChannelScaleFactorConverter(-2); +// +// /** +// * Applies a scale factor of -3. Converts value [1] to [0.001]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_MINUS_3 = new ElementToChannelScaleFactorConverter(-3); +// +// /** +// * Applies a scale factor of 1. Converts value [1] to [10]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_1 = new ElementToChannelScaleFactorConverter(1); +// +// /** +// * Applies a scale factor of 2. Converts value [1] to [100]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_2 = new ElementToChannelScaleFactorConverter(2); +// +// /** +// * Applies a scale factor of 3. Converts value [1] to [1000]. +// * +// * @see ElementToChannelScaleFactorConverter +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_3 = new ElementToChannelScaleFactorConverter(3); +// +// /** +// * Converts only positive values from Element to Channel. +// */ +// public static final ChannelToElementConverter KEEP_POSITIVE = new ChannelToElementConverter(// +// // element -> channel +// value -> StaticConverters.KEEP_POSITIVE, // +// // channel -> element +// value -> value); +// +// /** +// * Inverts the value from Element to Channel. +// */ +// public static final ChannelToElementConverter INVERT = new ChannelToElementConverter(// +// // element -> channel +// StaticConverters.INVERT, // +// // channel -> element +// StaticConverters.INVERT); +// +// /** +// * Sets the value to 'zero' if parameter is true; otherwise +// * {@link #DIRECT_1_TO_1}. +// * +// *

    +// *
  • true: set zero +// *
  • false: apply {@link #DIRECT_1_TO_1} +// *
+// * +// * @param setZero true to set to null +// * @return the {@link ChannelToElementConverter} +// */ +// // CHECKSTYLE:OFF +// public static ChannelToElementConverter SET_ZERO_IF_TRUE(boolean setZero) { +// // CHECKSTYLE:ON +// if (setZero) { +// return new ChannelToElementConverter(// +// // element -> channel +// value -> 0, // +// // channel -> element +// value -> 0); +// } else { +// return DIRECT_1_TO_1; +// } +// } +// +// /** +// * Converts depending on the given parameter. +// * +// *
    +// *
  • true: invert value +// *
  • false: keep value (1-to-1) +// *
+// * +// * @param invert true if Converter should invert +// * @return the {@link ChannelToElementConverter} +// */ +// // CHECKSTYLE:OFF +// public static ChannelToElementConverter INVERT_IF_TRUE(boolean invert) { +// // CHECKSTYLE:ON +// if (invert) { +// return INVERT; +// } else { +// return DIRECT_1_TO_1; +// } +// } +// +// /** +// * Converts only negative values from Element to Channel and inverts them (makes +// * the value positive). +// */ +// public static final ChannelToElementConverter KEEP_NEGATIVE_AND_INVERT = new ElementToChannelConverterChain(INVERT, +// KEEP_POSITIVE); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_1} and +// * CONVERT_POSITIVE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_1_AND_KEEP_POSITIVE = new ElementToChannelConverterChain( +// SCALE_FACTOR_1, KEEP_POSITIVE); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_2} and INVERT. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_2_AND_INVERT = new ElementToChannelConverterChain( +// SCALE_FACTOR_2, INVERT); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_1} and +// * CONVERT_NEGATIVE_AND_INVERT. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_1_AND_KEEP_NEGATIVE_AND_INVERT = new ElementToChannelConverterChain( +// SCALE_FACTOR_1, KEEP_NEGATIVE_AND_INVERT); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_2} and +// * CONVERT_POSITIVE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_2_AND_KEEP_POSITIVE = new ElementToChannelConverterChain( +// SCALE_FACTOR_2, KEEP_POSITIVE); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_2} and @see +// * {@link ChannelToElementConverter#KEEP_NEGATIVE_AND_INVERT}. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_2_AND_KEEP_NEGATIVE_AND_INVERT = new ElementToChannelConverterChain( +// SCALE_FACTOR_2, KEEP_NEGATIVE_AND_INVERT); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_2_AND_KEEP_NEGATIVE} +// * and @see {@link ChannelToElementConverter#INVERT}. +// */ +// public static ChannelToElementConverter SCALE_FACTOR_2_AND_KEEP_NEGATIVE = new ElementToChannelConverterChain( +// SCALE_FACTOR_2_AND_KEEP_NEGATIVE_AND_INVERT, INVERT); +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_1} and INVERT_IF_TRUE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_1_AND_INVERT_IF_TRUE(boolean invert) { +// return new ElementToChannelConverterChain(SCALE_FACTOR_1, INVERT_IF_TRUE(invert)); +// } +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_2} and INVERT_IF_TRUE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_2_AND_INVERT_IF_TRUE(boolean invert) { +// return new ElementToChannelConverterChain(SCALE_FACTOR_2, INVERT_IF_TRUE(invert)); +// } +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_3} and INVERT_IF_TRUE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_3_AND_INVERT_IF_TRUE(boolean invert) { +// return new ElementToChannelConverterChain(SCALE_FACTOR_3, INVERT_IF_TRUE(invert)); +// } +// +// /** +// * Applies {@link ChannelToElementConverter#SCALE_FACTOR_MINUS_1} and +// * INVERT_IF_TRUE. +// */ +// public static final ChannelToElementConverter SCALE_FACTOR_MINUS_1_AND_INVERT_IF_TRUE(boolean invert) { +// return new ElementToChannelConverterChain(SCALE_FACTOR_MINUS_1, INVERT_IF_TRUE(invert)); +// } +// +// private final Function elementToChannel; +// private final Function channelToElement; +// +// /** +// * This constructs and back-and-forth converter from Element to Channel and +// * back. +// * +// * @param elementToChannel from Element to Channel +// * @param channelToElement from Channel to Element +// */ +// public ChannelToElementConverter(Function elementToChannel, +// Function channelToElement) { +// this.elementToChannel = elementToChannel; +// this.channelToElement = channelToElement; +// } +// +// /** +// * This constructs a forward-only converter from Element to Channel. +// * Back-conversion throws an Exception. +// * +// * @param elementToChannel Element to Channel +// */ +// public ChannelToElementConverter(Function elementToChannel) { +// this.elementToChannel = elementToChannel; +// this.channelToElement = (value) -> { +// throw new IllegalArgumentException("Backwards-Conversion for [" + value + "] is not implemented."); +// }; +// } +// +// /** +// * Convert an Element value to a Channel value. If the value can or should not +// * be converted, this method returns null. +// * +// * @param value the Element value +// * @return the converted value or null +// */ +// public Object elementToChannel(Object value) { +// return this.elementToChannel.apply(value); +// } +// +// /** +// * Convert a Channel value to an Element value. If the value can or should not +// * be converted, this method returns null. +// * +// * @param value the Channel value +// * @return the converted value or null +// */ +// public Object channelToElement(Object value) { +// return this.channelToElement.apply(value); +// } +} diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/BitsWordElement.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/BitsWordElement.java index f1fe2829941..0a40ddf1607 100644 --- a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/BitsWordElement.java +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/BitsWordElement.java @@ -19,7 +19,7 @@ import io.openems.common.types.OpenemsType; import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent; import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent.BitConverter; -import io.openems.edge.bridge.modbus.api.ModbusChannelSource; +import io.openems.edge.bridge.modbus.api.ChannelMetaInfoBit; import io.openems.edge.common.channel.Channel; import io.openems.edge.common.channel.ChannelId; import io.openems.edge.common.channel.WriteChannel; @@ -69,12 +69,14 @@ public BitsWordElement bit(int bitIndex, ChannelId channelId, BitConverter conve @SuppressWarnings("unchecked") Channel booleanChannel = (Channel) channel; - // Add Modbus Address and Bit-Index to Channel Source - channelId.doc().source(new ModbusChannelSource(this.getStartAddress(), bitIndex)); - - // Handle Writes to Bit-Channels ChannelWrapper channelWrapper = new ChannelWrapper(booleanChannel, converter); + + // Set Channel-Source + channel.setMetaInfo(new ChannelMetaInfoBit(this.getStartAddress(), bitIndex)); + + // Add Modbus Address and Bit-Index to Channel Source if (channel instanceof WriteChannel) { + // Handle Writes to Bit-Channels WriteChannel booleanWriteChannel = (WriteChannel) booleanChannel; booleanWriteChannel.onSetNextWrite(value -> { // Listen on Writes to the BooleanChannel and store the value diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusReadElement.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusReadElement.java new file mode 100644 index 00000000000..c24650822a7 --- /dev/null +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusReadElement.java @@ -0,0 +1,9 @@ +package io.openems.edge.bridge.modbus.api.element; + +import java.util.function.Consumer; + +public interface ModbusReadElement extends ModbusElement { + + public AbstractModbusElement onUpdateCallback(Consumer onUpdateCallback); + +} diff --git a/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusWriteElement.java b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusWriteElement.java new file mode 100644 index 00000000000..d4ca7cac865 --- /dev/null +++ b/io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/element/ModbusWriteElement.java @@ -0,0 +1,5 @@ +package io.openems.edge.bridge.modbus.api.element; + +public interface ModbusWriteElement extends ModbusElement { + +} diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/AbstractChannelListenerManager.java b/io.openems.edge.common/src/io/openems/edge/common/channel/AbstractChannelListenerManager.java index fd76c9b434d..42509930b62 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/AbstractChannelListenerManager.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/AbstractChannelListenerManager.java @@ -50,7 +50,7 @@ public OnChangeListener(OpenemsComponent component, ChannelId channelId, /** * Called on deactivate(). Remove all callbacks from Channels. */ - public void deactivate() { + public synchronized void deactivate() { for (OnSetNextValueListener listener : this.onSetNextValueListeners) { Channel channel = listener.component.channel(listener.channelId); channel.removeOnSetNextValueCallback(listener.callback); diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/BooleanWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/BooleanWriteChannel.java index ed1251aa391..beb60524c2b 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/BooleanWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/BooleanWriteChannel.java @@ -74,5 +74,4 @@ public List> getOnSetNextWrites public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/Channel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/Channel.java index a87c8e6a81e..436fe46f250 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/Channel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/Channel.java @@ -207,4 +207,24 @@ public default void setNextValue(Object value) { */ public void deactivate(); + /** + * Sets an object that holds meta information about the Channel, e.g. a read + * source or write target of this Channel, like a Modbus Register or REST-Api + * endpoint address. Defaults to null. + * + * @param the type of the meta info + * @param metaInfo the meta info object + * @throws IllegalArgumentException if there is already a different meta-info + * registered with the Channel + */ + public void setMetaInfo(META_INFO metaInfo) throws IllegalArgumentException; + + /** + * Gets the meta information object. Defaults to null. + * + * @param the type of the meta info attachment + * @return the meta info object + */ + public META_INFO getMetaInfo(); + } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/Doc.java b/io.openems.edge.common/src/io/openems/edge/common/channel/Doc.java index 47842f9734d..3dcbbfe9c61 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/Doc.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/Doc.java @@ -135,26 +135,6 @@ public static StateChannelDoc of(Level level) { */ public String getText(); - /** - * Sets an object that holds information about the source of this Channel, i.e. - * a Modbus Register or REST-Api endpoint address. Defaults to null. - * - * @param the type of the source attachment - * @param source the source object - * @return myself - * @throws IllegalArgumentException if there is already a source registered with - * the Channel - */ - public Doc source(SOURCE source) throws IllegalArgumentException; - - /** - * Gets the source information object. Defaults to empty String. - * - * @param the type of the source attachment - * @return the soure information object - */ - public SOURCE getSource(); - /** * Is the more verbose debug mode activated?. * diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/DoubleWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/DoubleWriteChannel.java index 9704f4b217c..01b6c90a528 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/DoubleWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/DoubleWriteChannel.java @@ -43,5 +43,4 @@ public List> getOnSetNextWrites( public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/EnumWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/EnumWriteChannel.java index ae9212559f0..c141d036449 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/EnumWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/EnumWriteChannel.java @@ -8,9 +8,9 @@ import org.slf4j.LoggerFactory; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.exceptions.OpenemsException; import io.openems.common.function.ThrowingConsumer; import io.openems.common.types.OptionsEnum; -import io.openems.common.exceptions.OpenemsException; import io.openems.edge.common.component.OpenemsComponent; public class EnumWriteChannel extends EnumReadChannel implements WriteChannel { @@ -100,5 +100,4 @@ public List> getOnSetNextWrites public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/FloatWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/FloatWriteChannel.java index a944d8e8aa4..b40d04a6157 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/FloatWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/FloatWriteChannel.java @@ -72,5 +72,4 @@ public List> getOnSetNextWrites() public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/IntegerWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/IntegerWriteChannel.java index deeac9cd241..e43a30e7b3a 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/IntegerWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/IntegerWriteChannel.java @@ -72,5 +72,4 @@ public List> getOnSetNextWrites public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/LongWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/LongWriteChannel.java index 0327b43fcc4..9b0562eeaeb 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/LongWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/LongWriteChannel.java @@ -72,5 +72,4 @@ public List> getOnSetNextWrites() public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/ShortWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/ShortWriteChannel.java index 9fa89ae6854..ac5ac8af701 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/ShortWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/ShortWriteChannel.java @@ -72,5 +72,4 @@ public List> getOnSetNextWrites() public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/StringWriteChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/StringWriteChannel.java index db5feabfcea..f289b08ff10 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/StringWriteChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/StringWriteChannel.java @@ -30,7 +30,7 @@ public void accept(Channel channel) { + "] is not an StringWriteChannel! Unable to register \"onSetNextWrite\"-Listener!"); return; } - + // on each setNextWrite to the channel -> store the value in the DEBUG-channel ((StringWriteChannel) channel).onSetNextWrite(value -> { channel.getComponent().channel(this.targetChannelId).setNextValue(value); @@ -72,5 +72,4 @@ public List> getOnSetNextWrites( public void onSetNextWrite(ThrowingConsumer callback) { this.getOnSetNextWrites().add(callback); } - } diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractDoc.java b/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractDoc.java index ca557567a4a..44be47af9d8 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractDoc.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractDoc.java @@ -1,7 +1,6 @@ package io.openems.edge.common.channel.internal; import java.util.List; -import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; @@ -129,28 +128,6 @@ public String getText() { return this.text; } - /** - * An object that holds information about the source of this Channel, i.e. a - * Modbus Register or REST-Api endpoint address. Defaults to null. - */ - private Object source = null; - - @Override - public AbstractDoc source(SOURCE source) throws IllegalArgumentException { - if (this.source != null && source != null && !Objects.equals(this.source, source)) { - throw new IllegalArgumentException("Unable to set source [" + source.toString() - + "]. Channel already has a source [" + this.source.toString() + "]"); - } - this.source = source; - return this.self(); - } - - @Override - @SuppressWarnings("unchecked") - public SOURCE getSource() { - return (SOURCE) this.source; - } - @Override public Unit getUnit() { return Unit.NONE; diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractReadChannel.java b/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractReadChannel.java index 707e02eaf0c..9547774ee8b 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractReadChannel.java +++ b/io.openems.edge.common/src/io/openems/edge/common/channel/internal/AbstractReadChannel.java @@ -259,4 +259,27 @@ private boolean validateType(OpenemsType expected, OpenemsType actual) { public CircularTreeMap> getPastValues() { return this.pastValues; } + + /** + * An object that holds information about the source of this Channel, i.e. a + * Modbus Register or REST-Api endpoint address. Defaults to null. + */ + private Object source = null; + + @Override + public void setMetaInfo(SOURCE source) throws IllegalArgumentException { + if (this.source != null && source != null && !Objects.equals(this.source, source)) { + throw new IllegalArgumentException("Unable to set meta info [" + source.toString() + "]." // + + " Channel [" + this.address() + "] already has one [" + this.source.toString() + "]. " // + + "Hint: Possibly you are trying to map a single Channel to multiple Modbus Registers. " // + + "If this is on purpose, you can manually provide a `ChannelMetaInfoReadAndWrite` object."); + } + this.source = source; + } + + @Override + @SuppressWarnings("unchecked") + public SOURCE getMetaInfo() { + return (SOURCE) this.source; + } } diff --git a/io.openems.edge.common/src/io/openems/edge/common/component/AbstractOpenemsComponent.java b/io.openems.edge.common/src/io/openems/edge/common/component/AbstractOpenemsComponent.java index 15439bdcf01..df9d5672f01 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/component/AbstractOpenemsComponent.java +++ b/io.openems.edge.common/src/io/openems/edge/common/component/AbstractOpenemsComponent.java @@ -1,5 +1,6 @@ package io.openems.edge.common.component; +import java.lang.reflect.Array; import java.util.Collection; import java.util.Dictionary; import java.util.Map; @@ -24,6 +25,7 @@ import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.types.EdgeConfig; import io.openems.common.types.EdgeConfig.Factory.Property; +import io.openems.common.types.OpenemsType; import io.openems.common.utils.JsonUtils; import io.openems.edge.common.channel.Channel; import io.openems.edge.common.channel.Doc; @@ -283,13 +285,25 @@ private void addChannelsForProperties(ObjectClassDefinition ocd, Dictionary 1) { + // Arrays with more than one value can only be stored as string + channelType = OpenemsType.STRING; + } else { + channelType = property.getType(); + } + + // Create Channel String channelName = PROPERTY_CHANNEL_ID_PREFIX + CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, property.getId().replace(".", "_")); Channel channel = this.channels .get(io.openems.edge.common.channel.ChannelId.channelIdUpperToCamel(channelName)); if (channel == null) { // Channel does not already exist -> create new Channel - AbstractDoc doc = Doc.of(property.getType()); + AbstractDoc doc = Doc.of(channelType); doc.persistencePriority(PersistencePriority.MEDIUM); io.openems.edge.common.channel.ChannelId channelId = new io.openems.edge.common.channel.ChannelId() { @@ -307,11 +321,16 @@ public Doc doc() { } // Set the Value - Object value = TypeUtils.getAsType(property.getType(), properties.get(property.getId())); + Object value = null; + try { + value = TypeUtils.getAsType(channelType, properties.get(property.getId())); + } catch (IllegalArgumentException e) { + // can be ignored + } if (value == null) { try { - value = JsonUtils.getAsType(property.getType(), property.getDefaultValue()); - } catch (OpenemsNamedException e) { + value = JsonUtils.getAsType(channelType, property.getDefaultValue()); + } catch (OpenemsNamedException | IllegalArgumentException e) { this.logError(this.log, "Unable to parse Property [" + property.getId() + "] value [" + property.getDefaultValue() + "] to [" + property.getType() + "]: " + e.getMessage()); } diff --git a/io.openems.edge.common/src/io/openems/edge/common/component/ComponentManager.java b/io.openems.edge.common/src/io/openems/edge/common/component/ComponentManager.java index 08dc3de5cff..61a33592750 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/component/ComponentManager.java +++ b/io.openems.edge.common/src/io/openems/edge/common/component/ComponentManager.java @@ -21,7 +21,7 @@ public interface ComponentManager extends OpenemsComponent, JsonApi, ClockProvider { public enum ChannelId implements io.openems.edge.common.channel.ChannelId { - CONFIG_NOT_ACTIVATED(Doc.of(Level.WARNING) // + CONFIG_NOT_ACTIVATED(Doc.of(Level.FAULT) // .text("A configured OpenEMS Component was not activated")), // DUPLICATED_COMPONENT_ID(Doc.of(Level.FAULT) // .text("Configuration has duplicated Component-IDs")), // diff --git a/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java b/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java index 75a74781123..4249795c2b8 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java +++ b/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java @@ -1,5 +1,6 @@ package io.openems.edge.common.type; +import java.lang.reflect.Array; import java.util.Arrays; import java.util.Optional; @@ -34,6 +35,15 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu if (value instanceof Enum) { value = ((Enum) value).ordinal(); } + // Extract value from Array + if (type != OpenemsType.STRING && value != null && value.getClass().isArray()) { + if (Array.getLength(value) == 1) { + return TypeUtils.getAsType(type, Array.get(value, 0)); + } else { + return null; + } + } + switch (type) { case BOOLEAN: if (value == null) { diff --git a/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readonly/Config.java b/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readonly/Config.java index 0522770c554..56c67020d85 100644 --- a/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readonly/Config.java +++ b/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readonly/Config.java @@ -29,7 +29,7 @@ int maxConcurrentConnections() default AbstractModbusTcpApi.DEFAULT_MAX_CONCURRENT_CONNECTIONS; @AttributeDefinition(name = "Components target filter", description = "This is auto-generated by 'Component-IDs'.") - String Component_target() default ""; + String Component_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Api Modbus/TCP Read-Only [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readwrite/Config.java b/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readwrite/Config.java index e09f00761dd..744d65b22bf 100644 --- a/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readwrite/Config.java +++ b/io.openems.edge.controller.api.modbus/src/io/openems/edge/controller/api/modbus/readwrite/Config.java @@ -32,7 +32,7 @@ int maxConcurrentConnections() default AbstractModbusTcpApi.DEFAULT_MAX_CONCURRENT_CONNECTIONS; @AttributeDefinition(name = "Components target filter", description = "This is auto-generated by 'Component-IDs'.") - String Component_target() default ""; + String Component_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Api Modbus/TCP Read-Write [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.ess.activepowervoltagecharacteristic/src/io/openems/edge/controller/ess/activepowervoltagecharacteristic/Config.java b/io.openems.edge.controller.ess.activepowervoltagecharacteristic/src/io/openems/edge/controller/ess/activepowervoltagecharacteristic/Config.java index 158272853a6..1f8f2dbf7e6 100644 --- a/io.openems.edge.controller.ess.activepowervoltagecharacteristic/src/io/openems/edge/controller/ess/activepowervoltagecharacteristic/Config.java +++ b/io.openems.edge.controller.ess.activepowervoltagecharacteristic/src/io/openems/edge/controller/ess/activepowervoltagecharacteristic/Config.java @@ -33,10 +33,10 @@ int waitForHysteresis() default 20; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Meter target filter", description = "This is auto-generated by 'Meter-ID'.") - String meter_target() default ""; + String meter_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Voltage Active Power Characteristic [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.ess.fixactivepower/src/io/openems/edge/controller/ess/fixactivepower/Config.java b/io.openems.edge.controller.ess.fixactivepower/src/io/openems/edge/controller/ess/fixactivepower/Config.java index a96a2c0f766..b302e32d3df 100644 --- a/io.openems.edge.controller.ess.fixactivepower/src/io/openems/edge/controller/ess/fixactivepower/Config.java +++ b/io.openems.edge.controller.ess.fixactivepower/src/io/openems/edge/controller/ess/fixactivepower/Config.java @@ -27,7 +27,7 @@ int power(); @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Fix Active Power [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/Config.java b/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/Config.java index 70bfe474066..ab7f180ef23 100644 --- a/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/Config.java +++ b/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/Config.java @@ -46,10 +46,10 @@ int sellToGridLimitRampPercentage() default 2; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Meter target filter", description = "This is auto-generated by 'Grid-Meter-ID'.") - String meter_target() default ""; + String meter_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Grid Optimized Charge [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.ess.hybrid.surplusfeedtogrid/src/io/openems/edge/controller/ess/hybrid/surplusfeedtogrid/Config.java b/io.openems.edge.controller.ess.hybrid.surplusfeedtogrid/src/io/openems/edge/controller/ess/hybrid/surplusfeedtogrid/Config.java index 90d02ebb3cb..0ec46dff0ac 100644 --- a/io.openems.edge.controller.ess.hybrid.surplusfeedtogrid/src/io/openems/edge/controller/ess/hybrid/surplusfeedtogrid/Config.java +++ b/io.openems.edge.controller.ess.hybrid.surplusfeedtogrid/src/io/openems/edge/controller/ess/hybrid/surplusfeedtogrid/Config.java @@ -21,7 +21,7 @@ String ess_id() default "ess0"; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Hybrid Surplus-Feed-To-Grid [{id}]"; diff --git a/io.openems.edge.controller.ess.linearpowerband/src/io/openems/edge/controller/ess/linearpowerband/Config.java b/io.openems.edge.controller.ess.linearpowerband/src/io/openems/edge/controller/ess/linearpowerband/Config.java index b3d7d7510d1..95994691c4f 100644 --- a/io.openems.edge.controller.ess.linearpowerband/src/io/openems/edge/controller/ess/linearpowerband/Config.java +++ b/io.openems.edge.controller.ess.linearpowerband/src/io/openems/edge/controller/ess/linearpowerband/Config.java @@ -33,7 +33,7 @@ StartDirection startDirection() default StartDirection.CHARGE; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Linear Power Band [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.ess.reactivepowervoltagecharacteristic/src/io/openems/edge/controller/ess/reactivepowervoltagecharacteristic/Config.java b/io.openems.edge.controller.ess.reactivepowervoltagecharacteristic/src/io/openems/edge/controller/ess/reactivepowervoltagecharacteristic/Config.java index f0d6fe260a4..e76ace58e97 100644 --- a/io.openems.edge.controller.ess.reactivepowervoltagecharacteristic/src/io/openems/edge/controller/ess/reactivepowervoltagecharacteristic/Config.java +++ b/io.openems.edge.controller.ess.reactivepowervoltagecharacteristic/src/io/openems/edge/controller/ess/reactivepowervoltagecharacteristic/Config.java @@ -33,10 +33,10 @@ int waitForHysteresis() default 20; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Meter target filter", description = "This is auto-generated by 'Meter-ID'.") - String meter_target() default ""; + String meter_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Voltage Reactive Power Characteristic [{id}]"; diff --git a/io.openems.edge.controller.ess.selltogridlimit/src/io/openems/edge/controller/symmetric/selltogridlimit/Config.java b/io.openems.edge.controller.ess.selltogridlimit/src/io/openems/edge/controller/symmetric/selltogridlimit/Config.java index 9dd2f9f47ca..aa62195b354 100644 --- a/io.openems.edge.controller.ess.selltogridlimit/src/io/openems/edge/controller/symmetric/selltogridlimit/Config.java +++ b/io.openems.edge.controller.ess.selltogridlimit/src/io/openems/edge/controller/symmetric/selltogridlimit/Config.java @@ -27,10 +27,10 @@ int maximumSellToGridPower(); @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Meter target filter", description = "This is auto-generated by 'Grid-Meter-ID'.") - String meter_target() default ""; + String meter_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Ess Sell-to-Grid Limit [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.controller.evcs/src/io/openems/edge/controller/evcs/Config.java b/io.openems.edge.controller.evcs/src/io/openems/edge/controller/evcs/Config.java index c138fb33585..7797b90efcb 100644 --- a/io.openems.edge.controller.evcs/src/io/openems/edge/controller/evcs/Config.java +++ b/io.openems.edge.controller.evcs/src/io/openems/edge/controller/evcs/Config.java @@ -45,7 +45,7 @@ int energySessionLimit() default 0; @AttributeDefinition(name = "Evcs target filter", description = "This is auto-generated by 'Evcs-ID'.") - String evcs_target() default ""; + String evcs_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Electric Vehicle Charging Station [{id}]"; diff --git a/io.openems.edge.controller.symmetric.balancingschedule/src/io/openems/edge/controller/symmetric/balancingschedule/Config.java b/io.openems.edge.controller.symmetric.balancingschedule/src/io/openems/edge/controller/symmetric/balancingschedule/Config.java index 29236446e88..adacbba5f6f 100644 --- a/io.openems.edge.controller.symmetric.balancingschedule/src/io/openems/edge/controller/symmetric/balancingschedule/Config.java +++ b/io.openems.edge.controller.symmetric.balancingschedule/src/io/openems/edge/controller/symmetric/balancingschedule/Config.java @@ -27,10 +27,10 @@ String schedule() default ""; @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Grid-Meter target filter", description = "This is auto-generated by 'Grid-Meter-ID'.") - String meter_target() default ""; + String meter_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Controller Balancing Schedule Symmetric [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/ComponentManagerImpl.java b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/ComponentManagerImpl.java index 4d30ba88478..ab81336f7c6 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/ComponentManagerImpl.java +++ b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/ComponentManagerImpl.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; +import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -323,6 +324,15 @@ protected CompletableFuture handleUpdateComponentConfigR throw OpenemsError.EDGE_UNABLE_TO_APPLY_CONFIG.exception(request.getComponentId(), config.getPid() + ": Properties is 'null'"); } + + // Reset all target properties to avoid missing old references + for (Enumeration k = properties.keys(); k.hasMoreElements();) { + String property = k.nextElement(); + if (property.endsWith(".target")) { + properties.put(property, "(enabled=true)"); + } + } + for (Property property : request.getProperties()) { // do not allow certain properties to be updated, like pid and service.pid if (!EdgeConfig.ignorePropertyKey(property.getName())) { diff --git a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/OsgiValidateWorker.java b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/OsgiValidateWorker.java index 458ba15e2fa..81c420e5712 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/OsgiValidateWorker.java +++ b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/OsgiValidateWorker.java @@ -1,12 +1,12 @@ package io.openems.edge.core.componentmanager; +import java.io.IOException; import java.util.Collection; import java.util.Dictionary; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -59,11 +59,6 @@ public class OsgiValidateWorker extends ComponentManagerWorker { */ private final Map defectiveComponents = new HashMap<>(); - /** - * Delays announcement of defective Components by one execution Cycle. - */ - private final Set lastDefectiveComponents = new HashSet<>(); - /** * Components with duplicated Component-IDs. */ @@ -94,18 +89,12 @@ private void findDefectiveComponents() { final Configuration[] configs = this.readEnabledConfigurations(); final Map defectiveComponents = new HashMap<>(); updateInactiveComponentsUsingScr(defectiveComponents, this.parent.serviceComponentRuntime); - updateInactiveComponentsUsingConfigurationAdmin(defectiveComponents, this.parent.getEnabledComponents(), - configs); + this.updateInactiveComponentsUsingConfigurationAdmin(defectiveComponents, this.parent.getEnabledComponents(), + configs, this.parent.serviceComponentRuntime); this.parent._setConfigNotActivated(!defectiveComponents.isEmpty()); synchronized (this.defectiveComponents) { this.defectiveComponents.clear(); - for (Entry c : defectiveComponents.entrySet()) { - if (this.lastDefectiveComponents.contains(c.getKey())) { - // Delay announcement of defective Components by one execution Cycle. - this.defectiveComponents.put(c.getKey(), c.getValue()); - } - } - this.lastDefectiveComponents.addAll(defectiveComponents.keySet()); + this.defectiveComponents.putAll(defectiveComponents); } } @@ -171,8 +160,8 @@ private static void updateInactiveComponentsUsingScr(Map defecti * * @param configs enabled {@link Configuration}s from {@link ConfigurationAdmin} */ - private static void updateInactiveComponentsUsingConfigurationAdmin(Map defectiveComponents, - List enabledComponents, Configuration[] configs) { + private void updateInactiveComponentsUsingConfigurationAdmin(Map defectiveComponents, + List enabledComponents, Configuration[] configs, ServiceComponentRuntime scr) { for (Configuration config : configs) { Dictionary properties; try { @@ -192,7 +181,21 @@ private static void updateInactiveComponentsUsingConfigurationAdmin(Map factoryPid.equals(description.name))) { + // Bundle exists -> try to restart Component + try { + this.parent.logInfo(this.log, "Trying to restart Component [" + componentId + "]"); + config.update(properties); + } catch (IOException e) { + e.printStackTrace(); + defectiveComponents.putIfAbsent(componentId, "Unable to restart: " + e.getMessage()); + } + } else { + // Bundle with this name does not exist + defectiveComponents.putIfAbsent(componentId, "Missing Bundle"); + } } } } diff --git a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/jsonrpc/ChannelExportXlsxResponse.java b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/jsonrpc/ChannelExportXlsxResponse.java index e2df52623dd..96dce3f11da 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/jsonrpc/ChannelExportXlsxResponse.java +++ b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/jsonrpc/ChannelExportXlsxResponse.java @@ -50,8 +50,8 @@ public class ChannelExportXlsxResponse extends Base64PayloadResponse { private static final int COL_VALUE = 1; private static final int COL_UNIT = 2; private static final int COL_DESCRIPTION = 3; - private static final int COL_ACCESS = 5; private static final int COL_SOURCE = 4; + private static final int COL_ACCESS = 5; public ChannelExportXlsxResponse(UUID id, OpenemsComponent component) throws OpenemsException { super(id, generatePayload(component)); @@ -118,12 +118,14 @@ protected static byte[] generatePayload(OpenemsComponent component) throws Opene ws.value(row, COL_UNIT, channel.channelDoc().getUnit().getSymbol()); ws.value(row, COL_DESCRIPTION, description); ws.value(row, COL_ACCESS, channel.channelDoc().getAccessMode().getAbbreviation()); - row++; - Object source = channel.channelDoc().getSource(); - if (source != null) { - ws.value(row, COL_SOURCE, source.toString()); + // Source + final Object readSource = channel.getMetaInfo(); + if (readSource != null) { + ws.value(row, COL_SOURCE, readSource.toString()); } + + row++; } } finally { if (wb != null) { @@ -172,8 +174,8 @@ private static int addSheetHeader(Workbook wb, Worksheet ws, OpenemsComponent co addTableHeader(wb, ws, row, COL_VALUE, "Value", 35); addTableHeader(wb, ws, row, COL_UNIT, "Unit", 20); addTableHeader(wb, ws, row, COL_DESCRIPTION, "Description", 25); + addTableHeader(wb, ws, row, COL_SOURCE, "Read Source", 20); addTableHeader(wb, ws, row, COL_ACCESS, "Access", 10); - addTableHeader(wb, ws, row, COL_SOURCE, "Source", 20); return ++row; } diff --git a/io.openems.edge.ess.adstec.storaxe/src/io/openems/edge/ess/adstec/storaxe/Config.java b/io.openems.edge.ess.adstec.storaxe/src/io/openems/edge/ess/adstec/storaxe/Config.java index 036cc7edac2..1fb04ab3055 100644 --- a/io.openems.edge.ess.adstec.storaxe/src/io/openems/edge/ess/adstec/storaxe/Config.java +++ b/io.openems.edge.ess.adstec.storaxe/src/io/openems/edge/ess/adstec/storaxe/Config.java @@ -27,7 +27,7 @@ int capacity() default 47000; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS ADS-TEC StoraXe [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.ess.byd.container/src/io/openems/edge/ess/byd/container/Config.java b/io.openems.edge.ess.byd.container/src/io/openems/edge/ess/byd/container/Config.java index 9dbe0869280..d35f27c5298 100644 --- a/io.openems.edge.ess.byd.container/src/io/openems/edge/ess/byd/container/Config.java +++ b/io.openems.edge.ess.byd.container/src/io/openems/edge/ess/byd/container/Config.java @@ -30,13 +30,13 @@ String modbus_id2(); @AttributeDefinition(name = "Modbus0 target filter", description = "This is auto-generated by 'Modbus-ID 0'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus1 target filter", description = "This is auto-generated by 'Modbus-ID 1'.") - String modbus1_target() default ""; + String modbus1_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus2 target filter", description = "This is auto-generated by 'Modbus-ID 2'.") - String modbus2_target() default ""; + String modbus2_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS FENECON BYD Container [{id}]"; } diff --git a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/ChannelManager.java b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/ChannelManager.java new file mode 100644 index 00000000000..3a5139195ac --- /dev/null +++ b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/ChannelManager.java @@ -0,0 +1,224 @@ +package io.openems.edge.ess.cluster; + +import java.util.List; +import java.util.function.BiConsumer; + +import io.openems.edge.common.channel.AbstractChannelListenerManager; +import io.openems.edge.common.channel.IntegerReadChannel; +import io.openems.edge.common.channel.LongReadChannel; +import io.openems.edge.common.channel.value.Value; +import io.openems.edge.common.sum.GridMode; +import io.openems.edge.common.type.TypeUtils; +import io.openems.edge.ess.api.AsymmetricEss; +import io.openems.edge.ess.api.ManagedSymmetricEss; +import io.openems.edge.ess.api.SymmetricEss; + +public class ChannelManager extends AbstractChannelListenerManager { + + private final EssClusterImpl parent; + + public ChannelManager(EssClusterImpl parent) { + this.parent = parent; + } + + /** + * Called on Component activate(). + * + * @param esss the List of {@link SymmetricEss} + */ + protected void activate(List esss) { + this.calculateGridMode(esss); + + this.calculateSoc(esss); + + this.calculateSumInteger(esss, SymmetricEss.ChannelId.ACTIVE_POWER); + this.calculateSumInteger(esss, SymmetricEss.ChannelId.REACTIVE_POWER); + this.calculateSumInteger(esss, SymmetricEss.ChannelId.MAX_APPARENT_POWER); + + this.calculateSumLong(esss, SymmetricEss.ChannelId.ACTIVE_CHARGE_ENERGY); + this.calculateSumLong(esss, SymmetricEss.ChannelId.ACTIVE_DISCHARGE_ENERGY); + + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.ACTIVE_POWER_L1); + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.ACTIVE_POWER_L2); + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.ACTIVE_POWER_L3); + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.REACTIVE_POWER_L1); + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.REACTIVE_POWER_L2); + this.calculateSumInteger(esss, AsymmetricEss.ChannelId.REACTIVE_POWER_L3); + + this.calculateSumInteger(esss, ManagedSymmetricEss.ChannelId.ALLOWED_CHARGE_POWER); + this.calculateSumInteger(esss, ManagedSymmetricEss.ChannelId.ALLOWED_DISCHARGE_POWER); + } + + /** + * Calculate effective Grid-Mode of {@link SymmetricEss}. + * + * @param esss the List of {@link SymmetricEss} + */ + private void calculateGridMode(List esss) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + int onGrids = 0; + int offGrids = 0; + for (SymmetricEss ess : esss) { + switch (ess.getGridMode()) { + case OFF_GRID: + offGrids++; + break; + case ON_GRID: + onGrids++; + break; + case UNDEFINED: + break; + } + } + + final GridMode result; + if (esss.size() == onGrids) { + result = GridMode.ON_GRID; + } else if (esss.size() == offGrids) { + result = GridMode.OFF_GRID; + } else { + result = GridMode.UNDEFINED; + } + this.parent._setGridMode(result); + }; + + for (SymmetricEss ess : esss) { + this.addOnChangeListener(ess, SymmetricEss.ChannelId.GRID_MODE, callback); + } + } + + /** + * Calculate weighted State-Of-Charge of {@link SymmetricEss}. + * + * @param esss the List of {@link SymmetricEss} + */ + private void calculateSoc(List esss) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + Integer socCapacity = null; + Integer totalCapacity = null; + for (SymmetricEss ess : esss) { + Value capacity = ess.getCapacity(); + Value soc = ess.getSoc(); + if (!capacity.isDefined() || !soc.isDefined()) { + continue; + } + socCapacity = TypeUtils.sum(socCapacity, soc.get() * capacity.get()); + totalCapacity = TypeUtils.sum(totalCapacity, capacity.get()); + } + + if (socCapacity != null && totalCapacity != null) { + this.parent._setSoc(Math.round(socCapacity / Float.valueOf(totalCapacity))); + } + }; + + this.addOnChangeListener(this.parent, SymmetricEss.ChannelId.CAPACITY, callback); + for (SymmetricEss ess : esss) { + this.addOnChangeListener(ess, SymmetricEss.ChannelId.SOC, callback); + } + } + + /** + * Sum up Integer Channels of {@link SymmetricEss}. + * + * @param esss the List of {@link SymmetricEss} + * @param channelId the SymmetricEss.ChannelId + */ + private void calculateSumInteger(List esss, SymmetricEss.ChannelId channelId) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + Integer result = null; + for (SymmetricEss ess : esss) { + IntegerReadChannel channel = ess.channel(channelId); + result = TypeUtils.sum(result, channel.getNextValue().get()); + } + + IntegerReadChannel channel = this.parent.channel(channelId); + channel.setNextValue(result); + }; + + for (SymmetricEss ess : esss) { + this.addOnChangeListener(ess, channelId, callback); + } + } + + /** + * Sum up Integer Channels of {@link ManagedSymmetricEss}. + * + * @param esss the List of {@link ManagedSymmetricEss} + * @param channelId the ManagedSymmetricEss.ChannelId + */ + private void calculateSumInteger(List esss, ManagedSymmetricEss.ChannelId channelId) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + Integer result = null; + for (SymmetricEss ess : esss) { + if (ess instanceof ManagedSymmetricEss) { + ManagedSymmetricEss e = (ManagedSymmetricEss) ess; + IntegerReadChannel channel = e.channel(channelId); + result = TypeUtils.sum(result, channel.getNextValue().get()); + } + } + + IntegerReadChannel channel = this.parent.channel(channelId); + channel.setNextValue(result); + }; + + for (SymmetricEss ess : esss) { + if (ess instanceof ManagedSymmetricEss) { + ManagedSymmetricEss e = (ManagedSymmetricEss) ess; + this.addOnChangeListener(e, channelId, callback); + } + } + } + + /** + * Sum up Integer Channels of {@link AsymmetricEss}. + * + * @param esss the List of {@link AsymmetricEss} + * @param channelId the AsymmetricEss.ChannelId + */ + private void calculateSumInteger(List esss, AsymmetricEss.ChannelId channelId) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + Integer result = null; + for (SymmetricEss ess : esss) { + if (ess instanceof AsymmetricEss) { + AsymmetricEss e = (AsymmetricEss) ess; + IntegerReadChannel channel = e.channel(channelId); + result = TypeUtils.sum(result, channel.getNextValue().get()); + } + } + + IntegerReadChannel channel = this.parent.channel(channelId); + channel.setNextValue(result); + }; + + for (SymmetricEss ess : esss) { + if (ess instanceof AsymmetricEss) { + AsymmetricEss e = (AsymmetricEss) ess; + this.addOnChangeListener(e, channelId, callback); + } + } + } + + /** + * Sum up Long Channels of {@link SymmetricEss}. + * + * @param esss the List of {@link SymmetricEss} + * @param channelId the SymmetricEss.ChannelId + */ + private void calculateSumLong(List esss, SymmetricEss.ChannelId channelId) { + final BiConsumer, Value> callback = (oldValue, newValue) -> { + Long result = null; + for (SymmetricEss ess : esss) { + LongReadChannel channel = ess.channel(channelId); + result = TypeUtils.sum(result, channel.getNextValue().get()); + } + + LongReadChannel channel = this.parent.channel(channelId); + channel.setNextValue(result); + }; + + for (SymmetricEss ess : esss) { + this.addOnChangeListener(ess, channelId, callback); + } + } + +} diff --git a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/Config.java b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/Config.java index a72a85a23ac..ded8b841a32 100644 --- a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/Config.java +++ b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/Config.java @@ -3,7 +3,7 @@ import org.osgi.service.metatype.annotations.AttributeDefinition; import org.osgi.service.metatype.annotations.ObjectClassDefinition; -@ObjectClassDefinition( // +@ObjectClassDefinition(// name = "ESS Cluster", // description = "Combines several energy storage systems to one.") @interface Config { diff --git a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssCluster.java b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssCluster.java index 29975f0d768..0a5b3447596 100644 --- a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssCluster.java +++ b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssCluster.java @@ -1,60 +1,16 @@ package io.openems.edge.ess.cluster; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.ConfigurationPolicy; -import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; -import org.osgi.service.event.Event; -import org.osgi.service.event.EventConstants; -import org.osgi.service.event.EventHandler; -import org.osgi.service.metatype.annotations.Designate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.openems.common.channel.AccessMode; -import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; -import io.openems.common.exceptions.OpenemsException; import io.openems.edge.common.channel.Doc; -import io.openems.edge.common.channel.calculate.CalculateAverage; -import io.openems.edge.common.channel.calculate.CalculateIntegerSum; -import io.openems.edge.common.channel.calculate.CalculateLongSum; -import io.openems.edge.common.component.AbstractOpenemsComponent; -import io.openems.edge.common.component.ComponentManager; import io.openems.edge.common.component.OpenemsComponent; -import io.openems.edge.common.event.EdgeEventConstants; import io.openems.edge.common.modbusslave.ModbusSlave; -import io.openems.edge.common.modbusslave.ModbusSlaveNatureTable; -import io.openems.edge.common.modbusslave.ModbusSlaveTable; import io.openems.edge.ess.api.AsymmetricEss; -import io.openems.edge.ess.api.CalculateGridMode; import io.openems.edge.ess.api.ManagedAsymmetricEss; import io.openems.edge.ess.api.ManagedSymmetricEss; import io.openems.edge.ess.api.MetaEss; import io.openems.edge.ess.api.SymmetricEss; -import io.openems.edge.ess.power.api.Power; - -@Designate(ocd = Config.class, factory = true) -@Component( // - name = "Ess.Cluster", // - immediate = true, // - configurationPolicy = ConfigurationPolicy.REQUIRE, // - property = { // - EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE // - }) -public class EssCluster extends AbstractOpenemsComponent implements ManagedAsymmetricEss, AsymmetricEss, - ManagedSymmetricEss, SymmetricEss, MetaEss, OpenemsComponent, EventHandler, ModbusSlave { - - private final Logger log = LoggerFactory.getLogger(EssCluster.class); - @Reference - private Power power = null; - - @Reference - protected ComponentManager componentManager; - - private Config config; +public interface EssCluster extends ManagedAsymmetricEss, AsymmetricEss, ManagedSymmetricEss, SymmetricEss, MetaEss, + OpenemsComponent, ModbusSlave { public enum ChannelId implements io.openems.edge.common.channel.ChannelId { ; @@ -70,161 +26,4 @@ public Doc doc() { } } - public EssCluster() { - super(// - OpenemsComponent.ChannelId.values(), // - SymmetricEss.ChannelId.values(), // - ManagedSymmetricEss.ChannelId.values(), // - AsymmetricEss.ChannelId.values(), // - ManagedAsymmetricEss.ChannelId.values(), // - ChannelId.values() // - ); - } - - @Activate - void activate(ComponentContext context, Config config) throws OpenemsException { - super.activate(context, config.id(), config.alias(), config.enabled()); - this.config = config; - } - - @Deactivate - protected void deactivate() { - super.deactivate(); - } - - @Override - public void handleEvent(Event event) { - if (!this.isEnabled()) { - return; - } - switch (event.getTopic()) { - - case EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE: - // TODO calculate channel values using onChangeListeners; do avoid possible lag - // of one Cycle - this.calculateChannelValues(); - break; - } - } - - /** - * Calculates the sum-value for each Channel. - */ - private void calculateChannelValues() { - final CalculateAverage soc = new CalculateAverage(); - final CalculateIntegerSum capacity = new CalculateIntegerSum(); - final CalculateGridMode gridMode = new CalculateGridMode(); - final CalculateIntegerSum activePower = new CalculateIntegerSum(); - - final CalculateIntegerSum allowedChargePower = new CalculateIntegerSum(); - final CalculateIntegerSum allowedDischargePower = new CalculateIntegerSum(); - - final CalculateIntegerSum reactivePower = new CalculateIntegerSum(); - final CalculateIntegerSum maxApparentPower = new CalculateIntegerSum(); - final CalculateLongSum activeChargeEnergy = new CalculateLongSum(); - final CalculateLongSum activeDischargeEnergy = new CalculateLongSum(); - - final CalculateIntegerSum activePowerL1 = new CalculateIntegerSum(); - final CalculateIntegerSum reactivePowerL1 = new CalculateIntegerSum(); - final CalculateIntegerSum activePowerL2 = new CalculateIntegerSum(); - final CalculateIntegerSum reactivePowerL2 = new CalculateIntegerSum(); - final CalculateIntegerSum activePowerL3 = new CalculateIntegerSum(); - final CalculateIntegerSum reactivePowerL3 = new CalculateIntegerSum(); - - for (String essId : this.config.ess_ids()) { - SymmetricEss ess; - try { - ess = this.componentManager.getComponent(essId); - } catch (OpenemsNamedException e) { - this.logError(this.log, e.getMessage()); - continue; - } - - soc.addValue(ess.getSocChannel()); - capacity.addValue(ess.getCapacityChannel()); - gridMode.addValue(ess.getGridModeChannel()); - activePower.addValue(ess.getActivePowerChannel()); - - reactivePower.addValue(ess.getReactivePowerChannel()); - maxApparentPower.addValue(ess.getMaxApparentPowerChannel()); - activeChargeEnergy.addValue(ess.getActiveChargeEnergyChannel()); - activeDischargeEnergy.addValue(ess.getActiveDischargeEnergyChannel()); - - if (ess instanceof AsymmetricEss) { - AsymmetricEss e = (AsymmetricEss) ess; - activePowerL1.addValue(e.getActivePowerL1Channel()); - reactivePowerL1.addValue(e.getReactivePowerL1Channel()); - activePowerL2.addValue(e.getActivePowerL2Channel()); - reactivePowerL2.addValue(e.getReactivePowerL2Channel()); - activePowerL3.addValue(e.getActivePowerL3Channel()); - reactivePowerL3.addValue(e.getReactivePowerL3Channel()); - } - - // Calculate allowed charge and discharge power - if (ess instanceof ManagedSymmetricEss) { - ManagedSymmetricEss e = (ManagedSymmetricEss) ess; - allowedChargePower.addValue(e.getAllowedChargePowerChannel()); - allowedDischargePower.addValue(e.getAllowedDischargePowerChannel()); - } - } - - // Set values - this._setSoc(soc.calculateRounded()); - this._setCapacity(capacity.calculate()); - this._setGridMode(gridMode.calculate()); - this._setActivePower(activePower.calculate()); - this._setReactivePower(reactivePower.calculate()); - this._setMaxApparentPower(maxApparentPower.calculate()); - this._setActiveChargeEnergy(activeChargeEnergy.calculate()); - this._setActiveDischargeEnergy(activeDischargeEnergy.calculate()); - - this._setAllowedChargePower(allowedChargePower.calculate()); - this._setAllowedDischargePower(allowedDischargePower.calculate()); - - this._setActivePowerL1(activePowerL1.calculate()); - this._setReactivePowerL1(reactivePowerL1.calculate()); - this._setActivePowerL2(activePowerL2.calculate()); - this._setReactivePowerL2(reactivePowerL2.calculate()); - this._setActivePowerL3(activePowerL3.calculate()); - this._setReactivePowerL3(reactivePowerL3.calculate()); - } - - @Override - public void applyPower(int activePower, int reactivePower) throws OpenemsException { - throw new OpenemsException("EssClusterImpl.applyPower() should never be called."); - } - - @Override - public void applyPower(int activePowerL1, int reactivePowerL1, int activePowerL2, int reactivePowerL2, - int activePowerL3, int reactivePowerL3) throws OpenemsException { - throw new OpenemsException("EssClusterImpl.applyPower() should never be called."); - } - - @Override - public int getPowerPrecision() { - // TODO kleinstes gemeinsames Vielfaches von PowerPrecision - return 0; - } - - @Override - public synchronized String[] getEssIds() { - return this.config.ess_ids(); - } - - @Override - public Power getPower() { - return this.power; - } - - @Override - public ModbusSlaveTable getModbusSlaveTable(AccessMode accessMode) { - return new ModbusSlaveTable( // - OpenemsComponent.getModbusSlaveNatureTable(accessMode), // - SymmetricEss.getModbusSlaveNatureTable(accessMode), // - ManagedSymmetricEss.getModbusSlaveNatureTable(accessMode), // - AsymmetricEss.getModbusSlaveNatureTable(accessMode), // - ManagedAsymmetricEss.getModbusSlaveNatureTable(accessMode), // - ModbusSlaveNatureTable.of(EssCluster.class, accessMode, 300) // - .build()); - } } diff --git a/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssClusterImpl.java b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssClusterImpl.java new file mode 100644 index 00000000000..f84f3c240e4 --- /dev/null +++ b/io.openems.edge.ess.cluster/src/io/openems/edge/ess/cluster/EssClusterImpl.java @@ -0,0 +1,140 @@ +package io.openems.edge.ess.cluster; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.metatype.annotations.Designate; + +import io.openems.common.channel.AccessMode; +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.modbusslave.ModbusSlave; +import io.openems.edge.common.modbusslave.ModbusSlaveNatureTable; +import io.openems.edge.common.modbusslave.ModbusSlaveTable; +import io.openems.edge.common.type.TypeUtils; +import io.openems.edge.ess.api.AsymmetricEss; +import io.openems.edge.ess.api.ManagedAsymmetricEss; +import io.openems.edge.ess.api.ManagedSymmetricEss; +import io.openems.edge.ess.api.MetaEss; +import io.openems.edge.ess.api.SymmetricEss; +import io.openems.edge.ess.power.api.Power; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Ess.Cluster", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +public class EssClusterImpl extends AbstractOpenemsComponent implements EssCluster, ManagedAsymmetricEss, AsymmetricEss, + ManagedSymmetricEss, SymmetricEss, MetaEss, OpenemsComponent, ModbusSlave { + + private final ChannelManager channelManager = new ChannelManager(this); + private final List esss = new CopyOnWriteArrayList<>(); + + @Reference + private Power power = null; + + @Reference + private ConfigurationAdmin cm; + + @Reference(// + policy = ReferencePolicy.DYNAMIC, // + policyOption = ReferencePolicyOption.GREEDY, // + cardinality = ReferenceCardinality.MULTIPLE, // + target = "(&(enabled=true)(!(service.factoryPid=Ess.Cluster)))") + protected synchronized void addEss(ManagedSymmetricEss ess) { + this.esss.add(ess); + this.channelManager.deactivate(); + this.channelManager.activate(this.esss); + } + + protected synchronized void removeEss(ManagedSymmetricEss ess) { + this.esss.remove(ess); + this.channelManager.deactivate(); + this.channelManager.activate(this.esss); + } + + private Config config; + + public EssClusterImpl() { + super(// + OpenemsComponent.ChannelId.values(), // + SymmetricEss.ChannelId.values(), // + ManagedSymmetricEss.ChannelId.values(), // + AsymmetricEss.ChannelId.values(), // + ManagedAsymmetricEss.ChannelId.values(), // + EssCluster.ChannelId.values() // + ); + } + + @Activate + private void activate(ComponentContext context, Config config) throws OpenemsException { + this.config = config; + super.activate(context, config.id(), config.alias(), config.enabled()); + if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "Ess", config.ess_ids())) { + return; + } + this.channelManager.activate(this.esss); + } + + @Deactivate + protected void deactivate() { + this.channelManager.deactivate(); + super.deactivate(); + } + + @Override + public void applyPower(int activePower, int reactivePower) throws OpenemsException { + throw new OpenemsException("EssClusterImpl.applyPower() should never be called."); + } + + @Override + public void applyPower(int activePowerL1, int reactivePowerL1, int activePowerL2, int reactivePowerL2, + int activePowerL3, int reactivePowerL3) throws OpenemsException { + throw new OpenemsException("EssClusterImpl.applyPower() should never be called."); + } + + @Override + public int getPowerPrecision() { + Integer result = null; + for (SymmetricEss ess : this.esss) { + if (ess instanceof ManagedSymmetricEss) { + result = TypeUtils.min(result, ((ManagedSymmetricEss) ess).getPowerPrecision()); + } + } + return TypeUtils.orElse(result, 1); + } + + @Override + public synchronized String[] getEssIds() { + return this.config.ess_ids(); + } + + @Override + public Power getPower() { + return this.power; + } + + @Override + public ModbusSlaveTable getModbusSlaveTable(AccessMode accessMode) { + return new ModbusSlaveTable(// + OpenemsComponent.getModbusSlaveNatureTable(accessMode), // + SymmetricEss.getModbusSlaveNatureTable(accessMode), // + ManagedSymmetricEss.getModbusSlaveNatureTable(accessMode), // + AsymmetricEss.getModbusSlaveNatureTable(accessMode), // + ManagedAsymmetricEss.getModbusSlaveNatureTable(accessMode), // + ModbusSlaveNatureTable.of(EssClusterImpl.class, accessMode, 300) // + .build()); + } +} diff --git a/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/EssClusterTest.java b/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/EssClusterTest.java new file mode 100644 index 00000000000..4ac12e4d513 --- /dev/null +++ b/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/EssClusterTest.java @@ -0,0 +1,159 @@ +package io.openems.edge.ess.cluster; + +import org.junit.Test; + +import io.openems.common.types.ChannelAddress; +import io.openems.edge.common.sum.GridMode; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; +import io.openems.edge.ess.test.DummyManagedAsymmetricEss; +import io.openems.edge.ess.test.DummyManagedSymmetricEss; +import io.openems.edge.ess.test.DummyPower; + +public class EssClusterTest { + + private static final String CLUSTER_ID = "ess0"; + private static final String ESS1_ID = "ess1"; + private static final String ESS2_ID = "ess2"; + private static final String ESS3_ID = "ess3"; + + private static final ChannelAddress CLUSTER_GRID_MODE = new ChannelAddress(CLUSTER_ID, "GridMode"); + private static final ChannelAddress ESS1_GRID_MODE = new ChannelAddress(ESS1_ID, "GridMode"); + private static final ChannelAddress ESS2_GRID_MODE = new ChannelAddress(ESS2_ID, "GridMode"); + private static final ChannelAddress ESS3_GRID_MODE = new ChannelAddress(ESS3_ID, "GridMode"); + + private static final ChannelAddress CLUSTER_SOC = new ChannelAddress(CLUSTER_ID, "Soc"); + private static final ChannelAddress ESS1_SOC = new ChannelAddress(ESS1_ID, "Soc"); + private static final ChannelAddress ESS2_SOC = new ChannelAddress(ESS2_ID, "Soc"); + + private static final ChannelAddress CLUSTER_ACTIVE_POWER = new ChannelAddress(CLUSTER_ID, "ActivePower"); + private static final ChannelAddress ESS1_ACTIVE_POWER = new ChannelAddress(ESS1_ID, "ActivePower"); + private static final ChannelAddress ESS2_ACTIVE_POWER = new ChannelAddress(ESS2_ID, "ActivePower"); + + private static final ChannelAddress CLUSTER_REACTIVE_POWER = new ChannelAddress(CLUSTER_ID, "ReactivePower"); + private static final ChannelAddress ESS1_REACTIVE_POWER = new ChannelAddress(ESS1_ID, "ReactivePower"); + private static final ChannelAddress ESS2_REACTIVE_POWER = new ChannelAddress(ESS2_ID, "ReactivePower"); + + private static final ChannelAddress CLUSTER_ACTIVE_POWER_L1 = new ChannelAddress(CLUSTER_ID, "ActivePowerL1"); + private static final ChannelAddress ESS2_ACTIVE_POWER_L1 = new ChannelAddress(ESS2_ID, "ActivePowerL1"); + + private static final ChannelAddress CLUSTER_ACTIVE_CHARGE_ENERGY = new ChannelAddress(CLUSTER_ID, + "ActiveChargeEnergy"); + private static final ChannelAddress ESS1_ACTIVE_CHARGE_ENERGY = new ChannelAddress(ESS1_ID, "ActiveChargeEnergy"); + private static final ChannelAddress ESS2_ACTIVE_CHARGE_ENERGY = new ChannelAddress(ESS2_ID, "ActiveChargeEnergy"); + + private static final ChannelAddress CLUSTER_ALLOWED_CHARGE_POWER = new ChannelAddress(CLUSTER_ID, + "AllowedChargePower"); + private static final ChannelAddress ESS1_ALLOWED_CHARGE_POWER = new ChannelAddress(ESS1_ID, "AllowedChargePower"); + private static final ChannelAddress ESS2_ALLOWED_CHARGE_POWER = new ChannelAddress(ESS2_ID, "AllowedChargePower"); + + private static final ChannelAddress CLUSTER_ALLOWED_DISCHARGE_POWER = new ChannelAddress(CLUSTER_ID, + "AllowedDischargePower"); + private static final ChannelAddress ESS1_ALLOWED_DISCHARGE_POWER = new ChannelAddress(ESS1_ID, + "AllowedDischargePower"); + private static final ChannelAddress ESS2_ALLOWED_DISCHARGE_POWER = new ChannelAddress(ESS2_ID, + "AllowedDischargePower"); + + @Test + public void testCluster() throws Exception { + new ComponentTest(new EssClusterImpl()) // + .addReference("power", new DummyPower()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("addEss", new DummyManagedSymmetricEss(ESS1_ID)) // + .addReference("addEss", new DummyManagedAsymmetricEss(ESS2_ID)) // + .activate(MyConfig.create() // + .setId(CLUSTER_ID) // + .setEssIds(ESS1_ID, ESS2_ID) // + .build()) + .next(new TestCase() // + .input(ESS1_GRID_MODE, GridMode.ON_GRID) // + .input(ESS2_GRID_MODE, GridMode.ON_GRID) // + .output(CLUSTER_GRID_MODE, GridMode.ON_GRID) // + + .input(ESS1_ACTIVE_POWER, 1234) // + .input(ESS2_ACTIVE_POWER, 9876) // + .output(CLUSTER_ACTIVE_POWER, 11110) // + + .input(ESS1_REACTIVE_POWER, 1111) // + .input(ESS2_REACTIVE_POWER, 2222) // + .output(CLUSTER_REACTIVE_POWER, 3333) // + + .input(ESS1_ACTIVE_CHARGE_ENERGY, 1) // + .input(ESS2_ACTIVE_CHARGE_ENERGY, 2) // + .output(CLUSTER_ACTIVE_CHARGE_ENERGY, 3L) // + + .input(ESS2_ACTIVE_POWER_L1, 1111) // + .output(CLUSTER_ACTIVE_POWER_L1, 1111) // + + .input(ESS1_ALLOWED_CHARGE_POWER, 11) // + .input(ESS2_ALLOWED_CHARGE_POWER, 22) // + .output(CLUSTER_ALLOWED_CHARGE_POWER, 33) // + + .input(ESS1_ALLOWED_DISCHARGE_POWER, 10) // + .input(ESS2_ALLOWED_DISCHARGE_POWER, 20) // + .output(CLUSTER_ALLOWED_DISCHARGE_POWER, 30) // + ); + } + + @Test + public void testGridMode() throws Exception { + new ComponentTest(new EssClusterImpl()) // + .addReference("power", new DummyPower()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("addEss", new DummyManagedSymmetricEss(ESS1_ID)) // + .addReference("addEss", new DummyManagedSymmetricEss(ESS2_ID)) // + .addReference("addEss", new DummyManagedAsymmetricEss(ESS3_ID)) // + .activate(MyConfig.create() // + .setId(CLUSTER_ID) // + .setEssIds(ESS1_ID, ESS2_ID, ESS3_ID) // + .build()) + .next(new TestCase() // + .input(ESS1_GRID_MODE, GridMode.ON_GRID) // + .input(ESS2_GRID_MODE, GridMode.ON_GRID) // + .input(ESS3_GRID_MODE, GridMode.ON_GRID) // + .output(CLUSTER_GRID_MODE, GridMode.ON_GRID) // + ) // + .next(new TestCase() // + .input(ESS1_GRID_MODE, GridMode.OFF_GRID) // + .input(ESS2_GRID_MODE, GridMode.OFF_GRID) // + .input(ESS3_GRID_MODE, GridMode.OFF_GRID) // + .output(CLUSTER_GRID_MODE, GridMode.OFF_GRID) // + ) // + .next(new TestCase() // + .input(ESS1_GRID_MODE, GridMode.OFF_GRID) // + .input(ESS2_GRID_MODE, GridMode.OFF_GRID) // + .input(ESS3_GRID_MODE, GridMode.UNDEFINED) // + .output(CLUSTER_GRID_MODE, GridMode.UNDEFINED) // + ) // + ; + } + + @Test + public void testSoc() throws Exception { + new ComponentTest(new EssClusterImpl()) // + .addReference("power", new DummyPower()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("addEss", new DummyManagedSymmetricEss(ESS1_ID).withCapacity(50000)) // + .addReference("addEss", new DummyManagedSymmetricEss(ESS2_ID).withCapacity(3000)) // + .activate(MyConfig.create() // + .setId(CLUSTER_ID) // + .setEssIds(ESS1_ID, ESS2_ID) // + .build()) + .next(new TestCase() // + .input(ESS1_SOC, 20) // + .input(ESS2_SOC, 90) // + .output(CLUSTER_SOC, 24) // + ) // + .next(new TestCase() // + .input(ESS1_SOC, 21) // + .output(CLUSTER_SOC, 25) // + ) // + .next(new TestCase() // + .input(ESS1_SOC, 100) // + .output(CLUSTER_SOC, 99) // + ) // + ; + } + +} diff --git a/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/MyConfig.java b/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/MyConfig.java new file mode 100644 index 00000000000..cdb65aafc1a --- /dev/null +++ b/io.openems.edge.ess.cluster/test/io/openems/edge/ess/cluster/MyConfig.java @@ -0,0 +1,52 @@ +package io.openems.edge.ess.cluster; + +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id; + public boolean isOn; + public String outputChannelAddress; + public String[] essIds; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setEssIds(String... essIds) { + this.essIds = essIds; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String[] ess_ids() { + return this.builder.essIds; + } +} \ No newline at end of file diff --git a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/Config.java b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/Config.java index a303d9bfec1..532dc649231 100644 --- a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/Config.java +++ b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/Config.java @@ -27,7 +27,7 @@ int powerLimitOnPowerDecreaseCausedByOvertemperatureChannel() default 20_000; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Surplus Feed-In: State-of-Charge limit", description = "Start Surplus-feed-in if State-of-Charge is bigger than this limit") int surplusFeedInSocLimit() default 90; diff --git a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV1.java b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV1.java index 118c77be869..27991bdcf17 100644 --- a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV1.java +++ b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV1.java @@ -21,10 +21,10 @@ String ess_id() default "ess0"; @AttributeDefinition(name = "FENECON Commercial40 target filter", description = "This is auto-generated by 'FENECON Commercial40-ID'.") - String Ess_target() default ""; + String Ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID' from FENECON Commercial40.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS FENECON Commercial 40 DC Charger PV1 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV2.java b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV2.java index 8469cfb9175..719e4047ec4 100644 --- a/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV2.java +++ b/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/charger/ConfigPV2.java @@ -21,10 +21,10 @@ String ess_id() default "ess0"; @AttributeDefinition(name = "FENECON Commercial40 target filter", description = "This is auto-generated by 'FENECON Commercial40-ID'.") - String Ess_target() default ""; + String Ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID' from FENECON Commercial40.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS FENECON Commercial 40 DC Charger PV2 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.ess.generic/src/io/openems/edge/ess/generic/symmetric/Config.java b/io.openems.edge.ess.generic/src/io/openems/edge/ess/generic/symmetric/Config.java index 9dbf766a316..6268bb435db 100644 --- a/io.openems.edge.ess.generic/src/io/openems/edge/ess/generic/symmetric/Config.java +++ b/io.openems.edge.ess.generic/src/io/openems/edge/ess/generic/symmetric/Config.java @@ -29,10 +29,10 @@ String battery_id() default "battery0"; @AttributeDefinition(name = "Battery-Inverter target filter", description = "This is auto-generated by 'Battery-Inverter-ID'.") - String batteryInverter_target() default ""; + String batteryInverter_target() default "(enabled=true)"; @AttributeDefinition(name = "Battery target filter", description = "This is auto-generated by 'Battery-ID'.") - String battery_target() default ""; + String battery_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS Generic Managed Symmetric [{id}]"; diff --git a/io.openems.edge.ess.kaco.blueplanet.gridsave50/src/io/openems/edge/ess/kaco/blueplanet/gridsave50/Config.java b/io.openems.edge.ess.kaco.blueplanet.gridsave50/src/io/openems/edge/ess/kaco/blueplanet/gridsave50/Config.java index be61a406aa5..5399d53926b 100644 --- a/io.openems.edge.ess.kaco.blueplanet.gridsave50/src/io/openems/edge/ess/kaco/blueplanet/gridsave50/Config.java +++ b/io.openems.edge.ess.kaco.blueplanet.gridsave50/src/io/openems/edge/ess/kaco/blueplanet/gridsave50/Config.java @@ -23,7 +23,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Watchdog", description = "Sets the watchdog timer interval in seconds, 0=disable") int watchdoginterval() default 60; @@ -32,7 +32,7 @@ String battery_id() default "bms0"; @AttributeDefinition(name = "Battery target filter", description = "This is auto-generated by 'Battery-ID'.") - String Battery_target() default ""; + String Battery_target() default "(enabled=true)"; @AttributeDefinition(name = "Kaco Software Version", description = "Software Version running on the inverter.") Version sw_version() default Version.VERSION_5_34; diff --git a/io.openems.edge.ess.mr.gridcon/src/io/openems/edge/ess/mr/gridcon/Config.java b/io.openems.edge.ess.mr.gridcon/src/io/openems/edge/ess/mr/gridcon/Config.java index 20c2eec8b17..9fc90f2bc43 100644 --- a/io.openems.edge.ess.mr.gridcon/src/io/openems/edge/ess/mr/gridcon/Config.java +++ b/io.openems.edge.ess.mr.gridcon/src/io/openems/edge/ess/mr/gridcon/Config.java @@ -51,7 +51,7 @@ float cos_phi_setpoint_2() default 0.95f; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "MR Gridcon PCS [{id}]"; } diff --git a/io.openems.edge.ess.sinexcel/src/io/openems/edge/ess/sinexcel/Config.java b/io.openems.edge.ess.sinexcel/src/io/openems/edge/ess/sinexcel/Config.java index 7c61508a2c4..a01ba78d612 100644 --- a/io.openems.edge.ess.sinexcel/src/io/openems/edge/ess/sinexcel/Config.java +++ b/io.openems.edge.ess.sinexcel/src/io/openems/edge/ess/sinexcel/Config.java @@ -22,13 +22,13 @@ String modbus_id(); @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Battery-ID", description = "ID of Battery.") String battery_id(); @AttributeDefinition(name = "Battery target filter", description = "This is auto-generated by 'Battery-ID'.") - String Battery_target() default ""; + String Battery_target() default "(enabled=true)"; @AttributeDefinition(name = "Topping charge", description = "The topping charge voltage is the voltage that the battery supposed to finally reach in the charging procedure") int toppingCharge() default 4370; diff --git a/io.openems.edge.ess.sma/src/io/openems/edge/sma/Config.java b/io.openems.edge.ess.sma/src/io/openems/edge/sma/Config.java index b5fa93ca51e..e72126322a3 100644 --- a/io.openems.edge.ess.sma/src/io/openems/edge/sma/Config.java +++ b/io.openems.edge.ess.sma/src/io/openems/edge/sma/Config.java @@ -27,7 +27,7 @@ int modbusUnitId() default 3; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "ESS SMA SunnyIsland 6.0H [{id}]"; diff --git a/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigPeakShaving.java b/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigPeakShaving.java index 5a8411b4be9..a3569309497 100644 --- a/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigPeakShaving.java +++ b/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigPeakShaving.java @@ -29,7 +29,7 @@ String[] evcs_ids() default { "evcs0", "evcs1" }; @AttributeDefinition(name = "Evcs target filter", description = "This is auto-generated by 'Evcs-IDs'.") - String Evcs_target() default ""; + String Evcs_target() default "(enabled=true)"; @AttributeDefinition(name = "Ess-ID", description = "ID of Ess device.") String ess_id() default "ess0"; diff --git a/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigSelfConsumption.java b/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigSelfConsumption.java index 568153c2c58..c55a0b111e2 100644 --- a/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigSelfConsumption.java +++ b/io.openems.edge.evcs.cluster/src/io/openems/edge/evcs/cluster/ConfigSelfConsumption.java @@ -26,7 +26,7 @@ String[] evcs_ids() default { "evcs0", "evcs1" }; @AttributeDefinition(name = "Evcs target filter", description = "This is auto-generated by 'Evcs-IDs'.") - String Evcs_target() default ""; + String Evcs_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "EVCS Cluster Self Consumption [{id}]"; diff --git a/io.openems.edge.evcs.goe.chargerhome/.project b/io.openems.edge.evcs.goe.chargerhome/.project index 13eb07b172f..8d11c0c459e 100644 --- a/io.openems.edge.evcs.goe.chargerhome/.project +++ b/io.openems.edge.evcs.goe.chargerhome/.project @@ -1,6 +1,6 @@ - io.openems.edge.evcs.keba.kecontact + io.openems.edge.evcs.goe.chargerhome diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java index f206a79fcda..5cbf85f2fc5 100644 --- a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java @@ -151,8 +151,8 @@ public void handleEvent(Event event) { this.maxCurrent = cableCurrent > 0 && cableCurrent < this.config.maxHwCurrent() // ? cableCurrent // : this.config.maxHwCurrent(); - this._setMinimumHardwarePower(this.minCurrent * phases * 230); - this._setMaximumHardwarePower(this.maxCurrent * phases * 230); + this._setMinimumHardwarePower(this.minCurrent / 1000 * phases * 230); + this._setMaximumHardwarePower(this.maxCurrent / 1000 * phases * 230); // Energy this.channel(GoeChannelId.ENERGY_TOTAL).setNextValue(JsonUtils.getAsInt(json, "eto") * 100); diff --git a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config1.java b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config1.java index b53263862fe..f3b1f61a1eb 100644 --- a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config1.java +++ b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config1.java @@ -21,10 +21,10 @@ String ess_id() default "ess0"; @AttributeDefinition(name = "FENECON DESS ESS target filter", description = "This is auto-generated by 'FENECON DESS ESS-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID' from FENECON DESS ESS.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON DESS Charger 1 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config2.java b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config2.java index e9b49e78177..7ec0f55b0c3 100644 --- a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config2.java +++ b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/charger/Config2.java @@ -21,10 +21,10 @@ String ess_id() default "ess0"; @AttributeDefinition(name = "FENECON DESS ESS target filter", description = "This is auto-generated by 'FENECON DESS ESS-ID'.") - String ess_target() default ""; + String ess_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID' from FENECON DESS ESS.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON DESS Charger 2 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/ess/Config.java b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/ess/Config.java index ee7626c56fa..c7d01b6dcdc 100644 --- a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/ess/Config.java +++ b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/ess/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON DESS ESS [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/gridmeter/Config.java b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/gridmeter/Config.java index d4bb73f6ec3..8a8881cbc73 100644 --- a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/gridmeter/Config.java +++ b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/gridmeter/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON DESS Grid-Meter [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/pvmeter/Config.java b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/pvmeter/Config.java index 4d59f0af9bc..6ac70bc04a8 100644 --- a/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/pvmeter/Config.java +++ b/io.openems.edge.fenecon.dess/src/io/openems/edge/fenecon/dess/pvmeter/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON DESS PV-Meter [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/ResetChannelSources.java b/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/ResetChannelSources.java deleted file mode 100644 index 96491ae6e84..00000000000 --- a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/ResetChannelSources.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.openems.edge.fenecon.dess; - -import io.openems.edge.common.channel.ChannelId; -import io.openems.edge.meter.api.AsymmetricMeter; -import io.openems.edge.meter.api.SymmetricMeter; - -/** - * Reset Channel sources to avoid 'Unable to add Modbus mapping' errors on - * running all tests at once. - */ -public class ResetChannelSources { - - public static void run() { - resetChannelSources(SymmetricMeter.ChannelId.values()); - resetChannelSources(AsymmetricMeter.ChannelId.values()); - } - - private static void resetChannelSources(ChannelId[] channelIds) { - for (ChannelId channelId : channelIds) { - channelId.doc().source(null); - } - } - -} diff --git a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/gridmeter/FeneconDessGridMeterTest.java b/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/gridmeter/FeneconDessGridMeterTest.java index a3445cf1877..4b5739d5c2e 100644 --- a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/gridmeter/FeneconDessGridMeterTest.java +++ b/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/gridmeter/FeneconDessGridMeterTest.java @@ -1,23 +1,16 @@ package io.openems.edge.fenecon.dess.gridmeter; -import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.test.ComponentTest; import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.fenecon.dess.ResetChannelSources; public class FeneconDessGridMeterTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new FeneconDessGridMeterImpl()) // diff --git a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/pvmeter/FeneconDessPvMeterTest.java b/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/pvmeter/FeneconDessPvMeterTest.java index c2b525b208c..6ea702965b8 100644 --- a/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/pvmeter/FeneconDessPvMeterTest.java +++ b/io.openems.edge.fenecon.dess/test/io/openems/edge/fenecon/dess/pvmeter/FeneconDessPvMeterTest.java @@ -1,23 +1,16 @@ package io.openems.edge.fenecon.dess.pvmeter; -import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.test.ComponentTest; import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.fenecon.dess.ResetChannelSources; public class FeneconDessPvMeterTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new FeneconDessPvMeterImpl()) // diff --git a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/Config.java b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/Config.java index f54373309a7..2a0eca43e76 100644 --- a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/Config.java +++ b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/Config.java @@ -29,7 +29,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON Mini ESS [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImpl.java b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImpl.java index ad918ab5647..2ccafdffdca 100644 --- a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImpl.java +++ b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImpl.java @@ -25,9 +25,9 @@ import io.openems.common.types.OpenemsType; import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent; import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ChannelMetaInfoReadAndWrite; import io.openems.edge.bridge.modbus.api.ElementToChannelConverter; import io.openems.edge.bridge.modbus.api.ElementToChannelOffsetConverter; -import io.openems.edge.bridge.modbus.api.ModbusChannelSource; import io.openems.edge.bridge.modbus.api.ModbusProtocol; import io.openems.edge.bridge.modbus.api.element.BitsWordElement; import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement; @@ -456,23 +456,30 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { m(FeneconMiniEss.ChannelId.RTC_SECOND, new UnsignedWordElement(9019))), // new FC16WriteRegistersTask(30526, // m(FeneconMiniEss.ChannelId.GRID_MAX_CHARGE_CURRENT, new UnsignedWordElement(30526), - ElementToChannelConverter.SCALE_FACTOR_2, ModbusChannelSource.IGNORE_DUPLICATED_SOURCE), // + ElementToChannelConverter.SCALE_FACTOR_2, + new ChannelMetaInfoReadAndWrite(30126, 30526)), // m(FeneconMiniEss.ChannelId.GRID_MAX_DISCHARGE_CURRENT, new UnsignedWordElement(30527), ElementToChannelConverter.SCALE_FACTOR_2, - ModbusChannelSource.IGNORE_DUPLICATED_SOURCE)), // + new ChannelMetaInfoReadAndWrite(30127, 30527))), // new FC16WriteRegistersTask(30558, // - m(FeneconMiniEss.ChannelId.SETUP_MODE, new UnsignedWordElement(30558))), // + m(FeneconMiniEss.ChannelId.SETUP_MODE, new UnsignedWordElement(30558), + new ChannelMetaInfoReadAndWrite(30157, 30558))), // new FC16WriteRegistersTask(30559, // - m(FeneconMiniEss.ChannelId.PCS_MODE, new UnsignedWordElement(30559))), // + m(FeneconMiniEss.ChannelId.PCS_MODE, new UnsignedWordElement(30559), + new ChannelMetaInfoReadAndWrite(30158, 30559))), // new FC3ReadRegistersTask(30126, Priority.LOW, // m(FeneconMiniEss.ChannelId.GRID_MAX_CHARGE_CURRENT, new UnsignedWordElement(30126), - ElementToChannelConverter.SCALE_FACTOR_2), // + ElementToChannelConverter.SCALE_FACTOR_2, + new ChannelMetaInfoReadAndWrite(30126, 30526)), // m(FeneconMiniEss.ChannelId.GRID_MAX_DISCHARGE_CURRENT, new UnsignedWordElement(30127), - ElementToChannelConverter.SCALE_FACTOR_2), // + ElementToChannelConverter.SCALE_FACTOR_2, + new ChannelMetaInfoReadAndWrite(30127, 30527)), // new DummyRegisterElement(30128, 30156), // - m(FeneconMiniEss.ChannelId.SETUP_MODE, new UnsignedWordElement(30157)), // - m(FeneconMiniEss.ChannelId.PCS_MODE, new UnsignedWordElement(30158)), // + m(FeneconMiniEss.ChannelId.SETUP_MODE, new UnsignedWordElement(30157), + new ChannelMetaInfoReadAndWrite(30157, 30558)), // + m(FeneconMiniEss.ChannelId.PCS_MODE, new UnsignedWordElement(30158), + new ChannelMetaInfoReadAndWrite(30158, 30559)), // new DummyRegisterElement(30159, 30165), // m(SymmetricEss.ChannelId.GRID_MODE, new UnsignedWordElement(30166), new ElementToChannelConverter( diff --git a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/gridmeter/Config.java b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/gridmeter/Config.java index 7ded7eadaff..75ec57e6c77 100644 --- a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/gridmeter/Config.java +++ b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/gridmeter/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON Mini Grid-Meter [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/pvmeter/Config.java b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/pvmeter/Config.java index 09570b1fa46..8351a3056ee 100644 --- a/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/pvmeter/Config.java +++ b/io.openems.edge.fenecon.mini/src/io/openems/edge/fenecon/mini/pvmeter/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON Mini PV-Meter [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ResetChannelSources.java b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ResetChannelSources.java deleted file mode 100644 index 19cd761747a..00000000000 --- a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ResetChannelSources.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.openems.edge.fenecon.mini; - -import io.openems.edge.common.channel.ChannelId; -import io.openems.edge.meter.api.AsymmetricMeter; -import io.openems.edge.meter.api.SymmetricMeter; - -/** - * Reset Channel sources to avoid 'Unable to add Modbus mapping' errors on - * running all tests at once. - */ -public class ResetChannelSources { - - public static void run() { - resetChannelSources(SymmetricMeter.ChannelId.values()); - resetChannelSources(AsymmetricMeter.ChannelId.values()); - } - - private static void resetChannelSources(ChannelId[] channelIds) { - for (ChannelId channelId : channelIds) { - channelId.doc().source(null); - } - } - -} diff --git a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImplTest.java b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImplTest.java index 83c7da9f0b3..5e56a0c884c 100644 --- a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImplTest.java +++ b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/ess/FeneconMiniEssImplTest.java @@ -1,6 +1,5 @@ package io.openems.edge.fenecon.mini.ess; -import org.junit.Before; import org.junit.Test; import io.openems.common.types.ChannelAddress; @@ -10,7 +9,6 @@ import io.openems.edge.ess.api.SinglePhase; import io.openems.edge.ess.test.DummyPower; import io.openems.edge.ess.test.ManagedSymmetricEssTest; -import io.openems.edge.fenecon.mini.ResetChannelSources; import io.openems.edge.fenecon.mini.ess.statemachine.StateMachine.State; public class FeneconMiniEssImplTest { @@ -23,11 +21,6 @@ public class FeneconMiniEssImplTest { private static final ChannelAddress ESS_PCS_MODE = new ChannelAddress(ESS_ID, "PcsMode"); private static final ChannelAddress ESS_SETUP_MODE = new ChannelAddress(ESS_ID, "SetupMode"); - @Before - public void before() { - ResetChannelSources.run(); - } - /** * Tests activating write-mode when it was not activated before. * diff --git a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/gridmeter/FeneconMiniGridMeterTest.java b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/gridmeter/FeneconMiniGridMeterTest.java index 1a99eeaf70d..123a45c4039 100644 --- a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/gridmeter/FeneconMiniGridMeterTest.java +++ b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/gridmeter/FeneconMiniGridMeterTest.java @@ -1,23 +1,16 @@ package io.openems.edge.fenecon.mini.gridmeter; -import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.test.ComponentTest; import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.fenecon.mini.ResetChannelSources; public class FeneconMiniGridMeterTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new FeneconMiniGridMeterImpl()) // diff --git a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/pvmeter/FeneconMiniPvMeterTest.java b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/pvmeter/FeneconMiniPvMeterTest.java index ee8abe2505a..69141cef2aa 100644 --- a/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/pvmeter/FeneconMiniPvMeterTest.java +++ b/io.openems.edge.fenecon.mini/test/io/openems/edge/fenecon/mini/pvmeter/FeneconMiniPvMeterTest.java @@ -1,23 +1,16 @@ package io.openems.edge.fenecon.mini.pvmeter; -import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; import io.openems.edge.common.test.ComponentTest; import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.fenecon.mini.ResetChannelSources; public class FeneconMiniPvMeterTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Before - public void before() { - ResetChannelSources.run(); - } - @Test public void test() throws Exception { new ComponentTest(new FeneconMiniPvMeterImpl()) // diff --git a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/Config.java b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/Config.java index 3b706eefc79..6366aa08fb2 100644 --- a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/Config.java +++ b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON Pro 9-12 Ess [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/FeneconProEss.java b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/FeneconProEss.java index 3c13565af3d..39ab7a2b6ca 100644 --- a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/FeneconProEss.java +++ b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/ess/FeneconProEss.java @@ -22,6 +22,7 @@ import io.openems.common.exceptions.OpenemsException; import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent; import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ChannelMetaInfoReadAndWrite; import io.openems.edge.bridge.modbus.api.ElementToChannelConverter; import io.openems.edge.bridge.modbus.api.ModbusProtocol; import io.openems.edge.bridge.modbus.api.element.BitsWordElement; @@ -438,12 +439,16 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { m(ProChannelId.RTC_MINUTE, new UnsignedWordElement(9018)), // m(ProChannelId.RTC_SECOND, new UnsignedWordElement(9019))), // new FC16WriteRegistersTask(30558, // - m(ProChannelId.SETUP_MODE, new UnsignedWordElement(30558))), // + m(ProChannelId.SETUP_MODE, new UnsignedWordElement(30558), + new ChannelMetaInfoReadAndWrite(30157, 30558))), // new FC16WriteRegistersTask(30559, // - m(ProChannelId.PCS_MODE, new UnsignedWordElement(30559))), // + m(ProChannelId.PCS_MODE, new UnsignedWordElement(30559), + new ChannelMetaInfoReadAndWrite(30158, 30559))), // new FC3ReadRegistersTask(30157, Priority.LOW, // - m(ProChannelId.SETUP_MODE, new UnsignedWordElement(30157)), // - m(ProChannelId.PCS_MODE, new UnsignedWordElement(30158)))// + m(ProChannelId.SETUP_MODE, new UnsignedWordElement(30157), + new ChannelMetaInfoReadAndWrite(30157, 30558)), // + m(ProChannelId.PCS_MODE, new UnsignedWordElement(30158), + new ChannelMetaInfoReadAndWrite(30158, 30559)))// ); } diff --git a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/pvmeter/Config.java b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/pvmeter/Config.java index 75633c9c7c8..c6396dc0c94 100644 --- a/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/pvmeter/Config.java +++ b/io.openems.edge.fenecon.pro/src/io/openems/edge/fenecon/pro/pvmeter/Config.java @@ -21,7 +21,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "FENECON Pro 9-12 PV Meter [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/Config.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/Config.java index 518dfbaee11..de19443cd71 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/Config.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/Config.java @@ -26,7 +26,7 @@ int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "GoodWe Battery Inverter [{id}]"; } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java index ba74ffbc1f2..30621c534b9 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/AbstractGoodWeEtCharger.java @@ -18,7 +18,7 @@ import io.openems.edge.timedata.api.utils.CalculateEnergyFromPower; public abstract class AbstractGoodWeEtCharger extends AbstractOpenemsModbusComponent - implements EssDcCharger, OpenemsComponent, TimedataProvider, EventHandler { + implements GoodWeEtCharger, EssDcCharger, OpenemsComponent, TimedataProvider, EventHandler { private final CalculateEnergyFromPower calculateActualEnergy = new CalculateEnergyFromPower(this, EssDcCharger.ChannelId.ACTUAL_ENERGY); @@ -27,7 +27,7 @@ protected AbstractGoodWeEtCharger() { super(// OpenemsComponent.ChannelId.values(), // EssDcCharger.ChannelId.values(), // - PvChannelId.values() // + GoodWeEtCharger.ChannelId.values() // ); } @@ -36,9 +36,9 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { int startAddress = this.getStartAddress(); return new ModbusProtocol(this, // new FC3ReadRegistersTask(startAddress, Priority.LOW, // - m(PvChannelId.V, new UnsignedWordElement(startAddress), // + m(GoodWeEtCharger.ChannelId.V, new UnsignedWordElement(startAddress), // ElementToChannelConverter.SCALE_FACTOR_MINUS_1), // - m(PvChannelId.I, new UnsignedWordElement(startAddress + 1), + m(GoodWeEtCharger.ChannelId.I, new UnsignedWordElement(startAddress + 1), ElementToChannelConverter.SCALE_FACTOR_MINUS_1)), new FC3ReadRegistersTask(startAddress + 2, Priority.HIGH, // m(EssDcCharger.ChannelId.ACTUAL_POWER, new UnsignedDoublewordElement(startAddress + 2)))); diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV1.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV1.java index d315d8f7a8c..96c2d68e32c 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV1.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV1.java @@ -23,7 +23,7 @@ String essOrBatteryInverter_id() default "batteryInverter0"; @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") - String essOrBatteryInverter_target() default ""; + String essOrBatteryInverter_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") String modbus_id() default "modbus0"; @@ -32,7 +32,7 @@ int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV1 [{id}]"; } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV2.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV2.java index 588e88ef3b2..61ffa3c1b7d 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV2.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/ConfigPV2.java @@ -23,7 +23,7 @@ String essOrBatteryInverter_id() default "batteryInverter0"; @AttributeDefinition(name = "GoodWe ESS or Battery-Inverter target filter", description = "This is auto-generated by 'GoodWe ESS or Battery-Inverter'.") - String essOrBatteryInverter_target() default ""; + String essOrBatteryInverter_target() default "(enabled=true)"; @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") String modbus_id() default "modbus0"; @@ -32,7 +32,7 @@ int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "GoodWe Charger PV2 [{id}]"; } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger.java new file mode 100644 index 00000000000..a71bc429c41 --- /dev/null +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger.java @@ -0,0 +1,29 @@ +package io.openems.edge.goodwe.charger; + +import io.openems.common.channel.AccessMode; +import io.openems.common.channel.Unit; +import io.openems.common.types.OpenemsType; +import io.openems.edge.common.channel.Doc; + +public interface GoodWeEtCharger { + + public enum ChannelId implements io.openems.edge.common.channel.ChannelId { + + V(Doc.of(OpenemsType.INTEGER) // + .unit(Unit.VOLT).accessMode(AccessMode.READ_ONLY)), + I(Doc.of(OpenemsType.INTEGER) // + .unit(Unit.AMPERE).accessMode(AccessMode.READ_ONLY)); + + private final Doc doc; + + private ChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + + } +} \ No newline at end of file diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv1.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger1.java similarity index 94% rename from io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv1.java rename to io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger1.java index f3fbbbd5ee7..7fe337112e1 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv1.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger1.java @@ -31,8 +31,8 @@ property = { // EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // }) -public class GoodWeChargerPv1 extends AbstractGoodWeEtCharger - implements EssDcCharger, OpenemsComponent, EventHandler, TimedataProvider { +public class GoodWeEtCharger1 extends AbstractGoodWeEtCharger + implements GoodWeEtCharger, EssDcCharger, OpenemsComponent, EventHandler, TimedataProvider { @Reference protected ConfigurationAdmin cm; @@ -48,7 +48,7 @@ protected void setModbus(BridgeModbus modbus) { super.setModbus(modbus); } - public GoodWeChargerPv1() { + public GoodWeEtCharger1() { super(); } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv2.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger2.java similarity index 94% rename from io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv2.java rename to io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger2.java index 007cc71b4de..4f95ecbec7a 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeChargerPv2.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/GoodWeEtCharger2.java @@ -31,8 +31,8 @@ property = { // EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE // }) -public class GoodWeChargerPv2 extends AbstractGoodWeEtCharger - implements EssDcCharger, OpenemsComponent, EventHandler, TimedataProvider { +public class GoodWeEtCharger2 extends AbstractGoodWeEtCharger + implements GoodWeEtCharger, EssDcCharger, OpenemsComponent, EventHandler, TimedataProvider { @Reference protected ConfigurationAdmin cm; @@ -48,7 +48,7 @@ protected void setModbus(BridgeModbus modbus) { super.setModbus(modbus); } - public GoodWeChargerPv2() { + public GoodWeEtCharger2() { super(); } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/PvChannelId.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/PvChannelId.java deleted file mode 100644 index a036d2419ac..00000000000 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/charger/PvChannelId.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.openems.edge.goodwe.charger; - -import io.openems.common.channel.AccessMode; -import io.openems.common.channel.Unit; -import io.openems.common.types.OpenemsType; -import io.openems.edge.common.channel.ChannelId; -import io.openems.edge.common.channel.Doc; - -public enum PvChannelId implements ChannelId { - V(Doc.of(OpenemsType.INTEGER) // - .unit(Unit.VOLT).accessMode(AccessMode.READ_ONLY)), - I(Doc.of(OpenemsType.INTEGER) // - .unit(Unit.AMPERE).accessMode(AccessMode.READ_ONLY)); - - private final Doc doc; - - private PvChannelId(Doc doc) { - this.doc = doc; - } - - @Override - public Doc doc() { - return this.doc; - } -} \ No newline at end of file diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/GoodWe.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/GoodWe.java index 976037ced22..e00f776188d 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/GoodWe.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/GoodWe.java @@ -9,8 +9,8 @@ import io.openems.edge.common.channel.value.Value; import io.openems.edge.common.component.OpenemsComponent; import io.openems.edge.goodwe.charger.AbstractGoodWeEtCharger; -import io.openems.edge.goodwe.charger.GoodWeChargerPv1; -import io.openems.edge.goodwe.charger.GoodWeChargerPv2; +import io.openems.edge.goodwe.charger.GoodWeEtCharger1; +import io.openems.edge.goodwe.charger.GoodWeEtCharger2; import io.openems.edge.goodwe.common.enums.AppModeIndex; import io.openems.edge.goodwe.common.enums.BatteryMode; import io.openems.edge.goodwe.common.enums.EmsPowerMode; @@ -29,14 +29,14 @@ public interface GoodWe extends OpenemsComponent { /** * Registers a GoodWe Charger. * - * @param charger either {@link GoodWeChargerPv1} or {@link GoodWeChargerPv2} + * @param charger either {@link GoodWeEtCharger1} or {@link GoodWeEtCharger2} */ public void addCharger(AbstractGoodWeEtCharger charger); /** * Unregisters a GoodWe Charger. * - * @param charger either {@link GoodWeChargerPv1} or {@link GoodWeChargerPv2} + * @param charger either {@link GoodWeEtCharger1} or {@link GoodWeEtCharger2} */ public void removeCharger(AbstractGoodWeEtCharger charger); diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/ess/Config.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/ess/Config.java index a9b5a243d3d..f82738e135f 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/ess/Config.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/ess/Config.java @@ -35,7 +35,7 @@ int maxBatteryPower() default 5_200; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "GoodWe ESS [{id}]"; } diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/Config.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/Config.java index 7806737472c..8bb032212a7 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/Config.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/Config.java @@ -26,7 +26,7 @@ int modbusUnitId() default GoodWeConstants.DEFAULT_UNIT_ID; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "GoodWe Grid-Meter [{id}]"; diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImplTest.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImplTest.java index f108c9c727e..8d6e7232e75 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImplTest.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImplTest.java @@ -7,7 +7,7 @@ import io.openems.edge.common.test.DummyConfigurationAdmin; import io.openems.edge.ess.test.DummyPower; import io.openems.edge.goodwe.GoodWeConstants; -import io.openems.edge.goodwe.charger.GoodWeChargerPv1; +import io.openems.edge.goodwe.charger.GoodWeEtCharger1; public class GoodWeBatteryInverterImplTest { @@ -19,7 +19,7 @@ public class GoodWeBatteryInverterImplTest { @Test public void testEt() throws Exception { - GoodWeChargerPv1 charger = new GoodWeChargerPv1(); + GoodWeEtCharger1 charger = new GoodWeEtCharger1(); new ComponentTest(charger) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv1Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv1Test.java index 107afa69ad8..6010779de36 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv1Test.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv1Test.java @@ -14,7 +14,7 @@ public class GoodWeChargerPv1Test { @Test public void test() throws Exception { - new ComponentTest(new GoodWeChargerPv1()) // + new ComponentTest(new GoodWeEtCharger1()) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // .activate(MyConfig.create() // diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv2Test.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv2Test.java index ca32d10a7f3..cfda586dc1f 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv2Test.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/charger/GoodWeChargerPv2Test.java @@ -14,7 +14,7 @@ public class GoodWeChargerPv2Test { @Test public void test() throws Exception { - new ComponentTest(new GoodWeChargerPv2()) // + new ComponentTest(new GoodWeEtCharger2()) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // .activate(MyConfig.create() // diff --git a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/ess/GoodWeEssImplTest.java b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/ess/GoodWeEssImplTest.java index 94953cd7d25..c2f46097ef7 100644 --- a/io.openems.edge.goodwe/test/io/openems/edge/goodwe/ess/GoodWeEssImplTest.java +++ b/io.openems.edge.goodwe/test/io/openems/edge/goodwe/ess/GoodWeEssImplTest.java @@ -8,7 +8,7 @@ import io.openems.edge.ess.test.DummyPower; import io.openems.edge.ess.test.ManagedSymmetricEssTest; import io.openems.edge.goodwe.GoodWeConstants; -import io.openems.edge.goodwe.charger.GoodWeChargerPv1; +import io.openems.edge.goodwe.charger.GoodWeEtCharger1; public class GoodWeEssImplTest { @@ -18,7 +18,7 @@ public class GoodWeEssImplTest { @Test public void testEt() throws Exception { - GoodWeChargerPv1 charger = new GoodWeChargerPv1(); + GoodWeEtCharger1 charger = new GoodWeEtCharger1(); new ComponentTest(charger) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // diff --git a/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/eight/Config.java b/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/eight/Config.java index a1088deb7ad..81da5f588c2 100644 --- a/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/eight/Config.java +++ b/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/eight/Config.java @@ -24,7 +24,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "IO KMtronic 8-Port Relay Board [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/four/Config.java b/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/four/Config.java index d20938818cb..9b7e024b47f 100644 --- a/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/four/Config.java +++ b/io.openems.edge.io.kmtronic/src/io/openems/edge/io/kmtronic/four/Config.java @@ -24,7 +24,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "IO KMtronic 4-Port Relay Board [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/Config.java b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/Config.java index 6f1e262b08d..6a4d0bac16a 100644 --- a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/Config.java +++ b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/Config.java @@ -16,6 +16,9 @@ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") boolean enabled() default true; + + @AttributeDefinition(name = "Read DataOut Initially", description = "Init Outputs with state from hardware initially") + boolean initOutputFromHardware() default true; String webconsole_configurationFactory_nameHint() default "IO RevolutionPi DigitalIO Board [{id}]"; diff --git a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDigitalIoDevice.java b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDigitalIoDevice.java index a6ed809bd00..fe0b8d7e6bc 100644 --- a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDigitalIoDevice.java +++ b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDigitalIoDevice.java @@ -1,6 +1,7 @@ package io.openems.edge.io.revpi; import java.io.IOException; +import java.util.Objects; import java.util.Optional; import org.clehne.revpi.dataio.DataInOut; @@ -29,24 +30,22 @@ @Component(// name = "IO.RevolutionPi.DigitalIO", // immediate = true, // - configurationPolicy = ConfigurationPolicy.REQUIRE, // - property = { // - EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE // - } // -) + configurationPolicy = ConfigurationPolicy.REQUIRE, property = { // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE, // + EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_EXECUTE_WRITE // + }) public class RevPiDigitalIoDevice extends AbstractOpenemsComponent implements DigitalOutput, DigitalInput, OpenemsComponent, EventHandler { private static final Object INVALIDATE_CHANNEL = null; private final Logger log = LoggerFactory.getLogger(RevPiDigitalIoDevice.class); - private final BooleanWriteChannel[] digitalOutputChannels; - private final BooleanReadChannel[] digitalInputChannels; + private final BooleanWriteChannel[] channelOut; + private final BooleanReadChannel[] channelIn; + private final BooleanReadChannel[] channelOutDbg; // maybe used, when two DIO boards are attached to the Revolutionpi - @SuppressWarnings("unused") private Config config = null; - private DataInOut revPiHardware; public RevPiDigitalIoDevice() { @@ -56,7 +55,7 @@ public RevPiDigitalIoDevice() { DigitalInput.ChannelId.values(), // RevPiDioChannelId.values() // ); - this.digitalOutputChannels = new BooleanWriteChannel[] { // + this.channelOut = new BooleanWriteChannel[] { // this.channel(RevPiDioChannelId.OUT_1), // this.channel(RevPiDioChannelId.OUT_2), // this.channel(RevPiDioChannelId.OUT_3), // @@ -73,7 +72,24 @@ public RevPiDigitalIoDevice() { this.channel(RevPiDioChannelId.OUT_14) // }; - this.digitalInputChannels = new BooleanReadChannel[] { // + this.channelOutDbg = new BooleanReadChannel[] { // + this.channel(RevPiDioChannelId.DEBUG_OUT1), // + this.channel(RevPiDioChannelId.DEBUG_OUT2), // + this.channel(RevPiDioChannelId.DEBUG_OUT3), // + this.channel(RevPiDioChannelId.DEBUG_OUT4), // + this.channel(RevPiDioChannelId.DEBUG_OUT5), // + this.channel(RevPiDioChannelId.DEBUG_OUT6), // + this.channel(RevPiDioChannelId.DEBUG_OUT7), // + this.channel(RevPiDioChannelId.DEBUG_OUT8), // + this.channel(RevPiDioChannelId.DEBUG_OUT9), // + this.channel(RevPiDioChannelId.DEBUG_OUT10), // + this.channel(RevPiDioChannelId.DEBUG_OUT11), // + this.channel(RevPiDioChannelId.DEBUG_OUT12), // + this.channel(RevPiDioChannelId.DEBUG_OUT13), // + this.channel(RevPiDioChannelId.DEBUG_OUT14) // + }; + + this.channelIn = new BooleanReadChannel[] { // this.channel(RevPiDioChannelId.IN_1), // this.channel(RevPiDioChannelId.IN_2), // this.channel(RevPiDioChannelId.IN_3), // @@ -91,68 +107,102 @@ public RevPiDigitalIoDevice() { }; } - private void deactivateAllWriteChannels() { - for (BooleanWriteChannel channel : this.digitalOutputChannels) { + private void setAllOutput(boolean setOn) { + for (BooleanWriteChannel ch : this.channelOut) { try { - channel.setNextWriteValue(Boolean.FALSE); + ch.setNextWriteValue(setOn); } catch (OpenemsNamedException e) { // ignore } } } - private void updateChannelValues() { + private void readOutputFromHardwareOnce() { + // read all digital out pins also, because pins have already been initialized + // from outside + for (int idx = 0; idx < this.channelOut.length; idx++) { + try { + boolean in = this.revPiHardware.getDataOut(idx + 1); + this.channelOut[idx].setNextWriteValue(in); + } catch (Exception e) { + this.logError(this.log, "Unable to update channel values ex: " + e.getMessage()); + this.channelOut[idx].setNextValue(INVALIDATE_CHANNEL); + } + } + } + + private void updateDataInChannels() { // read all digital in pins - for (int i = 0; i < this.digitalInputChannels.length; i++) { + for (int i = 0; i < this.channelIn.length; i++) { try { - boolean in = this.revPiHardware.getDataIn(i + 1); + boolean in = getData(i); Optional inOpt = Optional.ofNullable(in); - if (this.digitalInputChannels[i].value().asOptional().equals(inOpt)) { + if (this.channelIn[i].value().asOptional().equals(inOpt)) { // channel already in the desired state } else { - this.digitalInputChannels[i].setNextValue(in); + this.channelIn[i].setNextValue(in); } } catch (Exception e) { this.logError(this.log, "Unable to update channel values ex: " + e.getMessage()); - this.digitalInputChannels[i].setNextValue(INVALIDATE_CHANNEL); + this.channelIn[i].setNextValue(INVALIDATE_CHANNEL); } } } - private void installOnDataOutCallback(BooleanWriteChannel wc, final int idx) { - wc.onUpdate((newValue) -> { + /** + * NOTE data out will only be set if the channel value changes + */ + private void updateDataOutChannels() { + + // write new state to digital out pins + for (int idx = 0; idx < this.channelOut.length; idx++) { try { + Optional readValue = this.channelOut[idx].value().asOptional(); + Optional writeValue = this.channelOut[idx].getNextWriteValueAndReset(); + if (!writeValue.isPresent()) { + // no write value + continue; + } + if (Objects.equals(readValue, writeValue)) { + // read value = write value + continue; + } + if (this.revPiHardware != null) { - this.revPiHardware.setDataOut(idx + 1, newValue.orElse(false)); + this.revPiHardware.setDataOut(idx + 1, writeValue.get()); } + this.logInfo(this.log, this.channelOut[idx].channelId() + " " + writeValue.get()); + this.channelOut[idx].setNextValue(writeValue.get()); + } catch (Exception e) { - this.logError(this.log, "Unable to set data out " + (idx + 1)); + this.logError(this.log, "Unable to update channel out values ex: " + e.getMessage()); + this.channelOut[idx].setNextValue(INVALIDATE_CHANNEL); } - }); + } + } @Activate void activate(ComponentContext context, Config config) { super.activate(context, config.id(), config.alias(), config.enabled()); this.config = config; - - for (int i = 0; i < this.digitalOutputChannels.length; i++) { - this.installOnDataOutCallback(this.digitalOutputChannels[i], i); - } - this.deactivateAllWriteChannels(); this.revPiHardware = new DataInOut(); + if (this.config.initOutputFromHardware()) { + this.readOutputFromHardwareOnce(); + } else { + this.setAllOutput(false); + } } @Deactivate protected void deactivate() { - this.deactivateAllWriteChannels(); + this.setAllOutput(false); super.deactivate(); try { this.revPiHardware.close(); } catch (IOException e) { this.logError(this.log, "Exception on closing driver ex: " + e.getMessage()); - e.printStackTrace(); } this.revPiHardware = null; } @@ -164,44 +214,68 @@ public void handleEvent(Event event) { } switch (event.getTopic()) { case EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE: - this.updateChannelValues(); + this.eventBeforeProcessImage(); + break; + + case EdgeEventConstants.TOPIC_CYCLE_EXECUTE_WRITE: + this.eventExecuteWrite(); break; } } + /** + * Execute on Cycle Event "Before Process Image". + */ + private void eventBeforeProcessImage() { + this.updateDataInChannels(); + } + + /** + * Execute on Cycle Event "Execute Write". + */ + private void eventExecuteWrite() { + this.updateDataOutChannels(); + } + + /** + * @brief reads the data either from the given DATA IN hardware port + */ + private boolean getData(int idx) throws IOException { + return this.revPiHardware.getDataIn(idx + 1); + } + + private void appendBool(StringBuilder b, Optional val) { + if (val.isPresent()) { + if (val.get()) { + b.append("1"); + } else { + b.append("0"); + } + } else { + b.append("-"); + } + } + @Override public String debugLog() { StringBuilder b = new StringBuilder(); int i = 0; b.append("IN:"); - for (BooleanReadChannel channel : this.digitalInputChannels) { + for (BooleanReadChannel channel : this.channelIn) { Optional valueOpt = channel.value().asOptional(); - if (valueOpt.isPresent()) { - if (valueOpt.get()) { - b.append("1"); - } else { - b.append("0"); - } - } else { - b.append("-"); - } + this.appendBool(b, valueOpt); if ((i++) % 4 == 3) { b.append(" "); } } i = 0; b.append(" OUT:"); - for (BooleanWriteChannel channel : this.digitalOutputChannels) { + + this.channel(RevPiDioChannelId.DEBUG_OUT1); + + for (BooleanReadChannel channel : this.channelOutDbg) { Optional valueOpt = channel.value().asOptional(); - if (valueOpt.isPresent()) { - if (valueOpt.get()) { - b.append("1"); - } else { - b.append("0"); - } - } else { - b.append("-"); - } + this.appendBool(b, valueOpt); if ((i++) % 4 == 3) { b.append(" "); } @@ -211,12 +285,12 @@ public String debugLog() { @Override public BooleanReadChannel[] digitalInputChannels() { - return this.digitalInputChannels; + return this.channelIn; } @Override public BooleanWriteChannel[] digitalOutputChannels() { - return this.digitalOutputChannels; + return this.channelOut; } } diff --git a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDioChannelId.java b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDioChannelId.java index 80be6ed54aa..06aabc9956c 100644 --- a/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDioChannelId.java +++ b/io.openems.edge.io.revpi/src/io/openems/edge/io/revpi/RevPiDioChannelId.java @@ -3,11 +3,23 @@ import io.openems.common.channel.AccessMode; import io.openems.common.channel.Unit; import io.openems.common.types.OpenemsType; +import io.openems.edge.common.channel.BooleanDoc; +import io.openems.edge.common.channel.BooleanWriteChannel; import io.openems.edge.common.channel.ChannelId; import io.openems.edge.common.channel.Doc; public enum RevPiDioChannelId implements ChannelId { + /** + * Holds writes to ioX/Out1 for debugging. + * + *
    + *
  • Interface: KunbusRevPiDataIOModule + *
  • Type: Boolean + *
  • Range: On/Off + *
+ */ + DEBUG_OUT1(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out1. * @@ -17,10 +29,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_1(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_1(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT1))), // + /** + * Holds writes to ioX/Out2 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT2(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out2. * @@ -30,10 +51,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_2(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_2(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT2))), // + /** + * Holds writes to ioX/Out3 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT3(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out3. * @@ -43,10 +73,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_3(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_3(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT3))), // + /** + * Holds writes to ioX/Out4 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT4(Doc.of(OpenemsType.BOOLEAN)), /** * ioX/Out4. * @@ -56,10 +95,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_4(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_4(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT4))), // + /** + * Holds writes to ioX/Out5 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT5(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out5. * @@ -69,10 +117,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_5(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_5(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT5))), // + /** + * Holds writes to ioX/Out6 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT6(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out6. * @@ -82,10 +139,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_6(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_6(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT6))), // + /** + * Holds writes to ioX/Out7 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT7(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out7. * @@ -95,10 +161,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_7(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_7(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT7))), // + /** + * Holds writes to ioX/Out8 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT8(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out8. * @@ -108,10 +183,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_8(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_8(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT8))), // + /** + * Holds writes to ioX/Out9 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT9(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out9. * @@ -121,10 +205,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_9(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_9(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT9))), // + /** + * Holds writes to ioX/Out10 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT10(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out10. * @@ -134,10 +227,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_10(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_10(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT10))), // + /** + * Holds writes to ioX/Out11 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT11(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out11. * @@ -147,10 +249,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_11(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_11(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT11))), // + /** + * Holds writes to ioX/Out12 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT12(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out12. * @@ -160,10 +271,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_12(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_12(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT12))), // + /** + * Holds writes to ioX/Out13 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT13(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out13. * @@ -173,10 +293,19 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_13(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // - + OUT_13(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT13))), // + /** + * Holds writes to ioX/Out14 for debugging. + * + *
      + *
    • Interface: KunbusRevPiDataIOModule + *
    • Type: Boolean + *
    • Range: On/Off + *
    + */ + DEBUG_OUT14(Doc.of(OpenemsType.BOOLEAN)), // /** * ioX/Out14. * @@ -186,9 +315,9 @@ public enum RevPiDioChannelId implements ChannelId { *
  • Range: On/Off * */ - OUT_14(Doc.of(OpenemsType.BOOLEAN) // - .unit(Unit.NONE) // - .accessMode(AccessMode.READ_WRITE)), // + OUT_14(new BooleanDoc() // + .accessMode(AccessMode.READ_WRITE) // + .onInit(new BooleanWriteChannel.MirrorToDebugChannel(RevPiDioChannelId.DEBUG_OUT14))), // /** * ioX/In1. @@ -370,7 +499,7 @@ public enum RevPiDioChannelId implements ChannelId { */ IN_14(Doc.of(OpenemsType.BOOLEAN) // .unit(Unit.NONE) // - .accessMode(AccessMode.READ_ONLY)), // + .accessMode(AccessMode.READ_ONLY)) // ; private final Doc doc; diff --git a/io.openems.edge.io.wago/src/io/openems/edge/wago/Config.java b/io.openems.edge.io.wago/src/io/openems/edge/wago/Config.java index aeb29609177..6226e5ee637 100644 --- a/io.openems.edge.io.wago/src/io/openems/edge/wago/Config.java +++ b/io.openems.edge.io.wago/src/io/openems/edge/wago/Config.java @@ -27,7 +27,7 @@ String password() default "wago"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "IO WAGO Fieldbus Coupler 750-352 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.artemes.am2/src/io/openems/edge/meter/artemes/am2/Config.java b/io.openems.edge.meter.artemes.am2/src/io/openems/edge/meter/artemes/am2/Config.java index a2987c53e21..f7fff701591 100644 --- a/io.openems.edge.meter.artemes.am2/src/io/openems/edge/meter/artemes/am2/Config.java +++ b/io.openems.edge.meter.artemes.am2/src/io/openems/edge/meter/artemes/am2/Config.java @@ -27,7 +27,7 @@ int modbusUnitId(); @AttributeDefinition(name = "Modbus target filter", description = " This is auto-generated by 'Modbus-ID'") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Artemes AM-2 [{id}]"; diff --git a/io.openems.edge.meter.bcontrol.em300/src/io/openems/edge/meter/bcontrol/em300/Config.java b/io.openems.edge.meter.bcontrol.em300/src/io/openems/edge/meter/bcontrol/em300/Config.java index 2b88a3ff2e5..8358d843460 100644 --- a/io.openems.edge.meter.bcontrol.em300/src/io/openems/edge/meter/bcontrol/em300/Config.java +++ b/io.openems.edge.meter.bcontrol.em300/src/io/openems/edge/meter/bcontrol/em300/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter B-Control EM300 [{id}]"; } diff --git a/io.openems.edge.meter.carlo.gavazzi.em300/src/io/openems/edge/meter/carlo/gavazzi/em300/Config.java b/io.openems.edge.meter.carlo.gavazzi.em300/src/io/openems/edge/meter/carlo/gavazzi/em300/Config.java index dcbf9fcc7d4..3914be9b834 100644 --- a/io.openems.edge.meter.carlo.gavazzi.em300/src/io/openems/edge/meter/carlo/gavazzi/em300/Config.java +++ b/io.openems.edge.meter.carlo.gavazzi.em300/src/io/openems/edge/meter/carlo/gavazzi/em300/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Carlo Gavazzi EM300 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/Config.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/Config.java index 2d7666da4c4..74cffce7ed0 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/Config.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Janitza UMG 511 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/Config.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/Config.java index f07f74a4f35..cc79c8d9742 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/Config.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Janitza UMG 604 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/Config.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/Config.java index 299a726551f..aad641796ec 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/Config.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Janitza UMG 96RM-E [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.microcare.sdm630/src/io/openems/edge/meter/microcare/sdm630/Config.java b/io.openems.edge.meter.microcare.sdm630/src/io/openems/edge/meter/microcare/sdm630/Config.java index 185ef4e2723..81e71becb0c 100644 --- a/io.openems.edge.meter.microcare.sdm630/src/io/openems/edge/meter/microcare/sdm630/Config.java +++ b/io.openems.edge.meter.microcare.sdm630/src/io/openems/edge/meter/microcare/sdm630/Config.java @@ -27,7 +27,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Microcare SDM 630 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.pqplus.umd97/src/io/openems/edge/meter/pqplus/umd97/Config.java b/io.openems.edge.meter.pqplus.umd97/src/io/openems/edge/meter/pqplus/umd97/Config.java index 03bcb420336..a5cce62db9f 100644 --- a/io.openems.edge.meter.pqplus.umd97/src/io/openems/edge/meter/pqplus/umd97/Config.java +++ b/io.openems.edge.meter.pqplus.umd97/src/io/openems/edge/meter/pqplus/umd97/Config.java @@ -29,7 +29,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter PQ-Plus UMD 97 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.schneider.acti9.smartlink/src/io/openems/edge/meter/schneider/acti9/smartlink/Config.java b/io.openems.edge.meter.schneider.acti9.smartlink/src/io/openems/edge/meter/schneider/acti9/smartlink/Config.java index e4997615524..eff440fdddb 100644 --- a/io.openems.edge.meter.schneider.acti9.smartlink/src/io/openems/edge/meter/schneider/acti9/smartlink/Config.java +++ b/io.openems.edge.meter.schneider.acti9.smartlink/src/io/openems/edge/meter/schneider/acti9/smartlink/Config.java @@ -29,7 +29,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; @AttributeDefinition(name = "Invert Power", description = "Inverts all Power and current values. i.e. They are multiplied with -1.") boolean invert() default false; diff --git a/io.openems.edge.meter.sma.shm20/src/io/openems/edge/meter/sma/shm20/Config.java b/io.openems.edge.meter.sma.shm20/src/io/openems/edge/meter/sma/shm20/Config.java index b02bef7fe37..9c477ae2878 100644 --- a/io.openems.edge.meter.sma.shm20/src/io/openems/edge/meter/sma/shm20/Config.java +++ b/io.openems.edge.meter.sma.shm20/src/io/openems/edge/meter/sma/shm20/Config.java @@ -28,7 +28,7 @@ int modbusUnitId() default 3; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter SMA Sunny Home Manager 2.0 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/singlephase/Config.java b/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/singlephase/Config.java index bd4487a178f..e7f2f875d2e 100644 --- a/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/singlephase/Config.java +++ b/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/singlephase/Config.java @@ -36,7 +36,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Socomec Singlephase [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/threephase/Config.java b/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/threephase/Config.java index f46e6f1c84d..e5188cf84c6 100644 --- a/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/threephase/Config.java +++ b/io.openems.edge.meter.socomec/src/io/openems/edge/meter/socomec/threephase/Config.java @@ -32,7 +32,7 @@ boolean invert() default false; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Socomec Threephase [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/singlephase/SocomecMeterSinglephaseImplTest.java b/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/singlephase/SocomecMeterSinglephaseImplTest.java index 71a85065368..7967b80ee04 100644 --- a/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/singlephase/SocomecMeterSinglephaseImplTest.java +++ b/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/singlephase/SocomecMeterSinglephaseImplTest.java @@ -1,5 +1,6 @@ package io.openems.edge.meter.socomec.singlephase; +import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; @@ -13,9 +14,11 @@ public class SocomecMeterSinglephaseImplTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Test - public void test() throws Exception { - SocomecMeterSinglephaseImpl meter = new SocomecMeterSinglephaseImpl(); + private static SocomecMeterSinglephaseImpl meter; + + @Before + public void setup() throws Exception { + meter = new SocomecMeterSinglephaseImpl(); new ComponentTest(meter) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // @@ -26,12 +29,35 @@ public void test() throws Exception { .setInvert(false) // .setPhase(SinglePhase.L1) // .build()); // + } + @Test + public void testCountisE14() throws Exception { meter.identifiedCountisE14(); + } + + @Test + public void testCountisE23_E24_E27_E28() throws Exception { meter.identifiedCountisE23_E24_E27_E28(); + } + + @Test + public void testCountisE34_E44() throws Exception { meter.identifiedCountisE34_E44(); + } + + @Test + public void testDirisA10() throws Exception { meter.identifiedDirisA10(); + } + + @Test + public void testDirisA14() throws Exception { meter.identifiedDirisA14(); + } + + @Test + public void testDirisB30() throws Exception { meter.identifiedDirisB30(); } diff --git a/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/threephase/SocomecMeterThreephaseImplTest.java b/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/threephase/SocomecMeterThreephaseImplTest.java index edb86611ae6..01b0592aa6c 100644 --- a/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/threephase/SocomecMeterThreephaseImplTest.java +++ b/io.openems.edge.meter.socomec/test/io/openems/edge/meter/socomec/threephase/SocomecMeterThreephaseImplTest.java @@ -1,5 +1,6 @@ package io.openems.edge.meter.socomec.threephase; +import org.junit.Before; import org.junit.Test; import io.openems.edge.bridge.modbus.test.DummyModbusBridge; @@ -12,9 +13,11 @@ public class SocomecMeterThreephaseImplTest { private static final String METER_ID = "meter0"; private static final String MODBUS_ID = "modbus0"; - @Test - public void test() throws Exception { - SocomecMeterThreephaseImpl meter = new SocomecMeterThreephaseImpl(); + private static SocomecMeterThreephaseImpl meter; + + @Before + public void setup() throws Exception { + meter = new SocomecMeterThreephaseImpl(); new ComponentTest(meter) // .addReference("cm", new DummyConfigurationAdmin()) // .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // @@ -24,12 +27,35 @@ public void test() throws Exception { .setType(MeterType.GRID) // .setInvert(false) // .build()); // + } + @Test + public void testCountisE14() throws Exception { meter.identifiedCountisE14(); + } + + @Test + public void testCountisE23_E24_E27_E28() throws Exception { meter.identifiedCountisE23_E24_E27_E28(); + } + + @Test + public void testCountisE34_E44() throws Exception { meter.identifiedCountisE34_E44(); + } + + @Test + public void testDirisA10() throws Exception { meter.identifiedDirisA10(); + } + + @Test + public void testDirisA14() throws Exception { meter.identifiedDirisA14(); + } + + @Test + public void testDirisB30() throws Exception { meter.identifiedDirisB30(); } diff --git a/io.openems.edge.meter.virtual/src/io/openems/edge/meter/virtual/symmetric/subtract/Config.java b/io.openems.edge.meter.virtual/src/io/openems/edge/meter/virtual/symmetric/subtract/Config.java index e9ceaf9e516..f2e76ac8ee6 100644 --- a/io.openems.edge.meter.virtual/src/io/openems/edge/meter/virtual/symmetric/subtract/Config.java +++ b/io.openems.edge.meter.virtual/src/io/openems/edge/meter/virtual/symmetric/subtract/Config.java @@ -35,10 +35,10 @@ boolean addToSum() default false; @AttributeDefinition(name = "Minuend target filter", description = "This is auto-generated by 'Minuend-ID'.") - String minuend_target() default ""; + String minuend_target() default "(enabled=true)"; @AttributeDefinition(name = "Subtrahends target filter", description = "This is auto-generated by 'Subtrahends-IDs'.") - String subtrahends_target() default ""; + String subtrahends_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Virtual Symmetric Subtract [{id}]"; diff --git a/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/Config.java b/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/Config.java index 36999987a1c..94f194327e1 100644 --- a/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/Config.java +++ b/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/Config.java @@ -29,7 +29,7 @@ int modbusUnitId() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Meter Weidmueller 525 [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/MeterWeidmueller525.java b/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/MeterWeidmueller525.java index 369a57319bd..b4a51b2b2ff 100644 --- a/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/MeterWeidmueller525.java +++ b/io.openems.edge.meter.weidmueller/src/io/openems/edge/meter/weidmueller/MeterWeidmueller525.java @@ -138,7 +138,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { m(WeidmuellerChannelId.HARMONIC_THD_VOLT_L2N, new FloatDoublewordElement(19112)), // m(WeidmuellerChannelId.HARMONIC_THD_VOLT_L3N, new FloatDoublewordElement(19114)), // m(WeidmuellerChannelId.HARMONIC_THD_CURRENT_L1N, new FloatDoublewordElement(19116)), // - m(WeidmuellerChannelId.HARMONIC_THD_VOLT_L2N, new FloatDoublewordElement(19118)), // + m(WeidmuellerChannelId.HARMONIC_THD_CURRENT_L2N, new FloatDoublewordElement(19118)), // m(WeidmuellerChannelId.HARMONIC_THD_CURRENT_L3N, new FloatDoublewordElement(19120)))); } diff --git a/io.openems.edge.onewire.thermometer/src/io/openems/edge/onewire/thermometer/Config.java b/io.openems.edge.onewire.thermometer/src/io/openems/edge/onewire/thermometer/Config.java index 3dbcb330bf9..139856cb041 100644 --- a/io.openems.edge.onewire.thermometer/src/io/openems/edge/onewire/thermometer/Config.java +++ b/io.openems.edge.onewire.thermometer/src/io/openems/edge/onewire/thermometer/Config.java @@ -21,7 +21,7 @@ String bridge_id() default "onewire0"; @AttributeDefinition(name = "OneWire target filter", description = "This is auto-generated by 'OneWire-ID'.") - String bridge_target() default ""; + String bridge_target() default "(enabled=true)"; @AttributeDefinition(name = "Address", description = "Address of the OneWire thermometer.") String address(); diff --git a/io.openems.edge.predictor.similardaymodel/.classpath b/io.openems.edge.predictor.similardaymodel/.classpath new file mode 100644 index 00000000000..7a6fc254361 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/io.openems.edge.predictor.similardaymodel/.gitignore b/io.openems.edge.predictor.similardaymodel/.gitignore new file mode 100644 index 00000000000..c2b941a96de --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/.gitignore @@ -0,0 +1,2 @@ +/bin_test/ +/generated/ diff --git a/io.openems.edge.predictor.similardaymodel/.project b/io.openems.edge.predictor.similardaymodel/.project new file mode 100644 index 00000000000..c6bc91c6a06 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/.project @@ -0,0 +1,28 @@ + + + io.openems.edge.predictor.similardaymodel + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + diff --git a/io.openems.edge.predictor.similardaymodel/bnd.bnd b/io.openems.edge.predictor.similardaymodel/bnd.bnd new file mode 100644 index 00000000000..faf735d9dea --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/bnd.bnd @@ -0,0 +1,15 @@ +Bundle-Name: OpenEMS Edge Predictor Similarday-Model +Bundle-Vendor: FENECON GmbH +Bundle-License: https://opensource.org/licenses/EPL-2.0 +Bundle-Version: 1.0.0.${tstamp} + +-buildpath: \ + ${buildpath},\ + io.openems.common,\ + io.openems.edge.common,\ + io.openems.edge.controller.api,\ + io.openems.edge.predictor.api,\ + io.openems.edge.timedata.api + +-testpath: \ + ${testpath} \ No newline at end of file diff --git a/io.openems.edge.predictor.similardaymodel/readme.adoc b/io.openems.edge.predictor.similardaymodel/readme.adoc new file mode 100644 index 00000000000..edbd1f2da11 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/readme.adoc @@ -0,0 +1,18 @@ += Similarday-Model Predictor + +This predictor uses "Similar day technique" for prediction. +This particular implmentation requires mainly two inputs, which are +* Num of past weeks (n) +* The channels address data, which needs to predicted. + + + + +The similar-day models predicts by calculating the average of a 'n' number of previous period values. + +_example_: the next monday predictions values is equal to average of past n = 4 monday values. + +This predictor is mainly used for predicting the Consumption power and energy. And the Accuracy of the model is scientifically verified within https://openems.io/research/emsig/[EMSIG project^]. + + +https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.predictor.similardaymodel[Source Code icon:github[]] \ No newline at end of file diff --git a/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/Config.java b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/Config.java new file mode 100644 index 00000000000..420fa90f95d --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/Config.java @@ -0,0 +1,28 @@ +package io.openems.edge.predictor.similardaymodel; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(// + name = "Predictor Similarday-Model", // + description = "Implements Similarday-Model predictor") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "predictor0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "How many weeks?", description = "No of weeks the data is needed?") + int numOfWeeks() default 4; + + @AttributeDefinition(name = "Channel-Addresses", description = "List of Channel-Addresses this Predictor is used for, e.g. '*/ActivePower', '*/ActualPower'") + String[] channelAddresses() default { "_sum/ProductionActivePower", "_sum/ConsumptionActivePower" }; + + String webconsole_configurationFactory_nameHint() default "Predictor Similarday-Model [{id}]"; + +} diff --git a/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictor.java b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictor.java new file mode 100644 index 00000000000..6785fd3dff0 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictor.java @@ -0,0 +1,24 @@ +package io.openems.edge.predictor.similardaymodel; + +import io.openems.edge.common.channel.Doc; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.controller.api.Controller; + +public interface SimilarDayPredictor extends Controller, OpenemsComponent { + + public enum ChannelId implements io.openems.edge.common.channel.ChannelId { + ; + + private final Doc doc; + + private ChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } + } + +} diff --git a/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictorImpl.java b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictorImpl.java new file mode 100644 index 00000000000..8a292cdf768 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/src/io/openems/edge/predictor/similardaymodel/SimilarDayPredictorImpl.java @@ -0,0 +1,221 @@ +package io.openems.edge.predictor.similardaymodel; + +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.SortedMap; +import java.util.stream.Collectors; + +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.metatype.annotations.Designate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Sets; +import com.google.gson.JsonElement; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.types.ChannelAddress; +import io.openems.edge.common.component.ClockProvider; +import io.openems.edge.common.component.ComponentManager; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.controller.api.Controller; +import io.openems.edge.predictor.api.oneday.AbstractPredictor24Hours; +import io.openems.edge.predictor.api.oneday.Prediction24Hours; +import io.openems.edge.predictor.api.oneday.Predictor24Hours; +import io.openems.edge.timedata.api.Timedata; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Predictor.SimilardayModel", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) + +public class SimilarDayPredictorImpl extends AbstractPredictor24Hours implements Predictor24Hours, OpenemsComponent { + + private final Logger log = LoggerFactory.getLogger(SimilarDayPredictorImpl.class); + + public static final int NUM_OF_DAYS_OF_WEEK = 7; + public static final int PREDCTION_FOR_ONE_DAY = 0; + public static final int PREDCTION_FOR_TWO_DAY = 1; + public static final int PREDCTION_FOR_THREE_DAY = 2; + public static final int PREDCTION_FOR_FOUR_DAY = 3; + public static final int PREDCTION_FOR_FIVE_DAY = 4; + public static final int PREDCTION_FOR_SIX_DAY = 5; + public static final int PREDCTION_FOR_SEVEN_DAY = 6; + + @Reference + private Timedata timedata; + + protected Config config; + + @Reference + private ComponentManager componentManager; + + public SimilarDayPredictorImpl() throws OpenemsNamedException { + super(// + OpenemsComponent.ChannelId.values(), // + Controller.ChannelId.values(), // + SimilarDayPredictor.ChannelId.values() // + ); + } + + @Activate + protected void activate(ComponentContext context, Config config) throws OpenemsNamedException { + this.config = config; + super.activate(context, this.config.id(), this.config.alias(), this.config.enabled(), + this.config.channelAddresses()); + } + + @Deactivate + protected void deactivate() { + super.deactivate(); + } + + @Override + protected ClockProvider getClockProvider() { + return this.componentManager; + } + + @Override + protected Prediction24Hours createNewPrediction(ChannelAddress channelAddress) { + + ZonedDateTime now = ZonedDateTime.now(this.componentManager.getClock()); + // From now time to Last 4 weeks + ZonedDateTime fromDate = now.minus(this.config.numOfWeeks(), ChronoUnit.WEEKS); + + final SortedMap> queryResult; + + // Query database + try { + queryResult = this.timedata.queryHistoricData(null, fromDate, now, Sets.newHashSet(channelAddress), + 900 /* seconds per 15 minutes */); + } catch (OpenemsNamedException e) { + this.logError(this.log, e.getMessage()); + e.printStackTrace(); + return Prediction24Hours.EMPTY; + } + + // Extract data + List result = queryResult.values().stream() // + .map(m -> m.values()) // + // extract JsonElement values as flat stream + .flatMap(Collection::stream) // + // convert JsonElement to Integer + .map(v -> { + if (v.isJsonNull()) { + return (Integer) null; + } else { + return v.getAsInt(); + } + }) + // get as Array + .collect(Collectors.toList()); + + // Num of Data per day + // TODO change this variable based on the resolution which is 900 in query + int numOfDataPerDay = 96; + + List> mainData = getSlicedArrayList(result, numOfDataPerDay); + + // Getting the indexes of the last four similar days + List> lastFourSimilarDays = getCorrectIndexes(mainData, NUM_OF_DAYS_OF_WEEK, + PREDCTION_FOR_ONE_DAY); + + // Getting the average predictions + List nextOneDayPredictions = getAverage(lastFourSimilarDays); + + return new Prediction24Hours(nextOneDayPredictions.stream().toArray(Integer[]::new)); + } + + /** + * This methods takes a List of integers and returns a 2dimension List of + * integers, specific to correct days. + * + * @param arrlist array list of all data. + * @param n number of data per day. + * @return 2dimension array list + */ + private static List> getSlicedArrayList(List arrlist, int n) { + List> twoDimensionalArrayList = new ArrayList>(); + for (int i = 0; i < arrlist.size(); i = i + n) { + twoDimensionalArrayList.add(arrlist.subList(i, i + n)); + } + return twoDimensionalArrayList; + + } + + /** + * This methods get the average of data based on the indexes. + * + * @param twoDimensionalArrayList The actual data. + * @return Average values of the last four days. + */ + private static List getAverage(List> twoDimensionalArrayList) { + List averageList = new ArrayList(); + int rows = twoDimensionalArrayList.size(); + int cols = twoDimensionalArrayList.get(0).size(); + for (int i = 0; i < cols; i++) { + int sumRow = 0; + for (int j = 0; j < rows; j++) { + if (twoDimensionalArrayList.get(j).get(i) != null) { + sumRow += twoDimensionalArrayList.get(j).get(i); + } + } + averageList.add(sumRow / twoDimensionalArrayList.size()); + } + return averageList; + + } + + /** + * Data manipulation, to get the proper indexes. + * + * @param mainData all data points. + * @param numDaysOfWeek total number of days of week. + * @param whichDay current actual day. + * @return proper indexed days. + */ + private static List> getCorrectIndexes(List> mainData, int numDaysOfWeek, + int whichDay) { + List indexes = new ArrayList(); + List> days = new ArrayList>(); + for (int i = 0; i < mainData.size(); i++) { + if (isMember(whichDay, numDaysOfWeek, i)) { + indexes.add(i); + } + } + + for (Integer i : indexes) { + days.add(mainData.get(i)); + } + + return days; + + } + + /** + * Check if the day belongs to correct day. + * + * @param whichDay current actual day. + * @param numDaysOfWeek total number of days of week. + * @param nthTerm nthterm + * @return boolean value to represent is value memeber of correct day + */ + private static boolean isMember(int whichDay, int numDaysOfWeek, int nthTerm) { + if (numDaysOfWeek == 0) { + return (nthTerm == whichDay); + } + return ((nthTerm - whichDay) % numDaysOfWeek == 0 && (nthTerm - whichDay) / numDaysOfWeek >= 0); + + } + +} diff --git a/io.openems.edge.predictor.similardaymodel/test/.gitignore b/io.openems.edge.predictor.similardaymodel/test/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/Data.java b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/Data.java new file mode 100644 index 00000000000..4e39b02c0e1 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/Data.java @@ -0,0 +1,68 @@ +package io.openems.edge.predictor.similardaymodel; + +public class Data { + + public static final Integer[] data = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19628148, 6550910, 22317828, 15206562, 9058611, 23406944, 9219693, 15800971, 21296530, 4527141, 22562770, 15267745, 9018811, 23595324, 8430786, 16389406, 21525472, 4077697, 22768848, 15157240, 9138508, 23968964, 7363085, 17083467, 21832143, 3594137, 22989236, 15085879, 9228392, 24124509, 6571137, 17642223, 21475288, 4499115, 22445357, 14785938, 9713856, 23915723, 6550867, 17656891, 20921635, 5474489, 22062513, 14542193, 10049813, 23690578, 6654455, 17689559, 20435467, 6028892, 21951157, 14613696, 10015734, 23385682, 7012689, 17595474, 20197424, 6435626, 21802029, 14528000, 10124220, 23141960, 2640169, 8624727, 15593695, 21078270, 6648533, 20702052, 16174167, 8652929, 23103674, 9415632, 15315525, 21073269, 6429999, 20912249, 16072814, // + + 8688754, 23011505, 9745347, 15174361, 21202293, 6012314, 21216329, 15949181, 8593743, 9973991, 23510081, 4963040, 19950775, 19491470, 5166975, 23717579, 12303753, 11982384, 23957607, 3778278, 20679632, 19257248, 5348607, 23838658, 12263030, 12045896, 23524143, 4315132, 20480132, 18894586, 6167012, 23353918, 11973767, 12412515, 23142252, 5014560, 20084238, 18574591, 6843968, 23042868, 11588716, 12864209, 22745707, 5830336, 19668607, 18191762, 7343509, 22899931, 11226024, 13150314, 22541918, 6444932, 19260087, 18102400, 7389853, 22935268, 10986745, 13260801, 22431435, 7086697, 18887108, 18044029, 7377111, 23035500, 11036566, 13216566, 22184679, 7455357, 18808808, 18012193, 7241047, 23093461, 11080178, 13203141, 22075695, 7330308, 19025666, 18174654, 6971185, 23062072, 11262408, 13158150, 22087116, 7025189, 19303211, 18293406, 6804257, 23044594, 11373599, 13171686, 22254260, 6480438, 19696518, 18338323, 6581887, 23151076, // + + 11604769, 12952137, 22589192, 5622771, 20203554, 18302906, 6441386, 23357620, 11445514, 13091251, 22956998, 4673724, 20807399, 18288487, 6105346, 23848082, 11367278, 13054746, 23273602, 3760297, 21381618, 18225835, 5981923, 24207759, 11145130, 13123652, 23265447, 3621941, 21545214, 17901138, 6758239, 23756140, 10548255, 13757071, 22886070, 4390518, 21041361, 17532483, 7454236, 23428798, 10129041, 14229790, 22436513, 5324878, 20568731, 17178127, 7998347, 23282483, 9856018, 14433316, 22268708, 5949598, 20130590, 17129247, 8022482, 23263787, 9602355, 14605403, 21927623, 6715756, 19772138, 16903530, 8167990, 23303579, 9620705, 14640926, 21673839, 6883218, 19889343, 17009546, 7990983, 23226453, 9858403, 14569637, 21493377, 6926327, 20014532, 17145773, 7809541, 23072085, 10109997, 14492824, 21526944, 6685882, 20217357, 17121589, 7727077, 23114353, 10420701, 14239556, 21705368, 6126628, 20583521, 17070504, 7684599, 23136513, // + + 10611913, 14154820, 22024580, 5428125, 20992158, 17062487, 7446859, 23470283, 10582385, 14141467, 22284292, 4557025, 21599418, 16885615, 7338373, 23841840, 10565609, 14034098, 22524607, 3819144, 22069946, 17094514, 7115064, 24051681, 9727720, 14636115, 22991141, 3044869, 22416925, 16925266, 7464993, 24025258, 8997311, 15272431, 22354895, 4227531, 21784802, 16444165, 8257695, 23734762, 8626851, 15632950, 22143188, 4954302, 21267194, 16244320, 8589471, 23587662, 8393340, 15865528, 21702258, 5925147, 20787704, 16105981, 8753773, 23559390, 8347191, 15864910, 21366536, 6330591, 20781495, 16012461, 8822725, 23382794, 8488262, 15917033, 20935476, 6680033, 20800007, 16061273, 8776216, 23166338, 8785728, 15844450, 20941593, 6636992, 20860341, 15951301, 8846804, 23106750, 9177339, 15578916, 20943560, 6438064, 21033893, 15783067, 8924339, 22983467, 9605892, 15331428, 21078934, 6019274, 21317309, 15728719, 8783992, 23180832, // + + 9713243, 15249007, 21279408, 5367330, 21768778, 15580151, 8696040, 23417895, 9887160, 15097248, 21460661, 4764798, 22218240, 15720414, 8487344, 23605753, 9446081, 15407128, 21751813, 4180490, 22494522, 15815748, 8439888, 23815168, 8522399, 16095019, 21935882, 3721703, 22741700, 15606351, 8664988, 24207759, 7370746, 16889912, 21944239, 3906499, 22590875, 15419180, 9032978, 23986993, 6997075, 17218623, 21527687, 4848544, 22031346, 15128377, 9466351, 23820788, 7001541, 17206217, 21004085, 5708207, 21741097, 14890121, 9803186, 23603337, 7024611, 17341331, 20510146, 6244005, 21716133, 14890115, 9786500, 23306787, 7363558, 17284785, 20320208, 6511591, 21608014, 14750756, 9930128, 23124925, 7913388, 16942690, 20203263, 6587292, 21624962, 14513392, 10113276, 22919554, 8398547, 16678506, 20181005, 6516502, 21762500, 14295383, 10193554, 22936572, 8698312, 16537405, 20296021, 6041988, 22100770, 14183007, 10083567, 23105447, // + + 8989410, 16271687, 20399219, 5615836, 22402447, 14305604, 9902154, 23119856, 8923746, 16371915, 20571323, 5160131, 22645294, 14358318, 9888208, 23240084, 8265843, 16909934, 20805330, 4710098, 22820691, 14360568, 9931777, 23539247, 7375623, 9415822, 22307506, 15560049, 8671193, 23573577, 9112068, 15751951, 21660721, 4082015, 22642615, 15402282, 8842632, 23818278, 8039991, 16575794, 21745508, 3806327, 22913415, 15130961, 9141456, 24229806, 6818899, 17440294, 21759736, 3957445, 22736323, 14901893, 9568919, 24021685, 6471824, 17780626, 21042461, 5155479, 22294767, 14334638, 10243117, 23786048, 6294118, 18010859, 20419313, 5826465, 22215726, 14341022, 10276711, 23433900, 6612880, 18009829, 19996368, 6366523, 22052626, 14094256, 10512193, 23152641, 7019419, 17898658, 19751155, 6615911, 22068261, 13659363, 10943383, 22892049, 7609590, 17637458, 19507319, 6792320, 22143856, 13279319, 11195651, 22809641, 7998949, 17453715, // + + 19491914, 6485574, 22473502, 12939263, 11339674, 22836780, 8388122, 17241483, 19445575, 6201345, 22766294, 12881923, 11373551, 22762814, 8080644, 17647664, 19537048, 5905348, 22931837, 12797754, 11564040, 22736543, 7535507, 18215295, 19550015, 5732163, 22978501, 12702490, 11702830, 22951044, 6636079, 18872397, 19686218, 5394917, 23188512, 12718043, 11684092, 23347746, 5486549, 19652009, 19587479, 5265496, 23508795, 12366861, 12010603, 23807618, 4155776, 20472076, 19484893, 4953684, 23976940, 12168409, 12097796, 23668636, 4048813, 20641313, 18826537, 6032773, 23556207, 11790335, 12600559, 23219029, 4655481, 20475133, 18392416, 6829019, 23237060, 11159992, 13233021, 22704457, 5504649, 20077577, 17803590, 7545229, 23082117, 10665191, 13669123, 22413994, 6213296, 19705135, 17678742, 7647986, 23130765, 10269325, 13953565, 22181609, 6892237, 19343592, 17440090, 7731004, 23264261, 10163309, 14101344, 21889465, 7023527, 19556940, // + + 17361822, 7695152, 23189274, 10150679, 14282087, 21611223, 6991054, 19858916, 17332204, 7643778, 23066653, 10275184, 14319879, 21627003, 6630320, 20202211, 17215008, 7625807, 23111607, 10505851, 14214845, 21830942, 5959063, 20687659, 16974341, 7694019, 23208585, 10415890, 14335779, 22019651, 5135061, 21303623, 16776551, 7543203, 23599951, 10487839, 14225557, 22214630, 4365688, 21876947, 16744734, 7479200, 23818705, 9988650, 14615526, 22463795, 3626725, 22357371, 16724667, 7538762, 24106610, 8821290, 15516785, 22500738, 3454023, 22466628, 16044371, 8388949, 23997234, 7947773, 16293538, 22026503, 4430789, 21968253, 15687162, 8972812, 23832462, 7550030, 16706012, 21471067, 5444039, 21499281, 15367490, 9361479, 23699015, 7411397, 16862884, 20969087, 5993594, 21507869, 15116464, 9616895, 23434183, 7508189, 17030382, 20426235, 6503849, 21547151, 15059192, 9671367, 23138310, 7804793, 16991347, 20251935, 6628005, 21579210, // + + 14656789, 9984782, 22985062, 8236105, 16782028, 20165913, 6512453, 21780210, 14212013, 10297958, 22920498, 8518032, 16683932, 20152224, 6152185, 22153479, 13915924, 10344687, 23061539, 8820218, 16522693, 20140536, 5759600, 22556871, 13838808, 10368950, 23018087, 8559741, 16890487, 20254554, 5347371, 22787393, 13751540, 10525072, 23064180, 7856609, 17554570, 20300641, 5118343, 22908214, 13603239, 10736493, 23356200, 6794841, 18308454, 20525840, 4672346, 23187248, 13609829, 10748145, 23773670, 5514352, 19145320, 20475073, 4490305, 23522685, 13058746, 11228823, 24110847, 4459320, 19869016, 19849358, 5115280, 23451562, 12779960, 11578253, 23632326, 4796332, 19842826, 19187801, 6102427, 23125288, 12634340, 11828408, 23198848, 5345817, 19700246, 18824251, 6737926, 22873861, 12037827, 12409570, 22814959, 6063019, 19345395, 18476572, 7197820, 22768287, 11529247, 12896938, 22576794, 6692266, 19042234, 18276846, 7288199, 22904648, // + + 11141858, 13137570, 22401204, 7292607, 18730801, 18097388, 7279018, 23100747, 11030513, 13177245, 22183872, 7350550, 18926763, 18097829, 7116866, 23103889, 10983888, 13362456, 21948964, 7214260, 19312614, 18045112, 7073893, 23037177, 11027992, 13480188, 22038919, 6691771, 19728807, 18023490, 6935789, 23135144, 11185965, 13392257, 22219528, 5940309, 20299028, 17790274, 6956401, 23242452, 11070140, 13566321, 22526643, 4974710, 20957420, 17625559, 6757956, 23692292, 10958044, 13635770, 22785082, 4046866, 21625268, 17475702, 6732056, 24046416, 10450486, 13963008, 23011575, 3246213, 22235904, 17422398, 6909740, 24127021, 9440164, 14839700, 22639874, 3890974, 21883594, 16710762, 7984298, 23793381, 8857051, 15456540, 22169292, 4854947, 21368201, 16397896, 8449589, 23598584, 8388962, 15876931, 21776886, 5699911, 20961300, 16036047, 8799304, 23626879, 8210654, 16017666, 21336027, 6214812, 20910345, 15887038, 8955933, 23411848, // + + 8221308, 16235322, 20814755, 6615974, 21030755, 15725976, 9093706, 23155009, 8475146, 16256652, 20658188, 6652752, 21126902, 15457722, 9247262, 23073144, 8825443, 16066263, 20602648, 6426678, 21430883, 15143338, 9482476, 22984419, 9029727, 16066843, 20644480, 5970987, 21820003, 14827391, 9507534, 23192936, 9256136, 15900757, 20743238, 5435837, 22278134, 14712817, 9540192, 23242194, 9098919, 16087278, 20859194, 4954511, 22632370, 14677293, 9611700, 23344214, 8279809, 16837444, 20966693, 4590983, 22822408, 14377899, 9953260, 23704513, 7075774, 17745043, 21096861, 4234971, 23070139, 14203610, 10057726, 24109993, 5693141, 18681318, 21025666, 4262303, 23173846, 13850170, 10487687, 24071718, 5320218, 18927447, 20363907, 5177843, 22928321, 13526949, 10946371, 23664238, 5483270, 19054689, 19622280, 6090506, 22748322, 13435280, 11095644, 23209325, 5963149, 18964576, 19224673, 6710180, 22539937, 12885926, 11644548, 22931363, // + + 6550727, 18691528, 19021441, 6924526, 22512365, 12333234, 12100024, 22681976, 7094395, 18461092, 18733849, 7047052, 22653940, 11977218, 12326272, 22637775, 7589822, 18214544, 18635699, 6919708, 22901763, 11783024, 12440462, 22386064, 7758725, 18322875, 18587777, 6764170, 23010928, 11711592, 12615519, 22277026, 7419076, 18792359, 18614537, 6595115, 23005535, 11666795, 12784985, 22366400, 6794275, 19289719, 18662622, 6387813, 23116233, 11766734, 12733555, 22593784, 5906160, 19958795, 18517767, 6349274, 23256681, 11679895, 12904180, 22978760, 4788741, 20707805, 18292821, 6174101, 23794420, 11312192, 13128047, 23215355, 3795653, 21481949, 18120240, 6132456, 24208590, 10852530, 13431073, 23245858, 3446308, 21713892, 17753336, 6864070, 23841354, 10045453, 14248223, 22698325, 4372338, 21262372, 17148096, 7774773, 23565387, 9500381, 14839456, 22277969, 5258493, 20837354, 16841397, 8169576, 23446618, 9012608, 15210199, 21902217, // + + 6093800, 20440510, 16523055, 8454472, 23499292, 8890729, 15362883, 21514259, 6481556, 20465357, 16341039, 8577290, 23332686, 8821754, 15592311, 21052378, 6736444, 20672449, 16239111, 8664187, 23106530, 8993414, 15744851, 20931383, 6644621, 8658437, 18678106, 19513676, 6577549, 22352850, 13307070, 11220911, 23058413, 6722916, 18356704, 19290179, 6861505, 22307151, 12956656, 11594109, 22704260, 7365840, 18044670, 19153685, 6939335, 22387956, 12654702, 11695187, 22763499, 7659613, 17888308, 19120689, 6661917, 22648852, 12391634, 11833808, 22632820, 8090628, 17726750, 18984666, 6550826, 22923766, 12305494, 11981807, 22545599, 7813823, 18071344, 19131109, 6206572, 22994555, 12433015, 11971871, 22564600, 7268448, 18601799, 19237693, 5935895, 23016018, 12334842, 12102054, 22799422, 6400726, 19215368, 19280092, 5703876, 23197162, 12396553, 12050686, 23194007, 5334410, 19887100, 19164018, 5576837, 23511667, 12065924, 12306782, // + + 23622868, 4080603, 20712579, 19081559, 5228071, 24115611, 11874820, 12368914, 23599995, 3798160, 20981386, 18679483, 6070552, 23690130, 11504268, 12862353, 23149031, 4501087, 20687059, 18180858, 6941855, 23316438, 10885051, 13483119, 22652728, 5372541, 20234862, 17655542, 7623619, 23151661, 10473286, 13878866, 22420918, 6098943, 19852138, 17555250, 7739421, 23197412, 10142209, 14126564, 22161262, 6786968, 19497045, 17392925, 7796711, 23270766, 10041770, 14184307, 21857793, 6958854, 19598870, 17308433, 7745974, 23203566, 10095393, 14325029, 21527484, 6963176, 19924856, 17202788, 7758382, 23077156, 10173572, 14459591, 21585809, 6671118, 20180439, 17166377, 7720317, 23138522, 10424859, 14292828, 21713744, 6101203, 20626549, 16979851, 7722878, 23157107, 10489919, 14314920, 21946507, 5324051, 21188151, 16830889, 7583891, 23527869, 10442655, 14319637, 22162271, 4488870, 21779424, 16635980, 7571778, 23790018, 10211336, 14448356, // + + 22388820, 3782216, 22272059, 16707843, 7553882, 24046779, 9025574, 15343164, 22596728, 3260710, 22599398, 16330045, 8055647, 24046000, 8225177, 16063547, 22174203, 4229892, 21984116, 15911054, 8715461, 23789002, 7784590, 16436907, 21721867, 5185669, 21530754, 15619104, 9105793, 23699385, 7652702, 16570783, 21163955, 5993314, 21291221, 15387257, 9396874, 23556216, 7707035, 16702941, 20742721, 6388842, 21301023, 15404540, 9375147, 23284104, 7939228, 16725232, 20574625, 6552148, 21332800, 15120388, 9592830, 23074682, 8318688, 16520514, 20347739, 6550180, 21517598, 14723604, 9901095, 22876358, 8783418, 16381588, 20385837, 6300682, 21787449, 14556545, 9890382, 23061978, 8876251, 16320341, 20476953, 5771963, 22223396, 14271993, 9941271, 23166087, 9114773, 16175465, 20439516, 5393255, 22567798, 14192929, 10075120, 23190789, 8472506, 16767177, 20645769, 4895467, 22797989, 14255205, 10079508, 23359944, 7604190, 17494690, // + + 20835887, 4568692, 22955800, 14037796, 10295790, 23733943, 6464204, 18239932, 21009725, 4130314, 23255522, 13997646, 10243844, 24207759, 5168454, 19039304, 20656968, 4624942, 23167800, 13426687, 9852496, 1083474, 14401511, 12504518, 11760470, 22876805, 6882334, 18701825, 19591030, 5553179, 23075691, 12729128, 11637580, 23195636, 5935042, 19295823, 19676761, 5290348, 23283992, 12795610, 11576564, 23740208, 4809831, 19909917, 19786417, 4858785, 23746737, 12496082, 11789655, 23946807, 4045253, 20428663, 19288874, 5502069, 23634895, 12464669, 11913246, 23450203, 4553808, 20282631, 18940760, 6284196, 23205745, 12059152, 12381645, 23092658, 5274243, 19878808, 18560891, 6918818, 22953031, 11665044, 12761457, 22710132, 6063331, 19423310, 18253005, 7351379, 22856544, 11399823, 12970589, 22552648, 6701483, 19037485, 18276846, 7288199, 22881013, 11194948, 13045473, 22437471, 7277522, 18668126, 18194881, 7223503, 23002224, 11272126, // + + 12980994, 22235027, 7570737, 18648389, 18199546, 7079575, 23092576, 11344158, 12950794, 22148536, 7380508, 18903079, 18374635, 6792264, 23036140, 11483778, 12941615, 22271619, 6982379, 19206892, 18511435, 6564548, 23054622, 11648403, 12844267, 22451945, 6332730, 19643018, 18571145, 6384535, 23167304, 11776199, 12759213, 22783475, 5467491, 20164550, 18518505, 6198329, 23459839, 11616870, 12863411, 23207627, 4412746, 20825569, 18551736, 5816456, 23925069, 11577616, 12768346, 23509420, 3509631, 21396465, 18479896, 5900829, 24054208, 11274147, 13072790, 23230871, 3883109, 21238146, 18014281, 6835378, 23588712, 10671534, 13698814, 22781058, 4767364, 20777898, 17639724, 7457491, 23318302, 10228797, 14105805, 22458203, 5565319, 20305145, 17287345, 7893967, 23234634, 9918417, 14354779, 22237385, 6273898, 19896154, 17237794, 7938721, 23265383, 9830296, 14422620, 21909513, 6904759, 19639056, 17060244, 8059794, 23258187, 9884250, // + + 14441784, 21664245, 6998144, 19794057, 17206641, 7803948, 23190880, 10132825, 14321214, 21601674, 6903723, 19967525, 17282574, 7672093, 23068438, 10289538, 14310632, 21648568, 6520263, 20246686, 17281895, 7593662, 23100491, 10639937, 14090027, 21884332, 5916088, 20659926, 17146478, 7541935, 23212881, 10609063, 14112918, 22137518, 5165440, 21112559, 17140767, 7262037, 23593894, 10627470, 14029963, 22449381, 4387880, 21620224, 17036516, 7188465, 23901148, 10511501, 14014660, 22650195, 3635721, 22129677, 17115191, 7095639, 24162604, 9521030, 14863812, 22852060, 3359458, 22230710, 16805215, 7694364, 23915937, 8906682, 15361011, 22338476, 4415153, 21636633, 16337341, 8463659, 23657957, 8619140, 15646278, 22052127, 5162130, 21158554, 16237858, 8629665, 23547994, 8395596, 15812515, 21657131, 6048249, 20712160, 16036762, 8843879, 23524539, 8450055, 15797754, 21313416, 6413058, 20689043, 16060796, 8787268, 23328585, 8686991, // + + 15759635, 20993045, 6725825, 20714472, 16162157, 8711698, 23131537, 9014324, 15638737, 20976081, 6673640, 20780032, 16087399, 8685277, 23096319, 9379459, 15378352, 21026225, 6385770, 21014008, 15944553, 8767459, 22985980, 9735366, 15207478, 21206809, 5878367, 21330340, 15833491, 8636802, 23238723, 9797233, 15117025, 21394824, 5187445, 21834285, 15672434, 8602894, 23475313, 9965772, 14986841, 21575828, 4587918, 22295084, 15844962, 8363823, 23635333, 9337350, 15442834, 21920695, 3963374, 22542040, 15864507, 8379274, 23906847, 8361422, 16203943, 21999170, 3632656, 22778624, 15630018, 8617641, 24198347, 7377978, 16845211, 21942632, 4046633, 22412224, 15343078, 9158513, 23920045, 7123167, 17134635, 21451973, 5069842, 21894060, 15161509, 9457643, 23796364, 7073572, 17134186, 7133380, 17802216, 7582668, 23030633, 10698918, 13627584, 22449998, 6367520, 19483090, 17734427, 7613118, 23067972, 10491469, 13734358, 22250894, // + + 7020022, 19162364, 17712121, 7540578, 23162818, 10578078, 13629680, 22051954, 7229406, 19166676, 17728778, 7437856, 23159761, 10685192, 13642402, 0, 22020842, 5485775, 20930006, 17107835, 7399238, 23432151, 10689871, 14031720, 22285281, 4605999, 21524237, 16915342, 7318512, 23788841, 10709114, 13897782, 22553064, 3853756, 22041180, 17155563, 7053101, 24064130, 9831320, 14543299, 22982963, 3064699, 22446253, 17014905, 7360553, 24058692, 9066570, 15191437, 22443435, 4173088, 21785026, 16523924, 8201314, 23739668, 8686494, 15574890, 22140380, 4949215, 21274849, 16230939, 8591944, 23592633, 8404004, 15856085, 21718829, 5887075, 20807869, 16123129, 8733755, 23558215, 8400923, 15822116, 21400148, 6329817, 20717703, 16067168, 8790213, 23412045, 8557373, 15873198, 20997005, 3278352, 5604555, 18603203, 19601020, 6519954, 22317594, 13443922, 11111186, 23074649, 6756632, 18240756, 19429273, 6790209, 22220665, 8437208 // + + }; + + public static final Integer[] predictedData = { + 8931905, 12081183, 13140283, 7890941, 14283475, 10869967, 9203245, 14450631, 8856705, 12104258, 13130344, 7731838, 14527199, 10794645, 9064588, 14608937, 8823195, 12172205, 13051236, 7545362, 14801416, 10708873, 9027609, 14723334, 8754347, 12263946, 12909274, 7489182, 14961291, 10577290, 9215333, 14666870, 8623358, 12483200, 12643272, 7623844, 14964723, 10380271, 9467619, 14572030, 8515648, 12750934, 12343975, 7781289, 15019471, 10155035, 9670343, 14638097, 8395602, 12894626, 12140855, 7848232, 15058938, 10126444, 9702186, 14646087, 8281407, 12949820, 12205576, 7800028, 15005580, 10290326, 9666610, 14525533, 8189920, 13065421, 12270269, 7888022, 14853165, 10294449, 9823395, 14312157, 8205314, 13121095, 12306997, 8021604, 14667519, 10359409, 9873441, 14147271, 8213434, 13151785, 12394432, 8070486, 14604112, 10274089, 9947941, 14142882, 8263493, 13041683, 12486538, 7995124, 14638527, 10254334, 9974679, 14108152 + }; + +} diff --git a/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/MyConfig.java b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/MyConfig.java new file mode 100644 index 00000000000..31a8bf99a56 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/MyConfig.java @@ -0,0 +1,62 @@ +package io.openems.edge.predictor.similardaymodel; + +import io.openems.edge.common.test.AbstractComponentConfig; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id; + public String[] channelAddresses; + public int numOfWeeks; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setChannelAddresses(String... channelAddresses) { + this.channelAddresses = channelAddresses; + return this; + } + + public Builder setNumOfWeeks(int numOfWeeks) { + this.numOfWeeks = numOfWeeks; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public int numOfWeeks() { + return this.builder.numOfWeeks; + } + + @Override + public String[] channelAddresses() { + return this.builder.channelAddresses; + } + +} \ No newline at end of file diff --git a/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/SimilardayModelPredictorTest.java b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/SimilardayModelPredictorTest.java new file mode 100644 index 00000000000..abdf8515b97 --- /dev/null +++ b/io.openems.edge.predictor.similardaymodel/test/io/openems/edge/predictor/similardaymodel/SimilardayModelPredictorTest.java @@ -0,0 +1,62 @@ +package io.openems.edge.predictor.similardaymodel; + +import static org.junit.Assert.assertEquals; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.Arrays; +import org.junit.Test; +import io.openems.common.types.ChannelAddress; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyComponentManager; +import io.openems.edge.common.test.TimeLeapClock; +import io.openems.edge.predictor.api.oneday.Prediction24Hours; +import io.openems.edge.timedata.test.DummyTimedata; + +public class SimilardayModelPredictorTest { + + private static final String TIMEDATA_ID = "timedata0"; + private static final String PREDICTOR_ID = "predictor0"; + + private static final ChannelAddress METER1_ACTIVE_POWER = new ChannelAddress("meter1", "ActivePower"); + + @Test + public void test() throws Exception { + + final TimeLeapClock clock = new TimeLeapClock( + Instant.ofEpochSecond(1577836800) /* starts at 1. January 2020 00:00:00 */, ZoneOffset.UTC); + + Integer[] values = Data.data; + Integer[] predictedValues = Data.predictedData; + + DummyTimedata timedata = new DummyTimedata(TIMEDATA_ID); + ZonedDateTime start = ZonedDateTime.of(2019, 12, 1, 0, 0, 0, 0, ZoneId.of("UTC")); + + for (int i = 0; i < values.length; i++) { + timedata.add(start.plusMinutes(i * 15), METER1_ACTIVE_POWER, values[i]); + } + + SimilarDayPredictorImpl sut = new SimilarDayPredictorImpl(); + + new ComponentTest(sut) // + .addReference("timedata", timedata) // + .addReference("componentManager", new DummyComponentManager(clock)) // + .activate(MyConfig.create() // + .setId(PREDICTOR_ID) // + .setNumOfWeeks(4) // + .setChannelAddresses(METER1_ACTIVE_POWER.toString()).build()); + + Prediction24Hours prediction = sut.get24HoursPrediction(METER1_ACTIVE_POWER); + Integer[] p = prediction.getValues(); + + assertEquals(predictedValues[0], p[0]); + assertEquals(predictedValues[48], p[48]); + assertEquals(predictedValues[95], p[95]); + + System.out.println(Arrays.toString(prediction.getValues())); + + } + +} diff --git a/io.openems.edge.pvinverter.kaco.blueplanet/src/io/openems/edge/pvinverter/kaco/blueplanet/Config.java b/io.openems.edge.pvinverter.kaco.blueplanet/src/io/openems/edge/pvinverter/kaco/blueplanet/Config.java index 1ce8e9b6cd2..3cc1f2c23bd 100644 --- a/io.openems.edge.pvinverter.kaco.blueplanet/src/io/openems/edge/pvinverter/kaco/blueplanet/Config.java +++ b/io.openems.edge.pvinverter.kaco.blueplanet/src/io/openems/edge/pvinverter/kaco/blueplanet/Config.java @@ -20,7 +20,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "PV-Inverter KACO blueplanet [{id}]"; diff --git a/io.openems.edge.pvinverter.sma/src/io/openems/edge/pvinverter/sma/Config.java b/io.openems.edge.pvinverter.sma/src/io/openems/edge/pvinverter/sma/Config.java index be0e13d9d6f..e4f3f7be0d2 100644 --- a/io.openems.edge.pvinverter.sma/src/io/openems/edge/pvinverter/sma/Config.java +++ b/io.openems.edge.pvinverter.sma/src/io/openems/edge/pvinverter/sma/Config.java @@ -25,7 +25,7 @@ int modbusUnitId() default 126; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "PV-Inverter SMA Sunny Tripower [{id}]"; diff --git a/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/Config.java b/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/Config.java index 95edb992902..842969f8af0 100644 --- a/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/Config.java +++ b/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/Config.java @@ -26,7 +26,7 @@ int maxActivePower(); @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "PV-Inverter Solar-Log [{id}]"; diff --git a/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/SolarLogImpl.java b/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/SolarLogImpl.java index a55d4395042..2dbd6b52226 100644 --- a/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/SolarLogImpl.java +++ b/io.openems.edge.pvinverter.solarlog/src/io/openems/edge/pvinverter/solarlog/SolarLogImpl.java @@ -20,6 +20,7 @@ import io.openems.common.exceptions.OpenemsException; import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent; import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ChannelMetaInfoReadAndWrite; import io.openems.edge.bridge.modbus.api.ElementToChannelConverter; import io.openems.edge.bridge.modbus.api.ModbusProtocol; import io.openems.edge.bridge.modbus.api.element.SignedDoublewordElement; @@ -130,14 +131,16 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { new FC16WriteRegistersTask(10400, // m(SolarLog.ChannelId.P_LIMIT_TYPE, new UnsignedWordElement(10400)), - m(SolarLog.ChannelId.P_LIMIT_PERC, new UnsignedWordElement(10401))), + m(SolarLog.ChannelId.P_LIMIT_PERC, new UnsignedWordElement(10401), + new ChannelMetaInfoReadAndWrite(10901, 10401))), new FC16WriteRegistersTask(10404, m(SolarLog.ChannelId.WATCH_DOG_TAG, new UnsignedDoublewordElement(10404).wordOrder(WordOrder.LSWMSW))), new FC4ReadInputRegistersTask(10900, Priority.LOW, // m(SolarLog.ChannelId.STATUS, new SignedWordElement(10900)), // - m(SolarLog.ChannelId.P_LIMIT_PERC, new SignedWordElement(10901)), + m(SolarLog.ChannelId.P_LIMIT_PERC, new SignedWordElement(10901), + new ChannelMetaInfoReadAndWrite(10901, 10401)), m(SolarLog.ChannelId.P_LIMIT, new SignedWordElement(10902)))); } diff --git a/io.openems.edge.pvinverter.sunspec/src/io/openems/edge/pvinverter/sunspec/Config.java b/io.openems.edge.pvinverter.sunspec/src/io/openems/edge/pvinverter/sunspec/Config.java index b276edbb06e..f4e125b031e 100644 --- a/io.openems.edge.pvinverter.sunspec/src/io/openems/edge/pvinverter/sunspec/Config.java +++ b/io.openems.edge.pvinverter.sunspec/src/io/openems/edge/pvinverter/sunspec/Config.java @@ -26,7 +26,7 @@ int readFromCommonBlockNo() default 1; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "PV-Inverter SunSpec [{id}]"; diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/asymmetric/reacting/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/asymmetric/reacting/Config.java index de9d8f2984c..c438ebf6d70 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/asymmetric/reacting/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/asymmetric/reacting/Config.java @@ -35,7 +35,7 @@ GridMode gridMode() default GridMode.ON_GRID; @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator EssAsymmetric Reacting [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/singlephase/reacting/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/singlephase/reacting/Config.java index f4f615942ef..16e3437c151 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/singlephase/reacting/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/ess/singlephase/reacting/Config.java @@ -39,7 +39,7 @@ GridMode gridMode() default GridMode.ON_GRID; @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator EssSinglePhase Reacting [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/grid/acting/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/grid/acting/Config.java index 5bbb3b421fa..0c62512f586 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/grid/acting/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/grid/acting/Config.java @@ -21,7 +21,7 @@ String datasource_id() default "datasource0"; @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator GridMeter Acting [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/nrc/acting/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/nrc/acting/Config.java index 72d16e560c8..598329a349e 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/nrc/acting/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/nrc/acting/Config.java @@ -21,7 +21,7 @@ String datasource_id() default "datasource0"; @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator NRCMeter Acting [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/production/acting/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/production/acting/Config.java index eb0a8995d38..1d210a82302 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/production/acting/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/meter/production/acting/Config.java @@ -21,7 +21,7 @@ String datasource_id() default "datasource0"; @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator ProductionMeter Acting [{id}]"; } \ No newline at end of file diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/pvinverter/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/pvinverter/Config.java index 63cb509573f..e95f9205db6 100644 --- a/io.openems.edge.simulator/src/io/openems/edge/simulator/pvinverter/Config.java +++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/pvinverter/Config.java @@ -21,7 +21,7 @@ String datasource_id(); @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.") - String datasource_target() default ""; + String datasource_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Simulator PV-Inverter [{id}]"; diff --git a/io.openems.edge.solaredge/src/io/openems/edge/solaredge/gridmeter/Config.java b/io.openems.edge.solaredge/src/io/openems/edge/solaredge/gridmeter/Config.java index fa9112db2da..3923b821546 100644 --- a/io.openems.edge.solaredge/src/io/openems/edge/solaredge/gridmeter/Config.java +++ b/io.openems.edge.solaredge/src/io/openems/edge/solaredge/gridmeter/Config.java @@ -25,7 +25,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "SolarEdge Grid-Meter [{id}]"; diff --git a/io.openems.edge.solaredge/src/io/openems/edge/solaredge/pvinverter/Config.java b/io.openems.edge.solaredge/src/io/openems/edge/solaredge/pvinverter/Config.java index a4410c9aeea..c1d2d299977 100644 --- a/io.openems.edge.solaredge/src/io/openems/edge/solaredge/pvinverter/Config.java +++ b/io.openems.edge.solaredge/src/io/openems/edge/solaredge/pvinverter/Config.java @@ -20,7 +20,7 @@ String modbus_id() default "modbus0"; @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default ""; + String Modbus_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "SolarEdge PV-Inverter [{id}]"; diff --git a/io.openems.edge.tesla.powerwall2/src/io/openems/edge/tesla/powerwall2/battery/Config.java b/io.openems.edge.tesla.powerwall2/src/io/openems/edge/tesla/powerwall2/battery/Config.java index 1d92256c10f..d4a01e7ab95 100644 --- a/io.openems.edge.tesla.powerwall2/src/io/openems/edge/tesla/powerwall2/battery/Config.java +++ b/io.openems.edge.tesla.powerwall2/src/io/openems/edge/tesla/powerwall2/battery/Config.java @@ -25,7 +25,7 @@ String core_id() default "tesla0"; @AttributeDefinition(name = "Core target filter", description = "This is auto-generated by 'Core-ID'.") - String core_target() default ""; + String core_target() default "(enabled=true)"; String webconsole_configurationFactory_nameHint() default "Tesla Powerwall 2 Battery [{id}]"; diff --git a/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles b/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles new file mode 100644 index 00000000000..02e7708a0b2 --- /dev/null +++ b/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles @@ -0,0 +1 @@ +/mnt/c/Users/stefan.feilmeier/fems/develop2/io.openems.wrapper.eu.chargetime.ocpp/generated/io.openems.wrapper.eu.chargetime.ocpp.jar diff --git a/ui/package-lock.json b/ui/package-lock.json index 8e02273431d..94ffd340c54 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,83 +1,84 @@ { "name": "openems-ui", - "version": "2021.13.0", + "version": "2021.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2021.13.0-SNAPSHOT", - "dependencies": { - "@angular/animations": "~12.0.1", - "@angular/common": "~12.0.1", - "@angular/core": "~12.0.1", - "@angular/forms": "~12.0.1", - "@angular/platform-browser": "~12.0.1", - "@angular/platform-browser-dynamic": "~12.0.1", - "@angular/router": "~12.0.1", - "@angular/service-worker": "~12.0.1", - "@ionic/angular": "^5.5.2", + "version": "2021.14.0-SNAPSHOT", + "dependencies": { + "@angular/animations": "~12.1.4", + "@angular/common": "~12.1.4", + "@angular/core": "~12.1.4", + "@angular/forms": "~12.1.4", + "@angular/platform-browser": "~12.1.4", + "@angular/platform-browser-dynamic": "~12.1.4", + "@angular/router": "~12.1.4", + "@angular/service-worker": "~12.1.4", + "@ionic/angular": "^5.6.12", "@ngx-formly/core": "^5.10.22", "@ngx-formly/ionic": "^5.10.22", "@ngx-formly/schematics": "^5.10.22", "@ngx-translate/core": "^13.0.0", - "angular-mydatepicker": "^0.11.4", + "angular-mydatepicker": "^0.11.5", "chart.js": "^2.9.4", "classlist.js": "^1.1.20150312", - "d3": "^7.0.0", - "date-fns": "^2.22.1", + "d3": "^7.0.1", + "date-fns": "^2.23.0", "file-saver-es": "^2.0.5", "ng2-charts": "^2.4.3", - "ngx-cookie-service": "^12.0.0", + "ngx-cookie-service": "^12.0.3", "ngx-spinner": "^12.0.0", "roboto-fontface": "^0.10.0", - "rxjs": "~6.6.0", + "rxjs": "~6.6.7", "semver-compare-multi": "^1.0.3", - "tslib": "^2.0.0", + "tslib": "^2.3.0", "uuid": "^8.3.2", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~12.0.1", - "@angular-eslint/builder": "~12.0.0", - "@angular-eslint/eslint-plugin": "~12.0.0", - "@angular-eslint/eslint-plugin-template": "~12.0.0", - "@angular-eslint/template-parser": "~12.0.0", - "@angular/cli": "~12.0.1", - "@angular/compiler": "~12.0.1", - "@angular/compiler-cli": "~12.0.1", - "@angular/language-service": "~12.0.1", + "@angular-devkit/build-angular": "~12.1.4", + "@angular-eslint/builder": "~12.3.1", + "@angular-eslint/eslint-plugin": "~12.3.1", + "@angular-eslint/eslint-plugin-template": "~12.3.1", + "@angular-eslint/template-parser": "~12.3.1", + "@angular/cli": "~12.1.4", + "@angular/compiler": "~12.1.4", + "@angular/compiler-cli": "~12.1.4", + "@angular/language-service": "~12.1.4", "@ionic/angular-toolkit": "^4.0.0", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", + "@types/jasmine": "~3.8.2", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^16.4.10", "@types/uuid": "^8.3.1", - "@typescript-eslint/eslint-plugin": "4.16.1", - "@typescript-eslint/parser": "4.16.1", - "eslint": "^7.6.0", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-jsdoc": "30.7.6", - "eslint-plugin-prefer-arrow": "1.2.2", - "jasmine-core": "~3.7.1", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~6.3.2", + "@typescript-eslint/eslint-plugin": "4.29.0", + "@typescript-eslint/parser": "4.29.0", + "eslint": "^7.32.0", + "eslint-plugin-import": "2.23.4", + "eslint-plugin-jsdoc": "36.0.6", + "eslint-plugin-prefer-arrow": "1.2.3", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~7.0.0", + "karma": "~6.3.4", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.0.3", - "karma-coverage-istanbul-reporter": "~3.0.2", - "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "^1.5.0", + "karma-coverage-istanbul-reporter": "~3.0.3", + "karma-jasmine": "~4.0.1", + "karma-jasmine-html-reporter": "^1.7.0", "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "typescript": "~4.2.4" + "ts-node": "~10.1.0", + "typescript": "~4.3.5" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.4.tgz", - "integrity": "sha512-/BKaVlpbZYb65elZ+xHoKB2J2DuTstMU++dqE9T/7E0CevuMoOdkLQFQm71Kjl3eFI4i6T5d8mlLVPNE/ZWm7w==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", "dev": true, + "peer": true, "dependencies": { - "@angular-devkit/core": "12.0.4", + "@angular-devkit/core": "12.0.5", "rxjs": "6.6.7" }, "engines": { @@ -87,77 +88,79 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.5.tgz", - "integrity": "sha512-rFbaAQPeuWM9KE9lK3J0sF6GB9nKF/s2Z7rtzKux7whGTF3Tlj8NHrcSxZTf4eBm3cnEpaiod1uPBQg8fUWD4w==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1200.5", - "@angular-devkit/build-optimizer": "0.1200.5", - "@angular-devkit/build-webpack": "0.1200.5", - "@angular-devkit/core": "12.0.5", - "@babel/core": "7.14.3", - "@babel/generator": "7.14.3", - "@babel/plugin-transform-async-to-generator": "7.13.0", - "@babel/plugin-transform-runtime": "7.14.3", - "@babel/preset-env": "7.14.2", - "@babel/runtime": "7.14.0", - "@babel/template": "7.12.13", - "@discoveryjs/json-ext": "0.5.2", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.1.4.tgz", + "integrity": "sha512-9kMdnaU2dr8o7gJpuBsEHLUpa6huF8uZQEd1+jhKfByEY/xTQo8qztvmbhFhrSfDvdYRygNHItpt3pYEoCEOig==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1201.4", + "@angular-devkit/build-optimizer": "0.1201.4", + "@angular-devkit/build-webpack": "0.1201.4", + "@angular-devkit/core": "12.1.4", + "@babel/core": "7.14.6", + "@babel/generator": "7.14.5", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.7", + "@babel/runtime": "7.14.6", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.0.5", + "@ngtools/webpack": "12.1.4", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", - "cacache": "15.0.6", + "cacache": "15.2.0", "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "8.1.1", - "core-js": "3.12.0", + "copy-webpack-plugin": "9.0.0", + "core-js": "3.15.1", "critters": "0.0.10", - "css-loader": "5.2.4", - "css-minimizer-webpack-plugin": "3.0.0", + "css-loader": "5.2.6", + "css-minimizer-webpack-plugin": "3.0.1", "find-cache-dir": "3.3.1", "glob": "7.1.7", "https-proxy-agent": "5.0.0", - "inquirer": "8.0.0", - "jest-worker": "26.6.2", + "inquirer": "8.1.1", + "jest-worker": "27.0.2", "karma-source-map-support": "1.4.0", "less": "4.1.1", - "less-loader": "8.1.1", - "license-webpack-plugin": "2.3.19", + "less-loader": "10.0.0", + "license-webpack-plugin": "2.3.20", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.5.1", + "mini-css-extract-plugin": "1.6.2", "minimatch": "3.0.4", - "open": "8.0.2", - "ora": "5.4.0", + "open": "8.2.1", + "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "postcss": "8.3.0", - "postcss-import": "14.0.1", - "postcss-loader": "5.2.0", + "postcss": "8.3.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.0", "postcss-preset-env": "6.7.0", "raw-loader": "4.0.2", "regenerator-runtime": "0.13.7", "resolve-url-loader": "4.0.0", - "rimraf": "3.0.2", "rxjs": "6.6.7", - "sass": "1.32.12", - "sass-loader": "11.0.1", + "sass": "1.35.1", + "sass-loader": "12.1.0", "semver": "7.3.5", "source-map": "0.7.3", - "source-map-loader": "2.0.1", + "source-map-loader": "3.0.0", "source-map-support": "0.5.19", "style-loader": "2.0.0", "stylus": "0.54.8", - "stylus-loader": "5.0.0", + "stylus-loader": "6.1.0", "terser": "5.7.0", - "terser-webpack-plugin": "5.1.2", + "terser-webpack-plugin": "5.1.3", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "5.39.1", - "webpack-dev-middleware": "4.1.0", + "tslib": "2.3.0", + "webpack": "5.44.0", + "webpack-dev-middleware": "5.0.0", "webpack-dev-server": "3.11.2", - "webpack-merge": "5.7.3", + "webpack-merge": "5.8.0", "webpack-subresource-integrity": "1.5.2" }, "engines": { @@ -166,15 +169,15 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^12.0.0", - "@angular/localize": "^12.0.0", - "@angular/service-worker": "^12.0.0", + "@angular/compiler-cli": "^12.0.0 || ^12.1.0-next", + "@angular/localize": "^12.0.0 || ^12.1.0-next", + "@angular/service-worker": "^12.0.0 || ^12.1.0-next", "karma": "^6.3.0", - "ng-packagr": "^12.0.0", + "ng-packagr": "^12.0.0 || ^12.1.0-next", "protractor": "^7.0.0", "tailwindcss": "^2.0.0", "tslint": "^6.1.0", - "typescript": "~4.2.3" + "typescript": "~4.2.3 || ~4.3.2" }, "peerDependenciesMeta": { "@angular/localize": { @@ -201,12 +204,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", - "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.0.5", + "@angular-devkit/core": "12.1.4", "rxjs": "6.6.7" }, "engines": { @@ -216,13 +219,13 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", - "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", "dev": true, "dependencies": { - "ajv": "8.2.0", - "ajv-formats": "2.0.2", + "ajv": "8.6.0", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", @@ -234,10 +237,10 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -250,79 +253,32 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "ajv": "^8.0.0" }, "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@angular-devkit/build-optimizer": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.5.tgz", - "integrity": "sha512-3XlDVVak3CfIgUjDZMoON7sxnI1vxhzEm2LvVg5yN98Q7ijnfykXiIzryEcplzTMTZwGNkem0361HDs1EX8zNg==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1201.4.tgz", + "integrity": "sha512-Hq+mDUe4xIyq4939JZaUkptsM89WnZOk8Qel6mS0T/bxMX/qs+nuGD5o+xDKkuayogbiTrLmyZBib0/90eSXEA==", "dev": true, "dependencies": { "source-map": "0.7.3", - "tslib": "2.2.0", - "typescript": "4.2.4" + "tslib": "2.3.0", + "typescript": "4.3.4" }, "bin": { "build-optimizer": "src/build-optimizer/cli.js" @@ -341,13 +297,26 @@ } } }, + "node_modules/@angular-devkit/build-optimizer/node_modules/typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.5.tgz", - "integrity": "sha512-cx8DVwOmogzeHS1dsZGWummwA3T1zqsJ6q9NIL0S0ZiOScZuz0j9zAOLjBkyCj5XexOFzHv3TcAVQyzJsi1tIw==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1201.4.tgz", + "integrity": "sha512-eMmbyHyWJZMQ1tfwVdja/iAk/eXJFYrF8b27gDV9gGI7MGB3KJ93AhkbPbcvlw4Hhx4+6M11GfeXzbwH0q9pnQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1200.5", + "@angular-devkit/architect": "0.1201.4", "rxjs": "6.6.7" }, "engines": { @@ -361,12 +330,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", - "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "dependencies": { - "@angular-devkit/core": "12.0.5", + "@angular-devkit/core": "12.1.4", "rxjs": "6.6.7" }, "engines": { @@ -376,13 +345,13 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", - "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", "dev": true, "dependencies": { - "ajv": "8.2.0", - "ajv-formats": "2.0.2", + "ajv": "8.6.0", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", @@ -395,9 +364,9 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -410,16 +379,27 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } }, "node_modules/@angular-devkit/core": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", - "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", "dependencies": { "ajv": "8.2.0", "ajv-formats": "2.0.2", @@ -434,10 +414,43 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "node_modules/@angular-devkit/schematics": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.1.4.tgz", + "integrity": "sha512-yD3y3pK/K5piOgvALFoCCiPp4H8emNa3yZL+vlpEpewVLpF1MM55LeTxc0PI5s0uqtOGVnvcbA5wYgMm3YsUEA==", + "dependencies": { + "@angular-devkit/core": "12.1.4", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "dependencies": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -449,31 +462,30 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@angular-devkit/schematics": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.0.4.tgz", - "integrity": "sha512-MEAAcOh1Y4R6O7HWo7mMXgRK9BSbCZ3rlx+aHmtWpNXohw0TRhNY5WmRnQTRvMA3qjR9nh0Uo7BkRpgwRfqmBw==", + "node_modules/@angular-devkit/schematics/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dependencies": { - "@angular-devkit/core": "12.0.4", - "ora": "5.4.0", - "rxjs": "6.6.7" + "ajv": "^8.0.0" }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6", - "yarn": ">= 1.13.0" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@angular-eslint/builder": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.0.0.tgz", - "integrity": "sha512-gvvXQDXXi0gsWZ25KyMqF/1b3AaX+CJbpVgTPqxJdEx4euvmG/m3993ynmpf+Kc+F+aI2O9W4TUbDbbLWoCjIA==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.3.1.tgz", + "integrity": "sha512-Py7Y9n0evIWGgEIrnMaLvalE1+Nw9HoY+fcYLYd9POfY0cug8j7hbkoPQ6rM7GzNHVcVsqEi/8C4DoF7RXXNRg==", "dev": true, + "dependencies": { + "@nrwl/devkit": ">= 12.0.0 < 13.0.0" + }, "peerDependencies": { "@angular/cli": ">= 12.0.0 < 13.0.0", "eslint": "*", @@ -481,12 +493,12 @@ } }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.0.0.tgz", - "integrity": "sha512-osdJdMu8bYFv9WGhC04AwRcbeKq4sxCQnShV7NiF0xkgNG9KqDaStytVhPjJFn2Ja1QhfiTGlcFFk4D/9aruog==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", + "integrity": "sha512-KBm27onYggRcusA/BxuSkDGpVnIs8yG4ARio8ZAhe0H2XIRJTzJZ7oIBBjugDau03AGX3VMG6wAXailjJvsywg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.23.0" + "@typescript-eslint/experimental-utils": "4.28.2" }, "peerDependencies": { "@angular/compiler": ">= 12.0.0 < 13.0.0", @@ -495,12 +507,12 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.0.0.tgz", - "integrity": "sha512-RF8PwN2A3U4ihd7sKYUM8wgPj46M30reziLl8CPPhN3H5Hn46nksmKmHRbPNakH2gW0Ba7NIxy+ocqUy0fQpcQ==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.3.1.tgz", + "integrity": "sha512-pz+nO64ma/9Sp2aeRnQ+Vktt7Fo1Lay/J+CG//3TIc3lYsoCTj4h42P6yCcxxJ9b4N7SUxMAnchA8eE5mJS4Ug==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.23.0", + "@typescript-eslint/experimental-utils": "4.28.2", "aria-query": "^4.2.2", "axobject-query": "^2.2.0" }, @@ -510,29 +522,10 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, "node_modules/@angular-eslint/template-parser": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.0.0.tgz", - "integrity": "sha512-gl5ansA2a8LY6TEjhe0k8NiQJJdEQPjjqpysO1Rpt3NWUYQkFMt+1+AnUyokHB1TU3/11dHRUjVWXj+pMtTIAA==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.3.1.tgz", + "integrity": "sha512-6DkXqTaVEHZdcN3isHQ2CDoTsKLuJ5C1SYEOuFzOU1Zp85SvjxO92v6gPkFPKk0iQNVRmQS2XcKef6weehUUGA==", "dev": true, "dependencies": { "eslint-scope": "^5.1.0" @@ -544,43 +537,42 @@ } }, "node_modules/@angular/animations": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.0.5.tgz", - "integrity": "sha512-BPdTCtgDJ9zNzHpuA6X3NmtzDiIt5SHZk840j0q3HCq6rP6C/oo2UnPT6w8YDOGMejDpWdHvTgXH4jVKDN1wCQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.1.4.tgz", + "integrity": "sha512-6PkVF2HGwmNdG0IUUyXkxwnLdX7xVUCFldKNFap90lWTEPumO7+zcmzP4JELE6jkmHSykTZjPwlWXvuxdP+YJg==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "12.0.5" + "@angular/core": "12.1.4" } }, "node_modules/@angular/cli": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.0.4.tgz", - "integrity": "sha512-kZaJ55udB/AjQ+q8CrQfk6JGWdnJpH3c2VtbvSuR/ihiG6zMSxwpXqt1rImQN0RfffG3bsHD2SpM+T7/LKPemw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.1.4.tgz", + "integrity": "sha512-LpyhyqWe3bFcuH3MrXeYoIPI1htjwG1b5ehETfq4qsMvNmuFON6QI+F7EWEpX7lItVQc2bES+ogasTZsZue/uw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@angular-devkit/architect": "0.1200.4", - "@angular-devkit/core": "12.0.4", - "@angular-devkit/schematics": "12.0.4", - "@schematics/angular": "12.0.4", + "@angular-devkit/architect": "0.1201.4", + "@angular-devkit/core": "12.1.4", + "@angular-devkit/schematics": "12.1.4", + "@schematics/angular": "12.1.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.1", "ini": "2.0.0", - "inquirer": "8.0.0", + "inquirer": "8.1.1", "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.2", + "npm-package-arg": "8.1.5", "npm-pick-manifest": "6.1.1", - "open": "8.0.2", - "ora": "5.4.0", - "pacote": "11.3.2", + "open": "8.2.1", + "ora": "5.4.1", + "pacote": "11.3.4", "resolve": "1.20.0", - "rimraf": "3.0.2", "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" @@ -594,51 +586,103 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@angular-devkit/core": "12.1.4", + "rxjs": "6.6.7" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "dev": true, + "dependencies": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" }, "engines": { - "node": ">=10" + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular/cli/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/@angular/common": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.0.5.tgz", - "integrity": "sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.1.4.tgz", + "integrity": "sha512-cyh2m5veGgWRFsrmPnwB/Ised90bFNZAjZepvW8WXrpEUa/tmi1yWU9+8ayRG7ztE08lyXncJSSut2Ss2PEhTA==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/core": "12.0.5", + "@angular/core": "12.1.4", "rxjs": "^6.5.3" } }, "node_modules/@angular/compiler": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.0.5.tgz", - "integrity": "sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.1.4.tgz", + "integrity": "sha512-csei4YTsdwYCWhr94AtW/Q3YyILLhjGVuV/zDZKQx5kB/3ukpUD+DppbblTo+NsLSk2BfsOepGUeCDMkIl9p3w==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz", - "integrity": "sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.1.4.tgz", + "integrity": "sha512-RMEXJ92KO30waKoAha1qZHGLVyUimgisYVmaTwPlYJ534tAoilILkav8Wa4UMOJx1Dma0wTzbAqMYdghoQJXQA==", "dev": true, "dependencies": { "@babel/core": "^7.8.6", @@ -653,8 +697,8 @@ "semver": "^7.0.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "tslib": "^2.1.0", - "yargs": "^16.2.0" + "tslib": "^2.2.0", + "yargs": "^17.0.0" }, "bin": { "ivy-ngcc": "ngcc/main-ivy-ngcc.js", @@ -666,8 +710,8 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/compiler": "12.0.5", - "typescript": ">=4.2.3 <4.3" + "@angular/compiler": "12.1.4", + "typescript": ">=4.2.3 <4.4" } }, "node_modules/@angular/compiler-cli/node_modules/source-map": { @@ -680,11 +724,11 @@ } }, "node_modules/@angular/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.0.5.tgz", - "integrity": "sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.1.4.tgz", + "integrity": "sha512-dG7KtW0l3jI8lapmenSu1wV/d3VOphAjDxVqWOrwh+kI0da7677cEg0Ms5YIF8Nf/++WleyNxk6AIHbDIig+Sw==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" @@ -695,45 +739,45 @@ } }, "node_modules/@angular/forms": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.0.5.tgz", - "integrity": "sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.1.4.tgz", + "integrity": "sha512-HlPZH2HllX2/XEdAT7PkAYIEXn69KanvjxFD40++Xx5a0lMsv7HleYqRdRZYkxKUNCJljL3UqvI5sZ5CCOoVGw==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.0.5", - "@angular/core": "12.0.5", - "@angular/platform-browser": "12.0.5", + "@angular/common": "12.1.4", + "@angular/core": "12.1.4", + "@angular/platform-browser": "12.1.4", "rxjs": "^6.5.3" } }, "node_modules/@angular/language-service": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.0.5.tgz", - "integrity": "sha512-mhb21Ixdky3KOAQ9eps16tzP5hm/uKwCToLM244Llgozem1zHdfc2LPePAwWt/9fSl642xX2JKWjjKFgC4bgNw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.1.4.tgz", + "integrity": "sha512-NooCGWiTY74DN3uFE8eI1ATtxx4TQzulbV7qNNG9Bz8QJyLRykYart7Ajxh0bF5upR1bjPmHr6MvgO6aI43VUQ==", "dev": true, "engines": { "node": "^12.14.1 || >=14.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.0.5.tgz", - "integrity": "sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.1.4.tgz", + "integrity": "sha512-klJbU75lUGgwZkgyXsHU47JuYh8c7prukw7MIWLw7liHXPK//bLj8kOfKwifSIJ0xzDg9UfdNSGCQqGP5N0SaQ==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/animations": "12.0.5", - "@angular/common": "12.0.5", - "@angular/core": "12.0.5" + "@angular/animations": "12.1.4", + "@angular/common": "12.1.4", + "@angular/core": "12.1.4" }, "peerDependenciesMeta": { "@angular/animations": { @@ -742,45 +786,45 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz", - "integrity": "sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.1.4.tgz", + "integrity": "sha512-gEE7F45y+mExb9Bib9SQkWQICHHxbo884AhCw4ZcHWWv2aJl1Y09Rhp+ZE542wjoFFpB2o+BXguc3PcnXB/3Ww==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.0.5", - "@angular/compiler": "12.0.5", - "@angular/core": "12.0.5", - "@angular/platform-browser": "12.0.5" + "@angular/common": "12.1.4", + "@angular/compiler": "12.1.4", + "@angular/core": "12.1.4", + "@angular/platform-browser": "12.1.4" } }, "node_modules/@angular/router": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.0.5.tgz", - "integrity": "sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.1.4.tgz", + "integrity": "sha512-wbw/w1yM/GiCnQPykQ7rHkywqQA5LPF5/MRa4Khi7BcpJXgutG9h/40HREsQzzYY46+qhXmST8A3E5PNgURsbw==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "engines": { "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.0.5", - "@angular/core": "12.0.5", - "@angular/platform-browser": "12.0.5", + "@angular/common": "12.1.4", + "@angular/core": "12.1.4", + "@angular/platform-browser": "12.1.4", "rxjs": "^6.5.3" } }, "node_modules/@angular/service-worker": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.0.5.tgz", - "integrity": "sha512-ZJ8EhuTaktZgoo1ZylmiTlxmALaAiK7ow0vTInfuRSkVbrUhuJQv3qqAEoGAgLH5a3QW+E8/8CoMzNMDcwpWXQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.1.4.tgz", + "integrity": "sha512-rOoCuSzT8GNgDQFssH09dOegkkRSLHMBCODTbZRNVahCu7oi5ixUJOntHkCshFBczx8qCxjA6jOrnJ2WasSD5w==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" }, "bin": { "ngsw-config": "ngsw-config.js" @@ -789,8 +833,8 @@ "node": "^12.14.1 || >=14.0.0" }, "peerDependencies": { - "@angular/common": "12.0.5", - "@angular/core": "12.0.5" + "@angular/common": "12.1.4", + "@angular/core": "12.1.4" } }, "node_modules/@babel/code-frame": { @@ -806,29 +850,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", - "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.9.tgz", + "integrity": "sha512-p3QjZmMGHDGdpcwEYYWu7i7oJShJvtgMjJeb0W95PPhSm++3lm8YXYOh45Y6iCN9PkZLTZ7CIX5nFrp7pw7TXw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -863,14 +907,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/source-map": { @@ -935,14 +982,14 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", + "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.7", "@babel/helper-optimise-call-expression": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5" @@ -1024,20 +1071,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-get-function-arity": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", @@ -1063,9 +1096,9 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", - "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", "dev": true, "dependencies": { "@babel/types": "^7.14.5" @@ -1087,33 +1120,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", + "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.8", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" }, "engines": { "node": ">=6.9.0" @@ -1170,12 +1189,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.14.8" }, "engines": { "node": ">=6.9.0" @@ -1206,9 +1225,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1238,43 +1257,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "dev": true, "dependencies": { "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" }, "engines": { "node": ">=6.9.0" @@ -1295,9 +1286,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.9.tgz", + "integrity": "sha512-RdUTOseXJ8POjjOeEBEvNMIZU/nm4yu2rufRkcibzkkg7DmQvXU8v3M4Xk9G7uuI86CDGkKcuDWgioqZm+mScQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1324,9 +1315,9 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz", - "integrity": "sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5", @@ -1470,12 +1461,12 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz", - "integrity": "sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.14.7", "@babel/helper-compilation-targets": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -1764,14 +1755,17 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1808,9 +1802,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", + "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.14.5", @@ -1844,9 +1838,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz", - "integrity": "sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2037,9 +2031,9 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz", - "integrity": "sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.14.5" @@ -2143,18 +2137,21 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", - "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } @@ -2276,34 +2273,34 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", - "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.13.11", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -2313,48 +2310,51 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.2", - "@babel/plugin-transform-classes": "^7.14.2", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.17", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.2", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } @@ -2385,21 +2385,24 @@ } }, "node_modules/@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz", - "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz", + "integrity": "sha512-64RiH2ON4/y8qYtoa8rUiyam/tUVyGqRyNYhe+vCRGmjnV4bUlZvY+mwd0RrmLoCpJpdq3RsrNqKb7SJdw/4kw==", "dev": true, "dependencies": { - "core-js-pure": "^3.14.0", + "core-js-pure": "^3.16.0", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -2407,29 +2410,32 @@ } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", - "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.9.tgz", + "integrity": "sha512-bldh6dtB49L8q9bUyB7bC20UKgU+EFDwKJylwl234Kv+ySZeMD31Xeht6URyueQ6LrRRpF2tmkfcZooZR9/e8g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.14.9", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.14.9", + "@babel/types": "^7.14.9", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2438,12 +2444,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.9.tgz", + "integrity": "sha512-4yoHbhDYzFa0GLfCzLp5GxH7vPPMAHdZjyE7M/OajM9037zhx0rf+iNsJwp4PT0MSFpwjG7BsHEbPkBQpZ6cYA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.14.9", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -2461,12 +2467,12 @@ } }, "node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.9.tgz", + "integrity": "sha512-u0bLTnv3DFHeaQLYzb7oRJ1JHr1sv/SYDM7JSqHFFLwXG1wTZRughxFI5NCP8qBEo1rVVsn7Yg2Lvw49nne/Ow==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2483,18 +2489,32 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", "dev": true, "engines": { "node": ">=10.0.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.7.tgz", + "integrity": "sha512-aNKZEoMESDzOBjKxCWrFuG50mcpMeKVBnBNko4+IZZ5t9zXYs8GT1KB0ZaOq1YUsKumDRc6YII/TQm309MJ0KQ==", + "dev": true, + "dependencies": { + "comment-parser": "1.2.3", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + }, + "engines": { + "node": "^12.20 || ^14.14.0 || ^16" + } + }, "node_modules/@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2511,10 +2531,26 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2535,6 +2571,12 @@ "node": ">= 4" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2547,12 +2589,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "node_modules/@ionic/angular": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.6.7.tgz", - "integrity": "sha512-urc1N64u3GN/iS6B/7TFctawGyYzz2JICdU0bGpe1DsMwLqBCwRpXUBeqMIA/ptaufepUtLeE+lr77FTRbqzOQ==", + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.6.12.tgz", + "integrity": "sha512-1zKJ21a7waKSuEwiZctZw+o6vVHd8CJ1GtUqCl9q+2L9glL41xCq+oV58YzPYDrZiryjQjUZWWW3K4LP9cD0EA==", "dependencies": { - "@ionic/core": "5.6.7", + "@ionic/core": "5.6.12", "tslib": "^1.9.3" }, "peerDependencies": { @@ -2582,15 +2644,93 @@ "@angular-devkit/schematics": "^12.0.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/@ionic/angular/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ionic/core": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.6.7.tgz", - "integrity": "sha512-bLH1sS2DI+C8trfYe/L96G2y+hJ9fK/azrNqGvGwHQAPy2li89DldbH+wPqe/Wclru8ZaWjRv35AyLBawixC2w==", + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.6.12.tgz", + "integrity": "sha512-qFQ8r0kdI2p5wT72EQOwBrIts7XD1qA7/vCR7OlHPTA+VDyiYSzpLcWcFZHzdXKQzbn7hYbCJr3IsBNmBYrZ1g==", "dependencies": { "@stencil/core": "^2.4.0", "ionicons": "^5.5.1", @@ -2620,12 +2760,12 @@ } }, "node_modules/@ngtools/webpack": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.5.tgz", - "integrity": "sha512-yoKK6qhEm1iWnniz50xzOBqa3U1iUrjZs+SpLOXRZFonpwObz8j4zraR231K4uV4kXcX40qorYk9iOf+ljG4JQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.1.4.tgz", + "integrity": "sha512-hXc8dTnRfDB7o1Pd7a07aw0rjGmVLXU28+cTHQJliosgD3obcjfZ4QPA0k97vlQMtqVJawuShRfyiUKrpsJf8Q==", "dev": true, "dependencies": { - "enhanced-resolve": "5.7.0" + "enhanced-resolve": "5.8.2" }, "engines": { "node": "^12.14.1 || >=14.0.0", @@ -2633,8 +2773,8 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^12.0.0", - "typescript": "~4.2.3", + "@angular/compiler-cli": "^12.0.0 || ^12.1.0-next", + "typescript": "~4.2.3 || ~4.3.2", "webpack": "^5.30.0" } }, @@ -2695,12 +2835,12 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -2708,21 +2848,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -2730,9 +2870,9 @@ } }, "node_modules/@npmcli/git": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.9.tgz", - "integrity": "sha512-hTMbMryvOqGLwnmMBKs5usbPsJtyEsMsgXwJbmNrsEuQQh1LAIMDU77IoOrwkCg+NgQWl+ySlarJASwM3SutCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^1.3.2", @@ -2745,36 +2885,6 @@ "which": "^2.0.2" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", @@ -2832,13 +2942,142 @@ "read-package-json-fast": "^2.0.1" } }, + "node_modules/@nrwl/devkit": { + "version": "12.6.3", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-12.6.3.tgz", + "integrity": "sha512-HeBYesksZirm85sp5a2F23y/V8z2ajBN+Ej29R9E/hpnhOsZScpLxgxmhl+Cq4bd1omVJ6XRvUDwGwuIf1kQmg==", + "dev": true, + "dependencies": { + "@nrwl/tao": "12.6.3", + "ejs": "^3.1.5", + "ignore": "^5.0.4", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tslib": "^2.0.0" + } + }, + "node_modules/@nrwl/devkit/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/tao": { + "version": "12.6.3", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-12.6.3.tgz", + "integrity": "sha512-KlVdQEyxi/mk0X9FBY6w72XouiMesD3FCCrqgKx5oShOx2GehuP+LhOOrfnuMOT7WgKBCoHnqhnK1x6X1F5/XQ==", + "dev": true, + "dependencies": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.0.0", + "yargs-parser": "20.0.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/tao/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nrwl/tao/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nrwl/tao/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@nrwl/tao/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/tao/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@schematics/angular": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.0.4.tgz", - "integrity": "sha512-rC4/+c6p3S/ezDeJzAstrwzdpYgcYzHumtzVSDDM+3Kx0QBUTq/Nj6sk1e2C/fgtV5Jb2INEkTvrih+HP7I0wA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.1.4.tgz", + "integrity": "sha512-xGqgGI6GWk4EFdKis8FmSESxoLgjnLQbaRE1t1KZCkSKJzqkOj0R9wiDrtZfcrbPxIkLL+3fAk2ThwwPznT6yw==", "dependencies": { - "@angular-devkit/core": "12.0.4", - "@angular-devkit/schematics": "12.0.4", + "@angular-devkit/core": "12.1.4", + "@angular-devkit/schematics": "12.1.4", "jsonc-parser": "3.0.0" }, "engines": { @@ -2847,10 +3086,59 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "dependencies": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/angular/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@stencil/core": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.5.2.tgz", - "integrity": "sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.6.0.tgz", + "integrity": "sha512-QsxWayZyusnqSZrlCl81R71rA3KqFjVVQSH4E0rGN15F1GdQaFonKlHLyCOLKLig1zzC+DQkLLiUuocexuvdeQ==", "bin": { "stencil": "bin/stencil" }, @@ -2877,10 +3165,34 @@ "node": ">=10.13.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "node_modules/@types/chart.js": { - "version": "2.9.32", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.32.tgz", - "integrity": "sha512-d45JiRQwEOlZiKwukjqmqpbqbYzUX2yrXdH9qVn6kXpPDsTYCo6YbfFOlnUaJ8S/DhJwbBJiLsMjKpW5oP8B2A==", + "version": "2.9.34", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.34.tgz", + "integrity": "sha512-CtZVk+kh1IN67dv+fB0CWmCLCRrDJgqOj15qPic2B1VCMovNO6B7Vhf/TgPpNscjhAL1j+qUntDMWb9A4ZmPTg==", "dependencies": { "moment": "^2.10.2" } @@ -2892,21 +3204,21 @@ "dev": true }, "node_modules/@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "node_modules/@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, "node_modules/@types/eslint": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", - "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2914,9 +3226,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2924,9 +3236,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, "node_modules/@types/glob": { @@ -2940,30 +3252,24 @@ } }, "node_modules/@types/jasmine": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.9.tgz", - "integrity": "sha512-B53NIwMj/AO0O+xfSWLYmKB0Mo6TYxfv2Mk8/c1T2w/e38t55iaPR6p7pHXTTtqfTmevPK3i8T1YweYFTZlxDw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.8.2.tgz", + "integrity": "sha512-u5h7dqzy2XpXTzhOzSNQUQpKGFvROF8ElNX9P/TJvsHnTg/JvsAseVsGWQAQQldqanYaM+5kwxW909BBFAUYsg==", "dev": true }, "node_modules/@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", "dev": true, "dependencies": { "@types/jasmine": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/minimatch": { @@ -2973,9 +3279,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "12.20.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.10.tgz", - "integrity": "sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw==", + "version": "16.4.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.10.tgz", + "integrity": "sha512-TmVHsm43br64js9BqHWqiDZA+xMtbUpI1MBIA0EyiBmoV9pcEYFOSdj5fr6enZNfh4fChh+AGOLIzGwJnkshyQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -2991,9 +3297,9 @@ "dev": true }, "node_modules/@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz", + "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", "dev": true }, "node_modules/@types/source-list-map": { @@ -3009,9 +3315,9 @@ "dev": true }, "node_modules/@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", "dev": true, "dependencies": { "@types/node": "*", @@ -3029,19 +3335,18 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", - "integrity": "sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", + "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.16.1", - "@typescript-eslint/scope-manager": "4.16.1", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.0", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3061,17 +3366,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", - "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", + "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.16.1", - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/typescript-estree": "4.16.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3085,9 +3390,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3098,18 +3403,18 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", - "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3124,39 +3429,18 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz", - "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", + "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.23.0", - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/typescript-estree": "4.23.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3170,13 +3454,13 @@ } }, "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz", - "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", + "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/visitor-keys": "4.23.0" + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3187,12 +3471,12 @@ } }, "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", - "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/types": "4.28.2", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3204,15 +3488,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.16.1.tgz", - "integrity": "sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.16.1", - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/typescript-estree": "4.16.1", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "debug": "^4.3.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3231,9 +3515,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3244,18 +3528,18 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", - "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3270,35 +3554,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/parser/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", - "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1" + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3309,9 +3572,9 @@ } }, "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3322,9 +3585,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz", - "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", + "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3335,18 +3598,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz", - "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", + "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/visitor-keys": "4.23.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3362,12 +3625,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", - "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/types": "4.28.2", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3378,34 +3641,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", - "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/types": "4.29.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3417,9 +3659,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3430,148 +3672,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -3631,9 +3873,9 @@ } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3701,14 +3943,13 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -3741,39 +3982,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "optional": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true, - "peer": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -3781,9 +3989,9 @@ "dev": true }, "node_modules/angular-mydatepicker": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.4.tgz", - "integrity": "sha512-TOSK5z38x5ppycAaVUVQDcGWz+XJrMIACoAwbpuLcZOIAMxGBUMgB2JTtFTlhoeVM2J1ZLoz/tepo+ZxlTD+WA==", + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.5.tgz", + "integrity": "sha512-nKXUA3NhzMJ02jX+AiqpEr0kl2lCS3tGaFeHcyBFhwlDao9BO9i3403NXaFliOCeN2M4VvUNQs8pggLE7DECIA==", "dependencies": { "tslib": "^1.9.0" } @@ -3917,11 +4125,18 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/argparse/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/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } }, "node_modules/arr-diff": { "version": "4.0.0", @@ -4065,13 +4280,10 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true }, "node_modules/async-each": { "version": "1.0.3", @@ -4091,6 +4303,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -4185,6 +4406,12 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, "node_modules/babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -4263,9 +4490,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.2.2", @@ -4458,6 +4685,18 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4507,16 +4746,16 @@ } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001219", + "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.73" }, "bin": { "browserslist": "cli.js" @@ -4602,9 +4841,9 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/buffer-indexof": { @@ -4613,17 +4852,6 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "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, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -4640,9 +4868,9 @@ } }, "node_modules/cacache": { - "version": "15.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", - "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", "dev": true, "dependencies": { "@npmcli/move-file": "^1.0.1", @@ -4710,15 +4938,12 @@ } }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-api": { @@ -4734,9 +4959,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001237", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz", - "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==", + "version": "1.0.30001248", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", + "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==", "dev": true, "funding": { "type": "opencollective", @@ -4819,24 +5044,24 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -5086,9 +5311,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.0.1.tgz", - "integrity": "sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.6.0.tgz", + "integrity": "sha512-8yMrtE20ZxH1YWvvSoeJFtvqY+GIAOfU+mZ3jx7ZSiEMasnAmNqD1BKUP3CuCWcy/XHgcXkLW6YU8C35nhOYVg==", "dev": true }, "node_modules/colorette": { @@ -5119,18 +5344,20 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } }, "node_modules/comment-parser": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", - "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.3.tgz", + "integrity": "sha512-vnqDwBSXSsdAkGS5NjwMIPelE47q+UkEgWKHvCDNhVIIaQSUFY6sNnEYGzdoPGMdpV+7KR3ZkRd7oyWIjtuvJg==", "dev": true, "engines": { - "node": ">= 6.0.0" + "node": "^12.20 || ^14.14.0 || ^16" } }, "node_modules/commondir": { @@ -5250,15 +5477,6 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "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.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -5281,9 +5499,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" @@ -5323,41 +5541,80 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", - "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.0.tgz", + "integrity": "sha512-k8UB2jLIb1Jip2nZbCz83T/XfhfjX6mB1yLJNYKrpYi7FQimfOoFv/0//iT6HV1K8FwUB5yUbCcnpLebJXJTug==", "dev": true, "dependencies": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", + "p-limit": "^3.1.0", "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "serialize-javascript": "^5.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", + "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -5370,9 +5627,9 @@ } }, "node_modules/core-js": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.12.0.tgz", - "integrity": "sha512-SaMnchL//WwU2Ot1hhkPflE8gzo7uq1FGvUJ8GKmi3TOU7rGTHIU+eir1WGf6qOtTyxdfdcp10yPdGZ59sQ3hw==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz", + "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==", "dev": true, "hasInstallScript": true, "funding": { @@ -5381,9 +5638,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.14.0.tgz", - "integrity": "sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.0.tgz", + "integrity": "sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -5404,9 +5661,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz", - "integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.0.tgz", + "integrity": "sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -5449,6 +5706,12 @@ "node": ">=10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/critters": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", @@ -5478,9 +5741,9 @@ } }, "node_modules/critters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -5546,21 +5809,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -5636,9 +5884,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", - "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.1.tgz", + "integrity": "sha512-BZ1aOuif2Sb7tQYY1GeCjG7F++8ggnwUkH5Ictw0mrdpqpEd+zWmcPdstnH2TItlb74FqR0DrVEieon221T/1Q==", "dev": true, "dependencies": { "timsort": "^0.3.0" @@ -5732,15 +5980,14 @@ } }, "node_modules/css-loader": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", - "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", + "integrity": "sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w==", "dev": true, "dependencies": { - "camelcase": "^6.2.0", "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", - "postcss": "^8.2.10", + "postcss": "^8.2.15", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", @@ -5760,13 +6007,44 @@ "webpack": "^4.27.0 || ^5.0.0" } }, + "node_modules/css-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/css-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/css-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -5778,29 +6056,14 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/css-minimizer-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-yIrqG0pPphR1RoNx2wDxYmxRf2ubRChLDXxv7ccipEm5bRKsZRYp8n+2peeXehtTF5s3yNxlqsdz3WQOsAgUkw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-RGFIv6iZWUPO2T1vE5+5pNCSs2H2xtHYRdfZPiiNH8Of6QOn9BeFnZSoHiQMkmsxOO/JkPe4BpKfs7slFIWcTA==", "dev": true, "dependencies": { "cssnano": "^5.0.0", - "jest-worker": "^26.3.0", + "jest-worker": "^27.0.2", "p-limit": "^3.0.2", "postcss": "^8.2.9", "schema-utils": "^3.0.0", @@ -5826,13 +6089,44 @@ } } }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -6021,14 +6315,15 @@ } }, "node_modules/cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.7.tgz", + "integrity": "sha512-7C0tbb298hef3rq+TtBbMuezBQ9VrFtrQEsPNuBKNVgWny/67vdRsnq8EoNu7TRjAHURgYvWlRIpCUmcMZkRzw==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.0", "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -6115,9 +6410,9 @@ "dev": true }, "node_modules/d3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", - "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.1.tgz", + "integrity": "sha512-74zonD4nAtxF9dtwFwJ3RuoHPh2D/UTFX26midBuMVH+7pRbOezuyLUIb8mbQMuYFlcUXT+xy++orCmnvMM/CA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -6273,25 +6568,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -6516,9 +6792,9 @@ } }, "node_modules/date-fns": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", - "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz", + "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==", "engines": { "node": ">=0.11" }, @@ -6888,10 +7164,25 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.3.793", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.793.tgz", + "integrity": "sha512-l9NrGV6Mr4ov5mayYPvIWcwklNw5ROmy6rllzz9dCACw9nKE5y+s5uQk+CBJMetxrWZ6QJFsvEfG6WDcH2IGUg==", "dev": true }, "node_modules/emoji-regex": { @@ -6928,19 +7219,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6980,10 +7258,31 @@ "node": ">=8.0.0" } }, + "node_modules/engine.io/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7054,9 +7353,9 @@ } }, "node_modules/es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7065,11 +7364,12 @@ "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.3", "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -7084,9 +7384,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, "node_modules/es-to-primitive": { @@ -7146,13 +7446,14 @@ } }, "node_modules/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -7248,103 +7549,26 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/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/eslint-module-utils/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/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/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/eslint-module-utils/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/eslint-module-utils/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/eslint-module-utils/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/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", + "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "engines": { @@ -7364,13 +7588,12 @@ } }, "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=", + "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", - "isarray": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" @@ -7383,30 +7606,49 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "30.7.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.6.tgz", - "integrity": "sha512-w18IOiS/9ahKgRfQOuHbce+EQYx3fwIkZhUZDEK+augNlhJkzgTSZkrBkzaflSbFNZ9/Tk4xzUABEaTbsBSzew==", + "version": "36.0.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.0.6.tgz", + "integrity": "sha512-vOm27rI2SMfi1bOAYmzzGkanMCD/boquKwvN5ECi8EF9ASsXJwlnCzYtiOYpsDpbC2+6JXEHAmWMkqYNA3BWRw==", "dev": true, "dependencies": { - "comment-parser": "^0.7.6", - "debug": "^4.2.0", - "jsdoctypeparser": "^9.0.0", - "lodash": "^4.17.20", - "regextras": "^0.7.1", - "semver": "^7.3.2", + "@es-joy/jsdoccomment": "0.10.7", + "comment-parser": "1.2.3", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20 || ^14.14.0 || ^16" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/eslint-plugin-prefer-arrow": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz", - "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, "peerDependencies": { "eslint": ">=2.0.0" @@ -7426,27 +7668,21 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-visitor-keys": { @@ -7467,6 +7703,22 @@ "@babel/highlight": "^7.10.4" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -7483,9 +7735,9 @@ } }, "node_modules/eslint/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -7522,10 +7774,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -7555,6 +7831,12 @@ "node": ">= 4" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7784,6 +8066,18 @@ "node": ">=0.10.0" } }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -8034,6 +8328,30 @@ "node": ">=4" } }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -8101,17 +8419,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8" @@ -8129,9 +8446,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -8188,6 +8505,15 @@ "dev": true, "optional": true }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8250,7 +8576,7 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-up": { + "node_modules/find-cache-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", @@ -8263,6 +8589,78 @@ "node": ">=8" } }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -8276,16 +8674,10 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "node_modules/flatten": { @@ -8295,9 +8687,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "dev": true, "funding": [ { @@ -8376,6 +8768,21 @@ "node": ">= 0.6" } }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -8599,9 +9006,9 @@ } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "dependencies": { "array-union": "^2.1.0", @@ -8653,6 +9060,28 @@ "node": ">=6" } }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9128,12 +9557,11 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -9291,15 +9719,6 @@ "node": ">=6" } }, - "node_modules/import-local/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/import-local/node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -9367,19 +9786,20 @@ } }, "node_modules/inquirer": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.0.0.tgz", - "integrity": "sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz", + "integrity": "sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.3.0", "run-async": "^2.4.0", "rxjs": "^6.6.6", "string-width": "^4.1.0", @@ -9406,9 +9826,9 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -9467,6 +9887,20 @@ "node": ">=6" } }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/internmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", @@ -9476,9 +9910,9 @@ } }, "node_modules/ionicons": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.1.tgz", - "integrity": "sha512-1auVisfaXmkmxINer8Q3kJGHP1vSxk86hf7By95eJ+Av9+oBcNuAEBfSe3jaMaGRVxVw8U/2j23MFq7R3c0HPg==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.3.tgz", + "integrity": "sha512-L71djrMi8pAad66tpwdnO1vwcyluCFvehzxU1PpH1k/HpYBZhZ5IaYhqXipmqUvu5aEbd4cbRguYyI5Fd4bxTw==", "dependencies": { "@stencil/core": "^2.5.0" } @@ -9627,9 +10061,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -10070,6 +10504,24 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", @@ -10085,15 +10537,15 @@ } }, "node_modules/jasmine-core": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.7.1.tgz", - "integrity": "sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", "dev": true }, "node_modules/jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "dependencies": { "colors": "1.4.0" @@ -10115,14 +10567,14 @@ } }, "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" @@ -10138,15 +10590,18 @@ } }, "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { @@ -10174,16 +10629,13 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "node_modules/jsdoctypeparser": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", - "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "node_modules/jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", "dev": true, - "bin": { - "jsdoctypeparser": "bin/jsdoctypeparser" - }, "engines": { - "node": ">=10" + "node": ">=12.0.0" } }, "node_modules/jsesc": { @@ -10217,10 +10669,9 @@ "dev": true }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10261,10 +10712,13 @@ "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -10294,9 +10748,9 @@ } }, "node_modules/jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", + "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", "dev": true, "dependencies": { "lie": "~3.3.0", @@ -10375,6 +10829,18 @@ "which": "^1.2.1" } }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/karma-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", @@ -10501,12 +10967,12 @@ } }, "node_modules/karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", "dev": true, "peerDependencies": { - "jasmine-core": ">=3.5", + "jasmine-core": ">=3.8", "karma": ">=0.9", "karma-jasmine": ">=1.1" } @@ -10529,16 +10995,31 @@ "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8.17.0" + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/killable": { @@ -10592,15 +11073,15 @@ } }, "node_modules/less-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-8.1.1.tgz", - "integrity": "sha512-K93jJU7fi3n6rxVvzp8Cb88Uy9tcQKfHlkoezHwKILXhlNYiRQl4yowLIkQqmBXOH/5I8yoKiYeIf781HGkW9g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.0.tgz", + "integrity": "sha512-JjioAkw9qyavL0BzMPUOHJa0a20fh+ipq/MNZH4OkU8qERsCMeZIWRE0FDBIx2O+cFguvY01vHh/lmBA9LyWDg==", "dev": true, "dependencies": { "klona": "^2.0.4" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -10688,9 +11169,9 @@ } }, "node_modules/license-webpack-plugin": { - "version": "2.3.19", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.19.tgz", - "integrity": "sha512-z/izhwFRYHs1sCrDgrTUsNJpd+Xsd06OcFWSwHz/TiZygm5ucweVZi1Hu14Rf6tOj/XAl1Ebyc7GW6ZyyINyWA==", + "version": "2.3.20", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", + "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", "dev": true, "dependencies": { "@types/webpack-sources": "^0.1.5", @@ -10711,6 +11192,15 @@ "immediate": "~3.0.5" } }, + "node_modules/lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -10718,14 +11208,14 @@ "dev": true }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "engines": { @@ -10733,15 +11223,25 @@ } }, "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "dependencies": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + } + }, + "node_modules/load-json-file/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/loader-runner": { @@ -10768,15 +11268,16 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/lodash": { @@ -10856,9 +11357,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10916,6 +11417,12 @@ "node": ">=8.0" } }, + "node_modules/log4js/node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "node_modules/loglevel": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", @@ -10980,13 +11487,13 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "8.0.14", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", - "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.4.tgz", + "integrity": "sha512-sQWNKMYqSmbAGXqJg2jZ+PmHh5JAybvwu0xM8mZR/bsTjGiTASj3ldXJV7KFHy1k/IJIBkjxQFoWIVsv9+PQMg==", "dev": true, "dependencies": { "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", + "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", @@ -10997,6 +11504,7 @@ "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", "promise-retry": "^2.0.1", "socks-proxy-agent": "^5.0.0", "ssri": "^8.0.0" @@ -11198,21 +11706,21 @@ } }, "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "dependencies": { - "mime-db": "1.47.0" + "mime-db": "1.49.0" }, "engines": { "node": ">= 0.6" @@ -11227,9 +11735,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.5.1.tgz", - "integrity": "sha512-wEpr0XooH6rw/Mlf+9KTJoMBLT3HujzdTrmohPjAzF47N4Q6yAeczQLpRD/WxvAtXvskcXbily7TAdCfi2M4Dg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", "dev": true, "dependencies": { "loader-utils": "^2.0.0", @@ -11247,13 +11755,44 @@ "webpack": "^4.4.0 || ^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -11314,9 +11853,9 @@ } }, "node_modules/minipass-fetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", - "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.4.tgz", + "integrity": "sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ==", "dev": true, "dependencies": { "minipass": "^3.1.0", @@ -11501,9 +12040,9 @@ "dev": true }, "node_modules/needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", + "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==", "dev": true, "optional": true, "dependencies": { @@ -11528,6 +12067,19 @@ "ms": "^2.1.1" } }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -11560,9 +12112,9 @@ } }, "node_modules/ngx-cookie-service": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-12.0.0.tgz", - "integrity": "sha512-/Pklpn8Ul0P016Dc5isEU8AnTT3CI6Zz1JhrW1uH/3oJbfW7MGTtJAgAv1Rk92rfe+kNTDh+O+yj0xmr1Mt/tA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-12.0.3.tgz", + "integrity": "sha512-F5xJBTrrreI2DERGOrO6U+L7s031HxTER+3Z4gDCwxdTl4AXmtWddMxxQVw7KflOLZ4InYEs6FjQsXmKU4HsJg==", "dependencies": { "tslib": "^2.0.0" }, @@ -11622,21 +12174,6 @@ "node": ">= 10.12.0" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/node-releases": { "version": "1.1.73", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", @@ -11704,9 +12241,9 @@ } }, "node_modules/normalize-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.0.1.tgz", - "integrity": "sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "engines": { "node": ">=10" @@ -11743,9 +12280,9 @@ "dev": true }, "node_modules/npm-package-arg": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.2.tgz", - "integrity": "sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", "dev": true, "dependencies": { "hosted-git-info": "^4.0.1", @@ -11787,13 +12324,12 @@ } }, "node_modules/npm-registry-fetch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", - "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", + "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", @@ -11965,9 +12501,9 @@ } }, "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12108,9 +12644,9 @@ } }, "node_modules/open": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.0.2.tgz", - "integrity": "sha512-NV5QmWJrTaNBLHABJyrb+nd5dXI5zfea/suWawBhkHzAbVhLLiJdrqMgxMypGK9Eznp2Ltoh7SAVkQ3XAucX7Q==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -12163,9 +12699,9 @@ } }, "node_modules/ora": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", - "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -12199,9 +12735,9 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12295,30 +12831,36 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "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": "^2.2.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" + } + }, + "node_modules/p-locate/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/p-map": { @@ -12358,9 +12900,9 @@ } }, "node_modules/pacote": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.2.tgz", - "integrity": "sha512-lMO7V9aMhyE5gfaSFxKfW3OTdXuFBNQJfuNuet3NPzWWhOYIW90t85vHcHLDjdhgmfAdAHyh9q1HAap96ea0XA==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.4.tgz", + "integrity": "sha512-RfahPCunM9GI7ryJV/zY0bWQiokZyLqaSNHXtbNSoLb7bwTvBbJBEyCJ01KWs4j1Gj7GmX8crYXQ1sNX6P2VKA==", "dev": true, "dependencies": { "@npmcli/git": "^2.0.1", @@ -12376,7 +12918,7 @@ "npm-package-arg": "^8.0.1", "npm-packlist": "^2.1.4", "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^10.0.0", + "npm-registry-fetch": "^11.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", @@ -12515,12 +13057,12 @@ "dev": true }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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": ">=8" + "node": ">=4" } }, "node_modules/path-is-absolute": { @@ -12548,9 +13090,9 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-to-regexp": { @@ -12575,9 +13117,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true, "engines": { "node": ">=8.6" @@ -12617,15 +13159,27 @@ } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "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": "^4.0.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/portfinder": { @@ -12642,6 +13196,15 @@ "node": ">= 0.12.0" } }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -12673,9 +13236,9 @@ } }, "node_modules/postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "dev": true, "dependencies": { "colorette": "^1.2.2", @@ -13712,9 +14275,9 @@ } }, "node_modules/postcss-import": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.1.tgz", - "integrity": "sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -13830,17 +14393,17 @@ } }, "node_modules/postcss-loader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.2.0.tgz", - "integrity": "sha512-uSuCkENFeUaOYsKrXm0eNNgVIxc71z8RcckLMbVw473rGojFnrUeqEz6zBgXsH2q1EIzXnO/4pEz9RhALjlITA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", + "integrity": "sha512-yA/cXBfACkthZNA2hQxOnaReVfQ6uLmvbEDQzNafpbK40URZJvP/28dL1DG174Gvz3ptkkHbbwDBCh+gXR94CA==", "dev": true, "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", - "semver": "^7.3.4" + "semver": "^7.3.5" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -14989,15 +15552,6 @@ "node": ">=0.10.0" } }, - "node_modules/protractor/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/protractor/node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -15058,6 +15612,67 @@ "node": ">=7.0.0" } }, + "node_modules/protractor/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protractor/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -15328,6 +15943,18 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", @@ -15348,13 +15975,44 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/raw-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/raw-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/raw-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -15376,9 +16034,9 @@ } }, "node_modules/read-package-json-fast": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", - "integrity": "sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "dependencies": { "json-parse-even-better-errors": "^2.3.0", @@ -15389,107 +16047,49 @@ } }, "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "dependencies": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "engines": { "node": ">=4" } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "dependencies": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/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/read-pkg-up/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/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" + "read-pkg": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/read-pkg/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": { - "p-limit": "^1.1.0" + "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/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/read-pkg-up/node_modules/path-exists": { + "node_modules/read-pkg/node_modules/pify": { "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/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, "engines": { "node": ">=4" } @@ -15508,9 +16108,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" @@ -15623,9 +16223,9 @@ } }, "node_modules/regextras": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", - "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", "dev": true, "engines": { "node": ">=0.1.14" @@ -15727,6 +16327,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "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" @@ -16009,6 +16610,15 @@ "npm": ">=2.0.0" } }, + "node_modules/rxjs-for-await": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz", + "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==", + "dev": true, + "peerDependencies": { + "rxjs": "^6.0.0" + } + }, "node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -16035,9 +16645,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.32.12", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.12.tgz", - "integrity": "sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0" @@ -16050,16 +16660,16 @@ } }, "node_modules/sass-loader": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.0.1.tgz", - "integrity": "sha512-Vp1LcP4slTsTNLEiDkTcm8zGN/XYYrZz2BZybQbliWA8eXveqA/AxsEjllQTpJbg2MzCsx/qNO48sHdZtOaxTw==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -16067,7 +16677,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", "sass": "^1.3.0", "webpack": "^5.0.0" }, @@ -16153,6 +16763,37 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -16208,9 +16849,9 @@ } }, "node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -16458,6 +17099,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -16835,12 +17490,12 @@ } }, "node_modules/socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" }, @@ -16872,9 +17527,9 @@ } }, "node_modules/source-map-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-2.0.1.tgz", - "integrity": "sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", "dev": true, "dependencies": { "abab": "^2.0.5", @@ -16882,7 +17537,7 @@ "source-map-js": "^0.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -16892,18 +17547,6 @@ "webpack": "^5.0.0" } }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-resolve": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", @@ -17018,6 +17661,12 @@ "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/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -17034,6 +17683,11 @@ "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, "engines": { "node": ">=0.10.0" } @@ -17198,6 +17852,24 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -17326,13 +17998,44 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/style-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/style-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/style-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/style-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -17383,9 +18086,9 @@ } }, "node_modules/stylus-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-5.0.0.tgz", - "integrity": "sha512-1OaGgixTgC8IAaMCodZXg7XYsfP1qU0UzTHDyPaWACUh34j9geJL4iA583tFJDOtfNUOfDLaBpUywc5MicQ1aA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", "dev": true, "dependencies": { "fast-glob": "^3.2.5", @@ -17393,7 +18096,7 @@ "normalize-path": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -17477,9 +18180,9 @@ } }, "node_modules/svgo/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -17504,15 +18207,6 @@ "node": ">=7.0.0" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/svgo/node_modules/css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -17664,28 +18358,6 @@ "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", @@ -17696,9 +18368,9 @@ } }, "node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz", + "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -17730,12 +18402,12 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.2.tgz", - "integrity": "sha512-6QhDaAiVHIQr5Ab3XUWZyDmrIPCHMiqJVljMF91YKyqwKkL5QHnYMkrMBy96v9Z7ev1hGhSEw1HQZc2p/s5Z8Q==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", "dev": true, "dependencies": { - "jest-worker": "^26.6.2", + "jest-worker": "^27.0.2", "p-limit": "^3.1.0", "schema-utils": "^3.0.0", "serialize-javascript": "^5.0.1", @@ -17753,13 +18425,44 @@ "webpack": "^5.1.0" } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -17780,6 +18483,12 @@ "node": ">=0.10.0" } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17805,15 +18514,15 @@ "dev": true }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=8.17.0" } }, "node_modules/to-fast-properties": { @@ -17908,143 +18617,83 @@ } }, "node_modules/ts-node": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", - "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", "dev": true, "dependencies": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "source-map-support": "^0.5.17", + "yn": "3.1.1" }, "bin": { - "ts-node": "dist/bin.js" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.0.0" }, "peerDependencies": { - "typescript": ">=2.0" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.0", "minimist": "^1.2.0", "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "tslib": "^1.8.1" }, + "engines": { + "node": ">= 6" + }, "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -18102,9 +18751,9 @@ } }, "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -18243,12 +18892,12 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { @@ -18344,9 +18993,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", "dev": true, "dependencies": { "querystringify": "^2.1.1", @@ -18608,21 +19257,21 @@ } }, "node_modules/webpack": { - "version": "5.39.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", - "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.44.0.tgz", + "integrity": "sha512-I1S1w4QLoKmH19pX6YhYN0NiSXaWY8Ou00oA+aMcr9IUGeF5azns+IKBkfoAAG9Bu5zOIzZt/mN35OffBya8AQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.47", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.2.1", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.4.0", + "es-module-lexer": "^0.7.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -18633,7 +19282,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.0.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", + "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", "webpack-sources": "^2.3.0" }, @@ -18654,20 +19303,20 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.1.0.tgz", - "integrity": "sha512-mpa/FY+DiBu5+r5JUIyTCYWRfkWgyA3/OOE9lwfzV9S70A4vJYLsVRKj5rMFEsezBroy2FmPyQ8oBRVW8QmK1A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", "dev": true, "dependencies": { - "colorette": "^1.2.1", - "mem": "^8.0.0", - "memfs": "^3.2.0", - "mime-types": "^2.1.28", + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -18677,19 +19326,50 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack-dev-middleware/node_modules/colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -18756,6 +19436,31 @@ } } }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -18841,15 +19546,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -19121,6 +19817,12 @@ "node": ">=6" } }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -19206,15 +19908,6 @@ "node": ">=6" } }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -19490,9 +20183,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -19543,9 +20236,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", - "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -19554,26 +20247,44 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -19595,9 +20306,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", - "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, "dependencies": { "source-list-map": "^2.0.1", @@ -19631,15 +20342,18 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -19782,9 +20496,9 @@ "dev": true }, "node_modules/ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", "dev": true, "engines": { "node": ">=8.3.0" @@ -19849,9 +20563,9 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", + "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -19863,13 +20577,22 @@ "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { "node": ">=10" @@ -19907,210 +20630,187 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.4.tgz", - "integrity": "sha512-/BKaVlpbZYb65elZ+xHoKB2J2DuTstMU++dqE9T/7E0CevuMoOdkLQFQm71Kjl3eFI4i6T5d8mlLVPNE/ZWm7w==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", "dev": true, + "peer": true, "requires": { - "@angular-devkit/core": "12.0.4", + "@angular-devkit/core": "12.0.5", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.5.tgz", - "integrity": "sha512-rFbaAQPeuWM9KE9lK3J0sF6GB9nKF/s2Z7rtzKux7whGTF3Tlj8NHrcSxZTf4eBm3cnEpaiod1uPBQg8fUWD4w==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1200.5", - "@angular-devkit/build-optimizer": "0.1200.5", - "@angular-devkit/build-webpack": "0.1200.5", - "@angular-devkit/core": "12.0.5", - "@babel/core": "7.14.3", - "@babel/generator": "7.14.3", - "@babel/plugin-transform-async-to-generator": "7.13.0", - "@babel/plugin-transform-runtime": "7.14.3", - "@babel/preset-env": "7.14.2", - "@babel/runtime": "7.14.0", - "@babel/template": "7.12.13", - "@discoveryjs/json-ext": "0.5.2", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.1.4.tgz", + "integrity": "sha512-9kMdnaU2dr8o7gJpuBsEHLUpa6huF8uZQEd1+jhKfByEY/xTQo8qztvmbhFhrSfDvdYRygNHItpt3pYEoCEOig==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1201.4", + "@angular-devkit/build-optimizer": "0.1201.4", + "@angular-devkit/build-webpack": "0.1201.4", + "@angular-devkit/core": "12.1.4", + "@babel/core": "7.14.6", + "@babel/generator": "7.14.5", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.7", + "@babel/runtime": "7.14.6", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.0.5", + "@ngtools/webpack": "12.1.4", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", - "cacache": "15.0.6", + "cacache": "15.2.0", "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "8.1.1", - "core-js": "3.12.0", + "copy-webpack-plugin": "9.0.0", + "core-js": "3.15.1", "critters": "0.0.10", - "css-loader": "5.2.4", - "css-minimizer-webpack-plugin": "3.0.0", + "css-loader": "5.2.6", + "css-minimizer-webpack-plugin": "3.0.1", "find-cache-dir": "3.3.1", "glob": "7.1.7", "https-proxy-agent": "5.0.0", - "inquirer": "8.0.0", - "jest-worker": "26.6.2", + "inquirer": "8.1.1", + "jest-worker": "27.0.2", "karma-source-map-support": "1.4.0", "less": "4.1.1", - "less-loader": "8.1.1", - "license-webpack-plugin": "2.3.19", + "less-loader": "10.0.0", + "license-webpack-plugin": "2.3.20", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.5.1", + "mini-css-extract-plugin": "1.6.2", "minimatch": "3.0.4", - "open": "8.0.2", - "ora": "5.4.0", + "open": "8.2.1", + "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "postcss": "8.3.0", - "postcss-import": "14.0.1", - "postcss-loader": "5.2.0", + "postcss": "8.3.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.0", "postcss-preset-env": "6.7.0", "raw-loader": "4.0.2", "regenerator-runtime": "0.13.7", "resolve-url-loader": "4.0.0", - "rimraf": "3.0.2", "rxjs": "6.6.7", - "sass": "1.32.12", - "sass-loader": "11.0.1", + "sass": "1.35.1", + "sass-loader": "12.1.0", "semver": "7.3.5", "source-map": "0.7.3", - "source-map-loader": "2.0.1", + "source-map-loader": "3.0.0", "source-map-support": "0.5.19", "style-loader": "2.0.0", "stylus": "0.54.8", - "stylus-loader": "5.0.0", + "stylus-loader": "6.1.0", "terser": "5.7.0", - "terser-webpack-plugin": "5.1.2", + "terser-webpack-plugin": "5.1.3", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "5.39.1", - "webpack-dev-middleware": "4.1.0", + "tslib": "2.3.0", + "webpack": "5.44.0", + "webpack-dev-middleware": "5.0.0", "webpack-dev-server": "3.11.2", - "webpack-merge": "5.7.3", + "webpack-merge": "5.8.0", "webpack-subresource-integrity": "1.5.2" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", - "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "requires": { - "@angular-devkit/core": "12.0.5", + "@angular-devkit/core": "12.1.4", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", - "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", "dev": true, "requires": { - "ajv": "8.2.0", - "ajv-formats": "2.0.2", + "ajv": "8.6.0", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" - }, - "dependencies": { - "ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - } - } - }, - "copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "ajv": "^8.0.0" } } } }, "@angular-devkit/build-optimizer": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.5.tgz", - "integrity": "sha512-3XlDVVak3CfIgUjDZMoON7sxnI1vxhzEm2LvVg5yN98Q7ijnfykXiIzryEcplzTMTZwGNkem0361HDs1EX8zNg==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1201.4.tgz", + "integrity": "sha512-Hq+mDUe4xIyq4939JZaUkptsM89WnZOk8Qel6mS0T/bxMX/qs+nuGD5o+xDKkuayogbiTrLmyZBib0/90eSXEA==", "dev": true, "requires": { "source-map": "0.7.3", - "tslib": "2.2.0", - "typescript": "4.2.4" + "tslib": "2.3.0", + "typescript": "4.3.4" + }, + "dependencies": { + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true + } } }, "@angular-devkit/build-webpack": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.5.tgz", - "integrity": "sha512-cx8DVwOmogzeHS1dsZGWummwA3T1zqsJ6q9NIL0S0ZiOScZuz0j9zAOLjBkyCj5XexOFzHv3TcAVQyzJsi1tIw==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1201.4.tgz", + "integrity": "sha512-eMmbyHyWJZMQ1tfwVdja/iAk/eXJFYrF8b27gDV9gGI7MGB3KJ93AhkbPbcvlw4Hhx4+6M11GfeXzbwH0q9pnQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1200.5", + "@angular-devkit/architect": "0.1201.4", "rxjs": "6.6.7" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1200.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", - "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "requires": { - "@angular-devkit/core": "12.0.5", + "@angular-devkit/core": "12.1.4", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", - "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", "dev": true, "requires": { - "ajv": "8.2.0", - "ajv-formats": "2.0.2", + "ajv": "8.6.0", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", @@ -20118,9 +20818,9 @@ } }, "ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -20129,18 +20829,21 @@ "uri-js": "^4.2.2" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } } } }, "@angular-devkit/core": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", - "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", "requires": { "ajv": "8.2.0", "ajv-formats": "2.0.2", @@ -20148,12 +20851,35 @@ "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.1.4.tgz", + "integrity": "sha512-yD3y3pK/K5piOgvALFoCCiPp4H8emNa3yZL+vlpEpewVLpF1MM55LeTxc0PI5s0uqtOGVnvcbA5wYgMm3YsUEA==", + "requires": { + "@angular-devkit/core": "12.1.4", + "ora": "5.4.1", + "rxjs": "6.6.7" }, "dependencies": { + "@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "requires": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, "ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -20161,144 +20887,156 @@ "uri-js": "^4.2.2" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "requires": { + "ajv": "^8.0.0" + } } } }, - "@angular-devkit/schematics": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.0.4.tgz", - "integrity": "sha512-MEAAcOh1Y4R6O7HWo7mMXgRK9BSbCZ3rlx+aHmtWpNXohw0TRhNY5WmRnQTRvMA3qjR9nh0Uo7BkRpgwRfqmBw==", - "requires": { - "@angular-devkit/core": "12.0.4", - "ora": "5.4.0", - "rxjs": "6.6.7" - } - }, "@angular-eslint/builder": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.0.0.tgz", - "integrity": "sha512-gvvXQDXXi0gsWZ25KyMqF/1b3AaX+CJbpVgTPqxJdEx4euvmG/m3993ynmpf+Kc+F+aI2O9W4TUbDbbLWoCjIA==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.3.1.tgz", + "integrity": "sha512-Py7Y9n0evIWGgEIrnMaLvalE1+Nw9HoY+fcYLYd9POfY0cug8j7hbkoPQ6rM7GzNHVcVsqEi/8C4DoF7RXXNRg==", "dev": true, - "requires": {} + "requires": { + "@nrwl/devkit": ">= 12.0.0 < 13.0.0" + } }, "@angular-eslint/eslint-plugin": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.0.0.tgz", - "integrity": "sha512-osdJdMu8bYFv9WGhC04AwRcbeKq4sxCQnShV7NiF0xkgNG9KqDaStytVhPjJFn2Ja1QhfiTGlcFFk4D/9aruog==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", + "integrity": "sha512-KBm27onYggRcusA/BxuSkDGpVnIs8yG4ARio8ZAhe0H2XIRJTzJZ7oIBBjugDau03AGX3VMG6wAXailjJvsywg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.23.0" + "@typescript-eslint/experimental-utils": "4.28.2" } }, "@angular-eslint/eslint-plugin-template": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.0.0.tgz", - "integrity": "sha512-RF8PwN2A3U4ihd7sKYUM8wgPj46M30reziLl8CPPhN3H5Hn46nksmKmHRbPNakH2gW0Ba7NIxy+ocqUy0fQpcQ==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.3.1.tgz", + "integrity": "sha512-pz+nO64ma/9Sp2aeRnQ+Vktt7Fo1Lay/J+CG//3TIc3lYsoCTj4h42P6yCcxxJ9b4N7SUxMAnchA8eE5mJS4Ug==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.23.0", + "@typescript-eslint/experimental-utils": "4.28.2", "aria-query": "^4.2.2", "axobject-query": "^2.2.0" - }, - "dependencies": { - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - } } }, "@angular-eslint/template-parser": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.0.0.tgz", - "integrity": "sha512-gl5ansA2a8LY6TEjhe0k8NiQJJdEQPjjqpysO1Rpt3NWUYQkFMt+1+AnUyokHB1TU3/11dHRUjVWXj+pMtTIAA==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.3.1.tgz", + "integrity": "sha512-6DkXqTaVEHZdcN3isHQ2CDoTsKLuJ5C1SYEOuFzOU1Zp85SvjxO92v6gPkFPKk0iQNVRmQS2XcKef6weehUUGA==", "dev": true, "requires": { "eslint-scope": "^5.1.0" } }, "@angular/animations": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.0.5.tgz", - "integrity": "sha512-BPdTCtgDJ9zNzHpuA6X3NmtzDiIt5SHZk840j0q3HCq6rP6C/oo2UnPT6w8YDOGMejDpWdHvTgXH4jVKDN1wCQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.1.4.tgz", + "integrity": "sha512-6PkVF2HGwmNdG0IUUyXkxwnLdX7xVUCFldKNFap90lWTEPumO7+zcmzP4JELE6jkmHSykTZjPwlWXvuxdP+YJg==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/cli": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.0.4.tgz", - "integrity": "sha512-kZaJ55udB/AjQ+q8CrQfk6JGWdnJpH3c2VtbvSuR/ihiG6zMSxwpXqt1rImQN0RfffG3bsHD2SpM+T7/LKPemw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.1.4.tgz", + "integrity": "sha512-LpyhyqWe3bFcuH3MrXeYoIPI1htjwG1b5ehETfq4qsMvNmuFON6QI+F7EWEpX7lItVQc2bES+ogasTZsZue/uw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1200.4", - "@angular-devkit/core": "12.0.4", - "@angular-devkit/schematics": "12.0.4", - "@schematics/angular": "12.0.4", + "@angular-devkit/architect": "0.1201.4", + "@angular-devkit/core": "12.1.4", + "@angular-devkit/schematics": "12.1.4", + "@schematics/angular": "12.1.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.1", "ini": "2.0.0", - "inquirer": "8.0.0", + "inquirer": "8.1.1", "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.2", + "npm-package-arg": "8.1.5", "npm-pick-manifest": "6.1.1", - "open": "8.0.2", - "ora": "5.4.0", - "pacote": "11.3.2", + "open": "8.2.1", + "ora": "5.4.1", + "pacote": "11.3.4", "resolve": "1.20.0", - "rimraf": "3.0.2", "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "@angular-devkit/architect": { + "version": "0.1201.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.4.tgz", + "integrity": "sha512-hGO5NrZxV8Z7sILwokt7H+1sMf+5tJS9PJszvYlIBSzG0LBkOwwLQDb4MD42ATXFru57SXNqMZDVKoi1kTgxAw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@angular-devkit/core": "12.1.4", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "dev": true, + "requires": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "requires": { + "ajv": "^8.0.0" } } } }, "@angular/common": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.0.5.tgz", - "integrity": "sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.1.4.tgz", + "integrity": "sha512-cyh2m5veGgWRFsrmPnwB/Ised90bFNZAjZepvW8WXrpEUa/tmi1yWU9+8ayRG7ztE08lyXncJSSut2Ss2PEhTA==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/compiler": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.0.5.tgz", - "integrity": "sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.1.4.tgz", + "integrity": "sha512-csei4YTsdwYCWhr94AtW/Q3YyILLhjGVuV/zDZKQx5kB/3ukpUD+DppbblTo+NsLSk2BfsOepGUeCDMkIl9p3w==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/compiler-cli": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz", - "integrity": "sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.1.4.tgz", + "integrity": "sha512-RMEXJ92KO30waKoAha1qZHGLVyUimgisYVmaTwPlYJ534tAoilILkav8Wa4UMOJx1Dma0wTzbAqMYdghoQJXQA==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -20313,8 +21051,8 @@ "semver": "^7.0.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "tslib": "^2.1.0", - "yargs": "^16.2.0" + "tslib": "^2.2.0", + "yargs": "^17.0.0" }, "dependencies": { "source-map": { @@ -20326,57 +21064,57 @@ } }, "@angular/core": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.0.5.tgz", - "integrity": "sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.1.4.tgz", + "integrity": "sha512-dG7KtW0l3jI8lapmenSu1wV/d3VOphAjDxVqWOrwh+kI0da7677cEg0Ms5YIF8Nf/++WleyNxk6AIHbDIig+Sw==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/forms": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.0.5.tgz", - "integrity": "sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.1.4.tgz", + "integrity": "sha512-HlPZH2HllX2/XEdAT7PkAYIEXn69KanvjxFD40++Xx5a0lMsv7HleYqRdRZYkxKUNCJljL3UqvI5sZ5CCOoVGw==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/language-service": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.0.5.tgz", - "integrity": "sha512-mhb21Ixdky3KOAQ9eps16tzP5hm/uKwCToLM244Llgozem1zHdfc2LPePAwWt/9fSl642xX2JKWjjKFgC4bgNw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.1.4.tgz", + "integrity": "sha512-NooCGWiTY74DN3uFE8eI1ATtxx4TQzulbV7qNNG9Bz8QJyLRykYart7Ajxh0bF5upR1bjPmHr6MvgO6aI43VUQ==", "dev": true }, "@angular/platform-browser": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.0.5.tgz", - "integrity": "sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.1.4.tgz", + "integrity": "sha512-klJbU75lUGgwZkgyXsHU47JuYh8c7prukw7MIWLw7liHXPK//bLj8kOfKwifSIJ0xzDg9UfdNSGCQqGP5N0SaQ==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/platform-browser-dynamic": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz", - "integrity": "sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.1.4.tgz", + "integrity": "sha512-gEE7F45y+mExb9Bib9SQkWQICHHxbo884AhCw4ZcHWWv2aJl1Y09Rhp+ZE542wjoFFpB2o+BXguc3PcnXB/3Ww==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/router": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.0.5.tgz", - "integrity": "sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.1.4.tgz", + "integrity": "sha512-wbw/w1yM/GiCnQPykQ7rHkywqQA5LPF5/MRa4Khi7BcpJXgutG9h/40HREsQzzYY46+qhXmST8A3E5PNgURsbw==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@angular/service-worker": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.0.5.tgz", - "integrity": "sha512-ZJ8EhuTaktZgoo1ZylmiTlxmALaAiK7ow0vTInfuRSkVbrUhuJQv3qqAEoGAgLH5a3QW+E8/8CoMzNMDcwpWXQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.1.4.tgz", + "integrity": "sha512-rOoCuSzT8GNgDQFssH09dOegkkRSLHMBCODTbZRNVahCu7oi5ixUJOntHkCshFBczx8qCxjA6jOrnJ2WasSD5w==", "requires": { - "tslib": "^2.1.0" + "tslib": "^2.2.0" } }, "@babel/code-frame": { @@ -20389,26 +21127,26 @@ } }, "@babel/compat-data": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", - "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.9.tgz", + "integrity": "sha512-p3QjZmMGHDGdpcwEYYWu7i7oJShJvtgMjJeb0W95PPhSm++3lm8YXYOh45Y6iCN9PkZLTZ7CIX5nFrp7pw7TXw==", "dev": true }, "@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -20432,12 +21170,12 @@ } }, "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "dev": true, "requires": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -20490,14 +21228,14 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", + "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.7", "@babel/helper-optimise-call-expression": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5" @@ -20555,19 +21293,6 @@ "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - } } }, "@babel/helper-get-function-arity": { @@ -20589,9 +21314,9 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz", - "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", "dev": true, "requires": { "@babel/types": "^7.14.5" @@ -20607,32 +21332,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", + "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.8", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - } + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" } }, "@babel/helper-optimise-call-expression": { @@ -20674,12 +21386,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.14.8" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -20701,9 +21413,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/helper-validator-option": { @@ -20722,43 +21434,17 @@ "@babel/template": "^7.14.5", "@babel/traverse": "^7.14.5", "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - } } }, "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "dev": true, "requires": { "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - } + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" } }, "@babel/highlight": { @@ -20773,9 +21459,9 @@ } }, "@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.9.tgz", + "integrity": "sha512-RdUTOseXJ8POjjOeEBEvNMIZU/nm4yu2rufRkcibzkkg7DmQvXU8v3M4Xk9G7uuI86CDGkKcuDWgioqZm+mScQ==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -20790,9 +21476,9 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz", - "integrity": "sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", @@ -20882,12 +21568,12 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz", - "integrity": "sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.14.7", "@babel/helper-compilation-targets": "^7.14.5", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -21083,14 +21769,14 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -21112,9 +21798,9 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", + "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", @@ -21136,9 +21822,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz", - "integrity": "sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" @@ -21257,9 +21943,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz", - "integrity": "sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5" @@ -21321,16 +22007,16 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz", - "integrity": "sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", "semver": "^6.3.0" }, "dependencies": { @@ -21408,34 +22094,34 @@ } }, "@babel/preset-env": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", - "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.13.11", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -21445,46 +22131,46 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.2", - "@babel/plugin-transform-classes": "^7.14.2", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.17", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.2", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", "semver": "^6.3.0" }, "dependencies": { @@ -21510,59 +22196,59 @@ } }, "@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz", - "integrity": "sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz", + "integrity": "sha512-64RiH2ON4/y8qYtoa8rUiyam/tUVyGqRyNYhe+vCRGmjnV4bUlZvY+mwd0RrmLoCpJpdq3RsrNqKb7SJdw/4kw==", "dev": true, "requires": { - "core-js-pure": "^3.14.0", + "core-js-pure": "^3.16.0", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/traverse": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", - "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.9.tgz", + "integrity": "sha512-bldh6dtB49L8q9bUyB7bC20UKgU+EFDwKJylwl234Kv+ySZeMD31Xeht6URyueQ6LrRRpF2tmkfcZooZR9/e8g==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.14.9", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.14.9", + "@babel/types": "^7.14.9", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.9.tgz", + "integrity": "sha512-4yoHbhDYzFa0GLfCzLp5GxH7vPPMAHdZjyE7M/OajM9037zhx0rf+iNsJwp4PT0MSFpwjG7BsHEbPkBQpZ6cYA==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.14.9", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -21576,12 +22262,12 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.9.tgz", + "integrity": "sha512-u0bLTnv3DFHeaQLYzb7oRJ1JHr1sv/SYDM7JSqHFFLwXG1wTZRughxFI5NCP8qBEo1rVVsn7Yg2Lvw49nne/Ow==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -21592,15 +22278,26 @@ "dev": true }, "@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", "dev": true }, + "@es-joy/jsdoccomment": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.7.tgz", + "integrity": "sha512-aNKZEoMESDzOBjKxCWrFuG50mcpMeKVBnBNko4+IZZ5t9zXYs8GT1KB0ZaOq1YUsKumDRc6YII/TQm309MJ0KQ==", + "dev": true, + "requires": { + "comment-parser": "1.2.3", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + } + }, "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -21614,10 +22311,22 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -21629,6 +22338,12 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -21637,12 +22352,29 @@ } } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@ionic/angular": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.6.7.tgz", - "integrity": "sha512-urc1N64u3GN/iS6B/7TFctawGyYzz2JICdU0bGpe1DsMwLqBCwRpXUBeqMIA/ptaufepUtLeE+lr77FTRbqzOQ==", + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.6.12.tgz", + "integrity": "sha512-1zKJ21a7waKSuEwiZctZw+o6vVHd8CJ1GtUqCl9q+2L9glL41xCq+oV58YzPYDrZiryjQjUZWWW3K4LP9cD0EA==", "requires": { - "@ionic/core": "5.6.7", + "@ionic/core": "5.6.12", "tslib": "^1.9.3" }, "dependencies": { @@ -21666,12 +22398,69 @@ "tapable": "^2.1.1", "tslib": "^2.0.3", "ws": "^7.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "@ionic/core": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.6.7.tgz", - "integrity": "sha512-bLH1sS2DI+C8trfYe/L96G2y+hJ9fK/azrNqGvGwHQAPy2li89DldbH+wPqe/Wclru8ZaWjRv35AyLBawixC2w==", + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.6.12.tgz", + "integrity": "sha512-qFQ8r0kdI2p5wT72EQOwBrIts7XD1qA7/vCR7OlHPTA+VDyiYSzpLcWcFZHzdXKQzbn7hYbCJr3IsBNmBYrZ1g==", "requires": { "@stencil/core": "^2.4.0", "ionicons": "^5.5.1", @@ -21698,12 +22487,12 @@ } }, "@ngtools/webpack": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.5.tgz", - "integrity": "sha512-yoKK6qhEm1iWnniz50xzOBqa3U1iUrjZs+SpLOXRZFonpwObz8j4zraR231K4uV4kXcX40qorYk9iOf+ljG4JQ==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.1.4.tgz", + "integrity": "sha512-hXc8dTnRfDB7o1Pd7a07aw0rjGmVLXU28+cTHQJliosgD3obcjfZ4QPA0k97vlQMtqVJawuShRfyiUKrpsJf8Q==", "dev": true, "requires": { - "enhanced-resolve": "5.7.0" + "enhanced-resolve": "5.8.2" } }, "@ngx-formly/core": { @@ -21755,35 +22544,35 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@npmcli/git": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.9.tgz", - "integrity": "sha512-hTMbMryvOqGLwnmMBKs5usbPsJtyEsMsgXwJbmNrsEuQQh1LAIMDU77IoOrwkCg+NgQWl+ySlarJASwM3SutCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", "dev": true, "requires": { "@npmcli/promise-spawn": "^1.3.2", @@ -21794,26 +22583,6 @@ "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "@npmcli/installed-package-contents": { @@ -21864,20 +22633,151 @@ "read-package-json-fast": "^2.0.1" } }, + "@nrwl/devkit": { + "version": "12.6.3", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-12.6.3.tgz", + "integrity": "sha512-HeBYesksZirm85sp5a2F23y/V8z2ajBN+Ej29R9E/hpnhOsZScpLxgxmhl+Cq4bd1omVJ6XRvUDwGwuIf1kQmg==", + "dev": true, + "requires": { + "@nrwl/tao": "12.6.3", + "ejs": "^3.1.5", + "ignore": "^5.0.4", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@nrwl/tao": { + "version": "12.6.3", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-12.6.3.tgz", + "integrity": "sha512-KlVdQEyxi/mk0X9FBY6w72XouiMesD3FCCrqgKx5oShOx2GehuP+LhOOrfnuMOT7WgKBCoHnqhnK1x6X1F5/XQ==", + "dev": true, + "requires": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.0.0", + "yargs-parser": "20.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@schematics/angular": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.0.4.tgz", - "integrity": "sha512-rC4/+c6p3S/ezDeJzAstrwzdpYgcYzHumtzVSDDM+3Kx0QBUTq/Nj6sk1e2C/fgtV5Jb2INEkTvrih+HP7I0wA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.1.4.tgz", + "integrity": "sha512-xGqgGI6GWk4EFdKis8FmSESxoLgjnLQbaRE1t1KZCkSKJzqkOj0R9wiDrtZfcrbPxIkLL+3fAk2ThwwPznT6yw==", "requires": { - "@angular-devkit/core": "12.0.4", - "@angular-devkit/schematics": "12.0.4", + "@angular-devkit/core": "12.1.4", + "@angular-devkit/schematics": "12.1.4", "jsonc-parser": "3.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.4.tgz", + "integrity": "sha512-KOzGD8JbP/7EeUwPiU5x+fo3ZEQ5R4IVW5WoH92PaO3mdpqXC7UL2MWLct8PUe9il9nqJMvrBMldSSvP9PCT2w==", + "requires": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "requires": { + "ajv": "^8.0.0" + } + } } }, "@stencil/core": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.5.2.tgz", - "integrity": "sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.6.0.tgz", + "integrity": "sha512-QsxWayZyusnqSZrlCl81R71rA3KqFjVVQSH4E0rGN15F1GdQaFonKlHLyCOLKLig1zzC+DQkLLiUuocexuvdeQ==" }, "@tootallnate/once": { "version": "1.1.2", @@ -21891,10 +22791,34 @@ "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "@types/chart.js": { - "version": "2.9.32", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.32.tgz", - "integrity": "sha512-d45JiRQwEOlZiKwukjqmqpbqbYzUX2yrXdH9qVn6kXpPDsTYCo6YbfFOlnUaJ8S/DhJwbBJiLsMjKpW5oP8B2A==", + "version": "2.9.34", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.34.tgz", + "integrity": "sha512-CtZVk+kh1IN67dv+fB0CWmCLCRrDJgqOj15qPic2B1VCMovNO6B7Vhf/TgPpNscjhAL1j+qUntDMWb9A4ZmPTg==", "requires": { "moment": "^2.10.2" } @@ -21906,21 +22830,21 @@ "dev": true }, "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, "@types/eslint": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", - "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dev": true, "requires": { "@types/estree": "*", @@ -21928,9 +22852,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", "dev": true, "requires": { "@types/eslint": "*", @@ -21938,9 +22862,9 @@ } }, "@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, "@types/glob": { @@ -21954,30 +22878,24 @@ } }, "@types/jasmine": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.9.tgz", - "integrity": "sha512-B53NIwMj/AO0O+xfSWLYmKB0Mo6TYxfv2Mk8/c1T2w/e38t55iaPR6p7pHXTTtqfTmevPK3i8T1YweYFTZlxDw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.8.2.tgz", + "integrity": "sha512-u5h7dqzy2XpXTzhOzSNQUQpKGFvROF8ElNX9P/TJvsHnTg/JvsAseVsGWQAQQldqanYaM+5kwxW909BBFAUYsg==", "dev": true }, "@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", "dev": true, "requires": { "@types/jasmine": "*" } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/minimatch": { @@ -21987,9 +22905,9 @@ "dev": true }, "@types/node": { - "version": "12.20.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.10.tgz", - "integrity": "sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw==", + "version": "16.4.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.10.tgz", + "integrity": "sha512-TmVHsm43br64js9BqHWqiDZA+xMtbUpI1MBIA0EyiBmoV9pcEYFOSdj5fr6enZNfh4fChh+AGOLIzGwJnkshyQ==", "dev": true }, "@types/parse-json": { @@ -22005,9 +22923,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz", + "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", "dev": true }, "@types/source-list-map": { @@ -22023,9 +22941,9 @@ "dev": true }, "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", "dev": true, "requires": { "@types/node": "*", @@ -22042,386 +22960,340 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", - "integrity": "sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", + "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.16.1", - "@typescript-eslint/scope-manager": "4.16.1", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.0", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/experimental-utils": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", - "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", + "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.16.1", - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/typescript-estree": "4.16.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", - "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" } } } }, "@typescript-eslint/experimental-utils": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz", - "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", + "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.23.0", - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/typescript-estree": "4.23.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz", - "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", + "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/visitor-keys": "4.23.0" + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" } }, "@typescript-eslint/visitor-keys": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", - "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/types": "4.28.2", "eslint-visitor-keys": "^2.0.0" } } } }, "@typescript-eslint/parser": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.16.1.tgz", - "integrity": "sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.16.1", - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/typescript-estree": "4.16.1", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "debug": "^4.3.1" }, "dependencies": { "@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", - "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" } } } }, "@typescript-eslint/scope-manager": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", - "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.16.1", - "@typescript-eslint/visitor-keys": "4.16.1" + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true } } }, "@typescript-eslint/types": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz", - "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", + "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz", - "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", + "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.23.0", - "@typescript-eslint/visitor-keys": "4.23.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/visitor-keys": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", - "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/types": "4.28.2", "eslint-visitor-keys": "^2.0.0" } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } } } }, "@typescript-eslint/visitor-keys": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", - "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", "dev": true, "requires": { - "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/types": "4.29.0", "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", - "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true } } }, "@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -22472,9 +23344,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, @@ -22525,14 +23397,13 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -22547,36 +23418,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", - "requires": {}, - "dependencies": { - "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "optional": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true, - "peer": true - } + "requires": { + "ajv": "^8.0.0" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -22584,9 +23429,9 @@ "dev": true }, "angular-mydatepicker": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.4.tgz", - "integrity": "sha512-TOSK5z38x5ppycAaVUVQDcGWz+XJrMIACoAwbpuLcZOIAMxGBUMgB2JTtFTlhoeVM2J1ZLoz/tepo+ZxlTD+WA==", + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.5.tgz", + "integrity": "sha512-nKXUA3NhzMJ02jX+AiqpEr0kl2lCS3tGaFeHcyBFhwlDao9BO9i3403NXaFliOCeN2M4VvUNQs8pggLE7DECIA==", "requires": { "tslib": "^1.9.0" }, @@ -22698,14 +23543,16 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" } }, "arr-diff": { @@ -22808,13 +23655,10 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true }, "async-each": { "version": "1.0.3", @@ -22834,6 +23678,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -22901,6 +23751,12 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -22964,9 +23820,9 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.2.2", @@ -23114,6 +23970,15 @@ "ms": "2.0.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -23162,16 +24027,16 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", + "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.73" }, "dependencies": { "colorette": { @@ -23231,9 +24096,9 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-indexof": { @@ -23242,14 +24107,6 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "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, - "optional": true, - "peer": true - }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -23263,9 +24120,9 @@ "dev": true }, "cacache": { - "version": "15.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", - "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", "dev": true, "requires": { "@npmcli/move-file": "^1.0.1", @@ -23321,9 +24178,9 @@ "dev": true }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-api": { @@ -23339,9 +24196,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001237", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz", - "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==", + "version": "1.0.30001248", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", + "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==", "dev": true }, "canonical-path": { @@ -23414,19 +24271,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "chownr": { @@ -23622,9 +24479,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colord": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.0.1.tgz", - "integrity": "sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.6.0.tgz", + "integrity": "sha512-8yMrtE20ZxH1YWvvSoeJFtvqY+GIAOfU+mZ3jx7ZSiEMasnAmNqD1BKUP3CuCWcy/XHgcXkLW6YU8C35nhOYVg==", "dev": true }, "colorette": { @@ -23649,15 +24506,14 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, "comment-parser": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", - "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.3.tgz", + "integrity": "sha512-vnqDwBSXSsdAkGS5NjwMIPelE47q+UkEgWKHvCDNhVIIaQSUFY6sNnEYGzdoPGMdpV+7KR3ZkRd7oyWIjtuvJg==", "dev": true }, "commondir": { @@ -23766,12 +24622,6 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -23788,9 +24638,9 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -23824,31 +24674,61 @@ "dev": true }, "copy-webpack-plugin": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", - "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.0.tgz", + "integrity": "sha512-k8UB2jLIb1Jip2nZbCz83T/XfhfjX6mB1yLJNYKrpYi7FQimfOoFv/0//iT6HV1K8FwUB5yUbCcnpLebJXJTug==", "dev": true, "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", + "p-limit": "^3.1.0", "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "serialize-javascript": "^5.0.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "glob-parent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", + "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -23856,15 +24736,15 @@ } }, "core-js": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.12.0.tgz", - "integrity": "sha512-SaMnchL//WwU2Ot1hhkPflE8gzo7uq1FGvUJ8GKmi3TOU7rGTHIU+eir1WGf6qOtTyxdfdcp10yPdGZ59sQ3hw==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz", + "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==", "dev": true }, "core-js-compat": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.14.0.tgz", - "integrity": "sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.0.tgz", + "integrity": "sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -23880,9 +24760,9 @@ } }, "core-js-pure": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz", - "integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.0.tgz", + "integrity": "sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ==", "dev": true }, "core-util-is": { @@ -23914,6 +24794,12 @@ "yaml": "^1.10.0" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "critters": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", @@ -23937,9 +24823,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -23987,17 +24873,6 @@ "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "css": { @@ -24063,9 +24938,9 @@ "dev": true }, "css-declaration-sorter": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", - "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.1.tgz", + "integrity": "sha512-BZ1aOuif2Sb7tQYY1GeCjG7F++8ggnwUkH5Ictw0mrdpqpEd+zWmcPdstnH2TItlb74FqR0DrVEieon221T/1Q==", "dev": true, "requires": { "timsort": "^0.3.0" @@ -24127,15 +25002,14 @@ } }, "css-loader": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", - "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", + "integrity": "sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w==", "dev": true, "requires": { - "camelcase": "^6.2.0", "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", - "postcss": "^8.2.10", + "postcss": "^8.2.15", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", @@ -24145,36 +25019,52 @@ "semver": "^7.3.5" }, "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "css-minimizer-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-yIrqG0pPphR1RoNx2wDxYmxRf2ubRChLDXxv7ccipEm5bRKsZRYp8n+2peeXehtTF5s3yNxlqsdz3WQOsAgUkw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-RGFIv6iZWUPO2T1vE5+5pNCSs2H2xtHYRdfZPiiNH8Of6QOn9BeFnZSoHiQMkmsxOO/JkPe4BpKfs7slFIWcTA==", "dev": true, "requires": { "cssnano": "^5.0.0", - "jest-worker": "^26.3.0", + "jest-worker": "^27.0.2", "p-limit": "^3.0.2", "postcss": "^8.2.9", "schema-utils": "^3.0.0", @@ -24182,13 +25072,38 @@ "source-map": "^0.6.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -24329,14 +25244,15 @@ "dev": true }, "cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.7.tgz", + "integrity": "sha512-7C0tbb298hef3rq+TtBbMuezBQ9VrFtrQEsPNuBKNVgWny/67vdRsnq8EoNu7TRjAHURgYvWlRIpCUmcMZkRzw==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" } }, "cssnano-preset-default": { @@ -24399,9 +25315,9 @@ "dev": true }, "d3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.0.tgz", - "integrity": "sha512-t+jEKGO2jQiSBLJYYq6RFc500tsCeXBB4x41oQaSnZD3Som95nQrlw9XJGrFTMUOQOkwSMauWy9+8Tz1qm9UZw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.0.1.tgz", + "integrity": "sha512-74zonD4nAtxF9dtwFwJ3RuoHPh2D/UTFX26midBuMVH+7pRbOezuyLUIb8mbQMuYFlcUXT+xy++orCmnvMM/CA==", "requires": { "d3-array": "3", "d3-axis": "3", @@ -24511,21 +25427,6 @@ "commander": "7", "iconv-lite": "0.6", "rw": "1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "d3-ease": { @@ -24686,9 +25587,9 @@ } }, "date-fns": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", - "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==" + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz", + "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==" }, "date-format": { "version": "3.0.0", @@ -24991,10 +25892,19 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, "electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.3.793", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.793.tgz", + "integrity": "sha512-l9NrGV6Mr4ov5mayYPvIWcwklNw5ROmy6rllzz9dCACw9nKE5y+s5uQk+CBJMetxrWZ6QJFsvEfG6WDcH2IGUg==", "dev": true }, "emoji-regex": { @@ -25023,18 +25933,6 @@ "optional": true, "requires": { "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "end-of-stream": { @@ -25059,6 +25957,15 @@ "debug": "~4.3.1", "engine.io-parser": "~4.0.0", "ws": "~7.4.2" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} + } } }, "engine.io-parser": { @@ -25071,9 +25978,9 @@ } }, "enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -25132,9 +26039,9 @@ } }, "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -25143,11 +26050,12 @@ "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.3", "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -25156,9 +26064,9 @@ } }, "es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, "es-to-primitive": { @@ -25206,13 +26114,14 @@ "dev": true }, "eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -25261,6 +26170,18 @@ "@babel/highlight": "^7.10.4" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -25271,9 +26192,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -25295,10 +26216,27 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -25316,6 +26254,12 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25378,85 +26322,29 @@ "requires": { "ms": "^2.1.1" } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "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 - }, - "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 - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } } } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", + "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "dependencies": { @@ -25470,13 +26358,12 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "ms": { @@ -25488,24 +26375,37 @@ } }, "eslint-plugin-jsdoc": { - "version": "30.7.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.6.tgz", - "integrity": "sha512-w18IOiS/9ahKgRfQOuHbce+EQYx3fwIkZhUZDEK+augNlhJkzgTSZkrBkzaflSbFNZ9/Tk4xzUABEaTbsBSzew==", + "version": "36.0.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.0.6.tgz", + "integrity": "sha512-vOm27rI2SMfi1bOAYmzzGkanMCD/boquKwvN5ECi8EF9ASsXJwlnCzYtiOYpsDpbC2+6JXEHAmWMkqYNA3BWRw==", "dev": true, "requires": { - "comment-parser": "^0.7.6", - "debug": "^4.2.0", - "jsdoctypeparser": "^9.0.0", - "lodash": "^4.17.20", - "regextras": "^0.7.1", - "semver": "^7.3.2", + "@es-joy/jsdoccomment": "0.10.7", + "comment-parser": "1.2.3", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "eslint-plugin-prefer-arrow": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz", - "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, "requires": {} }, @@ -25520,20 +26420,12 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { @@ -25694,6 +26586,15 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -25908,6 +26809,26 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } } }, "extglob": { @@ -25964,17 +26885,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -25989,9 +26909,9 @@ "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -26036,6 +26956,15 @@ "dev": true, "optional": true }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -26086,16 +27015,69 @@ "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -26106,20 +27088,12 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" - }, - "dependencies": { - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - } } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "flatten": { @@ -26129,9 +27103,9 @@ "dev": true }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "dev": true }, "for-in": { @@ -26178,6 +27152,18 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -26354,9 +27340,9 @@ "dev": true }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -26393,6 +27379,26 @@ "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "has": { @@ -26803,12 +27809,11 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "icss-utils": { @@ -26908,12 +27913,6 @@ "p-limit": "^2.0.0" } }, - "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 - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -26971,19 +27970,20 @@ "dev": true }, "inquirer": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.0.0.tgz", - "integrity": "sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz", + "integrity": "sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.3.0", "run-async": "^2.4.0", "rxjs": "^6.6.6", "string-width": "^4.1.0", @@ -27001,9 +28001,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -27046,15 +28046,26 @@ "ipaddr.js": "^1.9.0" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "internmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.1.tgz", "integrity": "sha512-Ujwccrj9FkGqjbY3iVoxD1VV+KdZZeENx0rphrtzmRXbFvkFO88L80BL/zeSIguX/7T+y8k04xqtgWgS5vxwxw==" }, "ionicons": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.1.tgz", - "integrity": "sha512-1auVisfaXmkmxINer8Q3kJGHP1vSxk86hf7By95eJ+Av9+oBcNuAEBfSe3jaMaGRVxVw8U/2j23MFq7R3c0HPg==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.3.tgz", + "integrity": "sha512-L71djrMi8pAad66tpwdnO1vwcyluCFvehzxU1PpH1k/HpYBZhZ5IaYhqXipmqUvu5aEbd4cbRguYyI5Fd4bxTw==", "requires": { "@stencil/core": "^2.5.0" } @@ -27166,9 +28177,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", "dev": true, "requires": { "has": "^1.0.3" @@ -27480,6 +28491,18 @@ "istanbul-lib-report": "^3.0.0" } }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, "jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", @@ -27500,15 +28523,15 @@ } }, "jasmine-core": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.7.1.tgz", - "integrity": "sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", "dev": true }, "jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "requires": { "colors": "1.4.0" @@ -27521,14 +28544,14 @@ "dev": true }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -27538,9 +28561,9 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -27570,10 +28593,10 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "jsdoctypeparser": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", - "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", "dev": true }, "jsesc": { @@ -27601,10 +28624,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -27639,12 +28661,13 @@ "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "jsonparse": { @@ -27666,9 +28689,9 @@ } }, "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.0.tgz", + "integrity": "sha512-Y2OlFIzrDOPWUnpU0LORIcDn2xN7rC9yKffFM/7pGhQuhO+SUhfm2trkJ/S5amjFvem0Y+1EALz/MEPkvHXVNw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -27740,14 +28763,26 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "rimraf": "^3.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } }, @@ -27758,6 +28793,17 @@ "dev": true, "requires": { "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "karma-coverage": { @@ -27857,9 +28903,9 @@ } }, "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", "dev": true, "requires": {} }, @@ -27956,9 +29002,9 @@ } }, "less-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-8.1.1.tgz", - "integrity": "sha512-K93jJU7fi3n6rxVvzp8Cb88Uy9tcQKfHlkoezHwKILXhlNYiRQl4yowLIkQqmBXOH/5I8yoKiYeIf781HGkW9g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.0.tgz", + "integrity": "sha512-JjioAkw9qyavL0BzMPUOHJa0a20fh+ipq/MNZH4OkU8qERsCMeZIWRE0FDBIx2O+cFguvY01vHh/lmBA9LyWDg==", "dev": true, "requires": { "klona": "^2.0.4" @@ -27975,9 +29021,9 @@ } }, "license-webpack-plugin": { - "version": "2.3.19", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.19.tgz", - "integrity": "sha512-z/izhwFRYHs1sCrDgrTUsNJpd+Xsd06OcFWSwHz/TiZygm5ucweVZi1Hu14Rf6tOj/XAl1Ebyc7GW6ZyyINyWA==", + "version": "2.3.20", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", + "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -27993,6 +29039,12 @@ "immediate": "~3.0.5" } }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -28000,25 +29052,32 @@ "dev": true }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, @@ -28040,12 +29099,13 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -28113,9 +29173,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -28155,6 +29215,14 @@ "flatted": "^2.0.1", "rfdc": "^1.1.4", "streamroller": "^2.2.4" + }, + "dependencies": { + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + } } }, "loglevel": { @@ -28204,13 +29272,13 @@ "dev": true }, "make-fetch-happen": { - "version": "8.0.14", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", - "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.4.tgz", + "integrity": "sha512-sQWNKMYqSmbAGXqJg2jZ+PmHh5JAybvwu0xM8mZR/bsTjGiTASj3ldXJV7KFHy1k/IJIBkjxQFoWIVsv9+PQMg==", "dev": true, "requires": { "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", + "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", @@ -28221,6 +29289,7 @@ "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", "promise-retry": "^2.0.1", "socks-proxy-agent": "^5.0.0", "ssri": "^8.0.0" @@ -28383,18 +29452,18 @@ "dev": true }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "requires": { - "mime-db": "1.47.0" + "mime-db": "1.49.0" } }, "mimic-fn": { @@ -28403,9 +29472,9 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-css-extract-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.5.1.tgz", - "integrity": "sha512-wEpr0XooH6rw/Mlf+9KTJoMBLT3HujzdTrmohPjAzF47N4Q6yAeczQLpRD/WxvAtXvskcXbily7TAdCfi2M4Dg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -28413,13 +29482,38 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -28466,9 +29560,9 @@ } }, "minipass-fetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", - "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.4.tgz", + "integrity": "sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ==", "dev": true, "requires": { "encoding": "^0.1.12", @@ -28612,9 +29706,9 @@ "dev": true }, "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", + "integrity": "sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw==", "dev": true, "optional": true, "requires": { @@ -28632,6 +29726,16 @@ "requires": { "ms": "^2.1.1" } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } } } }, @@ -28658,9 +29762,9 @@ } }, "ngx-cookie-service": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-12.0.0.tgz", - "integrity": "sha512-/Pklpn8Ul0P016Dc5isEU8AnTT3CI6Zz1JhrW1uH/3oJbfW7MGTtJAgAv1Rk92rfe+kNTDh+O+yj0xmr1Mt/tA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-12.0.3.tgz", + "integrity": "sha512-F5xJBTrrreI2DERGOrO6U+L7s031HxTER+3Z4gDCwxdTl4AXmtWddMxxQVw7KflOLZ4InYEs6FjQsXmKU4HsJg==", "requires": { "tslib": "^2.0.0" } @@ -28701,17 +29805,6 @@ "semver": "^7.3.2", "tar": "^6.0.2", "which": "^2.0.2" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "node-releases": { @@ -28768,9 +29861,9 @@ "dev": true }, "normalize-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.0.1.tgz", - "integrity": "sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "npm-bundled": { @@ -28798,9 +29891,9 @@ "dev": true }, "npm-package-arg": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.2.tgz", - "integrity": "sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -28833,13 +29926,12 @@ } }, "npm-registry-fetch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", - "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", "dev": true, "requires": { - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", + "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", @@ -28978,9 +30070,9 @@ } }, "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, "object-is": { @@ -29079,9 +30171,9 @@ } }, "open": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.0.2.tgz", - "integrity": "sha512-NV5QmWJrTaNBLHABJyrb+nd5dXI5zfea/suWawBhkHzAbVhLLiJdrqMgxMypGK9Eznp2Ltoh7SAVkQ3XAucX7Q==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -29121,9 +30213,9 @@ } }, "ora": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", - "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "requires": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -29145,9 +30237,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29213,22 +30305,28 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^1.1.0" }, "dependencies": { "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } + }, + "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 } } }, @@ -29257,9 +30355,9 @@ "dev": true }, "pacote": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.2.tgz", - "integrity": "sha512-lMO7V9aMhyE5gfaSFxKfW3OTdXuFBNQJfuNuet3NPzWWhOYIW90t85vHcHLDjdhgmfAdAHyh9q1HAap96ea0XA==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.4.tgz", + "integrity": "sha512-RfahPCunM9GI7ryJV/zY0bWQiokZyLqaSNHXtbNSoLb7bwTvBbJBEyCJ01KWs4j1Gj7GmX8crYXQ1sNX6P2VKA==", "dev": true, "requires": { "@npmcli/git": "^2.0.1", @@ -29275,7 +30373,7 @@ "npm-package-arg": "^8.0.1", "npm-packlist": "^2.1.4", "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^10.0.0", + "npm-registry-fetch": "^11.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", @@ -29396,9 +30494,9 @@ "dev": true }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { @@ -29420,9 +30518,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -29444,9 +30542,9 @@ "dev": true }, "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, "pify": { @@ -29471,12 +30569,21 @@ } }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^2.1.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" } }, "portfinder": { @@ -29490,6 +30597,15 @@ "mkdirp": "^0.5.5" }, "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -29517,9 +30633,9 @@ "dev": true }, "postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -30272,9 +31388,9 @@ } }, "postcss-import": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.1.tgz", - "integrity": "sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", "dev": true, "requires": { "postcss-value-parser": "^4.0.0", @@ -30359,14 +31475,14 @@ } }, "postcss-loader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.2.0.tgz", - "integrity": "sha512-uSuCkENFeUaOYsKrXm0eNNgVIxc71z8RcckLMbVw473rGojFnrUeqEz6zBgXsH2q1EIzXnO/4pEz9RhALjlITA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", + "integrity": "sha512-yA/cXBfACkthZNA2hQxOnaReVfQ6uLmvbEDQzNafpbK40URZJvP/28dL1DG174Gvz3ptkkHbbwDBCh+gXR94CA==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", - "semver": "^7.3.4" + "semver": "^7.3.5" } }, "postcss-logical": { @@ -31174,12 +32290,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -31230,6 +32340,49 @@ "color-name": "~1.1.4" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -31432,6 +32585,17 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "raw-loader": { @@ -31444,13 +32608,38 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -31467,9 +32656,9 @@ } }, "read-package-json-fast": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", - "integrity": "sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.0", @@ -31477,86 +32666,41 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "dependencies": { "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^2.0.0" + "pify": "^3.0.0" } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "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 - }, - "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 - } + "read-pkg": "^3.0.0" } }, "readable-stream": { @@ -31570,9 +32714,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -31661,9 +32805,9 @@ } }, "regextras": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", - "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", "dev": true }, "regjsgen": { @@ -31951,6 +33095,13 @@ } } }, + "rxjs-for-await": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz", + "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==", + "dev": true, + "requires": {} + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -31972,18 +33123,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.32.12", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.12.tgz", - "integrity": "sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0" } }, "sass-loader": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.0.1.tgz", - "integrity": "sha512-Vp1LcP4slTsTNLEiDkTcm8zGN/XYYrZz2BZybQbliWA8eXveqA/AxsEjllQTpJbg2MzCsx/qNO48sHdZtOaxTw==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -32044,6 +33195,33 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "select-hose": { @@ -32094,9 +33272,9 @@ } }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -32307,6 +33485,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -32619,12 +33808,12 @@ } }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" } @@ -32647,25 +33836,14 @@ "dev": true }, "source-map-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-2.0.1.tgz", - "integrity": "sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", "dev": true, "requires": { "abab": "^2.0.5", "iconv-lite": "^0.6.2", "source-map-js": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "source-map-resolve": { @@ -32775,6 +33953,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -32918,6 +34102,21 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, @@ -33003,13 +34202,38 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -33066,9 +34290,9 @@ } }, "stylus-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-5.0.0.tgz", - "integrity": "sha512-1OaGgixTgC8IAaMCodZXg7XYsfP1qU0UzTHDyPaWACUh34j9geJL4iA583tFJDOtfNUOfDLaBpUywc5MicQ1aA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", "dev": true, "requires": { "fast-glob": "^3.2.5", @@ -33110,9 +34334,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -33128,12 +34352,6 @@ "color-name": "~1.1.4" } }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, "css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -33240,26 +34458,6 @@ "slice-ansi": "^4.0.0", "string-width": "^4.2.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } } }, "tapable": { @@ -33269,9 +34467,9 @@ "dev": true }, "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz", + "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -33291,15 +34489,23 @@ "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "terser-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.2.tgz", - "integrity": "sha512-6QhDaAiVHIQr5Ab3XUWZyDmrIPCHMiqJVljMF91YKyqwKkL5QHnYMkrMBy96v9Z7ev1hGhSEw1HQZc2p/s5Z8Q==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", "dev": true, "requires": { - "jest-worker": "^26.6.2", + "jest-worker": "^27.0.2", "p-limit": "^3.1.0", "schema-utils": "^3.0.0", "serialize-javascript": "^5.0.1", @@ -33307,13 +34513,38 @@ "terser": "^5.7.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -33351,12 +34582,12 @@ "dev": true }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" } }, "to-fast-properties": { @@ -33429,105 +34660,44 @@ "dev": true }, "ts-node": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", - "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", + "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", "dev": true, "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "source-map-support": "^0.5.17", + "yn": "3.1.1" } }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.0", "minimist": "^1.2.0", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "peer": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true - } - } + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "optional": true, - "peer": true, "requires": { "tslib": "^1.8.1" }, @@ -33536,9 +34706,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true, - "peer": true + "dev": true } } }, @@ -33583,9 +34751,9 @@ } }, "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "dev": true }, "ua-parser-js": { @@ -33685,9 +34853,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "unpipe": { @@ -33775,9 +34943,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -33980,21 +35148,21 @@ } }, "webpack": { - "version": "5.39.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", - "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.44.0.tgz", + "integrity": "sha512-I1S1w4QLoKmH19pX6YhYN0NiSXaWY8Ou00oA+aMcr9IUGeF5azns+IKBkfoAAG9Bu5zOIzZt/mN35OffBya8AQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.47", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.2.1", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.4.0", + "es-module-lexer": "^0.7.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -34005,34 +35173,49 @@ "neo-async": "^2.6.2", "schema-utils": "^3.0.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", + "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", "webpack-sources": "^2.3.0" }, "dependencies": { "acorn": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz", - "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "dev": true }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -34044,9 +35227,9 @@ "dev": true }, "webpack-sources": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", - "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, "requires": { "source-list-map": "^2.0.1", @@ -34056,32 +35239,57 @@ } }, "webpack-dev-middleware": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.1.0.tgz", - "integrity": "sha512-mpa/FY+DiBu5+r5JUIyTCYWRfkWgyA3/OOE9lwfzV9S70A4vJYLsVRKj5rMFEsezBroy2FmPyQ8oBRVW8QmK1A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", "dev": true, "requires": { - "colorette": "^1.2.1", - "mem": "^8.0.0", - "memfs": "^3.2.0", - "mime-types": "^2.1.28", + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -34129,6 +35337,25 @@ "yargs": "^13.3.2" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -34200,12 +35427,6 @@ } } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -34425,6 +35646,12 @@ "path-is-inside": "^1.0.2" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -34489,12 +35716,6 @@ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "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 - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -34723,9 +35944,9 @@ } }, "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -34777,9 +35998,9 @@ "dev": true }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -34896,9 +36117,9 @@ "dev": true }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", "dev": true, "requires": {} }, @@ -34937,9 +36158,9 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", + "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -34949,12 +36170,20 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } } }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==", "dev": true }, "yn": { diff --git a/ui/package.json b/ui/package.json index a7c773c34fc..fd689159224 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2021.13.0", + "version": "2021.14.0", "author": "OpenEMS Association e.V.", "homepage": "http://openems.io", "scripts": { @@ -15,67 +15,67 @@ }, "private": true, "dependencies": { - "@angular/animations": "~12.0.1", - "@angular/common": "~12.0.1", - "@angular/core": "~12.0.1", - "@angular/forms": "~12.0.1", - "@angular/platform-browser": "~12.0.1", - "@angular/platform-browser-dynamic": "~12.0.1", - "@angular/router": "~12.0.1", - "@angular/service-worker": "~12.0.1", - "@ionic/angular": "^5.5.2", + "@angular/animations": "~12.1.4", + "@angular/common": "~12.1.4", + "@angular/core": "~12.1.4", + "@angular/forms": "~12.1.4", + "@angular/platform-browser": "~12.1.4", + "@angular/platform-browser-dynamic": "~12.1.4", + "@angular/router": "~12.1.4", + "@angular/service-worker": "~12.1.4", + "@ionic/angular": "^5.6.12", "@ngx-formly/core": "^5.10.22", "@ngx-formly/ionic": "^5.10.22", "@ngx-formly/schematics": "^5.10.22", "@ngx-translate/core": "^13.0.0", - "angular-mydatepicker": "^0.11.4", + "angular-mydatepicker": "^0.11.5", "chart.js": "^2.9.4", "classlist.js": "^1.1.20150312", - "d3": "^7.0.0", - "date-fns": "^2.22.1", + "d3": "^7.0.1", + "date-fns": "^2.23.0", "file-saver-es": "^2.0.5", "ng2-charts": "^2.4.3", - "ngx-cookie-service": "^12.0.0", + "ngx-cookie-service": "^12.0.3", "ngx-spinner": "^12.0.0", "roboto-fontface": "^0.10.0", - "rxjs": "~6.6.0", + "rxjs": "~6.6.7", "semver-compare-multi": "^1.0.3", - "tslib": "^2.0.0", + "tslib": "^2.3.0", "uuid": "^8.3.2", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~12.0.1", - "@angular-eslint/builder": "~12.0.0", - "@angular-eslint/eslint-plugin": "~12.0.0", - "@angular-eslint/eslint-plugin-template": "~12.0.0", - "@angular-eslint/template-parser": "~12.0.0", - "@angular/cli": "~12.0.1", - "@angular/compiler": "~12.0.1", - "@angular/compiler-cli": "~12.0.1", - "@angular/language-service": "~12.0.1", + "@angular-devkit/build-angular": "~12.1.4", + "@angular-eslint/builder": "~12.3.1", + "@angular-eslint/eslint-plugin": "~12.3.1", + "@angular-eslint/eslint-plugin-template": "~12.3.1", + "@angular-eslint/template-parser": "~12.3.1", + "@angular/cli": "~12.1.4", + "@angular/compiler": "~12.1.4", + "@angular/compiler-cli": "~12.1.4", + "@angular/language-service": "~12.1.4", "@ionic/angular-toolkit": "^4.0.0", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", + "@types/jasmine": "~3.8.2", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^16.4.10", "@types/uuid": "^8.3.1", - "@typescript-eslint/eslint-plugin": "4.16.1", - "@typescript-eslint/parser": "4.16.1", - "eslint": "^7.6.0", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-jsdoc": "30.7.6", - "eslint-plugin-prefer-arrow": "1.2.2", - "jasmine-core": "~3.7.1", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~6.3.2", + "@typescript-eslint/eslint-plugin": "4.29.0", + "@typescript-eslint/parser": "4.29.0", + "eslint": "^7.32.0", + "eslint-plugin-import": "2.23.4", + "eslint-plugin-jsdoc": "36.0.6", + "eslint-plugin-prefer-arrow": "1.2.3", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~7.0.0", + "karma": "~6.3.4", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.0.3", - "karma-coverage-istanbul-reporter": "~3.0.2", - "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "^1.5.0", + "karma-coverage-istanbul-reporter": "~3.0.3", + "karma-jasmine": "~4.0.1", + "karma-jasmine-html-reporter": "^1.7.0", "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "typescript": "~4.2.4" + "ts-node": "~10.1.0", + "typescript": "~4.3.5" }, "description": "OpenEMS UI" -} +} \ No newline at end of file diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index 0d5036bbccb..fb693c55dec 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -20,6 +20,7 @@ import { RepeatTypeComponent } from './edge/settings/component/shared/repeat'; import { SettingsModule as EdgeSettingsModule } from './edge/settings/settings.module'; import { SystemLogComponent } from './edge/settings/systemlog/systemlog.component'; import { IndexModule } from './index/index.module'; +import { RegistrationModule } from './registration/registration.module'; import { ChartOptionsPopoverComponent } from './shared/chartoptions/popover/popover.component'; import { PickDatePopoverComponent } from './shared/pickdate/popover/popover.component'; import { SharedModule } from './shared/shared.module'; @@ -66,6 +67,7 @@ import { UserModule } from './user/user.module'; loader: { provide: TranslateLoader, useClass: Language } }), UserModule, + RegistrationModule ], providers: [ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, diff --git a/ui/src/app/index/index.component.html b/ui/src/app/index/index.component.html index 470eb6e4969..6887dbc280c 100644 --- a/ui/src/app/index/index.component.html +++ b/ui/src/app/index/index.component.html @@ -58,10 +58,16 @@ - - LOGIN - - + + + + Login + + +
    + +
    +
    diff --git a/ui/src/app/index/index.module.ts b/ui/src/app/index/index.module.ts index 0a5d166edeb..619c3c6e9fc 100644 --- a/ui/src/app/index/index.module.ts +++ b/ui/src/app/index/index.module.ts @@ -1,12 +1,13 @@ import { NgModule } from '@angular/core'; +import { RegistrationModule } from '../registration/registration.module'; import { SharedModule } from './../shared/shared.module'; import { IndexComponent } from './index.component'; - @NgModule({ imports: [ SharedModule, + RegistrationModule ], declarations: [ IndexComponent diff --git a/ui/src/app/registration/modal/modal.component.html b/ui/src/app/registration/modal/modal.component.html new file mode 100644 index 00000000000..fb153d66515 --- /dev/null +++ b/ui/src/app/registration/modal/modal.component.html @@ -0,0 +1,154 @@ + + + Register.title + + + + + + + + + + + Register.segment.user + + + Register.segment.installer + + + + + +
    + +
    + + Register.form.firstname* + + + + Register.form.lastname* + + + + + Register.form.street* + + + + + Register.form.zip* + + + + + Register.form.city* + + + + + Register.form.country* + + Deutschland + Österreich + Schweiz + + + + Register.form.phone* + + + + + Register.form.email* + + + + + Register.form.password* + + + + Register.form.confirmPassword* + + + +
    + +
    + + Register.form.companyName* + + + + Register.form.firstname* + + + + Register.form.lastname* + + + + + Register.form.street* + + + + + Register.form.zip* + + + + + Register.form.city* + + + + + Register.form.country* + + Deutschland + Österreich + Schweiz + + + + Register.form.phone* + + + + + Register.form.email* + + + + + Register.form.password* + + + + Register.form.confirmPassword* + + + +
    + + + + + Register.button + + +
    +
    +
    \ No newline at end of file diff --git a/ui/src/app/registration/modal/modal.component.ts b/ui/src/app/registration/modal/modal.component.ts new file mode 100644 index 00000000000..be9acb19a57 --- /dev/null +++ b/ui/src/app/registration/modal/modal.component.ts @@ -0,0 +1,125 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ModalController } from '@ionic/angular'; +import { TranslateService } from '@ngx-translate/core'; +import { RegisterUserRequest } from 'src/app/shared/jsonrpc/request/registerUserRequest'; +import { Service, Websocket } from 'src/app/shared/shared'; + +@Component({ + selector: 'registration-modal', + templateUrl: './modal.component.html' +}) +export class RegistrationModalComponent implements OnInit { + + formGroup: FormGroup; + activeSegment: string = "owner"; + + constructor( + private formBuilder: FormBuilder, + public modalCtrl: ModalController, + private translate: TranslateService, + private service: Service, + private websocket: Websocket + ) { } + + ngOnInit() { + this.formGroup = this.getForm(this.activeSegment); + } + + /** + * Update the form depending on the thrown event (ionChange) value. + * + * @param event to get current value and change the form + */ + updateRegistrationForm(event: CustomEvent) { + this.formGroup = this.getForm(event.detail.value); + } + + /** + * Validate the current form and sends the registration request. + */ + onSubmit() { + if (!this.formGroup.valid) { + this.service.toast(this.translate.instant("Register.errors.requiredFields"), 'danger'); + return; + } + + let password = this.formGroup.value.password; + let confirmPassword = this.formGroup.value.confirmPassword; + + if (password != confirmPassword) { + this.service.toast(this.translate.instant("Register.errors.passwordNotEqual"), 'danger'); + return; + } + + let request = new RegisterUserRequest({ + user: { + firstname: this.formGroup.value.firstname, + lastname: this.formGroup.value.lastname, + phone: this.formGroup.value.phone, + email: this.formGroup.value.email, + password: password, + confirmPassword: confirmPassword, + address: { + street: this.formGroup.value.street, + zip: this.formGroup.value.zip, + city: this.formGroup.value.city, + country: this.formGroup.value.country + }, + role: this.activeSegment + } + }); + + let companyName = this.formGroup.value.companyName; + if (companyName) { + request.params.user.company = { + name: companyName + } + } + + this.websocket.sendRequest(request) + .then(res => { + this.service.toast(this.translate.instant("Register.success"), 'success'); + this.modalCtrl.dismiss(); + }) + .catch(reason => { + this.service.toast(reason.error.message, 'danger'); + }); + } + + /** + * Get from depending on given role. + * If no role matches then the default (owner) from will be returnd. + */ + private getForm(role: string): FormGroup { + if (role === 'installer') { + return this.formBuilder.group({ + companyName: new FormControl("", Validators.required), + firstname: new FormControl("", Validators.required), + lastname: new FormControl("", Validators.required), + street: new FormControl("", Validators.required), + zip: new FormControl("", [Validators.required, Validators.minLength(4), Validators.maxLength(5)]), + city: new FormControl("", Validators.required), + country: new FormControl("", Validators.required), + phone: new FormControl("", Validators.required), + email: new FormControl("", [Validators.required, Validators.email]), + password: new FormControl("", Validators.required), + confirmPassword: new FormControl("", Validators.required) + }); + } else { + return this.formBuilder.group({ + firstname: new FormControl("", Validators.required), + lastname: new FormControl("", Validators.required), + street: new FormControl("", Validators.required), + zip: new FormControl("", [Validators.required, Validators.minLength(4), Validators.maxLength(5)]), + city: new FormControl("", Validators.required), + country: new FormControl("", Validators.required), + phone: new FormControl("", Validators.required), + email: new FormControl("", [Validators.required, Validators.email]), + password: new FormControl("", Validators.required), + confirmPassword: new FormControl("", Validators.required) + }); + } + } + +} diff --git a/ui/src/app/registration/registration.component.html b/ui/src/app/registration/registration.component.html new file mode 100644 index 00000000000..54f266bde78 --- /dev/null +++ b/ui/src/app/registration/registration.component.html @@ -0,0 +1,3 @@ + + Register.title + \ No newline at end of file diff --git a/ui/src/app/registration/registration.component.ts b/ui/src/app/registration/registration.component.ts new file mode 100644 index 00000000000..fad4d3e0048 --- /dev/null +++ b/ui/src/app/registration/registration.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { RegistrationModalComponent } from './modal/modal.component'; + +@Component({ + selector: 'registration', + templateUrl: './registration.component.html' +}) +export class RegistrationComponent implements OnInit { + + constructor(private modalController: ModalController) { } + + ngOnInit() { + } + + async presentModal() { + const modal = await this.modalController.create({ + component: RegistrationModalComponent + }); + return await modal.present(); + } + +} diff --git a/ui/src/app/registration/registration.module.ts b/ui/src/app/registration/registration.module.ts new file mode 100644 index 00000000000..1251377fe42 --- /dev/null +++ b/ui/src/app/registration/registration.module.ts @@ -0,0 +1,20 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { RegistrationModalComponent } from './modal/modal.component'; +import { RegistrationComponent } from './registration.component'; + +@NgModule({ + declarations: [ + RegistrationComponent, + RegistrationModalComponent + ], + imports: [ + CommonModule, + SharedModule + ], + exports: [ + RegistrationComponent + ] +}) +export class RegistrationModule { } diff --git a/ui/src/app/shared/jsonrpc/request/addEdgeToUserRequest.ts b/ui/src/app/shared/jsonrpc/request/addEdgeToUserRequest.ts new file mode 100644 index 00000000000..6364807e26d --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/addEdgeToUserRequest.ts @@ -0,0 +1,27 @@ +import { JsonrpcRequest } from "../base"; + +/** + *
    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "method": "addEdgeToUser",
    + *   "params": {
    + *      "setupPassword": string
    + *   }
    + * }
    + * 
    + */ +export class AddEdgeToUserRequest extends JsonrpcRequest { + + static METHOD: string = "addEdgeToUser"; + + public constructor( + public readonly params: { + setupPassword: string + } + ) { + super(AddEdgeToUserRequest.METHOD, params); + } + +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/request/getSetupProtocolRequest.ts b/ui/src/app/shared/jsonrpc/request/getSetupProtocolRequest.ts new file mode 100644 index 00000000000..a67d55ffdc3 --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/getSetupProtocolRequest.ts @@ -0,0 +1,25 @@ +import { JsonrpcRequest } from "../base"; + +/** + *
    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "method": "submitSetupProtocol",
    + *   "params": {
    + *      
    + *   }
    + * 
    + */ +export class GetSetupProtocolRequest extends JsonrpcRequest { + + static METHOD: string = "getSetupProtocol"; + + public constructor( + public readonly params: { + setupProtocolId: string + } + ) { + super(GetSetupProtocolRequest.METHOD, params); + } +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/request/getUserInformationRequest.ts b/ui/src/app/shared/jsonrpc/request/getUserInformationRequest.ts new file mode 100644 index 00000000000..190343c025c --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/getUserInformationRequest.ts @@ -0,0 +1,20 @@ +import { JsonrpcRequest } from "../base"; + +/** + *
    + * {
    + *  "jsonrpc": "2.0",
    + *  "id": UUID,
    + *  "method": "getUserInformation"
    + *  }
    + * 
    + */ +export class GetUserInformationRequest extends JsonrpcRequest { + + static METHOD: string = "getUserInformation"; + + public constructor() { + super(GetUserInformationRequest.METHOD, {}); + } + +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/request/registerUserRequest.ts b/ui/src/app/shared/jsonrpc/request/registerUserRequest.ts new file mode 100644 index 00000000000..e6e58389439 --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/registerUserRequest.ts @@ -0,0 +1,56 @@ +import { JsonrpcRequest } from "../base"; + +/** + *
    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "method": "addEdgeToUser",
    + *   "params": {
    + *     "user": {
    + *       "companyName": string,
    + *       "firstname": string,
    + *       "lastname": string,
    + *       "street": string,
    + *       "zip": string,
    + *       "city": string,
    + *       "country": string,
    + *       "phone": string,
    + *       "email": string,
    + *       "password": string,
    + *       "confirmPassword": string
    + *     }
    + *   }
    + * }
    + * 
    + */ +export class RegisterUserRequest extends JsonrpcRequest { + + static METHOD: string = "registerUser"; + + public constructor( + public readonly params: { + user: { + firstname: string, + lastname: string, + phone: string, + email: string, + password: string, + confirmPassword: string, + address: { + street: string, + zip: string, + city: string, + country: string + }, + company?: { + name: string + }, + role: string + } + } + ) { + super(RegisterUserRequest.METHOD, params); + } + +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/request/setUserInformationRequest.ts b/ui/src/app/shared/jsonrpc/request/setUserInformationRequest.ts new file mode 100644 index 00000000000..abed0246199 --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/setUserInformationRequest.ts @@ -0,0 +1,55 @@ +import { JsonrpcRequest } from "../base"; + +/** + *
    + * {
    + *  "jsonrpc": "2.0",
    + *  "id": UUID,
    + *  "method": "setUserInformation",
    + *  "params": {
    + *      "user": {
    + *          "firstname": string,
    + *          "lastname": string,
    + *          "email": string,
    + *          "phone": string,
    + *          "address": {
    + *              "street": string,
    + *              "zip": string,
    + *              "city": string,
    + *              "country": string
    + *          },
    + *          "company": {
    + *              "name": string
    + *          }
    + *      }
    + *  }
    + * }
    + * 
    + */ +export class SetUserInformationRequest extends JsonrpcRequest { + + static METHOD: string = "setUserInformation"; + + public constructor( + public readonly params: { + user: { + firstname: string, + lastname: string, + email: string, + phone: string, + address: { + street: string, + zip: string, + city: string, + country: string + }, + company: { + name: string + } + } + } + ) { + super(SetUserInformationRequest.METHOD, params); + } + +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/request/submitSetupProtocolRequest.ts b/ui/src/app/shared/jsonrpc/request/submitSetupProtocolRequest.ts new file mode 100644 index 00000000000..aa2e1a5053e --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/submitSetupProtocolRequest.ts @@ -0,0 +1,116 @@ +import { JsonrpcRequest } from "../base"; + +export type SetupProtocol = { + edge: { + id: string + }, + customer: { + firstname: string, + lastname: string, + email: string, + phone: string, + address: { + street: string, + city: string, + zip: string, + country: string + }, + company?: { + name: string + } + }, + location?: { + firstname: string, + lastname: string, + email: string, + phone: string, + address: { + street: string, + city: string, + zip: string, + country: string + }, + company?: { + name: string + + } + }, + lots?: { + category: string, + name: string, + serialNumber: string + }[], + items?: { + category: string, + name: string, + value: string + }[] +}; + +/** + *
    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "method": "submitSetupProtocol",
    + *   "params": {
    + *      protocol: {
    + *          edge: {
    + *              id: string
    + *          },
    + *          customer: {
    + *              firstname: string,
    + *              lastname: string,
    + *              email: string,
    + *              phone: string,
    + *              address: {
    + *                  street: string,
    + *                  city: string,
    + *                  zip: string,
    + *                  country: string
    + *              },
    + *              company?: {
    + *                  name: string
    + *              }
    + *          },
    + *          location?: {
    + *              firstname: string,
    + *              lastname: string,
    + *              email: string,
    + *              phone: string,
    + *              address: {
    + *                  street: string,
    + *                  city: string,
    + *                  zip: string,
    + *                  country: string
    + *              },
    + *              company?: {
    + *                  name: string
    + *              }
    + *          },
    + *          lots?: {
    + *              category: string,
    + *              name: string,
    + *              serialNumber: string
    + *          }[],
    + *          items?: {
    + *              category: string,
    + *              name: string,
    + *              value: string
    + *          }[]
    + *      }
    + *  }
    + * 
    + */ +export class SubmitSetupProtocolRequest extends JsonrpcRequest { + + static METHOD: string = "submitSetupProtocol"; + + public constructor( + public readonly params: { + protocol: SetupProtocol + } + ) { + super(SubmitSetupProtocolRequest.METHOD, params); + } +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/response/addEdgeToUserResponse.ts b/ui/src/app/shared/jsonrpc/response/addEdgeToUserResponse.ts new file mode 100644 index 00000000000..74c7b9989fb --- /dev/null +++ b/ui/src/app/shared/jsonrpc/response/addEdgeToUserResponse.ts @@ -0,0 +1,38 @@ +import { JsonrpcResponseSuccess } from "../base"; + +/** + * Represents a JSON-RPC Response for a {@link AddEdgeToUserRequest}. + * + *
    + * {
    + *  "jsonrpc": "2.0",
    + *  "id": UUID,
    + *  "result": {
    + *      "edge": {
    + *          id: string,
    + *          comment: string,
    + *          producttype: string,
    + *          version: string,
    + *          isOnline: boolean
    + *      }
    + *  }
    + * }
    + * 
    + */ +export class AddEdgeToUserResponse extends JsonrpcResponseSuccess { + + public constructor( + public readonly id: string, + public readonly result: { + edge: { + id: string, + comment: string, + producttype: string, + version: string, + online: boolean + } + } + ) { + super(id, result); + } +} \ No newline at end of file diff --git a/ui/src/app/shared/jsonrpc/response/getUserInformationResponse.ts b/ui/src/app/shared/jsonrpc/response/getUserInformationResponse.ts new file mode 100644 index 00000000000..0724f8ec20e --- /dev/null +++ b/ui/src/app/shared/jsonrpc/response/getUserInformationResponse.ts @@ -0,0 +1,55 @@ +import { JsonrpcResponseSuccess } from "../base"; + +/** + * Represents a JSON-RPC Response for {@link GetUserInformationRequest}. + * + *
    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "result": {
    + *      "user": {
    + *          "firstname": string,
    + *          "lastname": string,
    + *          "email": string,
    + *          "phone": string,
    + *          "address": {
    + *              "street": string,
    + *              "zip": string,
    + *              "city": string,
    + *              "country": string
    + *          },
    + *          "company": {
    + *              "name": string
    + *          }
    + *      }
    + *   }
    + * }
    + * 
    + */ +export class GetUserInformationResponse extends JsonrpcResponseSuccess { + + public constructor( + public readonly id: string, + public readonly result: { + user: { + firstname: string, + lastname: string, + email: string, + phone: string, + address: { + street: string, + zip: string, + city: string, + country: string + }, + company: { + name: string + } + } + } + ) { + super(id, result); + } + +} \ No newline at end of file diff --git a/ui/src/app/shared/service/websocket.ts b/ui/src/app/shared/service/websocket.ts index dda34f7f599..369d7056ea1 100644 --- a/ui/src/app/shared/service/websocket.ts +++ b/ui/src/app/shared/service/websocket.ts @@ -15,6 +15,7 @@ import { AuthenticateWithPasswordRequest } from '../jsonrpc/request/authenticate import { AuthenticateWithTokenRequest } from '../jsonrpc/request/authenticateWithTokenRequest'; import { EdgeRpcRequest } from '../jsonrpc/request/edgeRpcRequest'; import { LogoutRequest } from '../jsonrpc/request/logoutRequest'; +import { RegisterUserRequest } from '../jsonrpc/request/registerUserRequest'; import { SubscribeSystemLogRequest } from '../jsonrpc/request/subscribeSystemLogRequest'; import { AuthenticateResponse } from '../jsonrpc/response/authenticateResponse'; import { Role } from '../type/role'; @@ -210,7 +211,7 @@ export class Websocket { // logged in + normal operation this.status == 'online' // otherwise only authentication request allowed - || (request instanceof AuthenticateWithPasswordRequest || request instanceof AuthenticateWithTokenRequest)) { + || (request instanceof AuthenticateWithPasswordRequest || request instanceof AuthenticateWithTokenRequest || request instanceof RegisterUserRequest)) { return new Promise((resolve, reject) => { this.wsdata.sendRequest(this.socket, request).then(response => { diff --git a/ui/src/app/shared/translate/de.ts b/ui/src/app/shared/translate/de.ts index 2a0971947d4..0dcca2dbd48 100644 --- a/ui/src/app/shared/translate/de.ts +++ b/ui/src/app/shared/translate/de.ts @@ -112,8 +112,35 @@ export const TRANSLATION = { preamble: "Bitte geben Sie Ihr Passwort ein oder bestätigen Sie die Voreingabe um sich als Gast anzumelden.", passwordLabel: "Passwort", passwordPlaceholder: "Passwort", + passwordReset: "Passwort zurücksetzen", authenticationFailed: "Authentifizierung fehlgeschlagen", }, + Register: { + title: "Benutzer Account anlegen", + segment: { + user: "Benutzer", + installer: "Installateur" + }, + form: { + companyName: "Firmenname", + firstname: "Vorname", + lastname: "Nachname", + street: "Straße | Hausnummer", + zip: "PLZ", + city: "Ort", + country: "Land", + phone: "Telefonnummer", + email: "E-Mail Adresse", + password: "Passwort", + confirmPassword: "Passwort wiederholen" + }, + button: "Anlegen", + errors: { + requiredFields: "Bitte alle Felder ausfüllen", + passwordNotEqual: "Passwörter sind nicht gleich" + }, + success: "Registrierung erfolgreich" + }, Edge: { Index: { Energymonitor: { diff --git a/ui/src/app/shared/translate/en.ts b/ui/src/app/shared/translate/en.ts index f130d510c48..25cb00f217a 100644 --- a/ui/src/app/shared/translate/en.ts +++ b/ui/src/app/shared/translate/en.ts @@ -105,12 +105,40 @@ export const TRANSLATION = { connectionSuccessful: 'Successfully connected to {{value}}.', // value = name of websocket isOffline: 'OpenEMS is offline!', toEnergymonitor: 'To Energymonitor...', + type: 'Type:' + }, + Register: { + title: "Create user account", + segment: { + user: "User", + installer: "Installer" + }, + form: { + companyName: "Company name", + firstname: "Firstname", + lastname: "Lastname", + street: "Street", + zip: "Postal code", + city: "City", + country: "Country", + phone: "Phone number", + email: "E-Mail", + password: "Password", + confirmPassword: "Confirm password" + }, + button: "Create", + errors: { + requiredFields: "Please fill in all fields", + passwordNotEqual: "Passwords are not equal" + }, + success: "Registration successful" }, Login: { title: "Login", preamble: "Please enter your password or submit the default value to login as a guest.", passwordLabel: "Password", passwordPlaceholder: "Password", + passwordReset: "Reset Password", authenticationFailed: "Authentication Failed", }, Edge: { diff --git a/ui/src/app/user/user.component.html b/ui/src/app/user/user.component.html index 9f6215a3dd9..a503242f009 100644 --- a/ui/src/app/user/user.component.html +++ b/ui/src/app/user/user.component.html @@ -96,8 +96,8 @@ About.openEMS
  • - - About.build: 2021.13.0 (2021-07-29) + + About.build: 2021.14.0 (2021-08-26)