@atlaskit/profilecard 16.8.0 → 16.10.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 (41) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/components/Team/TeamProfileCard.js +15 -3
  3. package/dist/cjs/components/Team/TeamProfileCardTrigger.js +77 -12
  4. package/dist/cjs/components/User/ProfileCardResourced.js +0 -1
  5. package/dist/cjs/components/User/ProfileCardTrigger.js +0 -1
  6. package/dist/cjs/i18n/en.js +1 -0
  7. package/dist/cjs/i18n/en_GB.js +1 -0
  8. package/dist/cjs/i18n/en_ZZ.js +1 -0
  9. package/dist/cjs/styled/Card.js +1 -1
  10. package/dist/cjs/util/analytics.js +1 -1
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/components/Team/TeamProfileCard.js +13 -3
  13. package/dist/es2019/components/Team/TeamProfileCardTrigger.js +68 -9
  14. package/dist/es2019/components/User/ProfileCardResourced.js +0 -1
  15. package/dist/es2019/components/User/ProfileCardTrigger.js +0 -1
  16. package/dist/es2019/i18n/en.js +1 -0
  17. package/dist/es2019/i18n/en_GB.js +1 -0
  18. package/dist/es2019/i18n/en_ZZ.js +1 -0
  19. package/dist/es2019/styled/Card.js +1 -0
  20. package/dist/es2019/util/analytics.js +1 -1
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/client/TeamCentralCardClient.js +1 -1
  23. package/dist/esm/client/UserProfileCardClient.js +1 -1
  24. package/dist/esm/client/getTeamFromAGG.js +1 -1
  25. package/dist/esm/components/Team/TeamProfileCard.js +13 -3
  26. package/dist/esm/components/Team/TeamProfileCardTrigger.js +77 -12
  27. package/dist/esm/components/User/ProfileCardResourced.js +0 -1
  28. package/dist/esm/components/User/ProfileCardTrigger.js +0 -1
  29. package/dist/esm/i18n/en.js +1 -0
  30. package/dist/esm/i18n/en_GB.js +1 -0
  31. package/dist/esm/i18n/en_ZZ.js +1 -0
  32. package/dist/esm/styled/Card.js +1 -1
  33. package/dist/esm/util/analytics.js +1 -1
  34. package/dist/esm/version.json +1 -1
  35. package/dist/types/components/Team/TeamProfileCardTrigger.d.ts +5 -1
  36. package/dist/types/i18n/en.d.ts +1 -0
  37. package/dist/types/i18n/en_GB.d.ts +1 -0
  38. package/dist/types/i18n/en_ZZ.d.ts +1 -0
  39. package/dist/types/types.d.ts +11 -0
  40. package/package.json +2 -2
  41. package/report.api.md +614 -0
package/report.api.md ADDED
@@ -0,0 +1,614 @@
1
+ ## API Report File for "@atlaskit/profilecard"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+ /// <reference types="react" />
7
+
8
+ import { ComponentType } from 'react';
9
+ import { CreateUIAnalyticsEvent } from '@atlaskit/analytics-next';
10
+ import { IntlShape } from 'react-intl-next';
11
+ import { LRUCache } from 'lru-fast';
12
+ import { default as React_2 } from 'react';
13
+ import { ReactElement } from 'react';
14
+ import { WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
15
+
16
+ // @public (undocumented)
17
+ export interface ApiClientResponse {
18
+ // (undocumented)
19
+ User: {
20
+ id: string;
21
+ isBot: boolean;
22
+ isCurrentUser: boolean;
23
+ isNotMentionable: boolean;
24
+ avatarUrl: string | null;
25
+ email: string | null;
26
+ fullName: string | null;
27
+ location: string | null;
28
+ meta: string | null;
29
+ nickname: string | null;
30
+ companyName: string | null;
31
+ remoteTimeString: string | null;
32
+ remoteWeekdayIndex: string | null;
33
+ remoteWeekdayString: string | null;
34
+ status: StatusType;
35
+ statusModifiedDate: number | null;
36
+ };
37
+ }
38
+
39
+ // @public (undocumented)
40
+ export const DELAY_MS_HIDE = 200;
41
+
42
+ // @public (undocumented)
43
+ export const DELAY_MS_SHOW = 800;
44
+
45
+ // @public (undocumented)
46
+ export interface MessageIntlProviderProps {
47
+ // (undocumented)
48
+ children: React_2.ReactNode;
49
+ // (undocumented)
50
+ intl: IntlShape;
51
+ }
52
+
53
+ // @public
54
+ export const modifyResponse: (
55
+ response: ApiClientResponse,
56
+ ) => ProfileCardClientData;
57
+
58
+ // @public (undocumented)
59
+ export class ProfileCard extends React_2.PureComponent<ProfilecardProps> {
60
+ constructor(props: ProfilecardProps);
61
+ // (undocumented)
62
+ callAnalytics: (id: string, options: any) => void;
63
+ // (undocumented)
64
+ callClientFetchProfile: (...args: any) => void;
65
+ // (undocumented)
66
+ clientFetchProfile: () => void;
67
+ // (undocumented)
68
+ componentDidMount(): void;
69
+ // (undocumented)
70
+ static defaultProps: ProfilecardProps;
71
+ // (undocumented)
72
+ getActions(): ProfileCardAction[];
73
+ // (undocumented)
74
+ getDisabledAccountDesc(): {};
75
+ // (undocumented)
76
+ getDisabledAccountName(): string | JSX.Element | null | undefined;
77
+ // (undocumented)
78
+ GIVE_KUDOS_ACTION_ID: string;
79
+ // (undocumented)
80
+ kudosButtonCallback: () => void;
81
+ // (undocumented)
82
+ kudosUrl: () => string;
83
+ // (undocumented)
84
+ render(): JSX.Element;
85
+ // (undocumented)
86
+ renderActionsButtons(): JSX.Element | null;
87
+ // (undocumented)
88
+ renderButton: (action: ProfileCardAction, idx: number) => ReactElement;
89
+ // (undocumented)
90
+ renderCardDetails(): JSX.Element;
91
+ // (undocumented)
92
+ renderCardDetailsApp(): JSX.Element;
93
+ // (undocumented)
94
+ renderCardDetailsDefault(): JSX.Element;
95
+ // (undocumented)
96
+ renderCardDetailsForDisabledAccount(): JSX.Element;
97
+ // (undocumented)
98
+ renderCustomLozenges(lozenges: LozengeProps[]): JSX.Element | null;
99
+ // (undocumented)
100
+ renderErrorMessage(): JSX.Element;
101
+ }
102
+
103
+ // @public (undocumented)
104
+ export interface ProfileCardAction {
105
+ // (undocumented)
106
+ callback?: (...args: any[]) => any;
107
+ // (undocumented)
108
+ id?: string;
109
+ // (undocumented)
110
+ label: React_2.ReactNode;
111
+ // (undocumented)
112
+ link?: string;
113
+ // (undocumented)
114
+ shouldRender?: (data: any) => boolean;
115
+ }
116
+
117
+ // @public (undocumented)
118
+ export interface ProfileCardClientData {
119
+ // (undocumented)
120
+ avatarUrl?: string;
121
+ // (undocumented)
122
+ companyName?: string;
123
+ // (undocumented)
124
+ customLozenges?: LozengeProps[];
125
+ // (undocumented)
126
+ email?: string;
127
+ // (undocumented)
128
+ fullName?: string;
129
+ // (undocumented)
130
+ isBot: boolean;
131
+ // (undocumented)
132
+ isCurrentUser: boolean;
133
+ // (undocumented)
134
+ isNotMentionable: boolean;
135
+ // (undocumented)
136
+ location?: string;
137
+ // (undocumented)
138
+ meta?: string;
139
+ // (undocumented)
140
+ nickname?: string;
141
+ // (undocumented)
142
+ status: StatusType;
143
+ // (undocumented)
144
+ statusModifiedDate?: number | null;
145
+ // (undocumented)
146
+ timestring?: string;
147
+ }
148
+
149
+ // @public (undocumented)
150
+ export type ProfileCardErrorType = {
151
+ reason: 'default' | 'NotFound';
152
+ } | null;
153
+
154
+ // @public (undocumented)
155
+ export interface ProfilecardProps {
156
+ // (undocumented)
157
+ actions?: ProfileCardAction[];
158
+ // (undocumented)
159
+ addFlag?: (flag: any) => void;
160
+ // (undocumented)
161
+ analytics?: any;
162
+ // (undocumented)
163
+ avatarUrl?: string;
164
+ // (undocumented)
165
+ clientFetchProfile?: any;
166
+ // (undocumented)
167
+ cloudId?: string;
168
+ // (undocumented)
169
+ companyName?: string;
170
+ // (undocumented)
171
+ customLozenges?: LozengeProps[];
172
+ // (undocumented)
173
+ disabledAccountMessage?: React_2.ReactNode;
174
+ // (undocumented)
175
+ email?: string;
176
+ // (undocumented)
177
+ errorType?: ProfileCardErrorType;
178
+ // (undocumented)
179
+ fullName?: string;
180
+ // (undocumented)
181
+ hasDisabledAccountLozenge?: boolean;
182
+ // (undocumented)
183
+ hasError?: boolean;
184
+ // (undocumented)
185
+ isBot?: boolean;
186
+ // (undocumented)
187
+ isCurrentUser?: boolean;
188
+ // (undocumented)
189
+ isKudosEnabled?: boolean;
190
+ // (undocumented)
191
+ isLoading?: boolean;
192
+ // (undocumented)
193
+ isNotMentionable?: boolean;
194
+ // (undocumented)
195
+ location?: string;
196
+ // (undocumented)
197
+ meta?: string;
198
+ // (undocumented)
199
+ nickname?: string;
200
+ onReportingLinesClick?: (user: ReportingLinesUser) => void;
201
+ // (undocumented)
202
+ openKudosDrawer?: () => void;
203
+ reportingLines?: TeamCentralReportingLinesData;
204
+ reportingLinesProfileUrl?: string;
205
+ // (undocumented)
206
+ status?: StatusType;
207
+ // (undocumented)
208
+ statusModifiedDate?: number | null;
209
+ // (undocumented)
210
+ teamCentralBaseUrl?: string;
211
+ // (undocumented)
212
+ timestring?: string;
213
+ // (undocumented)
214
+ userId?: string;
215
+ // (undocumented)
216
+ withoutElevation?: boolean;
217
+ }
218
+
219
+ // @public (undocumented)
220
+ class ProfileCardResourced extends React_2.PureComponent<
221
+ ProfileCardResourcedProps,
222
+ ProfileCardResourcedState
223
+ > {
224
+ // (undocumented)
225
+ clientFetchProfile: () => void;
226
+ // (undocumented)
227
+ closeKudosDrawer: () => void;
228
+ // (undocumented)
229
+ componentDidMount(): void;
230
+ // (undocumented)
231
+ componentDidUpdate(
232
+ prevProps: ProfileCardResourcedProps,
233
+ prevState: ProfileCardResourcedState,
234
+ ): void;
235
+ // (undocumented)
236
+ componentWillUnmount(): void;
237
+ // (undocumented)
238
+ static defaultProps: Partial<ProfileCardResourcedProps>;
239
+ // (undocumented)
240
+ filterActions: () => ProfileCardAction[];
241
+ // (undocumented)
242
+ handleClientError(err: any): void;
243
+ // (undocumented)
244
+ handleClientSuccess(
245
+ profileData: ProfileCardClientData,
246
+ reportingLinesData: TeamCentralReportingLinesData,
247
+ shouldShowGiveKudos: boolean,
248
+ ): void;
249
+ // (undocumented)
250
+ _isMounted: boolean;
251
+ // (undocumented)
252
+ openKudosDrawer: () => void;
253
+ // (undocumented)
254
+ render(): React_2.ReactNode;
255
+ // (undocumented)
256
+ state: ProfileCardResourcedState;
257
+ }
258
+ export default ProfileCardResourced;
259
+
260
+ // @public (undocumented)
261
+ export interface ProfileCardResourcedProps {
262
+ // (undocumented)
263
+ actions?: ProfileCardAction[];
264
+ // (undocumented)
265
+ addFlag?: (flag: any) => void;
266
+ // (undocumented)
267
+ analytics?: any;
268
+ // (undocumented)
269
+ children?: React_2.ReactNode;
270
+ // (undocumented)
271
+ cloudId: string;
272
+ // (undocumented)
273
+ onReportingLinesClick?: (user: ReportingLinesUser) => void;
274
+ // (undocumented)
275
+ position?: ProfilecardTriggerPosition;
276
+ // (undocumented)
277
+ reportingLinesProfileUrl?: string;
278
+ // (undocumented)
279
+ resourceClient: ProfileClient_2;
280
+ // (undocumented)
281
+ trigger?: TriggerType;
282
+ // (undocumented)
283
+ userId: string;
284
+ }
285
+
286
+ // @public (undocumented)
287
+ export interface ProfileCardResourcedState {
288
+ // (undocumented)
289
+ data: ProfileCardClientData | null;
290
+ // (undocumented)
291
+ error?: ProfileCardErrorType;
292
+ // (undocumented)
293
+ hasError: boolean;
294
+ // (undocumented)
295
+ isKudosEnabled?: boolean;
296
+ // (undocumented)
297
+ isLoading?: boolean;
298
+ // (undocumented)
299
+ kudosDrawerOpen: boolean;
300
+ // (undocumented)
301
+ reportingLinesData?: TeamCentralReportingLinesData;
302
+ // (undocumented)
303
+ visible?: boolean;
304
+ }
305
+
306
+ // @public (undocumented)
307
+ export class ProfileCardTrigger extends React_2.PureComponent<
308
+ ProfileCardTriggerProps,
309
+ ProfileCardTriggerState
310
+ > {
311
+ // (undocumented)
312
+ clientFetchProfile: () => void;
313
+ // (undocumented)
314
+ closeKudosDrawer: () => void;
315
+ // (undocumented)
316
+ componentDidMount(): void;
317
+ // (undocumented)
318
+ componentDidUpdate(prevProps: ProfileCardTriggerProps): void;
319
+ // (undocumented)
320
+ componentWillUnmount(): void;
321
+ // (undocumented)
322
+ containerListeners:
323
+ | {
324
+ onMouseEnter: () => void;
325
+ onMouseLeave: () => void;
326
+ onClick?: undefined;
327
+ }
328
+ | {
329
+ onClick: (event: React_2.MouseEvent) => void;
330
+ onMouseEnter?: undefined;
331
+ onMouseLeave?: undefined;
332
+ };
333
+ // (undocumented)
334
+ static defaultProps: Partial<ProfileCardTriggerProps>;
335
+ // (undocumented)
336
+ filterActions(): ProfileCardAction[];
337
+ // (undocumented)
338
+ handleClientError(err: any): void;
339
+ // (undocumented)
340
+ handleClientSuccess(
341
+ profileData: ProfileCardClientData,
342
+ reportingLinesData: TeamCentralReportingLinesData,
343
+ shouldShowGiveKudos: boolean,
344
+ ): void;
345
+ // (undocumented)
346
+ hideDelay: number;
347
+ // (undocumented)
348
+ hideProfilecard: () => void;
349
+ // (undocumented)
350
+ hideTimer: number;
351
+ // (undocumented)
352
+ _isMounted: boolean;
353
+ // (undocumented)
354
+ layerListeners: {
355
+ handleClickOutside: () => void;
356
+ handleEscapeKeydown: () => void;
357
+ };
358
+ // (undocumented)
359
+ onClick: (event: React_2.MouseEvent) => void;
360
+ // (undocumented)
361
+ openKudosDrawer: () => void;
362
+ // (undocumented)
363
+ render(): JSX.Element;
364
+ // (undocumented)
365
+ renderCard: () => JSX.Element;
366
+ // (undocumented)
367
+ renderProfileCard(): JSX.Element;
368
+ // (undocumented)
369
+ renderWithTrigger(): JSX.Element;
370
+ // (undocumented)
371
+ showDelay: number;
372
+ // (undocumented)
373
+ showProfilecard: () => void;
374
+ // (undocumented)
375
+ showTimer: number;
376
+ // (undocumented)
377
+ state: ProfileCardTriggerState;
378
+ }
379
+
380
+ // @public (undocumented)
381
+ export type ProfilecardTriggerPosition =
382
+ | 'bottom-start'
383
+ | 'bottom'
384
+ | 'bottom-end'
385
+ | 'left-start'
386
+ | 'left'
387
+ | 'left-end'
388
+ | 'top-end'
389
+ | 'top'
390
+ | 'top-start'
391
+ | 'right-end'
392
+ | 'right'
393
+ | 'right-start';
394
+
395
+ // @public (undocumented)
396
+ export interface ProfileCardTriggerProps {
397
+ // (undocumented)
398
+ actions?: ProfileCardAction[];
399
+ // (undocumented)
400
+ addFlag?: (flag: any) => void;
401
+ // (undocumented)
402
+ analytics?: any;
403
+ // (undocumented)
404
+ children?: React_2.ReactNode;
405
+ cloudId?: string;
406
+ // (undocumented)
407
+ onReportingLinesClick?: (user: ReportingLinesUser) => void;
408
+ // (undocumented)
409
+ position?: ProfilecardTriggerPosition;
410
+ // (undocumented)
411
+ reportingLinesProfileUrl?: string;
412
+ // (undocumented)
413
+ resourceClient: ProfileClient_2;
414
+ // (undocumented)
415
+ testId?: string;
416
+ // (undocumented)
417
+ trigger?: TriggerType;
418
+ // (undocumented)
419
+ userId: string;
420
+ }
421
+
422
+ // @public (undocumented)
423
+ export interface ProfileCardTriggerState {
424
+ // (undocumented)
425
+ data: ProfileCardClientData | null;
426
+ // (undocumented)
427
+ error?: ProfileCardErrorType;
428
+ // (undocumented)
429
+ hasError: boolean;
430
+ // (undocumented)
431
+ isLoading?: boolean;
432
+ // (undocumented)
433
+ kudosDrawerOpen: boolean;
434
+ // (undocumented)
435
+ reportingLinesData?: TeamCentralReportingLinesData;
436
+ // (undocumented)
437
+ shouldShowGiveKudos?: boolean;
438
+ // (undocumented)
439
+ teamCentralBaseUrl?: string;
440
+ // (undocumented)
441
+ visible?: boolean;
442
+ }
443
+
444
+ // @public (undocumented)
445
+ export class ProfileClient {
446
+ constructor(config: ProfileClientOptions, clients?: ClientOverrides);
447
+ // (undocumented)
448
+ flushCache(): void;
449
+ // (undocumented)
450
+ getProfile(cloudId: string, userId: string): Promise<any>;
451
+ // (undocumented)
452
+ getReportingLines(userId: string): Promise<TeamCentralReportingLinesData>;
453
+ // (undocumented)
454
+ getTeamCentralBaseUrl(): string | undefined;
455
+ // (undocumented)
456
+ getTeamProfile(
457
+ teamId: string,
458
+ orgId?: string,
459
+ analytics?: (event: Record<string, any>) => void,
460
+ ): Promise<Team>;
461
+ // (undocumented)
462
+ shouldShowGiveKudos(): Promise<boolean>;
463
+ // (undocumented)
464
+ tcClient?: TeamCentralCardClient;
465
+ // (undocumented)
466
+ teamClient: TeamProfileClient;
467
+ // (undocumented)
468
+ userClient: UserProfileClient;
469
+ }
470
+
471
+ // @public (undocumented)
472
+ export interface ProfileClientOptions {
473
+ // (undocumented)
474
+ cacheMaxAge?: number;
475
+ // (undocumented)
476
+ cacheSize?: number;
477
+ // (undocumented)
478
+ gatewayGraphqlUrl?: string;
479
+ productIdentifier?: string;
480
+ teamCentralBaseUrl?: string;
481
+ teamCentralUrl?: string;
482
+ // (undocumented)
483
+ url: string;
484
+ }
485
+
486
+ // @public (undocumented)
487
+ export type RelativeDateKeyType =
488
+ | 'ThisWeek'
489
+ | 'ThisMonth'
490
+ | 'LastMonth'
491
+ | 'AFewMonths'
492
+ | 'SeveralMonths'
493
+ | 'MoreThanAYear'
494
+ | null;
495
+
496
+ // @public (undocumented)
497
+ export type StatusModifiedDateType =
498
+ | 'noDate'
499
+ | 'thisWeek'
500
+ | 'thisMonth'
501
+ | 'lastMonth'
502
+ | 'aFewMonths'
503
+ | 'severalMonths'
504
+ | 'moreThanAYear';
505
+
506
+ // @public (undocumented)
507
+ export type StatusType = 'active' | 'inactive' | 'closed';
508
+
509
+ // @public (undocumented)
510
+ export interface Team {
511
+ // (undocumented)
512
+ description: string;
513
+ // (undocumented)
514
+ displayName: string;
515
+ // (undocumented)
516
+ id: string;
517
+ // (undocumented)
518
+ largeAvatarImageUrl?: string;
519
+ // (undocumented)
520
+ largeHeaderImageUrl?: string;
521
+ // (undocumented)
522
+ members?: {
523
+ id: string;
524
+ fullName: string;
525
+ avatarUrl: string;
526
+ }[];
527
+ // (undocumented)
528
+ organizationId?: string;
529
+ // (undocumented)
530
+ smallAvatarImageUrl?: string;
531
+ // (undocumented)
532
+ smallHeaderImageUrl?: string;
533
+ }
534
+
535
+ // @public (undocumented)
536
+ export const TeamProfileCard: (
537
+ props: TeamProfilecardProps,
538
+ ) => JSX.Element | null;
539
+
540
+ // @public (undocumented)
541
+ export const TeamProfileCardTrigger: React_2.ForwardRefExoticComponent<
542
+ Pick<
543
+ Omit<
544
+ TeamProfileCardTriggerProps & {
545
+ createAnalyticsEvent?: CreateUIAnalyticsEvent | undefined;
546
+ },
547
+ keyof WithAnalyticsEventsProps
548
+ >,
549
+ never
550
+ > &
551
+ Partial<
552
+ Pick<
553
+ Omit<
554
+ TeamProfileCardTriggerProps & {
555
+ createAnalyticsEvent?: CreateUIAnalyticsEvent | undefined;
556
+ },
557
+ keyof WithAnalyticsEventsProps
558
+ >,
559
+ keyof TeamProfileCardTriggerProps
560
+ >
561
+ > &
562
+ Partial<Pick<Partial<TeamProfileCardTriggerProps>, never>> &
563
+ React_2.RefAttributes<any>
564
+ >;
565
+
566
+ // @public (undocumented)
567
+ export class TeamProfileClient extends CachingClient<Team> {
568
+ constructor(options: ProfileClientOptions);
569
+ // (undocumented)
570
+ getProfile(
571
+ teamId: string,
572
+ orgId: string | undefined,
573
+ analytics?: (event: Record<string, any>) => void,
574
+ ): Promise<Team>;
575
+ // (undocumented)
576
+ makeRequest(teamId: string, orgId: string | undefined): Promise<Team>;
577
+ // (undocumented)
578
+ makeRequestViaGateway(
579
+ teamId: string,
580
+ _orgId: string | undefined,
581
+ ): Promise<Team>;
582
+ // (undocumented)
583
+ options: ProfileClientOptions;
584
+ }
585
+
586
+ // @public (undocumented)
587
+ export type TriggerType = 'hover' | 'click';
588
+
589
+ // @public (undocumented)
590
+ export class UserProfileClient extends CachingClient<any> {
591
+ constructor(options: ProfileClientOptions);
592
+ // (undocumented)
593
+ getProfile(cloudId: string, userId: string): Promise<any>;
594
+ // (undocumented)
595
+ makeRequest(cloudId: string, userId: string): Promise<ProfileCardClientData>;
596
+ // (undocumented)
597
+ options: ProfileClientOptions;
598
+ }
599
+
600
+ // @public (undocumented)
601
+ export function withOuterListeners<P>(
602
+ Component: ComponentType<P>,
603
+ ): React_2.ComponentClass<P & WithOuterListenersProps>;
604
+
605
+ // @public (undocumented)
606
+ export interface WithOuterListenersProps {
607
+ // (undocumented)
608
+ handleClickOutside?: () => void;
609
+ // (undocumented)
610
+ handleEscapeKeydown?: () => void;
611
+ }
612
+
613
+ // (No @packageDocumentation comment for this package)
614
+ ```