@shapediver/viewer.session-engine.session-engine 1.15.6 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/implementation/OutputLoader.d.ts +1 -1
- package/dist/implementation/OutputLoader.d.ts.map +1 -1
- package/dist/implementation/OutputLoader.js +2 -5
- package/dist/implementation/OutputLoader.js.map +1 -1
- package/dist/implementation/SessionData.d.ts +4 -3
- package/dist/implementation/SessionData.d.ts.map +1 -1
- package/dist/implementation/SessionData.js.map +1 -1
- package/dist/implementation/{Session.d.ts → SessionEngine.d.ts} +79 -17
- package/dist/implementation/SessionEngine.d.ts.map +1 -0
- package/dist/implementation/SessionEngine.js +1132 -0
- package/dist/implementation/SessionEngine.js.map +1 -0
- package/dist/implementation/SessionOutputData.d.ts +4 -3
- package/dist/implementation/SessionOutputData.d.ts.map +1 -1
- package/dist/implementation/SessionOutputData.js.map +1 -1
- package/dist/implementation/SessionTreeNode.d.ts +4 -4
- package/dist/implementation/SessionTreeNode.d.ts.map +1 -1
- package/dist/implementation/SessionTreeNode.js +1 -4
- package/dist/implementation/SessionTreeNode.js.map +1 -1
- package/dist/implementation/dto/Export.d.ts +37 -0
- package/dist/implementation/dto/Export.d.ts.map +1 -0
- package/dist/implementation/dto/Export.js +204 -0
- package/dist/implementation/dto/Export.js.map +1 -0
- package/dist/implementation/dto/FileParameter.d.ts +10 -0
- package/dist/implementation/dto/FileParameter.d.ts.map +1 -0
- package/dist/implementation/dto/FileParameter.js +99 -0
- package/dist/implementation/dto/FileParameter.js.map +1 -0
- package/dist/implementation/dto/Output.d.ts +42 -0
- package/dist/implementation/dto/Output.d.ts.map +1 -0
- package/dist/implementation/dto/Output.js +200 -0
- package/dist/implementation/dto/Output.js.map +1 -0
- package/dist/implementation/dto/Parameter.d.ts +39 -0
- package/dist/implementation/dto/Parameter.d.ts.map +1 -0
- package/dist/implementation/dto/Parameter.js +341 -0
- package/dist/implementation/dto/Parameter.js.map +1 -0
- package/dist/index.d.ts +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/interfaces/ISessionData.d.ts +7 -0
- package/dist/interfaces/ISessionData.d.ts.map +1 -0
- package/dist/interfaces/ISessionData.js +3 -0
- package/dist/interfaces/ISessionData.js.map +1 -0
- package/dist/interfaces/ISessionEngine.d.ts +123 -0
- package/dist/interfaces/ISessionEngine.d.ts.map +1 -0
- package/dist/interfaces/ISessionEngine.js +59 -0
- package/dist/interfaces/ISessionEngine.js.map +1 -0
- package/dist/interfaces/ISessionOutputData.d.ts +7 -0
- package/dist/interfaces/ISessionOutputData.d.ts.map +1 -0
- package/dist/interfaces/ISessionOutputData.js +3 -0
- package/dist/interfaces/ISessionOutputData.js.map +1 -0
- package/dist/interfaces/ISessionTreeNode.d.ts +5 -0
- package/dist/interfaces/ISessionTreeNode.d.ts.map +1 -0
- package/dist/interfaces/ISessionTreeNode.js +3 -0
- package/dist/interfaces/ISessionTreeNode.js.map +1 -0
- package/dist/interfaces/dto/IExport.d.ts +10 -0
- package/dist/interfaces/dto/IExport.d.ts.map +1 -0
- package/dist/interfaces/{ISession.js → dto/IExport.js} +1 -1
- package/dist/interfaces/dto/IExport.js.map +1 -0
- package/dist/interfaces/dto/IFileParameter.d.ts +5 -0
- package/dist/interfaces/dto/IFileParameter.d.ts.map +1 -0
- package/dist/interfaces/dto/IFileParameter.js +3 -0
- package/dist/interfaces/dto/IFileParameter.js.map +1 -0
- package/dist/interfaces/dto/IOutput.d.ts +25 -0
- package/dist/interfaces/dto/IOutput.d.ts.map +1 -0
- package/dist/interfaces/dto/IOutput.js +3 -0
- package/dist/interfaces/dto/IOutput.js.map +1 -0
- package/dist/interfaces/dto/IParameter.d.ts +10 -0
- package/dist/interfaces/dto/IParameter.d.ts.map +1 -0
- package/dist/interfaces/dto/IParameter.js +3 -0
- package/dist/interfaces/dto/IParameter.js.map +1 -0
- package/package.json +18 -11
- package/src/implementation/OutputDelayException.ts +22 -0
- package/src/implementation/OutputLoader.ts +281 -0
- package/src/implementation/SessionData.ts +43 -0
- package/src/implementation/SessionEngine.ts +1267 -0
- package/src/implementation/SessionOutputData.ts +43 -0
- package/src/implementation/SessionTreeNode.ts +41 -0
- package/src/implementation/dto/Export.ts +223 -0
- package/src/implementation/dto/FileParameter.ts +71 -0
- package/src/implementation/dto/Output.ts +221 -0
- package/src/implementation/dto/Parameter.ts +340 -0
- package/src/index.ts +26 -0
- package/src/interfaces/ISessionData.ts +16 -0
- package/src/interfaces/ISessionEngine.ts +123 -0
- package/src/interfaces/ISessionOutputData.ts +16 -0
- package/src/interfaces/ISessionTreeNode.ts +9 -0
- package/src/interfaces/dto/IExport.ts +17 -0
- package/src/interfaces/dto/IFileParameter.ts +9 -0
- package/src/interfaces/dto/IOutput.ts +45 -0
- package/src/interfaces/dto/IParameter.ts +19 -0
- package/tsconfig.json +17 -0
- package/dist/implementation/Session.d.ts.map +0 -1
- package/dist/implementation/Session.js +0 -536
- package/dist/implementation/Session.js.map +0 -1
- package/dist/interfaces/ISession.d.ts +0 -32
- package/dist/interfaces/ISession.d.ts.map +0 -1
- package/dist/interfaces/ISession.js.map +0 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { ShapeDiverResponseParameterStructure, ShapeDiverResponseParameterGroup, ShapeDiverResponseParameter } from "@shapediver/api.geometry-api-dto-v2";
|
|
2
|
+
import { Converter, InputValidator, Logger, LOGGING_TOPIC, ShapeDiverBackendError, ShapeDiverViewerError, ShapeDiverViewerSessionError } from "@shapediver/viewer.shared.services";
|
|
3
|
+
import { container } from "tsyringe";
|
|
4
|
+
import { IParameter } from "../../interfaces/dto/IParameter";
|
|
5
|
+
import { ISessionEngine, PARAMETER_TYPE, PARAMETER_VISUALIZATION } from "../../interfaces/ISessionEngine";
|
|
6
|
+
import * as MimeTypeUtils from "@shapediver/viewer.utils.mime-type"
|
|
7
|
+
import { SessionEngine } from "../SessionEngine";
|
|
8
|
+
|
|
9
|
+
export class Parameter<T> implements IParameter<T> {
|
|
10
|
+
// #region Properties (24)
|
|
11
|
+
|
|
12
|
+
readonly #choices?: string[];
|
|
13
|
+
readonly #converter: Converter = <Converter>container.resolve(Converter);
|
|
14
|
+
readonly #decimalplaces?: number;
|
|
15
|
+
readonly #defaultValue: T | string;
|
|
16
|
+
readonly #defval: string;
|
|
17
|
+
readonly #expression?: string;
|
|
18
|
+
readonly #format?: string[];
|
|
19
|
+
readonly #group?: ShapeDiverResponseParameterGroup;
|
|
20
|
+
readonly #id: string;
|
|
21
|
+
readonly #inputValidator: InputValidator = <InputValidator>container.resolve(InputValidator);
|
|
22
|
+
readonly #logger: Logger = <Logger>container.resolve(Logger);
|
|
23
|
+
readonly #max?: number;
|
|
24
|
+
readonly #min?: number;
|
|
25
|
+
readonly #name: string;
|
|
26
|
+
readonly #sessionEngine: SessionEngine;
|
|
27
|
+
readonly #structure?: ShapeDiverResponseParameterStructure;
|
|
28
|
+
readonly #type: PARAMETER_TYPE;
|
|
29
|
+
readonly #visualization?: PARAMETER_VISUALIZATION;
|
|
30
|
+
|
|
31
|
+
#displayname?: string;
|
|
32
|
+
#hidden: boolean = false;
|
|
33
|
+
#lastValidatedValue: T | string;
|
|
34
|
+
#order?: number;
|
|
35
|
+
#sessionValue: T | string;
|
|
36
|
+
#tooltip?: string;
|
|
37
|
+
#value: T | string;
|
|
38
|
+
|
|
39
|
+
// #endregion Properties (24)
|
|
40
|
+
|
|
41
|
+
// #region Constructors (1)
|
|
42
|
+
|
|
43
|
+
constructor(paramDef: ShapeDiverResponseParameter, sessionEngine: SessionEngine) {
|
|
44
|
+
this.#sessionEngine = sessionEngine;
|
|
45
|
+
|
|
46
|
+
this.#id = paramDef.id;
|
|
47
|
+
this.#defval = paramDef.defval;
|
|
48
|
+
this.#name = paramDef.name;
|
|
49
|
+
this.#type = <PARAMETER_TYPE>paramDef.type;
|
|
50
|
+
if (paramDef.choices !== undefined) this.#choices = paramDef.choices;
|
|
51
|
+
if (paramDef.decimalplaces !== undefined) this.#decimalplaces = +paramDef.decimalplaces;
|
|
52
|
+
if (paramDef.expression !== undefined) this.#expression = paramDef.expression;
|
|
53
|
+
|
|
54
|
+
if (paramDef.format !== undefined)
|
|
55
|
+
this.#format = MimeTypeUtils.extendMimeTypes(paramDef.format);
|
|
56
|
+
|
|
57
|
+
if (paramDef.min !== undefined) this.#min = +paramDef.min;
|
|
58
|
+
if (paramDef.max !== undefined) this.#max = +paramDef.max;
|
|
59
|
+
if (paramDef.visualization !== undefined) this.#visualization = <PARAMETER_VISUALIZATION>paramDef.visualization;
|
|
60
|
+
if (paramDef.structure !== undefined) this.#structure = paramDef.structure;
|
|
61
|
+
if (paramDef.group !== undefined) this.#group = paramDef.group;
|
|
62
|
+
if (paramDef.tooltip !== undefined) this.#tooltip = paramDef.tooltip;
|
|
63
|
+
|
|
64
|
+
if (paramDef.displayname !== undefined) this.#displayname = paramDef.displayname;
|
|
65
|
+
if (paramDef.order !== undefined) this.#order = paramDef.order;
|
|
66
|
+
if (paramDef.hidden !== undefined) this.#hidden = paramDef.hidden;
|
|
67
|
+
|
|
68
|
+
if (this.#type === PARAMETER_TYPE.BOOL) {
|
|
69
|
+
this.#defaultValue = <T><unknown>(this.#defval === 'true');
|
|
70
|
+
} else if (this.#type === PARAMETER_TYPE.EVEN || this.#type === PARAMETER_TYPE.FLOAT || this.#type === PARAMETER_TYPE.INT || this.#type === PARAMETER_TYPE.ODD) {
|
|
71
|
+
this.#defaultValue = <T><unknown>+this.#defval;
|
|
72
|
+
} else {
|
|
73
|
+
this.#defaultValue = this.#defval;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (this.#type === PARAMETER_TYPE.COLOR) {
|
|
77
|
+
(<any>this).convertColor = (color: any): string => {
|
|
78
|
+
return this.#converter.toColor(color);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this.#value = this.#defaultValue;
|
|
83
|
+
this.#sessionValue = this.#value;
|
|
84
|
+
this.#lastValidatedValue = this.#value;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// #endregion Constructors (1)
|
|
88
|
+
|
|
89
|
+
// #region Public Accessors (26)
|
|
90
|
+
|
|
91
|
+
public get choices(): string[] | undefined {
|
|
92
|
+
return this.#choices;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public get decimalplaces(): number | undefined {
|
|
96
|
+
return this.#decimalplaces;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public get defval(): string {
|
|
100
|
+
return this.#defval;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public get displayname(): string | undefined {
|
|
104
|
+
return this.#displayname;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public set displayname(value: string | undefined) {
|
|
108
|
+
this.#displayname = value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public get expression(): string | undefined {
|
|
112
|
+
return this.#expression;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public get format(): string[] | undefined {
|
|
116
|
+
return this.#format;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public get group(): ShapeDiverResponseParameterGroup | undefined {
|
|
120
|
+
return this.#group;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public get hidden(): boolean {
|
|
124
|
+
return this.#hidden;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public set hidden(value: boolean) {
|
|
128
|
+
this.#hidden = value;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public get id(): string {
|
|
132
|
+
return this.#id;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public get lastValidatedValue(): T | string {
|
|
136
|
+
return this.#lastValidatedValue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public get max(): number | undefined {
|
|
140
|
+
return this.#max;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public get min(): number | undefined {
|
|
144
|
+
return this.#min;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public get name(): string {
|
|
148
|
+
return this.#name;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public get order(): number | undefined {
|
|
152
|
+
return this.#order;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public set order(value: number | undefined) {
|
|
156
|
+
this.#order = value;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public get sessionValue(): T | string {
|
|
160
|
+
return this.#sessionValue;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public set sessionValue(value: T | string) {
|
|
164
|
+
this.#sessionValue = value;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
public get structure(): ShapeDiverResponseParameterStructure | undefined {
|
|
168
|
+
return this.#structure;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
public get tooltip(): string | undefined {
|
|
172
|
+
return this.#tooltip;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public set tooltip(value: string | undefined) {
|
|
176
|
+
this.#tooltip = value;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
public get type(): PARAMETER_TYPE {
|
|
180
|
+
return this.#type;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public get value(): T | string {
|
|
184
|
+
return this.#value;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public set value(value: T | string) {
|
|
188
|
+
this.#value = value;
|
|
189
|
+
if(this.#sessionEngine.customizeOnParameterChange) this.#sessionEngine.customize();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public get visualization(): PARAMETER_VISUALIZATION | undefined {
|
|
193
|
+
return this.#visualization;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// #endregion Public Accessors (26)
|
|
197
|
+
|
|
198
|
+
// #region Public Methods (4)
|
|
199
|
+
|
|
200
|
+
public isValid(value: any): boolean {
|
|
201
|
+
switch (true) {
|
|
202
|
+
case this.type === PARAMETER_TYPE.BOOL:
|
|
203
|
+
if (typeof value === 'string') {
|
|
204
|
+
if (!(value === 'true' || value === 'false')) {
|
|
205
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is a string that is neither true or false.`);
|
|
206
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, value, 'boolean');
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case this.type === PARAMETER_TYPE.COLOR:
|
|
213
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, value, 'color');
|
|
214
|
+
break;
|
|
215
|
+
case this.type === PARAMETER_TYPE.FILE:
|
|
216
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, value, 'file');
|
|
217
|
+
break;
|
|
218
|
+
case this.type === PARAMETER_TYPE.EVEN || this.type === PARAMETER_TYPE.FLOAT || this.type === PARAMETER_TYPE.INT || this.type === PARAMETER_TYPE.ODD:
|
|
219
|
+
let temp: number = value;
|
|
220
|
+
if (typeof value === 'string')
|
|
221
|
+
temp = +value;
|
|
222
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, temp, 'number');
|
|
223
|
+
if (this.type === PARAMETER_TYPE.EVEN) {
|
|
224
|
+
if (temp % 2 !== 0) {
|
|
225
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is not even.`);
|
|
226
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
227
|
+
}
|
|
228
|
+
} else if (this.type === PARAMETER_TYPE.ODD) {
|
|
229
|
+
if (temp % 2 === 0) {
|
|
230
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is not odd.`);
|
|
231
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
232
|
+
}
|
|
233
|
+
} else if (this.type === PARAMETER_TYPE.INT) {
|
|
234
|
+
if (!Number.isInteger(temp)) {
|
|
235
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is not an integer.`);
|
|
236
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (this.min || this.min === 0)
|
|
240
|
+
if (temp < this.min) {
|
|
241
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is smaller than the minimum ${this.min}.`);
|
|
242
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (this.max || this.max === 0)
|
|
246
|
+
if (temp > this.max) {
|
|
247
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} is larger than the maximum ${this.max}.`);
|
|
248
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (this.decimalplaces || this.decimalplaces === 0) {
|
|
252
|
+
const numStr = temp + '';
|
|
253
|
+
let decimalplaces = 0;
|
|
254
|
+
if (numStr.includes('.'))
|
|
255
|
+
decimalplaces = numStr.split('.')[1].length;
|
|
256
|
+
if (this.decimalplaces < decimalplaces) {
|
|
257
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${value} has not the correct number of decimalplaces (${this.decimalplaces}).`);
|
|
258
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
break;
|
|
263
|
+
case this.type === PARAMETER_TYPE.STRINGLIST:
|
|
264
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, value, 'string');
|
|
265
|
+
const choicesChecker = (v: string) => {
|
|
266
|
+
// has to be a single value that is
|
|
267
|
+
// 1. convertible to number
|
|
268
|
+
// 2. between 0 and choices.length -1
|
|
269
|
+
const temp = +v;
|
|
270
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, temp, 'number');
|
|
271
|
+
if (temp < 0 || temp > this.choices!.length - 1) {
|
|
272
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${v} is not within the range of the defined number choices.`);
|
|
273
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (this.visualization === PARAMETER_VISUALIZATION.CHECKLIST) {
|
|
278
|
+
// comma separated numbers
|
|
279
|
+
if (value.includes(',')) {
|
|
280
|
+
const values: string[] = value.split(',');
|
|
281
|
+
for (let i = 0; i < values.length; i++) {
|
|
282
|
+
if (values.filter(item => item === values[i]).length !== 1) {
|
|
283
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).isValid: The value ${values[i]} exists multiple times, but should only exist once.`);
|
|
284
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error, false);
|
|
285
|
+
}
|
|
286
|
+
choicesChecker(values[i]);
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
// to number
|
|
290
|
+
let temp: number = value;
|
|
291
|
+
if (typeof value === 'string')
|
|
292
|
+
temp = +value;
|
|
293
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, temp, 'number');
|
|
294
|
+
choicesChecker(value);
|
|
295
|
+
}
|
|
296
|
+
} else {
|
|
297
|
+
// to number
|
|
298
|
+
let temp: number = value;
|
|
299
|
+
if (typeof value === 'string')
|
|
300
|
+
temp = +value;
|
|
301
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, temp, 'number');
|
|
302
|
+
choicesChecker(value);
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
default:
|
|
306
|
+
this.#inputValidator.validateAndError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.#id}).isValid`, value, 'string');
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
public resetToDefaultValue() {
|
|
313
|
+
this.#value = this.#defaultValue;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
public resetToSessionValue() {
|
|
317
|
+
this.#value = this.sessionValue;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
public stringify(): string {
|
|
321
|
+
switch (true) {
|
|
322
|
+
case this.type === PARAMETER_TYPE.BOOL:
|
|
323
|
+
return typeof this.value === 'string' ? this.value : (<boolean><unknown>this.value) + '';
|
|
324
|
+
case this.type === PARAMETER_TYPE.COLOR:
|
|
325
|
+
return this.#converter.toHex8Color(this.value);
|
|
326
|
+
case this.type === PARAMETER_TYPE.FILE:
|
|
327
|
+
if (typeof this.value !== 'string') {
|
|
328
|
+
const error = new ShapeDiverViewerSessionError(`Parameter(${this.#id}).stringify: Error in stringify. Cannot stringify FileParameter that has not been uploaded yet.`);
|
|
329
|
+
throw this.#logger.handleError(LOGGING_TOPIC.PARAMETER, `Parameter(${this.id}).value`, error);
|
|
330
|
+
}
|
|
331
|
+
return <string>this.value;
|
|
332
|
+
case this.type === PARAMETER_TYPE.EVEN || this.type === PARAMETER_TYPE.FLOAT || this.type === PARAMETER_TYPE.INT || this.type === PARAMETER_TYPE.ODD:
|
|
333
|
+
return typeof this.value === 'string' ? this.value : (<number><unknown>this.value) + '';
|
|
334
|
+
default:
|
|
335
|
+
return <string>this.value;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// #endregion Public Methods (4)
|
|
340
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SessionEngine } from './implementation/SessionEngine'
|
|
2
|
+
import { ISessionEngine, PARAMETER_TYPE, PARAMETER_VISUALIZATION } from './interfaces/ISessionEngine'
|
|
3
|
+
import { SessionOutputData } from './implementation/SessionOutputData'
|
|
4
|
+
import { SessionData } from './implementation/SessionData'
|
|
5
|
+
import { ISessionData } from './interfaces/ISessionData'
|
|
6
|
+
import { ISessionOutputData } from './interfaces/ISessionOutputData'
|
|
7
|
+
import { Export } from './implementation/dto/Export'
|
|
8
|
+
import { FileParameter } from './implementation/dto/FileParameter'
|
|
9
|
+
import { Output } from './implementation/dto/Output'
|
|
10
|
+
import { Parameter } from './implementation/dto/Parameter'
|
|
11
|
+
import { IExport } from './interfaces/dto/IExport'
|
|
12
|
+
import { IFileParameter } from './interfaces/dto/IFileParameter'
|
|
13
|
+
import { IOutput, ShapeDiverResponseOutputChunk, ShapeDiverResponseOutputContent } from './interfaces/dto/IOutput'
|
|
14
|
+
import { IParameter } from './interfaces/dto/IParameter'
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
ISessionData, SessionData, ISessionOutputData, SessionOutputData
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
ISessionEngine, SessionEngine, IOutput, Output, IParameter, Parameter, IFileParameter, FileParameter, IExport, Export, ShapeDiverResponseOutputContent, ShapeDiverResponseOutputChunk
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
PARAMETER_TYPE, PARAMETER_VISUALIZATION
|
|
26
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ShapeDiverResponseDto } from "@shapediver/sdk.geometry-api-sdk-v2";
|
|
2
|
+
import { ITreeNodeData } from "@shapediver/viewer.shared.node-tree";
|
|
3
|
+
|
|
4
|
+
export interface ISessionData extends ITreeNodeData {
|
|
5
|
+
// #region Properties (1)
|
|
6
|
+
|
|
7
|
+
responseDto: ShapeDiverResponseDto;
|
|
8
|
+
|
|
9
|
+
// #endregion Properties (1)
|
|
10
|
+
|
|
11
|
+
// #region Public Methods (1)
|
|
12
|
+
|
|
13
|
+
clone(): ISessionData;
|
|
14
|
+
|
|
15
|
+
// #endregion Public Methods (1)
|
|
16
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { ShapeDiverRequestGltfUploadQueryConversion, ShapeDiverResponseDto, ShapeDiverResponseExport, ShapeDiverResponseOutput, ShapeDiverResponseParameter } from '@shapediver/sdk.geometry-api-sdk-v2';
|
|
2
|
+
import { ITreeNode, TreeNode } from '@shapediver/viewer.shared.node-tree'
|
|
3
|
+
import { SettingsEngine } from '@shapediver/viewer.shared.services';
|
|
4
|
+
import { IExport } from './dto/IExport';
|
|
5
|
+
import { IOutput } from './dto/IOutput';
|
|
6
|
+
import { IParameter } from './dto/IParameter';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The type of the parameter.
|
|
10
|
+
*/
|
|
11
|
+
export enum PARAMETER_TYPE {
|
|
12
|
+
FLOAT = 'Float',
|
|
13
|
+
INT = 'Int',
|
|
14
|
+
EVEN = 'Even',
|
|
15
|
+
ODD = 'Odd',
|
|
16
|
+
STRING = 'String',
|
|
17
|
+
COLOR = 'Color',
|
|
18
|
+
STRINGLIST = 'StringList',
|
|
19
|
+
BOOL = 'Bool',
|
|
20
|
+
TIME = 'Time',
|
|
21
|
+
FILE = 'File',
|
|
22
|
+
SNUMBER = 'sNumber',
|
|
23
|
+
SINTEGER = 'sInteger',
|
|
24
|
+
SSTRING = 'sString',
|
|
25
|
+
SCOLOR = 'sColor',
|
|
26
|
+
SBOOL = 'sBool',
|
|
27
|
+
STIME = 'sTime',
|
|
28
|
+
SBITMAP = 'sBitmap',
|
|
29
|
+
SDOMAIN = 'sDomain',
|
|
30
|
+
SDOMAIN2D = 'sDomain2D',
|
|
31
|
+
SPOINT = 'sPoint',
|
|
32
|
+
SLINE = 'sLine',
|
|
33
|
+
SVECTOR = 'sVector',
|
|
34
|
+
SBOX = 'sBox',
|
|
35
|
+
SPLANE = 'sPlane',
|
|
36
|
+
SRECTANGLE = 'sRectangle',
|
|
37
|
+
SCURVE = 'sCurve',
|
|
38
|
+
SCIRCLE = 'sCircle',
|
|
39
|
+
SMESH = 'sMesh',
|
|
40
|
+
SSURFACE = 'sSurface',
|
|
41
|
+
SBREP = 'sBrep',
|
|
42
|
+
SSUBDIV = 'sSubdiv'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Type of visualization which should be used for UI elements representing the parameter.
|
|
47
|
+
*/
|
|
48
|
+
export enum PARAMETER_VISUALIZATION {
|
|
49
|
+
SLIDER = 'slider',
|
|
50
|
+
SEQUENCE = 'sequence',
|
|
51
|
+
CYCLE = 'cycle',
|
|
52
|
+
DROPDOWN = 'dropdown',
|
|
53
|
+
CHECKLIST = 'checklist',
|
|
54
|
+
CLOCK = 'color',
|
|
55
|
+
CALENDAR = 'calendar',
|
|
56
|
+
TOGGLE = 'toggle',
|
|
57
|
+
SWATCH = 'swatch',
|
|
58
|
+
BUTTON = 'button',
|
|
59
|
+
DIAL = 'dial',
|
|
60
|
+
TEXT = 'text'
|
|
61
|
+
}
|
|
62
|
+
export interface ISessionEngine {
|
|
63
|
+
// #region Properties (11)
|
|
64
|
+
|
|
65
|
+
bearerToken?: string;
|
|
66
|
+
canUploadGLTF: boolean;
|
|
67
|
+
exports: { [key: string]: IExport };
|
|
68
|
+
id: string;
|
|
69
|
+
initialized: boolean;
|
|
70
|
+
modelViewUrl: string;
|
|
71
|
+
outputs: { [key: string]: IOutput };
|
|
72
|
+
parameters: { [key: string]: IParameter<any> };
|
|
73
|
+
refreshBearerToken: (() => Promise<string>) | undefined;
|
|
74
|
+
settingsEngine: SettingsEngine;
|
|
75
|
+
ticket: string;
|
|
76
|
+
updateCallback: ((newNode: ITreeNode, oldNode: ITreeNode) => void) | null;
|
|
77
|
+
|
|
78
|
+
// #endregion Properties (11)
|
|
79
|
+
|
|
80
|
+
// #region Public Methods (18)
|
|
81
|
+
|
|
82
|
+
applySettings(response: ShapeDiverResponseDto, sections?: {
|
|
83
|
+
session?: {
|
|
84
|
+
parameter?: {
|
|
85
|
+
displayname?: boolean,
|
|
86
|
+
order?: boolean,
|
|
87
|
+
hidden?: boolean,
|
|
88
|
+
value?: boolean
|
|
89
|
+
},
|
|
90
|
+
export?: {
|
|
91
|
+
displayname?: boolean,
|
|
92
|
+
order?: boolean,
|
|
93
|
+
hidden?: boolean
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
viewport?: {
|
|
97
|
+
scene?: boolean,
|
|
98
|
+
camera?: boolean,
|
|
99
|
+
light?: boolean,
|
|
100
|
+
environment?: boolean
|
|
101
|
+
}
|
|
102
|
+
}): void;
|
|
103
|
+
canGoBack(): boolean;
|
|
104
|
+
canGoForward(): boolean;
|
|
105
|
+
close(): Promise<void>;
|
|
106
|
+
customize(): Promise<ITreeNode>;
|
|
107
|
+
customizeParallel(parameterValues: { [key: string]: string }): Promise<ITreeNode>;
|
|
108
|
+
goBack(): Promise<ITreeNode>;
|
|
109
|
+
goForward(): Promise<ITreeNode>;
|
|
110
|
+
init(parameterValues?: {
|
|
111
|
+
[key: string]: string;
|
|
112
|
+
}): Promise<void>;
|
|
113
|
+
loadOutputs(cancelRequest: () => boolean): Promise<ITreeNode>;
|
|
114
|
+
requestExport(exportId: string, parameters: { [key: string]: string }, maxWaitTime: number): Promise<ShapeDiverResponseExport>;
|
|
115
|
+
saveDefaultParameterValues(): Promise<boolean>;
|
|
116
|
+
saveSettings(viewportId?: string): Promise<boolean>;
|
|
117
|
+
saveUiProperties(): Promise<boolean>;
|
|
118
|
+
updateOutputs(): Promise<ITreeNode>;
|
|
119
|
+
uploadFile(parameterId: string, data: File, type: string): Promise<string>;
|
|
120
|
+
uploadGLTF(blob: Blob, conversion?: ShapeDiverRequestGltfUploadQueryConversion): Promise<string>;
|
|
121
|
+
|
|
122
|
+
// #endregion Public Methods (18)
|
|
123
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ShapeDiverResponseOutput } from "@shapediver/sdk.geometry-api-sdk-v2";
|
|
2
|
+
import { ITreeNodeData } from "@shapediver/viewer.shared.node-tree";
|
|
3
|
+
|
|
4
|
+
export interface ISessionOutputData extends ITreeNodeData {
|
|
5
|
+
// #region Properties (1)
|
|
6
|
+
|
|
7
|
+
responseOutput: ShapeDiverResponseOutput
|
|
8
|
+
|
|
9
|
+
// #endregion Properties (1)
|
|
10
|
+
|
|
11
|
+
// #region Public Methods (1)
|
|
12
|
+
|
|
13
|
+
clone(): ISessionOutputData;
|
|
14
|
+
|
|
15
|
+
// #endregion Public Methods (1)
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ShapeDiverResponseExport } from "@shapediver/sdk.geometry-api-sdk-v2";
|
|
2
|
+
|
|
3
|
+
export interface IExport extends ShapeDiverResponseExport {
|
|
4
|
+
// #region Properties (1)
|
|
5
|
+
|
|
6
|
+
maxWaitTime: number;
|
|
7
|
+
|
|
8
|
+
// #endregion Properties (1)
|
|
9
|
+
|
|
10
|
+
// #region Public Methods (2)
|
|
11
|
+
|
|
12
|
+
request(parameters?: { [key: string]: string }): Promise<ShapeDiverResponseExport>;
|
|
13
|
+
updateExport(): void;
|
|
14
|
+
updateExportDefinition(exportDef: ShapeDiverResponseExport): void;
|
|
15
|
+
|
|
16
|
+
// #endregion Public Methods (2)
|
|
17
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ShapeDiverResponseOutput, ShapeDiverResponseOutputContent as ShapeDiverResponseOutputContentBackend, ShapeDiverResponseOutputChunk as ShapeDiverResponseOutputChunkBackend } from '@shapediver/sdk.geometry-api-sdk-v2';
|
|
2
|
+
import { IAnchor, IMaterialContentData, IMaterialContentDataV1, IMaterialContentDataV2, IMaterialContentDataV3, ITag2D, ITag3D } from '@shapediver/viewer.data-engine.shared-types';
|
|
3
|
+
import { ITreeNode } from '@shapediver/viewer.shared.node-tree';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extension of the ShapeDiverResponseOutputContent as the viewer already creates types for them
|
|
7
|
+
*/
|
|
8
|
+
export interface ShapeDiverResponseOutputContent extends ShapeDiverResponseOutputContentBackend {
|
|
9
|
+
// #region Properties (1)
|
|
10
|
+
|
|
11
|
+
data?: ITag2D[] | ITag3D[] | IAnchor[] | IMaterialContentData | IMaterialContentDataV1 | IMaterialContentDataV2 | IMaterialContentDataV3 | any;
|
|
12
|
+
|
|
13
|
+
// #endregion Properties (1)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Extension of the ShapeDiverResponseOutputChunk with a node
|
|
18
|
+
*/
|
|
19
|
+
export interface ShapeDiverResponseOutputChunk extends ShapeDiverResponseOutputChunkBackend {
|
|
20
|
+
// #region Properties (1)
|
|
21
|
+
|
|
22
|
+
node?: ITreeNode;
|
|
23
|
+
|
|
24
|
+
// #endregion Properties (1)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface IOutput extends ShapeDiverResponseOutput {
|
|
28
|
+
// #region Properties (3)
|
|
29
|
+
|
|
30
|
+
readonly node?: ITreeNode;
|
|
31
|
+
|
|
32
|
+
format: string[];
|
|
33
|
+
freeze: boolean;
|
|
34
|
+
updateCallback: ((newNode?: ITreeNode, oldNode?: ITreeNode) => void) | null;
|
|
35
|
+
|
|
36
|
+
// #endregion Properties (3)
|
|
37
|
+
|
|
38
|
+
// #region Public Methods (1)
|
|
39
|
+
|
|
40
|
+
updateOutput(newNode?: ITreeNode, oldNode?: ITreeNode): void;
|
|
41
|
+
updateOutputContent(content: ShapeDiverResponseOutputContent[], preventUpdate?: boolean): Promise<ITreeNode | undefined>;
|
|
42
|
+
updateOutputDefinition(outputDef: ShapeDiverResponseOutput): void;
|
|
43
|
+
|
|
44
|
+
// #endregion Public Methods (1)
|
|
45
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ShapeDiverResponseParameter } from "@shapediver/sdk.geometry-api-sdk-v2";
|
|
2
|
+
|
|
3
|
+
export interface IParameter<T> extends ShapeDiverResponseParameter {
|
|
4
|
+
// #region Properties (2)
|
|
5
|
+
|
|
6
|
+
sessionValue: T | string;
|
|
7
|
+
value: T | string;
|
|
8
|
+
|
|
9
|
+
// #endregion Properties (2)
|
|
10
|
+
|
|
11
|
+
// #region Public Methods (4)
|
|
12
|
+
|
|
13
|
+
isValid(value: any, throwError?: boolean): boolean;
|
|
14
|
+
resetToDefaultValue(): void;
|
|
15
|
+
resetToSessionValue(): void;
|
|
16
|
+
stringify(): string;
|
|
17
|
+
|
|
18
|
+
// #endregion Public Methods (4)
|
|
19
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../src/implementation/Session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,OAAO,EAAkF,0CAA0C,EAAkD,wBAAwB,EAA0C,wBAAwB,EAAE,2BAA2B,EAA0C,MAAM,qCAAqC,CAAA;AAGjY,qBAAa,OAAQ,YAAW,QAAQ;IAGpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsD;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyD;IACrF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuD;IACnF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiE;IACvG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA8D;IAC/F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAKd;IACF,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,mBAAmB,CAAC,CAAwB;IACpD,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,UAAU,CAEX;IAMP;;;OAGG;gBACS,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAkB1M,IAAW,WAAW,IAAI,MAAM,GAAG,SAAS,CAE3C;IAED,IAAW,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAG/C;IAED,IAAW,aAAa,IAAI,OAAO,CAOlC;IAED,IAAW,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,wBAAwB,CAAC;KAAE,CAEjE;IAED,IAAW,EAAE,IAAI,MAAM,CAEtB;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,wBAAwB,CAAC;KAAE,CAEjE;IAED,IAAW,aAAa,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAAE,CAEtD;IAED,IAAW,eAAe,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KAAE,CAEvD;IAED,IAAW,UAAU,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,2BAA2B,CAAC;KAAE,CAEvE;IAED,IAAW,kBAAkB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAEzD;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,cAAc,IAAI,MAAM,GAAG,SAAS,CAE9C;YAEa,WAAW;IAwDZ,KAAK,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAcnD;;;;;OAKG;IACU,SAAS,CAAC,aAAa,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAI9E;;;;OAIG;IACU,IAAI,CAAC,eAAe,CAAC,EAAE;QAChC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmChC;;;;;;;OAOG;IACU,WAAW,CAAC,aAAa,GAAE,MAAM,OAAqB,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IAqChG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAY7I,qBAAqB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnE;;;;;OAKG;IACU,oBAAoB,CAAC,OAAO,EAAE;QACvC,CAAC,GAAG,EAAE,MAAM,GAAG;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,OAAO,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAA;SAClB,CAAA;KACJ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnC;;;;;OAKG;IACU,oBAAoB,CAAC,OAAO,EAAE;QACvC,CAAC,GAAG,EAAE,MAAM,GAAG;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,OAAO,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAA;SAClB,CAAA;KACJ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnC;;;;;OAKG;IACU,uBAAuB,CAAC,UAAU,EAAE;QAC7C,CAAC,GAAG,EAAE,MAAM,GAAG;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,OAAO,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAA;SAClB,CAAA;KACJ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBzF,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,GAAE,0CAA4F,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7K,OAAO,CAAC,iBAAiB;YA4BX,gBAAgB;IAgB9B;;;;;OAKG;YACW,OAAO;IAIrB,OAAO,CAAC,iBAAiB;CAoD5B"}
|