@xyo-network/react-chain-network 1.20.4 → 1.20.5
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.
- package/dist/browser/hooks/provider/index.d.ts +0 -4
- package/dist/browser/hooks/provider/index.d.ts.map +1 -1
- package/dist/browser/hooks/provider/useViewerInPage.d.ts +7 -4
- package/dist/browser/hooks/provider/useViewerInPage.d.ts.map +1 -1
- package/dist/browser/hooks/status/usePollNetworkStatus.d.ts.map +1 -1
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.mjs +129 -151
- package/dist/browser/index.mjs.map +1 -1
- package/dist/browser/story/NetworkGatewayDecorators.d.ts +5 -0
- package/dist/browser/story/NetworkGatewayDecorators.d.ts.map +1 -0
- package/dist/browser/story/index.d.ts +2 -0
- package/dist/browser/story/index.d.ts.map +1 -0
- package/package.json +10 -10
- package/src/hooks/provider/UseViewerInPageV2.stories.tsx +5 -14
- package/src/hooks/provider/index.ts +0 -4
- package/src/hooks/provider/useViewerInPage.ts +11 -33
- package/src/hooks/status/usePollNetworkStatus.ts +2 -3
- package/src/index.ts +1 -0
- package/src/story/NetworkGatewayDecorators.tsx +44 -0
- package/src/story/index.ts +1 -0
- package/dist/browser/hooks/provider/useActiveNetworkCurrentBlock.d.ts +0 -101
- package/dist/browser/hooks/provider/useActiveNetworkCurrentBlock.d.ts.map +0 -1
- package/dist/browser/hooks/provider/useActiveNetworkNetwork.d.ts +0 -2
- package/dist/browser/hooks/provider/useActiveNetworkNetwork.d.ts.map +0 -1
- package/dist/browser/hooks/provider/useActiveNetworkRunner.d.ts +0 -2
- package/dist/browser/hooks/provider/useActiveNetworkRunner.d.ts.map +0 -1
- package/dist/browser/hooks/provider/useViewerInWallet.d.ts +0 -7
- package/dist/browser/hooks/provider/useViewerInWallet.d.ts.map +0 -1
- package/src/hooks/provider/UseViewerInPage.stories.tsx +0 -129
- package/src/hooks/provider/useActiveNetworkCurrentBlock.ts +0 -26
- package/src/hooks/provider/useActiveNetworkNetwork.ts +0 -10
- package/src/hooks/provider/useActiveNetworkRunner.ts +0 -11
- package/src/hooks/provider/useViewerInWallet.ts +0 -14
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { XyoViewer } from '@xyo-network/xl1-sdk';
|
|
2
|
-
export declare const useActiveNetworkCurrentBlock: (refresh?: number, viewer?: XyoViewer) => [[{
|
|
3
|
-
$epoch: number;
|
|
4
|
-
block: import("@xyo-network/xl1-sdk").XL1BlockNumber;
|
|
5
|
-
chain: import("@xylabs/hex").BrandedHex;
|
|
6
|
-
previous: import("@xylabs/hex").BrandedHash | null;
|
|
7
|
-
schema: "network.xyo.boundwitness" & {
|
|
8
|
-
readonly __schema: true;
|
|
9
|
-
};
|
|
10
|
-
addresses: (Lowercase<string> & {
|
|
11
|
-
readonly __hex: true;
|
|
12
|
-
} & {
|
|
13
|
-
readonly __address: true;
|
|
14
|
-
})[];
|
|
15
|
-
payload_hashes: import("@xylabs/hex").BrandedHash[];
|
|
16
|
-
payload_schemas: import("@xyo-network/payload-model").BrandedSchema<string>[];
|
|
17
|
-
previous_hashes: (import("@xylabs/hex").BrandedHash | null)[];
|
|
18
|
-
$signatures: (import("@xylabs/hex").BrandedHex | null)[];
|
|
19
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
20
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
21
|
-
protocol?: number | undefined;
|
|
22
|
-
step_hashes?: import("@xylabs/hex").BrandedHash[] | undefined;
|
|
23
|
-
$destination?: (Lowercase<string> & {
|
|
24
|
-
readonly __hex: true;
|
|
25
|
-
} & {
|
|
26
|
-
readonly __address: true;
|
|
27
|
-
}) | undefined;
|
|
28
|
-
$sourceQuery?: import("@xylabs/hex").BrandedHash | undefined;
|
|
29
|
-
}, {
|
|
30
|
-
[x: string]: unknown;
|
|
31
|
-
schema: import("@xyo-network/payload-model").BrandedSchema<string>;
|
|
32
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
33
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
34
|
-
}[]] | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
|
|
35
|
-
export declare const useActiveNetworkCurrentBlockInPage: (refresh?: number) => [[{
|
|
36
|
-
$epoch: number;
|
|
37
|
-
block: import("@xyo-network/xl1-sdk").XL1BlockNumber;
|
|
38
|
-
chain: import("@xylabs/hex").BrandedHex;
|
|
39
|
-
previous: import("@xylabs/hex").BrandedHash | null;
|
|
40
|
-
schema: "network.xyo.boundwitness" & {
|
|
41
|
-
readonly __schema: true;
|
|
42
|
-
};
|
|
43
|
-
addresses: (Lowercase<string> & {
|
|
44
|
-
readonly __hex: true;
|
|
45
|
-
} & {
|
|
46
|
-
readonly __address: true;
|
|
47
|
-
})[];
|
|
48
|
-
payload_hashes: import("@xylabs/hex").BrandedHash[];
|
|
49
|
-
payload_schemas: import("@xyo-network/payload-model").BrandedSchema<string>[];
|
|
50
|
-
previous_hashes: (import("@xylabs/hex").BrandedHash | null)[];
|
|
51
|
-
$signatures: (import("@xylabs/hex").BrandedHex | null)[];
|
|
52
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
53
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
54
|
-
protocol?: number | undefined;
|
|
55
|
-
step_hashes?: import("@xylabs/hex").BrandedHash[] | undefined;
|
|
56
|
-
$destination?: (Lowercase<string> & {
|
|
57
|
-
readonly __hex: true;
|
|
58
|
-
} & {
|
|
59
|
-
readonly __address: true;
|
|
60
|
-
}) | undefined;
|
|
61
|
-
$sourceQuery?: import("@xylabs/hex").BrandedHash | undefined;
|
|
62
|
-
}, {
|
|
63
|
-
[x: string]: unknown;
|
|
64
|
-
schema: import("@xyo-network/payload-model").BrandedSchema<string>;
|
|
65
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
66
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
67
|
-
}[]] | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
|
|
68
|
-
export declare const useActiveNetworkCurrentBlockInWallet: (refresh?: number) => [[{
|
|
69
|
-
$epoch: number;
|
|
70
|
-
block: import("@xyo-network/xl1-sdk").XL1BlockNumber;
|
|
71
|
-
chain: import("@xylabs/hex").BrandedHex;
|
|
72
|
-
previous: import("@xylabs/hex").BrandedHash | null;
|
|
73
|
-
schema: "network.xyo.boundwitness" & {
|
|
74
|
-
readonly __schema: true;
|
|
75
|
-
};
|
|
76
|
-
addresses: (Lowercase<string> & {
|
|
77
|
-
readonly __hex: true;
|
|
78
|
-
} & {
|
|
79
|
-
readonly __address: true;
|
|
80
|
-
})[];
|
|
81
|
-
payload_hashes: import("@xylabs/hex").BrandedHash[];
|
|
82
|
-
payload_schemas: import("@xyo-network/payload-model").BrandedSchema<string>[];
|
|
83
|
-
previous_hashes: (import("@xylabs/hex").BrandedHash | null)[];
|
|
84
|
-
$signatures: (import("@xylabs/hex").BrandedHex | null)[];
|
|
85
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
86
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
87
|
-
protocol?: number | undefined;
|
|
88
|
-
step_hashes?: import("@xylabs/hex").BrandedHash[] | undefined;
|
|
89
|
-
$destination?: (Lowercase<string> & {
|
|
90
|
-
readonly __hex: true;
|
|
91
|
-
} & {
|
|
92
|
-
readonly __address: true;
|
|
93
|
-
}) | undefined;
|
|
94
|
-
$sourceQuery?: import("@xylabs/hex").BrandedHash | undefined;
|
|
95
|
-
}, {
|
|
96
|
-
[x: string]: unknown;
|
|
97
|
-
schema: import("@xyo-network/payload-model").BrandedSchema<string>;
|
|
98
|
-
_hash: import("@xylabs/hex").BrandedHash;
|
|
99
|
-
_dataHash: import("@xylabs/hex").BrandedHash;
|
|
100
|
-
}[]] | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
|
|
101
|
-
//# sourceMappingURL=useActiveNetworkCurrentBlock.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveNetworkCurrentBlock.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useActiveNetworkCurrentBlock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAKrD,eAAO,MAAM,4BAA4B,GAAI,gBAAW,EAAE,SAAS,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAI3E,CAAA;AAGD,eAAO,MAAM,kCAAkC,GAAI,gBAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAK7D,CAAA;AAED,eAAO,MAAM,oCAAoC,GAAI,gBAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAK/D,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveNetworkNetwork.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useActiveNetworkNetwork.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,4EAInC,CAAA"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare const useActiveNetworkRunner: () => [import("@xyo-network/xl1-protocol-sdk").CreatableProviderInstance<import("@xyo-network/xl1-rpc").JsonRpcXyoRunner, string[], import("@xyo-network/xl1-protocol-sdk").CreatableProviderParams<import("@xyo-network/xl1-protocol-sdk").CreatableProviderContextType>, import("@xyo-network/xl1-protocol-sdk").CreatableProviderEventData> | undefined, Error | undefined, import("@xylabs/react-promise").UsePromiseState | undefined];
|
|
2
|
-
//# sourceMappingURL=useActiveNetworkRunner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useActiveNetworkRunner.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useActiveNetworkRunner.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,6aAKlC,CAAA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the viewer directly from the active network
|
|
3
|
-
* @returns - The viewer for the active network
|
|
4
|
-
*/
|
|
5
|
-
/** @deprecated use useViewerFromGateway in \@xyo-network/react-chain-provider */
|
|
6
|
-
export declare const useViewerInWallet: () => import("@xyo-network/xl1-protocol").XyoViewer | undefined;
|
|
7
|
-
//# sourceMappingURL=useViewerInWallet.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useViewerInWallet.d.ts","sourceRoot":"","sources":["../../../../src/hooks/provider/useViewerInWallet.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,iEAI7B,CAAA"}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MenuItem, Select, Stack, Typography,
|
|
3
|
-
} from '@mui/material'
|
|
4
|
-
import type { Decorator, StoryFn } from '@storybook/react-vite'
|
|
5
|
-
import { ButtonEx } from '@xylabs/react-button'
|
|
6
|
-
import { ErrorRender } from '@xylabs/react-error'
|
|
7
|
-
import {
|
|
8
|
-
isDefined, isDefinedNotNull, isUndefined, isUndefinedOrNull,
|
|
9
|
-
} from '@xylabs/sdk-js'
|
|
10
|
-
import { IframeWalletWarningDecorator } from '@xyo-network/react-chain-shared'
|
|
11
|
-
import type { HydratedBlock, NetworkId } from '@xyo-network/xl1-sdk'
|
|
12
|
-
import {
|
|
13
|
-
LocalNetwork, MainNetwork, SequenceNetwork,
|
|
14
|
-
} from '@xyo-network/xl1-sdk'
|
|
15
|
-
import React, { useCallback, useState } from 'react'
|
|
16
|
-
|
|
17
|
-
import { BroadcastedRpcCallsDrawer } from '../../components/index.ts'
|
|
18
|
-
import type { ChainNetworkSettings } from '../../context/index.ts'
|
|
19
|
-
import { ChainNetworkProvider, useChainNetwork } from '../../context/index.ts'
|
|
20
|
-
import { useRpcBroadcastListener } from './useRpcBroadcastListener.ts'
|
|
21
|
-
import { useViewerInPage } from './useViewerInPage.ts'
|
|
22
|
-
|
|
23
|
-
const UseViewerInPageStoryDecorator: Decorator = (Story, args) => {
|
|
24
|
-
return (
|
|
25
|
-
<ChainNetworkProvider networkSettings={networkSettings}>
|
|
26
|
-
<Story {...args} />
|
|
27
|
-
</ChainNetworkProvider>
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const AvailableNetworks = [MainNetwork, SequenceNetwork, LocalNetwork]
|
|
32
|
-
const networkSettings: ChainNetworkSettings = { [LocalNetwork.id]: { proxy: true } }
|
|
33
|
-
const getActiveNetwork = async () => await Promise.resolve(AvailableNetworks[2])
|
|
34
|
-
const UseViewerInPageStoryProxyDecorator: Decorator = (Story, args) => {
|
|
35
|
-
return (
|
|
36
|
-
<ChainNetworkProvider networks={AvailableNetworks} networkSettings={networkSettings} getActiveNetwork={getActiveNetwork}>
|
|
37
|
-
<StubNetworkSelector />
|
|
38
|
-
<Story {...args} />
|
|
39
|
-
</ChainNetworkProvider>
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const StubNetworkSelector: React.FC = () => {
|
|
44
|
-
const { updateActiveNetwork } = useChainNetwork()
|
|
45
|
-
return (
|
|
46
|
-
<Select size="small" defaultValue={LocalNetwork.id} onChange={event => updateActiveNetwork?.(event.target.value as NetworkId)}>
|
|
47
|
-
{AvailableNetworks.map(network => (
|
|
48
|
-
<MenuItem key={network.id} value={network.id}>{network.name}</MenuItem>
|
|
49
|
-
))}
|
|
50
|
-
</Select>
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const UseViewerInPageStoryTemplate: React.FC = () => {
|
|
55
|
-
const { activeNetwork } = useChainNetwork()
|
|
56
|
-
const viewer = useViewerInPage(activeNetwork)
|
|
57
|
-
const [error, setError] = useState<Error | null>(null)
|
|
58
|
-
const [result, setResult] = useState<HydratedBlock | null | undefined>()
|
|
59
|
-
const [loading, setLoading] = useState(false)
|
|
60
|
-
const [drawerOpen, setDrawerOpen] = useState(false)
|
|
61
|
-
const { clearEvents, events } = useRpcBroadcastListener()
|
|
62
|
-
|
|
63
|
-
const handleClick = useCallback(async () => {
|
|
64
|
-
if (isDefinedNotNull(viewer)) {
|
|
65
|
-
try {
|
|
66
|
-
setError(null)
|
|
67
|
-
setResult(undefined)
|
|
68
|
-
setLoading(true)
|
|
69
|
-
const block = await viewer.currentBlock()
|
|
70
|
-
setError(null)
|
|
71
|
-
setResult(block)
|
|
72
|
-
setLoading(false)
|
|
73
|
-
} catch (err) {
|
|
74
|
-
setError(err as Error)
|
|
75
|
-
setResult(undefined)
|
|
76
|
-
setLoading(false)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}, [viewer])
|
|
80
|
-
|
|
81
|
-
if (isDefined(viewer) && isUndefined(result) && isUndefinedOrNull(error) && !loading) {
|
|
82
|
-
void handleClick()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<Stack gap={2} alignItems="center">
|
|
87
|
-
<BroadcastedRpcCallsDrawer
|
|
88
|
-
open={drawerOpen}
|
|
89
|
-
events={events}
|
|
90
|
-
onClearEvents={clearEvents}
|
|
91
|
-
onClose={() => setDrawerOpen(false)}
|
|
92
|
-
/>
|
|
93
|
-
<ButtonEx disabled={Object.keys(events).length === 0} variant="contained" onClick={() => setDrawerOpen(true)}>
|
|
94
|
-
Show Broadcasted RPC Calls
|
|
95
|
-
</ButtonEx>
|
|
96
|
-
<ButtonEx loading={loading} variant="contained" onClick={() => void handleClick()} disabled={!isDefined(viewer)}>
|
|
97
|
-
Get Current Block
|
|
98
|
-
</ButtonEx>
|
|
99
|
-
{isDefined(result)
|
|
100
|
-
? (
|
|
101
|
-
<Typography variant="h4">
|
|
102
|
-
Block:
|
|
103
|
-
{result?.[0].block}
|
|
104
|
-
</Typography>
|
|
105
|
-
)
|
|
106
|
-
: null}
|
|
107
|
-
<pre>
|
|
108
|
-
{JSON.stringify(result, null, 2)}
|
|
109
|
-
</pre>
|
|
110
|
-
<ErrorRender error={error} />
|
|
111
|
-
</Stack>
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export default {
|
|
116
|
-
title: 'provider/useViewerInPage',
|
|
117
|
-
component: UseViewerInPageStoryTemplate,
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const Template: StoryFn<typeof UseViewerInPageStoryTemplate> = args => <UseViewerInPageStoryTemplate {...args} />
|
|
121
|
-
|
|
122
|
-
const Default = Template.bind({})
|
|
123
|
-
Default.decorators = [IframeWalletWarningDecorator, UseViewerInPageStoryDecorator]
|
|
124
|
-
Default.args = {}
|
|
125
|
-
const Proxy = Template.bind({})
|
|
126
|
-
Proxy.decorators = [IframeWalletWarningDecorator, UseViewerInPageStoryProxyDecorator]
|
|
127
|
-
Proxy.args = {}
|
|
128
|
-
|
|
129
|
-
export { Default, Proxy }
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { useCurrentBlock, useViewerFromWallet } from '@xyo-network/react-chain-provider'
|
|
2
|
-
import type { XyoViewer } from '@xyo-network/xl1-sdk'
|
|
3
|
-
|
|
4
|
-
import { useViewerInPage } from './useViewerInPage.ts'
|
|
5
|
-
|
|
6
|
-
/* @deprecated - use useCurrentBlock from @xyo-network/react-chain-provider instead */
|
|
7
|
-
export const useActiveNetworkCurrentBlock = (refresh = 1, viewer?: XyoViewer) => {
|
|
8
|
-
const currentBlock = useCurrentBlock(refresh, viewer)
|
|
9
|
-
|
|
10
|
-
return currentBlock
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/* @deprecated - use useCurrentBlock from @xyo-network/react-chain-provider instead */
|
|
14
|
-
export const useActiveNetworkCurrentBlockInPage = (refresh = 1) => {
|
|
15
|
-
const viewer = useViewerInPage()
|
|
16
|
-
const currentBlock = useCurrentBlock(refresh, viewer)
|
|
17
|
-
|
|
18
|
-
return currentBlock
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const useActiveNetworkCurrentBlockInWallet = (refresh = 1) => {
|
|
22
|
-
const [viewer] = useViewerFromWallet()
|
|
23
|
-
const currentBlock = useCurrentBlock(refresh, viewer)
|
|
24
|
-
|
|
25
|
-
return currentBlock
|
|
26
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { useNetwork } from '@xyo-network/react-chain-provider'
|
|
2
|
-
|
|
3
|
-
import { useChainNetwork } from '../../context/index.ts'
|
|
4
|
-
|
|
5
|
-
/* @deprecated - use useNetworkFromGateway from @xyo-network/react-chain-provider instead */
|
|
6
|
-
export const useActiveNetworkNetwork = () => {
|
|
7
|
-
const { activeNetwork } = useChainNetwork()
|
|
8
|
-
const network = useNetwork(activeNetwork?.id)
|
|
9
|
-
return network
|
|
10
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { useHttpRpcRunner } from '@xyo-network/react-chain-provider'
|
|
2
|
-
|
|
3
|
-
import { useChainNetwork } from '../../context/index.ts'
|
|
4
|
-
|
|
5
|
-
/* @deprecated use useRunnerFromGateway in @xyo-network/react-chain-provider */
|
|
6
|
-
export const useActiveNetworkRunner = () => {
|
|
7
|
-
const { activeNetwork } = useChainNetwork()
|
|
8
|
-
const runner = useHttpRpcRunner(activeNetwork?.url)
|
|
9
|
-
|
|
10
|
-
return runner
|
|
11
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { useHttpRpcViewer } from '@xyo-network/react-chain-provider'
|
|
2
|
-
|
|
3
|
-
import { useChainNetwork } from '../../context/index.ts'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Get the viewer directly from the active network
|
|
7
|
-
* @returns - The viewer for the active network
|
|
8
|
-
*/
|
|
9
|
-
/** @deprecated use useViewerFromGateway in \@xyo-network/react-chain-provider */
|
|
10
|
-
export const useViewerInWallet = () => {
|
|
11
|
-
const { activeNetwork } = useChainNetwork()
|
|
12
|
-
const walletViewer = useHttpRpcViewer(activeNetwork?.url)
|
|
13
|
-
return walletViewer
|
|
14
|
-
}
|