vxrn 2.6.21 → 2.7.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.
- package/dist/plugins/reactNativeDevServer.mjs +2 -2
- package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
- package/dist/plugins/reactNativeDevServer.native.js +2 -2
- package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
- package/dist/utils/createNativeDevEngine.mjs +45 -36
- package/dist/utils/createNativeDevEngine.mjs.map +1 -1
- package/dist/utils/createNativeDevEngine.native.js +45 -36
- package/dist/utils/createNativeDevEngine.native.js.map +1 -1
- package/package.json +12 -12
- package/src/config/glbAssets.test.ts +25 -4
- package/src/plugins/reactNativeDevServer.ts +2 -2
- package/src/utils/createNativeDevEngine.test.ts +113 -0
- package/src/utils/createNativeDevEngine.ts +53 -30
- package/types/utils/createNativeDevEngine.d.ts +1 -0
- package/types/utils/createNativeDevEngine.d.ts.map +1 -1
|
@@ -34,13 +34,28 @@ function glbFixture() {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
it('imports GLB as a web URL and preserves emitted binary bytes', async () => {
|
|
37
|
-
const root = await mkdtemp(join(
|
|
37
|
+
const root = await mkdtemp(join(tmpdir(), 'vxrn-glb-web-'))
|
|
38
38
|
const bytes = glbFixture()
|
|
39
39
|
await writeFile(join(root, 'sofa.glb'), bytes)
|
|
40
40
|
await writeFile(
|
|
41
41
|
join(root, 'entry.js'),
|
|
42
42
|
"import model from './sofa.glb'; globalThis.model = model"
|
|
43
43
|
)
|
|
44
|
+
// stub the workspace packages getBaseViteConfig resolves from root; the
|
|
45
|
+
// fixture entry itself imports no packages.
|
|
46
|
+
await mkdir(join(root, 'node_modules/react-native'), { recursive: true })
|
|
47
|
+
await writeFile(
|
|
48
|
+
join(root, 'node_modules/react-native/package.json'),
|
|
49
|
+
JSON.stringify({ name: 'react-native', version: '0.87.1' })
|
|
50
|
+
)
|
|
51
|
+
for (const name of ['query-string', 'url-parse']) {
|
|
52
|
+
await mkdir(join(root, `node_modules/@vxrn/${name}`), { recursive: true })
|
|
53
|
+
await writeFile(
|
|
54
|
+
join(root, `node_modules/@vxrn/${name}/package.json`),
|
|
55
|
+
JSON.stringify({ name: `@vxrn/${name}`, version: '0.0.0', main: 'index.js' })
|
|
56
|
+
)
|
|
57
|
+
await writeFile(join(root, `node_modules/@vxrn/${name}/index.js`), 'export default {}')
|
|
58
|
+
}
|
|
44
59
|
const config = await getBaseViteConfig({ root, mode: 'development' })
|
|
45
60
|
const server = await createServer({
|
|
46
61
|
...config,
|
|
@@ -181,13 +196,13 @@ it.each(['ios', 'android'] as const)(
|
|
|
181
196
|
)
|
|
182
197
|
|
|
183
198
|
it('serves legacy native dev GLB bytes with their content type', async () => {
|
|
184
|
-
const root = await mkdtemp(join(
|
|
199
|
+
const root = await mkdtemp(join(tmpdir(), 'vxrn-glb-dev-'))
|
|
185
200
|
const file = join(root, 'sofa.glb')
|
|
186
201
|
const bytes = glbFixture()
|
|
187
202
|
await writeFile(file, bytes)
|
|
188
203
|
const plugin = reactNativeDevAssetPlugin({ assetExts: DEFAULT_ASSET_EXTS, mode: 'dev' })
|
|
189
204
|
let middleware: Function
|
|
190
|
-
;(plugin.configResolved as Function)({ root
|
|
205
|
+
;(plugin.configResolved as Function)({ root })
|
|
191
206
|
;(plugin.configureServer as Function)({
|
|
192
207
|
config: {
|
|
193
208
|
logger: {
|
|
@@ -204,9 +219,14 @@ it('serves legacy native dev GLB bytes with their content type', async () => {
|
|
|
204
219
|
})
|
|
205
220
|
const headers: Record<string, string> = {}
|
|
206
221
|
let served: Buffer | undefined
|
|
222
|
+
// the dev middleware reads the request path relative to the server cwd,
|
|
223
|
+
// which matches the project root on a real server; run it from the fixture
|
|
224
|
+
// root so the relative request keeps serving semantics with no path escape.
|
|
225
|
+
const previousCwd = process.cwd()
|
|
226
|
+
process.chdir(root)
|
|
207
227
|
try {
|
|
208
228
|
await middleware!(
|
|
209
|
-
{ url: `/__vxrn_dev_native_assets/${relative(
|
|
229
|
+
{ url: `/__vxrn_dev_native_assets/${relative(root, file)}` },
|
|
210
230
|
{
|
|
211
231
|
setHeader: (name: string, value: string) => {
|
|
212
232
|
headers[name] = value
|
|
@@ -223,6 +243,7 @@ it('serves legacy native dev GLB bytes with their content type', async () => {
|
|
|
223
243
|
expect(served).toEqual(bytes)
|
|
224
244
|
expect(headers['content-type']).toBe('model/gltf-binary')
|
|
225
245
|
} finally {
|
|
246
|
+
process.chdir(previousCwd)
|
|
226
247
|
await rm(root, { recursive: true, force: true })
|
|
227
248
|
}
|
|
228
249
|
})
|
|
@@ -629,9 +629,9 @@ export function createReactNativeDevServerPlugin(
|
|
|
629
629
|
)
|
|
630
630
|
}
|
|
631
631
|
|
|
632
|
-
const
|
|
632
|
+
const map = await (await getDevEngine(platform)).getSourceMap()
|
|
633
633
|
res.writeHead(200, { 'Content-Type': 'application/json' })
|
|
634
|
-
res.end(JSON.stringify(symbolicateNativeStack(stack,
|
|
634
|
+
res.end(JSON.stringify(symbolicateNativeStack(stack, map)))
|
|
635
635
|
} catch (err) {
|
|
636
636
|
console.error(`[vxrn] symbolicate failed`, err)
|
|
637
637
|
res.writeHead(500, { 'Content-Type': 'application/json' })
|
|
@@ -962,6 +962,119 @@ if (import.meta.hot) import.meta.hot.accept(() => {})
|
|
|
962
962
|
}
|
|
963
963
|
)
|
|
964
964
|
|
|
965
|
+
it(
|
|
966
|
+
'applies an immediate follow-up HMR restore and serves getSourceMap() without triggering a full bundle rebuild',
|
|
967
|
+
{ timeout: 30_000 },
|
|
968
|
+
async () => {
|
|
969
|
+
const root = realpathSync(await mkdtemp(join(tmpdir(), 'vxrn-native-hmr-restore-')))
|
|
970
|
+
await mkdir(join(root, 'app'), { recursive: true })
|
|
971
|
+
await mkdir(join(root, 'features/hmr'), { recursive: true })
|
|
972
|
+
const childPath = join(root, 'features/hmr/HmrProbeChild.tsx')
|
|
973
|
+
const routePath = join(root, 'app/hmr-probe.tsx')
|
|
974
|
+
const childSource = (version: string) =>
|
|
975
|
+
`export function HmrProbeChild() { return ${JSON.stringify(version)} }\nglobalThis.childVersion = HmrProbeChild()\n`
|
|
976
|
+
|
|
977
|
+
await writeFile(childPath, childSource('component-v1'))
|
|
978
|
+
await writeFile(
|
|
979
|
+
routePath,
|
|
980
|
+
`import { HmrProbeChild } from '../features/hmr/HmrProbeChild.tsx'\nglobalThis.routeEvaluations = (globalThis.routeEvaluations || 0) + 1\nexport default function HmrProbe() { return HmrProbeChild() }\n`
|
|
981
|
+
)
|
|
982
|
+
|
|
983
|
+
let fullBuildCount = 0
|
|
984
|
+
const updates: Array<Extract<any, { type: 'hmr:update' }>> = []
|
|
985
|
+
let resolveSecondUpdate!: (update: any) => void
|
|
986
|
+
const secondUpdateReceived = new Promise<any>((resolve) => {
|
|
987
|
+
resolveSecondUpdate = resolve
|
|
988
|
+
})
|
|
989
|
+
let runtime: any
|
|
990
|
+
let context: any
|
|
991
|
+
let sourceMapPromise: Promise<string> | undefined
|
|
992
|
+
|
|
993
|
+
const native = await createNativeDevEngine({
|
|
994
|
+
root,
|
|
995
|
+
port: 0,
|
|
996
|
+
platform: 'ios',
|
|
997
|
+
plugins: [
|
|
998
|
+
{
|
|
999
|
+
name: 'native-hmr-restore-entry',
|
|
1000
|
+
transform(code, id) {
|
|
1001
|
+
if (id.endsWith('/__virtual-native-entry.tsx')) {
|
|
1002
|
+
const registryImport =
|
|
1003
|
+
code.match(/import \{ routes \} from [^;]+;/)?.[0] ?? ''
|
|
1004
|
+
const accept = code.slice(code.lastIndexOf('if (import.meta.hot)'))
|
|
1005
|
+
return `${registryImport}\nglobalThis.routeMap = routes\n${accept}`
|
|
1006
|
+
}
|
|
1007
|
+
},
|
|
1008
|
+
async renderChunk() {
|
|
1009
|
+
fullBuildCount++
|
|
1010
|
+
if (fullBuildCount > 1) {
|
|
1011
|
+
await new Promise((resolve) => setTimeout(resolve, 1500))
|
|
1012
|
+
}
|
|
1013
|
+
return null
|
|
1014
|
+
},
|
|
1015
|
+
},
|
|
1016
|
+
],
|
|
1017
|
+
onHmrUpdate(update) {
|
|
1018
|
+
if (update.type !== 'hmr:update') return
|
|
1019
|
+
updates.push(update)
|
|
1020
|
+
expect(runtime.applyHmrUpdate(update.code, update.changedIds, update.seq)).toBe(
|
|
1021
|
+
true
|
|
1022
|
+
)
|
|
1023
|
+
if (updates.length === 1) {
|
|
1024
|
+
// /symbolicate requests the source map while the device is running,
|
|
1025
|
+
// and the test immediately restores the file to component-v1 upon
|
|
1026
|
+
// seeing hmr-session-ready.
|
|
1027
|
+
sourceMapPromise = native.getSourceMap()
|
|
1028
|
+
void writeFile(childPath, childSource('component-v1'))
|
|
1029
|
+
} else if (updates.length === 2) {
|
|
1030
|
+
resolveSecondUpdate(update)
|
|
1031
|
+
}
|
|
1032
|
+
},
|
|
1033
|
+
})
|
|
1034
|
+
|
|
1035
|
+
try {
|
|
1036
|
+
const initial = await native.getBundle()
|
|
1037
|
+
context = {
|
|
1038
|
+
console: { ...console, error() {} },
|
|
1039
|
+
setTimeout,
|
|
1040
|
+
clearTimeout,
|
|
1041
|
+
__ReactRefresh: {
|
|
1042
|
+
register: () => {},
|
|
1043
|
+
createSignatureFunctionForTransform: () => (type: unknown) => type,
|
|
1044
|
+
isLikelyComponentType: (value: unknown) => typeof value === 'function',
|
|
1045
|
+
performReactRefresh: () => {},
|
|
1046
|
+
},
|
|
1047
|
+
$RefreshReg$: () => {},
|
|
1048
|
+
$RefreshSig$: () => (type: unknown) => type,
|
|
1049
|
+
}
|
|
1050
|
+
runInNewContext(initial.code, context)
|
|
1051
|
+
await context.routeMap['/app/hmr-probe.tsx']()
|
|
1052
|
+
expect(context.childVersion).toBe('component-v1')
|
|
1053
|
+
expect(context.routeEvaluations).toBe(1)
|
|
1054
|
+
expect(fullBuildCount).toBe(1)
|
|
1055
|
+
|
|
1056
|
+
runtime = context.__rolldown_runtime__
|
|
1057
|
+
await native.engine.registerClient(runtime.clientId)
|
|
1058
|
+
|
|
1059
|
+
await writeFile(childPath, childSource('hmr-session-ready'))
|
|
1060
|
+
const secondUpdate = await secondUpdateReceived
|
|
1061
|
+
expect(await sourceMapPromise).toBe(initial.map)
|
|
1062
|
+
expect(updates).toHaveLength(2)
|
|
1063
|
+
expect(context.childVersion).toBe('component-v1')
|
|
1064
|
+
expect(context.routeEvaluations).toBe(1)
|
|
1065
|
+
expect(fullBuildCount).toBe(1)
|
|
1066
|
+
// notifyPayloadDelivered records the first patch's ancestor factories as
|
|
1067
|
+
// shipped, so the restore patch only carries the leaf module itself.
|
|
1068
|
+
expect(secondUpdate.code.match(/registerFactory\("[^"]+"/g)).toEqual([
|
|
1069
|
+
'registerFactory("features/hmr/HmrProbeChild.tsx"',
|
|
1070
|
+
])
|
|
1071
|
+
} finally {
|
|
1072
|
+
await native.close()
|
|
1073
|
+
await rm(root, { recursive: true, force: true })
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
)
|
|
1077
|
+
|
|
965
1078
|
it(
|
|
966
1079
|
'registers a Rolldown 1.2 client and applies a self-accepted patch',
|
|
967
1080
|
{ timeout: 30_000 },
|
|
@@ -102,6 +102,7 @@ export interface NativeDevBundle {
|
|
|
102
102
|
interface NativeDevEngineResult {
|
|
103
103
|
engine: DevEngine
|
|
104
104
|
getBundle: () => Promise<NativeDevBundle>
|
|
105
|
+
getSourceMap: () => Promise<string>
|
|
105
106
|
getAsset: (pathname: string, hash?: string) => NativeDevAsset | undefined
|
|
106
107
|
close: () => Promise<void>
|
|
107
108
|
}
|
|
@@ -699,6 +700,12 @@ try {
|
|
|
699
700
|
},
|
|
700
701
|
|
|
701
702
|
onHmrUpdates: async (result) => {
|
|
703
|
+
// wait for rolldown's BundleCompleted handler (which tears down and
|
|
704
|
+
// recreates the macOS fsevent stream on path updates) to finish before
|
|
705
|
+
// touching the route file or notifying clients, so a follow-up edit
|
|
706
|
+
// triggered by the HMR message cannot land while the watcher is stopped.
|
|
707
|
+
await engine?.ensureCurrentBuildFinish()
|
|
708
|
+
|
|
702
709
|
if (result instanceof Error) {
|
|
703
710
|
console.error('[vxrn] HMR error:', result.message)
|
|
704
711
|
onHmrUpdate?.({ type: 'hmr:error' })
|
|
@@ -712,6 +719,7 @@ try {
|
|
|
712
719
|
|
|
713
720
|
for (const { clientId, update } of result.updates) {
|
|
714
721
|
if (update.type === 'Patch' && update.code) {
|
|
722
|
+
await engine.notifyPayloadDelivered(update.filename)
|
|
715
723
|
onHmrUpdate?.({
|
|
716
724
|
type: 'hmr:update',
|
|
717
725
|
clientId,
|
|
@@ -728,7 +736,9 @@ try {
|
|
|
728
736
|
// patches update the registered client runtime directly. a full bundle rebuild
|
|
729
737
|
// is only needed when the runtime requests a reload.
|
|
730
738
|
rebuildStrategy: 'never',
|
|
731
|
-
watch: {
|
|
739
|
+
watch: {
|
|
740
|
+
exclude: ['**/node_modules/.test/**', '**/.git/**'],
|
|
741
|
+
},
|
|
732
742
|
})
|
|
733
743
|
|
|
734
744
|
async function handleOutput(result: RolldownOutput | Error) {
|
|
@@ -823,38 +833,51 @@ try {
|
|
|
823
833
|
})
|
|
824
834
|
await rebuildIfRouteGraphChanged()
|
|
825
835
|
|
|
836
|
+
const getBundle = async (): Promise<NativeDevBundle> => {
|
|
837
|
+
// a runtime invalidation marks the full output stale before reloading. pull
|
|
838
|
+
// that output before serving the cached bundle to the restarted app.
|
|
839
|
+
await queueEngineWork(async () => {
|
|
840
|
+
await engine.ensureLatestBuildOutput()
|
|
841
|
+
await outputProcessed
|
|
842
|
+
})
|
|
843
|
+
if (currentBundle) return currentBundle
|
|
844
|
+
if (firstBuildError) throw firstBuildError
|
|
845
|
+
if (!bundlePromise) {
|
|
846
|
+
let timeoutId: ReturnType<typeof setTimeout>
|
|
847
|
+
bundlePromise = new Promise((resolve, reject) => {
|
|
848
|
+
bundleResolve = (value) => {
|
|
849
|
+
clearTimeout(timeoutId)
|
|
850
|
+
resolve(value)
|
|
851
|
+
}
|
|
852
|
+
bundleReject = (error) => {
|
|
853
|
+
clearTimeout(timeoutId)
|
|
854
|
+
reject(error)
|
|
855
|
+
}
|
|
856
|
+
timeoutId = setTimeout(() => {
|
|
857
|
+
bundleResolve = null
|
|
858
|
+
bundleReject = null
|
|
859
|
+
bundlePromise = null
|
|
860
|
+
reject(new Error('[vxrn] bundle build timed out after 120s'))
|
|
861
|
+
}, 120_000)
|
|
862
|
+
})
|
|
863
|
+
}
|
|
864
|
+
return bundlePromise
|
|
865
|
+
}
|
|
866
|
+
|
|
826
867
|
return {
|
|
827
868
|
engine,
|
|
828
869
|
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
if (
|
|
839
|
-
|
|
840
|
-
bundlePromise = new Promise((resolve, reject) => {
|
|
841
|
-
bundleResolve = (value) => {
|
|
842
|
-
clearTimeout(timeoutId)
|
|
843
|
-
resolve(value)
|
|
844
|
-
}
|
|
845
|
-
bundleReject = (error) => {
|
|
846
|
-
clearTimeout(timeoutId)
|
|
847
|
-
reject(error)
|
|
848
|
-
}
|
|
849
|
-
timeoutId = setTimeout(() => {
|
|
850
|
-
bundleResolve = null
|
|
851
|
-
bundleReject = null
|
|
852
|
-
bundlePromise = null
|
|
853
|
-
reject(new Error('[vxrn] bundle build timed out after 120s'))
|
|
854
|
-
}, 120_000)
|
|
855
|
-
})
|
|
856
|
-
}
|
|
857
|
-
return bundlePromise
|
|
870
|
+
getBundle,
|
|
871
|
+
|
|
872
|
+
async getSourceMap() {
|
|
873
|
+
// resolve frames against the map of the bundle currently running on the
|
|
874
|
+
// device. every Fast Refresh patch marks rolldown's full output stale, so
|
|
875
|
+
// calling ensureLatestBuildOutput() here would kick off a full bundle
|
|
876
|
+
// rebuild that blocks WatchEvent HMR tasks and replaces the map before
|
|
877
|
+
// the device has reloaded.
|
|
878
|
+
await outputProcessed
|
|
879
|
+
if (currentBundle) return currentBundle.map
|
|
880
|
+
return (await getBundle()).map
|
|
858
881
|
},
|
|
859
882
|
|
|
860
883
|
getAsset(pathname, hash) {
|
|
@@ -47,6 +47,7 @@ export interface NativeDevBundle {
|
|
|
47
47
|
interface NativeDevEngineResult {
|
|
48
48
|
engine: DevEngine;
|
|
49
49
|
getBundle: () => Promise<NativeDevBundle>;
|
|
50
|
+
getSourceMap: () => Promise<string>;
|
|
50
51
|
getAsset: (pathname: string, hash?: string) => NativeDevAsset | undefined;
|
|
51
52
|
close: () => Promise<void>;
|
|
52
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH,OAAO,KAAK,EAA+B,MAAM,EAAkB,MAAM,UAAU,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgCtD,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAE3D;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,GAAG,EAAE,OAAO,CAAA;CACb;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;CAChD;AAED,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;CACZ,GAGD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAEzB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAA;IACzE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AA8BD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM;IAsEV,GAAG;QAGD,OAAO,EAAE,SAAS;;IAEpB,MAAM;IAgCN,MAAM;QACJ,KAAK;;EAGV;AA8FD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnE;AAmCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkD5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUhE;AA4ED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"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"}
|