@urso/core 0.1.95 → 0.2.3-dev

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 (144) hide show
  1. package/.babelrc +11 -11
  2. package/README.md +10 -10
  3. package/build/js/index.js +1 -1
  4. package/build/js/index.js.LICENSE.txt +33 -33
  5. package/package.json +49 -49
  6. package/src/js/app.js +76 -76
  7. package/src/js/components/_info.js +8 -8
  8. package/src/js/components/base/_info.js +3 -3
  9. package/src/js/components/base/controller.js +78 -78
  10. package/src/js/components/debug/_info.js +6 -6
  11. package/src/js/components/debug/controller.js +38 -38
  12. package/src/js/components/debug/coords.js +23 -23
  13. package/src/js/components/debug/fps.js +34 -34
  14. package/src/js/components/debug/template.js +33 -33
  15. package/src/js/components/deviceRotate/_info.js +3 -3
  16. package/src/js/components/deviceRotate/controller.js +86 -86
  17. package/src/js/components/fullscreen/_info.js +6 -6
  18. package/src/js/components/fullscreen/android.js +104 -104
  19. package/src/js/components/fullscreen/controller.js +64 -64
  20. package/src/js/components/fullscreen/desktop.js +49 -49
  21. package/src/js/components/fullscreen/ios.js +111 -111
  22. package/src/js/components/loader/_info.js +4 -4
  23. package/src/js/components/loader/controller.js +66 -66
  24. package/src/js/components/loader/template.js +70 -70
  25. package/src/js/components/soundInitialPopup/_info.js +3 -3
  26. package/src/js/components/soundInitialPopup/controller.js +42 -42
  27. package/src/js/components/soundInitialPopup/template.js +109 -109
  28. package/src/js/components/stateDriven/_info.js +4 -3
  29. package/src/js/components/stateDriven/actionConfig.js +7 -0
  30. package/src/js/components/stateDriven/controller.js +96 -52
  31. package/src/js/config/load.js +5 -5
  32. package/src/js/config/main.js +9 -9
  33. package/src/js/extra/_info.js +22 -22
  34. package/src/js/extra/browserEvents.js +32 -32
  35. package/src/js/index.js +8 -8
  36. package/src/js/lib/_info.js +13 -13
  37. package/src/js/lib/cache.js +98 -98
  38. package/src/js/lib/composition.js +89 -89
  39. package/src/js/lib/device.js +1276 -1276
  40. package/src/js/lib/helper.js +513 -513
  41. package/src/js/lib/loader.js +121 -121
  42. package/src/js/lib/localData.js +15 -15
  43. package/src/js/lib/logger.js +22 -22
  44. package/src/js/lib/math.js +20 -20
  45. package/src/js/lib/objectPool.js +54 -54
  46. package/src/js/lib/time.js +18 -18
  47. package/src/js/lib/tween.js +147 -147
  48. package/src/js/modules/_info.js +11 -11
  49. package/src/js/modules/assets/_info.js +7 -7
  50. package/src/js/modules/assets/baseModel.js +18 -18
  51. package/src/js/modules/assets/config.js +35 -35
  52. package/src/js/modules/assets/controller.js +37 -37
  53. package/src/js/modules/assets/models/_info.js +12 -12
  54. package/src/js/modules/assets/models/atlas.js +8 -8
  55. package/src/js/modules/assets/models/audiosprite.js +27 -27
  56. package/src/js/modules/assets/models/bitmapFont.js +8 -8
  57. package/src/js/modules/assets/models/container.js +16 -16
  58. package/src/js/modules/assets/models/dragonBones.js +26 -26
  59. package/src/js/modules/assets/models/font.js +8 -8
  60. package/src/js/modules/assets/models/image.js +14 -14
  61. package/src/js/modules/assets/models/json.js +8 -8
  62. package/src/js/modules/assets/models/sound.js +14 -14
  63. package/src/js/modules/assets/models/spine.js +8 -8
  64. package/src/js/modules/assets/service.js +330 -330
  65. package/src/js/modules/instances/_info.js +3 -3
  66. package/src/js/modules/instances/controller.js +218 -218
  67. package/src/js/modules/logic/_info.js +5 -5
  68. package/src/js/modules/logic/buttons.js +120 -120
  69. package/src/js/modules/logic/config/_info.js +3 -3
  70. package/src/js/modules/logic/config/buttons.js +63 -63
  71. package/src/js/modules/logic/config/sounds.js +23 -23
  72. package/src/js/modules/logic/controller.js +48 -48
  73. package/src/js/modules/logic/sounds.js +96 -96
  74. package/src/js/modules/objects/_info.js +11 -11
  75. package/src/js/modules/objects/baseModel.js +161 -161
  76. package/src/js/modules/objects/cache.js +99 -99
  77. package/src/js/modules/objects/controller.js +115 -115
  78. package/src/js/modules/objects/create.js +231 -231
  79. package/src/js/modules/objects/find.js +140 -140
  80. package/src/js/modules/objects/models/_info.js +20 -20
  81. package/src/js/modules/objects/models/atlasImage.js +50 -50
  82. package/src/js/modules/objects/models/bitmapText.js +23 -23
  83. package/src/js/modules/objects/models/button.js +184 -184
  84. package/src/js/modules/objects/models/buttonComposite.js +35 -35
  85. package/src/js/modules/objects/models/collection.js +54 -54
  86. package/src/js/modules/objects/models/component.js +44 -44
  87. package/src/js/modules/objects/models/container.js +19 -19
  88. package/src/js/modules/objects/models/dragonBones.js +250 -250
  89. package/src/js/modules/objects/models/emitter.js +54 -54
  90. package/src/js/modules/objects/models/graphics.js +38 -38
  91. package/src/js/modules/objects/models/group.js +19 -19
  92. package/src/js/modules/objects/models/hitArea.js +104 -104
  93. package/src/js/modules/objects/models/image.js +34 -34
  94. package/src/js/modules/objects/models/imagesAnimation.js +113 -113
  95. package/src/js/modules/objects/models/mask.js +38 -38
  96. package/src/js/modules/objects/models/spine.js +83 -83
  97. package/src/js/modules/objects/models/text.js +38 -38
  98. package/src/js/modules/objects/models/world.js +19 -19
  99. package/src/js/modules/objects/propertyAdapter.js +416 -416
  100. package/src/js/modules/objects/proxy.js +179 -179
  101. package/src/js/modules/objects/styles.js +116 -116
  102. package/src/js/modules/observer/_info.js +4 -4
  103. package/src/js/modules/observer/controller.js +99 -99
  104. package/src/js/modules/observer/events.js +28 -28
  105. package/src/js/modules/scenes/_info.js +8 -8
  106. package/src/js/modules/scenes/controller.js +34 -34
  107. package/src/js/modules/scenes/model.js +35 -35
  108. package/src/js/modules/scenes/pixiWrapper.js +194 -194
  109. package/src/js/modules/scenes/resolutions.js +161 -161
  110. package/src/js/modules/scenes/resolutionsConfig.js +73 -73
  111. package/src/js/modules/scenes/service.js +84 -84
  112. package/src/js/modules/soundManager/_info.js +3 -3
  113. package/src/js/modules/soundManager/controller.js +99 -99
  114. package/src/js/modules/soundManager/soundSprite.js +202 -202
  115. package/src/js/modules/statesManager/_info.js +12 -12
  116. package/src/js/modules/statesManager/action.js +55 -113
  117. package/src/js/modules/statesManager/actions/_info.js +3 -3
  118. package/src/js/modules/statesManager/all.js +23 -23
  119. package/src/js/modules/statesManager/configStates.js +71 -86
  120. package/src/js/modules/statesManager/controller.js +132 -91
  121. package/src/js/modules/statesManager/functionsStorage.js +83 -0
  122. package/src/js/modules/statesManager/helper.js +27 -37
  123. package/src/js/modules/statesManager/race.js +75 -80
  124. package/src/js/modules/statesManager/sequence.js +47 -47
  125. package/src/js/modules/template/_info.js +6 -6
  126. package/src/js/modules/template/controller.js +28 -28
  127. package/src/js/modules/template/model.js +11 -11
  128. package/src/js/modules/template/service.js +125 -125
  129. package/src/js/modules/template/types.js +41 -41
  130. package/src/js/modules/transport/_info.js +8 -8
  131. package/src/js/modules/transport/baseConnectionType.js +24 -24
  132. package/src/js/modules/transport/config.js +22 -22
  133. package/src/js/modules/transport/connectionTypes/_info.js +3 -3
  134. package/src/js/modules/transport/connectionTypes/websocket.js +74 -74
  135. package/src/js/modules/transport/connectionTypes/xhr.js +41 -41
  136. package/src/js/modules/transport/controller.js +48 -48
  137. package/src/js/modules/transport/decorator.js +16 -16
  138. package/src/js/modules/transport/service.js +138 -138
  139. package/src/js/templates/_info.js +4 -4
  140. package/src/js/templates/groups/_info.js +1 -1
  141. package/src/js/templates/scenes/_info.js +1 -1
  142. package/webpack.config.js +47 -47
  143. package/src/js/modules/statesManager/actionModel.js +0 -48
  144. package/src/js/modules/statesManager/configActions.js +0 -54
@@ -1,22 +1,22 @@
1
- import * as PIXI from 'pixi.js';
2
- window.PIXI = PIXI;
3
- window.PIXI.particles = require('pixi-particles');
4
-
5
- import { DropShadowFilter } from '@pixi/filter-drop-shadow';
6
- PIXI.filters['DropShadowFilter'] = DropShadowFilter;
7
-
8
-
9
- require("pixi-spine");
10
- require("pixi-projection");
11
-
12
- Urso.DragonBones = require("pixi5-dragonbones");
13
-
14
- import { gsap } from 'gsap';
15
- window.gsap = gsap;
16
-
17
- import Howler from 'howler';
18
- window.Howler = Howler;
19
-
20
- Urso.Core.Extra = {
21
- BrowserEvents: require('./browserEvents.js')
22
- };
1
+ import * as PIXI from 'pixi.js';
2
+ window.PIXI = PIXI;
3
+ window.PIXI.particles = require('pixi-particles');
4
+
5
+ import { DropShadowFilter } from '@pixi/filter-drop-shadow';
6
+ PIXI.filters['DropShadowFilter'] = DropShadowFilter;
7
+
8
+
9
+ require("pixi-spine");
10
+ require("pixi-projection");
11
+
12
+ Urso.DragonBones = require("pixi5-dragonbones");
13
+
14
+ import { gsap } from 'gsap';
15
+ window.gsap = gsap;
16
+
17
+ import Howler from 'howler';
18
+ window.Howler = Howler;
19
+
20
+ Urso.Core.Extra = {
21
+ BrowserEvents: require('./browserEvents.js')
22
+ };
@@ -1,32 +1,32 @@
1
- class ExtraBrowserEvents {
2
- constructor() {
3
- this.singleton = true;
4
-
5
- this.RESIZE_DELAY = 250; //delay for resize event (browser will refresh his own params)
6
-
7
- this.resizeHandler = this.resizeHandler.bind(this);
8
- this.visibilitychangeHandler = this.visibilitychangeHandler.bind(this);
9
-
10
- this.init();
11
- }
12
-
13
- init() {
14
- document.addEventListener("visibilitychange", this.visibilitychangeHandler);
15
-
16
- window.addEventListener('resize', this.resizeHandler);
17
- window.addEventListener('orientationchange', this.resizeHandler);
18
- document.addEventListener('fullscreenchange', this.resizeHandler);
19
- document.addEventListener('webkitfullscreenchange', this.resizeHandler);
20
- document.addEventListener('mozfullscreenchange', this.resizeHandler);
21
- }
22
-
23
- visibilitychangeHandler() {
24
- this.emit(Urso.events.EXTRA_BROWSEREVENTS_WINDOW_VISIBILITYCHANGE, document.visibilityState);
25
- }
26
-
27
- resizeHandler() {
28
- this.emit(Urso.events.EXTRA_BROWSEREVENTS_WINDOW_RESIZE, false, this.RESIZE_DELAY);
29
- }
30
- }
31
-
32
- module.exports = ExtraBrowserEvents;
1
+ class ExtraBrowserEvents {
2
+ constructor() {
3
+ this.singleton = true;
4
+
5
+ this.RESIZE_DELAY = 250; //delay for resize event (browser will refresh his own params)
6
+
7
+ this.resizeHandler = this.resizeHandler.bind(this);
8
+ this.visibilitychangeHandler = this.visibilitychangeHandler.bind(this);
9
+
10
+ this.init();
11
+ }
12
+
13
+ init() {
14
+ document.addEventListener("visibilitychange", this.visibilitychangeHandler);
15
+
16
+ window.addEventListener('resize', this.resizeHandler);
17
+ window.addEventListener('orientationchange', this.resizeHandler);
18
+ document.addEventListener('fullscreenchange', this.resizeHandler);
19
+ document.addEventListener('webkitfullscreenchange', this.resizeHandler);
20
+ document.addEventListener('mozfullscreenchange', this.resizeHandler);
21
+ }
22
+
23
+ visibilitychangeHandler() {
24
+ this.emit(Urso.events.EXTRA_BROWSEREVENTS_WINDOW_VISIBILITYCHANGE, document.visibilityState);
25
+ }
26
+
27
+ resizeHandler() {
28
+ this.emit(Urso.events.EXTRA_BROWSEREVENTS_WINDOW_RESIZE, false, this.RESIZE_DELAY);
29
+ }
30
+ }
31
+
32
+ module.exports = ExtraBrowserEvents;
package/src/js/index.js CHANGED
@@ -1,8 +1,8 @@
1
- window.Urso = { Core: {} };
2
-
3
- require('./config/load.js');
4
- Urso.config = require('./config/main.js');
5
- Urso.Core.App = require('./app.js');
6
-
7
- //function to run game with engine
8
- Urso.runGame = (new Urso.Core.App()).setup;
1
+ window.Urso = { Core: {} };
2
+
3
+ require('./config/load.js');
4
+ Urso.config = require('./config/main.js');
5
+ Urso.Core.App = require('./app.js');
6
+
7
+ //function to run game with engine
8
+ Urso.runGame = (new Urso.Core.App()).setup;
@@ -1,13 +1,13 @@
1
- Urso.Core.Lib = {
2
- Cache: require('./cache.js'),
3
- Composition: require('./composition.js'),
4
- Device: require('./device.js'),
5
- Helper: require('./helper.js'),
6
- Loader: require('./loader.js'),
7
- LocalData: require('./localData.js'),
8
- Logger: require('./logger.js'),
9
- Math: require('./math.js'),
10
- ObjectPool: require('./objectPool.js'),
11
- Time: require('./time.js'),
12
- Tween: require('./tween.js')
13
- };
1
+ Urso.Core.Lib = {
2
+ Cache: require('./cache.js'),
3
+ Composition: require('./composition.js'),
4
+ Device: require('./device.js'),
5
+ Helper: require('./helper.js'),
6
+ Loader: require('./loader.js'),
7
+ LocalData: require('./localData.js'),
8
+ Logger: require('./logger.js'),
9
+ Math: require('./math.js'),
10
+ ObjectPool: require('./objectPool.js'),
11
+ Time: require('./time.js'),
12
+ Tween: require('./tween.js')
13
+ };
@@ -1,98 +1,98 @@
1
- class LibCache {
2
- constructor() {
3
- this.assetsList = {
4
- image: {},
5
- atlas: {},
6
- json: {},
7
- binary: {},
8
- spine: {},
9
- bitmapFont: {},
10
- sound: {},
11
- texture: {},
12
- file: {}
13
- };
14
- };
15
-
16
- addFile(key, someData) {
17
- this.assetsList.file[key] = someData;
18
- };
19
-
20
- addAtlas(key, someData) {
21
- this.assetsList.atlas[key] = someData;
22
- };
23
-
24
- addBinary(key, someData) {
25
- this.assetsList.binary[key] = someData;
26
- };
27
-
28
- addBitmapFont(key, someData) {
29
- this.assetsList.bitmapFont[key] = someData;
30
- };
31
-
32
- addContainer(key, someData) {
33
- this.assetsList.container[key] = someData;
34
- };
35
-
36
- addImage(key, someData) {
37
- this.assetsList.image[key] = someData;
38
- };
39
-
40
- addJson(key, someData) {
41
- this.assetsList.json[key] = someData;
42
- };
43
-
44
- addSound(key, someData) {
45
- this.assetsList.sound[key] = someData;
46
- };
47
-
48
- addTexture(key, someData) {
49
- this.assetsList.texture[key] = someData;
50
- };
51
-
52
- addSpine(key, someData) {
53
- this.assetsList.spine[key] = someData;
54
- };
55
-
56
- getFile(key) {
57
- return this.assetsList.file[key];
58
- };
59
-
60
- getAtlas(key) {
61
- return this.assetsList.atlas[key];
62
- };
63
-
64
- getBinary(key) {
65
- return this.assetsList.binary[key];
66
- };
67
-
68
- getBitmapFont(key) {
69
- return this.assetsList.bitmapFont[key];
70
- };
71
-
72
- getContainer(key) {
73
- return this.assetsList.container[key];
74
- };
75
-
76
- getImage(key) {
77
- return this.assetsList.image[key];
78
- };
79
-
80
- getJson(key) {
81
- return this.assetsList.json[key];
82
- };
83
-
84
- getSound(key) {
85
- return this.assetsList.sound[key];
86
- };
87
-
88
- getSpine(key) {
89
- return this.assetsList.spine[key];
90
- };
91
-
92
- getTexture(key) {
93
- return this.assetsList.texture[key];
94
- };
95
-
96
- };
97
-
98
- module.exports = LibCache;
1
+ class LibCache {
2
+ constructor() {
3
+ this.assetsList = {
4
+ image: {},
5
+ atlas: {},
6
+ json: {},
7
+ binary: {},
8
+ spine: {},
9
+ bitmapFont: {},
10
+ sound: {},
11
+ texture: {},
12
+ file: {}
13
+ };
14
+ };
15
+
16
+ addFile(key, someData) {
17
+ this.assetsList.file[key] = someData;
18
+ };
19
+
20
+ addAtlas(key, someData) {
21
+ this.assetsList.atlas[key] = someData;
22
+ };
23
+
24
+ addBinary(key, someData) {
25
+ this.assetsList.binary[key] = someData;
26
+ };
27
+
28
+ addBitmapFont(key, someData) {
29
+ this.assetsList.bitmapFont[key] = someData;
30
+ };
31
+
32
+ addContainer(key, someData) {
33
+ this.assetsList.container[key] = someData;
34
+ };
35
+
36
+ addImage(key, someData) {
37
+ this.assetsList.image[key] = someData;
38
+ };
39
+
40
+ addJson(key, someData) {
41
+ this.assetsList.json[key] = someData;
42
+ };
43
+
44
+ addSound(key, someData) {
45
+ this.assetsList.sound[key] = someData;
46
+ };
47
+
48
+ addTexture(key, someData) {
49
+ this.assetsList.texture[key] = someData;
50
+ };
51
+
52
+ addSpine(key, someData) {
53
+ this.assetsList.spine[key] = someData;
54
+ };
55
+
56
+ getFile(key) {
57
+ return this.assetsList.file[key];
58
+ };
59
+
60
+ getAtlas(key) {
61
+ return this.assetsList.atlas[key];
62
+ };
63
+
64
+ getBinary(key) {
65
+ return this.assetsList.binary[key];
66
+ };
67
+
68
+ getBitmapFont(key) {
69
+ return this.assetsList.bitmapFont[key];
70
+ };
71
+
72
+ getContainer(key) {
73
+ return this.assetsList.container[key];
74
+ };
75
+
76
+ getImage(key) {
77
+ return this.assetsList.image[key];
78
+ };
79
+
80
+ getJson(key) {
81
+ return this.assetsList.json[key];
82
+ };
83
+
84
+ getSound(key) {
85
+ return this.assetsList.sound[key];
86
+ };
87
+
88
+ getSpine(key) {
89
+ return this.assetsList.spine[key];
90
+ };
91
+
92
+ getTexture(key) {
93
+ return this.assetsList.texture[key];
94
+ };
95
+
96
+ };
97
+
98
+ module.exports = LibCache;
@@ -1,89 +1,89 @@
1
- // Class for creating multi inheritance.
2
- class LibComposition
3
- {
4
- // Inherit method to create base classes.
5
- static inherit(..._bases)
6
- {
7
- class classes {
8
-
9
- // The base classes
10
- get base() { return _bases; }
11
-
12
- constructor(..._args)
13
- {
14
- let index = 0;
15
-
16
- for (let b of this.base)
17
- {
18
- let obj = new b(_args[index++]);
19
- LibComposition.copy(this, obj);
20
- }
21
- }
22
-
23
- }
24
-
25
- // Copy over properties and methods
26
- for (let base of _bases)
27
- {
28
- LibComposition.copy(classes, base);
29
- LibComposition.copy(classes.prototype, base.prototype);
30
- }
31
-
32
- return classes;
33
- }
34
-
35
- // Copies the properties from one class to another
36
- static copy(_target, _source)
37
- {
38
- for (let key of Reflect.ownKeys(_source))
39
- {
40
- if (key !== "constructor" && key !== "prototype" && key !== "name")
41
- {
42
- let desc = Object.getOwnPropertyDescriptor(_source, key);
43
- Object.defineProperty(_target, key, desc);
44
- }
45
- }
46
- }
47
- }
48
-
49
- module.exports = LibComposition;
50
-
51
-
52
- /**
53
- *
54
- example:
55
-
56
-
57
- class ages
58
- {
59
- constructor(_age) { this.age = _age; }
60
- set age(_a) { this._age = _a; }
61
- get age() { return this._age; }
62
- increase() { this.age++; }
63
- }
64
-
65
- class genders
66
- {
67
- constructor(_gender) { this.gender = _gender; }
68
- set gender(_g) { this._gender = _g; }
69
- get gender() { return this._gender; }
70
- male() { this._gender = 'M'; }
71
- female() { this._gender = 'F'; }
72
- }
73
-
74
- class person extends Urso.Game.Lib.Composition.inherit(ages, genders)
75
- {
76
- constructor(...args)
77
- {
78
- super(18, 'M');
79
- this.name = args[0];
80
- }
81
-
82
- set name(_n) { this._name = _n; }
83
- get name() { return this._name; }
84
- }
85
-
86
- let p = new person('Adam');
87
- console.log(p.name, p.age, p.gender);
88
-
89
- */
1
+ // Class for creating multi inheritance.
2
+ class LibComposition
3
+ {
4
+ // Inherit method to create base classes.
5
+ static inherit(..._bases)
6
+ {
7
+ class classes {
8
+
9
+ // The base classes
10
+ get base() { return _bases; }
11
+
12
+ constructor(..._args)
13
+ {
14
+ let index = 0;
15
+
16
+ for (let b of this.base)
17
+ {
18
+ let obj = new b(_args[index++]);
19
+ LibComposition.copy(this, obj);
20
+ }
21
+ }
22
+
23
+ }
24
+
25
+ // Copy over properties and methods
26
+ for (let base of _bases)
27
+ {
28
+ LibComposition.copy(classes, base);
29
+ LibComposition.copy(classes.prototype, base.prototype);
30
+ }
31
+
32
+ return classes;
33
+ }
34
+
35
+ // Copies the properties from one class to another
36
+ static copy(_target, _source)
37
+ {
38
+ for (let key of Reflect.ownKeys(_source))
39
+ {
40
+ if (key !== "constructor" && key !== "prototype" && key !== "name")
41
+ {
42
+ let desc = Object.getOwnPropertyDescriptor(_source, key);
43
+ Object.defineProperty(_target, key, desc);
44
+ }
45
+ }
46
+ }
47
+ }
48
+
49
+ module.exports = LibComposition;
50
+
51
+
52
+ /**
53
+ *
54
+ example:
55
+
56
+
57
+ class ages
58
+ {
59
+ constructor(_age) { this.age = _age; }
60
+ set age(_a) { this._age = _a; }
61
+ get age() { return this._age; }
62
+ increase() { this.age++; }
63
+ }
64
+
65
+ class genders
66
+ {
67
+ constructor(_gender) { this.gender = _gender; }
68
+ set gender(_g) { this._gender = _g; }
69
+ get gender() { return this._gender; }
70
+ male() { this._gender = 'M'; }
71
+ female() { this._gender = 'F'; }
72
+ }
73
+
74
+ class person extends Urso.Game.Lib.Composition.inherit(ages, genders)
75
+ {
76
+ constructor(...args)
77
+ {
78
+ super(18, 'M');
79
+ this.name = args[0];
80
+ }
81
+
82
+ set name(_n) { this._name = _n; }
83
+ get name() { return this._name; }
84
+ }
85
+
86
+ let p = new person('Adam');
87
+ console.log(p.name, p.age, p.gender);
88
+
89
+ */