fcs-core-viewer 0.39.1 → 0.41.0

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.
Files changed (23) hide show
  1. package/fcs-core-editor@types/Editor3D/Network/SocketCommandsGateway.d.ts +2 -1
  2. package/fcs-core-editor@types/Editor3D/Operations/CAD/CreationTools/Index.d.ts +3 -0
  3. package/fcs-core-editor@types/Editor3D/Operations/CAD/CreationTools/OpPointByInterpolation.d.ts +14 -0
  4. package/fcs-core-editor@types/Editor3D/Operations/CAD/EditingTools/OpSplitFace.d.ts +2 -0
  5. package/fcs-core-editor@types/Editor3D/Operations/CAD/Index.d.ts +2 -0
  6. package/fcs-core-editor@types/Editor3D/Operations/Index.d.ts +2 -0
  7. package/fcs-core-editor@types/Editor3D/Operations/ModelView/Index.d.ts +2 -0
  8. package/fcs-core-editor@types/Editor3D/Operations/ModelView/VisibilityOperations.d.ts +5 -0
  9. package/fcs-core-editor@types/Editor3D/Operations/OperationCollection.d.ts +5 -1
  10. package/fcs-core-editor@types/Editor3D/Operations/Query/EntityProperties.d.ts +7 -0
  11. package/fcs-core-editor@types/Editor3D/UserInterface/UIComponents/MainMenu/Operations/CAD/AnalysisTools/UIMeasureDistance.d.ts +4 -1
  12. package/fcs-core-editor@types/Editor3D/UserInterface/UIComponents/MainMenu/Operations/CAD/CreationTools/Point/UIPointByInterpolation.d.ts +18 -14
  13. package/fcs-core-editor@types/Editor3D/UserInterface/UIComponents/MainMenu/Operations/CAD/EditingTools/UISplitFace.d.ts +4 -0
  14. package/fcs-core-editor@types/Editor3D/UserInterface/UIComponents/MainMenu/ToolsetPanel.d.ts +2 -1
  15. package/fcs-core-editor@types/Viewer3D/UserInterface/UIComponents/{Modal/Modal.d.ts → Modals/DiagnosticModal.d.ts} +2 -2
  16. package/fcs-core-editor@types/Viewer3D/UserInterface/UIComponents/Modals/DistanceMeasurementLabel.d.ts +36 -0
  17. package/fcs-core-editor@types/Viewer3D/UserInterface/UIComponents/Modals/PropertiesModal.d.ts +60 -0
  18. package/fcs-core-editor@types/Viewer3D/UserInterface/UIComponents/Modals/TextLabel.d.ts +35 -0
  19. package/fcs-core-editor@types/Viewer3D/UserInterface/UIComponents/Model/Model.d.ts +2 -1
  20. package/fcs-core-editor@types/Viewer3D/Viewer3DAPI.d.ts +2 -0
  21. package/fcs-core-editor@types/Viewer3D/ViewerCommands/Visualization/Visibility.d.ts +5 -0
  22. package/fcs-core-editor@types/Viewer3D/Wrapper/SceneWrapper.d.ts +5 -0
  23. package/package.json +1 -1
@@ -85,7 +85,8 @@ export declare class SocketCommandsGateway implements IBackendEvents {
85
85
  [key: string]: PluginService;
86
86
  };
87
87
  /**
88
- * Contains all approved guids
88
+ * Contains all approved unique service names,
89
+ * made of the concatenation of $serviceName-$implClassName
89
90
  */
90
91
  registeredPluginNames: string[];
91
92
  /**
@@ -1,4 +1,5 @@
1
1
  import * as PointByXYZ from "./OpPointByXYZ";
2
+ import * as PointByInterpolation from "./OpPointByInterpolation";
2
3
  import * as LineByXYZ from './OpLineByXYZ';
3
4
  import * as LineByPoints from './OpLineByPoints';
4
5
  import * as FaceByEdges from './OpFaceByEdges';
@@ -23,6 +24,8 @@ declare const CADCreationToolsOperations: {
23
24
  TemporaryLineByPoints: typeof LineByPoints.TemporaryLineByPoints;
24
25
  LineByXYZ: typeof LineByXYZ.LineByXYZ;
25
26
  TemporaryLineByXYZ: typeof LineByXYZ.TemporaryLineByXYZ;
27
+ PointByInterpolation: typeof PointByInterpolation.PointByInterpolation;
28
+ TemporaryPointByInterpolation: typeof PointByInterpolation.TemporaryPointByInterpolation;
26
29
  PointByXYZ: typeof PointByXYZ.PointByXYZ;
27
30
  TemporaryPointByXYZ: typeof PointByXYZ.TemporaryPointByXYZ;
28
31
  };
@@ -0,0 +1,14 @@
1
+ export declare class PointByInterpolation {
2
+ itemName: string;
3
+ isPreview: boolean;
4
+ numberOfPoints: number;
5
+ toolShapeUIDs: number[];
6
+ constructor(input: {});
7
+ perform(): Promise<boolean>;
8
+ }
9
+ export declare class TemporaryPointByInterpolation {
10
+ private input;
11
+ constructor(input?: {});
12
+ preview(): Promise<void>;
13
+ reject(): Promise<void>;
14
+ }
@@ -2,11 +2,13 @@ import { ModelData } from '../../../../Viewer3D/DataStorage/ModelData/Index';
2
2
  export declare class SplitFace {
3
3
  id: number;
4
4
  itemName: string;
5
+ createCopy: boolean;
5
6
  Modes: {
6
7
  Face: number;
7
8
  LineAndVector: number;
8
9
  LineAndDxDyDz: number;
9
10
  LineAndNormal: number;
11
+ VertexAndVector: number;
10
12
  Vertex: number;
11
13
  };
12
14
  targetShapeUIDs: number[];
@@ -27,6 +27,8 @@ declare const CAD: {
27
27
  TemporaryLineByPoints: typeof import("./CreationTools/OpLineByPoints").TemporaryLineByPoints;
28
28
  LineByXYZ: typeof import("./CreationTools/OpLineByXYZ").LineByXYZ;
29
29
  TemporaryLineByXYZ: typeof import("./CreationTools/OpLineByXYZ").TemporaryLineByXYZ;
30
+ PointByInterpolation: typeof import("./CreationTools/OpPointByInterpolation").PointByInterpolation;
31
+ TemporaryPointByInterpolation: typeof import("./CreationTools/OpPointByInterpolation").TemporaryPointByInterpolation;
30
32
  PointByXYZ: typeof import("./CreationTools/OpPointByXYZ").PointByXYZ;
31
33
  TemporaryPointByXYZ: typeof import("./CreationTools/OpPointByXYZ").TemporaryPointByXYZ;
32
34
  };
@@ -92,6 +92,8 @@ declare const Operations: {
92
92
  TemporaryLineByPoints: typeof import("./CAD/CreationTools/OpLineByPoints").TemporaryLineByPoints;
93
93
  LineByXYZ: typeof import("./CAD/CreationTools/OpLineByXYZ").LineByXYZ;
94
94
  TemporaryLineByXYZ: typeof import("./CAD/CreationTools/OpLineByXYZ").TemporaryLineByXYZ;
95
+ PointByInterpolation: typeof import("./CAD/CreationTools/OpPointByInterpolation").PointByInterpolation;
96
+ TemporaryPointByInterpolation: typeof import("./CAD/CreationTools/OpPointByInterpolation").TemporaryPointByInterpolation;
95
97
  PointByXYZ: typeof import("./CAD/CreationTools/OpPointByXYZ").PointByXYZ;
96
98
  TemporaryPointByXYZ: typeof import("./CAD/CreationTools/OpPointByXYZ").TemporaryPointByXYZ;
97
99
  };
@@ -1,6 +1,8 @@
1
1
  import * as DeleteShapes from './DeleteShapes';
2
2
  import * as ModelViewEventHandlerE3D from './ModelViewEventHandlerE3D';
3
+ import * as VisibilityOperations from './VisibilityOperations';
3
4
  declare const ModelViewOperations: {
5
+ SetDisplaySettings: typeof VisibilityOperations.SetDisplaySettings;
4
6
  ModelEventHandlerE3D: typeof ModelViewEventHandlerE3D.ModelEventHandlerE3D;
5
7
  DeleteShapes: typeof DeleteShapes.DeleteShapes;
6
8
  };
@@ -0,0 +1,5 @@
1
+ export declare class SetDisplaySettings {
2
+ entityUIDs: number[];
3
+ constructor(entityUIDs: number[]);
4
+ perform(isVisible?: boolean, color?: number[], transparency?: number): Promise<boolean>;
5
+ }
@@ -36,6 +36,7 @@ export declare enum OperationToId {
36
36
  Common_Core_AddFile = 1202,
37
37
  Common_Core_CopyPasteShape = 1210,
38
38
  Common_Core_CutPasteShape = 1211,
39
+ Common_Core_GetShapeProperties = 1220,
39
40
  /**
40
41
  * Model Tree - 13xx
41
42
  */
@@ -44,10 +45,12 @@ export declare enum OperationToId {
44
45
  /**
45
46
  * Model View - 14xx
46
47
  */
48
+ ModelView_SetDisplaySettings = 1400,
47
49
  /**
48
50
  * CAD - Creation Tools - 20xx
49
51
  */
50
52
  CAD_CreationTools_CreateVertexByXYZ = 2000,
53
+ CAD_CreationTools_CreateVertexByInterpolation = 2001,
51
54
  CAD_CreationTools_CreateEdgeByXYZ = 2010,
52
55
  CAD_CreationTools_CreateEdgeByPoints = 2011,
53
56
  CAD_CreationTools_CreateFaceByEdges = 2020,
@@ -80,7 +83,8 @@ export declare enum OperationToId {
80
83
  CAD_EditingTools_SplitFace_by_Face = 2220,
81
84
  CAD_EditingTools_SplitFace_by_Line_and_Vector = 2221,
82
85
  CAD_EditingTools_SplitFace_by_Line_and_Normal = 2222,
83
- CAD_EditingTools_SplitFace_by_Vertex = 2223,
86
+ CAD_EditingTools_SplitFace_by_Vertex_And_Vector = 2223,
87
+ CAD_EditingTools_SplitFace_by_Vertex = 2224,
84
88
  /**
85
89
  * CAD - Auxiliary Tools - 26xx
86
90
  */
@@ -0,0 +1,7 @@
1
+ export declare class GetShapeProperties {
2
+ constructor();
3
+ /**
4
+ * Requests shape properties from backend and displays them in a PropertiesModal.
5
+ */
6
+ perform(): Promise<void>;
7
+ }
@@ -9,13 +9,16 @@ export declare class MeasureDistance extends Operation {
9
9
  private readonly buttonsContainer;
10
10
  private availableEntities_1;
11
11
  private availableEntities_2;
12
+ private element2DMaterial;
12
13
  private entityDropDownMenu_1;
13
14
  private entityDropDownMenu_2;
15
+ private showDistanceLinesInput;
16
+ private createDistanceLines;
14
17
  private selectionData;
15
- private element2DMaterial;
16
18
  constructor(onPreview?: OnPreviewHandler, onAccept?: OnAcceptHandler, onReject?: OnRejectHandler);
17
19
  private setEnabledEntity;
18
20
  private setActiveButton;
21
+ private addCheckmarks;
19
22
  /**
20
23
  * Add entity button
21
24
  */
@@ -1,46 +1,50 @@
1
1
  import { Operation } from "../../../../../../../../Viewer3D/UserInterface/UIComponents/BuildingBlocks/MainMenuComponents/Operation";
2
- type OnPreviewHandler = (entityUIDs: number[]) => void;
3
- type OnAcceptHandler = (data: {}) => void;
4
- type OnRejectHandler = (entityUIDs: number[]) => void;
2
+ type OnPreviewHandler = (input: {}) => Promise<void>;
3
+ type OnAcceptHandler = (input: {}) => Promise<boolean>;
4
+ type OnRejectHandler = () => Promise<void>;
5
5
  export declare class PointByInterpolation extends Operation {
6
6
  private entityDropDownMenu;
7
+ private numberInput;
7
8
  private readonly onPreviewHandler;
8
9
  private readonly onAcceptHandler;
9
10
  private readonly onRejectHandler;
10
11
  private readonly buttonsContainer;
11
- private readonly inputsContainer;
12
+ private N;
12
13
  private availableEntities;
13
- private numberOfVertexes;
14
- private entity;
15
- private vInput;
14
+ private selectionData;
16
15
  constructor(onPreview?: OnPreviewHandler, onAccept?: OnAcceptHandler, onRejectHandler?: OnRejectHandler);
17
16
  private setEnabledEntity;
18
17
  private setActiveButton;
19
- private initHiddenInputs;
20
18
  /**
21
19
  * Add entity button
22
20
  */
23
21
  private addEntityButton;
22
+ /**
23
+ * Create dropdown list for entityButton
24
+ */
25
+ private createDropdownListItems;
24
26
  private addFields;
25
27
  /**
26
28
  * Add action buttons (-> Preview, Accept, Reject)
27
29
  */
28
30
  private addActionButtons;
29
- /**
30
- * Create dropdown list for entityButton
31
- */
32
- private createDropdownListItems;
33
31
  /**
34
32
  * Initializes uiComponents on opening the operationUI
35
33
  */
36
34
  init(): void;
37
35
  /**
38
- * Extracts the selected entities from dict 'selected' and starts the attached task
36
+ * Resets the gui elements (fields, entity buttons, dropdown buttons ... to default)
39
37
  */
40
- private onAccept;
38
+ unselect(): void;
41
39
  /**
42
40
  * Resets the gui elements (fields, entity buttons, dropdown buttons ... to default)
43
41
  */
44
42
  reset(): void;
43
+ private onPreview;
44
+ /**
45
+ * Extracts the selected entities from dict 'selected' and starts the attached task
46
+ */
47
+ private onAccept;
48
+ private onReject;
45
49
  }
46
50
  export {};
@@ -12,6 +12,8 @@ export declare class SplitFace extends Operation {
12
12
  private dyInput;
13
13
  private dzInput;
14
14
  private modeSelector;
15
+ private createCopyFace;
16
+ private createCopy;
15
17
  private readonly onPreviewHandler;
16
18
  private readonly onAcceptHandler;
17
19
  private readonly onRejectHandler;
@@ -32,6 +34,7 @@ export declare class SplitFace extends Operation {
32
34
  LineAndVector: number;
33
35
  LineAndDxDyDz: number;
34
36
  LineAndNormal: number;
37
+ VertexAndVector: number;
35
38
  Vertex: number;
36
39
  };
37
40
  constructor(onPreview?: OnPreviewHandler, onAccept?: OnAcceptHandler, onReject?: OnRejectHandler);
@@ -70,6 +73,7 @@ export declare class SplitFace extends Operation {
70
73
  * Add input field
71
74
  */
72
75
  private fields;
76
+ private addCheckmarks;
73
77
  /**
74
78
  * Add action buttons (-> Preview, Accept, Reject)
75
79
  */
@@ -2,6 +2,7 @@ import { IViewerHtmlElement } from "../../../../Viewer3D/UserInterface/UICompone
2
2
  import { OperationsPanel } from "./OperationsPanel";
3
3
  import { IMethodGroup } from "./IMethodGroup";
4
4
  import { IButtonGroup } from "../../../../Viewer3D/UserInterface/UIComponents/BuildingBlocks/UserInterfaces/IButtonGroup";
5
+ import { Button } from "../../../../Viewer3D/UserInterface/UIComponents/BuildingBlocks/OperationPanelComponents/Button";
5
6
  import { LabelConfig } from "../../../../Viewer3D/UserInterface/UIComponents/BuildingBlocks/OperationPanelComponents/Label";
6
7
  import { ToolButton } from "../../../../Viewer3D/UserInterface/UIComponents/BuildingBlocks/MainMenuComponents/ToolButton";
7
8
  export declare class ToolsetPanel implements IViewerHtmlElement, IMethodGroup {
@@ -31,7 +32,7 @@ export declare class ToolsetPanel implements IViewerHtmlElement, IMethodGroup {
31
32
  reset(): void;
32
33
  private updateCreatedElementsStyle;
33
34
  addContainer(styles: Partial<CSSStyleDeclaration>): HTMLDivElement;
34
- addPrimaryButton(title: string, callback?: () => void, styles?: Partial<CSSStyleDeclaration>, container?: HTMLElement): void;
35
+ addPrimaryButton(title: string, callback?: () => void, styles?: Partial<CSSStyleDeclaration>, container?: HTMLElement): Button;
35
36
  addButton_FileBrowser(labelConfig?: LabelConfig, onChangeHandler?: (file: FileList) => void): void;
36
37
  addParagraph(text: string, styles: Partial<CSSStyleDeclaration>): void;
37
38
  addOperation(operation: any): void;
@@ -1,5 +1,5 @@
1
1
  import { IViewerHtmlElement } from "../BuildingBlocks/MainMenuComponents/HtmlElementInterface";
2
- export declare class Modal implements IViewerHtmlElement {
2
+ export declare class DiagnosticModal implements IViewerHtmlElement {
3
3
  /**
4
4
  * Singleton instance
5
5
  */
@@ -13,7 +13,7 @@ export declare class Modal implements IViewerHtmlElement {
13
13
  /**
14
14
  * Getter for singleton instance.
15
15
  */
16
- static getInstance(): Modal;
16
+ static getInstance(): DiagnosticModal;
17
17
  private buildModalHeader;
18
18
  private buildModalBody;
19
19
  private buildModalFooter;
@@ -0,0 +1,36 @@
1
+ import { TextLabel, Vector3 } from "./TextLabel";
2
+ type LabelOpts = {
3
+ textColor?: string;
4
+ frameColor?: string;
5
+ borderColor?: string;
6
+ fontSize?: string;
7
+ padding?: string;
8
+ };
9
+ export declare class DistanceMeasurementLabel extends TextLabel {
10
+ private start;
11
+ private end;
12
+ private line;
13
+ private lineGeom;
14
+ private lineMat;
15
+ private baseTextColor;
16
+ private baseFrameColor;
17
+ private baseBorderColor?;
18
+ private baseLineColor;
19
+ private hoverTextColor;
20
+ private hoverFrameColor;
21
+ private hoverBorderColor;
22
+ private hoverLineColor;
23
+ constructor(entityId: string, start: Vector3, end: Vector3, text?: string, opts?: LabelOpts);
24
+ /** Show label + add line to the scene. */
25
+ open(): void;
26
+ /** Hide label + hide line. */
27
+ close(): void;
28
+ /** Remove label + remove line and dispose resources. */
29
+ remove(): void;
30
+ /** Update endpoints; repositions the label to the new midpoint and updates distance text if auto text was used. */
31
+ updateEndpoints(start: Vector3, end: Vector3, text?: string): void;
32
+ private setupEvents;
33
+ private static midpoint;
34
+ private static calcLength;
35
+ }
36
+ export {};
@@ -0,0 +1,60 @@
1
+ export type Vector3 = {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ };
6
+ export interface IViewerHtmlElement {
7
+ setHtmlParent: (parent: HTMLElement) => void;
8
+ setParent: (parent: IViewerHtmlElement) => void;
9
+ remove: () => void;
10
+ getHtmlElement: () => HTMLElement;
11
+ reset: () => void;
12
+ init?: () => void;
13
+ }
14
+ declare class PropertiesModal implements IViewerHtmlElement {
15
+ private readonly entityId;
16
+ private readonly anchor;
17
+ private fields;
18
+ private cardRoot;
19
+ private headerEl;
20
+ private bodyEl;
21
+ private footerEl;
22
+ private cssObj;
23
+ private addedToScene;
24
+ private isOpen;
25
+ constructor(entityId: string, anchor: Vector3, title?: string);
26
+ AddField(key: string, value: string): void;
27
+ GetFields(): Map<string, string>;
28
+ RemoveField(key: string): void;
29
+ open(): void;
30
+ close(): void;
31
+ moveTo(x: number, y: number, z: number): void;
32
+ getHtmlElement(): HTMLElement;
33
+ remove(): void;
34
+ setHtmlParent(_parent: HTMLElement): void;
35
+ setParent(_parent: IViewerHtmlElement): void;
36
+ reset(): void;
37
+ private renderFields;
38
+ }
39
+ /**
40
+ * Singleton container that manages all PropertiesModal instances keyed by entityId.
41
+ */
42
+ export declare class PropertiesModalsContainer {
43
+ private static _instance;
44
+ private readonly modals;
45
+ private constructor();
46
+ static getInstance(): PropertiesModalsContainer;
47
+ /** Returns the modal for an entity if it exists. */
48
+ get(entityId: string): PropertiesModal | undefined;
49
+ /** Creates or replaces a modal for an entity. */
50
+ create(entityId: string, anchor: Vector3, title?: string): PropertiesModal;
51
+ /** Ensures a modal exists; returns existing or creates a new one. */
52
+ getOrCreate(entityId: string, anchor: Vector3, title?: string): PropertiesModal;
53
+ /** Removes and destroys the modal for an entity. */
54
+ remove(entityId: string): void;
55
+ /** Iterates all modals. */
56
+ entries(): IterableIterator<[string, PropertiesModal]>;
57
+ /** Closes & clears all modals. */
58
+ clear(): void;
59
+ }
60
+ export {};
@@ -0,0 +1,35 @@
1
+ import { IViewerHtmlElement } from "../BuildingBlocks/MainMenuComponents/HtmlElementInterface";
2
+ export type Vector3 = {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ };
7
+ type TextLabelOptions = {
8
+ textColor?: string;
9
+ frameColor?: string;
10
+ borderColor?: string;
11
+ fontSize?: string;
12
+ padding?: string;
13
+ };
14
+ export declare class TextLabel implements IViewerHtmlElement {
15
+ private readonly entityId;
16
+ private cssObj;
17
+ private addedToScene;
18
+ private isOpen;
19
+ private root;
20
+ private textEl;
21
+ constructor(entityId: string, position: Vector3, text: string, opts?: TextLabelOptions);
22
+ open(): void;
23
+ close(): void;
24
+ setText(text: string): void;
25
+ /** Quickly update colors (background = frameColor, text = textColor). */
26
+ setColors(textColor: string, frameColor: string, borderColor?: string): void;
27
+ /** Reposition label in world space. */
28
+ moveTo(x: number, y: number, z: number): void;
29
+ getHtmlElement(): HTMLElement;
30
+ remove(): void;
31
+ setHtmlParent(_parent: HTMLElement): void;
32
+ setParent(_parent: IViewerHtmlElement): void;
33
+ reset(): void;
34
+ }
35
+ export {};
@@ -26,7 +26,8 @@ declare enum ModelContextMenuButtons {
26
26
  edit_geom = 9,
27
27
  selection_ctrl = 10,
28
28
  create_mesh = 11,
29
- edit = 12
29
+ edit = 12,
30
+ show_properties = 13
30
31
  }
31
32
  export declare class ModelContextMenu {
32
33
  instance: ModelContextMenu;
@@ -5,6 +5,8 @@
5
5
  export * from './Common/Foundations/Index';
6
6
  export * from './ViewerEntities/Index';
7
7
  export * from './Wrapper/Settings/Index';
8
+ export * from './DataStorage/ModelData/Index';
9
+ export * from './SelectionTools/SelectionHelpers';
8
10
  export * from './Common/Index';
9
11
  export * from './Loader/Index';
10
12
  export * from './UI/Index';
@@ -15,6 +15,11 @@ export declare class Visibility {
15
15
  div_treeHTML: HTMLElement;
16
16
  elements: NodeListOf<Element>;
17
17
  activeButton: EntityButton;
18
+ borderMaterial: THREE.ShaderMaterial;
19
+ tempBorderMaterial: THREE.ShaderMaterial;
20
+ lineMaterial: THREE.ShaderMaterial;
21
+ edgeMaterial: THREE.ShaderMaterial;
22
+ element1DMaterial: THREE.ShaderMaterial;
18
23
  constructor();
19
24
  showAll(): void;
20
25
  hideAll(): void;
@@ -147,6 +147,11 @@ export declare class SceneWrapper {
147
147
  radius: any;
148
148
  center: any;
149
149
  };
150
+ /**
151
+ * Re-renders the scene, call this method, if you want to update
152
+ * to a newly rendered scene.
153
+ */
154
+ refreshViewer(): void;
150
155
  getMenuSections(): any[];
151
156
  getTopbarSections_L1(): any[];
152
157
  getTopbarSections_L2(): any[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fcs-core-viewer",
3
- "version": "0.39.1",
3
+ "version": "0.41.0",
4
4
  "description": "3D Viewer in the Cloud",
5
5
  "author": {
6
6
  "name": "Femsolve Kft."