Compare commits

..

4 Commits

Author SHA1 Message Date
a59424171d Update 2024-04-11 01:21:53 +02:00
97caf4b30e Update 2024-04-09 04:02:09 +02:00
55c8b628ca Update 2024-04-08 18:48:18 +02:00
1e858021be Update 2024-04-03 03:35:09 +02:00
23 changed files with 1413 additions and 259 deletions

3
.gitignore vendored
View File

@ -95,4 +95,5 @@ out/
.idea/
# Data Directory
data/
data/
*.test

View File

@ -20,7 +20,13 @@ const config: ForgeConfig = {
new MakerSquirrel({}),
new MakerZIP({}, ['darwin']),
new MakerRpm({}),
new MakerDeb({})],
new MakerDeb({
options: {
depends: [
"libpcsclite1", "libpcsclite-dev", "pcscd"
]
}
})],
plugins: [
new AutoUnpackNativesPlugin({}),
new WebpackPlugin({

View File

@ -51,6 +51,7 @@
"@mui/material": "^5.15.14",
"@types/websocket": "^1.0.10",
"electron-squirrel-startup": "^1.0.0",
"nfc-pcsc": "^0.8.1",
"node-wifi-scanner": "git+https://git.gaminggeneration.de/tobiash/node-wifi-scanner",
"react": "^18.2.0",
"react-dom": "^18.2.0",

View File

@ -2,10 +2,13 @@ import path from "path";
import process from "process";
import * as fs from "fs";
import {Config, GameRules} from "./RawConstants";
import {app} from "electron";
export class ConfigHandler {
private static dataPath = path.resolve(app.getPath('userData'), "config");
private static confPath = path.resolve(this.dataPath, "config.json");
private static defaultConfig = {
rules: {
switchValues: {},
@ -13,21 +16,19 @@ export class ConfigHandler {
}
}
private static confPath = path.resolve(process.cwd(), "data", "config.json");
static generateDefault() {
fs.writeFileSync(this.confPath, JSON.stringify(this.defaultConfig, null, 1));
}
static get() {
if(!fs.existsSync(this.confPath))
this.generateDefault();
this.existsOrGenerate();
let confRaw = fs.readFileSync(this.confPath).toString('utf8');
try {
JSON.parse(confRaw);
}catch(e)
{
} catch (e) {
this.generateDefault();
}
@ -35,22 +36,29 @@ export class ConfigHandler {
return JSON.parse(confRaw) as Config;
}
static set(conf: Config) {
if(!fs.existsSync(this.confPath))
static existsOrGenerate() {
if (!fs.existsSync(this.dataPath))
fs.mkdirSync(this.dataPath);
if (!fs.existsSync(this.confPath))
this.generateDefault();
}
static set(conf: Config) {
this.existsOrGenerate();
let confRaw = fs.readFileSync(this.confPath).toString('utf8');
try {
JSON.parse(confRaw);
}catch(e)
{
} catch (e) {
this.generateDefault();
}
let current = JSON.parse(confRaw) as Config;
current = {...current, ...conf};
console.log("Config saved!")
console.log("Config saved to " + this.confPath);
fs.writeFileSync(this.confPath, JSON.stringify(current, null, 1));
}

View File

@ -1,17 +0,0 @@
import { ipcMain } from 'electron';
import IpcMainInvokeEvent = Electron.IpcMainInvokeEvent;
import {IPCAnswer, IPCChannel, IPCRequest} from "./RawConstants";
export const IPCHandler = (
channel: IPCChannel,
listener: (
event: IpcMainInvokeEvent,
request: IPCRequest,
...args: any[]
) => Promise<IPCAnswer> | IPCAnswer
): void => {
ipcMain.handle(channel, listener);
};
//

25
src/IPCMainHandler.ts Normal file
View File

@ -0,0 +1,25 @@
import { ipcMain } from 'electron';
import IpcMainInvokeEvent = Electron.IpcMainInvokeEvent;
import {IPCAnswer, IPCChannel, IPCListenChannels, IPCRequest} from "./RawConstants";
export const IPCHandle = (
channel: IPCChannel,
listener: (
event: IpcMainInvokeEvent,
request: IPCRequest,
...args: any[]
) => Promise<IPCAnswer> | IPCAnswer
): void => {
ipcMain.handle(channel, listener);
};
export const IPCSend = (
channel: IPCListenChannels,
message: IPCAnswer,
...args: any
): void => {
console.log("Sending ", message, " to " + channel);
global.mainWebContents.send(channel, message, ...args);
};

236
src/NFCHandler.ts Normal file
View File

@ -0,0 +1,236 @@
import {NFC} from "nfc-pcsc";
import {IPCSend} from "./IPCMainHandler";
import {
IPCListenChannels,
NFCAccountCard,
NFCCard,
NFCCardType,
NFCPropertyCard,
NFCTaskCard,
PropertyColor, TaskType
} from "./RawConstants";
import * as fs from "fs";
import path from "path";
export default class NFCHandler {
public static initPCSC() {
const nfc = new NFC(); // optionally you can pass logger
nfc.on('reader', reader => {
console.log(`${reader.name} device attached`);
// enable when you want to auto-process ISO 14443-4 tags (standard=TAG_ISO_14443_4)
// when an ISO 14443-4 is detected, SELECT FILE command with the AID is issued
// the response is available as card.data in the card event
// see examples/basic.js line 17 for more info
// reader.aid = 'F222222222';
reader.on('card', card => {
// card is object containing following data
// [always] String type: TAG_ISO_14443_3 (standard nfc tags like MIFARE) or TAG_ISO_14443_4 (Android HCE and others)
// [always] String standard: same as type
// [only TAG_ISO_14443_3] String uid: tag uid
// [only TAG_ISO_14443_4] Buffer data: raw data from select APDU response
console.log(`${reader.name} card detected`, card);
let parsed = this.formClass(card.uid, card.data.toString("utf8"));
if (parsed && parsed.isComplete)
IPCSend(IPCListenChannels.NFC_CARD, {status: true, data: parsed.card});
IPCSend(IPCListenChannels.NFC_RAW, {status: !!parsed, data: parsed});
});
reader.on('card.off', card => {
console.log(`${reader.name} card removed`, card);
});
reader.on('error', err => {
console.log(`${reader.name} an error occurred`, err);
});
reader.on('end', () => {
console.log(`${reader.name} device removed`);
});
});
nfc.on('error', err => {
console.log('an error occurred', err);
});
}
public static initTest() {
fs.watchFile(path.resolve(process.cwd(), "nfc.test"), (curr, prev) => {
let contents = fs.readFileSync(path.resolve(process.cwd(), "nfc.test")).toString("utf-8");
let parsed = this.formClass("xyz", contents);
if (parsed.isComplete)
IPCSend(IPCListenChannels.NFC_CARD, {status: true, data: parsed.card});
IPCSend(IPCListenChannels.NFC_RAW, {status: parsed.isComplete, data: parsed.card});
console.log("Got NFC", parsed);
})
}
/**
* Returns formed nfc card or null if nothing can be parsed
* @param uid
* @param raw
*/
public static formClass(uid: string, raw: string): formClassReturn | null {
raw = Buffer.from(raw, "base64").toString("utf-8");
/*
NFC-Card FULL
CARD_TYPE|PROPERTIES
- ACCOUNT
- PROPERTY
- TASK
*/
let preParsed: NFCCard = {
uid: uid,
raw: raw,
cardType: NFCCardType.INVALID,
};
try {
let parsing = raw.split("|");
switch (parsing[0]) {
case "PROPERTY": {
preParsed.cardType = NFCCardType.PROPERTY;
const splitProperty = parsing[1].split(";");
/*
0 Name
1 Color
2 Fullset Amount
3 Buy Value
4 Mortgage Value
5 Rent Object (split with ,)
0 Basic rent
[1 Rent with 1 house
2 Rent with 2 houses
3 Rent with 3 houses
4 Rent with 4 houses
5 Rent with 1 hotel]
6 Special Props
""
"TRAINSTATION"
"UTILITY"
*/
let name = this.valueOr(splitProperty, 0, "");
let color = this.valueOr(splitProperty, 1, PropertyColor.WHITE);
let fullSetAmount = this.valueOr(splitProperty, 2, 0);
let buyValue = this.valueOr(splitProperty, 3, 0);
let mortgageValue = this.valueOr(splitProperty, 4, 0);
let rent = 0;
let rent1 = 0;
let rent2 = 0;
let rent3 = 0;
let rent4 = 0;
let rentHotel = 0;
if (splitProperty[5]) {
let rentSplit = splitProperty[5].split(",");
rent = this.valueOr(rentSplit, 0, 0);
rent1 = this.valueOr(rentSplit, 1, undefined);
rent2 = this.valueOr(rentSplit, 2, undefined);
rent3 = this.valueOr(rentSplit, 3, undefined);
rent4 = this.valueOr(rentSplit, 4, undefined);
rentHotel = this.valueOr(rentSplit, 5, undefined);
}
let specialProperties = this.valueOr(splitProperty, 6, "");
let propertyParsed: NFCPropertyCard = {
...preParsed,
name: name,
color: color,
fullSetAmount: fullSetAmount,
buyValue: buyValue,
mortgageValue: mortgageValue,
rent: rent,
rent1: rent1,
rent2: rent2,
rent3: rent3,
rent4: rent4,
rentHotel: rentHotel,
specialProperties: specialProperties,
};
if (splitProperty.length != 7)
return {card: propertyParsed, isComplete: false};
return {card: propertyParsed, isComplete: true};
}
case "ACCOUNT": {
preParsed.cardType = NFCCardType.ACCOUNT;
const splitAccount = parsing[1].split(";");
let symbol = this.valueOr(splitAccount, 0, "");
let nickname = this.valueOr(splitAccount, 1, "");
let pin = this.valueOr(splitAccount, 2, 0);
const splitParsed: NFCAccountCard = {
...preParsed,
symbol: symbol,
nickname: nickname,
pin: Number.parseInt(pin)
}
if (splitAccount.length != 3)
return {card: splitParsed, isComplete: false};
return {card: splitParsed, isComplete: true}
}
case "TASK": {
preParsed.cardType = NFCCardType.ACCOUNT;
const splitTask = parsing[1].split(";");
let taskType = this.valueOr(splitTask, 0, "");
let taskAmount1 = this.valueOr(splitTask, 1, 0);
let taskAmount2 = this.valueOr(splitTask, 2, 0);
const splitParsed: NFCTaskCard = {
...preParsed,
type: taskType as TaskType,
amount: Number.parseInt(taskAmount1) || 0,
amount2: Number.parseInt(taskAmount2) || 0
}
if (splitTask.length < 1 || splitTask.length > 3)
return {card: splitParsed, isComplete: false};
return {card: splitParsed, isComplete: true}
}
default: {
return {card: preParsed, isComplete: false};
}
}
} catch (e) {
return null;
}
}
private static valueOr(arr: string[], index: number, def: any) {
try {
if (arr[index])
return arr[index];
return def;
} catch (e) {
return def;
}
}
}
interface formClassReturn {
card: NFCCard;
isComplete: boolean;
}

View File

@ -8,8 +8,8 @@ export type IPCChannel =
| 'PREPARING'
export enum IPCListenChannels {
'KEYPAD_INPUT'= 'KEYPAD_INPUT',
'NFC_CARD'= 'NFC_CARD',
'KEYPAD_INPUT' = 'KEYPAD_INPUT',
'NFC_CARD' = 'NFC_CARD',
'NFC_RAW' = 'NFC_RAW'
}
@ -45,7 +45,7 @@ export type GameSwitch = {
export type GameInput = {
name: GameInputNames,
type: "number" | "string",
type: "number" | "text",
label: string,
depends?: GameSwitchNames,
value: string
@ -68,7 +68,8 @@ export type GameSwitchNames =
export type GameInputNames =
"PASSING_GO_CASH"
| "STARTING_CASH"
| "PRISON_RELEASE_FEE";
| "PRISON_RELEASE_FEE"
| "CURRENCY";
export interface GameRules {
switchValues: { [key in GameSwitchNames]?: boolean },
@ -80,27 +81,104 @@ export interface Config {
}
export enum NFCCardType {
ACCOUNT,
PROPERTY,
TASK,
INVALID = "INVALID",
ACCOUNT = "ACCOUNT",
PROPERTY = "PROPERTY",
TASK = "TASK",
}
export interface NFCCard {
cardType: NFCCardType,
uid: string,
raw: string
uid?: string,
raw?: string
}
export enum AccountSymbols {
HAT= "Hut",
CAT= "Katze",
SHOE= "Schuh",
SHIP= "Kriegsschiff",
RACE_CAR = "Rennauto",
THIMBLE= "Fingerhut",
WHEELBARROW= "Schubkarre",
DOG = "Hund",
IRON = "Bügeleisen",
BATTLESHIP = "Schlachtschiff",
TOP_HAT = "Zylinder",
CANNON = "Kanone",
TREX = "T-Rex",
RUBBER_DUCK = "Gummiente",
PENGUIN = "Pinguin",
PLAYTYPUS= "Schnabeltier"
}
export interface NFCAccountCard extends NFCCard {
symbol: string,
friendlyName: string,
symbol: AccountSymbols,
nickname: string,
pin: number
}
export interface NFCPropertyCard extends NFCCard {
export enum PropertyColor {
YELLOW= "YELLOW",
GOLD="GOLD",
SILVER="SILVER",
ORANGE = "ORANGE",
PINK = "PINK",
BEIGE="BEIGE",
BROWN = "BROWN",
RED ="RED",
GREEN="GREEN",
BLACK="BLACK",
WHITE="WHITE",
LIGHT_BLUE ="LIGHT_BLUE",
DARK_BLUE = "DARK_BLUE",
TRAINSTATION = "TRAINSTATION",
UTILITY = "UTILITY",
CUSTOM1 ="CUSTOM1",
CUSTOM2 = "CUSTOM2",
CUSTOM3 = "CUSTOM3"
}
export interface NFCTaskCard extends NFCCard {
export type NFCPropertyCardSpecialProperties =
"TRAINSTATION" | "UTILITY"
/**
* NFC Property Card
* NAME(str);COLOR(str);FULLSET(num);BUYVAL(num);MORTGAGEVAL(num);RENT,RENT1,RENT2,RENT3,RENT4,RENT_HOTEL,SPECIAl_PROPS
*/
export interface NFCPropertyCard extends NFCCard {
name: string,
color: PropertyColor,
fullSetAmount: number,
buyValue: number,
mortgageValue: number,
rent: number,
rent1?: number,
rent2?: number,
rent3?: number,
rent4?: number,
rentHotel?: number,
specialProperties: NFCPropertyCardSpecialProperties|"",
}
export enum TaskType {
GET_FROM_BANK= "GET_FROM_BANK", // 1 val
PAY_TO_BANK= "PAY_TO_BANK", // 1 val
PAY_TO_ALL_PLAYERS= "PAY_TO_ALL_PLAYERS", // 1 val
PAY_FOR_PROPS= "PAY_FOR_PROPS", // 2 val
ESCAPE_JAIL= "ESCAPE_JAIL" // 0 val
}
/**
* NFC Task Card
* RAW: TYPE;AMOUNT;AMOUNT2
*/
export interface NFCTaskCard extends NFCCard {
type: TaskType
amount?: number,
amount2?: number
}
}

View File

@ -1,8 +1,9 @@
import {IPCHandler} from "./IPCHandler";
import {IPCHandle} from "./IPCMainHandler";
import {FunctionTest, GameRules} from "./RawConstants";
import OSHandler from "./OSHandler";
import CloudHandler from "./CloudHandler";
import {ConfigHandler} from "./ConfigHandler";
import NFCHandler from "./NFCHandler";
const wifiScan = require("node-wifi-scanner");
@ -14,10 +15,11 @@ export default class SmartMonopoly {
static run() {
this.setupIPCEvents();
OSHandler.enableAllWifis().then().catch(console.error);
NFCHandler.initTest();
}
static setupIPCEvents() {
IPCHandler("FUNCTION_TEST", async (e, request, args) => {
IPCHandle("FUNCTION_TEST", async (e, request, args) => {
let data: FunctionTest = {
hasSudo: await OSHandler.checkForSudo(),
hasWPASupplicant: false,
@ -30,7 +32,7 @@ export default class SmartMonopoly {
}
});
IPCHandler("WIFI_CONNECT", async (e, request, args) => {
IPCHandle("WIFI_CONNECT", async (e, request, args) => {
let data = request.data as { ssid: string, psk: string }
try {
await OSHandler.addWifi(data.ssid, data.psk);
@ -41,7 +43,7 @@ export default class SmartMonopoly {
}
});
IPCHandler("WIFI_SCAN", async (e, request) => {
IPCHandle("WIFI_SCAN", async (e, request) => {
try {
let networks = await OSHandler.scanWifis();
return {status: true, data: networks};
@ -50,16 +52,16 @@ export default class SmartMonopoly {
}
});
IPCHandler("CLOUD_CONNECT", async (e, request) => {
IPCHandle("CLOUD_CONNECT", async (e, request) => {
try {
await CloudHandler.connect();
return {status: true}
return {status: true};
} catch (e) {
return {status: false, data: e};
return {status: false, data: e.toString()};
}
});
IPCHandler("SETTINGS", async(e, request) => {
IPCHandle("SETTINGS", async(e, request) => {
if(request.data && request.data["rules"])
{
let rules = request.data.rules as GameRules;
@ -69,7 +71,7 @@ export default class SmartMonopoly {
return {status: true, data: ConfigHandler.get()};
});
IPCHandler("PREPARING", async(e, request) => {
IPCHandle("PREPARING", async(e, request) => {
const useCloud = !!request.data.useCloud;
console.log("Preparing - useCloud: " + useCloud);
if(useCloud && !CloudHandler.isConnected())

1
src/global.ts Normal file
View File

@ -0,0 +1 @@
declare var mainWebContents: Electron.WebContents;

View File

@ -30,6 +30,8 @@ const createWindow = (): void => {
// Background
SmartMonopoly.run();
global.mainWebContents = mainWindow.webContents;
};
// This method will be called when Electron has finished

68
src/nfc-pcsd.d.ts vendored Normal file
View File

@ -0,0 +1,68 @@
declare module 'nfc-pcsc' {
export type ListenerSignature<L> = {
[E in keyof L]: (...args: any[]) => any;
};
export type DefaultListener = {
[k: string]: (...args: any[]) => any;
};
export class TypedEmitter<L extends ListenerSignature<L> = DefaultListener> {
static defaultMaxListeners: number;
addListener<U extends keyof L>(event: U, listener: L[U]): this;
prependListener<U extends keyof L>(event: U, listener: L[U]): this;
prependOnceListener<U extends keyof L>(event: U, listener: L[U]): this;
removeListener<U extends keyof L>(event: U, listener: L[U]): this;
removeAllListeners(event?: keyof L): this;
once<U extends keyof L>(event: U, listener: L[U]): this;
on<U extends keyof L>(event: U, listener: L[U]): this;
off<U extends keyof L>(event: U, listener: L[U]): this;
emit<U extends keyof L>(event: U, ...args: Parameters<L[U]>): boolean;
eventNames<U extends keyof L>(): U[];
listenerCount(type: keyof L): number;
listeners<U extends keyof L>(type: U): L[U][];
rawListeners<U extends keyof L>(type: U): L[U][];
getMaxListeners(): number;
setMaxListeners(n: number): this;
}
type Type = 'TAG_ISO_14443_3' | 'TAG_ISO_14443_4';
const KEY_TYPE_A = 0x60;
const KEY_TYPE_B = 0x61;
interface Card {
type: Type;
standard: Type;
uid?: string;
data?: Buffer;
}
interface ReaderEmitter {
card: (x: Card) => void;
'card.off': (x: Card) => void;
error: (x: Error) => void;
end: () => void;
}
export class Reader extends TypedEmitter<ReaderEmitter> {
get name(): string;
authenticate(blockNumber: number, keyType: number, key: string, obsolete?: boolean): Promise<boolean>;
read(
blockNumber: number,
length: number,
blockSize?: number,
packetSize?: number,
readClass?: number
): Promise<Buffer>;
}
interface NFCEmitter {
reader: (reader: Reader) => void;
error: (error: Error) => void;
}
export class NFC extends TypedEmitter<NFCEmitter> {}
}

View File

@ -9,8 +9,7 @@ contextBridge.exposeInMainWorld('api', {
request: (channel: IPCChannel, request: IPCRequest, ...args: any): Promise<IPCAnswer> => {
return ipcRenderer.invoke(channel, request, ...args);
},
receive: (channel: IPCChannel, func: (event: IpcRendererEvent, message: IPCAnswer, ...args: any) => void) => {
console.log("preload-receive called. args: ");
listen: (channel: IPCChannel, func: (event: IpcRendererEvent, message: IPCAnswer, ...args: any) => void) => {
ipcRenderer.on(channel, (event, message: IPCAnswer, ...args: any) => func(event, message, ...args));
},
})

View File

@ -6,6 +6,7 @@ import Game from "./Game";
import GameSetup from "./GameSetup";
import GameEnd from "./GameEnd";
import Setup from "./Setup";
import IPCRendererListener from "./IPCRendererListener";
const root = createRoot(document.getElementById("root"));
@ -32,9 +33,10 @@ export class App extends Component<{}, AppState> {
constructor(props: {}) {
super(props);
this.state = {
currentPage: PAGE.GAME_SETUP,
currentPage: PAGE.SETUP,
showWiFi: false,
}
IPCRendererListener.initialAttach();
}
toggleWiFiSettings = (state: boolean) => {

449
src/web/CardSetup.tsx Normal file
View File

@ -0,0 +1,449 @@
import {
AccountSymbols,
NFCAccountCard,
NFCCard,
NFCCardType,
NFCPropertyCard,
NFCTaskCard,
PropertyColor,
TaskType
} from "../RawConstants";
import React, {Component} from "react";
import {
Backdrop,
Box,
Button,
Fade,
FormControl,
FormControlLabel,
FormGroup,
FormLabel,
Grid,
InputLabel,
MenuItem,
Modal,
Radio,
RadioGroup,
Select,
TextField,
Typography
} from "@mui/material";
type AccountValues = keyof NFCAccountCard;
type PropertyValues = keyof NFCPropertyCard;
type TaskValues = keyof NFCTaskCard;
interface CardSetupState {
NFCCardType: NFCCardType,
accountValues: { [key in AccountValues]?: string | number },
propertyValues: { [key in PropertyValues]?: string | number | boolean },
taskValues: { [key in TaskValues]?: string | TaskType | number }
}
interface CardSetupProps {
closeCallback: () => void;
card?: NFCCard;
validCard: boolean
}
export default class CardSetup extends Component<CardSetupProps, CardSetupState> {
constructor(props: CardSetupProps) {
super(props);
let defaultType = NFCCardType.ACCOUNT;
let accountValues: { [key in AccountValues]?: string | number } = {
symbol: "pleaseSelect"
};
let propertyValues: { [key in PropertyValues]?: string | number | boolean } = {
color: "pleaseSelect"
};
let taskValues: { [key in TaskValues]?: string | TaskType | number } = {
type: "pleaseSelect"
};
if (props.card) {
defaultType = props.card.cardType as NFCCardType;
console.log("Detected card type: " + defaultType);
switch (defaultType) {
case NFCCardType.ACCOUNT:
let accountCard = props.card as NFCAccountCard;
accountValues = {
...accountCard
}
break;
case NFCCardType.PROPERTY:
let propertyCard = props.card as NFCPropertyCard;
propertyValues = {
...propertyCard
}
break;
case NFCCardType.TASK:
let taskCard = props.card as NFCTaskCard;
taskValues = {
...taskCard
}
break;
}
}
this.state = {
NFCCardType: defaultType,
accountValues: accountValues,
propertyValues: propertyValues,
taskValues: taskValues,
}
}
componentDidMount() {
}
componentWillUnmount() {
}
modalStyle = {
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: 700,
maxHeight: '85%',
overflowY: 'scroll',
height: 'auto',
display: 'block',
bgcolor: 'background.paper',
border: '2px solid #0000',
boxShadow: 24,
p: 4,
};
changeAccountState(prop: AccountValues, ev: any, useUpperCase = false) {
this.setState(prevState => ({
...prevState,
accountValues: {
...prevState.accountValues,
[prop]: useUpperCase ? ev.target.value.toUpperCase() : ev.target.value
}
}))
}
changePropertyState(prop: PropertyValues, ev: any) {
if (prop == "fullSetAmount") {
if (ev.target.value > 4)
ev.target.value = 4;
if (ev.target.value < 1)
ev.target.value = 1;
}
if (prop == "buyValue" || prop == "mortgageValue" || prop.includes("rent")) {
if (ev.target.value < 0)
ev.target.value = 0;
}
this.setState(prevState => ({
...prevState,
propertyValues: {
...prevState.propertyValues,
[prop]: ev.target.value
}
}))
}
changeTaskState(prop: TaskValues, ev: any) {
this.setState(prevState => ({
...prevState,
taskValues: {
...prevState.taskValues,
[prop]: ev.target.value
}
}))
}
insertInputsPerType = () => {
if (this.state.NFCCardType == NFCCardType.ACCOUNT) {
return (<FormGroup sx={{m: 1}}>
<InputLabel id="symbolLabel">Symbol</InputLabel>
<Select
labelId={"symbolLabel"}
sx={{mb: 1}}
onChange={(ev) => this.changeAccountState("symbol", ev)}
label="Symbol "
value={this.state.accountValues["symbol"]}
fullWidth
>
<MenuItem disabled={true} value="pleaseSelect">Bitte wählen...</MenuItem>
{Object.entries(AccountSymbols).map((ele) => (
<MenuItem key={ele[0]} value={ele[0]}>{ele[1]}</MenuItem>
))}
</Select>
<TextField sx={{mb: 1}}
label="Nickname"
type="text"
value={this.state.accountValues["nickname"]}
onChange={(ev) => this.changeAccountState("nickname", ev)}
/>
<TextField sx={{mb: 1}}
label="PIN"
type="number"
value={this.state.accountValues["pin"]}
onChange={(ev) => this.changeAccountState("pin", ev)}
/>
</FormGroup>)
}
if (this.state.NFCCardType == NFCCardType.PROPERTY) {
return (<FormGroup sx={{m: 1}}>
<Grid container spacing={2} sx={{width: '100%'}}>
<Grid item xs={12} sm={12}>
<InputLabel>Name</InputLabel>
<TextField
sx={{mb: 1}}
type="text"
value={this.state.propertyValues["name"]}
onChange={(ev) => this.changePropertyState("name", ev)}
fullWidth
/>
</Grid>
<Grid item xs={12} sm={6}>
<InputLabel id="colorLabel">Farbcode / Typ</InputLabel>
<Select
labelId={"colorLabel"}
sx={{mb: 1}}
onChange={(ev) => this.changePropertyState("color", ev)}
label="Farbcode / Typ "
value={this.state.propertyValues["color"]}
fullWidth
>
<MenuItem disabled={true} value="pleaseSelect">Bitte wählen...</MenuItem>
{Object.keys(PropertyColor).map((color: string) => (
<MenuItem key={color} value={color}>{color}</MenuItem>
))}
</Select>
</Grid>
<Grid item xs={12} sm={6}>
<InputLabel>Voller Satz Anzahl</InputLabel>
<TextField
sx={{mb: 1}}
type="number"
value={this.state.propertyValues["fullSetAmount"]}
onChange={(ev) => this.changePropertyState("fullSetAmount", ev)}
fullWidth
aria-valuemin={0}
aria-valuemax={4}
/>
</Grid>
<Grid item xs={12} sm={6}>
<InputLabel>Kauf-Wert</InputLabel>
<TextField
sx={{mb: 1}}
inputProps={{"step": 5}}
type="number"
value={this.state.propertyValues["buyValue"]}
onChange={(ev) => this.changePropertyState("buyValue", ev)}
fullWidth
/>
</Grid>
<Grid item xs={12} sm={6}>
<InputLabel>Hypothek-Wert</InputLabel>
<TextField
sx={{mb: 1}}
inputProps={{"step": 5}}
type="number"
value={this.state.propertyValues["mortgageValue"]}
onChange={(ev) => this.changePropertyState("mortgageValue", ev)}
fullWidth
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Grundmiete"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rent"]}
onChange={(ev) => this.changePropertyState("rent", ev)}
helperText={"Grundmiete ohne Haus und Set"}
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Miete 1"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rent1"]}
onChange={(ev) => this.changePropertyState("rent1", ev)}
helperText={"Miete bei einem Haus"}
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Miete 2"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rent2"]}
onChange={(ev) => this.changePropertyState("rent2", ev)}
helperText={"Miete bei 2 Häusern"}
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Miete 3"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rent3"]}
onChange={(ev) => this.changePropertyState("rent3", ev)}
helperText={"Miete bei 3 Häusern"}
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Miete 4"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rent4"]}
onChange={(ev) => this.changePropertyState("rent4", ev)}
helperText={"Miete bei 4 Häusern"}
/>
</Grid>
<Grid item xs={4} sm={4}>
<TextField
type="number"
label={"Miete Hotel"}
inputProps={{"step": 5}}
value={this.state.propertyValues["rentHotel"]}
onChange={(ev) => this.changePropertyState("rentHotel", ev)}
helperText={"Miete bei einem Hotel"}
/>
</Grid>
<Grid item xs={12} sm={12}>
<FormControl fullWidth>
<FormLabel id="cardProperties">Besondere Eigenschaften</FormLabel>
<RadioGroup
row
aria-labelledby="cardProperties"
defaultValue={""}
value={this.state.propertyValues["specialProperties"]}
onChange={(ev) => this.changePropertyState("specialProperties", ev)}
>
<FormControlLabel value={""} control={<Radio/>} label="Keine"/>
<FormControlLabel value="TRAINSTATION" control={<Radio/>} label="Bahnhof"/>
<FormControlLabel value="UTILITY" control={<Radio/>} label="Versorgungswerk"/>
<FormControlLabel value="JAIL" control={<Radio/>} label="Gefängnis"/>
</RadioGroup>
</FormControl>
</Grid>
</Grid>
</FormGroup>)
}
if (this.state.NFCCardType == NFCCardType.TASK) {
/**
* type: TaskType
* amount?: number,
* amount2?: number
*/
return (<FormGroup sx={{m: 1}}>
<InputLabel id="typeLabel">Typ</InputLabel>
<Select
labelId={"typeLabel"}
sx={{mb: 1}}
onChange={(ev) => this.changeTaskState("type", ev)}
label="Typ "
value={this.state.taskValues["type"]}
fullWidth
>
<MenuItem disabled={true} value="pleaseSelect">Bitte wählen...</MenuItem>
{Object.keys(TaskType).map((tt: string) => (
<MenuItem key={tt} value={tt}>{tt}</MenuItem>
))}
</Select>
<TextField sx={{mb: 1}}
label="Betrag 1"
type="text"
disabled={this.state.taskValues["type"] == "ESCAPE_JAIL"}
value={this.state.taskValues["amount"]}
onChange={(ev) => this.changeAccountState("nickname", ev)}
helperText={this.state.taskValues["type"] == "PAY_FOR_PROPS" ? "Preis pro Haus" : "Geldbetrag"}
/>
<TextField sx={{mb: 1}}
label="Betrag 2"
type="number"
disabled={this.state.taskValues["type"] != "PAY_FOR_PROPS"}
value={this.state.taskValues["amount2"]}
onChange={(ev) => this.changeAccountState("pin", ev)}
helperText={"gfs. Preis pro Hotel"}
/>
</FormGroup>)
}
return (<div>Bitte einen Typ selektieren um fortzufahren.<br/> </div>)
}
render() {
return (<Modal
aria-labelledby="transition-modal-title"
aria-describedby="transition-modal-description"
open={true}
onClose={() => {
this.props.closeCallback()
}}
closeAfterTransition
slots={{backdrop: Backdrop}}
slotProps={{
backdrop: {
timeout: 500,
},
}}
>
<Fade in={true}>
<Box sx={this.modalStyle}>
<Typography id="transition-modal-title" variant="h6" component="h2">
NFC-Karte konfigurieren
</Typography>
<Typography id="transition-modal-description" sx={{mt: 2}}>
{this.props.validCard ? "Es wurde eine gültige Spielkarte erkannt." : "Es wurde eine ungültige NFC-Karte erkannt."}
<br/><br/>
<div>
<InputLabel id="nfcCardTypeLabel">Karten-Typ</InputLabel>
<Select
labelId="nfcCardTypeLabel"
value={this.state.NFCCardType.toString()}
onChange={(ev) =>
this.setState(prevState => ({
...prevState,
NFCCardType: ev.target.value as NFCCardType
}))
}
>
{Object.values(NFCCardType).map(e => {
return (
<MenuItem key={e} value={(e)}>{(e == NFCCardType.INVALID ? "Bitte wählen" : e)}</MenuItem>
)
})}
</Select>
</div>
{this.insertInputsPerType()}
<br/>
<Button variant="contained" onClick={() => {
this.props.closeCallback();
}}
color="secondary">Schließen</Button>
<Button variant="contained" color="primary" sx={{ml: 1}}
onClick={() => {
}}>Karte beschreiben</Button>
</Typography>
</Box>
</Fade>
</Modal>);
}
}

View File

@ -1,6 +1,6 @@
import {PAGE} from "./App";
import {IPCListenChannels, NFCCard} from "../RawConstants";
import IPCListener from "./IPCListener";
import IPCRendererListener from "./IPCRendererListener";
export enum GAME_STATE {
NOT_STARTED,
@ -31,8 +31,8 @@ export default class GameHandler {
static attachNFCHandler(cb: (card: NFCCard) => void)
{
IPCListener.detach(this.attachedNFCHandler);
this.attachedNFCHandler = IPCListener.attach(IPCListenChannels.NFC_CARD, (ipcMsg) => {
IPCRendererListener.detach(this.attachedNFCHandler);
this.attachedNFCHandler = IPCRendererListener.attach(IPCListenChannels.NFC_CARD, (ipcMsg) => {
if(ipcMsg.status)
cb(ipcMsg.data as NFCCard);
});
@ -40,7 +40,7 @@ export default class GameHandler {
static detachNFCHandler()
{
IPCListener.detach(this.attachedNFCHandler);
IPCRendererListener.detach(this.attachedNFCHandler);
}
static async requestPreparing(useCloud: boolean)

View File

@ -1,20 +1,24 @@
import {Component} from "react";
import React, {Component} from "react";
import {
Button, Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
Grid,
Grid, ListItemAvatar,
Snackbar,
Typography
Typography,
Avatar, ListItemText, ListItem, List, Chip
} from "@mui/material";
import NfcIcon from '@mui/icons-material/Nfc';
import AddCardIcon from '@mui/icons-material/AddCard';
import PersonAddIcon from '@mui/icons-material/PersonAdd';
import PersonRemoveIcon from '@mui/icons-material/PersonRemove';
import GameHandler from "./GameHandler";
import {NFCCard} from "../RawConstants";
import {Person as PersonIcon, QrCode, RemoveDone} from "@mui/icons-material";
import CloudIcon from "@mui/icons-material/Cloud";
interface GameState {
snackMsg: string,
@ -53,7 +57,7 @@ export default class GameSetup extends Component<{}, GameState> {
return <div className="gameSetup">
<Snackbar
open={!!this.state.snackMsg}
autoHideDuration={8000}
autoHideDuration={10000}
onClose={() => {
this.setState(prevState => ({
...prevState,
@ -74,7 +78,7 @@ export default class GameSetup extends Component<{}, GameState> {
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">
Karte anhalten, um Spieler hinzuzufügen! <AddCardIcon/>
Spielerkarte auf Gerät legen! <AddCardIcon/>
</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
@ -92,10 +96,60 @@ export default class GameSetup extends Component<{}, GameState> {
</DialogActions>
</Dialog>
<Chip sx={{position: "absolute", top: "1%", right: "1%"}} onClick={() => {this.setState(prevState => ({
...prevState,
helpDialog: true
}))}}
label="?" color="info"
variant="outlined"/>
<Typography variant="h2" sx={{mb: 2}}>Wer spielt mit?</Typography>
<Grid container spacing={3}>
<Typography variant="h2" >Wer spielt mit?</Typography>
<Chip onClick={() => {this.setState(prevState => ({
...prevState,
snackMsg: "Um einen Spieler hinzuzufügen, lege eine NFC-Karte auf den leser!"
}))}}
label={<div><NfcIcon sx={{marginTop: 0.9}} className={"animationBreathe"}
color="primary"/> NFC</div>} color="secondary"
variant="outlined"/>
<Grid sx={{mt: 2}} container spacing={1}>
<Grid item xs={2}></Grid>
<Grid justifyContent="center" alignItems="center" item xs={"auto"}>
<List sx={{ width: '100%', minWidth: '60%', bgcolor: 'background.paper', border: "1px solid black", borderRadius: "5px" }}>
<ListItem>
<ListItemAvatar>
<Avatar>
<PersonIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary="Hut" secondary="Connect+ QR-Code anzeigen" onClick={() => {console.log("connect?")}}/>
<Button sx={{ml: 4}} variant="outlined" color="info">Umbenennen</Button>
<Button sx={{ml: 1}} variant="outlined" color="error">Rauswerfen</Button>
<Button disabled sx={{ml: 1}} variant="outlined" color="primary"><QrCode/></Button>
</ListItem>
<ListItem>
<ListItemAvatar>
<Avatar>
<PersonIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary="Schubkarre" secondary="Connect+ QR-Code anzeigen" onClick={() => {}}/>
<Button sx={{ml: 4}} variant="outlined" color="info">Umbenennen</Button>
<Button sx={{ml: 1}} variant="outlined" color="error">Rauswerfen</Button>
<Button disabled sx={{ml: 1}} variant="outlined" color="primary"><QrCode/></Button>
</ListItem>
<ListItem>
<ListItemAvatar>
<Avatar>
<CloudIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary="Schuh" secondary="Connect+ verbunden" onClick={() => {}}/>
<Button sx={{ml: 4}} variant="outlined" color="info">Umbenennen</Button>
<Button sx={{ml: 1}} variant="outlined" color="error">Rauswerfen</Button>
<Button disabled sx={{ml: 1}} variant="outlined" color="primary"><QrCode/></Button>
</ListItem>
</List>
</Grid>
</Grid>
</div>
}

View File

@ -5,7 +5,7 @@ type IPCListen = {
fn: (message: IPCAnswer, ...args: any) => void,
}
export default class IPCListener {
export default class IPCRendererListener {
private static attachments: Map<number, IPCListen> = new Map<number, IPCListen>();
private static uID = 99;

4
src/web/Player.ts Normal file
View File

@ -0,0 +1,4 @@
export default class Player {
private nickname: string;
private figure: string;
}

View File

@ -1,11 +1,13 @@
import React, {Component} from "react";
import {
Button,
Chip,
FormControl,
FormControlLabel,
FormGroup,
FormLabel,
Grid, Snackbar,
Grid,
Snackbar,
Switch,
TextField,
Typography
@ -14,18 +16,39 @@ import RestartAltIcon from '@mui/icons-material/RestartAlt';
import CloseIcon from '@mui/icons-material/Close';
import SaveIcon from '@mui/icons-material/Save';
import {PAGE} from "./App";
import {GameInput, GameSwitch, GameRules, GameSwitchNames, GameInputNames, Config} from "../RawConstants";
import {
Config,
GameInput,
GameRules,
GameSwitch,
GameSwitchNames,
IPCListenChannels,
NFCCard,
NFCCardType,
NFCPropertyCard,
PropertyColor
} from "../RawConstants";
import NfcIcon from "@mui/icons-material/Nfc";
import IPCRendererListener from "./IPCRendererListener";
import CardSetup from "./CardSetup";
interface InitialSetupState {
open: boolean,
switchValues: GameSwitch[],
inputValues: GameInput[],
savedMsg: boolean
savedMsg: boolean,
openNFCModal: boolean,
nfcCard: NFCCard,
validCard: boolean
}
const defaultConf: InitialSetupState = {
open: true,
savedMsg: false,
openNFCModal: false,
nfcCard: null,
validCard: false,
switchValues: [
{
name: "GET_BONUS_PASSING_START",
@ -110,6 +133,12 @@ const defaultConf: InitialSetupState = {
type: "number",
label: "Gefängnis Gebühren",
value: "50"
},
{
name: "CURRENCY",
type: "text",
label: "Währung",
value: "€"
}
]
}
@ -118,9 +147,23 @@ const defaultConf: InitialSetupState = {
export default class Setup extends Component<{}, InitialSetupState> {
constructor(props: {}) {
super(props);
let x: NFCPropertyCard = {
cardType: NFCCardType.PROPERTY,
"name": "Test",
mortgageValue: 2,
rent: 100,
buyValue: 200,
specialProperties: "",
color: PropertyColor.BEIGE,
fullSetAmount: 2,
}
this.state = {
...defaultConf,
}
}
reset = () => {
@ -212,8 +255,7 @@ export default class Setup extends Component<{}, InitialSetupState> {
}));
}
resolve();
} catch(e)
{
} catch (e) {
reject(e);
}
})
@ -230,7 +272,7 @@ export default class Setup extends Component<{}, InitialSetupState> {
for (let ele of this.state.switchValues) {
gameSettings.switchValues[ele.name] = ele.value;
if(!!ele.depends && ele.value)
if (!!ele.depends && ele.value)
gameSettings.switchValues[ele.name] = this.checkDependsValue(ele.depends);
}
@ -247,12 +289,30 @@ export default class Setup extends Component<{}, InitialSetupState> {
}));
}
onNFCRawEvent = (card: NFCCard|null, isComplete: boolean) => {
this.setState(prevState => ({
...prevState,
openNFCModal: true,
nfcCard: card,
validCard: isComplete
}));
console.log(card);
}
private rawNFCListener: number = 0;
componentDidMount() {
this.rawNFCListener = IPCRendererListener.attach(IPCListenChannels.NFC_RAW, (message) => {
this.onNFCRawEvent(message.data, message.status);
console.log("Got an raw nfc event")
})
this.getSettings().then();
}
componentWillUnmount() {
IPCRendererListener.detach(this.rawNFCListener);
}
handleClose = () => {
@ -279,6 +339,13 @@ export default class Setup extends Component<{}, InitialSetupState> {
}}
message={"Einstellungen gespeichert!"}
/>
{this.state.openNFCModal &&
<CardSetup card={this.state.nfcCard} validCard={this.state.validCard} closeCallback={() => this.setState(prevState => ({
...prevState,
openNFCModal: false
}))}/>}
<Typography variant="h2" sx={{mb: 2}}>Einstellungen</Typography>
<Grid container spacing={3}>
<Grid item xs={6}>
@ -287,7 +354,7 @@ export default class Setup extends Component<{}, InitialSetupState> {
<FormGroup>
{Object.values(this.state.switchValues).map(value => {
return (
<FormControlLabel sx={{mb: 1}}
<FormControlLabel key={value.name} sx={{mb: 1}}
control={
<Switch
checked={(value.value && !value.depends) || (value.value && !!value.depends && this.checkDependsValue(value.depends))}
@ -306,7 +373,7 @@ export default class Setup extends Component<{}, InitialSetupState> {
<FormGroup>
{Object.values(this.state.inputValues).map(value => {
return (
<FormControlLabel sx={{mb: 2}}
<FormControlLabel key={value.name} sx={{mb: 2}}
control={
<TextField type={value.type} variant="standard"
value={value.value}
@ -318,6 +385,15 @@ export default class Setup extends Component<{}, InitialSetupState> {
})}
</FormGroup>
</FormControl>
<FormControl sx={{mt: 5, mb: 1}} component="fieldset" variant="standard">
<FormLabel component="legend">Spielkarten</FormLabel>
<Typography sx={{ml: -2}} width={"95%"} variant="body1"><Chip
label={<div><NfcIcon sx={{marginTop: 0.9}} className={"animationBreathe"}
color="primary"/> NFC</div>} color="secondary"
variant="outlined"/><br/>Bitte die Karte an das Lesegerät halten, um sie zu
konfigurieren.<br/>Anschließend können die Einstellungen der Karte im Dialog angepasst
werden.</Typography>
</FormControl>
</Grid>
<Grid item xs={3.5}></Grid>
<Grid item xs={"auto"} alignItems="center">
@ -327,7 +403,8 @@ export default class Setup extends Component<{}, InitialSetupState> {
<Button sx={{ml: 2}} variant="outlined" color="error"
onClick={() => this.reset()}>Zurücksetzen <RestartAltIcon/></Button>
<Button sx={{ml: 2}} variant="contained" color="success" onClick={() => {
this.saveSettings(); window.app.setPage(PAGE.STARTUP);
this.saveSettings();
window.app.setPage(PAGE.STARTUP);
}}>Speichern <SaveIcon/></Button>
</Grid>
</Grid>

View File

@ -74,13 +74,17 @@ export default class Startup extends Component<StartupProps, StartupState> {
let response = await window.api.request("CLOUD_CONNECT", {});
this.setState((prevState) => ({
...prevState,
snackErrorMsg: response.data.toString(),
snackErrorMsg: "Fehler:" + response.data.toString(),
isCloudConnected: response.status,
isConnectionIssue: !response.status,
}));
console.log(response)
return response.status;
} catch (e) {
this.setState((prevState) => ({
...prevState,
snackErrorMsg: "Ein unerwarteter Fehler ist aufgetreten.",
}));
return false;
}
}
@ -163,6 +167,7 @@ export default class Startup extends Component<StartupProps, StartupState> {
if (connected)
this.counterInterval = setInterval(() => {
if (!this.props.visible) return;
if (this.state.startCounter == 0) {
clearInterval(this.counterInterval);
this.startupBtnClick();

View File

@ -9,4 +9,36 @@
.hidden {
display: none;
}
.animationBreathe {
animation: breathing 2.5s ease-out infinite normal;
-webkit-font-smoothing: antialiased;
}
@keyframes breathing {
0% {
-webkit-transform: scale(0.9);
-ms-transform: scale(0.9);
transform: scale(0.9);
}
25% {
-webkit-transform: scale(1.2);
-ms-transform: scale(1.2);
transform: scale(1.2);
}
80% {
-webkit-transform: scale(0.9);
-ms-transform: scale(0.9);
transform: scale(0.9);
}
100% {
-webkit-transform: scale(0.9);
-ms-transform: scale(0.9);
transform: scale(0.9);
}
}

477
yarn.lock
View File

@ -320,7 +320,7 @@
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/fuses@^1.7.0", "@electron/fuses@>=1.0.0":
"@electron/fuses@^1.7.0":
version "1.8.0"
resolved "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz"
integrity sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==
@ -495,7 +495,7 @@
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.11.4", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0":
"@emotion/react@^11.11.4":
version "11.11.4"
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz"
integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==
@ -525,7 +525,7 @@
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
"@emotion/styled@^11.11.0", "@emotion/styled@^11.3.0":
"@emotion/styled@^11.11.0":
version "11.11.0"
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz"
integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
@ -677,14 +677,6 @@
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@jridgewell/trace-mapping@0.3.9":
version "0.3.9"
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
@ -693,12 +685,20 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4"
resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz"
integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
"@malept/cross-spawn-promise@^1.1.0":
"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0":
version "1.1.1"
resolved "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz"
integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==
@ -737,7 +737,7 @@
dependencies:
"@babel/runtime" "^7.23.9"
"@mui/material@^5.0.0", "@mui/material@^5.15.14":
"@mui/material@^5.15.14":
version "5.15.14"
resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz"
integrity sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==
@ -811,7 +811,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -840,6 +840,14 @@
mkdirp "^1.0.4"
rimraf "^3.0.2"
"@pokusew/pcsclite@^0.6.0":
version "0.6.0"
resolved "https://registry.yarnpkg.com/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz#30ae3fbf9d1137f2a1b343c32cd8569be581ba2d"
integrity sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==
dependencies:
bindings "^1.5.0"
nan "^2.14.0"
"@popperjs/core@^2.11.8":
version "2.11.8"
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
@ -963,6 +971,21 @@
"@types/qs" "*"
"@types/serve-static" "*"
"@types/fs-extra@^9.0.1":
version "9.0.13"
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
dependencies:
"@types/node" "*"
"@types/glob@^7.1.1":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
dependencies:
"@types/minimatch" "*"
"@types/node" "*"
"@types/html-minifier-terser@^6.0.0":
version "6.1.0"
resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz"
@ -1012,6 +1035,11 @@
resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz"
integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
"@types/minimatch@*":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/node-forge@^1.3.0":
version "1.3.11"
resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz"
@ -1060,7 +1088,7 @@
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18.2.71":
"@types/react@*", "@types/react@^18.2.71":
version "18.2.71"
resolved "https://registry.npmjs.org/@types/react/-/react-18.2.71.tgz"
integrity sha512-PxEsB9OjmQeYGffoWnYAd/r5FiJuUw2niFQHPc2v2idwh8wGPkkYzOHuinNJJY6NZqfoTCiOIizDOz38gYNsyw==
@ -1239,7 +1267,7 @@
dependencies:
resolve "^1.10.0"
"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1":
"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1":
version "1.12.1"
resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz"
integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==
@ -1340,7 +1368,7 @@
"@webassemblyjs/wasm-gen" "1.12.1"
"@webassemblyjs/wasm-parser" "1.12.1"
"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1":
"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1":
version "1.12.1"
resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz"
integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==
@ -1403,12 +1431,12 @@ acorn-walk@^8.1.1:
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz"
integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0:
acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0:
version "8.11.3"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
agent-base@^6.0.2, agent-base@6:
agent-base@6, agent-base@^6.0.2:
version "6.0.2"
resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
@ -1449,7 +1477,7 @@ ajv-keywords@^5.1.0:
dependencies:
fast-deep-equal "^3.1.3"
ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@ -1459,7 +1487,7 @@ ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0:
ajv@^8.0.0, ajv@^8.9.0:
version "8.12.0"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
@ -1607,6 +1635,18 @@ arraybuffer.prototype.slice@^1.0.3:
is-array-buffer "^3.0.4"
is-shared-array-buffer "^1.0.2"
asar@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221"
integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==
dependencies:
chromium-pickle-js "^0.2.0"
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
optionalDependencies:
"@types/glob" "^7.1.1"
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
@ -1668,6 +1708,13 @@ binary-extensions@^2.0.0:
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
dependencies:
file-uri-to-path "1.0.0"
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"
@ -1740,7 +1787,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
browserslist@^4.21.10, "browserslist@>= 4.21.0":
browserslist@^4.21.10:
version "4.23.0"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz"
integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
@ -1898,6 +1945,11 @@ chrome-trace-event@^1.0.2, chrome-trace-event@^1.0.3:
resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz"
integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
chromium-pickle-js@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==
clean-css@^5.2.2:
version "5.3.3"
resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz"
@ -1930,6 +1982,15 @@ cli-truncate@^2.1.0:
slice-ansi "^3.0.0"
string-width "^4.2.0"
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
@ -1979,16 +2040,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz"
@ -2126,18 +2187,7 @@ cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0:
is-wsl "^2.2.0"
which "^2.0.2"
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
semver "^5.5.0"
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^6.0.5:
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@ -2202,7 +2252,7 @@ csstype@^3.0.2, csstype@^3.1.3:
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
d@^1.0.1, d@^1.0.2, d@1:
d@1, d@^1.0.1, d@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz"
integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
@ -2237,13 +2287,20 @@ data-view-byte-offset@^1.0.0:
es-errors "^1.3.0"
is-data-view "^1.0.1"
debug@^2.2.0:
debug@2.6.9, debug@^2.2.0:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@ -2251,20 +2308,6 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz"
@ -2329,16 +2372,16 @@ delegates@^1.0.0:
resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
depd@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
destroy@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
@ -2453,6 +2496,50 @@ ee-first@1.1.1:
resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
electron-installer-common@^0.10.2:
version "0.10.3"
resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444"
integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==
dependencies:
"@malept/cross-spawn-promise" "^1.0.0"
asar "^3.0.0"
debug "^4.1.1"
fs-extra "^9.0.0"
glob "^7.1.4"
lodash "^4.17.15"
parse-author "^2.0.0"
semver "^7.1.1"
tmp-promise "^3.0.2"
optionalDependencies:
"@types/fs-extra" "^9.0.1"
electron-installer-debian@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz#2a9c8220f50a57807de8f93619a0d61ec41271e0"
integrity sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==
dependencies:
"@malept/cross-spawn-promise" "^1.0.0"
debug "^4.1.1"
electron-installer-common "^0.10.2"
fs-extra "^9.0.0"
get-folder-size "^2.0.1"
lodash "^4.17.4"
word-wrap "^1.2.3"
yargs "^16.0.2"
electron-installer-redhat@^3.2.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192"
integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==
dependencies:
"@malept/cross-spawn-promise" "^1.0.0"
debug "^4.1.1"
electron-installer-common "^0.10.2"
fs-extra "^9.0.0"
lodash "^4.17.15"
word-wrap "^1.2.3"
yargs "^16.0.2"
electron-squirrel-startup@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz"
@ -2502,7 +2589,7 @@ encodeurl@~1.0.2:
resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
encoding@^0.1.0, encoding@^0.1.13:
encoding@^0.1.13:
version "0.1.13"
resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz"
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
@ -2738,7 +2825,7 @@ eslint-plugin-import@^2.25.0:
semver "^6.3.1"
tsconfig-paths "^3.15.0"
eslint-scope@^5.1.1, eslint-scope@5.1.1:
eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@ -2759,7 +2846,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.0.1:
eslint@^8.0.1:
version "8.57.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz"
integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
@ -2921,7 +3008,7 @@ express-ws@^5.0.2:
dependencies:
ws "^7.4.6"
"express@^4.0.0 || ^5.0.0-alpha.1", express@^4.17.1, express@^4.17.3:
express@^4.17.1, express@^4.17.3:
version "4.19.2"
resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz"
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
@ -3030,6 +3117,11 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
filename-reserved-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz"
@ -3168,16 +3260,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^11.1.0:
version "11.2.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz"
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^11.1.1:
fs-extra@^11.1.0, fs-extra@^11.1.1:
version "11.2.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz"
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
@ -3204,7 +3287,7 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^9.0.1:
fs-extra@^9.0.0, fs-extra@^9.0.1:
version "9.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@ -3231,6 +3314,11 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@ -3260,6 +3348,11 @@ galactus@^1.0.0:
flora-colossus "^2.0.0"
fs-extra "^10.1.0"
gar@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8"
integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==
gauge@^4.0.3:
version "4.0.4"
resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz"
@ -3279,6 +3372,14 @@ get-caller-file@^2.0.5:
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-folder-size@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497"
integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==
dependencies:
gar "^1.0.4"
tiny-each-async "2.0.3"
get-installed-path@^2.0.3:
version "2.1.1"
resolved "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz"
@ -3389,7 +3490,7 @@ global-agent@^3.0.0:
semver "^7.3.2"
serialize-error "^7.0.1"
global-modules@^1.0.0, global-modules@1.0.0:
global-modules@1.0.0, global-modules@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz"
integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
@ -3608,16 +3709,6 @@ http-deceiver@^1.2.7:
resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
http-errors@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
@ -3629,6 +3720,16 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
http-parser-js@>=0.5.1:
version "0.5.8"
resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz"
@ -3691,13 +3792,6 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
iconv-lite@^0.6.2:
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"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
@ -3705,6 +3799,13 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.2:
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"
icss-utils@^5.0.0, icss-utils@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz"
@ -3751,7 +3852,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4:
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -3788,16 +3889,16 @@ ip-address@^9.0.5:
jsbn "1.1.0"
sprintf-js "^1.1.3"
ipaddr.js@^2.0.1:
version "2.1.0"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz"
integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
ipaddr.js@^2.0.1:
version "2.1.0"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz"
integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==
is-array-buffer@^3.0.4:
version "3.0.4"
resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz"
@ -4237,7 +4338,7 @@ lodash.templatesettings@^4.0.0:
dependencies:
lodash._reinterpolate "^3.0.0"
lodash@^4.17.20, lodash@^4.17.21, lodash@4.17.21:
lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -4381,7 +4482,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
"mime-db@>= 1.43.0 < 2", mime-db@1.52.0:
mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
@ -4515,11 +4616,6 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
ms@^2.0.0, ms@^2.1.1, ms@2.1.3:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
@ -4530,6 +4626,11 @@ ms@2.1.2:
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
multicast-dns@^7.2.5:
version "7.2.5"
resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz"
@ -4538,6 +4639,11 @@ multicast-dns@^7.2.5:
dns-packet "^5.2.2"
thunky "^1.0.2"
nan@^2.14.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
@ -4553,7 +4659,7 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
negotiator@^0.6.3, negotiator@0.6.3:
negotiator@0.6.3, negotiator@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
@ -4568,6 +4674,13 @@ next-tick@^1.1.0:
resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
nfc-pcsc@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/nfc-pcsc/-/nfc-pcsc-0.8.1.tgz#76882be17842cb832a72b76345e665c8108ff049"
integrity sha512-wEfacG0dwPVZOG/WY28Mk3P4Q+yz6q7LnjpnZvdFddx3iXavEXiGhftRZXBtudr0NrzH1MrGWSkWq77tef7BMA==
dependencies:
"@pokusew/pcsclite" "^0.6.0"
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
@ -4995,12 +5108,7 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
path-key@^3.0.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-key@^3.1.0:
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@ -5109,7 +5217,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.1.0, postcss@^8.4.33:
postcss@^8.4.33:
version "8.4.38"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
@ -5237,7 +5345,7 @@ rcedit@^4.0.0:
dependencies:
cross-spawn-windows-exe "^1.1.0"
"react-dom@^17.0.0 || ^18.0.0", react-dom@^18.2.0, react-dom@>=16.6.0, react-dom@>=16.8.0:
react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
@ -5245,12 +5353,7 @@ rcedit@^4.0.0:
loose-envify "^1.1.0"
scheduler "^0.23.0"
react-is@^16.13.1:
version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^16.7.0:
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@ -5270,7 +5373,7 @@ react-transition-group@^4.4.5:
loose-envify "^1.4.0"
prop-types "^15.6.2"
"react@^17.0.0 || ^18.0.0", react@^18.2.0, react@>=16.6.0, react@>=16.8.0:
react@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
@ -5502,21 +5605,16 @@ safe-array-concat@^1.1.2:
has-symbols "^1.0.3"
isarray "^2.0.5"
safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-regex-test@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz"
@ -5575,33 +5673,23 @@ semver-compare@^1.0.0:
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
semver@^5.5.0:
"semver@2 || 3 || 4 || 5", semver@^5.5.0:
version "5.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.2.0:
semver@^6.2.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4:
semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4:
version "7.6.0"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
dependencies:
lru-cache "^6.0.0"
"semver@2 || 3 || 4 || 5":
version "5.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
send@0.18.0:
version "0.18.0"
resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz"
@ -5889,29 +5977,15 @@ ssri@^9.0.0:
dependencies:
minipass "^3.1.1"
"statuses@>= 1.4.0 < 2":
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
"statuses@>= 1.4.0 < 2":
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
@ -5950,6 +6024,20 @@ string.prototype.trimstart@^1.0.7:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
@ -6093,6 +6181,23 @@ thunky@^1.0.2:
resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
tiny-each-async@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1"
integrity sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==
tmp-promise@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
dependencies:
tmp "^0.2.0"
tmp@^0.2.0:
version "0.2.3"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
@ -6265,7 +6370,7 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
typescript@*, typescript@>=2.7, "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", typescript@>3.6.0, typescript@~4.5.4:
typescript@~4.5.4:
version "4.5.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz"
integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
@ -6309,7 +6414,7 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
unpipe@~1.0.0, unpipe@1.0.0:
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@ -6337,7 +6442,7 @@ username@^5.1.0:
execa "^1.0.0"
mem "^4.3.0"
utf-8-validate@^5.0.2, utf-8-validate@>=5.0.2:
utf-8-validate@^5.0.2:
version "5.0.10"
resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz"
integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
@ -6470,7 +6575,7 @@ webpack-sources@^3.2.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.11.0, webpack@^5.20.0, webpack@^5.69.1:
webpack@^5.69.1:
version "5.91.0"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz"
integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==
@ -6500,7 +6605,7 @@ webpack-sources@^3.2.3:
watchpack "^2.4.1"
webpack-sources "^3.2.3"
websocket-driver@^0.7.4, websocket-driver@>=0.5.1:
websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
version "0.7.4"
resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
@ -6556,14 +6661,7 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15:
gopd "^1.0.1"
has-tostringtag "^1.0.2"
which@^1.2.14:
version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
which@^1.2.9:
which@^1.2.14, which@^1.2.9:
version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@ -6589,6 +6687,11 @@ wildcard@^2.0.0:
resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz"
integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
word-wrap@^1.2.3:
version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
@ -6637,7 +6740,7 @@ xterm-addon-search@^0.8.0:
resolved "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz"
integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg==
xterm@^4.0.0, xterm@^4.9.0:
xterm@^4.9.0:
version "4.19.0"
resolved "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz"
integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==
@ -6662,11 +6765,29 @@ yaml@^1.10.0:
resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yargs-parser@^20.2.2:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@^16.0.2:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
dependencies:
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@^17.0.1:
version "17.7.2"
resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"