diff --git a/.all-contributorsrc b/.all-contributorsrc
index 1c4ec73..f8d2780 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -312,6 +312,24 @@
"contributions": [
"content"
]
+ },
+ {
+ "login": "blueline1984",
+ "name": "White",
+ "avatar_url": "https://avatars.githubusercontent.com/u/97525377?v=4",
+ "profile": "http://github.com/blueline1984",
+ "contributions": [
+ "content"
+ ]
+ },
+ {
+ "login": "seokkamoni",
+ "name": "๊น์์ง(poki)",
+ "avatar_url": "https://avatars.githubusercontent.com/u/102217654?v=4",
+ "profile": "https://blog.seokkamoni.me",
+ "contributions": [
+ "content"
+ ]
}
],
"contributorsPerLine": 7,
diff --git a/.gitignore b/.gitignore
index 752b9ee..dfe5b13 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
.next
node_modules
.DS_Store
+.idea
diff --git a/README.md b/README.md
index b2cfb89..51bc13c 100644
--- a/README.md
+++ b/README.md
@@ -76,6 +76,10 @@
HarrySeop ๐ |
์ ํ ๐ |
SangSeop Hwang ๐ |
+ White ๐ |
+
+
+ ๊น์์ง(poki) ๐ |
diff --git a/pages/docs/app/api-reference/functions/unstable_cache.mdx b/pages/docs/app/api-reference/functions/unstable_cache.mdx
index ad0e048..cf262f2 100644
--- a/pages/docs/app/api-reference/functions/unstable_cache.mdx
+++ b/pages/docs/app/api-reference/functions/unstable_cache.mdx
@@ -51,17 +51,17 @@ const data = unstable_cache(fetchData, keyParts, options)()
import { unstable_cache } from 'next/cache';
export default async function Page({ params }: { params: { userID: string } }) {
- const getCachedUser = unstable_cache(
- async () => {
-
- return { id: params.userID };
+ const getCachedUser = unstable_cache(
+ async () => {
+ return { id: params.userId }
},
[params.userID], // ์ฌ๊ธฐ์ userID๋ฅผ keyParts์ ์ถ๊ฐํ์ฌ Next.js๊ฐ ์๋ก ๋ค๋ฅธ userID์ ๋ํด ๋ณ๋์ ์บ์๋ฅผ ๋ง๋ค ์ ์๋๋ก ํฉ๋๋ค.
{
tags: ["cached-user-tag"],
revalidate: 60,
}
-);
+ );
+
...
}
```
@@ -70,17 +70,17 @@ export default async function Page({ params }: { params: { userID: string } }) {
import { unstable_cache } from 'next/cache';
export default async function Page({ params }) {
- const getCachedUser = unstable_cache(
- async () => {
-
- return { id: params.userID };
+ const getCachedUser = unstable_cache(
+ async () => {
+ return { id: params.userId }
},
[params.userID], // ์ฌ๊ธฐ์ userID๋ฅผ keyParts์ ์ถ๊ฐํ์ฌ Next.js๊ฐ ์๋ก ๋ค๋ฅธ userID์ ๋ํด ๋ณ๋์ ์บ์๋ฅผ ๋ง๋ค ์ ์๋๋ก ํฉ๋๋ค.
{
tags: ["cached-user-tag"],
revalidate: 60,
}
-);
+ );
+
...
}
```
diff --git a/pages/docs/app/building-your-application/data-fetching/fetching.mdx b/pages/docs/app/building-your-application/data-fetching/fetching.mdx
index 04dc2f8..023db74 100644
--- a/pages/docs/app/building-your-application/data-fetching/fetching.mdx
+++ b/pages/docs/app/building-your-application/data-fetching/fetching.mdx
@@ -179,9 +179,7 @@ import fetcher from '@/utils/fetcher'
export default function PollingComponent {
// ํด๋ง ๊ฐ๊ฒฉ์ 2000 ๋ฐ๋ฆฌ์ด๋ก ์ค์
- const {
-
- data } = useSWR('/api/data', fetcher, { refreshInterval: 2000 });
+ const { data } = useSWR('/api/data', fetcher, { refreshInterval: 2000 });
return '...'
}
diff --git a/pages/docs/app/building-your-application/rendering/composition-patterns.mdx b/pages/docs/app/building-your-application/rendering/composition-patterns.mdx
index aae9e65..b4cca65 100644
--- a/pages/docs/app/building-your-application/rendering/composition-patterns.mdx
+++ b/pages/docs/app/building-your-application/rendering/composition-patterns.mdx
@@ -417,9 +417,7 @@ Client์ Server Components๋ฅผ ํผํฉํ ๋, UI๋ฅผ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ก ์
์ด๋ฌํ ํด๋ผ์ด์ธํธ ํ์ ํธ๋ฆฌ ๋ด์์๋ ์ฌ์ ํ Server Components๋ฅผ ์ค์ฒฉํ๊ฑฐ๋ Server Actions๋ฅผ ํธ์ถํ ์ ์์ง๋ง, ๋ค์ ์ฌํญ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค:
- ์์ฒญ-์๋ต ๋ผ์ดํ์ฌ์ดํด ๋์ ์ฝ๋๊ฐ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ด๋ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์ ์๋ฒ์ ๋ฐ์ดํฐ๋ ๋ฆฌ์์ค์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ, **์๋ก์ด** ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ฒ์ด์ง, ์๋ค ๊ฐ๋ค ํ๋ ๊ฒ์ด ์๋๋๋ค.
-- ์๋ก์ด ์์ฒญ์ด ์๋ฒ๋ก ์ ์ก๋๋ฉด, ๋ชจ๋ Server Components๊ฐ ๋จผ์ ๋ ๋๋ง๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ด์์ ์ค์ฒฉ๋ Server Components๋ฅผ ํฌํจํฉ๋๋ค. ๋ ๋๋ง๋ ๊ฒฐ๊ณผ([RSC Payload](/docs/app/building-your-application/rendering/server-components#what-is-the-react-server
-
--component-payload-rsc))์๋ Client Components์ ์์น์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, ํด๋ผ์ด์ธํธ์์ React๋ RSC Payload๋ฅผ ์ฌ์ฉํ์ฌ Server์ Client Components๋ฅผ ๋จ์ผ ํธ๋ฆฌ๋ก ์กฐ์ ํฉ๋๋ค.
+- ์๋ก์ด ์์ฒญ์ด ์๋ฒ๋ก ์ ์ก๋๋ฉด, ๋ชจ๋ Server Components๊ฐ ๋จผ์ ๋ ๋๋ง๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ด์์ ์ค์ฒฉ๋ Server Components๋ฅผ ํฌํจํฉ๋๋ค. ๋ ๋๋ง๋ ๊ฒฐ๊ณผ([RSC Payload](/docs/app/building-your-application/rendering/server-components#what-is-the-react-server-component-payload-rsc))์๋ Client Components์ ์์น์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, ํด๋ผ์ด์ธํธ์์ React๋ RSC Payload๋ฅผ ์ฌ์ฉํ์ฌ Server์ Client Components๋ฅผ ๋จ์ผ ํธ๋ฆฌ๋ก ์กฐ์ ํฉ๋๋ค.
{/* Diagram */}
@@ -560,5 +558,5 @@ export default function Page() {
> **์ฐธ๊ณ **:
>
-> - ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ ๋ ์ค์ฒฉ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด "๋ด์ฉ์ ์๋ก ์ฌ๋ฆฌ๋" ํจํด์ด ์ฌ์ฉ๋์์ต๋๋ค.
+> - ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ ๋ ์ค์ฒฉ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด "lifting content up" ํจํด์ด ์ฌ์ฉ๋์์ต๋๋ค.
> - `children` prop์ ๊ตญํ๋์ง ์์ต๋๋ค. JSX๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ด๋ค prop์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
diff --git a/pages/docs/app/building-your-application/routing/middleware.mdx b/pages/docs/app/building-your-application/routing/middleware.mdx
index 248a280..e28049e 100644
--- a/pages/docs/app/building-your-application/routing/middleware.mdx
+++ b/pages/docs/app/building-your-application/routing/middleware.mdx
@@ -165,7 +165,7 @@ export const config = {
3. ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์( `:`๋ก ์์)์ ์์ ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค: `/about/:path*`๋ `*`์ด *0๊ฐ ์ด์*์ด๋ฏ๋ก `/about/a/b/c`์ ์ผ์นํฉ๋๋ค. `?`๋ _0๊ฐ ๋๋ 1๊ฐ_, `+`๋ _1๊ฐ ์ด์_
4. ๊ดํธ๋ก ๋๋ฌ์ธ์ธ ์ ๊ท์์ ์ฌ์ฉํ ์ ์์ต๋๋ค: `/about/(.*)`๋ `/about/:path*`์ ๋์ผํฉ๋๋ค
-์์ธํ ๋ด์ฉ์ [path-to-regexp](https://github.com/pillarjs/path-to-regexp#path-to-regexp-
+์์ธํ ๋ด์ฉ์ [path-to-regexp](https://github.com/pillarjs/path-to-regexp#path-to-regexp)
1. ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
diff --git a/pages/docs/app/building-your-application/routing/parallel-routes.mdx b/pages/docs/app/building-your-application/routing/parallel-routes.mdx
index f66ca0c..b58baf5 100644
--- a/pages/docs/app/building-your-application/routing/parallel-routes.mdx
+++ b/pages/docs/app/building-your-application/routing/parallel-routes.mdx
@@ -222,10 +222,7 @@ export default function Layout({ children }) {
Parallel Routes๋ [Intercepting Routes](/docs/app/building-your-application/routing/intercepting-routes)์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฅ ๋งํฌ๋ฅผ ์ง์ํ๋ ๋ชจ๋ฌ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ฌ์ ๊ตฌ์ถํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค:
- ๋ชจ๋ฌ ์ฝํ
์ธ ๋ฅผ **URL์ ํตํด ๊ณต์ ๊ฐ๋ฅ**ํ๊ฒ ๋ง๋ค๊ธฐ.
-- ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นจํ ๋ **์ปจํ
์คํธ๋ฅผ ์ ์ง**ํ์ฌ ๋ชจ๋ฌ์ ๋ซ
-
-์ง ์๊ธฐ.
-
+- ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นจํ ๋ **์ปจํ
์คํธ๋ฅผ ์ ์ง**ํ์ฌ ๋ชจ๋ฌ์ ๋ซ์ง ์๊ธฐ.
- ์ด์ ํ์ ์ **๋ชจ๋ฌ ๋ซ๊ธฐ**.
- ์์ผ๋ก ํ์ ์ **๋ชจ๋ฌ ๋ค์ ์ด๊ธฐ**.
diff --git a/pages/docs/app/building-your-application/routing/route-handlers.mdx b/pages/docs/app/building-your-application/routing/route-handlers.mdx
index 0c00029..4efb1f5 100644
--- a/pages/docs/app/building-your-application/routing/route-handlers.mdx
+++ b/pages/docs/app/building-your-application/routing/route-handlers.mdx
@@ -212,9 +212,7 @@ import { headers } from 'next/headers'
export async function GET(request: Request) {
const headersList = headers()
- const referer = headersList.get('refer
-
-er')
+ const referer = headersList.get('referer')
return new Response('Hello, Next.js!', {
status: 200,
@@ -510,9 +508,7 @@ export async function GET(request) {
> **์์๋๋ฉด ์ข์ ์ **:
>
-> - ์ฌ๋ฌ Route Handlers์ CORS ํค๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด [Middleware](/docs/app/building-your-application/routing/middleware#cors) ๋๋ [`
-
-next.config.js` ํ์ผ](/docs/app/api-reference/next-config-js/headers#cors)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+> - ์ฌ๋ฌ Route Handlers์ CORS ํค๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด [Middleware](/docs/app/building-your-application/routing/middleware#cors) ๋๋ [`next.config.js` ํ์ผ](/docs/app/api-reference/next-config-js/headers#cors)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
> - ๋๋ [CORS ์์ ](https://github.com/vercel/examples/blob/main/edge-functions/cors/lib/cors.ts) ํจํค์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
@@ -558,7 +554,7 @@ export async function POST(request) {
### Non-UI Responses
-Route Handlers๋ฅผ ์ฌ์ฉํ์ฌ UI๊ฐ ์๋ ์ฝํ
์ธ ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. [`sitemap.xml`](/docs/app/api-reference/file-conventions/metadata/sitemap#generating-a-sitemap-using-code-js-ts), [`robots.txt`](/docs/app/api-reference/file-conventions/metadata/robots#generate-a-robots-file), [`app icons`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx), [open graph images](/docs/app/api-reference/file-conventions/metadata/opengraph-image) ๋ฑ์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
+Route Handlers๋ฅผ ์ฌ์ฉํ์ฌ UI๊ฐ ์๋ ์ฝํ
์ธ ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. [`sitemap.xml`](/docs/app/api-reference/file-conventions/metadata/sitemap#generating-a-sitemap-using-code-js-ts), [`robots.txt`](/docs/app/api-reference/file-conventions/metadata/robots#generate-a-robots-file), [`app icons`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx), [`open graph images`](/docs/app/api-reference/file-conventions/metadata/opengraph-image) ๋ฑ์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
```ts filename="app/rss.xml/route.ts" switcher
export async function GET() {
diff --git a/pages/docs/pages/api-reference/functions/use-amp.mdx b/pages/docs/pages/api-reference/functions/use-amp.mdx
index 9b94eb3..7ca897f 100644
--- a/pages/docs/pages/api-reference/functions/use-amp.mdx
+++ b/pages/docs/pages/api-reference/functions/use-amp.mdx
@@ -3,6 +3,8 @@ title: useAmp
description: Enable AMP in a page, and control the way Next.js adds AMP to the page with the AMP config.
---
+# useAMP
+
Examples
@@ -10,24 +12,24 @@ description: Enable AMP in a page, and control the way Next.js adds AMP to the p
-> AMP support is one of our advanced features, you can [read more about AMP here](/docs/pages/building-your-application/configuring/amp).
+> AMP ์ง์์ ๊ณ ๊ธ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ, [์ฌ๊ธฐ์์ AMP์ ๋ํด ๋ ์ฝ์ด๋ณด์ค ์ ์์ต๋๋ค](/docs/pages/building-your-application/configuring/amp).
-To enable AMP, add the following config to your page:
+AMP๋ฅผ ํ์ฑํํ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ํ์ด์ง์ ์ถ๊ฐํ์ธ์:
```jsx filename="pages/index.js"
export const config = { amp: true }
```
-The `amp` config accepts the following values:
+`amp` ์ค์ ์ ๋ค์์ ๊ฐ์ ํ์ฉํฉ๋๋ค:
-- `true` - The page will be AMP-only
-- `'hybrid'` - The page will have two versions, one with AMP and another one with HTML
+- `true` - ํ์ด์ง๊ฐ AMP-only ์ํ๊ฐ ๋ฉ๋๋ค
+- `hybrid` - ํ์ด์ง์ AMP ๋ฒ์ ๊ณผ HTML ๋ฒ์ ์ด ๋ชจ๋ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค
-To learn more about the `amp` config, read the sections below.
+`amp` ๊ตฌ์ฑ์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด, ์๋ ์น์
์ ์ฝ์ด๋ณด์ธ์.
## AMP First Page
-Take a look at the following example:
+๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์ธ์:
```jsx filename="pages/about.js"
export const config = { amp: true }
@@ -39,15 +41,15 @@ function About(props) {
export default About
```
-The page above is an AMP-only page, which means:
+์์ ์์ ํ์ด์ง๋ AMP-only ํ์ด์ง๋ก, ๋ค์์ ์๋ฏธํฉ๋๋ค:
-- The page has no Next.js or React client-side runtime
-- The page is automatically optimized with [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer), an optimizer that applies the same transformations as AMP caches (improves performance by up to 42%)
-- The page has a user-accessible (optimized) version of the page and a search-engine indexable (unoptimized) version of the page
+- ํ์ด์ง์ Next.js ๋๋ React ํด๋ผ์ด์ธํธ ์ธก ๋ฐํ์์ด ์์ต๋๋ค
+- ํ์ด์ง๋ ์๋์ผ๋ก [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer)๋ก ์ต์ ํ๋๋ฉฐ, ์ด ์ต์ ํ ๋๊ตฌ๋ AMP ์บ์์ ๋์ผํ ๋ณํ์ ์ ์ฉํฉ๋๋ค(์ฑ๋ฅ์ด ์ต๋ 42% ํฅ์๋จ)
+- ํ์ด์ง๋ ์ฌ์ฉ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ต์ ํ๋ ๋ฒ์ ๊ณผ ๊ฒ์ ์์ง์ ์ธ๋ฑ์ฑ ๊ฐ๋ฅํ ์ต์ ํ๋์ง ์์ ๋ฒ์ ์ ๊ฐ์ต๋๋ค
## Hybrid AMP Page
-Take a look at the following example:
+๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์ธ์:
```jsx filename="pages/about.js"
import { useAmp } from 'next/amp'
@@ -78,9 +80,9 @@ function About(props) {
export default About
```
-The page above is a hybrid AMP page, which means:
+์์ ์์ ํ์ด์ง๋ Hybrid AMP ํ์ด์ง๋ก, ๋ค์์ ์๋ฏธํฉ๋๋ค:
-- The page is rendered as traditional HTML (default) and AMP HTML (by adding `?amp=1` to the URL)
-- The AMP version of the page only has valid optimizations applied with AMP Optimizer so that it is indexable by search-engines
+- ํ์ด์ง๋ ๊ธฐ์กด์ HTML(๊ธฐ๋ณธ๊ฐ)๊ณผ AMP HTML(URL์ `?amp=1` ์ถ๊ฐํ๋ ๊ฒ์ ํตํด)๋ก ๋ ๋๋ง๋ฉ๋๋ค
+- ํ์ด์ง์ AMP ๋ฒ์ ์ AMP Optimizer๋ก ์ ์ฉ๋ ์ ํจํ ์ต์ ํ๋ง ์ ์ฉ๋์ด ๊ฒ์ ์์ง์ ์ธ๋ฑ์ฑ๋ฉ๋๋ค
-The page uses `useAmp` to differentiate between modes, it's a [React Hook](https://react.dev/reference/react) that returns `true` if the page is using AMP, and `false` otherwise.
+์ด ํ์ด์ง๋ `useAmp`๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋๋ฅผ ๊ตฌ๋ถํ๋ฉฐ, ์ด ํจ์(`useAmp`)๋ ํ์ด์ง๊ฐ AMP๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ `true`๋ฅผ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ `false`๋ฅผ ๋ฐํํ๋ [React Hook](https://react.dev/reference/react)์
๋๋ค.
diff --git a/pages/docs/pages/building-your-application/Routing.mdx b/pages/docs/pages/building-your-application/Routing.mdx
index eccc04d..65721b3 100644
--- a/pages/docs/pages/building-your-application/Routing.mdx
+++ b/pages/docs/pages/building-your-application/Routing.mdx
@@ -3,4 +3,4 @@ title: Routing
description: Learn the fundamentals of routing for front-end applications with the Pages Router.
---
-The Pages Router has a file-system based router built on concepts of pages. When a file is added to the `pages` directory it's automatically available as a route. Learn more about routing in the Pages Router:
+Pages Router๋ ํ์ด์ง ์ปจ์
์ ๊ธฐ๋ฐ์ผ๋ก ํ ํ์ผ ์์คํ
๋ผ์ฐํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. `pages` ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก ํด๋น ํ์ผ์ด ๊ฒฝ๋ก๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. Pages Router์ ๋ผ์ฐํ
์ ๋ํด ๋ ์์๋ณด์ธ์:
diff --git a/pages/index.mdx b/pages/index.mdx
index 61affc7..084bb6c 100644
--- a/pages/index.mdx
+++ b/pages/index.mdx
@@ -610,6 +610,42 @@ Next.js ๊ณต์ ๋ฌธ์ ํ๊ธ ๋ฒ์ญ ํ๋ก์ ํธ์
๋๋ค. by [@luciancah](https
๐
+
+
+
+
+
+ White
+
+
+
+
+ ๐
+
+ |
+
+
+
+
+
+
+
+ ๊น์์ง(poki)
+
+
+
+
+ ๐
+
+ |