@opengeoweb/taf 4.11.0 → 4.13.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 (123) hide show
  1. package/README.md +0 -0
  2. package/index.d.ts +0 -0
  3. package/index.esm.js +1390 -1240
  4. package/index.umd.js +1416 -1270
  5. package/lib/TafDemo.stories.d.ts +0 -0
  6. package/lib/components/ComponentsLookUp/ComponentsLookUp.d.ts +0 -0
  7. package/lib/components/ComponentsLookUp/ComponentsLookUp.spec.d.ts +0 -0
  8. package/lib/components/ComponentsLookUp/index.d.ts +0 -0
  9. package/lib/components/IssuesPane/IssuesButton.d.ts +0 -0
  10. package/lib/components/IssuesPane/IssuesButton.spec.d.ts +0 -0
  11. package/lib/components/IssuesPane/IssuesPane.d.ts +1 -0
  12. package/lib/components/IssuesPane/IssuesPane.spec.d.ts +0 -0
  13. package/lib/components/IssuesPane/IssuesPane.stories.d.ts +0 -0
  14. package/lib/components/IssuesPane/IssuesPaneWrapper.d.ts +0 -0
  15. package/lib/components/IssuesPane/IssuesPaneWrapper.spec.d.ts +0 -0
  16. package/lib/components/IssuesPane/index.d.ts +0 -0
  17. package/lib/components/IssuesPane/types.d.ts +1 -0
  18. package/lib/components/IssuesPane/utils.d.ts +0 -0
  19. package/lib/components/IssuesPane/utils.spec.d.ts +0 -0
  20. package/lib/components/Providers/Providers.d.ts +0 -0
  21. package/lib/components/Providers/index.d.ts +0 -0
  22. package/lib/components/Spinner/Spinner.d.ts +0 -0
  23. package/lib/components/Spinner/Spinner.spec.d.ts +0 -0
  24. package/lib/components/Spinner/Spinner.stories.d.ts +0 -0
  25. package/lib/components/StatusIcon/StatusIcon.d.ts +0 -0
  26. package/lib/components/StatusIcon/StatusIcon.spec.d.ts +0 -0
  27. package/lib/components/SwitchButton/SwitchButton.d.ts +0 -0
  28. package/lib/components/SwitchButton/SwitchButton.spec.d.ts +0 -0
  29. package/lib/components/SwitchButton/index.d.ts +0 -0
  30. package/lib/components/TabPanel/TabPanel.d.ts +0 -0
  31. package/lib/components/TabPanel/TabPanel.spec.d.ts +0 -0
  32. package/lib/components/TabPanel/index.d.ts +0 -0
  33. package/lib/components/TafAvatar/TafAvatar.d.ts +0 -0
  34. package/lib/components/TafAvatar/index.d.ts +0 -0
  35. package/lib/components/TafForm/TafForm.d.ts +2 -1
  36. package/lib/components/TafForm/TafForm.spec.d.ts +0 -0
  37. package/lib/components/TafForm/TafForm.statusChanges.spec.d.ts +0 -0
  38. package/lib/components/TafForm/TafForm.stories.d.ts +0 -0
  39. package/lib/components/TafForm/TafFormButtons/TafFormButtons.d.ts +0 -0
  40. package/lib/components/TafForm/TafFormButtons/TafFormButtons.spec.d.ts +0 -0
  41. package/lib/components/TafForm/TafFormButtons/TafFormOptionsButton.d.ts +0 -0
  42. package/lib/components/TafForm/TafFormButtons/TafFormOptionsButton.spec.d.ts +0 -0
  43. package/lib/components/TafForm/TafFormRow/DragHandle.d.ts +0 -0
  44. package/lib/components/TafForm/TafFormRow/DragHandle.spec.d.ts +0 -0
  45. package/lib/components/TafForm/TafFormRow/TafFormRow.d.ts +0 -0
  46. package/lib/components/TafForm/TafFormRow/TafFormRow.spec.d.ts +0 -0
  47. package/lib/components/TafForm/TafFormRow/TafFormTextField.d.ts +5 -1
  48. package/lib/components/TafForm/TafFormRow/TafFormTextField.spec.d.ts +0 -0
  49. package/lib/components/TafForm/TafFormRow/types.d.ts +0 -0
  50. package/lib/components/TafForm/TafFormRow/validations/change.d.ts +0 -0
  51. package/lib/components/TafForm/TafFormRow/validations/change.spec.d.ts +0 -0
  52. package/lib/components/TafForm/TafFormRow/validations/clouds.d.ts +3 -3
  53. package/lib/components/TafForm/TafFormRow/validations/clouds.spec.d.ts +0 -0
  54. package/lib/components/TafForm/TafFormRow/validations/probability.d.ts +0 -0
  55. package/lib/components/TafForm/TafFormRow/validations/probability.spec.d.ts +0 -0
  56. package/lib/components/TafForm/TafFormRow/validations/utils.d.ts +1 -0
  57. package/lib/components/TafForm/TafFormRow/validations/utils.spec.d.ts +0 -0
  58. package/lib/components/TafForm/TafFormRow/validations/validField.d.ts +0 -0
  59. package/lib/components/TafForm/TafFormRow/validations/validField.spec.d.ts +0 -0
  60. package/lib/components/TafForm/TafFormRow/validations/visibility.d.ts +0 -0
  61. package/lib/components/TafForm/TafFormRow/validations/visibility.spec.d.ts +0 -0
  62. package/lib/components/TafForm/TafFormRow/validations/weather.d.ts +3 -3
  63. package/lib/components/TafForm/TafFormRow/validations/weather.spec.d.ts +0 -0
  64. package/lib/components/TafForm/TafFormRow/validations/wind.d.ts +0 -0
  65. package/lib/components/TafForm/TafFormRow/validations/wind.spec.d.ts +0 -0
  66. package/lib/components/TafForm/index.d.ts +0 -0
  67. package/lib/components/TafForm/utils.d.ts +4 -2
  68. package/lib/components/TafForm/utils.spec.d.ts +0 -0
  69. package/lib/components/TafHeader/TafHeader.d.ts +0 -0
  70. package/lib/components/TafHeader/TafHeader.spec.d.ts +0 -0
  71. package/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.d.ts +0 -0
  72. package/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.spec.d.ts +0 -0
  73. package/lib/components/TafLayout/LastUpdateTime/LastUpdateTime.stories.d.ts +0 -0
  74. package/lib/components/TafLayout/LastUpdateTime/index.d.ts +0 -0
  75. package/lib/components/TafLayout/LocationTabs/LocationTabs.d.ts +0 -0
  76. package/lib/components/TafLayout/LocationTabs/LocationTabs.spec.d.ts +0 -0
  77. package/lib/components/TafLayout/LocationTabs/LocationTabs.stories.d.ts +0 -0
  78. package/lib/components/TafLayout/LocationTabs/index.d.ts +0 -0
  79. package/lib/components/TafLayout/TacOverview/AdverseWeatherTacMessage.d.ts +0 -0
  80. package/lib/components/TafLayout/TacOverview/AdverseWeatherTacMessage.spec.d.ts +0 -0
  81. package/lib/components/TafLayout/TacOverview/AdverseWeatherTacMessage.stories.d.ts +0 -0
  82. package/lib/components/TafLayout/TacOverview/ExportButton.d.ts +0 -0
  83. package/lib/components/TafLayout/TacOverview/ExportButton.spec.d.ts +0 -0
  84. package/lib/components/TafLayout/TacOverview/TacContainer.d.ts +0 -0
  85. package/lib/components/TafLayout/TacOverview/TacContainer.spec.d.ts +0 -0
  86. package/lib/components/TafLayout/TacOverview/TacOverview.d.ts +0 -0
  87. package/lib/components/TafLayout/TacOverview/TacOverview.spec.d.ts +0 -0
  88. package/lib/components/TafLayout/TacOverview/TacOverview.stories.d.ts +0 -0
  89. package/lib/components/TafLayout/TacOverview/TacOverviewMobile.d.ts +0 -0
  90. package/lib/components/TafLayout/TacOverview/TacOverviewMobile.spec.d.ts +0 -0
  91. package/lib/components/TafLayout/TacOverview/TacOverviewMobile.stories.d.ts +0 -0
  92. package/lib/components/TafLayout/TacOverview/index.d.ts +0 -0
  93. package/lib/components/TafLayout/TafLayout.d.ts +0 -0
  94. package/lib/components/TafLayout/TafLayout.spec.d.ts +0 -0
  95. package/lib/components/TafLayout/TafLayout.stories.d.ts +0 -0
  96. package/lib/components/TafLayout/TafPanel/TafPanel.d.ts +3 -1
  97. package/lib/components/TafLayout/TafPanel/TafPanel.spec.d.ts +0 -0
  98. package/lib/components/TafLayout/TafPanel/TafPanel.stories.d.ts +0 -0
  99. package/lib/components/TafLayout/TafPanel/index.d.ts +0 -0
  100. package/lib/components/TafLayout/TopTabs/TopTabs.d.ts +0 -0
  101. package/lib/components/TafLayout/TopTabs/TopTabs.spec.d.ts +0 -0
  102. package/lib/components/TafLayout/TopTabs/TopTabs.stories.d.ts +0 -0
  103. package/lib/components/TafLayout/TopTabs/index.d.ts +0 -0
  104. package/lib/components/TafLayout/utils.d.ts +1 -0
  105. package/lib/components/TafLayout/utils.spec.d.ts +0 -0
  106. package/lib/components/TafModule/TafModule.d.ts +0 -0
  107. package/lib/components/TafModule/TafModule.spec.d.ts +0 -0
  108. package/lib/components/TafModule/TafModule.stories.d.ts +0 -0
  109. package/lib/components/TafModule/TafModuleProvider.d.ts +0 -0
  110. package/lib/components/TafModule/index.d.ts +0 -0
  111. package/lib/components/TafWrapper/TafWrapper.d.ts +0 -0
  112. package/lib/components/TafWrapper/TafWrapper.spec.d.ts +0 -0
  113. package/lib/components/TafWrapper/index.d.ts +0 -0
  114. package/lib/storyshots/Storyshots.spec.d.ts +0 -0
  115. package/lib/types.d.ts +0 -0
  116. package/lib/utils/__mocks__/api.d.ts +0 -0
  117. package/lib/utils/api.d.ts +0 -0
  118. package/lib/utils/api.spec.d.ts +0 -0
  119. package/lib/utils/fakeApi.d.ts +0 -0
  120. package/lib/utils/fakeApi.spec.d.ts +0 -0
  121. package/lib/utils/mockdata/fakeTafList.d.ts +1 -0
  122. package/lib/utils/weatherPhenomena.d.ts +0 -0
  123. package/package.json +12 -11
File without changes
File without changes
File without changes
File without changes
@@ -8,6 +8,7 @@ export declare const useIssuesPane: () => {
8
8
  startPosition: IssuesPanePosition;
9
9
  onToggleIssuesPane: (isOpen: boolean, newPosition: IssuesPanePosition) => void;
10
10
  onCloseIssuesPane: () => void;
11
+ onUserHasDragged: () => void;
11
12
  };
12
13
  declare const IssuesPane: React.FC<IssuesPaneProps>;
13
14
  export default IssuesPane;
File without changes
File without changes
File without changes
File without changes
@@ -12,4 +12,5 @@ export interface IssuesPaneProps {
12
12
  isOpen: boolean;
13
13
  handleClose: () => void;
14
14
  startPosition?: IssuesPanePosition;
15
+ onUserHasDragged?: () => void;
15
16
  }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { BaseTaf, TafActions, TafFromBackend, TafFromFrontEnd } from '../../types';
2
+ import { BaseTaf, Taf, TafActions, TafFromBackend, TafFromFrontEnd } from '../../types';
3
3
  import { IssuesPanePosition } from '../IssuesPane/types';
4
4
  export declare const getSnackbarMessage: (isChecked: boolean, location: string) => string;
5
5
  export interface TafFormProps {
@@ -11,6 +11,7 @@ export interface TafFormProps {
11
11
  setIsIssuesPaneOpen?: (isOpen: boolean, position?: IssuesPanePosition) => void;
12
12
  onSwitchEditor?: (formValues: TafFromFrontEnd) => Promise<boolean>;
13
13
  fetchNewTafList?: () => Promise<TafFromBackend[]>;
14
+ previousTaf?: Taf;
14
15
  }
15
16
  declare const TafForm: React.FC<TafFormProps>;
16
17
  export default TafForm;
File without changes
File without changes
File without changes
File without changes
@@ -2,7 +2,10 @@ import { TextFieldProps } from '@mui/material';
2
2
  import React from 'react';
3
3
  import { RegisterOptions } from 'react-hook-form';
4
4
  export declare const getDisplayValue: (value: string, disabled: boolean) => string;
5
- export declare const BaseTextField: React.FC<TextFieldProps>;
5
+ declare type BaseTextFieldProps = TextFieldProps & {
6
+ shouldPreventUppercase?: boolean;
7
+ };
8
+ export declare const BaseTextField: React.FC<BaseTextFieldProps>;
6
9
  interface TafFormTextFieldProps {
7
10
  label: string;
8
11
  disabled?: boolean;
@@ -17,6 +20,7 @@ interface TafFormTextFieldProps {
17
20
  }[];
18
21
  onBlur?: () => void;
19
22
  autoFocus?: boolean;
23
+ shouldPreventUppercase?: boolean;
20
24
  }
21
25
  declare const TafFormTextField: React.FC<TafFormTextFieldProps>;
22
26
  export default TafFormTextField;
File without changes
@@ -28,7 +28,7 @@ export declare const invalidCloudWithPreviousType = "Invalid cloud input, only o
28
28
  export declare const invalidCloudCAVOKMessage = "Invalid cloud input, when CAVOK is used, cloud groups must be empty";
29
29
  export declare const invalidCloud4TypeMissingMessage = "Invalid cloud input for fourth group, CB or TCU required if no other significant convective cloud group present";
30
30
  export declare const validateFirstCloud: (value: string, visibilityValue: string, weatherfield1: string, weatherfield2: string, weatherfield3: string) => boolean | string;
31
- export declare const validateSecondCloud: (firstCloudValue: string, secondCloudValue: string, visibilityValue: string) => boolean | string;
32
- export declare const validateThirdCloud: (firstCloudValue: string, secondCloudValue: string, thirdCloudValue: string, visibilityValue: string) => boolean | string;
33
- export declare const validateFourthCloud: (firstCloudValue: string, secondCloudValue: string, thirdCloudValue: string, fourthCloudValue: string, visibilityValue: string) => boolean | string;
31
+ export declare const validateSecondCloud: (firstCloudValue: string, secondCloudValue: string, visibilityFieldValue: string) => boolean | string;
32
+ export declare const validateThirdCloud: (firstCloudValue: string, secondCloudValue: string, thirdCloudValue: string, visibilityFieldValue: string) => boolean | string;
33
+ export declare const validateFourthCloud: (firstCloudValue: string, secondCloudValue: string, thirdCloudValue: string, fourthCloudValue: string, visibilityFieldValue: string) => boolean | string;
34
34
  export {};
@@ -1 +1,2 @@
1
1
  export declare const prependZeroes: (value: string | number, totalDigits: number) => string;
2
+ export declare const getFieldValue: (fieldValue: string) => string;
@@ -9,7 +9,7 @@ export declare const invalidWeatherCAVOKMessage = "Invalid weather input, when C
9
9
  export declare const invalidWeatherVisibilityBelow5000 = "Invalid weather input, weather codes FU, DU, HZ, DRDU and BLDU need to be combined with a visibility of 5000m or less";
10
10
  export declare const invalidWeatherBRVisibility = "Invalid weather input, weather code BR needs to be combined with a visibility between 1000 and 5000m";
11
11
  export declare const invalidWeatherFGVisibility = "Invalid weather input, weather code FG needs to be combined with a visibility below 1000m";
12
- export declare const validateWeatherField: (value: string, visibilityValue: string, NSWAllowed?: boolean) => boolean | string;
13
- export declare const validateSecondWeatherField: (weather1Value: string, weather2Value: string, visibilityValue: string) => boolean | string;
14
- export declare const validateThirdWeatherField: (weather1Value: string, weather2Value: string, weather3Value: string, visibilityValue: string) => boolean | string;
12
+ export declare const validateWeatherField: (value: string, visibilityFieldValue: string, NSWAllowed?: boolean) => boolean | string;
13
+ export declare const validateSecondWeatherField: (weather1Value: string, weather2Value: string, visibilityFieldValue: string) => boolean | string;
14
+ export declare const validateThirdWeatherField: (weather1Value: string, weather2Value: string, weather3Value: string, visibilityFieldValue: string) => boolean | string;
15
15
  export declare function parseWeatherToObject(value: any): Weather;
File without changes
@@ -1,6 +1,7 @@
1
1
  import Sortable from 'sortablejs';
2
2
  import { BaseForecast, BaseForecastFormData, ChangeGroup, ChangeGroupFormData, TAC, Taf, TafActions, TafFormData, TafStatus } from '../../types';
3
3
  import { FieldNames } from './TafFormRow/types';
4
+ import { IssuesPanePosition } from '../IssuesPane/types';
4
5
  export declare const emptyBaseForecast: {
5
6
  wind: string;
6
7
  visibility: string;
@@ -43,7 +44,7 @@ export declare const useDragOrder: (trigger: (name?: string | string[]) => Promi
43
44
  activeDraggingIndex: number;
44
45
  };
45
46
  export declare const getConfirmationDialogTitle: (action: TafActions) => string;
46
- export declare const isTafAmendedCorrectedChanged: (isFormDirty: boolean, originalTaf: Taf, currentTaf: Taf) => boolean;
47
+ export declare const isTafAmendedCorrectedChanged: (originalTaf: Taf, currentTaf: Taf) => boolean;
47
48
  export declare const getConfirmationDialogContent: (action: TafActions, isFormDirty: () => boolean) => string;
48
49
  export declare const getConfirmationDialogButtonLabel: (action: TafActions) => string;
49
50
  export declare const emptyChangegroup: {
@@ -64,7 +65,7 @@ export declare const emptyChangegroup: {
64
65
  change: string;
65
66
  probability: string;
66
67
  };
67
- export declare const getTafStatusLabel: (status: TafStatus) => string;
68
+ export declare const getTafStatusLabel: (status: TafStatus, action?: TafActions, isFormDisabled?: boolean) => string;
68
69
  export declare const getMessageType: (taf: Taf, tafAction: TafActions) => string;
69
70
  export declare const getAmendedCorrectedTafTimes: (taf: Taf, tafAction: TafActions) => Taf;
70
71
  export declare const createChangeGroup: (changeGroup: ChangeGroupFormData) => ChangeGroupFormData;
@@ -75,4 +76,5 @@ export declare const fromStatusToAction: (tafStatus: TafStatus) => TafActions;
75
76
  export declare const isFormDirty: (dirtyFields: Partial<Readonly<{
76
77
  [x: string]: unknown;
77
78
  }>>) => boolean;
79
+ export declare const getFormRowPosition: (formRow: Element) => IssuesPanePosition;
78
80
  export {};
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AxiosError } from 'axios';
3
- import { TafFromBackend, TafActions, TafStatus, TafFromFrontEnd } from '../../../types';
3
+ import { TafFromBackend, Taf, TafActions, TafStatus, TafFromFrontEnd } from '../../../types';
4
4
  import { IssuesPanePosition } from '../../IssuesPane/types';
5
5
  export declare const fromActionToStatus: (tafAction: TafActions) => TafStatus;
6
6
  export declare type TafError = {
@@ -22,6 +22,8 @@ interface TafPanelProps {
22
22
  setIsFormDisabled?: (isDisabled: boolean) => void;
23
23
  error?: TafError;
24
24
  fetchNewTafList?: () => Promise<TafFromBackend[]>;
25
+ previousTaf: Taf;
26
+ tafAction: TafActions;
25
27
  }
26
28
  export declare const isWarning: (error: TafError) => boolean;
27
29
  export declare const usePostTafRequest: (request: (params?: unknown) => Promise<void>, errorParser?: (error: AxiosError | Error, params: TafFromFrontEnd) => TafError) => {
File without changes
File without changes
File without changes
@@ -19,3 +19,4 @@ export declare const muiTabA11yProps: (index: number) => {
19
19
  };
20
20
  export declare const prepareTafExportValues: (tafToCopy: Taf, currentTaf: TafFormData) => TafFormData;
21
21
  export declare const getNewTafLocationIndex: (tafLocations: TafFromBackend[], previousTafLocationUUID: string) => number;
22
+ export declare const getPreviousTaf: (tafList: TafFromBackend[], currentTaf: TafFromBackend) => Taf;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/lib/types.d.ts CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -14,6 +14,7 @@ export declare const fakeDraftFixedTaf: TafFromBackend;
14
14
  export declare const fakeDraftAmendmentTaf: TafFromBackend;
15
15
  export declare const fakeDraftCorrectedTaf: TafFromBackend;
16
16
  export declare const fakeDraftAmendmentFixedTaf: TafFromBackend;
17
+ export declare const previousTafForfakeDraftAmendmentFixedTaf: TafFromBackend;
17
18
  export declare const fakeAmendmentTaf: TafFromBackend;
18
19
  export declare const fakeCorrectedTaf: TafFromBackend;
19
20
  export declare const fakeAmendmentFixedTaf: TafFromBackend;
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/taf",
3
- "version": "4.11.0",
3
+ "version": "4.13.0",
4
4
  "description": "GeoWeb TAF library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -12,25 +12,25 @@
12
12
  "typings": "./index.d.ts",
13
13
  "dependencies": {},
14
14
  "peerDependencies": {
15
- "@opengeoweb/api": "4.11.0",
16
- "react": "^17.0.2",
15
+ "@opengeoweb/api": "4.13.0",
16
+ "react": "^18.2.0",
17
17
  "axios": "^0.25.0",
18
- "@opengeoweb/shared": "4.11.0",
18
+ "@opengeoweb/shared": "4.13.0",
19
19
  "@mui/material": "^5.10.8",
20
- "@opengeoweb/theme": "4.11.0",
20
+ "@opengeoweb/theme": "4.13.0",
21
21
  "react-draggable": "^4.4.5",
22
22
  "re-resizable": "^6.9.0",
23
23
  "@redux-eggs/core": "^2.2.0",
24
24
  "react-redux": "^8.0.4",
25
- "@opengeoweb/form-fields": "4.11.0",
25
+ "@opengeoweb/form-fields": "4.13.0",
26
26
  "react-hook-form": "^7.41.5",
27
27
  "moment": "^2.29.0",
28
28
  "moment-timezone": "^0.5.31",
29
29
  "@mui/x-date-pickers": "^5.0.4",
30
30
  "lodash": "^4.17.20",
31
31
  "date-fns": "^2.29.3",
32
- "@opengeoweb/core": "4.11.0",
33
- "@opengeoweb/webmap": "4.11.0",
32
+ "@opengeoweb/core": "4.13.0",
33
+ "@opengeoweb/webmap": "4.13.0",
34
34
  "throttle-debounce": "^3.0.1",
35
35
  "proj4": "^2.6.2",
36
36
  "react-intl": "^5.17.5",
@@ -45,9 +45,10 @@
45
45
  "redux-saga": "^1.2.1",
46
46
  "@redux-eggs/redux-toolkit": "^2.2.0",
47
47
  "@redux-eggs/saga-extension": "^2.2.0",
48
- "react-dom": "^17.0.2",
49
- "@opengeoweb/authentication": "4.11.0",
48
+ "react-dom": "^18.2.0",
49
+ "@opengeoweb/authentication": "4.13.0",
50
50
  "react-router-dom": "^6.4.2",
51
- "query-string": "^6.13.7"
51
+ "query-string": "^6.13.7",
52
+ "@emotion/react": "^11.10.4"
52
53
  }
53
54
  }