2015-11-28 02:25:52 +08:00
|
|
|
|
---
|
|
|
|
|
title: "B2"
|
|
|
|
|
description: "Backblaze B2"
|
2016-10-26 04:36:45 +08:00
|
|
|
|
date: "2016-10-25"
|
2015-11-28 02:25:52 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
<i class="fa fa-fire"></i>Backblaze B2
|
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
|
|
B2 is [Backblaze's cloud storage system](https://www.backblaze.com/b2/).
|
|
|
|
|
|
|
|
|
|
Paths are specified as `remote:bucket` (or `remote:` for the `lsd`
|
|
|
|
|
command.) You may put subdirectories in too, eg `remote:bucket/path/to/dir`.
|
|
|
|
|
|
|
|
|
|
Here is an example of making a b2 configuration. First run
|
|
|
|
|
|
|
|
|
|
rclone config
|
|
|
|
|
|
2019-02-09 17:00:05 +08:00
|
|
|
|
This will guide you through an interactive setup process. To authenticate
|
|
|
|
|
you will either need your Account ID (a short hex number) and Master
|
|
|
|
|
Application Key (a long hex number) OR an Application Key, which is the
|
|
|
|
|
recommended method. See below for further details on generating and using
|
|
|
|
|
an Application Key.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
No remotes found - make a new one
|
|
|
|
|
n) New remote
|
|
|
|
|
q) Quit config
|
|
|
|
|
n/q> n
|
|
|
|
|
name> remote
|
2016-02-21 21:39:04 +08:00
|
|
|
|
Type of storage to configure.
|
|
|
|
|
Choose a number from below, or type in your own value
|
2016-07-11 19:42:44 +08:00
|
|
|
|
1 / Amazon Drive
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "amazon cloud drive"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
2 / Amazon S3 (also Dreamhost, Ceph, Minio)
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "s3"
|
|
|
|
|
3 / Backblaze B2
|
|
|
|
|
\ "b2"
|
|
|
|
|
4 / Dropbox
|
|
|
|
|
\ "dropbox"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
5 / Encrypt/Decrypt a remote
|
|
|
|
|
\ "crypt"
|
|
|
|
|
6 / Google Cloud Storage (this is not Google Drive)
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "google cloud storage"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
7 / Google Drive
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "drive"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
8 / Hubic
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "hubic"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
9 / Local Disk
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "local"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
10 / Microsoft OneDrive
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "onedrive"
|
2017-01-09 13:09:19 +08:00
|
|
|
|
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "swift"
|
2017-03-05 18:14:57 +08:00
|
|
|
|
12 / SSH/SFTP Connection
|
|
|
|
|
\ "sftp"
|
|
|
|
|
13 / Yandex Disk
|
2016-02-21 21:39:04 +08:00
|
|
|
|
\ "yandex"
|
|
|
|
|
Storage> 3
|
2018-08-01 21:33:01 +08:00
|
|
|
|
Account ID or Application Key ID
|
2015-11-28 02:25:52 +08:00
|
|
|
|
account> 123456789abc
|
|
|
|
|
Application Key
|
|
|
|
|
key> 0123456789abcdef0123456789abcdef0123456789
|
|
|
|
|
Endpoint for the service - leave blank normally.
|
2017-01-09 13:09:19 +08:00
|
|
|
|
endpoint>
|
2015-11-28 02:25:52 +08:00
|
|
|
|
Remote config
|
|
|
|
|
--------------------
|
|
|
|
|
[remote]
|
|
|
|
|
account = 123456789abc
|
|
|
|
|
key = 0123456789abcdef0123456789abcdef0123456789
|
2017-01-09 13:09:19 +08:00
|
|
|
|
endpoint =
|
2015-11-28 02:25:52 +08:00
|
|
|
|
--------------------
|
|
|
|
|
y) Yes this is OK
|
|
|
|
|
e) Edit this remote
|
|
|
|
|
d) Delete this remote
|
|
|
|
|
y/e/d> y
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This remote is called `remote` and can now be used like this
|
|
|
|
|
|
|
|
|
|
See all buckets
|
|
|
|
|
|
|
|
|
|
rclone lsd remote:
|
|
|
|
|
|
2018-07-31 06:14:03 +08:00
|
|
|
|
Create a new bucket
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
|
|
|
|
rclone mkdir remote:bucket
|
|
|
|
|
|
|
|
|
|
List the contents of a bucket
|
|
|
|
|
|
|
|
|
|
rclone ls remote:bucket
|
|
|
|
|
|
|
|
|
|
Sync `/home/local/directory` to the remote bucket, deleting any
|
|
|
|
|
excess files in the bucket.
|
|
|
|
|
|
|
|
|
|
rclone sync /home/local/directory remote:bucket
|
|
|
|
|
|
2018-08-01 21:33:01 +08:00
|
|
|
|
### Application Keys ###
|
|
|
|
|
|
|
|
|
|
B2 supports multiple [Application Keys for different access permission
|
|
|
|
|
to B2 Buckets](https://www.backblaze.com/b2/docs/application_keys.html).
|
|
|
|
|
|
2019-01-02 03:52:43 +08:00
|
|
|
|
You can use these with rclone too; you will need to use rclone version 1.43
|
|
|
|
|
or later.
|
2018-08-01 21:33:01 +08:00
|
|
|
|
|
|
|
|
|
Follow Backblaze's docs to create an Application Key with the required
|
2019-02-09 17:00:05 +08:00
|
|
|
|
permission and add the `applicationKeyId` as the `account` and the
|
2018-08-01 21:33:01 +08:00
|
|
|
|
`Application Key` itself as the `key`.
|
|
|
|
|
|
2019-02-09 17:00:05 +08:00
|
|
|
|
Note that you must put the _applicationKeyId_ as the `account` – you
|
2018-08-01 21:33:01 +08:00
|
|
|
|
can't use the master Account ID. If you try then B2 will return 401
|
|
|
|
|
errors.
|
|
|
|
|
|
2017-06-06 23:40:00 +08:00
|
|
|
|
### --fast-list ###
|
|
|
|
|
|
|
|
|
|
This remote supports `--fast-list` which allows you to use fewer
|
|
|
|
|
transactions in exchange for more memory. See the [rclone
|
|
|
|
|
docs](/docs/#fast-list) for more details.
|
|
|
|
|
|
2015-11-28 02:25:52 +08:00
|
|
|
|
### Modified time ###
|
|
|
|
|
|
|
|
|
|
The modified time is stored as metadata on the object as
|
|
|
|
|
`X-Bz-Info-src_last_modified_millis` as milliseconds since 1970-01-01
|
|
|
|
|
in the Backblaze standard. Other tools should be able to use this as
|
|
|
|
|
a modified time.
|
|
|
|
|
|
2016-03-22 23:23:37 +08:00
|
|
|
|
Modified times are used in syncing and are fully supported except in
|
|
|
|
|
the case of updating a modification time on an existing object. In
|
|
|
|
|
this case the object will be uploaded again as B2 doesn't have an API
|
|
|
|
|
method to set the modification time independent of doing an upload.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
|
|
|
|
### SHA1 checksums ###
|
|
|
|
|
|
2016-01-13 18:29:43 +08:00
|
|
|
|
The SHA1 checksums of the files are checked on upload and download and
|
2016-07-13 21:50:47 +08:00
|
|
|
|
will be used in the syncing process.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
2017-11-03 20:49:15 +08:00
|
|
|
|
Large files (bigger than the limit in `--b2-upload-cutoff`) which are
|
|
|
|
|
uploaded in chunks will store their SHA1 on the object as
|
|
|
|
|
`X-Bz-Info-large_file_sha1` as recommended by Backblaze.
|
|
|
|
|
|
|
|
|
|
For a large file to be uploaded with an SHA1 checksum, the source
|
|
|
|
|
needs to support SHA1 checksums. The local disk supports SHA1
|
|
|
|
|
checksums so large file transfers from local disk will have an SHA1.
|
|
|
|
|
See [the overview](/overview/#features) for exactly which remotes
|
|
|
|
|
support SHA1.
|
|
|
|
|
|
|
|
|
|
Sources which don't support SHA1, in particular `crypt` will upload
|
|
|
|
|
large files without SHA1 checksums. This may be fixed in the future
|
|
|
|
|
(see [#1767](https://github.com/ncw/rclone/issues/1767)).
|
|
|
|
|
|
|
|
|
|
Files sizes below `--b2-upload-cutoff` will always have an SHA1
|
|
|
|
|
regardless of the source.
|
2016-06-16 01:49:11 +08:00
|
|
|
|
|
2016-07-05 18:26:02 +08:00
|
|
|
|
### Transfers ###
|
|
|
|
|
|
|
|
|
|
Backblaze recommends that you do lots of transfers simultaneously for
|
2017-10-28 14:03:51 +08:00
|
|
|
|
maximum speed. In tests from my SSD equipped laptop the optimum
|
2016-07-05 18:26:02 +08:00
|
|
|
|
setting is about `--transfers 32` though higher numbers may be used
|
|
|
|
|
for a slight speed improvement. The optimum number for you may vary
|
|
|
|
|
depending on your hardware, how big the files are, how much you want
|
|
|
|
|
to load your computer, etc. The default of `--transfers 4` is
|
|
|
|
|
definitely too low for Backblaze B2 though.
|
|
|
|
|
|
2016-07-13 21:50:47 +08:00
|
|
|
|
Note that uploading big files (bigger than 200 MB by default) will use
|
|
|
|
|
a 96 MB RAM buffer by default. There can be at most `--transfers` of
|
|
|
|
|
these in use at any moment, so this sets the upper limit on the memory
|
|
|
|
|
used.
|
|
|
|
|
|
2015-11-28 02:25:52 +08:00
|
|
|
|
### Versions ###
|
|
|
|
|
|
|
|
|
|
When rclone uploads a new version of a file it creates a [new version
|
|
|
|
|
of it](https://www.backblaze.com/b2/docs/file_versions.html).
|
2017-07-23 20:02:42 +08:00
|
|
|
|
Likewise when you delete a file, the old version will be marked hidden
|
|
|
|
|
and still be available. Conversely, you may opt in to a "hard delete"
|
|
|
|
|
of files with the `--b2-hard-delete` flag which would permanently remove
|
|
|
|
|
the file instead of hiding it.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
2017-07-23 20:02:42 +08:00
|
|
|
|
Old versions of files, where available, are visible using the
|
|
|
|
|
`--b2-versions` flag.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
2016-07-03 00:03:08 +08:00
|
|
|
|
If you wish to remove all the old versions then you can use the
|
|
|
|
|
`rclone cleanup remote:bucket` command which will delete all the old
|
2016-07-05 18:26:02 +08:00
|
|
|
|
versions of files, leaving the current ones intact. You can also
|
|
|
|
|
supply a path and only old versions under that path will be deleted,
|
|
|
|
|
eg `rclone cleanup remote:bucket/path/to/stuff`.
|
2016-07-03 00:03:08 +08:00
|
|
|
|
|
2018-12-03 02:05:32 +08:00
|
|
|
|
Note that `cleanup` will remove partially uploaded files from the bucket
|
|
|
|
|
if they are more than a day old.
|
2018-09-29 21:47:31 +08:00
|
|
|
|
|
2016-07-05 18:26:02 +08:00
|
|
|
|
When you `purge` a bucket, the current and the old versions will be
|
|
|
|
|
deleted then the bucket will be deleted.
|
2015-11-28 02:25:52 +08:00
|
|
|
|
|
2016-07-05 18:26:02 +08:00
|
|
|
|
However `delete` will cause the current versions of the files to
|
|
|
|
|
become hidden old versions.
|
2016-04-05 00:58:36 +08:00
|
|
|
|
|
2017-10-28 14:03:51 +08:00
|
|
|
|
Here is a session showing the listing and retrieval of an old
|
2016-07-05 18:26:02 +08:00
|
|
|
|
version followed by a `cleanup` of the old versions.
|
|
|
|
|
|
|
|
|
|
Show current version and all the versions with `--b2-versions` flag.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ rclone -q ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
|
|
|
|
|
$ rclone -q --b2-versions ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
8 one-v2016-07-04-141032-000.txt
|
|
|
|
|
16 one-v2016-07-04-141003-000.txt
|
|
|
|
|
15 one-v2016-07-02-155621-000.txt
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-28 14:03:51 +08:00
|
|
|
|
Retrieve an old version
|
2016-07-05 18:26:02 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ rclone -q --b2-versions copy b2:cleanup-test/one-v2016-07-04-141003-000.txt /tmp
|
|
|
|
|
|
|
|
|
|
$ ls -l /tmp/one-v2016-07-04-141003-000.txt
|
|
|
|
|
-rw-rw-r-- 1 ncw ncw 16 Jul 2 17:46 /tmp/one-v2016-07-04-141003-000.txt
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Clean up all the old versions and show that they've gone.
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ rclone -q cleanup b2:cleanup-test
|
|
|
|
|
|
|
|
|
|
$ rclone -q ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
|
|
|
|
|
$ rclone -q --b2-versions ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
```
|
2016-04-05 00:58:36 +08:00
|
|
|
|
|
2016-10-26 04:36:45 +08:00
|
|
|
|
### Data usage ###
|
|
|
|
|
|
|
|
|
|
It is useful to know how many requests are sent to the server in different scenarios.
|
|
|
|
|
|
|
|
|
|
All copy commands send the following 4 requests:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
/b2api/v1/b2_authorize_account
|
|
|
|
|
/b2api/v1/b2_create_bucket
|
|
|
|
|
/b2api/v1/b2_list_buckets
|
|
|
|
|
/b2api/v1/b2_list_file_names
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The `b2_list_file_names` request will be sent once for every 1k files
|
|
|
|
|
in the remote path, providing the checksum and modification time of
|
|
|
|
|
the listed files. As of version 1.33 issue
|
|
|
|
|
[#818](https://github.com/ncw/rclone/issues/818) causes extra requests
|
|
|
|
|
to be sent when using B2 with Crypt. When a copy operation does not
|
|
|
|
|
require any files to be uploaded, no more requests will be sent.
|
|
|
|
|
|
|
|
|
|
Uploading files that do not require chunking, will send 2 requests per
|
|
|
|
|
file upload:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
/b2api/v1/b2_get_upload_url
|
|
|
|
|
/b2api/v1/b2_upload_file/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Uploading files requiring chunking, will send 2 requests (one each to
|
|
|
|
|
start and finish the upload) and another 2 requests for each chunk:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
/b2api/v1/b2_start_large_file
|
|
|
|
|
/b2api/v1/b2_get_upload_part_url
|
|
|
|
|
/b2api/v1/b2_upload_part/
|
|
|
|
|
/b2api/v1/b2_finish_large_file
|
|
|
|
|
```
|
|
|
|
|
|
2018-10-02 01:36:15 +08:00
|
|
|
|
#### Versions ####
|
2016-06-16 01:49:11 +08:00
|
|
|
|
|
2018-10-02 01:36:15 +08:00
|
|
|
|
Versions can be viewd with the `--b2-versions` flag. When it is set
|
|
|
|
|
rclone will show and act on older versions of files. For example
|
2016-07-05 18:26:02 +08:00
|
|
|
|
|
|
|
|
|
Listing without `--b2-versions`
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ rclone -q ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
And with
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ rclone -q --b2-versions ls b2:cleanup-test
|
|
|
|
|
9 one.txt
|
|
|
|
|
8 one-v2016-07-04-141032-000.txt
|
|
|
|
|
16 one-v2016-07-04-141003-000.txt
|
|
|
|
|
15 one-v2016-07-02-155621-000.txt
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Showing that the current version is unchanged but older versions can
|
|
|
|
|
be seen. These have the UTC date that they were uploaded to the
|
|
|
|
|
server to the nearest millisecond appended to them.
|
|
|
|
|
|
|
|
|
|
Note that when using `--b2-versions` no file write operations are
|
|
|
|
|
permitted, so you can't upload files or delete them.
|
2018-10-02 01:36:15 +08:00
|
|
|
|
|
2018-10-02 03:48:54 +08:00
|
|
|
|
<!--- autogenerated options start - DO NOT EDIT, instead edit fs.RegInfo in backend/b2/b2.go then run make backenddocs -->
|
|
|
|
|
### Standard Options
|
|
|
|
|
|
|
|
|
|
Here are the standard options specific to b2 (Backblaze B2).
|
|
|
|
|
|
|
|
|
|
#### --b2-account
|
|
|
|
|
|
|
|
|
|
Account ID or Application Key ID
|
|
|
|
|
|
|
|
|
|
- Config: account
|
|
|
|
|
- Env Var: RCLONE_B2_ACCOUNT
|
|
|
|
|
- Type: string
|
|
|
|
|
- Default: ""
|
|
|
|
|
|
|
|
|
|
#### --b2-key
|
|
|
|
|
|
|
|
|
|
Application Key
|
|
|
|
|
|
|
|
|
|
- Config: key
|
|
|
|
|
- Env Var: RCLONE_B2_KEY
|
|
|
|
|
- Type: string
|
|
|
|
|
- Default: ""
|
|
|
|
|
|
|
|
|
|
#### --b2-hard-delete
|
|
|
|
|
|
|
|
|
|
Permanently delete files on remote removal, otherwise hide files.
|
|
|
|
|
|
|
|
|
|
- Config: hard_delete
|
|
|
|
|
- Env Var: RCLONE_B2_HARD_DELETE
|
|
|
|
|
- Type: bool
|
|
|
|
|
- Default: false
|
|
|
|
|
|
|
|
|
|
### Advanced Options
|
|
|
|
|
|
|
|
|
|
Here are the advanced options specific to b2 (Backblaze B2).
|
|
|
|
|
|
|
|
|
|
#### --b2-endpoint
|
|
|
|
|
|
|
|
|
|
Endpoint for the service.
|
|
|
|
|
Leave blank normally.
|
|
|
|
|
|
|
|
|
|
- Config: endpoint
|
|
|
|
|
- Env Var: RCLONE_B2_ENDPOINT
|
|
|
|
|
- Type: string
|
|
|
|
|
- Default: ""
|
|
|
|
|
|
|
|
|
|
#### --b2-test-mode
|
|
|
|
|
|
|
|
|
|
A flag string for X-Bz-Test-Mode header for debugging.
|
|
|
|
|
|
|
|
|
|
This is for debugging purposes only. Setting it to one of the strings
|
|
|
|
|
below will cause b2 to return specific errors:
|
|
|
|
|
|
|
|
|
|
* "fail_some_uploads"
|
|
|
|
|
* "expire_some_account_authorization_tokens"
|
|
|
|
|
* "force_cap_exceeded"
|
|
|
|
|
|
|
|
|
|
These will be set in the "X-Bz-Test-Mode" header which is documented
|
|
|
|
|
in the [b2 integrations checklist](https://www.backblaze.com/b2/docs/integration_checklist.html).
|
|
|
|
|
|
|
|
|
|
- Config: test_mode
|
|
|
|
|
- Env Var: RCLONE_B2_TEST_MODE
|
|
|
|
|
- Type: string
|
|
|
|
|
- Default: ""
|
|
|
|
|
|
|
|
|
|
#### --b2-versions
|
|
|
|
|
|
|
|
|
|
Include old versions in directory listings.
|
|
|
|
|
Note that when using this no file write operations are permitted,
|
|
|
|
|
so you can't upload files or delete them.
|
|
|
|
|
|
|
|
|
|
- Config: versions
|
|
|
|
|
- Env Var: RCLONE_B2_VERSIONS
|
|
|
|
|
- Type: bool
|
|
|
|
|
- Default: false
|
|
|
|
|
|
|
|
|
|
#### --b2-upload-cutoff
|
|
|
|
|
|
|
|
|
|
Cutoff for switching to chunked upload.
|
|
|
|
|
|
|
|
|
|
Files above this size will be uploaded in chunks of "--b2-chunk-size".
|
|
|
|
|
|
|
|
|
|
This value should be set no larger than 4.657GiB (== 5GB).
|
|
|
|
|
|
|
|
|
|
- Config: upload_cutoff
|
|
|
|
|
- Env Var: RCLONE_B2_UPLOAD_CUTOFF
|
|
|
|
|
- Type: SizeSuffix
|
2018-10-15 18:03:08 +08:00
|
|
|
|
- Default: 200M
|
2018-10-02 03:48:54 +08:00
|
|
|
|
|
|
|
|
|
#### --b2-chunk-size
|
|
|
|
|
|
|
|
|
|
Upload chunk size. Must fit in memory.
|
|
|
|
|
|
|
|
|
|
When uploading large files, chunk the file into this size. Note that
|
|
|
|
|
these chunks are buffered in memory and there might a maximum of
|
|
|
|
|
"--transfers" chunks in progress at once. 5,000,000 Bytes is the
|
2019-02-09 18:42:57 +08:00
|
|
|
|
minimum size.
|
2018-10-02 03:48:54 +08:00
|
|
|
|
|
|
|
|
|
- Config: chunk_size
|
|
|
|
|
- Env Var: RCLONE_B2_CHUNK_SIZE
|
|
|
|
|
- Type: SizeSuffix
|
|
|
|
|
- Default: 96M
|
|
|
|
|
|
2019-02-09 18:42:57 +08:00
|
|
|
|
#### --b2-disable-checksum
|
|
|
|
|
|
|
|
|
|
Disable checksums for large (> upload cutoff) files
|
|
|
|
|
|
|
|
|
|
- Config: disable_checksum
|
|
|
|
|
- Env Var: RCLONE_B2_DISABLE_CHECKSUM
|
|
|
|
|
- Type: bool
|
|
|
|
|
- Default: false
|
|
|
|
|
|
2018-10-02 03:48:54 +08:00
|
|
|
|
<!--- autogenerated options stop -->
|
2018-10-02 01:36:15 +08:00
|
|
|
|
|