diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2012-11-06 07:34:54 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2012-11-06 07:47:04 +0000 |
commit | 9ffa33879f083bf98684f47c8b72d19056238c04 (patch) | |
tree | 3f96ea339b5799c5684881b1088890fc09691799 | |
parent | 5f79be0a60d23a57e7ea474716e8d82bc65a2710 (diff) | |
download | alpine_aports-9ffa33879f083bf98684f47c8b72d19056238c04.tar.bz2 alpine_aports-9ffa33879f083bf98684f47c8b72d19056238c04.tar.xz alpine_aports-9ffa33879f083bf98684f47c8b72d19056238c04.zip |
main/linux-grsec: upgrade to 3.6.6 kernel
-rw-r--r-- | main/linux-grsec/APKBUILD | 8 | ||||
-rw-r--r-- | main/linux-grsec/grsecurity-2.9.1-3.6.6-201211051957.patch (renamed from main/linux-grsec/grsecurity-2.9.1-3.6.5-201211042157.patch) | 151 |
2 files changed, 75 insertions, 84 deletions
diff --git a/main/linux-grsec/APKBUILD b/main/linux-grsec/APKBUILD index 85f40da36c..f05e610a03 100644 --- a/main/linux-grsec/APKBUILD +++ b/main/linux-grsec/APKBUILD | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | _flavor=grsec | 3 | _flavor=grsec |
4 | pkgname=linux-${_flavor} | 4 | pkgname=linux-${_flavor} |
5 | pkgver=3.6.5 | 5 | pkgver=3.6.6 |
6 | _kernver=3.6 | 6 | _kernver=3.6 |
7 | pkgrel=0 | 7 | pkgrel=0 |
8 | pkgdesc="Linux kernel with grsecurity" | 8 | pkgdesc="Linux kernel with grsecurity" |
@@ -14,7 +14,7 @@ _config=${config:-kernelconfig.${CARCH}} | |||
14 | install= | 14 | install= |
15 | source="http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-$_kernver.tar.xz | 15 | source="http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-$_kernver.tar.xz |
16 | http://ftp.kernel.org/pub/linux/kernel/v3.x/patch-$pkgver.xz | 16 | http://ftp.kernel.org/pub/linux/kernel/v3.x/patch-$pkgver.xz |
17 | grsecurity-2.9.1-3.6.5-201211042157.patch | 17 | grsecurity-2.9.1-3.6.6-201211051957.patch |
18 | 18 | ||
19 | 0004-arp-flush-arp-cache-on-device-change.patch | 19 | 0004-arp-flush-arp-cache-on-device-change.patch |
20 | 20 | ||
@@ -139,8 +139,8 @@ dev() { | |||
139 | } | 139 | } |
140 | 140 | ||
141 | md5sums="1a1760420eac802c541a20ab51a093d1 linux-3.6.tar.xz | 141 | md5sums="1a1760420eac802c541a20ab51a093d1 linux-3.6.tar.xz |
142 | 6ad8ceebb9b5c1bf69a0c07ef7cc81f2 patch-3.6.5.xz | 142 | 11d6d8749d4612a77f43f0531c0f2824 patch-3.6.6.xz |
143 | 0affb0d4559c04d76251be6755338ae1 grsecurity-2.9.1-3.6.5-201211042157.patch | 143 | 562292d1cfaca88f4a78e15779fdb3e6 grsecurity-2.9.1-3.6.6-201211051957.patch |
144 | 776adeeb5272093574f8836c5037dd7d 0004-arp-flush-arp-cache-on-device-change.patch | 144 | 776adeeb5272093574f8836c5037dd7d 0004-arp-flush-arp-cache-on-device-change.patch |
145 | 0fe70e3640b55adb6800e6eebe74ea4d kernelconfig.x86 | 145 | 0fe70e3640b55adb6800e6eebe74ea4d kernelconfig.x86 |
146 | b7707e701f190d97c3552b7ec292b897 kernelconfig.x86_64" | 146 | b7707e701f190d97c3552b7ec292b897 kernelconfig.x86_64" |
diff --git a/main/linux-grsec/grsecurity-2.9.1-3.6.5-201211042157.patch b/main/linux-grsec/grsecurity-2.9.1-3.6.6-201211051957.patch index 18206e5084..b18fa6094f 100644 --- a/main/linux-grsec/grsecurity-2.9.1-3.6.5-201211042157.patch +++ b/main/linux-grsec/grsecurity-2.9.1-3.6.6-201211051957.patch | |||
@@ -251,7 +251,7 @@ index ad7e2e5..199f49e 100644 | |||
251 | 251 | ||
252 | pcd. [PARIDE] | 252 | pcd. [PARIDE] |
253 | diff --git a/Makefile b/Makefile | 253 | diff --git a/Makefile b/Makefile |
254 | index 6e4a00d..4c7aa4f 100644 | 254 | index 471b83c..a290aa2 100644 |
255 | --- a/Makefile | 255 | --- a/Makefile |
256 | +++ b/Makefile | 256 | +++ b/Makefile |
257 | @@ -241,8 +241,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ | 257 | @@ -241,8 +241,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ |
@@ -1849,6 +1849,23 @@ index 677357f..8828dda 100644 | |||
1849 | .late_init = n8x0_menelaus_late_init, | 1849 | .late_init = n8x0_menelaus_late_init, |
1850 | }; | 1850 | }; |
1851 | 1851 | ||
1852 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c | ||
1853 | index 37afbd1..c22ad7c 100644 | ||
1854 | --- a/arch/arm/mach-omap2/omap_hwmod.c | ||
1855 | +++ b/arch/arm/mach-omap2/omap_hwmod.c | ||
1856 | @@ -187,10 +187,10 @@ struct omap_hwmod_soc_ops { | ||
1857 | int (*is_hardreset_asserted)(struct omap_hwmod *oh, | ||
1858 | struct omap_hwmod_rst_info *ohri); | ||
1859 | int (*init_clkdm)(struct omap_hwmod *oh); | ||
1860 | -}; | ||
1861 | +} __no_const; | ||
1862 | |||
1863 | /* soc_ops: adapts the omap_hwmod code to the currently-booted SoC */ | ||
1864 | -static struct omap_hwmod_soc_ops soc_ops; | ||
1865 | +static struct omap_hwmod_soc_ops soc_ops __read_only; | ||
1866 | |||
1867 | /* omap_hwmod_list contains all registered struct omap_hwmods */ | ||
1868 | static LIST_HEAD(omap_hwmod_list); | ||
1852 | diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c | 1869 | diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c |
1853 | index c3bd834..e81ef02 100644 | 1870 | index c3bd834..e81ef02 100644 |
1854 | --- a/arch/arm/mm/fault.c | 1871 | --- a/arch/arm/mm/fault.c |
@@ -30983,10 +31000,10 @@ index af7cfb8..aadc2a3 100644 | |||
30983 | if (++trycnt > 100000) { | 31000 | if (++trycnt > 100000) { |
30984 | NV_ERROR(dev, "%s failed and gave up.\n", __func__); | 31001 | NV_ERROR(dev, "%s failed and gave up.\n", __func__); |
30985 | diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c | 31002 | diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c |
30986 | index c610144..97440e2 100644 | 31003 | index f5e9584..05934ba 100644 |
30987 | --- a/drivers/gpu/drm/nouveau/nouveau_state.c | 31004 | --- a/drivers/gpu/drm/nouveau/nouveau_state.c |
30988 | +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | 31005 | +++ b/drivers/gpu/drm/nouveau/nouveau_state.c |
30989 | @@ -490,7 +490,7 @@ static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev) | 31006 | @@ -492,7 +492,7 @@ static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev) |
30990 | bool can_switch; | 31007 | bool can_switch; |
30991 | 31008 | ||
30992 | spin_lock(&dev->count_lock); | 31009 | spin_lock(&dev->count_lock); |
@@ -33781,7 +33798,7 @@ index 1cbfc6b..56e1dbb 100644 | |||
33781 | /*----------------------------------------------------------------*/ | 33798 | /*----------------------------------------------------------------*/ |
33782 | 33799 | ||
33783 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | 33800 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
33784 | index 611b5f7..cee0bfb 100644 | 33801 | index 05bb49e..84d7ce6 100644 |
33785 | --- a/drivers/md/raid1.c | 33802 | --- a/drivers/md/raid1.c |
33786 | +++ b/drivers/md/raid1.c | 33803 | +++ b/drivers/md/raid1.c |
33787 | @@ -1810,7 +1810,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) | 33804 | @@ -1810,7 +1810,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) |
@@ -37692,6 +37709,18 @@ index 683bedc..86dba9a 100644 | |||
37692 | #endif | 37709 | #endif |
37693 | } | 37710 | } |
37694 | 37711 | ||
37712 | diff --git a/drivers/staging/omapdrm/omap_drv.c b/drivers/staging/omapdrm/omap_drv.c | ||
37713 | index 4beab94..44149ee 100644 | ||
37714 | --- a/drivers/staging/omapdrm/omap_drv.c | ||
37715 | +++ b/drivers/staging/omapdrm/omap_drv.c | ||
37716 | @@ -761,7 +761,6 @@ static struct drm_driver omap_drm_driver = { | ||
37717 | .irq_postinstall = dev_irq_postinstall, | ||
37718 | .irq_uninstall = dev_irq_uninstall, | ||
37719 | .irq_handler = dev_irq_handler, | ||
37720 | - .reclaim_buffers = drm_core_reclaim_buffers, | ||
37721 | #ifdef CONFIG_DEBUG_FS | ||
37722 | .debugfs_init = omap_debugfs_init, | ||
37723 | .debugfs_cleanup = omap_debugfs_cleanup, | ||
37695 | diff --git a/drivers/staging/rtl8712/rtl871x_io.h b/drivers/staging/rtl8712/rtl871x_io.h | 37724 | diff --git a/drivers/staging/rtl8712/rtl871x_io.h b/drivers/staging/rtl8712/rtl871x_io.h |
37696 | index dc23395..cf7e9b1 100644 | 37725 | index dc23395..cf7e9b1 100644 |
37697 | --- a/drivers/staging/rtl8712/rtl871x_io.h | 37726 | --- a/drivers/staging/rtl8712/rtl871x_io.h |
@@ -37938,7 +37967,7 @@ index 9fc9a60..68d4c10 100644 | |||
37938 | 37967 | ||
37939 | void se_dev_set_default_attribs( | 37968 | void se_dev_set_default_attribs( |
37940 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | 37969 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
37941 | index 269f544..32def0d 100644 | 37970 | index 7502660..f214d9f 100644 |
37942 | --- a/drivers/target/target_core_transport.c | 37971 | --- a/drivers/target/target_core_transport.c |
37943 | +++ b/drivers/target/target_core_transport.c | 37972 | +++ b/drivers/target/target_core_transport.c |
37944 | @@ -1098,7 +1098,7 @@ struct se_device *transport_add_device_to_core_hba( | 37973 | @@ -1098,7 +1098,7 @@ struct se_device *transport_add_device_to_core_hba( |
@@ -44150,19 +44179,6 @@ index e5b7731..b9c59fb 100644 | |||
44150 | int err; | 44179 | int err; |
44151 | u32 ftype; | 44180 | u32 ftype; |
44152 | struct ceph_mds_reply_info_parsed *rinfo; | 44181 | struct ceph_mds_reply_info_parsed *rinfo; |
44153 | diff --git a/fs/ceph/export.c b/fs/ceph/export.c | ||
44154 | index 02ce909..9349bb3 100644 | ||
44155 | --- a/fs/ceph/export.c | ||
44156 | +++ b/fs/ceph/export.c | ||
44157 | @@ -90,6 +90,8 @@ static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len, | ||
44158 | *max_len = handle_length; | ||
44159 | type = 255; | ||
44160 | } | ||
44161 | + if (dentry) | ||
44162 | + dput(dentry); | ||
44163 | return type; | ||
44164 | } | ||
44165 | |||
44166 | diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c | 44182 | diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c |
44167 | index d9ea6ed..1e6c8ac 100644 | 44183 | index d9ea6ed..1e6c8ac 100644 |
44168 | --- a/fs/cifs/cifs_debug.c | 44184 | --- a/fs/cifs/cifs_debug.c |
@@ -45787,57 +45803,6 @@ index 5c69f2b..05dec7f 100644 | |||
45787 | atomic_t s_lock_busy; | 45803 | atomic_t s_lock_busy; |
45788 | 45804 | ||
45789 | /* locality groups */ | 45805 | /* locality groups */ |
45790 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c | ||
45791 | index 8ce0076..cc2d77c 100644 | ||
45792 | --- a/fs/ext4/ialloc.c | ||
45793 | +++ b/fs/ext4/ialloc.c | ||
45794 | @@ -716,6 +716,10 @@ repeat_in_this_group: | ||
45795 | "inode=%lu", ino + 1); | ||
45796 | continue; | ||
45797 | } | ||
45798 | + BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); | ||
45799 | + err = ext4_journal_get_write_access(handle, inode_bitmap_bh); | ||
45800 | + if (err) | ||
45801 | + goto fail; | ||
45802 | ext4_lock_group(sb, group); | ||
45803 | ret2 = ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data); | ||
45804 | ext4_unlock_group(sb, group); | ||
45805 | @@ -729,6 +733,11 @@ repeat_in_this_group: | ||
45806 | goto out; | ||
45807 | |||
45808 | got: | ||
45809 | + BUFFER_TRACE(inode_bitmap_bh, "call ext4_handle_dirty_metadata"); | ||
45810 | + err = ext4_handle_dirty_metadata(handle, NULL, inode_bitmap_bh); | ||
45811 | + if (err) | ||
45812 | + goto fail; | ||
45813 | + | ||
45814 | /* We may have to initialize the block bitmap if it isn't already */ | ||
45815 | if (ext4_has_group_desc_csum(sb) && | ||
45816 | gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { | ||
45817 | @@ -762,11 +771,6 @@ got: | ||
45818 | goto fail; | ||
45819 | } | ||
45820 | |||
45821 | - BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); | ||
45822 | - err = ext4_journal_get_write_access(handle, inode_bitmap_bh); | ||
45823 | - if (err) | ||
45824 | - goto fail; | ||
45825 | - | ||
45826 | BUFFER_TRACE(group_desc_bh, "get_write_access"); | ||
45827 | err = ext4_journal_get_write_access(handle, group_desc_bh); | ||
45828 | if (err) | ||
45829 | @@ -814,11 +818,6 @@ got: | ||
45830 | } | ||
45831 | ext4_unlock_group(sb, group); | ||
45832 | |||
45833 | - BUFFER_TRACE(inode_bitmap_bh, "call ext4_handle_dirty_metadata"); | ||
45834 | - err = ext4_handle_dirty_metadata(handle, NULL, inode_bitmap_bh); | ||
45835 | - if (err) | ||
45836 | - goto fail; | ||
45837 | - | ||
45838 | BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata"); | ||
45839 | err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh); | ||
45840 | if (err) | ||
45841 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c | 45806 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
45842 | index b26410c..7383d90 100644 | 45807 | index b26410c..7383d90 100644 |
45843 | --- a/fs/ext4/mballoc.c | 45808 | --- a/fs/ext4/mballoc.c |
@@ -47737,7 +47702,7 @@ index 7e81bfc..c3649aa 100644 | |||
47737 | 47702 | ||
47738 | lock_flocks(); | 47703 | lock_flocks(); |
47739 | diff --git a/fs/namei.c b/fs/namei.c | 47704 | diff --git a/fs/namei.c b/fs/namei.c |
47740 | index 091c4b7..c6d7e26 100644 | 47705 | index 091c4b7..fbcb268 100644 |
47741 | --- a/fs/namei.c | 47706 | --- a/fs/namei.c |
47742 | +++ b/fs/namei.c | 47707 | +++ b/fs/namei.c |
47743 | @@ -265,16 +265,32 @@ int generic_permission(struct inode *inode, int mask) | 47708 | @@ -265,16 +265,32 @@ int generic_permission(struct inode *inode, int mask) |
@@ -47822,6 +47787,15 @@ index 091c4b7..c6d7e26 100644 | |||
47822 | put_link(nd, &link, cookie); | 47787 | put_link(nd, &link, cookie); |
47823 | } while (res > 0); | 47788 | } while (res > 0); |
47824 | 47789 | ||
47790 | @@ -1648,7 +1664,7 @@ EXPORT_SYMBOL(full_name_hash); | ||
47791 | static inline unsigned long hash_name(const char *name, unsigned int *hashp) | ||
47792 | { | ||
47793 | unsigned long a, b, adata, bdata, mask, hash, len; | ||
47794 | - const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
47795 | + static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
47796 | |||
47797 | hash = a = 0; | ||
47798 | len = -sizeof(unsigned long); | ||
47825 | @@ -1943,6 +1959,8 @@ static int path_lookupat(int dfd, const char *name, | 47799 | @@ -1943,6 +1959,8 @@ static int path_lookupat(int dfd, const char *name, |
47826 | if (err) | 47800 | if (err) |
47827 | break; | 47801 | break; |
@@ -71437,6 +71411,32 @@ index e796429..6e38f9f 100644 | |||
71437 | 71411 | ||
71438 | static inline void *ptr_to_indirect(void *ptr) | 71412 | static inline void *ptr_to_indirect(void *ptr) |
71439 | { | 71413 | { |
71414 | diff --git a/lib/strncpy_from_user.c b/lib/strncpy_from_user.c | ||
71415 | index bb2b201..46abaf9 100644 | ||
71416 | --- a/lib/strncpy_from_user.c | ||
71417 | +++ b/lib/strncpy_from_user.c | ||
71418 | @@ -21,7 +21,7 @@ | ||
71419 | */ | ||
71420 | static inline long do_strncpy_from_user(char *dst, const char __user *src, long count, unsigned long max) | ||
71421 | { | ||
71422 | - const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
71423 | + static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
71424 | long res = 0; | ||
71425 | |||
71426 | /* | ||
71427 | diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c | ||
71428 | index a28df52..3d55877 100644 | ||
71429 | --- a/lib/strnlen_user.c | ||
71430 | +++ b/lib/strnlen_user.c | ||
71431 | @@ -26,7 +26,7 @@ | ||
71432 | */ | ||
71433 | static inline long do_strnlen_user(const char __user *src, unsigned long count, unsigned long max) | ||
71434 | { | ||
71435 | - const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
71436 | + static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; | ||
71437 | long align, res = 0; | ||
71438 | unsigned long c; | ||
71439 | |||
71440 | diff --git a/lib/vsprintf.c b/lib/vsprintf.c | 71440 | diff --git a/lib/vsprintf.c b/lib/vsprintf.c |
71441 | index 0e33754..50a0e63 100644 | 71441 | index 0e33754..50a0e63 100644 |
71442 | --- a/lib/vsprintf.c | 71442 | --- a/lib/vsprintf.c |
@@ -76074,7 +76074,7 @@ index 23f45ce..c748f1a 100644 | |||
76074 | #undef __HANDLE_ITEM | 76074 | #undef __HANDLE_ITEM |
76075 | } | 76075 | } |
76076 | diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c | 76076 | diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c |
76077 | index 469daab..9fc7f8d 100644 | 76077 | index 469daab..262851c 100644 |
76078 | --- a/net/batman-adv/bat_iv_ogm.c | 76078 | --- a/net/batman-adv/bat_iv_ogm.c |
76079 | +++ b/net/batman-adv/bat_iv_ogm.c | 76079 | +++ b/net/batman-adv/bat_iv_ogm.c |
76080 | @@ -62,7 +62,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface) | 76080 | @@ -62,7 +62,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface) |
@@ -76086,15 +76086,6 @@ index 469daab..9fc7f8d 100644 | |||
76086 | 76086 | ||
76087 | hard_iface->packet_len = BATADV_OGM_HLEN; | 76087 | hard_iface->packet_len = BATADV_OGM_HLEN; |
76088 | hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC); | 76088 | hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC); |
76089 | @@ -191,7 +191,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | ||
76090 | "Sending own" : | ||
76091 | "Forwarding")); | ||
76092 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, | ||
76093 | - "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", | ||
76094 | + "%s %spacket (originator %pM, s_uncheckedeqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", | ||
76095 | fwd_str, (packet_num > 0 ? "aggregated " : ""), | ||
76096 | batadv_ogm_packet->orig, | ||
76097 | ntohl(batadv_ogm_packet->seqno), | ||
76098 | @@ -600,8 +600,8 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) | 76089 | @@ -600,8 +600,8 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) |
76099 | 76090 | ||
76100 | /* change sequence number to network order */ | 76091 | /* change sequence number to network order */ |