@dcl/ecs 7.25.1-30391610123.commit-26cb925 → 7.25.1-30540108605.commit-82368ee

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.
@@ -0,0 +1,23 @@
1
+ import { IEngine, LastWriteWinElementSetComponentDefinition } from '../../engine';
2
+ import { PBTouchScreenControls } from '../generated/index.gen';
3
+ import { InputAction } from '../generated/pb/decentraland/sdk/components/common/input_action.gen';
4
+ /**
5
+ * @public
6
+ * TouchScreenControls with convenience helpers. All helpers write the component onto the
7
+ * RootEntity (where the client reads it) and merge with the current value.
8
+ */
9
+ export interface TouchScreenControlsComponentDefinitionExtended extends LastWriteWinElementSetComponentDefinition<PBTouchScreenControls> {
10
+ /** Hide every on-screen gamepad button. */
11
+ hideAll(): void;
12
+ /** Show every on-screen gamepad button (clears the hide list). */
13
+ showAll(): void;
14
+ /** Hide the given on-screen buttons (merged into the current config). */
15
+ hide(actions: InputAction[]): void;
16
+ /** Set which action the large central button triggers. */
17
+ setMainAction(action: InputAction): void;
18
+ /** Hide the native virtual joystick. */
19
+ hideJoystick(): void;
20
+ /** Hide the on-screen crosshair / reticle. */
21
+ hideCrosshair(): void;
22
+ }
23
+ export declare function defineTouchScreenControlsComponent(engine: Pick<IEngine, 'defineComponentFromSchema'>): TouchScreenControlsComponentDefinitionExtended;
@@ -0,0 +1,65 @@
1
+ import { TouchScreenControls } from '../generated/index.gen';
2
+ const ROOT_ENTITY = 0;
3
+ // Every on-screen gamepad action button.
4
+ const ALL_BUTTONS = [
5
+ 0 /* InputAction.IA_POINTER */,
6
+ 1 /* InputAction.IA_PRIMARY */,
7
+ 2 /* InputAction.IA_SECONDARY */,
8
+ 8 /* InputAction.IA_JUMP */,
9
+ 10 /* InputAction.IA_ACTION_3 */,
10
+ 11 /* InputAction.IA_ACTION_4 */,
11
+ 12 /* InputAction.IA_ACTION_5 */,
12
+ 13 /* InputAction.IA_ACTION_6 */
13
+ ];
14
+ export function defineTouchScreenControlsComponent(engine) {
15
+ const theComponent = TouchScreenControls(engine);
16
+ // A mutable copy of the current RootEntity value (or a fresh default).
17
+ function current() {
18
+ const value = theComponent.getOrNull(ROOT_ENTITY);
19
+ return {
20
+ touchInputs: value?.touchInputs ? value.touchInputs.map((t) => ({ ...t })) : [],
21
+ mainAction: value?.mainAction,
22
+ hideJoystick: value?.hideJoystick ?? false,
23
+ hideCrosshair: value?.hideCrosshair ?? false
24
+ };
25
+ }
26
+ function setHidden(actions) {
27
+ const value = current();
28
+ const byAction = new Map();
29
+ for (const input of value.touchInputs)
30
+ byAction.set(input.inputAction, input);
31
+ for (const action of actions)
32
+ byAction.set(action, { inputAction: action, hide: true });
33
+ value.touchInputs = [...byAction.values()];
34
+ theComponent.createOrReplace(ROOT_ENTITY, value);
35
+ }
36
+ return {
37
+ ...theComponent,
38
+ hideAll() {
39
+ setHidden(ALL_BUTTONS);
40
+ },
41
+ showAll() {
42
+ const value = current();
43
+ value.touchInputs = [];
44
+ theComponent.createOrReplace(ROOT_ENTITY, value);
45
+ },
46
+ hide(actions) {
47
+ setHidden(actions);
48
+ },
49
+ setMainAction(action) {
50
+ const value = current();
51
+ value.mainAction = action;
52
+ theComponent.createOrReplace(ROOT_ENTITY, value);
53
+ },
54
+ hideJoystick() {
55
+ const value = current();
56
+ value.hideJoystick = true;
57
+ theComponent.createOrReplace(ROOT_ENTITY, value);
58
+ },
59
+ hideCrosshair() {
60
+ const value = current();
61
+ value.hideCrosshair = true;
62
+ theComponent.createOrReplace(ROOT_ENTITY, value);
63
+ }
64
+ };
65
+ }
@@ -21,6 +21,7 @@ import { InputModifierComponentDefinitionExtended } from './extended/InputModifi
21
21
  import { LightSourceComponentDefinitionExtended } from './extended/LightSource';
22
22
  import { TriggerAreaComponentDefinitionExtended } from './extended/TriggerArea';
23
23
  import { ParticleSystemComponentDefinitionExtended } from './extended/ParticleSystem';
24
+ import { TouchScreenControlsComponentDefinitionExtended } from './extended/TouchScreenControls';
24
25
  import { TagsComponentDefinitionExtended } from './manual/Tags';
25
26
  export * from './generated/index.gen';
26
27
  export type { GrowOnlyValueSetComponentDefinition, LastWriteWinElementSetComponentDefinition, LwwComponentGetter, GSetComponentGetter };
@@ -38,6 +39,7 @@ export declare const InputModifier: LwwComponentGetter<InputModifierComponentDef
38
39
  export declare const LightSource: LwwComponentGetter<LightSourceComponentDefinitionExtended>;
39
40
  export declare const TriggerArea: LwwComponentGetter<TriggerAreaComponentDefinitionExtended>;
40
41
  export declare const ParticleSystem: LwwComponentGetter<ParticleSystemComponentDefinitionExtended>;
42
+ export declare const TouchScreenControls: LwwComponentGetter<TouchScreenControlsComponentDefinitionExtended>;
41
43
  /**
42
44
  * @alpha
43
45
  */
@@ -17,6 +17,7 @@ import { defineInputModifierComponent } from './extended/InputModifier';
17
17
  import { defineLightSourceComponent } from './extended/LightSource';
18
18
  import { defineTriggerAreaComponent } from './extended/TriggerArea';
19
19
  import { defineParticleSystemComponent } from './extended/ParticleSystem';
20
+ import { defineTouchScreenControlsComponent } from './extended/TouchScreenControls';
20
21
  import defineTagsComponent from './manual/Tags';
21
22
  export * from './generated/index.gen';
22
23
  /* @__PURE__ */
@@ -47,6 +48,8 @@ export const LightSource = (engine) => defineLightSourceComponent(engine);
47
48
  export const TriggerArea = (engine) => defineTriggerAreaComponent(engine);
48
49
  /* @__PURE__ */
49
50
  export const ParticleSystem = (engine) => defineParticleSystemComponent(engine);
51
+ /* @__PURE__ */
52
+ export const TouchScreenControls = (engine) => defineTouchScreenControlsComponent(engine);
50
53
  /**
51
54
  * @alpha
52
55
  */
@@ -16,4 +16,5 @@ export type { INetowrkParent, INetowrkParentType } from './manual/NetworkParent'
16
16
  export type { InputModifierHelper, InputModifierComponentDefinitionExtended } from './extended/InputModifier';
17
17
  export type { LightSourceHelper, LightSourceComponentDefinitionExtended } from './extended/LightSource';
18
18
  export type { TriggerAreaComponentDefinitionExtended } from './extended/TriggerArea';
19
+ export type { TouchScreenControlsComponentDefinitionExtended } from './extended/TouchScreenControls';
19
20
  export type { ParticleSystemHelper, ParticleSystemComponentDefinitionExtended, ParticleSystemBlendMode, ParticleSystemPlaybackState } from './extended/ParticleSystem';
package/dist/index.d.ts CHANGED
@@ -15,7 +15,7 @@ export * from './systems/triggerArea';
15
15
  export * from './systems/physics';
16
16
  export * from './engine/entity';
17
17
  export * from './components/types';
18
- import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended, AudioSourceComponentDefinitionExtended, AudioAnalysisComponentDefinitionExtended, AudioStreamComponentDefinitionExtended, ISyncComponents, TweenComponentDefinitionExtended, INetowrkEntity, INetowrkParent, VirtualCameraComponentDefinitionExtended, InputModifierComponentDefinitionExtended, LightSourceComponentDefinitionExtended, TriggerAreaComponentDefinitionExtended, ParticleSystemComponentDefinitionExtended } from './components/types';
18
+ import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended, AudioSourceComponentDefinitionExtended, AudioAnalysisComponentDefinitionExtended, AudioStreamComponentDefinitionExtended, ISyncComponents, TweenComponentDefinitionExtended, INetowrkEntity, INetowrkParent, VirtualCameraComponentDefinitionExtended, InputModifierComponentDefinitionExtended, LightSourceComponentDefinitionExtended, TriggerAreaComponentDefinitionExtended, ParticleSystemComponentDefinitionExtended, TouchScreenControlsComponentDefinitionExtended } from './components/types';
19
19
  import { NameComponent } from './components/manual/Name';
20
20
  import { TagsComponentDefinitionExtended } from './components/manual/Tags';
21
21
  export declare const Transform: TransformComponentExtended;
@@ -34,6 +34,7 @@ export declare const InputModifier: InputModifierComponentDefinitionExtended;
34
34
  export declare const LightSource: LightSourceComponentDefinitionExtended;
35
35
  export declare const TriggerArea: TriggerAreaComponentDefinitionExtended;
36
36
  export declare const ParticleSystem: ParticleSystemComponentDefinitionExtended;
37
+ export declare const TouchScreenControls: TouchScreenControlsComponentDefinitionExtended;
37
38
  /**
38
39
  * @alpha
39
40
  * This is going to be used for sync components through a server.
package/dist/index.js CHANGED
@@ -39,6 +39,8 @@ export const LightSource = /* @__PURE__*/ components.LightSource(engine);
39
39
  export const TriggerArea = /* @__PURE__*/ components.TriggerArea(engine);
40
40
  export const ParticleSystem =
41
41
  /* @__PURE__*/ components.ParticleSystem(engine);
42
+ export const TouchScreenControls =
43
+ /* @__PURE__*/ components.TouchScreenControls(engine);
42
44
  /**
43
45
  * @alpha
44
46
  * This is going to be used for sync components through a server.
@@ -0,0 +1,23 @@
1
+ import { IEngine, LastWriteWinElementSetComponentDefinition } from '../../engine';
2
+ import { PBTouchScreenControls } from '../generated/index.gen';
3
+ import { InputAction } from '../generated/pb/decentraland/sdk/components/common/input_action.gen';
4
+ /**
5
+ * @public
6
+ * TouchScreenControls with convenience helpers. All helpers write the component onto the
7
+ * RootEntity (where the client reads it) and merge with the current value.
8
+ */
9
+ export interface TouchScreenControlsComponentDefinitionExtended extends LastWriteWinElementSetComponentDefinition<PBTouchScreenControls> {
10
+ /** Hide every on-screen gamepad button. */
11
+ hideAll(): void;
12
+ /** Show every on-screen gamepad button (clears the hide list). */
13
+ showAll(): void;
14
+ /** Hide the given on-screen buttons (merged into the current config). */
15
+ hide(actions: InputAction[]): void;
16
+ /** Set which action the large central button triggers. */
17
+ setMainAction(action: InputAction): void;
18
+ /** Hide the native virtual joystick. */
19
+ hideJoystick(): void;
20
+ /** Hide the on-screen crosshair / reticle. */
21
+ hideCrosshair(): void;
22
+ }
23
+ export declare function defineTouchScreenControlsComponent(engine: Pick<IEngine, 'defineComponentFromSchema'>): TouchScreenControlsComponentDefinitionExtended;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineTouchScreenControlsComponent = void 0;
4
+ const index_gen_1 = require("../generated/index.gen");
5
+ const ROOT_ENTITY = 0;
6
+ // Every on-screen gamepad action button.
7
+ const ALL_BUTTONS = [
8
+ 0 /* InputAction.IA_POINTER */,
9
+ 1 /* InputAction.IA_PRIMARY */,
10
+ 2 /* InputAction.IA_SECONDARY */,
11
+ 8 /* InputAction.IA_JUMP */,
12
+ 10 /* InputAction.IA_ACTION_3 */,
13
+ 11 /* InputAction.IA_ACTION_4 */,
14
+ 12 /* InputAction.IA_ACTION_5 */,
15
+ 13 /* InputAction.IA_ACTION_6 */
16
+ ];
17
+ function defineTouchScreenControlsComponent(engine) {
18
+ const theComponent = (0, index_gen_1.TouchScreenControls)(engine);
19
+ // A mutable copy of the current RootEntity value (or a fresh default).
20
+ function current() {
21
+ const value = theComponent.getOrNull(ROOT_ENTITY);
22
+ return {
23
+ touchInputs: value?.touchInputs ? value.touchInputs.map((t) => ({ ...t })) : [],
24
+ mainAction: value?.mainAction,
25
+ hideJoystick: value?.hideJoystick ?? false,
26
+ hideCrosshair: value?.hideCrosshair ?? false
27
+ };
28
+ }
29
+ function setHidden(actions) {
30
+ const value = current();
31
+ const byAction = new Map();
32
+ for (const input of value.touchInputs)
33
+ byAction.set(input.inputAction, input);
34
+ for (const action of actions)
35
+ byAction.set(action, { inputAction: action, hide: true });
36
+ value.touchInputs = [...byAction.values()];
37
+ theComponent.createOrReplace(ROOT_ENTITY, value);
38
+ }
39
+ return {
40
+ ...theComponent,
41
+ hideAll() {
42
+ setHidden(ALL_BUTTONS);
43
+ },
44
+ showAll() {
45
+ const value = current();
46
+ value.touchInputs = [];
47
+ theComponent.createOrReplace(ROOT_ENTITY, value);
48
+ },
49
+ hide(actions) {
50
+ setHidden(actions);
51
+ },
52
+ setMainAction(action) {
53
+ const value = current();
54
+ value.mainAction = action;
55
+ theComponent.createOrReplace(ROOT_ENTITY, value);
56
+ },
57
+ hideJoystick() {
58
+ const value = current();
59
+ value.hideJoystick = true;
60
+ theComponent.createOrReplace(ROOT_ENTITY, value);
61
+ },
62
+ hideCrosshair() {
63
+ const value = current();
64
+ value.hideCrosshair = true;
65
+ theComponent.createOrReplace(ROOT_ENTITY, value);
66
+ }
67
+ };
68
+ }
69
+ exports.defineTouchScreenControlsComponent = defineTouchScreenControlsComponent;
@@ -21,6 +21,7 @@ import { InputModifierComponentDefinitionExtended } from './extended/InputModifi
21
21
  import { LightSourceComponentDefinitionExtended } from './extended/LightSource';
22
22
  import { TriggerAreaComponentDefinitionExtended } from './extended/TriggerArea';
23
23
  import { ParticleSystemComponentDefinitionExtended } from './extended/ParticleSystem';
24
+ import { TouchScreenControlsComponentDefinitionExtended } from './extended/TouchScreenControls';
24
25
  import { TagsComponentDefinitionExtended } from './manual/Tags';
25
26
  export * from './generated/index.gen';
26
27
  export type { GrowOnlyValueSetComponentDefinition, LastWriteWinElementSetComponentDefinition, LwwComponentGetter, GSetComponentGetter };
@@ -38,6 +39,7 @@ export declare const InputModifier: LwwComponentGetter<InputModifierComponentDef
38
39
  export declare const LightSource: LwwComponentGetter<LightSourceComponentDefinitionExtended>;
39
40
  export declare const TriggerArea: LwwComponentGetter<TriggerAreaComponentDefinitionExtended>;
40
41
  export declare const ParticleSystem: LwwComponentGetter<ParticleSystemComponentDefinitionExtended>;
42
+ export declare const TouchScreenControls: LwwComponentGetter<TouchScreenControlsComponentDefinitionExtended>;
41
43
  /**
42
44
  * @alpha
43
45
  */
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.MediaState = exports.NetworkParent = exports.NetworkEntity = exports.SyncComponents = exports.Tags = exports.Name = exports.ParticleSystem = exports.TriggerArea = exports.LightSource = exports.InputModifier = exports.VirtualCamera = exports.Tween = exports.MeshCollider = exports.MeshRenderer = exports.AudioStream = exports.AudioAnalysis = exports.AudioSource = exports.Animator = exports.Material = exports.Transform = void 0;
20
+ exports.MediaState = exports.NetworkParent = exports.NetworkEntity = exports.SyncComponents = exports.Tags = exports.Name = exports.TouchScreenControls = exports.ParticleSystem = exports.TriggerArea = exports.LightSource = exports.InputModifier = exports.VirtualCamera = exports.Tween = exports.MeshCollider = exports.MeshRenderer = exports.AudioStream = exports.AudioAnalysis = exports.AudioSource = exports.Animator = exports.Material = exports.Transform = void 0;
21
21
  const Animator_1 = require("./extended/Animator");
22
22
  const AudioSource_1 = require("./extended/AudioSource");
23
23
  const AudioAnalysis_1 = require("./extended/AudioAnalysis");
@@ -38,6 +38,7 @@ const InputModifier_1 = require("./extended/InputModifier");
38
38
  const LightSource_1 = require("./extended/LightSource");
39
39
  const TriggerArea_1 = require("./extended/TriggerArea");
40
40
  const ParticleSystem_1 = require("./extended/ParticleSystem");
41
+ const TouchScreenControls_1 = require("./extended/TouchScreenControls");
41
42
  const Tags_1 = __importDefault(require("./manual/Tags"));
42
43
  __exportStar(require("./generated/index.gen"), exports);
43
44
  /* @__PURE__ */
@@ -82,6 +83,9 @@ exports.TriggerArea = TriggerArea;
82
83
  /* @__PURE__ */
83
84
  const ParticleSystem = (engine) => (0, ParticleSystem_1.defineParticleSystemComponent)(engine);
84
85
  exports.ParticleSystem = ParticleSystem;
86
+ /* @__PURE__ */
87
+ const TouchScreenControls = (engine) => (0, TouchScreenControls_1.defineTouchScreenControlsComponent)(engine);
88
+ exports.TouchScreenControls = TouchScreenControls;
85
89
  /**
86
90
  * @alpha
87
91
  */
@@ -16,4 +16,5 @@ export type { INetowrkParent, INetowrkParentType } from './manual/NetworkParent'
16
16
  export type { InputModifierHelper, InputModifierComponentDefinitionExtended } from './extended/InputModifier';
17
17
  export type { LightSourceHelper, LightSourceComponentDefinitionExtended } from './extended/LightSource';
18
18
  export type { TriggerAreaComponentDefinitionExtended } from './extended/TriggerArea';
19
+ export type { TouchScreenControlsComponentDefinitionExtended } from './extended/TouchScreenControls';
19
20
  export type { ParticleSystemHelper, ParticleSystemComponentDefinitionExtended, ParticleSystemBlendMode, ParticleSystemPlaybackState } from './extended/ParticleSystem';
@@ -15,7 +15,7 @@ export * from './systems/triggerArea';
15
15
  export * from './systems/physics';
16
16
  export * from './engine/entity';
17
17
  export * from './components/types';
18
- import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended, AudioSourceComponentDefinitionExtended, AudioAnalysisComponentDefinitionExtended, AudioStreamComponentDefinitionExtended, ISyncComponents, TweenComponentDefinitionExtended, INetowrkEntity, INetowrkParent, VirtualCameraComponentDefinitionExtended, InputModifierComponentDefinitionExtended, LightSourceComponentDefinitionExtended, TriggerAreaComponentDefinitionExtended, ParticleSystemComponentDefinitionExtended } from './components/types';
18
+ import { MaterialComponentDefinitionExtended, MeshColliderComponentDefinitionExtended, MeshRendererComponentDefinitionExtended, TransformComponentExtended, AnimatorComponentDefinitionExtended, AudioSourceComponentDefinitionExtended, AudioAnalysisComponentDefinitionExtended, AudioStreamComponentDefinitionExtended, ISyncComponents, TweenComponentDefinitionExtended, INetowrkEntity, INetowrkParent, VirtualCameraComponentDefinitionExtended, InputModifierComponentDefinitionExtended, LightSourceComponentDefinitionExtended, TriggerAreaComponentDefinitionExtended, ParticleSystemComponentDefinitionExtended, TouchScreenControlsComponentDefinitionExtended } from './components/types';
19
19
  import { NameComponent } from './components/manual/Name';
20
20
  import { TagsComponentDefinitionExtended } from './components/manual/Tags';
21
21
  export declare const Transform: TransformComponentExtended;
@@ -34,6 +34,7 @@ export declare const InputModifier: InputModifierComponentDefinitionExtended;
34
34
  export declare const LightSource: LightSourceComponentDefinitionExtended;
35
35
  export declare const TriggerArea: TriggerAreaComponentDefinitionExtended;
36
36
  export declare const ParticleSystem: ParticleSystemComponentDefinitionExtended;
37
+ export declare const TouchScreenControls: TouchScreenControlsComponentDefinitionExtended;
37
38
  /**
38
39
  * @alpha
39
40
  * This is going to be used for sync components through a server.
package/dist-cjs/index.js CHANGED
@@ -26,7 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
26
26
  return result;
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.NetworkParent = exports.NetworkEntity = exports.SyncComponents = exports.ParticleSystem = exports.TriggerArea = exports.LightSource = exports.InputModifier = exports.VirtualCamera = exports.Tween = exports.Tags = exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Material = exports.AudioStream = exports.AudioAnalysis = exports.AudioSource = exports.Animator = exports.Transform = exports.components = exports.cyclicParentingChecker = void 0;
29
+ exports.NetworkParent = exports.NetworkEntity = exports.SyncComponents = exports.TouchScreenControls = exports.ParticleSystem = exports.TriggerArea = exports.LightSource = exports.InputModifier = exports.VirtualCamera = exports.Tween = exports.Tags = exports.Name = exports.MeshCollider = exports.MeshRenderer = exports.Material = exports.AudioStream = exports.AudioAnalysis = exports.AudioSource = exports.Animator = exports.Transform = exports.components = exports.cyclicParentingChecker = void 0;
30
30
  // The order of the following imports matters. Please do not auto-sort
31
31
  __exportStar(require("./engine"), exports);
32
32
  __exportStar(require("./schemas"), exports);
@@ -68,6 +68,8 @@ exports.LightSource = components.LightSource(initialization_1.engine);
68
68
  exports.TriggerArea = components.TriggerArea(initialization_1.engine);
69
69
  exports.ParticleSystem =
70
70
  /* @__PURE__*/ components.ParticleSystem(initialization_1.engine);
71
+ exports.TouchScreenControls =
72
+ /* @__PURE__*/ components.TouchScreenControls(initialization_1.engine);
71
73
  /**
72
74
  * @alpha
73
75
  * This is going to be used for sync components through a server.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dcl/ecs",
3
3
  "description": "Decentraland ECS",
4
- "version": "7.25.1-30391610123.commit-26cb925",
4
+ "version": "7.25.1-30540108605.commit-82368ee",
5
5
  "author": "DCL",
6
6
  "bugs": "https://github.com/decentraland/ecs/issues",
7
7
  "files": [
@@ -34,5 +34,5 @@
34
34
  "dependencies": {},
35
35
  "types": "./dist/index.d.ts",
36
36
  "typings": "./dist/index.d.ts",
37
- "commit": "26cb92516659d446b74945096eb4b7b48b7f06b1"
37
+ "commit": "82368ee4b5e23d192034e6880c9848a48515fc1e"
38
38
  }