@univerjs-pro/collaboration-client-ui 0.25.1 → 1.0.0-alpha.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.
Files changed (99) hide show
  1. package/lib/cjs/facade.js +1 -1
  2. package/lib/cjs/index.js +1 -1
  3. package/lib/cjs/locale/ar-SA.js +1 -1
  4. package/lib/cjs/locale/ca-ES.js +1 -1
  5. package/lib/cjs/locale/de-DE.js +1 -1
  6. package/lib/cjs/locale/en-US.js +1 -1
  7. package/lib/cjs/locale/es-ES.js +1 -1
  8. package/lib/cjs/locale/fa-IR.js +1 -1
  9. package/lib/cjs/locale/fr-FR.js +1 -1
  10. package/lib/cjs/locale/id-ID.js +1 -1
  11. package/lib/cjs/locale/it-IT.js +1 -1
  12. package/lib/cjs/locale/ja-JP.js +1 -1
  13. package/lib/cjs/locale/ko-KR.js +1 -1
  14. package/lib/cjs/locale/pl-PL.js +1 -1
  15. package/lib/cjs/locale/pt-BR.js +1 -1
  16. package/lib/cjs/locale/ru-RU.js +1 -1
  17. package/lib/cjs/locale/sk-SK.js +1 -1
  18. package/lib/cjs/locale/vi-VN.js +1 -1
  19. package/lib/cjs/locale/zh-CN.js +1 -1
  20. package/lib/cjs/locale/zh-HK.js +1 -1
  21. package/lib/cjs/locale/zh-TW.js +1 -1
  22. package/lib/es/facade.js +1 -1
  23. package/lib/es/index.js +1 -1
  24. package/lib/es/locale/ar-SA.js +1 -1
  25. package/lib/es/locale/ca-ES.js +1 -1
  26. package/lib/es/locale/de-DE.js +1 -1
  27. package/lib/es/locale/en-US.js +1 -1
  28. package/lib/es/locale/es-ES.js +1 -1
  29. package/lib/es/locale/fa-IR.js +1 -1
  30. package/lib/es/locale/fr-FR.js +1 -1
  31. package/lib/es/locale/id-ID.js +1 -1
  32. package/lib/es/locale/it-IT.js +1 -1
  33. package/lib/es/locale/ja-JP.js +1 -1
  34. package/lib/es/locale/ko-KR.js +1 -1
  35. package/lib/es/locale/pl-PL.js +1 -1
  36. package/lib/es/locale/pt-BR.js +1 -1
  37. package/lib/es/locale/ru-RU.js +1 -1
  38. package/lib/es/locale/sk-SK.js +1 -1
  39. package/lib/es/locale/vi-VN.js +1 -1
  40. package/lib/es/locale/zh-CN.js +1 -1
  41. package/lib/es/locale/zh-HK.js +1 -1
  42. package/lib/es/locale/zh-TW.js +1 -1
  43. package/lib/facade.js +1 -1
  44. package/lib/index.css +6 -6
  45. package/lib/index.js +1 -1
  46. package/lib/locale/ar-SA.js +1 -1
  47. package/lib/locale/ca-ES.js +1 -1
  48. package/lib/locale/de-DE.js +1 -1
  49. package/lib/locale/en-US.js +1 -1
  50. package/lib/locale/es-ES.js +1 -1
  51. package/lib/locale/fa-IR.js +1 -1
  52. package/lib/locale/fr-FR.js +1 -1
  53. package/lib/locale/id-ID.js +1 -1
  54. package/lib/locale/it-IT.js +1 -1
  55. package/lib/locale/ja-JP.js +1 -1
  56. package/lib/locale/ko-KR.js +1 -1
  57. package/lib/locale/pl-PL.js +1 -1
  58. package/lib/locale/pt-BR.js +1 -1
  59. package/lib/locale/ru-RU.js +1 -1
  60. package/lib/locale/sk-SK.js +1 -1
  61. package/lib/locale/vi-VN.js +1 -1
  62. package/lib/locale/zh-CN.js +1 -1
  63. package/lib/locale/zh-HK.js +1 -1
  64. package/lib/locale/zh-TW.js +1 -1
  65. package/lib/types/{controllers/config.schema.d.ts → config/config.d.ts} +8 -0
  66. package/lib/types/controllers/collab-cursor/collab-cursor.controller.d.ts +3 -2
  67. package/lib/types/controllers/collab-cursor/slide-collab-cursor-entity.d.ts +34 -0
  68. package/lib/types/controllers/collab-cursor/slide-collab-cursor-render.controller.d.ts +21 -0
  69. package/lib/types/controllers/entity-ui/collaboration-entity-ui.controller.d.ts +1 -3
  70. package/lib/types/index.d.ts +3 -2
  71. package/lib/types/locale/types.d.ts +3 -0
  72. package/lib/types/models/cursor.d.ts +23 -0
  73. package/lib/types/plugin.d.ts +1 -1
  74. package/lib/types/services/local-cache/web-local-cache.service.d.ts +1 -0
  75. package/lib/types/services/state-cache-transform/doc-transform-state-cache.service.d.ts +1 -1
  76. package/lib/types/views/components/CollabStatus.d.ts +1 -1
  77. package/lib/types/views/shapes/slide-collab-cursor.shape.d.ts +15 -0
  78. package/lib/umd/facade.js +1 -1
  79. package/lib/umd/index.js +1 -1
  80. package/lib/umd/locale/ar-SA.js +1 -1
  81. package/lib/umd/locale/ca-ES.js +1 -1
  82. package/lib/umd/locale/de-DE.js +1 -1
  83. package/lib/umd/locale/en-US.js +1 -1
  84. package/lib/umd/locale/es-ES.js +1 -1
  85. package/lib/umd/locale/fa-IR.js +1 -1
  86. package/lib/umd/locale/fr-FR.js +1 -1
  87. package/lib/umd/locale/id-ID.js +1 -1
  88. package/lib/umd/locale/it-IT.js +1 -1
  89. package/lib/umd/locale/ja-JP.js +1 -1
  90. package/lib/umd/locale/ko-KR.js +1 -1
  91. package/lib/umd/locale/pl-PL.js +1 -1
  92. package/lib/umd/locale/pt-BR.js +1 -1
  93. package/lib/umd/locale/ru-RU.js +1 -1
  94. package/lib/umd/locale/sk-SK.js +1 -1
  95. package/lib/umd/locale/vi-VN.js +1 -1
  96. package/lib/umd/locale/zh-CN.js +1 -1
  97. package/lib/umd/locale/zh-HK.js +1 -1
  98. package/lib/umd/locale/zh-TW.js +1 -1
  99. package/package.json +23 -21
@@ -1,5 +1,5 @@
1
1
  import type { Observable } from 'rxjs';
2
- import type { IDocCollabCursor, ISheetCollabCursor } from '../../models/cursor';
2
+ import type { IDocCollabCursor, ISheetCollabCursor, ISlideCollabCursor } from '../../models/cursor';
3
3
  import { CollaborationSessionService } from '@univerjs-pro/collaboration-client';
4
4
  import { Injector, IUniverInstanceService, RxDisposable } from '@univerjs/core';
5
5
  /**
@@ -15,8 +15,9 @@ export declare class CollabCursorController extends RxDisposable {
15
15
  private readonly _entityInit$;
16
16
  constructor(_univerInstanceService: IUniverInstanceService, _injector: Injector, _collabSessionService: CollaborationSessionService);
17
17
  dispose(): void;
18
- getCollabCursors$(unitID: string): Observable<Map<string, ISheetCollabCursor> | Map<string, IDocCollabCursor>>;
18
+ getCollabCursors$(unitID: string): Observable<Map<string, ISheetCollabCursor> | Map<string, IDocCollabCursor> | Map<string, ISlideCollabCursor>>;
19
19
  private _init;
20
20
  private _startSheetCollabCursor;
21
21
  private _startDocCollabCursor;
22
+ private _startSlideCollabCursor;
22
23
  }
@@ -0,0 +1,34 @@
1
+ import type { ICollaborationUser } from '@univerjs-pro/collaboration';
2
+ import type { CollaborationSession } from '@univerjs-pro/collaboration-client';
3
+ import type { ISlideCollabCursor, ISlideCollabSelectionPayload } from '../../models/cursor';
4
+ import { MemberService } from '@univerjs-pro/collaboration-client';
5
+ import { ISlideDrawingStateService } from '@univerjs-pro/slides-ui';
6
+ import { RxDisposable } from '@univerjs/core';
7
+ import { ColorAssignService } from '../../services/color-assign/color-assign.service';
8
+ export declare function parseSlideCursorSelection(selection: string): ISlideCollabSelectionPayload | null;
9
+ /**
10
+ * Stores slide collaborator cursor presence without mutating local slide selection.
11
+ */
12
+ export declare class SlideCollabCursorEntity extends RxDisposable {
13
+ readonly unitID: string;
14
+ private readonly _session;
15
+ private readonly _colorAssignService;
16
+ private readonly _memberService;
17
+ private readonly _slideDrawingStateService;
18
+ private _online;
19
+ private _init;
20
+ private _cursorInfo$;
21
+ cursorInfo$: import("rxjs").Observable<Map<string, ISlideCollabCursor>>;
22
+ get cursorInfo(): Readonly<Map<string, ISlideCollabCursor>>;
23
+ private _roomMembers$;
24
+ roomMembers$: import("rxjs").Observable<ICollaborationUser[]>;
25
+ get roomMembers(): Readonly<ICollaborationUser[]>;
26
+ constructor(unitID: string, _session: CollaborationSession, _colorAssignService: ColorAssignService, _memberService: MemberService, _slideDrawingStateService: ISlideDrawingStateService);
27
+ dispose(): void;
28
+ init(): void;
29
+ private _onCursorUpdate;
30
+ private _onCursorDelete;
31
+ private _updateLocalCursor;
32
+ private _toggleOnline;
33
+ private _toggleOffline;
34
+ }
@@ -0,0 +1,21 @@
1
+ import type { SlideModel } from '@univerjs-pro/slides';
2
+ import type { IRenderContext, IRenderModule } from '@univerjs/engine-render';
3
+ import { RxDisposable, ThemeService } from '@univerjs/core';
4
+ import { CollabCursorController } from './collab-cursor.controller';
5
+ export declare class SlideCollabCursorRenderController extends RxDisposable implements IRenderModule {
6
+ private readonly _context;
7
+ private readonly _collabCursorController;
8
+ private readonly _themeService;
9
+ private _cursors;
10
+ private _renderScheduled;
11
+ private _isApplyingOverlays;
12
+ private _latestCursors;
13
+ constructor(_context: IRenderContext<SlideModel>, _collabCursorController: CollabCursorController, _themeService: ThemeService);
14
+ dispose(): void;
15
+ private _init;
16
+ private _scheduleRender;
17
+ private _render;
18
+ private _removeCollabCursors;
19
+ private _getSceneObjectByKey;
20
+ private _getObjectBounds;
21
+ }
@@ -1,6 +1,5 @@
1
1
  import { CollaborationController, CollaborationStatus } from '@univerjs-pro/collaboration-client';
2
2
  import { Disposable, LocaleService } from '@univerjs/core';
3
- import { DocStateChangeManagerService } from '@univerjs/docs-ui';
4
3
  import { IMessageService } from '@univerjs/ui';
5
4
  import { BehaviorSubject } from 'rxjs';
6
5
  import { DocTransformIMECacheService } from '../../services/ime-cache-transform/doc-transform-ime-cache.service';
@@ -11,7 +10,6 @@ import { DocTransformSelectionsService } from '../../services/text-selection/doc
11
10
  * This controller is responsible for monitoring the collaboration status of the currently focused unit.
12
11
  */
13
12
  export declare class CollaborationEntityUIController extends Disposable {
14
- private readonly _docStateChangeManagerService;
15
13
  private readonly _collaborationController;
16
14
  private readonly _docTransformIMECacheService;
17
15
  private readonly _docTransformStateCacheService;
@@ -20,6 +18,6 @@ export declare class CollaborationEntityUIController extends Disposable {
20
18
  protected readonly _messageService: IMessageService;
21
19
  protected readonly _localeService: LocaleService;
22
20
  protected readonly _status$: BehaviorSubject<CollaborationStatus>;
23
- constructor(_docStateChangeManagerService: DocStateChangeManagerService, _collaborationController: CollaborationController, _docTransformIMECacheService: DocTransformIMECacheService, _docTransformStateCacheService: DocTransformStateCacheService, _docTransformSelectionsService: DocTransformSelectionsService, _docSyncEditingCollabCursorService: DocSyncEditingCollabCursorService, _messageService: IMessageService, _localeService: LocaleService);
21
+ constructor(_collaborationController: CollaborationController, _docTransformIMECacheService: DocTransformIMECacheService, _docTransformStateCacheService: DocTransformStateCacheService, _docTransformSelectionsService: DocTransformSelectionsService, _docSyncEditingCollabCursorService: DocSyncEditingCollabCursorService, _messageService: IMessageService, _localeService: LocaleService);
24
22
  private _initEntityListener;
25
23
  }
@@ -1,6 +1,6 @@
1
1
  import './global.css';
2
+ export type { IUniverCollaborationClientUIConfig } from './config/config';
2
3
  export { DesktopCollaborationStatusDisplayController } from './controllers/collab-status/collab-status.controller';
3
- export type { IUniverCollaborationClientUIConfig } from './controllers/config.schema';
4
4
  export { CollaborationDataLoaderController } from './controllers/data-loader/data-loader.controller';
5
5
  export { UniverCollaborationClientUIPlugin } from './plugin';
6
6
  export { BrowserCollaborationSocketService } from './services/collaboration-socket/collaboration-socket.service';
@@ -8,4 +8,5 @@ export { RemoteUniscriptService } from './services/remote-uniscript/remote-unisc
8
8
  export { WebBrowserSingleActiveUnitService } from './services/single-active-unit/single-active-unit.service';
9
9
  export { IURLService } from './services/url/url.service';
10
10
  export { WebURLService } from './services/url/web-url.service';
11
- export { type ISheetCollabCursorShapeProps, SheetCollabCursorShape } from './views/shapes/sheet-collab-cursor.shape';
11
+ export { SheetCollabCursorShape } from './views/shapes/sheet-collab-cursor.shape';
12
+ export type { ISheetCollabCursorShapeProps } from './views/shapes/sheet-collab-cursor.shape';
@@ -0,0 +1,3 @@
1
+ import type { LocaleLeafKeys } from '@univerjs/core';
2
+ import type enUS from './en-US';
3
+ export type LocaleKey = LocaleLeafKeys<typeof enUS>;
@@ -34,3 +34,26 @@ export interface IDocCollabCursor {
34
34
  /** The deserialized ranges of collab cursor. */
35
35
  ranges: ITextRangeWithStyle[];
36
36
  }
37
+ export interface ISlideCollabSelectionPayload {
38
+ kind: 'slide-element-selection';
39
+ unitId: string;
40
+ subUnitId: string;
41
+ selectedIds: string[];
42
+ focusedId: string | null;
43
+ }
44
+ export interface ISlideCollabCursor {
45
+ /** Stroke color of this collab cursor */
46
+ color: string;
47
+ /** Displayed user name of this cursor */
48
+ name: string;
49
+ /** Slide unit ID */
50
+ unitId: string;
51
+ /** Slide page ID */
52
+ subUnitId: string;
53
+ /** Remote selected drawing IDs */
54
+ selectedIds: string[];
55
+ /** Remote focused drawing ID */
56
+ focusedId: string | null;
57
+ /** Serialized slide selection payload */
58
+ selection: string;
59
+ }
@@ -1,4 +1,4 @@
1
- import type { IUniverCollaborationClientUIConfig } from './controllers/config.schema';
1
+ import type { IUniverCollaborationClientUIConfig } from './config/config';
2
2
  import { IConfigService, Injector, Plugin } from '@univerjs/core';
3
3
  import { IRenderManagerService } from '@univerjs/engine-render';
4
4
  export declare class UniverCollaborationClientUIPlugin extends Plugin {
@@ -20,6 +20,7 @@ export declare class WebLocalCacheService extends Disposable implements ILocalCa
20
20
  dispose(): void;
21
21
  loadOfflineData(unitID: string): Promise<Nullable<IUnitCacheData>>;
22
22
  saveOfflineData(unitID: string, data: IUnitCacheData): Promise<boolean>;
23
+ backupOfflineData(unitID: string, reason: string): Promise<void>;
23
24
  updateOfflineData(unitID: string, type: UniverInstanceType, awaitingChangeset: Nullable<IChangeset>, pendingMutations: IMutationInfo[]): void;
24
25
  private _scheduleSaving;
25
26
  private _getSaveTimeout;
@@ -1,7 +1,7 @@
1
1
  import type { IChangeset } from '@univerjs-pro/collaboration';
2
2
  import { ITransformService } from '@univerjs-pro/collaboration';
3
3
  import { Injector } from '@univerjs/core';
4
- import { DocStateChangeManagerService } from '@univerjs/docs-ui';
4
+ import { DocStateChangeManagerService } from '@univerjs/docs';
5
5
  export declare class DocTransformStateCacheService {
6
6
  private readonly _injector;
7
7
  private readonly _transformService;
@@ -18,4 +18,4 @@ export interface IOnlineStatusProps {
18
18
  * <CollaborationStatusDisplay status$={statusObservable} />
19
19
  * ```
20
20
  */
21
- export declare function CollaborationStatusDisplay(props: Readonly<IOnlineStatusProps>): import("react/jsx-runtime").JSX.Element;
21
+ export declare function CollaborationStatusDisplay(props: Readonly<IOnlineStatusProps>): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import type { IShapeProps } from '@univerjs/engine-render';
2
+ import type { ISlideCollabCursor } from '../../models/cursor';
3
+ import { Shape } from '@univerjs/engine-render';
4
+ export declare const SLIDE_COLLAB_CURSOR_ZINDEX = 5002;
5
+ export interface ISlideCollabCursorShapeProps extends IShapeProps, ISlideCollabCursor {
6
+ showText?: boolean;
7
+ }
8
+ export declare class SlideCollabCursorShape<T extends ISlideCollabCursorShapeProps = ISlideCollabCursorShapeProps> extends Shape<T> {
9
+ private _color;
10
+ private _name;
11
+ private _showText;
12
+ constructor(key?: string, props?: T);
13
+ setShapeProps(props: Partial<ISlideCollabCursorShapeProps>): void;
14
+ protected _draw(ctx: CanvasRenderingContext2D): void;
15
+ }
package/lib/umd/facade.js CHANGED
@@ -1 +1 @@
1
- (function(_0x22b8de,_0x2babc2){var _0x5e3977=_0x2f1f,_0x5ee611=_0x22b8de();while(!![]){try{var _0x228ff5=-parseInt(_0x5e3977(0x158))/0x1*(-parseInt(_0x5e3977(0x15f))/0x2)+parseInt(_0x5e3977(0x15c))/0x3+-parseInt(_0x5e3977(0x167))/0x4+parseInt(_0x5e3977(0x159))/0x5*(-parseInt(_0x5e3977(0x161))/0x6)+-parseInt(_0x5e3977(0x157))/0x7*(parseInt(_0x5e3977(0x16a))/0x8)+parseInt(_0x5e3977(0x166))/0x9*(parseInt(_0x5e3977(0x16b))/0xa)+parseInt(_0x5e3977(0x165))/0xb*(-parseInt(_0x5e3977(0x15e))/0xc);if(_0x228ff5===_0x2babc2)break;else _0x5ee611['push'](_0x5ee611['shift']());}catch(_0x46553b){_0x5ee611['push'](_0x5ee611['shift']());}}}(_0x8f91,0xe0d0a),function(_0x5d091b,_0x5eaff9){var _0x2b7024=_0x2f1f;typeof exports=='object'&&typeof module<'u'?_0x5eaff9(require('@univerjs-pro/collaboration-client-ui'),require('@univerjs/core/facade')):typeof define==_0x2b7024(0x163)&&define['amd']?define([_0x2b7024(0x162),_0x2b7024(0x15d)],_0x5eaff9):(_0x5d091b=typeof globalThis<'u'?globalThis:_0x5d091b||self,_0x5eaff9(_0x5d091b['UniverProCollaborationClientUi'],_0x5d091b[_0x2b7024(0x160)]));}(this,function(_0x6666ba,_0x2ffba3){var _0x311bbe=_0x2f1f,_0x770ef=class extends _0x2ffba3[_0x311bbe(0x15a)]{[_0x311bbe(0x164)](_0x4499f7,_0xedda6a,..._0x5f59f0){var _0x4be054=_0x311bbe;return this[_0x4be054(0x168)][_0x4be054(0x15b)](_0x6666ba[_0x4be054(0x169)])[_0x4be054(0x164)](_0x4499f7,_0xedda6a,{},..._0x5f59f0);}};_0x2ffba3[_0x311bbe(0x15a)]['extend'](_0x770ef);}));function _0x2f1f(_0x267db5,_0x3317b5){_0x267db5=_0x267db5-0x157;var _0x8f910c=_0x8f91();var _0x2f1f95=_0x8f910c[_0x267db5];return _0x2f1f95;}function _0x8f91(){var _0x5712e5=['get','3901194UmKOzs','@univerjs/core/facade','63156xrYCpl','2304974zlEXoP','UniverCoreFacade','3094350keoueN','@univerjs-pro/collaboration-client-ui','function','runOnServer','671oiWppv','6702840HeQbWC','3519400ILKMfu','_injector','RemoteUniscriptService','9880GeJCyM','10QILhHh','252tkiwZd','1jlNsZg','10AysPbk','FUniver'];_0x8f91=function(){return _0x5712e5;};return _0x8f91();}
1
+ function _0x2139(_0x918d43,_0x2de140){_0x918d43=_0x918d43-0x1cc;var _0x20f0a1=_0x20f0();var _0x2139ba=_0x20f0a1[_0x918d43];return _0x2139ba;}(function(_0x25ca00,_0x591e09){var _0x50d9ca=_0x2139,_0x10a977=_0x25ca00();while(!![]){try{var _0x192d19=parseInt(_0x50d9ca(0x1d9))/0x1*(parseInt(_0x50d9ca(0x1d4))/0x2)+parseInt(_0x50d9ca(0x1d8))/0x3+-parseInt(_0x50d9ca(0x1d1))/0x4+parseInt(_0x50d9ca(0x1d5))/0x5+-parseInt(_0x50d9ca(0x1cd))/0x6*(-parseInt(_0x50d9ca(0x1da))/0x7)+-parseInt(_0x50d9ca(0x1cc))/0x8*(parseInt(_0x50d9ca(0x1ce))/0x9)+-parseInt(_0x50d9ca(0x1e1))/0xa;if(_0x192d19===_0x591e09)break;else _0x10a977['push'](_0x10a977['shift']());}catch(_0x5b53c2){_0x10a977['push'](_0x10a977['shift']());}}}(_0x20f0,0x5b29c),function(_0x496c7d,_0x56f665){var _0x13fb38=_0x2139;typeof exports==_0x13fb38(0x1e0)&&typeof module<'u'?_0x56f665(require('@univerjs-pro/collaboration-client-ui'),require('@univerjs/core/facade')):typeof define==_0x13fb38(0x1cf)&&define[_0x13fb38(0x1d3)]?define([_0x13fb38(0x1d6),_0x13fb38(0x1df)],_0x56f665):(_0x496c7d=typeof globalThis<'u'?globalThis:_0x496c7d||self,_0x56f665(_0x496c7d['UniverProCollaborationClientUi'],_0x496c7d[_0x13fb38(0x1dd)]));}(this,function(_0x2b71e0,_0x41ba8d){var _0x3b4421=_0x2139,_0x25b323=class extends _0x41ba8d[_0x3b4421(0x1de)]{[_0x3b4421(0x1d7)](_0x22f596,_0x16e2b7,..._0x2f1481){var _0x312d5e=_0x3b4421;return this[_0x312d5e(0x1d2)][_0x312d5e(0x1d0)](_0x2b71e0[_0x312d5e(0x1db)])['runOnServer'](_0x22f596,_0x16e2b7,{},..._0x2f1481);}};_0x41ba8d[_0x3b4421(0x1de)][_0x3b4421(0x1dc)](_0x25b323);}));function _0x20f0(){var _0xa2a78a=['RemoteUniscriptService','extend','UniverCoreFacade','FUniver','@univerjs/core/facade','object','8908040EkWQAs','200DFHUgV','95898nOgXYc','181647BBbLoW','function','get','2921400gPLzQv','_injector','amd','1220714cvPEvn','2392460eflIfx','@univerjs-pro/collaboration-client-ui','runOnServer','2216994StGQje','1HgDIDz','294GqfaXM'];_0x20f0=function(){return _0xa2a78a;};return _0x20f0();}