From window labels to events: asynchronous EEG decoding with DANCE#

braindecode defines brain decoding as \(f_\theta: X \to y\) (see the brain decode problem), and is explicit that the definition of \(y\) is broad. Most tutorials in this repository instantiate that mapping at a single point in the space it allows: \(X\) is a window already cut and aligned to a known onset (a motor-imagery cue, a sleep-epoch boundary, a P300 flash), and \(y\) is one categorical label for the whole window.

DANCE instantiates the same \(f_\theta: X \to y\) at a different point: \(X\) is one long, unaligned recording, and \(y\) is the set of (start, end, class) events \(f_\theta\) must locate and classify itself. The definition did not change. Only the shape of \(y\) did.

Same f theta of X arrow y, different shape of y. Onset-informed decoding gives one label per aligned window; DANCE gives a set of (start, end, class) events on a continuous recording.

This tutorial shows how to use the DANCE model for event detection on continuous, real EEG recordings, with plain PyTorch (no skorch, no Lightning). We reproduce, at reduced scale, the P300 setting from the original paper [1], using the Brain Invaders BI2014a dataset [2] loaded through MOABBDataset.

The pipeline is:

  1. load a few subjects of continuous, real P300 EEG (BI2014a) with MOABBDataset,

  2. preprocess with the exact minimal recipe from the paper: band-pass 0.1-100 Hz, resample to 128 Hz, per-channel robust scaling clamped to [-16, 16],

  3. cut it into fixed-length windows with create_fixed_length_windows() (W = 32 s, matching the paper’s BI2014a configuration),

  4. turn each window’s stimulus annotations (Target/NonTarget flashes) into a DANCE target dict (normalized start/end in [0, 1] plus a dense per-token class map),

  5. train DANCE with DanceLoss on a cross-subject split (train on some subjects, evaluate on held-out ones, following the paper’s protocol), and

  6. evaluate with the event-level f1_event() metric and a per-token macro F1 on the dense head (sklearn.metrics.f1_score()).

DANCE exposes two entry points: model.forward(x) returns the dense per-token logits (B, num_latents, n_outputs), while model.detect(x) returns the event set {class, start, end, dense}. Training and evaluation below use detect (the loss needs the query set); a downstream user who only wants a per-token prediction can call forward directly.

Note

DANCE follows a DETR-style class-0 = background / no-object convention: real event classes are 1 .. n_outputs - 1 and class 0 is reserved for “no event”. Here class 1 is a non-target flash and class 2 a target flash; the target builder and both F1 metrics honour this convention automatically.

Note

To keep the docs build fast, this tutorial uses only 3 subjects and 2 training epochs, far short of the paper’s full protocol (all subjects, 100 epochs with early stopping). Expect low F1 scores below; see the Conclusion for what changes at full scale.

# Authors: Bruno Aristimunha <b.aristimunha@gmail.com>
#
# License: MIT

random_state = 0

Loading and preprocessing the dataset#

Loading the raw recordings#

BI2014a is a Brain Invaders P300 (oddball) dataset: subjects watch a stream of flashes, most of which are “non-target” and a few “target”. We load 3 subjects: 2 for training, 1 held out for evaluation, following the paper’s cross-subject splitting protocol.

from braindecode.datasets import MOABBDataset

subject_ids = [1, 2, 3]
dataset = MOABBDataset(dataset_name="BI2014a", subject_ids=subject_ids)
This is nemar-py 0.3.3.
Preparing to download nm000244 from https://data.nemar.org/
Retrieving 5 of 779 manifest files (16 concurrent downloads).

Overall:   0%|          | 0.00/26.2k [00:00<?, ?B/s]
Overall:   4%|▍         | 1.03k/26.2k [00:00<00:24, 1.06kB/s]
Overall:  14%|█▍        | 3.76k/26.2k [00:01<00:07, 3.16kB/s]
Overall:  18%|█▊        | 4.78k/26.2k [00:01<00:08, 2.71kB/s]
Overall:  35%|███▌      | 9.31k/26.2k [00:02<00:02, 6.20kB/s]
Overall:  50%|█████     | 13.2k/26.2k [00:02<00:02, 6.15kB/s]
Finished downloading nm000244 v1.0.4.
This is nemar-py 0.3.3.
Preparing to download nm000244 from https://data.nemar.org/
Retrieving 5 of 779 manifest files (16 concurrent downloads).

S3:   0%|          | 0.00/36.7M [00:00<?, ?B/s]
S3:   3%|▎         | 1.00M/36.7M [00:00<00:20, 1.86MB/s]
S3:  14%|█▎        | 5.00M/36.7M [00:00<00:03, 9.95MB/s]
S3:  33%|███▎      | 12.0M/36.7M [00:00<00:01, 24.1MB/s]
S3:  46%|████▋     | 17.0M/36.7M [00:00<00:00, 24.8MB/s]
S3:  68%|██████▊   | 25.0M/36.7M [00:01<00:00, 37.1MB/s]
S3:  87%|████████▋ | 32.0M/36.7M [00:01<00:00, 45.4MB/s]
S3: 100%|██████████| 36.7M/36.7M [00:01<00:00, 31.0MB/s]
Finished downloading nm000244 v1.0.4.
This is nemar-py 0.3.3.
Preparing to download nm000244 from https://data.nemar.org/
Retrying after failure when retrieving NEMAR index for nm000244 (5 retries remain).
Retrieving 5 of 779 manifest files (16 concurrent downloads).

S3:   0%|          | 0.00/17.9M [00:00<?, ?B/s]
S3:   6%|▌         | 1.00M/17.9M [00:00<00:09, 1.87MB/s]
S3:  28%|██▊       | 5.00M/17.9M [00:00<00:01, 9.99MB/s]
S3:  67%|██████▋   | 12.0M/17.9M [00:00<00:00, 24.1MB/s]
S3:  95%|█████████▌| 17.0M/17.9M [00:00<00:00, 30.0MB/s]
S3: 100%|██████████| 17.9M/17.9M [00:00<00:00, 21.3MB/s]
Finished downloading nm000244 v1.0.4.
This is nemar-py 0.3.3.
Preparing to download nm000244 from https://data.nemar.org/
Retrieving 5 of 779 manifest files (16 concurrent downloads).

S3:   0%|          | 0.00/55.2M [00:00<?, ?B/s]
S3:   2%|▏         | 1.00M/55.2M [00:00<00:29, 1.95MB/s]
S3:  11%|█         | 6.00M/55.2M [00:00<00:04, 11.5MB/s]
S3:  25%|██▌       | 14.0M/55.2M [00:00<00:01, 27.0MB/s]
S3:  38%|███▊      | 21.0M/55.2M [00:00<00:01, 35.9MB/s]
S3:  53%|█████▎    | 29.0M/55.2M [00:01<00:00, 47.3MB/s]
S3:  65%|██████▌   | 36.0M/55.2M [00:01<00:00, 49.9MB/s]
S3:  80%|███████▉  | 44.0M/55.2M [00:01<00:00, 58.4MB/s]
S3:  92%|█████████▏| 51.0M/55.2M [00:01<00:00, 56.9MB/s]
S3: 100%|██████████| 55.2M/55.2M [00:01<00:00, 40.5MB/s]
Finished downloading nm000244 v1.0.4.
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(

  0%|                                              | 0.00/60.6M [00:00<?, ?B/s]
  0%|                                     | 14.3k/60.6M [00:00<10:16, 98.2kB/s]
  0%|                                      | 43.0k/60.6M [00:00<05:50, 172kB/s]
  0%|                                       | 109k/60.6M [00:00<03:02, 332kB/s]
  0%|▏                                      | 246k/60.6M [00:00<01:35, 635kB/s]
  1%|▏                                      | 361k/60.6M [00:00<01:30, 666kB/s]
  1%|▎                                      | 450k/60.6M [00:00<01:28, 682kB/s]
  1%|▎                                      | 548k/60.6M [00:00<01:23, 719kB/s]
  1%|▍                                      | 665k/60.6M [00:01<01:15, 790kB/s]
  1%|▍                                      | 763k/60.6M [00:01<01:15, 793kB/s]
  1%|▌                                      | 847k/60.6M [00:01<01:18, 760kB/s]
  2%|▋                                    | 1.08M/60.6M [00:01<00:54, 1.09MB/s]
  2%|▊                                    | 1.31M/60.6M [00:01<00:44, 1.33MB/s]
  2%|▉                                    | 1.44M/60.6M [00:01<00:47, 1.25MB/s]
  3%|▉                                    | 1.62M/60.6M [00:01<00:44, 1.32MB/s]
  3%|█                                    | 1.75M/60.6M [00:01<00:47, 1.25MB/s]
  3%|█▏                                   | 1.89M/60.6M [00:02<00:49, 1.19MB/s]
  3%|█▎                                   | 2.07M/60.6M [00:02<00:45, 1.28MB/s]
  4%|█▎                                   | 2.20M/60.6M [00:02<00:48, 1.21MB/s]
  4%|█▍                                   | 2.32M/60.6M [00:02<00:50, 1.14MB/s]
  4%|█▌                                   | 2.46M/60.6M [00:02<00:50, 1.15MB/s]
  4%|█▋                                   | 2.69M/60.6M [00:02<00:42, 1.37MB/s]
  5%|█▋                                   | 2.84M/60.6M [00:02<00:43, 1.32MB/s]
  5%|█▊                                   | 2.98M/60.6M [00:02<00:46, 1.25MB/s]
  5%|█▉                                   | 3.10M/60.6M [00:03<00:48, 1.18MB/s]
  5%|█▉                                   | 3.22M/60.6M [00:03<00:51, 1.12MB/s]
  6%|██                                   | 3.33M/60.6M [00:03<00:54, 1.06MB/s]
  6%|██                                   | 3.44M/60.6M [00:03<00:57, 1.00MB/s]
  6%|██▏                                   | 3.54M/60.6M [00:03<01:00, 946kB/s]
  6%|██▎                                   | 3.64M/60.6M [00:03<01:03, 895kB/s]
  6%|██▎                                   | 3.77M/60.6M [00:03<00:59, 947kB/s]
  7%|██▍                                  | 4.02M/60.6M [00:03<00:44, 1.27MB/s]
  7%|██▌                                  | 4.15M/60.6M [00:03<00:46, 1.21MB/s]
  7%|██▌                                  | 4.27M/60.6M [00:04<00:49, 1.14MB/s]
  7%|██▋                                  | 4.38M/60.6M [00:04<00:52, 1.08MB/s]
  7%|██▋                                  | 4.49M/60.6M [00:04<00:55, 1.02MB/s]
  8%|██▊                                  | 4.66M/60.6M [00:04<00:49, 1.12MB/s]
  8%|██▉                                  | 4.79M/60.6M [00:04<00:50, 1.11MB/s]
  8%|███                                  | 4.97M/60.6M [00:04<00:45, 1.21MB/s]
  8%|███                                  | 5.09M/60.6M [00:04<00:48, 1.15MB/s]
  9%|███▏                                 | 5.21M/60.6M [00:04<00:51, 1.09MB/s]
  9%|███▏                                 | 5.32M/60.6M [00:05<00:53, 1.03MB/s]
  9%|███▍                                  | 5.42M/60.6M [00:05<00:56, 969kB/s]
  9%|███▍                                  | 5.52M/60.6M [00:05<01:00, 913kB/s]
  9%|███▌                                  | 5.61M/60.6M [00:05<01:03, 868kB/s]
  9%|███▌                                  | 5.70M/60.6M [00:05<01:06, 820kB/s]
 10%|███▋                                  | 5.78M/60.6M [00:05<01:10, 776kB/s]
 10%|███▋                                  | 5.86M/60.6M [00:05<01:14, 733kB/s]
 10%|███▋                                  | 5.93M/60.6M [00:05<01:18, 694kB/s]
 10%|███▊                                  | 6.03M/60.6M [00:06<01:15, 721kB/s]
 10%|███▊                                  | 6.16M/60.6M [00:06<01:05, 825kB/s]
 10%|███▉                                  | 6.26M/60.6M [00:06<01:06, 817kB/s]
 10%|███▉                                  | 6.35M/60.6M [00:06<01:06, 811kB/s]
 11%|████                                  | 6.50M/60.6M [00:06<00:58, 932kB/s]
 11%|████▏                                 | 6.60M/60.6M [00:06<01:00, 892kB/s]
 11%|████▏                                 | 6.70M/60.6M [00:06<01:01, 870kB/s]
 11%|████▎                                 | 6.82M/60.6M [00:06<01:00, 889kB/s]
 12%|████▎                                 | 6.97M/60.6M [00:07<00:54, 987kB/s]
 12%|████▍                                 | 7.08M/60.6M [00:07<00:54, 974kB/s]
 12%|████▌                                 | 7.18M/60.6M [00:07<00:57, 924kB/s]
 12%|████▌                                 | 7.27M/60.6M [00:07<01:00, 874kB/s]
 12%|████▌                                 | 7.36M/60.6M [00:07<01:04, 828kB/s]
 12%|████▌                                | 7.56M/60.6M [00:07<00:50, 1.06MB/s]
 13%|████▋                                | 7.67M/60.6M [00:07<00:52, 1.00MB/s]
 13%|████▉                                 | 7.77M/60.6M [00:07<00:54, 961kB/s]
 13%|████▉                                 | 7.87M/60.6M [00:08<00:57, 913kB/s]
 13%|█████                                 | 7.97M/60.6M [00:08<00:59, 879kB/s]
 13%|█████                                 | 8.08M/60.6M [00:08<00:58, 895kB/s]
 14%|█████▏                                | 8.22M/60.6M [00:08<00:55, 950kB/s]
 14%|█████▏                                | 8.32M/60.6M [00:08<00:57, 904kB/s]
 14%|█████▎                                | 8.41M/60.6M [00:08<00:59, 873kB/s]
 14%|█████▎                                | 8.53M/60.6M [00:08<00:58, 890kB/s]
 14%|█████▍                                | 8.63M/60.6M [00:08<01:00, 863kB/s]
 14%|█████▍                                | 8.76M/60.6M [00:09<00:56, 923kB/s]
 15%|█████▌                                | 8.88M/60.6M [00:09<00:55, 930kB/s]
 15%|█████▋                                | 8.97M/60.6M [00:09<00:57, 891kB/s]
 15%|█████▋                                | 9.09M/60.6M [00:09<00:56, 909kB/s]
 15%|█████▊                                | 9.19M/60.6M [00:09<00:58, 876kB/s]
 15%|█████▊                                | 9.29M/60.6M [00:09<01:00, 848kB/s]
 15%|█████▉                                | 9.38M/60.6M [00:09<01:01, 833kB/s]
 16%|█████▉                                | 9.47M/60.6M [00:09<01:05, 779kB/s]
 16%|█████▉                                | 9.55M/60.6M [00:10<01:08, 746kB/s]
 16%|██████                                | 9.65M/60.6M [00:10<01:06, 763kB/s]
 16%|██████                                | 9.75M/60.6M [00:10<01:05, 776kB/s]
 16%|██████▏                               | 9.88M/60.6M [00:10<00:58, 868kB/s]
 17%|██████▎                               | 10.0M/60.6M [00:10<00:57, 884kB/s]
 17%|██████▎                               | 10.1M/60.6M [00:10<00:58, 864kB/s]
 17%|██████▍                               | 10.2M/60.6M [00:10<00:56, 884kB/s]
 17%|██████▍                               | 10.3M/60.6M [00:10<00:55, 903kB/s]
 17%|██████▌                               | 10.5M/60.6M [00:11<00:52, 952kB/s]
 17%|██████▋                               | 10.6M/60.6M [00:11<00:52, 951kB/s]
 18%|██████▋                               | 10.7M/60.6M [00:11<00:52, 945kB/s]
 18%|██████▊                               | 10.8M/60.6M [00:11<00:52, 946kB/s]
 18%|██████▋                              | 11.0M/60.6M [00:11<00:48, 1.02MB/s]
 18%|██████▉                               | 11.1M/60.6M [00:11<00:51, 964kB/s]
 18%|██████▉                               | 11.2M/60.6M [00:11<00:54, 912kB/s]
 19%|███████                               | 11.2M/60.6M [00:11<00:57, 863kB/s]
 19%|███████▏                              | 11.4M/60.6M [00:12<00:50, 972kB/s]
 19%|███████                              | 11.6M/60.6M [00:12<00:40, 1.20MB/s]
 19%|███████▏                             | 11.7M/60.6M [00:12<00:43, 1.13MB/s]
 20%|███████▏                             | 11.8M/60.6M [00:12<00:45, 1.07MB/s]
 20%|███████▎                             | 12.0M/60.6M [00:12<00:44, 1.10MB/s]
 20%|███████▍                             | 12.1M/60.6M [00:12<00:42, 1.13MB/s]
 20%|███████▍                             | 12.3M/60.6M [00:12<00:45, 1.07MB/s]
 20%|███████▌                             | 12.4M/60.6M [00:12<00:47, 1.01MB/s]
 21%|███████▊                              | 12.5M/60.6M [00:12<00:50, 955kB/s]
 21%|███████▉                              | 12.6M/60.6M [00:13<00:49, 967kB/s]
 21%|███████▉                              | 12.7M/60.6M [00:13<00:52, 913kB/s]
 21%|████████                              | 12.8M/60.6M [00:13<00:49, 960kB/s]
 21%|███████▉                             | 13.0M/60.6M [00:13<00:42, 1.12MB/s]
 22%|████████                             | 13.1M/60.6M [00:13<00:44, 1.07MB/s]
 22%|████████                             | 13.2M/60.6M [00:13<00:46, 1.03MB/s]
 22%|████████▏                            | 13.4M/60.6M [00:13<00:45, 1.04MB/s]
 22%|████████▍                             | 13.5M/60.6M [00:13<00:48, 981kB/s]
 22%|████████▌                             | 13.6M/60.6M [00:14<00:49, 951kB/s]
 23%|████████▌                             | 13.7M/60.6M [00:14<00:51, 906kB/s]
 23%|████████▋                             | 13.8M/60.6M [00:14<00:51, 914kB/s]
 23%|████████▌                            | 14.0M/60.6M [00:14<00:44, 1.04MB/s]
 23%|████████▌                            | 14.1M/60.6M [00:14<00:42, 1.09MB/s]
 23%|████████▋                            | 14.2M/60.6M [00:14<00:44, 1.03MB/s]
 24%|████████▉                             | 14.3M/60.6M [00:14<00:47, 973kB/s]
 24%|████████▊                            | 14.5M/60.6M [00:14<00:42, 1.09MB/s]
 24%|████████▉                            | 14.6M/60.6M [00:15<00:42, 1.08MB/s]
 24%|█████████                            | 14.7M/60.6M [00:15<00:42, 1.08MB/s]
 25%|█████████                            | 14.9M/60.6M [00:15<00:42, 1.08MB/s]
 25%|█████████▏                           | 15.0M/60.6M [00:15<00:42, 1.07MB/s]
 25%|█████████▏                           | 15.1M/60.6M [00:15<00:44, 1.01MB/s]
 25%|█████████▌                            | 15.2M/60.6M [00:15<00:47, 956kB/s]
 25%|█████████▍                           | 15.4M/60.6M [00:15<00:43, 1.04MB/s]
 26%|█████████▋                            | 15.5M/60.6M [00:15<00:45, 981kB/s]
 26%|█████████▊                            | 15.6M/60.6M [00:16<00:47, 952kB/s]
 26%|█████████▌                           | 15.7M/60.6M [00:16<00:43, 1.03MB/s]
 26%|█████████▋                           | 15.9M/60.6M [00:16<00:41, 1.08MB/s]
 26%|█████████▊                           | 16.0M/60.6M [00:16<00:43, 1.04MB/s]
 27%|██████████                            | 16.1M/60.6M [00:16<00:45, 976kB/s]
 27%|██████████▏                           | 16.2M/60.6M [00:16<00:48, 923kB/s]
 27%|██████████▏                           | 16.3M/60.6M [00:16<00:48, 916kB/s]
 27%|██████████▎                           | 16.4M/60.6M [00:16<00:45, 960kB/s]
 27%|██████████▍                           | 16.5M/60.6M [00:17<00:46, 952kB/s]
 27%|██████████▍                           | 16.6M/60.6M [00:17<00:48, 911kB/s]
 28%|██████████▌                           | 16.8M/60.6M [00:17<00:47, 918kB/s]
 28%|██████████▎                          | 16.9M/60.6M [00:17<00:43, 1.01MB/s]
 28%|██████████▍                          | 17.0M/60.6M [00:17<00:42, 1.03MB/s]
 28%|██████████▌                          | 17.3M/60.6M [00:17<00:34, 1.24MB/s]
 29%|██████████▋                          | 17.4M/60.6M [00:17<00:35, 1.23MB/s]
 29%|██████████▋                          | 17.5M/60.6M [00:17<00:36, 1.18MB/s]
 29%|██████████▊                          | 17.7M/60.6M [00:18<00:38, 1.12MB/s]
 29%|██████████▊                          | 17.8M/60.6M [00:18<00:39, 1.09MB/s]
 30%|██████████▉                          | 17.9M/60.6M [00:18<00:37, 1.12MB/s]
 30%|███████████                          | 18.0M/60.6M [00:18<00:39, 1.07MB/s]
 30%|███████████                          | 18.2M/60.6M [00:18<00:41, 1.03MB/s]
 30%|███████████▏                         | 18.3M/60.6M [00:18<00:40, 1.04MB/s]
 30%|███████████▏                         | 18.4M/60.6M [00:18<00:41, 1.01MB/s]
 31%|███████████▌                          | 18.5M/60.6M [00:18<00:44, 955kB/s]
 31%|███████████▍                         | 18.7M/60.6M [00:19<00:40, 1.03MB/s]
 31%|███████████▊                          | 18.8M/60.6M [00:19<00:43, 970kB/s]
 31%|███████████▌                         | 18.9M/60.6M [00:19<00:37, 1.11MB/s]
 31%|███████████▋                         | 19.1M/60.6M [00:19<00:39, 1.05MB/s]
 32%|███████████▋                         | 19.2M/60.6M [00:19<00:37, 1.11MB/s]
 32%|███████████▊                         | 19.3M/60.6M [00:19<00:37, 1.10MB/s]
 32%|███████████▉                         | 19.4M/60.6M [00:19<00:39, 1.04MB/s]
 32%|████████████▎                         | 19.6M/60.6M [00:19<00:41, 982kB/s]
 32%|████████████▎                         | 19.7M/60.6M [00:20<00:44, 928kB/s]
 33%|████████████▍                         | 19.8M/60.6M [00:20<00:42, 970kB/s]
 33%|████████████▏                        | 19.9M/60.6M [00:20<00:40, 1.00MB/s]
 33%|████████████▏                        | 20.0M/60.6M [00:20<00:39, 1.02MB/s]
 33%|████████████▎                        | 20.2M/60.6M [00:20<00:37, 1.07MB/s]
 34%|████████████▍                        | 20.3M/60.6M [00:20<00:37, 1.07MB/s]
 34%|████████████▋                        | 20.7M/60.6M [00:20<00:24, 1.63MB/s]
 34%|████████████▋                        | 20.9M/60.6M [00:20<00:25, 1.54MB/s]
 35%|████████████▊                        | 21.0M/60.6M [00:20<00:27, 1.45MB/s]
 35%|████████████▉                        | 21.2M/60.6M [00:21<00:28, 1.37MB/s]
 35%|█████████████▎                        | 21.3M/60.6M [00:21<00:39, 999kB/s]
 35%|█████████████                        | 21.4M/60.6M [00:21<00:39, 1.00MB/s]
 36%|█████████████▏                       | 21.6M/60.6M [00:21<00:35, 1.09MB/s]
 36%|█████████████▎                       | 21.8M/60.6M [00:21<00:32, 1.20MB/s]
 36%|█████████████▍                       | 21.9M/60.6M [00:21<00:31, 1.24MB/s]
 36%|█████████████▍                       | 22.1M/60.6M [00:21<00:32, 1.19MB/s]
 37%|█████████████▌                       | 22.2M/60.6M [00:22<00:33, 1.13MB/s]
 37%|█████████████▋                       | 22.3M/60.6M [00:22<00:33, 1.13MB/s]
 37%|█████████████▋                       | 22.4M/60.6M [00:22<00:35, 1.08MB/s]
 37%|█████████████▊                       | 22.6M/60.6M [00:22<00:34, 1.12MB/s]
 38%|█████████████▉                       | 22.8M/60.6M [00:22<00:28, 1.34MB/s]
 38%|██████████████                       | 23.0M/60.6M [00:22<00:26, 1.42MB/s]
 38%|██████████████▏                      | 23.3M/60.6M [00:22<00:22, 1.63MB/s]
 39%|██████████████▎                      | 23.4M/60.6M [00:22<00:23, 1.57MB/s]
 39%|██████████████▍                      | 23.6M/60.6M [00:23<00:23, 1.57MB/s]
 39%|██████████████▌                      | 23.9M/60.6M [00:23<00:22, 1.66MB/s]
 40%|██████████████▋                      | 24.0M/60.6M [00:23<00:23, 1.57MB/s]
 40%|██████████████▊                      | 24.2M/60.6M [00:23<00:24, 1.48MB/s]
 40%|██████████████▊                      | 24.3M/60.6M [00:23<00:25, 1.40MB/s]
 41%|██████████████▉                      | 24.5M/60.6M [00:23<00:24, 1.47MB/s]
 41%|███████████████                      | 24.7M/60.6M [00:23<00:25, 1.43MB/s]
 41%|███████████████▏                     | 24.9M/60.6M [00:23<00:26, 1.35MB/s]
 41%|███████████████▎                     | 25.0M/60.6M [00:24<00:27, 1.28MB/s]
 41%|███████████████▎                     | 25.1M/60.6M [00:24<00:29, 1.20MB/s]
 42%|███████████████▍                     | 25.2M/60.6M [00:24<00:31, 1.14MB/s]
 42%|███████████████▍                     | 25.4M/60.6M [00:24<00:32, 1.08MB/s]
 42%|███████████████▌                     | 25.5M/60.6M [00:24<00:34, 1.02MB/s]
 42%|███████████████▋                     | 25.7M/60.6M [00:24<00:26, 1.30MB/s]
 43%|███████████████▊                     | 25.8M/60.6M [00:24<00:28, 1.23MB/s]
 43%|███████████████▊                     | 26.0M/60.6M [00:24<00:29, 1.18MB/s]
 43%|███████████████▉                     | 26.1M/60.6M [00:25<00:29, 1.15MB/s]
 43%|████████████████                     | 26.2M/60.6M [00:25<00:31, 1.09MB/s]
 44%|████████████████                     | 26.4M/60.6M [00:25<00:29, 1.16MB/s]
 44%|████████████████▏                    | 26.5M/60.6M [00:25<00:29, 1.14MB/s]
 44%|████████████████▎                    | 26.7M/60.6M [00:25<00:26, 1.28MB/s]
 44%|████████████████▍                    | 26.9M/60.6M [00:25<00:26, 1.25MB/s]
 45%|████████████████▌                    | 27.0M/60.6M [00:25<00:26, 1.28MB/s]
 45%|████████████████▌                    | 27.2M/60.6M [00:25<00:27, 1.21MB/s]
 45%|████████████████▊                    | 27.4M/60.6M [00:26<00:21, 1.53MB/s]
 46%|████████████████▊                    | 27.6M/60.6M [00:26<00:21, 1.51MB/s]
 46%|████████████████▉                    | 27.8M/60.6M [00:26<00:22, 1.43MB/s]
 46%|█████████████████                    | 27.9M/60.6M [00:26<00:24, 1.35MB/s]
 46%|█████████████████▏                   | 28.1M/60.6M [00:26<00:22, 1.42MB/s]
 47%|█████████████████▎                   | 28.2M/60.6M [00:26<00:24, 1.34MB/s]
 47%|█████████████████▎                   | 28.4M/60.6M [00:26<00:25, 1.26MB/s]
 47%|█████████████████▍                   | 28.5M/60.6M [00:26<00:26, 1.20MB/s]
 47%|█████████████████▌                   | 28.7M/60.6M [00:27<00:26, 1.19MB/s]
 48%|█████████████████▌                   | 28.8M/60.6M [00:27<00:28, 1.12MB/s]
 48%|█████████████████▋                   | 28.9M/60.6M [00:27<00:28, 1.10MB/s]
 48%|█████████████████▋                   | 29.0M/60.6M [00:27<00:30, 1.04MB/s]
 48%|█████████████████▊                   | 29.2M/60.6M [00:27<00:25, 1.23MB/s]
 48%|█████████████████▉                   | 29.3M/60.6M [00:27<00:27, 1.16MB/s]
 49%|█████████████████▉                   | 29.5M/60.6M [00:27<00:28, 1.09MB/s]
 49%|██████████████████▏                  | 29.8M/60.6M [00:27<00:18, 1.63MB/s]
 49%|██████████████████▎                  | 30.0M/60.6M [00:28<00:19, 1.54MB/s]
 50%|██████████████████▍                  | 30.1M/60.6M [00:28<00:20, 1.45MB/s]
 50%|██████████████████▍                  | 30.3M/60.6M [00:28<00:22, 1.37MB/s]
 50%|██████████████████▌                  | 30.4M/60.6M [00:28<00:23, 1.30MB/s]
 50%|██████████████████▋                  | 30.5M/60.6M [00:28<00:24, 1.23MB/s]
 51%|██████████████████▋                  | 30.7M/60.6M [00:28<00:25, 1.16MB/s]
 51%|██████████████████▊                  | 30.8M/60.6M [00:28<00:27, 1.09MB/s]
 51%|███████████████████▍                  | 30.9M/60.6M [00:28<00:37, 795kB/s]
 51%|███████████████████▍                  | 31.0M/60.6M [00:29<00:37, 779kB/s]
 51%|███████████████████▌                  | 31.1M/60.6M [00:29<00:34, 850kB/s]
 52%|███████████████████▏                 | 31.3M/60.6M [00:29<00:27, 1.05MB/s]
 52%|███████████████████▏                 | 31.4M/60.6M [00:29<00:27, 1.06MB/s]
 52%|███████████████████▎                 | 31.5M/60.6M [00:29<00:28, 1.01MB/s]
 52%|███████████████████▍                 | 31.8M/60.6M [00:29<00:22, 1.27MB/s]
 53%|███████████████████▌                 | 32.0M/60.6M [00:29<00:20, 1.36MB/s]
 53%|███████████████████▋                 | 32.1M/60.6M [00:29<00:20, 1.36MB/s]
 53%|███████████████████▋                 | 32.3M/60.6M [00:30<00:20, 1.40MB/s]
 54%|███████████████████▊                 | 32.5M/60.6M [00:30<00:20, 1.38MB/s]
 54%|███████████████████▉                 | 32.6M/60.6M [00:30<00:21, 1.30MB/s]
 54%|████████████████████                 | 32.8M/60.6M [00:30<00:22, 1.23MB/s]
 54%|████████████████████                 | 32.9M/60.6M [00:30<00:23, 1.17MB/s]
 55%|████████████████████▏                | 33.0M/60.6M [00:30<00:24, 1.14MB/s]
 55%|████████████████████▎                | 33.2M/60.6M [00:30<00:21, 1.27MB/s]
 55%|████████████████████▍                | 33.5M/60.6M [00:30<00:18, 1.49MB/s]
 56%|████████████████████▌                | 33.6M/60.6M [00:31<00:18, 1.48MB/s]
 56%|████████████████████▋                | 33.8M/60.6M [00:31<00:19, 1.39MB/s]
 56%|████████████████████▋                | 33.9M/60.6M [00:31<00:20, 1.32MB/s]
 56%|████████████████████▊                | 34.1M/60.6M [00:31<00:21, 1.24MB/s]
 56%|████████████████████▉                | 34.2M/60.6M [00:31<00:22, 1.18MB/s]
 57%|████████████████████▉                | 34.3M/60.6M [00:31<00:23, 1.11MB/s]
 57%|█████████████████████                | 34.4M/60.6M [00:31<00:24, 1.08MB/s]
 58%|█████████████████████▎               | 35.0M/60.6M [00:31<00:12, 2.12MB/s]
 58%|█████████████████████▌               | 35.2M/60.6M [00:32<00:12, 2.00MB/s]
 58%|█████████████████████▌               | 35.4M/60.6M [00:32<00:13, 1.88MB/s]
 59%|█████████████████████▊               | 35.6M/60.6M [00:32<00:12, 1.92MB/s]
 59%|█████████████████████▉               | 35.8M/60.6M [00:32<00:13, 1.81MB/s]
 59%|██████████████████████               | 36.0M/60.6M [00:32<00:18, 1.32MB/s]
 60%|██████████████████████▏              | 36.3M/60.6M [00:32<00:15, 1.59MB/s]
 60%|██████████████████████▎              | 36.5M/60.6M [00:32<00:15, 1.56MB/s]
 61%|██████████████████████▍              | 36.7M/60.6M [00:33<00:15, 1.50MB/s]
 61%|██████████████████████▍              | 36.8M/60.6M [00:33<00:16, 1.44MB/s]
 61%|██████████████████████▌              | 37.0M/60.6M [00:33<00:21, 1.07MB/s]
 61%|██████████████████████▋              | 37.1M/60.6M [00:33<00:22, 1.06MB/s]
 62%|██████████████████████▉              | 37.5M/60.6M [00:33<00:13, 1.66MB/s]
 62%|███████████████████████              | 37.8M/60.6M [00:33<00:12, 1.78MB/s]
 63%|███████████████████████▏             | 38.0M/60.6M [00:33<00:13, 1.72MB/s]
 63%|███████████████████████▎             | 38.1M/60.6M [00:34<00:13, 1.65MB/s]
 63%|███████████████████████▍             | 38.3M/60.6M [00:34<00:14, 1.58MB/s]
 64%|███████████████████████▌             | 38.5M/60.6M [00:34<00:14, 1.54MB/s]
 64%|███████████████████████▋             | 38.7M/60.6M [00:34<00:13, 1.64MB/s]
 64%|███████████████████████▊             | 38.9M/60.6M [00:34<00:14, 1.55MB/s]
 64%|███████████████████████▊             | 39.1M/60.6M [00:34<00:19, 1.13MB/s]
 65%|███████████████████████▉             | 39.2M/60.6M [00:34<00:19, 1.11MB/s]
 65%|████████████████████████             | 39.3M/60.6M [00:35<00:19, 1.07MB/s]
 65%|████████████████████████▋             | 39.4M/60.6M [00:35<00:25, 816kB/s]
 65%|████████████████████████▊             | 39.5M/60.6M [00:35<00:26, 804kB/s]
 66%|████████████████████████▎            | 39.7M/60.6M [00:35<00:19, 1.09MB/s]
 66%|████████████████████████▍            | 40.0M/60.6M [00:35<00:16, 1.26MB/s]
 66%|████████████████████████▍            | 40.1M/60.6M [00:35<00:16, 1.21MB/s]
 66%|████████████████████████▌            | 40.2M/60.6M [00:35<00:17, 1.17MB/s]
 67%|████████████████████████▋            | 40.4M/60.6M [00:36<00:15, 1.29MB/s]
 67%|████████████████████████▊            | 40.6M/60.6M [00:36<00:16, 1.23MB/s]
 67%|████████████████████████▊            | 40.7M/60.6M [00:36<00:17, 1.17MB/s]
 67%|████████████████████████▉            | 40.8M/60.6M [00:36<00:17, 1.11MB/s]
 68%|████████████████████████▉            | 40.9M/60.6M [00:36<00:18, 1.05MB/s]
 68%|█████████████████████████▏           | 41.2M/60.6M [00:36<00:13, 1.46MB/s]
 68%|█████████████████████████▎           | 41.4M/60.6M [00:36<00:13, 1.38MB/s]
 69%|█████████████████████████▎           | 41.5M/60.6M [00:36<00:14, 1.30MB/s]
 69%|█████████████████████████▍           | 41.7M/60.6M [00:37<00:14, 1.34MB/s]
 69%|█████████████████████████▌           | 41.9M/60.6M [00:37<00:12, 1.50MB/s]
 69%|█████████████████████████▋           | 42.1M/60.6M [00:37<00:13, 1.41MB/s]
 70%|█████████████████████████▊           | 42.2M/60.6M [00:37<00:12, 1.43MB/s]
 70%|█████████████████████████▉           | 42.4M/60.6M [00:37<00:12, 1.40MB/s]
 70%|██████████████████████████           | 42.6M/60.6M [00:37<00:11, 1.58MB/s]
 71%|██████████████████████████▏          | 42.8M/60.6M [00:37<00:11, 1.49MB/s]
 71%|██████████████████████████▏          | 43.0M/60.6M [00:37<00:16, 1.09MB/s]
 71%|██████████████████████████▎          | 43.1M/60.6M [00:38<00:16, 1.06MB/s]
 71%|██████████████████████████▍          | 43.2M/60.6M [00:38<00:16, 1.04MB/s]
 72%|███████████████████████████▏          | 43.3M/60.6M [00:38<00:17, 996kB/s]
 72%|███████████████████████████▏          | 43.4M/60.6M [00:38<00:17, 954kB/s]
 72%|██████████████████████████▋          | 43.6M/60.6M [00:38<00:15, 1.09MB/s]
 72%|██████████████████████████▋          | 43.7M/60.6M [00:38<00:16, 1.04MB/s]
 72%|███████████████████████████▍          | 43.8M/60.6M [00:38<00:16, 989kB/s]
 72%|███████████████████████████▌          | 43.9M/60.6M [00:38<00:17, 935kB/s]
 73%|███████████████████████████▌          | 44.0M/60.6M [00:39<00:18, 885kB/s]
 73%|███████████████████████████▋          | 44.1M/60.6M [00:39<00:19, 845kB/s]
 73%|███████████████████████████▋          | 44.2M/60.6M [00:39<00:19, 843kB/s]
 73%|███████████████████████████▊          | 44.3M/60.6M [00:39<00:19, 830kB/s]
 73%|███████████████████████████▉          | 44.5M/60.6M [00:39<00:16, 980kB/s]
 74%|███████████████████████████▏         | 44.6M/60.6M [00:39<00:15, 1.00MB/s]
 74%|████████████████████████████          | 44.7M/60.6M [00:39<00:16, 950kB/s]
 74%|████████████████████████████          | 44.8M/60.6M [00:39<00:17, 896kB/s]
 74%|████████████████████████████▏         | 44.9M/60.6M [00:40<00:18, 867kB/s]
 74%|████████████████████████████▏         | 45.0M/60.6M [00:40<00:18, 846kB/s]
 74%|████████████████████████████▎         | 45.1M/60.6M [00:40<00:16, 912kB/s]
 75%|████████████████████████████▎         | 45.2M/60.6M [00:40<00:17, 878kB/s]
 75%|████████████████████████████▍         | 45.3M/60.6M [00:40<00:17, 854kB/s]
 75%|████████████████████████████▌         | 45.5M/60.6M [00:40<00:15, 957kB/s]
 75%|████████████████████████████▌         | 45.6M/60.6M [00:40<00:15, 949kB/s]
 75%|███████████████████████████▉         | 45.7M/60.6M [00:40<00:14, 1.02MB/s]
 76%|████████████████████████████▊         | 45.8M/60.6M [00:41<00:15, 965kB/s]
 76%|████████████████████████████▊         | 45.9M/60.6M [00:41<00:16, 913kB/s]
 76%|████████████████████████████▉         | 46.1M/60.6M [00:41<00:14, 991kB/s]
 76%|████████████████████████████▉         | 46.2M/60.6M [00:41<00:15, 939kB/s]
 76%|█████████████████████████████         | 46.3M/60.6M [00:41<00:14, 977kB/s]
 77%|████████████████████████████▍        | 46.5M/60.6M [00:41<00:12, 1.13MB/s]
 77%|████████████████████████████▍        | 46.6M/60.6M [00:41<00:13, 1.07MB/s]
 77%|████████████████████████████▌        | 46.7M/60.6M [00:41<00:13, 1.03MB/s]
 77%|█████████████████████████████▎        | 46.8M/60.6M [00:42<00:14, 976kB/s]
 77%|█████████████████████████████▍        | 46.9M/60.6M [00:42<00:14, 923kB/s]
 78%|████████████████████████████▊        | 47.1M/60.6M [00:42<00:11, 1.16MB/s]
 78%|████████████████████████████▉        | 47.3M/60.6M [00:42<00:10, 1.26MB/s]
 78%|█████████████████████████████        | 47.5M/60.6M [00:42<00:09, 1.32MB/s]
 79%|█████████████████████████████        | 47.6M/60.6M [00:42<00:10, 1.25MB/s]
 79%|█████████████████████████████▎       | 47.9M/60.6M [00:42<00:08, 1.55MB/s]
 79%|█████████████████████████████▍       | 48.1M/60.6M [00:42<00:07, 1.65MB/s]
 80%|█████████████████████████████▌       | 48.3M/60.6M [00:43<00:07, 1.64MB/s]
 80%|█████████████████████████████▋       | 48.5M/60.6M [00:43<00:07, 1.60MB/s]
 80%|█████████████████████████████▋       | 48.7M/60.6M [00:43<00:07, 1.50MB/s]
 81%|█████████████████████████████▊       | 48.8M/60.6M [00:43<00:08, 1.41MB/s]
 81%|█████████████████████████████▉       | 49.0M/60.6M [00:43<00:08, 1.34MB/s]
 81%|██████████████████████████████       | 49.1M/60.6M [00:43<00:08, 1.36MB/s]
 82%|██████████████████████████████▏      | 49.4M/60.6M [00:43<00:07, 1.55MB/s]
 82%|██████████████████████████████▎      | 49.5M/60.6M [00:43<00:07, 1.47MB/s]
 82%|██████████████████████████████▎      | 49.7M/60.6M [00:44<00:10, 1.07MB/s]
 82%|██████████████████████████████▍      | 49.8M/60.6M [00:44<00:09, 1.09MB/s]
 82%|██████████████████████████████▌      | 50.0M/60.6M [00:44<00:10, 1.06MB/s]
 83%|██████████████████████████████▌      | 50.1M/60.6M [00:44<00:10, 1.02MB/s]
 83%|██████████████████████████████▋      | 50.2M/60.6M [00:44<00:09, 1.07MB/s]
 83%|██████████████████████████████▋      | 50.3M/60.6M [00:44<00:10, 1.02MB/s]
 83%|███████████████████████████████▋      | 50.4M/60.6M [00:44<00:10, 970kB/s]
 84%|██████████████████████████████▉      | 50.6M/60.6M [00:45<00:08, 1.12MB/s]
 84%|███████████████████████████████      | 50.9M/60.6M [00:45<00:07, 1.38MB/s]
 84%|███████████████████████████████▏     | 51.1M/60.6M [00:45<00:06, 1.52MB/s]
 85%|███████████████████████████████▍     | 51.4M/60.6M [00:45<00:05, 1.83MB/s]
 85%|███████████████████████████████▌     | 51.6M/60.6M [00:45<00:05, 1.73MB/s]
 85%|███████████████████████████████▌     | 51.8M/60.6M [00:45<00:05, 1.63MB/s]
 86%|███████████████████████████████▋     | 51.9M/60.6M [00:45<00:05, 1.54MB/s]
 86%|███████████████████████████████▊     | 52.1M/60.6M [00:45<00:05, 1.46MB/s]
 86%|███████████████████████████████▉     | 52.2M/60.6M [00:46<00:07, 1.06MB/s]
 86%|███████████████████████████████▉     | 52.4M/60.6M [00:46<00:07, 1.07MB/s]
 87%|████████████████████████████████     | 52.5M/60.6M [00:46<00:07, 1.04MB/s]
 87%|████████████████████████████████▉     | 52.6M/60.6M [00:46<00:08, 998kB/s]
 87%|█████████████████████████████████     | 52.7M/60.6M [00:46<00:08, 956kB/s]
 88%|████████████████████████████████▍    | 53.0M/60.6M [00:46<00:05, 1.48MB/s]
 88%|████████████████████████████████▌    | 53.3M/60.6M [00:46<00:04, 1.67MB/s]
 88%|████████████████████████████████▋    | 53.5M/60.6M [00:46<00:04, 1.61MB/s]
 89%|████████████████████████████████▊    | 53.6M/60.6M [00:47<00:04, 1.53MB/s]
 89%|████████████████████████████████▉    | 53.8M/60.6M [00:47<00:04, 1.55MB/s]
 89%|████████████████████████████████▉    | 54.0M/60.6M [00:47<00:04, 1.47MB/s]
 89%|█████████████████████████████████    | 54.1M/60.6M [00:47<00:04, 1.39MB/s]
 90%|█████████████████████████████████▏   | 54.3M/60.6M [00:47<00:04, 1.31MB/s]
 90%|█████████████████████████████████▏   | 54.4M/60.6M [00:47<00:04, 1.28MB/s]
 90%|█████████████████████████████████▎   | 54.6M/60.6M [00:47<00:04, 1.30MB/s]
 91%|█████████████████████████████████▍   | 54.8M/60.6M [00:47<00:03, 1.51MB/s]
 91%|█████████████████████████████████▌   | 55.0M/60.6M [00:48<00:03, 1.53MB/s]
 91%|█████████████████████████████████▋   | 55.2M/60.6M [00:48<00:03, 1.45MB/s]
 91%|█████████████████████████████████▊   | 55.3M/60.6M [00:48<00:03, 1.37MB/s]
 92%|█████████████████████████████████▉   | 55.5M/60.6M [00:48<00:03, 1.29MB/s]
 92%|██████████████████████████████████▉   | 55.6M/60.6M [00:48<00:05, 941kB/s]
 92%|██████████████████████████████████▉   | 55.7M/60.6M [00:48<00:05, 947kB/s]
 92%|███████████████████████████████████   | 55.8M/60.6M [00:48<00:05, 943kB/s]
 92%|██████████████████████████████████▏  | 56.0M/60.6M [00:49<00:04, 1.05MB/s]
 93%|██████████████████████████████████▎  | 56.1M/60.6M [00:49<00:04, 1.01MB/s]
 93%|██████████████████████████████████▍  | 56.4M/60.6M [00:49<00:03, 1.31MB/s]
 93%|██████████████████████████████████▌  | 56.6M/60.6M [00:49<00:02, 1.43MB/s]
 94%|██████████████████████████████████▋  | 56.8M/60.6M [00:49<00:02, 1.52MB/s]
 94%|██████████████████████████████████▊  | 56.9M/60.6M [00:49<00:02, 1.44MB/s]
 94%|██████████████████████████████████▊  | 57.1M/60.6M [00:49<00:03, 1.05MB/s]
 94%|██████████████████████████████████▉  | 57.2M/60.6M [00:50<00:03, 1.03MB/s]
 95%|███████████████████████████████████  | 57.3M/60.6M [00:50<00:03, 1.01MB/s]
 95%|████████████████████████████████████  | 57.4M/60.6M [00:50<00:03, 970kB/s]
 95%|████████████████████████████████████  | 57.5M/60.6M [00:50<00:03, 929kB/s]
 95%|████████████████████████████████████▏ | 57.6M/60.6M [00:50<00:03, 889kB/s]
 95%|████████████████████████████████████▏ | 57.8M/60.6M [00:50<00:03, 935kB/s]
 96%|████████████████████████████████████▎ | 57.9M/60.6M [00:50<00:02, 934kB/s]
 96%|████████████████████████████████████▎ | 58.0M/60.6M [00:50<00:02, 899kB/s]
 96%|████████████████████████████████████▍ | 58.1M/60.6M [00:51<00:02, 869kB/s]
 96%|███████████████████████████████████▌ | 58.3M/60.6M [00:51<00:01, 1.21MB/s]
 97%|███████████████████████████████████▋ | 58.5M/60.6M [00:51<00:01, 1.21MB/s]
 97%|███████████████████████████████████▊ | 58.6M/60.6M [00:51<00:01, 1.14MB/s]
 97%|███████████████████████████████████▊ | 58.7M/60.6M [00:51<00:01, 1.08MB/s]
 97%|███████████████████████████████████▉ | 58.8M/60.6M [00:51<00:01, 1.02MB/s]
 97%|████████████████████████████████████ | 58.9M/60.6M [00:51<00:01, 1.04MB/s]
 97%|█████████████████████████████████████ | 59.0M/60.6M [00:51<00:01, 980kB/s]
 98%|█████████████████████████████████████ | 59.1M/60.6M [00:52<00:01, 926kB/s]
 98%|█████████████████████████████████████▏| 59.2M/60.6M [00:52<00:01, 878kB/s]
 98%|█████████████████████████████████████▏| 59.3M/60.6M [00:52<00:01, 855kB/s]
 98%|█████████████████████████████████████▎| 59.4M/60.6M [00:52<00:01, 843kB/s]
 98%|█████████████████████████████████████▍| 59.6M/60.6M [00:52<00:01, 950kB/s]
 99%|████████████████████████████████████▍| 59.7M/60.6M [00:52<00:00, 1.03MB/s]
 99%|█████████████████████████████████████▌| 59.8M/60.6M [00:52<00:00, 973kB/s]
 99%|█████████████████████████████████████▌| 59.9M/60.6M [00:52<00:00, 918kB/s]
 99%|████████████████████████████████████▊| 60.2M/60.6M [00:53<00:00, 1.28MB/s]
100%|████████████████████████████████████▊| 60.3M/60.6M [00:53<00:00, 1.21MB/s]
100%|████████████████████████████████████▉| 60.4M/60.6M [00:53<00:00, 1.14MB/s]
60.6MB [00:53, 1.12MB/s]
60.8MB [00:53, 1.39MB/s]
61.0MB [00:53, 1.41MB/s]
  0%|                                              | 0.00/60.6M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 60.6M/60.6M [00:00<00:00, 635GB/s]
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(

  0%|                                              | 0.00/29.6M [00:00<?, ?B/s]
  0%|                                     | 11.3k/29.6M [00:00<06:25, 76.8kB/s]
  0%|                                      | 33.8k/29.6M [00:00<03:38, 135kB/s]
  0%|                                      | 93.2k/29.6M [00:00<01:41, 289kB/s]
  1%|▎                                      | 212k/29.6M [00:00<01:00, 489kB/s]
  1%|▍                                      | 333k/29.6M [00:00<00:44, 652kB/s]
  1%|▌                                      | 431k/29.6M [00:00<00:41, 701kB/s]
  2%|▋                                      | 531k/29.6M [00:00<00:39, 737kB/s]
  2%|▊                                      | 646k/29.6M [00:01<00:36, 790kB/s]
  2%|▉                                      | 728k/29.6M [00:01<00:38, 753kB/s]
  3%|█                                      | 826k/29.6M [00:01<00:37, 768kB/s]
  3%|█▏                                     | 925k/29.6M [00:01<00:36, 778kB/s]
  4%|█▍                                   | 1.14M/29.6M [00:01<00:26, 1.07MB/s]
  4%|█▌                                   | 1.25M/29.6M [00:01<00:27, 1.03MB/s]
  5%|█▋                                   | 1.38M/29.6M [00:01<00:27, 1.04MB/s]
  5%|█▊                                   | 1.50M/29.6M [00:01<00:27, 1.01MB/s]
  6%|██                                   | 1.63M/29.6M [00:02<00:27, 1.03MB/s]
  6%|██▏                                   | 1.73M/29.6M [00:02<00:28, 972kB/s]
  6%|██▎                                   | 1.84M/29.6M [00:02<00:29, 954kB/s]
  7%|██▍                                   | 1.94M/29.6M [00:02<00:30, 903kB/s]
  7%|██▌                                   | 2.03M/29.6M [00:02<00:32, 855kB/s]
  7%|██▋                                   | 2.12M/29.6M [00:02<00:33, 826kB/s]
  8%|███                                  | 2.42M/29.6M [00:02<00:20, 1.31MB/s]
  9%|███▎                                 | 2.62M/29.6M [00:02<00:19, 1.40MB/s]
  9%|███▍                                 | 2.76M/29.6M [00:03<00:20, 1.32MB/s]
 10%|███▌                                 | 2.89M/29.6M [00:03<00:21, 1.25MB/s]
 10%|███▊                                 | 3.02M/29.6M [00:03<00:22, 1.18MB/s]
 11%|███▉                                 | 3.15M/29.6M [00:03<00:23, 1.14MB/s]
 11%|████                                 | 3.28M/29.6M [00:03<00:23, 1.12MB/s]
 12%|████▎                                | 3.43M/29.6M [00:03<00:22, 1.15MB/s]
 12%|████▍                                | 3.60M/29.6M [00:03<00:21, 1.21MB/s]
 13%|████▋                                | 3.79M/29.6M [00:03<00:19, 1.33MB/s]
 13%|████▉                                | 3.99M/29.6M [00:03<00:18, 1.41MB/s]
 14%|█████▏                               | 4.13M/29.6M [00:04<00:19, 1.33MB/s]
 14%|█████▎                               | 4.27M/29.6M [00:04<00:20, 1.26MB/s]
 15%|█████▍                               | 4.39M/29.6M [00:04<00:21, 1.19MB/s]
 15%|█████▋                               | 4.51M/29.6M [00:04<00:22, 1.12MB/s]
 16%|█████▊                               | 4.62M/29.6M [00:04<00:23, 1.06MB/s]
 16%|█████▉                               | 4.76M/29.6M [00:04<00:22, 1.08MB/s]
 16%|██████                               | 4.87M/29.6M [00:04<00:24, 1.02MB/s]
 17%|██████▎                              | 5.01M/29.6M [00:04<00:23, 1.06MB/s]
 17%|██████▌                               | 5.12M/29.6M [00:05<00:24, 999kB/s]
 18%|██████▌                              | 5.29M/29.6M [00:05<00:21, 1.12MB/s]
 18%|██████▊                              | 5.46M/29.6M [00:05<00:20, 1.19MB/s]
 19%|███████                              | 5.62M/29.6M [00:05<00:19, 1.24MB/s]
 19%|███████▏                             | 5.75M/29.6M [00:05<00:20, 1.17MB/s]
 20%|███████▎                             | 5.86M/29.6M [00:05<00:21, 1.10MB/s]
 20%|███████▍                             | 5.98M/29.6M [00:05<00:22, 1.04MB/s]
 21%|███████▊                              | 6.08M/29.6M [00:05<00:23, 984kB/s]
 21%|███████▊                             | 6.27M/29.6M [00:06<00:20, 1.15MB/s]
 22%|███████▉                             | 6.38M/29.6M [00:06<00:21, 1.09MB/s]
 22%|████████                             | 6.49M/29.6M [00:06<00:22, 1.03MB/s]
 22%|████████▎                            | 6.63M/29.6M [00:06<00:21, 1.06MB/s]
 23%|████████▌                            | 6.83M/29.6M [00:06<00:18, 1.23MB/s]
 24%|████████▊                            | 7.08M/29.6M [00:06<00:15, 1.47MB/s]
 25%|█████████                            | 7.26M/29.6M [00:06<00:15, 1.47MB/s]
 25%|█████████▎                           | 7.48M/29.6M [00:06<00:14, 1.56MB/s]
 26%|█████████▌                           | 7.63M/29.6M [00:07<00:14, 1.47MB/s]
 26%|█████████▋                           | 7.78M/29.6M [00:07<00:15, 1.39MB/s]
 27%|██████████                           | 8.04M/29.6M [00:07<00:13, 1.61MB/s]
 28%|██████████▎                          | 8.20M/29.6M [00:07<00:14, 1.52MB/s]
 28%|██████████▍                          | 8.35M/29.6M [00:07<00:19, 1.11MB/s]
 29%|██████████▋                          | 8.51M/29.6M [00:07<00:18, 1.16MB/s]
 29%|██████████▊                          | 8.64M/29.6M [00:07<00:18, 1.13MB/s]
 30%|██████████▉                          | 8.76M/29.6M [00:08<00:19, 1.09MB/s]
 30%|███████████                          | 8.88M/29.6M [00:08<00:19, 1.05MB/s]
 31%|███████████▎                         | 9.09M/29.6M [00:08<00:16, 1.25MB/s]
 31%|███████████▌                         | 9.22M/29.6M [00:08<00:17, 1.19MB/s]
 32%|███████████▋                         | 9.34M/29.6M [00:08<00:17, 1.13MB/s]
 32%|███████████▉                         | 9.58M/29.6M [00:08<00:14, 1.38MB/s]
 33%|████████████▏                        | 9.72M/29.6M [00:08<00:15, 1.31MB/s]
 33%|████████████▎                        | 9.85M/29.6M [00:08<00:15, 1.24MB/s]
 34%|████████████▍                        | 9.98M/29.6M [00:09<00:16, 1.18MB/s]
 34%|████████████▋                        | 10.1M/29.6M [00:09<00:16, 1.18MB/s]
 35%|████████████▊                        | 10.3M/29.6M [00:09<00:16, 1.19MB/s]
 35%|█████████████                        | 10.4M/29.6M [00:09<00:15, 1.24MB/s]
 36%|█████████████▎                       | 10.6M/29.6M [00:09<00:13, 1.39MB/s]
 37%|█████████████▌                       | 10.8M/29.6M [00:09<00:13, 1.35MB/s]
 37%|█████████████▋                       | 10.9M/29.6M [00:09<00:14, 1.28MB/s]
 37%|█████████████▊                       | 11.1M/29.6M [00:09<00:15, 1.21MB/s]
 38%|█████████████▉                       | 11.2M/29.6M [00:10<00:16, 1.14MB/s]
 38%|██████████████▏                      | 11.3M/29.6M [00:10<00:16, 1.08MB/s]
 39%|██████████████▎                      | 11.4M/29.6M [00:10<00:17, 1.02MB/s]
 39%|██████████████▊                       | 11.5M/29.6M [00:10<00:18, 967kB/s]
 39%|██████████████▉                       | 11.6M/29.6M [00:10<00:19, 916kB/s]
 40%|██████████████▊                      | 11.8M/29.6M [00:10<00:16, 1.10MB/s]
 40%|██████████████▉                      | 11.9M/29.6M [00:10<00:16, 1.10MB/s]
 41%|███████████████                      | 12.1M/29.6M [00:10<00:16, 1.09MB/s]
 41%|███████████████▏                     | 12.2M/29.6M [00:10<00:16, 1.05MB/s]
 42%|███████████████▍                     | 12.4M/29.6M [00:11<00:14, 1.17MB/s]
 42%|███████████████▋                     | 12.5M/29.6M [00:11<00:13, 1.22MB/s]
 43%|███████████████▊                     | 12.6M/29.6M [00:11<00:14, 1.16MB/s]
 43%|███████████████▉                     | 12.8M/29.6M [00:11<00:15, 1.09MB/s]
 44%|████████████████▏                    | 12.9M/29.6M [00:11<00:13, 1.19MB/s]
 44%|████████████████▎                    | 13.1M/29.6M [00:11<00:13, 1.20MB/s]
 45%|████████████████▌                    | 13.2M/29.6M [00:11<00:13, 1.20MB/s]
 46%|████████████████▉                    | 13.5M/29.6M [00:11<00:10, 1.48MB/s]
 46%|█████████████████                    | 13.6M/29.6M [00:12<00:11, 1.40MB/s]
 47%|█████████████████▏                   | 13.8M/29.6M [00:12<00:11, 1.32MB/s]
 47%|█████████████████▍                   | 13.9M/29.6M [00:12<00:12, 1.25MB/s]
 47%|█████████████████▌                   | 14.0M/29.6M [00:12<00:13, 1.19MB/s]
 48%|█████████████████▋                   | 14.2M/29.6M [00:12<00:13, 1.12MB/s]
 48%|█████████████████▊                   | 14.3M/29.6M [00:12<00:14, 1.06MB/s]
 49%|█████████████████▉                   | 14.4M/29.6M [00:12<00:15, 1.00MB/s]
 49%|██████████████████▎                  | 14.6M/29.6M [00:12<00:11, 1.27MB/s]
 50%|██████████████████▍                  | 14.7M/29.6M [00:13<00:12, 1.20MB/s]
 50%|██████████████████▌                  | 14.9M/29.6M [00:13<00:12, 1.14MB/s]
 51%|██████████████████▉                  | 15.1M/29.6M [00:13<00:09, 1.45MB/s]
 52%|███████████████████▏                 | 15.3M/29.6M [00:13<00:10, 1.42MB/s]
 52%|███████████████████▎                 | 15.4M/29.6M [00:13<00:10, 1.34MB/s]
 53%|███████████████████▍                 | 15.6M/29.6M [00:13<00:11, 1.26MB/s]
 53%|███████████████████▋                 | 15.7M/29.6M [00:13<00:11, 1.20MB/s]
 53%|███████████████████▊                 | 15.8M/29.6M [00:13<00:12, 1.13MB/s]
 54%|███████████████████▉                 | 15.9M/29.6M [00:14<00:12, 1.07MB/s]
 54%|████████████████████                 | 16.0M/29.6M [00:14<00:13, 1.01MB/s]
 55%|████████████████████▋                 | 16.1M/29.6M [00:14<00:14, 958kB/s]
 55%|████████████████████▊                 | 16.2M/29.6M [00:14<00:14, 911kB/s]
 55%|█████████████████████                 | 16.4M/29.6M [00:14<00:14, 918kB/s]
 56%|█████████████████████▏                | 16.5M/29.6M [00:14<00:14, 884kB/s]
 56%|█████████████████████▎                | 16.6M/29.6M [00:14<00:15, 860kB/s]
 57%|████████████████████▉                | 16.8M/29.6M [00:14<00:11, 1.09MB/s]
 57%|█████████████████████▏               | 17.0M/29.6M [00:15<00:09, 1.33MB/s]
 58%|█████████████████████▌               | 17.2M/29.6M [00:15<00:07, 1.58MB/s]
 59%|█████████████████████▊               | 17.4M/29.6M [00:15<00:08, 1.49MB/s]
 59%|█████████████████████▉               | 17.6M/29.6M [00:15<00:11, 1.09MB/s]
 60%|██████████████████████               | 17.7M/29.6M [00:15<00:11, 1.07MB/s]
 60%|██████████████████████▎              | 17.8M/29.6M [00:15<00:11, 1.04MB/s]
 61%|██████████████████████▌              | 18.1M/29.6M [00:15<00:08, 1.37MB/s]
 62%|██████████████████████▊              | 18.2M/29.6M [00:16<00:08, 1.32MB/s]
 62%|██████████████████████▉              | 18.4M/29.6M [00:16<00:08, 1.26MB/s]
 62%|███████████████████████              | 18.5M/29.6M [00:16<00:09, 1.20MB/s]
 63%|███████████████████████▎             | 18.6M/29.6M [00:16<00:09, 1.17MB/s]
 63%|███████████████████████▍             | 18.7M/29.6M [00:16<00:09, 1.11MB/s]
 64%|███████████████████████▌             | 18.9M/29.6M [00:16<00:09, 1.09MB/s]
 64%|███████████████████████▊             | 19.0M/29.6M [00:16<00:09, 1.17MB/s]
 65%|████████████████████████             | 19.2M/29.6M [00:16<00:08, 1.22MB/s]
 65%|████████████████████████▏            | 19.3M/29.6M [00:16<00:08, 1.15MB/s]
 66%|████████████████████████▎            | 19.4M/29.6M [00:17<00:09, 1.09MB/s]
 66%|████████████████████████▍            | 19.6M/29.6M [00:17<00:09, 1.07MB/s]
 66%|████████████████████████▌            | 19.7M/29.6M [00:17<00:09, 1.01MB/s]
 67%|█████████████████████████▍            | 19.8M/29.6M [00:17<00:10, 959kB/s]
 67%|█████████████████████████▌            | 19.9M/29.6M [00:17<00:10, 907kB/s]
 67%|█████████████████████████▋            | 20.0M/29.6M [00:17<00:11, 856kB/s]
 68%|█████████████████████████▏           | 20.2M/29.6M [00:17<00:08, 1.08MB/s]
 69%|█████████████████████████▍           | 20.4M/29.6M [00:17<00:07, 1.24MB/s]
 69%|█████████████████████████▌           | 20.5M/29.6M [00:18<00:07, 1.17MB/s]
 70%|█████████████████████████▊           | 20.6M/29.6M [00:18<00:08, 1.11MB/s]
 70%|█████████████████████████▉           | 20.7M/29.6M [00:18<00:08, 1.05MB/s]
 70%|██████████████████████████▋           | 20.8M/29.6M [00:18<00:08, 994kB/s]
 71%|██████████████████████████▊           | 20.9M/29.6M [00:18<00:09, 941kB/s]
 71%|██████████████████████████▉           | 21.0M/29.6M [00:18<00:09, 889kB/s]
 72%|██████████████████████████▌          | 21.2M/29.6M [00:18<00:07, 1.17MB/s]
 72%|██████████████████████████▊          | 21.4M/29.6M [00:18<00:06, 1.26MB/s]
 73%|██████████████████████████▉          | 21.6M/29.6M [00:19<00:06, 1.28MB/s]
 73%|███████████████████████████▏         | 21.7M/29.6M [00:19<00:06, 1.22MB/s]
 75%|███████████████████████████▋         | 22.1M/29.6M [00:19<00:04, 1.78MB/s]
 75%|████████████████████████████▌         | 22.3M/29.6M [00:19<00:07, 990kB/s]
 76%|████████████████████████████         | 22.4M/29.6M [00:19<00:07, 1.02MB/s]
 76%|████████████████████████████▏        | 22.5M/29.6M [00:19<00:06, 1.03MB/s]
 77%|████████████████████████████▎        | 22.7M/29.6M [00:20<00:06, 1.02MB/s]
 77%|████████████████████████████▍        | 22.8M/29.6M [00:20<00:06, 1.01MB/s]
 78%|████████████████████████████▋        | 23.0M/29.6M [00:20<00:05, 1.13MB/s]
 78%|████████████████████████████▉        | 23.1M/29.6M [00:20<00:05, 1.19MB/s]
 79%|█████████████████████████████        | 23.2M/29.6M [00:20<00:05, 1.14MB/s]
 79%|█████████████████████████████▏       | 23.4M/29.6M [00:20<00:05, 1.09MB/s]
 79%|█████████████████████████████▎       | 23.5M/29.6M [00:20<00:05, 1.04MB/s]
 80%|██████████████████████████████▎       | 23.6M/29.6M [00:20<00:06, 991kB/s]
 80%|██████████████████████████████▍       | 23.7M/29.6M [00:21<00:06, 940kB/s]
 81%|█████████████████████████████▊       | 23.9M/29.6M [00:21<00:05, 1.10MB/s]
 81%|█████████████████████████████▉       | 24.0M/29.6M [00:21<00:05, 1.04MB/s]
 82%|██████████████████████████████▏      | 24.1M/29.6M [00:21<00:04, 1.10MB/s]
 82%|██████████████████████████████▎      | 24.2M/29.6M [00:21<00:05, 1.04MB/s]
 82%|██████████████████████████████▍      | 24.4M/29.6M [00:21<00:04, 1.06MB/s]
 83%|██████████████████████████████▋      | 24.6M/29.6M [00:21<00:04, 1.22MB/s]
 84%|██████████████████████████████▉      | 24.7M/29.6M [00:21<00:03, 1.26MB/s]
 84%|███████████████████████████████▏     | 24.9M/29.6M [00:22<00:03, 1.28MB/s]
 85%|███████████████████████████████▎     | 25.0M/29.6M [00:22<00:03, 1.21MB/s]
 85%|███████████████████████████████▍     | 25.2M/29.6M [00:22<00:03, 1.15MB/s]
 85%|███████████████████████████████▌     | 25.3M/29.6M [00:22<00:03, 1.09MB/s]
 86%|███████████████████████████████▉     | 25.5M/29.6M [00:22<00:03, 1.32MB/s]
 87%|████████████████████████████████▏    | 25.7M/29.6M [00:22<00:02, 1.37MB/s]
 87%|████████████████████████████████▎    | 25.8M/29.6M [00:22<00:02, 1.37MB/s]
 88%|████████████████████████████████▌    | 26.1M/29.6M [00:22<00:02, 1.48MB/s]
 89%|████████████████████████████████▊    | 26.2M/29.6M [00:23<00:02, 1.40MB/s]
 89%|████████████████████████████████▉    | 26.3M/29.6M [00:23<00:02, 1.32MB/s]
 90%|█████████████████████████████████▏   | 26.5M/29.6M [00:23<00:02, 1.25MB/s]
 90%|█████████████████████████████████▎   | 26.6M/29.6M [00:23<00:02, 1.18MB/s]
 90%|█████████████████████████████████▍   | 26.7M/29.6M [00:23<00:02, 1.12MB/s]
 91%|█████████████████████████████████▌   | 26.8M/29.6M [00:23<00:02, 1.05MB/s]
 91%|██████████████████████████████████▌   | 26.9M/29.6M [00:23<00:02, 996kB/s]
 91%|██████████████████████████████████▋   | 27.0M/29.6M [00:23<00:02, 940kB/s]
 92%|██████████████████████████████████▊   | 27.1M/29.6M [00:24<00:02, 889kB/s]
 92%|██████████████████████████████████▉   | 27.2M/29.6M [00:24<00:02, 841kB/s]
 92%|███████████████████████████████████▏  | 27.3M/29.6M [00:24<00:02, 888kB/s]
 93%|███████████████████████████████████▎  | 27.4M/29.6M [00:24<00:02, 864kB/s]
 93%|██████████████████████████████████▌  | 27.6M/29.6M [00:24<00:01, 1.05MB/s]
 94%|██████████████████████████████████▊  | 27.8M/29.6M [00:24<00:01, 1.26MB/s]
 95%|███████████████████████████████████  | 28.0M/29.6M [00:24<00:01, 1.28MB/s]
 95%|███████████████████████████████████▎ | 28.2M/29.6M [00:24<00:00, 1.42MB/s]
 96%|███████████████████████████████████▍ | 28.4M/29.6M [00:25<00:00, 1.35MB/s]
 96%|███████████████████████████████████▋ | 28.5M/29.6M [00:25<00:00, 1.27MB/s]
 97%|███████████████████████████████████▊ | 28.6M/29.6M [00:25<00:00, 1.20MB/s]
 97%|███████████████████████████████████▉ | 28.7M/29.6M [00:25<00:00, 1.14MB/s]
 98%|████████████████████████████████████ | 28.9M/29.6M [00:25<00:00, 1.08MB/s]
 98%|████████████████████████████████████▏| 29.0M/29.6M [00:25<00:00, 1.02MB/s]
 99%|████████████████████████████████████▋| 29.3M/29.6M [00:25<00:00, 1.50MB/s]
100%|████████████████████████████████████▉| 29.6M/29.6M [00:25<00:00, 1.69MB/s]
29.7MB [00:25, 1.59MB/s]
  0%|                                              | 0.00/29.6M [00:00<?, ?B/s]
100%|██████████████████████████████████████| 29.6M/29.6M [00:00<00:00, 259GB/s]
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
/opt/hostedtoolcache/Python/3.12.16/x64/lib/python3.12/site-packages/urllib3/connectionpool.py:2567: InsecureRequestWarning: Unverified HTTPS request is being made to host 'zenodo.org'. Adding certificate verification is strongly advised. See: https://urllib3future.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(

  0%|                                              | 0.00/87.9M [00:00<?, ?B/s]
  0%|                                   | 1.02k/87.9M [00:00<4:19:42, 5.64kB/s]
  0%|                                      | 33.8k/87.9M [00:00<10:54, 134kB/s]
  0%|                                      | 99.3k/87.9M [00:00<04:53, 299kB/s]
  0%|                                       | 165k/87.9M [00:00<03:33, 410kB/s]
  0%|▏                                      | 298k/87.9M [00:00<02:22, 615kB/s]
  0%|▏                                      | 431k/87.9M [00:00<01:54, 767kB/s]
  1%|▏                                      | 563k/87.9M [00:00<01:41, 864kB/s]
  1%|▎                                      | 663k/87.9M [00:01<01:43, 846kB/s]
  1%|▎                                      | 749k/87.9M [00:01<01:48, 800kB/s]
  1%|▎                                      | 829k/87.9M [00:01<01:55, 756kB/s]
  1%|▍                                      | 959k/87.9M [00:01<01:42, 848kB/s]
  1%|▍                                     | 1.06M/87.9M [00:01<01:44, 832kB/s]
  1%|▌                                    | 1.27M/87.9M [00:01<01:18, 1.10MB/s]
  2%|▌                                    | 1.38M/87.9M [00:01<01:23, 1.04MB/s]
  2%|▋                                     | 1.49M/87.9M [00:01<01:27, 983kB/s]
  2%|▋                                     | 1.60M/87.9M [00:02<01:29, 966kB/s]
  2%|▋                                     | 1.70M/87.9M [00:02<01:34, 915kB/s]
  2%|▊                                     | 1.83M/87.9M [00:02<01:29, 959kB/s]
  2%|▊                                     | 1.93M/87.9M [00:02<01:33, 915kB/s]
  2%|▉                                     | 2.03M/87.9M [00:02<01:37, 879kB/s]
  2%|▉                                     | 2.13M/87.9M [00:02<01:39, 860kB/s]
  3%|▉                                     | 2.22M/87.9M [00:02<01:45, 811kB/s]
  3%|█                                     | 2.33M/87.9M [00:02<01:42, 837kB/s]
  3%|█                                     | 2.43M/87.9M [00:03<01:43, 825kB/s]
  3%|█                                     | 2.51M/87.9M [00:03<01:49, 781kB/s]
  3%|█▏                                   | 2.72M/87.9M [00:03<01:20, 1.06MB/s]
  3%|█▏                                   | 2.85M/87.9M [00:03<01:19, 1.06MB/s]
  3%|█▏                                   | 2.96M/87.9M [00:03<01:24, 1.00MB/s]
  3%|█▎                                    | 3.06M/87.9M [00:03<01:29, 949kB/s]
  4%|█▍                                    | 3.18M/87.9M [00:03<01:28, 962kB/s]
  4%|█▍                                    | 3.28M/87.9M [00:03<01:32, 912kB/s]
  4%|█▍                                   | 3.43M/87.9M [00:04<01:24, 1.00MB/s]
  4%|█▌                                    | 3.53M/87.9M [00:04<01:29, 944kB/s]
  4%|█▌                                    | 3.63M/87.9M [00:04<01:34, 893kB/s]
  4%|█▌                                    | 3.75M/87.9M [00:04<01:32, 907kB/s]
  4%|█▋                                    | 3.85M/87.9M [00:04<01:36, 874kB/s]
  5%|█▋                                   | 4.03M/87.9M [00:04<01:19, 1.05MB/s]
  5%|█▊                                    | 4.13M/87.9M [00:04<01:24, 990kB/s]
  5%|█▊                                    | 4.23M/87.9M [00:04<01:29, 936kB/s]
  5%|█▊                                    | 4.32M/87.9M [00:04<01:34, 885kB/s]
  5%|█▉                                    | 4.41M/87.9M [00:05<01:39, 837kB/s]
  5%|█▉                                    | 4.52M/87.9M [00:05<01:38, 843kB/s]
  5%|██                                    | 4.68M/87.9M [00:05<01:24, 989kB/s]
  5%|██                                    | 4.78M/87.9M [00:05<01:29, 934kB/s]
  6%|██                                    | 4.88M/87.9M [00:05<01:33, 884kB/s]
  6%|██▏                                   | 4.97M/87.9M [00:05<01:39, 834kB/s]
  6%|██▏                                   | 5.06M/87.9M [00:05<01:41, 814kB/s]
  6%|██▏                                   | 5.16M/87.9M [00:05<01:41, 812kB/s]
  6%|██▎                                   | 5.26M/87.9M [00:06<01:42, 808kB/s]
  6%|██▎                                   | 5.41M/87.9M [00:06<01:30, 912kB/s]
  6%|██▍                                   | 5.51M/87.9M [00:06<01:33, 878kB/s]
  6%|██▍                                   | 5.62M/87.9M [00:06<01:33, 883kB/s]
  7%|██▍                                   | 5.72M/87.9M [00:06<01:35, 858kB/s]
  7%|██▌                                   | 5.81M/87.9M [00:06<01:41, 810kB/s]
  7%|██▌                                  | 6.07M/87.9M [00:06<01:08, 1.20MB/s]
  7%|██▌                                  | 6.19M/87.9M [00:06<01:11, 1.14MB/s]
  7%|██▋                                  | 6.36M/87.9M [00:07<01:06, 1.22MB/s]
  7%|██▋                                  | 6.50M/87.9M [00:07<01:09, 1.18MB/s]
  8%|██▊                                  | 6.61M/87.9M [00:07<01:13, 1.11MB/s]
  8%|██▊                                  | 6.72M/87.9M [00:07<01:17, 1.05MB/s]
  8%|██▉                                  | 6.86M/87.9M [00:07<01:16, 1.06MB/s]
  8%|██▉                                  | 7.01M/87.9M [00:07<01:15, 1.07MB/s]
  8%|██▉                                  | 7.11M/87.9M [00:07<01:19, 1.01MB/s]
  8%|███                                   | 7.22M/87.9M [00:07<01:24, 954kB/s]
  8%|███▏                                  | 7.31M/87.9M [00:08<01:29, 900kB/s]
  8%|███▏                                  | 7.45M/87.9M [00:08<01:22, 971kB/s]
  9%|███▎                                  | 7.55M/87.9M [00:08<01:27, 919kB/s]
  9%|███▎                                  | 7.65M/87.9M [00:08<01:31, 880kB/s]
  9%|███▎                                  | 7.75M/87.9M [00:08<01:33, 861kB/s]
  9%|███▍                                  | 7.84M/87.9M [00:08<01:38, 814kB/s]
  9%|███▍                                  | 7.97M/87.9M [00:08<01:30, 882kB/s]
  9%|███▍                                  | 8.06M/87.9M [00:08<01:33, 857kB/s]
  9%|███▌                                  | 8.18M/87.9M [00:09<01:30, 879kB/s]
  9%|███▌                                  | 8.28M/87.9M [00:09<01:33, 855kB/s]
 10%|███▌                                 | 8.47M/87.9M [00:09<01:13, 1.08MB/s]
 10%|███▌                                 | 8.61M/87.9M [00:09<01:13, 1.08MB/s]
 10%|███▋                                 | 8.72M/87.9M [00:09<01:17, 1.02MB/s]
 10%|███▊                                 | 9.05M/87.9M [00:09<00:51, 1.53MB/s]
 10%|███▉                                 | 9.22M/87.9M [00:09<00:53, 1.47MB/s]
 11%|███▉                                 | 9.36M/87.9M [00:09<00:56, 1.39MB/s]
 11%|████                                 | 9.50M/87.9M [00:10<00:59, 1.31MB/s]
 11%|████                                 | 9.63M/87.9M [00:10<01:03, 1.23MB/s]
 11%|████                                 | 9.76M/87.9M [00:10<01:07, 1.16MB/s]
 11%|████▏                                | 9.88M/87.9M [00:10<01:11, 1.10MB/s]
 11%|████▏                                | 9.99M/87.9M [00:10<01:17, 1.01MB/s]
 11%|████▎                                 | 10.1M/87.9M [00:10<01:21, 957kB/s]
 12%|████▍                                 | 10.2M/87.9M [00:10<01:25, 906kB/s]
 12%|████▎                                | 10.4M/87.9M [00:10<01:09, 1.11MB/s]
 12%|████▍                                | 10.5M/87.9M [00:11<01:07, 1.14MB/s]
 12%|████▍                                | 10.6M/87.9M [00:11<01:11, 1.08MB/s]
 12%|████▌                                | 10.9M/87.9M [00:11<00:53, 1.44MB/s]
 13%|████▋                                | 11.1M/87.9M [00:11<00:54, 1.40MB/s]
 13%|████▋                                | 11.2M/87.9M [00:11<00:57, 1.33MB/s]
 13%|████▊                                | 11.4M/87.9M [00:11<01:01, 1.25MB/s]
 13%|████▊                                | 11.5M/87.9M [00:11<01:04, 1.18MB/s]
 14%|█████                                | 11.9M/87.9M [00:11<00:40, 1.87MB/s]
 14%|█████                                | 12.1M/87.9M [00:12<00:43, 1.76MB/s]
 14%|█████▏                               | 12.3M/87.9M [00:12<00:45, 1.66MB/s]
 14%|█████▏                               | 12.4M/87.9M [00:12<00:48, 1.56MB/s]
 14%|█████▎                               | 12.6M/87.9M [00:12<00:51, 1.48MB/s]
 15%|█████▎                               | 12.8M/87.9M [00:12<00:53, 1.39MB/s]
 15%|█████▍                               | 12.9M/87.9M [00:12<01:14, 1.01MB/s]
 15%|█████▌                                | 13.0M/87.9M [00:12<01:15, 991kB/s]
 15%|█████▌                               | 13.3M/87.9M [00:13<00:54, 1.36MB/s]
 15%|█████▋                               | 13.5M/87.9M [00:13<00:56, 1.32MB/s]
 15%|█████▋                               | 13.6M/87.9M [00:13<00:56, 1.32MB/s]
 16%|█████▊                               | 13.8M/87.9M [00:13<00:58, 1.26MB/s]
 16%|█████▊                               | 13.9M/87.9M [00:13<01:01, 1.21MB/s]
 16%|█████▉                               | 14.2M/87.9M [00:13<00:45, 1.62MB/s]
 16%|██████                               | 14.4M/87.9M [00:13<00:47, 1.53MB/s]
 17%|██████                               | 14.5M/87.9M [00:14<01:05, 1.12MB/s]
 17%|██████▏                              | 14.7M/87.9M [00:14<01:06, 1.10MB/s]
 17%|██████▏                              | 14.8M/87.9M [00:14<01:08, 1.07MB/s]
 17%|██████▎                              | 14.9M/87.9M [00:14<01:09, 1.04MB/s]
 17%|██████▍                               | 15.0M/87.9M [00:14<01:13, 999kB/s]
 17%|██████▌                               | 15.1M/87.9M [00:14<01:18, 922kB/s]
 17%|██████▌                               | 15.2M/87.9M [00:14<01:22, 879kB/s]
 17%|██████▌                               | 15.3M/87.9M [00:14<01:26, 837kB/s]
 18%|██████▋                               | 15.5M/87.9M [00:15<01:14, 968kB/s]
 18%|██████▋                               | 15.5M/87.9M [00:15<01:18, 918kB/s]
 18%|██████▌                              | 15.7M/87.9M [00:15<01:12, 1.00MB/s]
 18%|██████▋                              | 15.9M/87.9M [00:15<01:03, 1.14MB/s]
 18%|██████▊                              | 16.1M/87.9M [00:15<00:52, 1.36MB/s]
 19%|██████▊                              | 16.3M/87.9M [00:15<00:53, 1.35MB/s]
 19%|██████▉                              | 16.4M/87.9M [00:15<00:56, 1.27MB/s]
 19%|██████▉                              | 16.5M/87.9M [00:15<00:59, 1.20MB/s]
 19%|███████                              | 16.7M/87.9M [00:16<00:52, 1.36MB/s]
 19%|███████▏                             | 17.0M/87.9M [00:16<00:46, 1.51MB/s]
 19%|███████▏                             | 17.1M/87.9M [00:16<00:49, 1.42MB/s]
 20%|███████▎                             | 17.3M/87.9M [00:16<00:52, 1.35MB/s]
 20%|███████▎                             | 17.4M/87.9M [00:16<00:53, 1.31MB/s]
 20%|███████▍                             | 17.6M/87.9M [00:16<00:56, 1.24MB/s]
 20%|███████▍                             | 17.7M/87.9M [00:16<00:59, 1.17MB/s]
 20%|███████▌                             | 17.8M/87.9M [00:16<00:58, 1.20MB/s]
 20%|███████▌                             | 18.0M/87.9M [00:17<01:00, 1.16MB/s]
 21%|███████▌                             | 18.1M/87.9M [00:17<01:03, 1.10MB/s]
 21%|███████▋                             | 18.2M/87.9M [00:17<01:04, 1.09MB/s]
 21%|███████▋                             | 18.4M/87.9M [00:17<00:59, 1.17MB/s]
 21%|███████▊                             | 18.5M/87.9M [00:17<01:01, 1.13MB/s]
 21%|███████▊                             | 18.6M/87.9M [00:17<01:04, 1.07MB/s]
 21%|███████▉                             | 18.8M/87.9M [00:17<00:58, 1.19MB/s]
 22%|███████▉                             | 18.9M/87.9M [00:17<00:59, 1.16MB/s]
 22%|████████                             | 19.1M/87.9M [00:18<01:01, 1.13MB/s]
 22%|████████                             | 19.3M/87.9M [00:18<00:54, 1.27MB/s]
 22%|████████▏                            | 19.4M/87.9M [00:18<00:53, 1.29MB/s]
 22%|████████▎                            | 19.6M/87.9M [00:18<00:48, 1.42MB/s]
 23%|████████▎                            | 19.8M/87.9M [00:18<00:50, 1.34MB/s]
 23%|████████▍                            | 19.9M/87.9M [00:18<00:53, 1.26MB/s]
 23%|████████▍                            | 20.1M/87.9M [00:18<00:49, 1.38MB/s]
 23%|████████▌                            | 20.3M/87.9M [00:18<00:52, 1.30MB/s]
 23%|████████▌                            | 20.4M/87.9M [00:18<00:55, 1.23MB/s]
 23%|████████▋                            | 20.5M/87.9M [00:19<00:58, 1.15MB/s]
 23%|████████▋                            | 20.6M/87.9M [00:19<01:02, 1.08MB/s]
 24%|████████▉                             | 20.7M/87.9M [00:19<01:24, 792kB/s]
 24%|████████▊                            | 21.0M/87.9M [00:19<01:01, 1.08MB/s]
 24%|████████▉                            | 21.1M/87.9M [00:19<01:01, 1.08MB/s]
 24%|████████▉                            | 21.4M/87.9M [00:19<00:50, 1.33MB/s]
 24%|█████████                            | 21.5M/87.9M [00:19<00:52, 1.27MB/s]
 25%|█████████                            | 21.6M/87.9M [00:20<00:54, 1.22MB/s]
 25%|█████████▏                           | 21.8M/87.9M [00:20<00:56, 1.16MB/s]
 25%|█████████▎                           | 22.0M/87.9M [00:20<00:48, 1.36MB/s]
 25%|█████████▎                           | 22.1M/87.9M [00:20<00:50, 1.31MB/s]
 25%|█████████▍                           | 22.3M/87.9M [00:20<00:46, 1.40MB/s]
 26%|█████████▍                           | 22.5M/87.9M [00:20<00:49, 1.32MB/s]
 26%|█████████▌                           | 22.6M/87.9M [00:20<00:52, 1.25MB/s]
 26%|█████████▌                           | 22.7M/87.9M [00:20<00:55, 1.18MB/s]
 26%|█████████▌                           | 22.9M/87.9M [00:21<00:58, 1.12MB/s]
 26%|█████████▋                           | 23.0M/87.9M [00:21<01:01, 1.05MB/s]
 26%|█████████▉                            | 23.1M/87.9M [00:21<01:05, 996kB/s]
 26%|██████████                            | 23.2M/87.9M [00:21<01:08, 942kB/s]
 26%|██████████                            | 23.3M/87.9M [00:21<01:12, 891kB/s]
 27%|█████████▊                           | 23.4M/87.9M [00:21<01:02, 1.04MB/s]
 27%|██████████▏                           | 23.5M/87.9M [00:21<01:05, 979kB/s]
 27%|██████████▏                           | 23.7M/87.9M [00:21<01:07, 952kB/s]
 27%|██████████▎                           | 23.8M/87.9M [00:22<01:10, 910kB/s]
 27%|██████████▎                           | 23.9M/87.9M [00:22<01:04, 996kB/s]
 27%|██████████▏                          | 24.1M/87.9M [00:22<00:52, 1.21MB/s]
 28%|██████████▏                          | 24.3M/87.9M [00:22<00:52, 1.21MB/s]
 28%|██████████▎                          | 24.4M/87.9M [00:22<00:55, 1.15MB/s]
 28%|██████████▎                          | 24.5M/87.9M [00:22<00:58, 1.08MB/s]
 28%|██████████▎                          | 24.6M/87.9M [00:22<01:01, 1.02MB/s]
 28%|██████████▋                           | 24.7M/87.9M [00:23<01:37, 649kB/s]
 28%|██████████▋                           | 24.8M/87.9M [00:23<01:36, 653kB/s]
 28%|██████████▊                           | 24.9M/87.9M [00:23<01:30, 693kB/s]
 28%|██████████▊                           | 25.0M/87.9M [00:23<01:24, 748kB/s]
 29%|██████████▌                          | 25.2M/87.9M [00:23<01:01, 1.02MB/s]
 29%|██████████▋                          | 25.4M/87.9M [00:23<00:58, 1.07MB/s]
 29%|██████████▋                          | 25.5M/87.9M [00:23<01:00, 1.03MB/s]
 29%|███████████                           | 25.6M/87.9M [00:24<01:03, 981kB/s]
 29%|███████████                           | 25.7M/87.9M [00:24<01:06, 935kB/s]
 29%|███████████▏                          | 25.8M/87.9M [00:24<01:09, 890kB/s]
 29%|███████████▏                          | 25.9M/87.9M [00:24<01:12, 850kB/s]
 30%|██████████▉                          | 26.1M/87.9M [00:24<00:59, 1.03MB/s]
 30%|███████████▏                         | 26.4M/87.9M [00:24<00:37, 1.64MB/s]
 30%|███████████▏                         | 26.7M/87.9M [00:24<00:35, 1.70MB/s]
 31%|███████████▎                         | 26.9M/87.9M [00:24<00:36, 1.67MB/s]
 31%|███████████▍                         | 27.0M/87.9M [00:24<00:38, 1.57MB/s]
 31%|███████████▍                         | 27.2M/87.9M [00:25<00:41, 1.48MB/s]
 31%|███████████▌                         | 27.3M/87.9M [00:25<00:56, 1.08MB/s]
 31%|███████████▌                         | 27.5M/87.9M [00:25<00:52, 1.15MB/s]
 32%|███████████▋                         | 27.7M/87.9M [00:25<00:46, 1.30MB/s]
 32%|███████████▋                         | 27.9M/87.9M [00:25<00:47, 1.26MB/s]
 32%|███████████▊                         | 28.0M/87.9M [00:25<00:49, 1.21MB/s]
 32%|███████████▊                         | 28.1M/87.9M [00:25<00:52, 1.14MB/s]
 32%|███████████▉                         | 28.2M/87.9M [00:26<00:54, 1.09MB/s]
 32%|███████████▉                         | 28.4M/87.9M [00:26<00:57, 1.03MB/s]
 32%|████████████▎                         | 28.5M/87.9M [00:26<01:00, 980kB/s]
 32%|████████████▎                         | 28.6M/87.9M [00:26<01:03, 928kB/s]
 33%|████████████                         | 28.8M/87.9M [00:26<00:51, 1.15MB/s]
 33%|████████████▏                        | 28.9M/87.9M [00:26<00:49, 1.20MB/s]
 33%|████████████▎                        | 29.2M/87.9M [00:26<00:41, 1.40MB/s]
 34%|████████████▌                        | 29.7M/87.9M [00:26<00:25, 2.33MB/s]
 34%|████████████▌                        | 30.0M/87.9M [00:27<00:26, 2.20MB/s]
 34%|████████████▋                        | 30.2M/87.9M [00:27<00:27, 2.07MB/s]
 35%|████████████▊                        | 30.4M/87.9M [00:27<00:38, 1.50MB/s]
 35%|████████████▊                        | 30.6M/87.9M [00:27<00:48, 1.18MB/s]
 35%|████████████▉                        | 30.7M/87.9M [00:27<00:48, 1.17MB/s]
 35%|████████████▉                        | 30.8M/87.9M [00:27<00:49, 1.15MB/s]
 35%|█████████████▍                        | 30.9M/87.9M [00:28<01:04, 887kB/s]
 35%|█████████████▍                        | 31.0M/87.9M [00:28<01:04, 875kB/s]
 35%|█████████████▍                        | 31.1M/87.9M [00:28<01:06, 854kB/s]
 36%|█████████████▌                        | 31.3M/87.9M [00:28<01:06, 858kB/s]
 36%|█████████████▌                        | 31.4M/87.9M [00:28<01:07, 842kB/s]
 36%|█████████████▌                        | 31.5M/87.9M [00:28<01:02, 907kB/s]
 36%|█████████████▋                        | 31.6M/87.9M [00:28<01:04, 877kB/s]
 36%|█████████████▋                        | 31.7M/87.9M [00:29<01:07, 835kB/s]
 36%|█████████████▋                        | 31.8M/87.9M [00:29<01:10, 793kB/s]
 36%|█████████████▊                        | 31.8M/87.9M [00:29<01:14, 752kB/s]
 36%|█████████████▊                        | 31.9M/87.9M [00:29<01:18, 711kB/s]
 36%|█████████████▊                        | 32.0M/87.9M [00:29<01:22, 674kB/s]
 37%|█████████████▌                       | 32.3M/87.9M [00:29<00:43, 1.26MB/s]
 37%|█████████████▋                       | 32.4M/87.9M [00:29<00:46, 1.20MB/s]
 37%|█████████████▋                       | 32.6M/87.9M [00:29<00:48, 1.13MB/s]
 37%|█████████████▊                       | 32.7M/87.9M [00:30<00:51, 1.07MB/s]
 37%|█████████████▊                       | 32.9M/87.9M [00:30<00:45, 1.22MB/s]
 38%|█████████████▉                       | 33.0M/87.9M [00:30<00:47, 1.15MB/s]
 38%|█████████████▉                       | 33.1M/87.9M [00:30<00:49, 1.10MB/s]
 38%|█████████████▉                       | 33.2M/87.9M [00:30<00:52, 1.04MB/s]
 38%|██████████████▍                       | 33.3M/87.9M [00:30<00:55, 982kB/s]
 38%|██████████████▍                       | 33.4M/87.9M [00:30<00:58, 927kB/s]
 38%|██████████████▏                      | 33.6M/87.9M [00:30<00:49, 1.09MB/s]
 38%|██████████████▏                      | 33.7M/87.9M [00:31<00:52, 1.03MB/s]
 38%|██████████████▌                       | 33.8M/87.9M [00:31<00:55, 970kB/s]
 39%|██████████████▋                       | 33.9M/87.9M [00:31<00:58, 916kB/s]
 39%|██████████████▋                       | 34.0M/87.9M [00:31<01:00, 885kB/s]
 39%|██████████████▊                       | 34.1M/87.9M [00:31<01:02, 858kB/s]
 39%|██████████████▊                       | 34.2M/87.9M [00:31<01:03, 840kB/s]
 39%|██████████████▌                      | 34.5M/87.9M [00:31<00:43, 1.23MB/s]
 40%|██████████████▌                      | 34.7M/87.9M [00:31<00:36, 1.46MB/s]
 40%|██████████████▋                      | 34.9M/87.9M [00:32<00:38, 1.39MB/s]
 40%|██████████████▉                      | 35.5M/87.9M [00:32<00:21, 2.49MB/s]
 41%|███████████████                      | 35.8M/87.9M [00:32<00:22, 2.35MB/s]
 41%|███████████████▏                     | 36.0M/87.9M [00:32<00:38, 1.36MB/s]
 41%|███████████████▏                     | 36.2M/87.9M [00:32<00:37, 1.39MB/s]
 41%|███████████████▎                     | 36.4M/87.9M [00:32<00:37, 1.39MB/s]
 42%|███████████████▎                     | 36.5M/87.9M [00:33<00:37, 1.37MB/s]
 42%|███████████████▍                     | 36.7M/87.9M [00:33<00:48, 1.07MB/s]
 42%|███████████████▍                     | 36.8M/87.9M [00:33<00:48, 1.06MB/s]
 42%|███████████████▉                      | 36.9M/87.9M [00:33<01:01, 834kB/s]
 42%|███████████████▉                      | 37.0M/87.9M [00:33<01:01, 826kB/s]
 42%|████████████████                      | 37.2M/87.9M [00:33<00:54, 934kB/s]
 42%|████████████████                      | 37.3M/87.9M [00:34<00:55, 907kB/s]
 43%|████████████████▏                     | 37.4M/87.9M [00:34<00:51, 977kB/s]
 43%|████████████████▏                     | 37.5M/87.9M [00:34<00:53, 939kB/s]
 43%|███████████████▊                     | 37.7M/87.9M [00:34<00:48, 1.04MB/s]
 43%|████████████████▎                     | 37.8M/87.9M [00:34<00:50, 991kB/s]
 43%|████████████████▍                     | 37.9M/87.9M [00:34<00:50, 993kB/s]
 43%|████████████████▍                     | 38.0M/87.9M [00:34<00:52, 943kB/s]
 43%|████████████████▍                     | 38.1M/87.9M [00:34<00:55, 898kB/s]
 43%|████████████████▌                     | 38.2M/87.9M [00:35<00:56, 873kB/s]
 44%|████████████████▌                     | 38.3M/87.9M [00:35<00:58, 851kB/s]
 44%|████████████████▌                     | 38.4M/87.9M [00:35<00:58, 840kB/s]
 44%|████████████████▋                     | 38.5M/87.9M [00:35<00:59, 830kB/s]
 44%|████████████████▎                    | 38.7M/87.9M [00:35<00:44, 1.11MB/s]
 44%|████████████████▎                    | 38.8M/87.9M [00:35<00:46, 1.05MB/s]
 44%|████████████████▊                     | 38.9M/87.9M [00:35<00:49, 988kB/s]
 44%|████████████████▉                     | 39.0M/87.9M [00:35<00:52, 934kB/s]
 45%|████████████████▉                     | 39.1M/87.9M [00:35<00:55, 883kB/s]
 45%|████████████████▉                     | 39.2M/87.9M [00:36<00:58, 836kB/s]
 45%|████████████████▉                     | 39.3M/87.9M [00:36<01:01, 790kB/s]
 45%|█████████████████                     | 39.4M/87.9M [00:36<00:59, 809kB/s]
 45%|████████████████▋                    | 39.6M/87.9M [00:36<00:42, 1.13MB/s]
 45%|████████████████▋                    | 39.8M/87.9M [00:36<00:45, 1.06MB/s]
 46%|████████████████▊                    | 40.1M/87.9M [00:36<00:31, 1.51MB/s]
 46%|████████████████▉                    | 40.3M/87.9M [00:36<00:30, 1.57MB/s]
 46%|█████████████████                    | 40.4M/87.9M [00:36<00:32, 1.48MB/s]
 46%|█████████████████                    | 40.6M/87.9M [00:37<00:33, 1.40MB/s]
 46%|█████████████████▏                   | 40.7M/87.9M [00:37<00:34, 1.36MB/s]
 47%|█████████████████▏                   | 40.9M/87.9M [00:37<00:36, 1.28MB/s]
 47%|█████████████████▎                   | 41.0M/87.9M [00:37<00:38, 1.21MB/s]
 47%|█████████████████▎                   | 41.1M/87.9M [00:37<00:40, 1.15MB/s]
 47%|█████████████████▎                   | 41.2M/87.9M [00:37<00:43, 1.08MB/s]
 47%|█████████████████▍                   | 41.4M/87.9M [00:37<00:45, 1.02MB/s]
 47%|█████████████████▉                    | 41.5M/87.9M [00:37<00:48, 965kB/s]
 47%|█████████████████▉                    | 41.6M/87.9M [00:38<00:50, 911kB/s]
 47%|██████████████████                    | 41.6M/87.9M [00:38<00:53, 863kB/s]
 47%|██████████████████                    | 41.7M/87.9M [00:38<00:56, 817kB/s]
 48%|██████████████████                    | 41.8M/87.9M [00:38<00:56, 820kB/s]
 48%|█████████████████▋                   | 42.1M/87.9M [00:38<00:39, 1.17MB/s]
 48%|█████████████████▊                   | 42.2M/87.9M [00:38<00:41, 1.11MB/s]
 48%|█████████████████▊                   | 42.3M/87.9M [00:38<00:43, 1.05MB/s]
 48%|█████████████████▉                   | 42.5M/87.9M [00:38<00:39, 1.14MB/s]
 48%|█████████████████▉                   | 42.6M/87.9M [00:39<00:42, 1.08MB/s]
 49%|█████████████████▉                   | 42.7M/87.9M [00:39<00:44, 1.02MB/s]
 49%|██████████████████                   | 42.9M/87.9M [00:39<00:39, 1.13MB/s]
 49%|██████████████████                   | 43.0M/87.9M [00:39<00:42, 1.07MB/s]
 49%|██████████████████▏                  | 43.1M/87.9M [00:39<00:44, 1.01MB/s]
 49%|██████████████████▋                   | 43.2M/87.9M [00:39<00:46, 952kB/s]
 49%|██████████████████▏                  | 43.3M/87.9M [00:39<00:42, 1.04MB/s]
 49%|██████████████████▊                   | 43.4M/87.9M [00:39<00:45, 982kB/s]
 50%|██████████████████▊                   | 43.5M/87.9M [00:40<00:47, 926kB/s]
 50%|██████████████████▍                  | 43.7M/87.9M [00:40<00:42, 1.04MB/s]
 50%|██████████████████▉                   | 43.8M/87.9M [00:40<00:45, 979kB/s]
 50%|██████████████████▉                   | 43.9M/87.9M [00:40<00:47, 922kB/s]
 50%|███████████████████                   | 44.0M/87.9M [00:40<00:50, 873kB/s]
 50%|███████████████████                   | 44.1M/87.9M [00:40<00:53, 826kB/s]
 50%|███████████████████                   | 44.2M/87.9M [00:40<00:53, 814kB/s]
 50%|███████████████████▏                  | 44.3M/87.9M [00:40<00:53, 812kB/s]
 51%|███████████████████▏                  | 44.4M/87.9M [00:41<00:46, 927kB/s]
 51%|██████████████████▊                  | 44.6M/87.9M [00:41<00:41, 1.05MB/s]
 51%|██████████████████▊                  | 44.8M/87.9M [00:41<00:35, 1.22MB/s]
 51%|██████████████████▉                  | 45.0M/87.9M [00:41<00:34, 1.25MB/s]
 51%|███████████████████                  | 45.2M/87.9M [00:41<00:31, 1.36MB/s]
 52%|███████████████████                  | 45.3M/87.9M [00:41<00:33, 1.28MB/s]
 52%|███████████████████                  | 45.4M/87.9M [00:41<00:35, 1.21MB/s]
 52%|███████████████████▎                 | 45.8M/87.9M [00:41<00:25, 1.65MB/s]
 52%|███████████████████▎                 | 45.9M/87.9M [00:42<00:26, 1.56MB/s]
 52%|███████████████████▍                 | 46.1M/87.9M [00:42<00:28, 1.47MB/s]
 53%|███████████████████▍                 | 46.2M/87.9M [00:42<00:29, 1.41MB/s]
 53%|███████████████████▌                 | 46.4M/87.9M [00:42<00:29, 1.43MB/s]
 53%|███████████████████▌                 | 46.6M/87.9M [00:42<00:30, 1.35MB/s]
 53%|███████████████████▋                 | 46.7M/87.9M [00:42<00:33, 1.21MB/s]
 53%|████████████████████▏                 | 46.8M/87.9M [00:42<00:46, 893kB/s]
 53%|████████████████████▎                 | 46.9M/87.9M [00:43<00:46, 873kB/s]
 53%|████████████████████▎                 | 47.0M/87.9M [00:43<00:48, 848kB/s]
 54%|████████████████████▎                 | 47.1M/87.9M [00:43<00:49, 817kB/s]
 54%|███████████████████▉                 | 47.4M/87.9M [00:43<00:30, 1.31MB/s]
 54%|████████████████████                 | 47.6M/87.9M [00:43<00:28, 1.39MB/s]
 54%|████████████████████                 | 47.8M/87.9M [00:43<00:30, 1.33MB/s]
 54%|████████████████████▏                | 47.9M/87.9M [00:43<00:31, 1.27MB/s]
 55%|████████████████████▏                | 48.0M/87.9M [00:43<00:32, 1.24MB/s]
 55%|████████████████████▎                | 48.2M/87.9M [00:44<00:33, 1.17MB/s]
 55%|████████████████████▎                | 48.3M/87.9M [00:44<00:35, 1.11MB/s]
 55%|████████████████████▍                | 48.4M/87.9M [00:44<00:34, 1.15MB/s]
 55%|████████████████████▍                | 48.6M/87.9M [00:44<00:36, 1.08MB/s]
 55%|████████████████████▌                | 48.8M/87.9M [00:44<00:29, 1.30MB/s]
 56%|████████████████████▌                | 48.9M/87.9M [00:44<00:31, 1.23MB/s]
 56%|████████████████████▋                | 49.0M/87.9M [00:44<00:33, 1.16MB/s]
 56%|████████████████████▋                | 49.2M/87.9M [00:44<00:35, 1.10MB/s]
 56%|████████████████████▋                | 49.3M/87.9M [00:45<00:37, 1.04MB/s]
 56%|█████████████████████▎                | 49.4M/87.9M [00:45<00:39, 980kB/s]
 56%|█████████████████████▍                | 49.5M/87.9M [00:45<00:41, 924kB/s]
 56%|█████████████████████▍                | 49.6M/87.9M [00:45<00:43, 873kB/s]
 56%|█████████████████████▍                | 49.7M/87.9M [00:45<00:46, 824kB/s]
 57%|█████████████████████▌                | 49.8M/87.9M [00:45<00:45, 837kB/s]
 57%|█████████████████████                | 50.0M/87.9M [00:45<00:31, 1.22MB/s]
 57%|█████████████████████                | 50.1M/87.9M [00:45<00:32, 1.15MB/s]
 57%|█████████████████████▏               | 50.3M/87.9M [00:45<00:32, 1.15MB/s]
 57%|█████████████████████▏               | 50.4M/87.9M [00:46<00:34, 1.08MB/s]
 57%|█████████████████████▎               | 50.5M/87.9M [00:46<00:36, 1.02MB/s]
 58%|█████████████████████▉                | 50.6M/87.9M [00:46<00:38, 966kB/s]
 58%|█████████████████████▉                | 50.7M/87.9M [00:46<00:37, 999kB/s]
 58%|█████████████████████▍               | 51.0M/87.9M [00:46<00:28, 1.30MB/s]
 58%|█████████████████████▌               | 51.2M/87.9M [00:46<00:26, 1.39MB/s]
 58%|█████████████████████▌               | 51.3M/87.9M [00:46<00:27, 1.33MB/s]
 59%|█████████████████████▋               | 51.5M/87.9M [00:46<00:28, 1.26MB/s]
 59%|█████████████████████▋               | 51.6M/87.9M [00:47<00:30, 1.19MB/s]
 59%|█████████████████████▊               | 51.7M/87.9M [00:47<00:32, 1.12MB/s]
 59%|█████████████████████▊               | 51.8M/87.9M [00:47<00:34, 1.06MB/s]
 59%|██████████████████████▍               | 51.9M/87.9M [00:47<00:36, 998kB/s]
 59%|██████████████████████▍               | 52.0M/87.9M [00:47<00:38, 943kB/s]
 59%|█████████████████████▉               | 52.2M/87.9M [00:47<00:34, 1.05MB/s]
 59%|██████████████████████▌               | 52.3M/87.9M [00:47<00:35, 992kB/s]
 60%|██████████████████████▋               | 52.4M/87.9M [00:47<00:37, 936kB/s]
 60%|██████████████████████▋               | 52.5M/87.9M [00:48<00:40, 885kB/s]
 60%|██████████████████████▋               | 52.6M/87.9M [00:48<00:41, 849kB/s]
 60%|██████████████████████▊               | 52.7M/87.9M [00:48<00:42, 834kB/s]
 60%|██████████████████████▊               | 52.8M/87.9M [00:48<00:42, 823kB/s]
 60%|██████████████████████▊               | 52.9M/87.9M [00:48<00:39, 896kB/s]
 60%|██████████████████████▉               | 53.0M/87.9M [00:48<00:40, 867kB/s]
 61%|██████████████████████▍              | 53.3M/87.9M [00:48<00:28, 1.21MB/s]
 61%|██████████████████████▌              | 53.5M/87.9M [00:48<00:24, 1.40MB/s]
 61%|██████████████████████▌              | 53.6M/87.9M [00:49<00:25, 1.32MB/s]
 61%|███████████████████████▏              | 53.8M/87.9M [00:49<00:35, 965kB/s]
 61%|███████████████████████▎              | 53.9M/87.9M [00:49<00:44, 759kB/s]
 61%|███████████████████████▎              | 54.0M/87.9M [00:49<00:45, 752kB/s]
 61%|███████████████████████▎              | 54.0M/87.9M [00:49<00:45, 745kB/s]
 62%|███████████████████████▍              | 54.1M/87.9M [00:49<00:46, 725kB/s]
 62%|███████████████████████▍              | 54.2M/87.9M [00:50<00:47, 713kB/s]
 62%|██████████████████████▉              | 54.5M/87.9M [00:50<00:30, 1.11MB/s]
 62%|███████████████████████              | 54.7M/87.9M [00:50<00:25, 1.33MB/s]
 62%|███████████████████████              | 54.8M/87.9M [00:50<00:26, 1.26MB/s]
 63%|███████████████████████▏             | 55.0M/87.9M [00:50<00:27, 1.20MB/s]
 63%|███████████████████████▏             | 55.1M/87.9M [00:50<00:28, 1.14MB/s]
 63%|███████████████████████▊              | 55.2M/87.9M [00:50<00:39, 837kB/s]
 63%|███████████████████████▉              | 55.3M/87.9M [00:51<00:37, 870kB/s]
 63%|███████████████████████▉              | 55.5M/87.9M [00:51<00:32, 988kB/s]
 63%|████████████████████████              | 55.6M/87.9M [00:51<00:33, 953kB/s]
 63%|████████████████████████              | 55.7M/87.9M [00:51<00:35, 915kB/s]
 63%|████████████████████████              | 55.8M/87.9M [00:51<00:36, 875kB/s]
 64%|████████████████████████▏             | 55.9M/87.9M [00:51<00:38, 835kB/s]
 64%|████████████████████████▏             | 56.0M/87.9M [00:51<00:40, 792kB/s]
 64%|████████████████████████▏             | 56.1M/87.9M [00:51<00:41, 760kB/s]
 64%|████████████████████████▎             | 56.2M/87.9M [00:52<00:33, 934kB/s]
 64%|███████████████████████▊             | 56.5M/87.9M [00:52<00:24, 1.30MB/s]
 64%|███████████████████████▊             | 56.6M/87.9M [00:52<00:25, 1.23MB/s]
 65%|███████████████████████▉             | 56.8M/87.9M [00:52<00:26, 1.16MB/s]
 65%|███████████████████████▉             | 56.9M/87.9M [00:52<00:28, 1.10MB/s]
 65%|███████████████████████▉             | 57.0M/87.9M [00:52<00:29, 1.04MB/s]
 65%|████████████████████████▋             | 57.1M/87.9M [00:52<00:31, 981kB/s]
 65%|████████████████████████▋             | 57.2M/87.9M [00:52<00:33, 926kB/s]
 65%|████████████████████████▊             | 57.3M/87.9M [00:53<00:34, 877kB/s]
 65%|████████████████████████▊             | 57.4M/87.9M [00:53<00:35, 856kB/s]
 65%|████████████████████████▊             | 57.5M/87.9M [00:53<00:36, 838kB/s]
 65%|████████████████████████▉             | 57.6M/87.9M [00:53<00:37, 817kB/s]
 66%|████████████████████████▉             | 57.7M/87.9M [00:53<00:37, 810kB/s]
 66%|████████████████████████▉             | 57.8M/87.9M [00:53<00:37, 806kB/s]
 66%|█████████████████████████             | 57.9M/87.9M [00:53<00:35, 843kB/s]
 66%|█████████████████████████             | 58.0M/87.9M [00:53<00:36, 829kB/s]
 66%|█████████████████████████             | 58.1M/87.9M [00:54<00:33, 898kB/s]
 66%|█████████████████████████▏            | 58.2M/87.9M [00:54<00:34, 873kB/s]
 66%|████████████████████████▌            | 58.4M/87.9M [00:54<00:26, 1.13MB/s]
 67%|████████████████████████▋            | 58.6M/87.9M [00:54<00:23, 1.23MB/s]
 67%|████████████████████████▊            | 58.8M/87.9M [00:54<00:20, 1.42MB/s]
 67%|████████████████████████▊            | 59.0M/87.9M [00:54<00:21, 1.34MB/s]
 67%|████████████████████████▉            | 59.1M/87.9M [00:54<00:22, 1.26MB/s]
 67%|████████████████████████▉            | 59.3M/87.9M [00:54<00:22, 1.30MB/s]
 68%|█████████████████████████            | 59.4M/87.9M [00:55<00:23, 1.23MB/s]
 68%|█████████████████████████            | 59.5M/87.9M [00:55<00:24, 1.16MB/s]
 68%|█████████████████████████            | 59.7M/87.9M [00:55<00:25, 1.10MB/s]
 68%|█████████████████████████▏           | 59.8M/87.9M [00:55<00:27, 1.04MB/s]
 68%|█████████████████████████▉            | 59.9M/87.9M [00:55<00:28, 981kB/s]
 68%|█████████████████████████▉            | 60.0M/87.9M [00:55<00:30, 925kB/s]
 68%|█████████████████████████▉            | 60.1M/87.9M [00:55<00:31, 875kB/s]
 68%|██████████████████████████            | 60.1M/87.9M [00:55<00:33, 828kB/s]
 69%|██████████████████████████            | 60.2M/87.9M [00:55<00:35, 782kB/s]
 69%|█████████████████████████▍           | 60.4M/87.9M [00:56<00:27, 1.01MB/s]
 69%|██████████████████████████▏           | 60.5M/87.9M [00:56<00:28, 952kB/s]
 69%|██████████████████████████▏           | 60.6M/87.9M [00:56<00:30, 899kB/s]
 69%|██████████████████████████▏           | 60.7M/87.9M [00:56<00:32, 849kB/s]
 69%|██████████████████████████▎           | 60.8M/87.9M [00:56<00:33, 803kB/s]
 69%|██████████████████████████▎           | 60.9M/87.9M [00:56<00:31, 864kB/s]
 70%|█████████████████████████▊           | 61.2M/87.9M [00:56<00:21, 1.25MB/s]
 70%|█████████████████████████▊           | 61.4M/87.9M [00:56<00:18, 1.43MB/s]
 70%|█████████████████████████▉           | 61.6M/87.9M [00:57<00:17, 1.49MB/s]
 70%|█████████████████████████▉           | 61.8M/87.9M [00:57<00:18, 1.40MB/s]
 70%|██████████████████████████           | 61.9M/87.9M [00:57<00:19, 1.32MB/s]
 71%|██████████████████████████           | 62.0M/87.9M [00:57<00:20, 1.25MB/s]
 71%|██████████████████████████▏          | 62.2M/87.9M [00:57<00:21, 1.18MB/s]
 71%|██████████████████████████▏          | 62.3M/87.9M [00:57<00:22, 1.12MB/s]
 71%|██████████████████████████▎          | 62.6M/87.9M [00:57<00:16, 1.49MB/s]
 71%|██████████████████████████▍          | 62.7M/87.9M [00:57<00:17, 1.41MB/s]
 72%|██████████████████████████▍          | 62.9M/87.9M [00:58<00:18, 1.33MB/s]
 72%|██████████████████████████▌          | 63.0M/87.9M [00:58<00:19, 1.26MB/s]
 72%|██████████████████████████▌          | 63.1M/87.9M [00:58<00:20, 1.19MB/s]
 72%|██████████████████████████▌          | 63.2M/87.9M [00:58<00:21, 1.12MB/s]
 72%|██████████████████████████▋          | 63.4M/87.9M [00:58<00:23, 1.06MB/s]
 72%|███████████████████████████▍          | 63.5M/87.9M [00:58<00:31, 772kB/s]
 72%|███████████████████████████▍          | 63.6M/87.9M [00:58<00:31, 776kB/s]
 72%|███████████████████████████▌          | 63.7M/87.9M [00:59<00:31, 782kB/s]
 73%|███████████████████████████▌          | 63.8M/87.9M [00:59<00:30, 791kB/s]
 73%|███████████████████████████▋          | 63.9M/87.9M [00:59<00:25, 944kB/s]
 73%|███████████████████████████▋          | 64.0M/87.9M [00:59<00:26, 904kB/s]
 73%|███████████████████████████          | 64.3M/87.9M [00:59<00:19, 1.18MB/s]
 73%|███████████████████████████▏         | 64.5M/87.9M [00:59<00:17, 1.34MB/s]
 73%|███████████████████████████▏         | 64.6M/87.9M [00:59<00:18, 1.27MB/s]
 74%|███████████████████████████▏         | 64.7M/87.9M [00:59<00:19, 1.21MB/s]
 74%|███████████████████████████▎         | 64.9M/87.9M [01:00<00:20, 1.14MB/s]
 74%|███████████████████████████▎         | 65.0M/87.9M [01:00<00:21, 1.08MB/s]
 74%|███████████████████████████▍         | 65.1M/87.9M [01:00<00:22, 1.02MB/s]
 74%|████████████████████████████▏         | 65.2M/87.9M [01:00<00:23, 963kB/s]
 74%|████████████████████████████▏         | 65.3M/87.9M [01:00<00:23, 952kB/s]
 74%|███████████████████████████▌         | 65.5M/87.9M [01:00<00:19, 1.14MB/s]
 75%|███████████████████████████▌         | 65.6M/87.9M [01:00<00:21, 1.04MB/s]
 75%|████████████████████████████▍         | 65.7M/87.9M [01:00<00:22, 986kB/s]
 75%|████████████████████████████▍         | 65.8M/87.9M [01:01<00:23, 932kB/s]
 75%|████████████████████████████▍         | 65.9M/87.9M [01:01<00:24, 883kB/s]
 75%|████████████████████████████▌         | 66.0M/87.9M [01:01<00:33, 646kB/s]
 75%|████████████████████████████▌         | 66.1M/87.9M [01:01<00:34, 635kB/s]
 75%|████████████████████████████▌         | 66.2M/87.9M [01:01<00:30, 705kB/s]
 75%|████████████████████████████▋         | 66.3M/87.9M [01:01<00:24, 874kB/s]
 76%|███████████████████████████▉         | 66.5M/87.9M [01:01<00:21, 1.00MB/s]
 76%|████████████████████████████▊         | 66.6M/87.9M [01:02<00:22, 960kB/s]
 76%|████████████████████████████         | 66.8M/87.9M [01:02<00:20, 1.05MB/s]
 76%|████████████████████████████▉         | 66.9M/87.9M [01:02<00:21, 998kB/s]
 76%|████████████████████████████▉         | 67.0M/87.9M [01:02<00:22, 946kB/s]
 76%|████████████████████████████▉         | 67.1M/87.9M [01:02<00:23, 897kB/s]
 76%|█████████████████████████████         | 67.2M/87.9M [01:02<00:22, 913kB/s]
 77%|█████████████████████████████         | 67.3M/87.9M [01:02<00:23, 875kB/s]
 77%|█████████████████████████████▏        | 67.4M/87.9M [01:02<00:24, 852kB/s]
 77%|█████████████████████████████▏        | 67.5M/87.9M [01:03<00:24, 837kB/s]
 77%|████████████████████████████▌        | 67.7M/87.9M [01:03<00:17, 1.19MB/s]
 77%|████████████████████████████▌        | 67.9M/87.9M [01:03<00:17, 1.12MB/s]
 77%|████████████████████████████▌        | 68.0M/87.9M [01:03<00:18, 1.06MB/s]
 78%|████████████████████████████▋        | 68.1M/87.9M [01:03<00:17, 1.14MB/s]
 78%|████████████████████████████▊        | 68.4M/87.9M [01:03<00:13, 1.43MB/s]
 78%|████████████████████████████▊        | 68.5M/87.9M [01:03<00:14, 1.35MB/s]
 78%|████████████████████████████▉        | 68.7M/87.9M [01:03<00:15, 1.28MB/s]
 78%|████████████████████████████▉        | 68.8M/87.9M [01:04<00:15, 1.21MB/s]
 78%|█████████████████████████████        | 69.0M/87.9M [01:04<00:14, 1.33MB/s]
 79%|█████████████████████████████        | 69.1M/87.9M [01:04<00:14, 1.26MB/s]
 79%|█████████████████████████████▏       | 69.3M/87.9M [01:04<00:14, 1.28MB/s]
 79%|█████████████████████████████▎       | 69.5M/87.9M [01:04<00:13, 1.41MB/s]
 79%|█████████████████████████████▎       | 69.7M/87.9M [01:04<00:13, 1.34MB/s]
 79%|█████████████████████████████▎       | 69.8M/87.9M [01:04<00:14, 1.26MB/s]
 80%|█████████████████████████████▍       | 69.9M/87.9M [01:04<00:14, 1.25MB/s]
 80%|█████████████████████████████▍       | 70.1M/87.9M [01:05<00:15, 1.18MB/s]
 80%|█████████████████████████████▌       | 70.2M/87.9M [01:05<00:15, 1.12MB/s]
 80%|█████████████████████████████▌       | 70.3M/87.9M [01:05<00:16, 1.07MB/s]
 80%|█████████████████████████████▋       | 70.5M/87.9M [01:05<00:13, 1.30MB/s]
 80%|█████████████████████████████▋       | 70.7M/87.9M [01:05<00:14, 1.23MB/s]
 81%|█████████████████████████████▊       | 70.8M/87.9M [01:05<00:14, 1.18MB/s]
 81%|█████████████████████████████▊       | 70.9M/87.9M [01:05<00:15, 1.11MB/s]
 81%|█████████████████████████████▉       | 71.0M/87.9M [01:05<00:16, 1.05MB/s]
 81%|█████████████████████████████▉       | 71.2M/87.9M [01:05<00:15, 1.05MB/s]
 81%|██████████████████████████████       | 71.4M/87.9M [01:06<00:13, 1.25MB/s]
 81%|██████████████████████████████       | 71.5M/87.9M [01:06<00:13, 1.20MB/s]
 81%|██████████████████████████████▏      | 71.6M/87.9M [01:06<00:14, 1.13MB/s]
 82%|██████████████████████████████▏      | 71.8M/87.9M [01:06<00:14, 1.14MB/s]
 82%|██████████████████████████████▎      | 71.9M/87.9M [01:06<00:14, 1.08MB/s]
 82%|██████████████████████████████▎      | 72.0M/87.9M [01:06<00:15, 1.02MB/s]
 82%|███████████████████████████████▏      | 72.1M/87.9M [01:06<00:16, 963kB/s]
 82%|███████████████████████████████▏      | 72.2M/87.9M [01:06<00:17, 911kB/s]
 82%|███████████████████████████████▏      | 72.3M/87.9M [01:07<00:18, 860kB/s]
 82%|███████████████████████████████▎      | 72.4M/87.9M [01:07<00:19, 815kB/s]
 83%|██████████████████████████████▌      | 72.6M/87.9M [01:07<00:13, 1.12MB/s]
 83%|██████████████████████████████▌      | 72.8M/87.9M [01:07<00:12, 1.19MB/s]
 83%|██████████████████████████████▋      | 73.0M/87.9M [01:07<00:10, 1.44MB/s]
 83%|██████████████████████████████▊      | 73.1M/87.9M [01:07<00:14, 1.05MB/s]
 83%|██████████████████████████████▊      | 73.3M/87.9M [01:07<00:14, 1.02MB/s]
 83%|███████████████████████████████▋      | 73.4M/87.9M [01:08<00:14, 996kB/s]
 84%|███████████████████████████████▊      | 73.5M/87.9M [01:08<00:15, 960kB/s]
 84%|███████████████████████████████▊      | 73.6M/87.9M [01:08<00:15, 921kB/s]
 84%|███████████████████████████████▊      | 73.7M/87.9M [01:08<00:16, 879kB/s]
 84%|███████████████████████████████▉      | 73.8M/87.9M [01:08<00:16, 837kB/s]
 84%|███████████████████████████████▉      | 73.9M/87.9M [01:08<00:15, 929kB/s]
 84%|███████████████████████████████▉      | 74.0M/87.9M [01:08<00:15, 890kB/s]
 84%|████████████████████████████████      | 74.2M/87.9M [01:08<00:13, 984kB/s]
 85%|███████████████████████████████▎     | 74.4M/87.9M [01:09<00:11, 1.17MB/s]
 85%|███████████████████████████████▎     | 74.5M/87.9M [01:09<00:12, 1.10MB/s]
 85%|███████████████████████████████▍     | 74.6M/87.9M [01:09<00:11, 1.17MB/s]
 85%|███████████████████████████████▍     | 74.8M/87.9M [01:09<00:10, 1.29MB/s]
 85%|███████████████████████████████▌     | 75.0M/87.9M [01:09<00:10, 1.27MB/s]
 85%|███████████████████████████████▌     | 75.1M/87.9M [01:09<00:10, 1.20MB/s]
 86%|███████████████████████████████▋     | 75.2M/87.9M [01:09<00:10, 1.17MB/s]
 86%|███████████████████████████████▊     | 75.5M/87.9M [01:09<00:09, 1.38MB/s]
 86%|███████████████████████████████▊     | 75.6M/87.9M [01:10<00:09, 1.30MB/s]
 86%|███████████████████████████████▉     | 75.8M/87.9M [01:10<00:09, 1.25MB/s]
 86%|███████████████████████████████▉     | 75.9M/87.9M [01:10<00:10, 1.18MB/s]
 87%|████████████████████████████████     | 76.2M/87.9M [01:10<00:06, 1.72MB/s]
 87%|████████████████████████████████▏    | 76.4M/87.9M [01:10<00:07, 1.62MB/s]
 87%|████████████████████████████████▏    | 76.6M/87.9M [01:10<00:09, 1.18MB/s]
 87%|████████████████████████████████▎    | 76.7M/87.9M [01:10<00:09, 1.16MB/s]
 87%|████████████████████████████████▎    | 76.8M/87.9M [01:11<00:09, 1.12MB/s]
 88%|████████████████████████████████▍    | 77.0M/87.9M [01:11<00:10, 1.08MB/s]
 88%|████████████████████████████████▍    | 77.1M/87.9M [01:11<00:10, 1.07MB/s]
 88%|████████████████████████████████▌    | 77.3M/87.9M [01:11<00:07, 1.33MB/s]
 88%|████████████████████████████████▌    | 77.5M/87.9M [01:11<00:07, 1.33MB/s]
 88%|████████████████████████████████▋    | 77.7M/87.9M [01:11<00:07, 1.37MB/s]
 89%|████████████████████████████████▊    | 77.9M/87.9M [01:11<00:06, 1.60MB/s]
 89%|████████████████████████████████▊    | 78.1M/87.9M [01:11<00:06, 1.51MB/s]
 89%|████████████████████████████████▉    | 78.3M/87.9M [01:12<00:08, 1.11MB/s]
 89%|████████████████████████████████▉    | 78.4M/87.9M [01:12<00:08, 1.09MB/s]
 89%|█████████████████████████████████    | 78.5M/87.9M [01:12<00:08, 1.06MB/s]
 89%|█████████████████████████████████    | 78.6M/87.9M [01:12<00:09, 1.02MB/s]
 90%|██████████████████████████████████    | 78.7M/87.9M [01:12<00:09, 976kB/s]
 90%|██████████████████████████████████    | 78.8M/87.9M [01:12<00:12, 725kB/s]
 90%|██████████████████████████████████▏   | 79.0M/87.9M [01:13<00:10, 822kB/s]
 90%|██████████████████████████████████▏   | 79.1M/87.9M [01:13<00:10, 820kB/s]
 90%|██████████████████████████████████▏   | 79.2M/87.9M [01:13<00:10, 810kB/s]
 90%|██████████████████████████████████▎   | 79.3M/87.9M [01:13<00:10, 807kB/s]
 90%|██████████████████████████████████▎   | 79.3M/87.9M [01:13<00:11, 771kB/s]
 90%|██████████████████████████████████▎   | 79.4M/87.9M [01:13<00:11, 736kB/s]
 90%|██████████████████████████████████▍   | 79.5M/87.9M [01:13<00:11, 754kB/s]
 91%|██████████████████████████████████▍   | 79.6M/87.9M [01:13<00:10, 765kB/s]
 91%|██████████████████████████████████▍   | 79.8M/87.9M [01:13<00:09, 893kB/s]
 91%|██████████████████████████████████▌   | 79.9M/87.9M [01:14<00:08, 982kB/s]
 91%|██████████████████████████████████▌   | 80.0M/87.9M [01:14<00:08, 930kB/s]
 91%|█████████████████████████████████▊   | 80.3M/87.9M [01:14<00:06, 1.25MB/s]
 92%|█████████████████████████████████▉   | 80.5M/87.9M [01:14<00:04, 1.56MB/s]
 92%|█████████████████████████████████▉   | 80.7M/87.9M [01:14<00:04, 1.47MB/s]
 92%|██████████████████████████████████   | 80.8M/87.9M [01:14<00:05, 1.39MB/s]
 92%|██████████████████████████████████   | 81.0M/87.9M [01:14<00:05, 1.32MB/s]
 92%|██████████████████████████████████▏  | 81.1M/87.9M [01:14<00:05, 1.24MB/s]
 92%|██████████████████████████████████▏  | 81.2M/87.9M [01:15<00:05, 1.17MB/s]
 93%|██████████████████████████████████▏  | 81.4M/87.9M [01:15<00:05, 1.11MB/s]
 93%|██████████████████████████████████▎  | 81.5M/87.9M [01:15<00:06, 1.05MB/s]
 93%|███████████████████████████████████▎  | 81.6M/87.9M [01:15<00:06, 990kB/s]
 93%|███████████████████████████████████▎  | 81.7M/87.9M [01:15<00:06, 936kB/s]
 93%|███████████████████████████████████▎  | 81.8M/87.9M [01:15<00:06, 885kB/s]
 93%|███████████████████████████████████▍  | 81.9M/87.9M [01:15<00:07, 837kB/s]
 93%|███████████████████████████████████▍  | 82.0M/87.9M [01:15<00:06, 904kB/s]
 93%|███████████████████████████████████▍  | 82.1M/87.9M [01:16<00:06, 872kB/s]
 93%|███████████████████████████████████▌  | 82.2M/87.9M [01:16<00:06, 855kB/s]
 94%|██████████████████████████████████▋  | 82.4M/87.9M [01:16<00:05, 1.08MB/s]
 94%|██████████████████████████████████▋  | 82.5M/87.9M [01:16<00:05, 1.02MB/s]
 94%|██████████████████████████████████▊  | 82.6M/87.9M [01:16<00:05, 1.05MB/s]
 94%|███████████████████████████████████▊  | 82.7M/87.9M [01:16<00:05, 988kB/s]
 94%|███████████████████████████████████▊  | 82.8M/87.9M [01:16<00:05, 933kB/s]
 94%|███████████████████████████████████▊  | 82.9M/87.9M [01:16<00:05, 882kB/s]
 95%|███████████████████████████████████▉  | 83.1M/87.9M [01:17<00:04, 972kB/s]
 95%|███████████████████████████████████▉  | 83.2M/87.9M [01:17<00:05, 925kB/s]
 95%|███████████████████████████████████  | 83.3M/87.9M [01:17<00:04, 1.01MB/s]
 95%|███████████████████████████████████▏ | 83.5M/87.9M [01:17<00:04, 1.03MB/s]
 95%|████████████████████████████████████▏ | 83.6M/87.9M [01:17<00:04, 998kB/s]
 95%|███████████████████████████████████▎ | 83.8M/87.9M [01:17<00:03, 1.26MB/s]
 96%|███████████████████████████████████▎ | 84.0M/87.9M [01:17<00:02, 1.45MB/s]
 96%|███████████████████████████████████▍ | 84.2M/87.9M [01:17<00:02, 1.38MB/s]
 96%|███████████████████████████████████▍ | 84.3M/87.9M [01:18<00:02, 1.30MB/s]
 96%|███████████████████████████████████▌ | 84.5M/87.9M [01:18<00:02, 1.22MB/s]
 96%|███████████████████████████████████▌ | 84.6M/87.9M [01:18<00:02, 1.17MB/s]
 96%|███████████████████████████████████▋ | 84.8M/87.9M [01:18<00:02, 1.42MB/s]
 97%|███████████████████████████████████▊ | 85.0M/87.9M [01:18<00:02, 1.34MB/s]
 97%|███████████████████████████████████▊ | 85.1M/87.9M [01:18<00:02, 1.26MB/s]
 97%|███████████████████████████████████▊ | 85.2M/87.9M [01:18<00:02, 1.19MB/s]
 97%|███████████████████████████████████▉ | 85.4M/87.9M [01:18<00:02, 1.13MB/s]
 97%|███████████████████████████████████▉ | 85.5M/87.9M [01:19<00:02, 1.17MB/s]
 97%|████████████████████████████████████ | 85.6M/87.9M [01:19<00:02, 1.09MB/s]
 98%|████████████████████████████████████ | 85.7M/87.9M [01:19<00:02, 1.03MB/s]
 98%|████████████████████████████████████▏| 85.9M/87.9M [01:19<00:01, 1.06MB/s]
 98%|█████████████████████████████████████▏| 86.0M/87.9M [01:19<00:01, 998kB/s]
 98%|████████████████████████████████████▎| 86.3M/87.9M [01:19<00:01, 1.41MB/s]
 98%|████████████████████████████████████▍| 86.4M/87.9M [01:19<00:01, 1.38MB/s]
 99%|████████████████████████████████████▍| 86.7M/87.9M [01:19<00:00, 1.53MB/s]
 99%|████████████████████████████████████▌| 86.8M/87.9M [01:20<00:00, 1.44MB/s]
 99%|████████████████████████████████████▌| 87.0M/87.9M [01:20<00:00, 1.41MB/s]
 99%|████████████████████████████████████▋| 87.1M/87.9M [01:20<00:00, 1.33MB/s]
 99%|████████████████████████████████████▋| 87.3M/87.9M [01:20<00:00, 1.25MB/s]
 99%|████████████████████████████████████▊| 87.4M/87.9M [01:20<00:00, 1.19MB/s]
100%|████████████████████████████████████▊| 87.6M/87.9M [01:20<00:00, 1.37MB/s]
87.9MB [01:20, 1.80MB/s]
88.1MB [01:20, 1.69MB/s]
88.3MB [01:21, 1.60MB/s]
88.5MB [01:21, 1.51MB/s]
88.6MB [01:21, 1.10MB/s]
  0%|                                              | 0.00/87.9M [00:00<?, ?B/s]
100%|█████████████████████████████████████| 87.9M/87.9M [00:00<00:00, 1.02TB/s]

Preprocessing#

We reproduce the exact minimal preprocessing recipe of the DANCE paper [1]: band-pass filter between 0.1 and 100 Hz, resample to a common 128 Hz, then a per-channel, per-session robust scaling (subtract the median, divide by the interquartile range) clamped to [-16, 16]. We reach for sklearn.preprocessing.robust_scale() rather than hand-rolling the median/IQR arithmetic. axis=1 scales each channel (row) using its own median and interquartile range computed across time (columns), which is exactly the per-channel recipe above.

import numpy as np
from sklearn.preprocessing import robust_scale

from braindecode.preprocessing import Preprocessor, preprocess


def robust_scale_clamp(data):
    """Per-channel median/IQR scaling, clamped to [-16, 16] (DANCE recipe)."""
    return np.clip(robust_scale(data, axis=1), -16, 16)


SFREQ = 128.0
preprocessors = [
    Preprocessor("pick_types", eeg=True, stim=False),
    Preprocessor("filter", l_freq=0.1, h_freq=100.0),
    Preprocessor("resample", sfreq=SFREQ),
    Preprocessor(robust_scale_clamp, apply_on_array=True),
]
preprocess(dataset, preprocessors)
/home/runner/work/braindecode/braindecode/braindecode/preprocessing/preprocess.py:81: UserWarning: apply_on_array can only be True if fn is a callable function. Automatically correcting to apply_on_array=False.
  warn(
BaseConcatDataset
TypeBaseConcatDataset of RawDataset
Recordings3
Total samples299070
Sfreq*128.0 Hz
Channels*16 (16 EEG)
Ch. names*Fp1, Fp2, F3, AFz, F4, T7, Cz, T8, P7, P3, ... (+6 more)
Montage*head
Duration*816.3 s
* from first recording
Description3 recordings × 3 columns [subject, session, run]


Cut fixed-length windows and read the flash events#

DANCE consumes long, fixed-length windows rather than per-trial epochs, so we use create_fixed_length_windows() instead of create_windows_from_events(). We use W = 32 s and up to 150 events per window, matching the paper’s BI2014a configuration (mean 45.8 events/window in the full dataset).

from braindecode.preprocessing import create_fixed_length_windows

WINDOW_S, N_CLASSES, NUM_LATENTS, MAX_EVENTS = 32.0, 3, 256, 150
WINDOW_SAMPLES = int(WINDOW_S * SFREQ)

windows_ds = create_fixed_length_windows(
    dataset,
    window_size_samples=WINDOW_SAMPLES,
    window_stride_samples=WINDOW_SAMPLES,
    on_last_window="drop",
    preload=True,
    use_mne_epochs=False,  # guarantees EEGWindowsDataset -> (X, y, crop_inds)
)


def bi_annotations_to_events(raw):
    """Read ``(start_s, end_s, class_int)`` flash events from a BI* raw.

    Class ``1`` = non-target flash, class ``2`` = target flash (class ``0``
    is reserved for background/no-event, per the CLASS-0 CONTRACT).
    """
    label_to_class = {"NonTarget": 1, "Target": 2}
    events = []
    for ann in raw.annotations:
        cls = label_to_class.get(str(ann["description"]))
        if cls is None:
            continue
        events.append((float(ann["onset"]), float(ann["onset"] + ann["duration"]), cls))
    return events

Map each window’s annotations to DANCE targets#

This is the code that builds the \(y\) from the right-hand panel of the figure above. For one window \(X\), the paper [1] defines the target as a set of events

\[y = \{e_i\}_{i=1}^N, \qquad e_i = (b_i, c_i),\]

where \(b_i = (t_{\mathrm{start}}, t_{\mathrm{end}}) \in [0, 1]^2\) are the event’s boundaries normalized to the window duration (exactly the colored spans in the figure), and \(c_i \in \{0, \dots, K\}\) is its class. \(c_i = 0\) is the shared background/no-object class (the unlabeled gray span in the figure); real classes are \(1, \dots, K\) (here \(K = 2\): non-target and target flashes).

Two consequences follow, and both matter for dance_target_builder below. Padding is indistinguishable from background: DanceLoss’s matcher expects a fixed-size set of max_events slots per window, so any slot with no real event defaults to \(c_i = 0\), the same value that also denotes “no object”. There is only one id for both, by design, and it never collides because a real annotation is never given class 0. The dense head also needs a per-token version of the same set: DANCE trains a per-timestep classifier over num_latents latent tokens, so we rasterize each event’s \([t_{\mathrm{start}}, t_{\mathrm{end}})\) span onto that token grid, and every idle token defaults to the same background class 0.

This matches braindecode’s own upstream reference: the dance/example/data.py MOABB bridge in facebookresearch/dance uses class 0 for padding/background, 1 for non-target, and 2 for target on this exact dataset, with events zero-padded to max_events = 150.

import torch


def dance_target_builder(
    annotations, window_onset, window_duration, max_events, num_latents
):
    """Build one window's DANCE target: the event set y and its dense grid."""
    start = torch.zeros(max_events)
    end = torch.zeros(max_events)
    cls = torch.zeros(max_events, dtype=torch.long)  # cls[i] = 0 -> background/padding
    w0, wd = window_onset, window_duration
    kept = 0
    for s, e, c in annotations:
        # clip the annotation to the window and normalize to [0, 1]
        s_c, e_c = max(s, w0), min(e, w0 + wd)
        if e_c <= s_c or int(c) == 0 or kept >= max_events:
            continue  # outside the window, background, or out of query slots
        start[kept] = (s_c - w0) / wd
        end[kept] = (e_c - w0) / wd
        cls[kept] = int(c)
        kept += 1

    # rasterize the kept events onto the num_latents-token grid: dense[t] is
    # the class of whichever event (if any) covers token t
    dense = torch.zeros(num_latents, dtype=torch.long)
    s_tok = (start * num_latents).clamp(0, num_latents).long()
    e_tok = (end * num_latents).clamp(0, num_latents).long()
    for i in range(kept):
        a, b = int(s_tok[i]), int(e_tok[i])
        if a < b:
            dense[a:b] = int(cls[i])
    return {"start": start, "end": end, "class": cls, "dense": dense}


def dance_collate(batch):
    """Stack ``[(eeg, target_dict), ...]`` into the batched dict schema
    :class:`~braindecode.training.DanceLoss` expects.
    """
    eeg = torch.stack([b[0] for b in batch])
    out = {"eeg": eeg}
    for key in ("start", "end", "class", "dense"):
        out[key] = torch.stack([b[1][key] for b in batch])
    return out


raw_events = {
    ds.description["subject"]: bi_annotations_to_events(ds.raw)
    for ds in windows_ds.datasets
}
metadata = windows_ds.get_metadata()

samples, sample_subjects = [], []
for i in range(len(windows_ds)):
    x, _, crop_inds = windows_ds[i]
    eeg = torch.as_tensor(np.asarray(x), dtype=torch.float32)
    subject = int(metadata.iloc[i]["subject"])
    window_onset = float(crop_inds[1]) / SFREQ  # i_start_in_trial / sfreq
    target = dance_target_builder(
        raw_events[subject],
        window_onset=window_onset,
        window_duration=WINDOW_S,
        max_events=MAX_EVENTS,
        num_latents=NUM_LATENTS,
    )
    samples.append((eeg, target))
    sample_subjects.append(subject)

Splitting into train and test sets (cross-subject)#

We hold out the last subject entirely for evaluation, mirroring the paper’s cross-subject splitting protocol (train and test subjects never overlap).

from torch.utils.data import DataLoader

sample_subjects = np.asarray(sample_subjects)
test_subject = subject_ids[-1]
train_idx = np.flatnonzero(sample_subjects != test_subject)
test_idx = np.flatnonzero(sample_subjects == test_subject)
train_samples = [samples[i] for i in train_idx]
test_samples = [samples[i] for i in test_idx]
print(f"{len(train_samples)} train windows, {len(test_samples)} test windows")

train_loader = DataLoader(
    train_samples,
    batch_size=len(train_samples),
    shuffle=True,
    collate_fn=dance_collate,
)
test_loader = DataLoader(
    test_samples,
    batch_size=len(test_samples),
    collate_fn=dance_collate,
)
37 train windows, 35 test windows

Create the model and the criterion#

from braindecode.models import DANCE
from braindecode.training import DanceLoss, f1_event
from braindecode.util import set_random_seeds

cuda = torch.cuda.is_available()
device = "cuda" if cuda else "cpu"
set_random_seeds(seed=random_state, cuda=cuda)

chs_info = windows_ds.datasets[0].raw.info["chs"]
model = DANCE(
    n_outputs=N_CLASSES,
    n_chans=len(chs_info),
    chs_info=chs_info,
    n_times=WINDOW_SAMPLES,
    sfreq=SFREQ,
    input_window_seconds=WINDOW_S,
).to(device)
criterion = DanceLoss(num_latents=NUM_LATENTS)
optimizer = torch.optim.Adam(model.parameters(), lr=5e-4)

Train the model#

detect() returns the query set + dense map that DanceLoss needs; forward() alone would only give the dense per-token logits.

Warning

Kept at 2 epochs and 3 subjects so the docs build stays fast. This is not a converged model: the paper trains on the full dataset (71 subjects) for up to 100 epochs with early stopping. See the Conclusion.

n_epochs = 2
model.train()
for epoch in range(n_epochs):
    epoch_loss = 0.0
    for batch in train_loader:
        batch = {k: v.to(device) for k, v in batch.items()}
        optimizer.zero_grad()
        out = model.detect(batch["eeg"])
        loss, details = criterion(out, batch, duration=WINDOW_S)
        loss.backward()
        optimizer.step()
        epoch_loss += float(loss)
    print(f"Epoch {epoch + 1}/{n_epochs}: loss={epoch_loss / len(train_loader):.3f}")
/home/runner/work/braindecode/braindecode/braindecode/training/losses.py:234: UserWarning: Converting a tensor with requires_grad=True to a scalar may lead to unexpected behavior.
Consider using tensor.detach() first. (Triggered internally at /__w/pytorch/pytorch/torch/csrc/autograd/generated/python_variable_methods.cpp:820.)
  s = float(preds["start"][bi, qi])
Epoch 1/2: loss=11.305
Epoch 2/2: loss=9.444

Evaluate on the held-out subject#

f1_event() scores the decoded event set (IoU > 0.5 + class match); the per-token macro F1 scores the dense head against the dense target with sklearn.metrics.f1_score().

def detections_to_events(detections, duration):
    """Decode a DANCE ``detect()`` output into per-window event tuples.

    Each query becomes ``(start_s, end_s, class, confidence)`` in seconds
    within the window; queries whose argmax class is ``0``
    (background/no-object) are dropped, following the CLASS-0 CONTRACT.
    """
    probs = torch.softmax(detections["class"], dim=-1)  # (B, Q, K+1)
    confidence, label = probs.max(dim=-1)  # (B, Q), one softmax call for the batch
    start = detections["start"] * duration
    end = detections["end"] * duration
    events = []
    for bi in range(label.shape[0]):
        keep = label[bi] != 0
        events.append(
            list(
                zip(
                    start[bi, keep].tolist(),
                    end[bi, keep].tolist(),
                    label[bi, keep].tolist(),
                    confidence[bi, keep].tolist(),
                )
            )
        )
    return events


from sklearn.metrics import f1_score

model.eval()
ev_f1s = []
dense_preds, dense_targets = [], []
with torch.no_grad():
    for batch in test_loader:
        batch = {k: v.to(device) for k, v in batch.items()}
        out = model.detect(batch["eeg"])
        pred_events = detections_to_events(out, duration=WINDOW_S)
        for bi in range(batch["eeg"].shape[0]):
            # ground-truth events of this window, in seconds within the window
            gt = [
                (float(s) * WINDOW_S, float(e) * WINDOW_S, int(c))
                for s, e, c in zip(
                    batch["start"][bi], batch["end"][bi], batch["class"][bi]
                )
                if int(c) != 0
            ]
            preds = [(s, e, c) for (s, e, c, _conf) in pred_events[bi]]
            ev_f1s.append(f1_event(preds, gt, iou_threshold=0.5))
        # dense head (B, T, n_outputs) vs dense target (B, T), one token per prediction
        dense_preds.append(out["dense"].argmax(-1).reshape(-1).cpu())
        dense_targets.append(batch["dense"].reshape(-1).cpu())

dense_preds = torch.cat(dense_preds).numpy()
dense_targets = torch.cat(dense_targets).numpy()
sample_f1 = f1_score(
    dense_targets, dense_preds, labels=list(range(N_CLASSES)), average="macro"
)
print(
    f"Held-out subject {test_subject}: "
    f"F1-event={np.mean(ev_f1s):.3f}  F1-sample={sample_f1:.3f}"
)
Held-out subject 3: F1-event=0.014  F1-sample=0.246

Predicting with the official pretrained checkpoint#

Note

A pretrained checkpoint is available on the Hugging Face Hub. Its model card reports F1-event 0.495 on BI2014a subject 3 after training on subjects 1, 2 and 4-9. However, the training script selects the best epoch using subject 3’s F1-event. This is a validation score, not an independent test estimate or a reproduction of the paper’s result. The cell below evaluates the checkpoint on the tutorial’s subject 3 windows. If loading fails, it evaluates the locally trained model instead.

import copy
import warnings

repo_id = "braindecode/plot_dance_event_detection"
revision = "b1605cb57c4d5a87cd5c4617de5d9a2eb49c1f45"
model_source = "locally trained short-run model"
try:
    from huggingface_hub import hf_hub_download

    checkpoint_state = torch.load(
        hf_hub_download(repo_id, "model.pt", revision=revision),
        map_location=device,
        weights_only=True,
    )
    # A failed strict load can partially update a module; keep the fallback intact.
    checkpoint_model = copy.deepcopy(model)
    checkpoint_model.load_state_dict(checkpoint_state)
    model = checkpoint_model
    model_source = "published checkpoint (subject 3 used for epoch selection)"
    print(f"Loaded the pretrained checkpoint from {repo_id} at {revision}.")
except Exception as exc:
    warnings.warn(
        f"Could not load a pretrained checkpoint from {repo_id} ({exc}); "
        "predicting with the locally trained short-run model instead.",
        stacklevel=2,
    )

model.eval()

# Evaluate whichever model was loaded; do not label fallback results as checkpoint scores.
ckpt_ev_f1s = []
with torch.no_grad():
    for batch in test_loader:
        batch = {k: v.to(device) for k, v in batch.items()}
        out = model.detect(batch["eeg"])
        pred_events = detections_to_events(out, duration=WINDOW_S)
        for bi in range(batch["eeg"].shape[0]):
            gt = [
                (float(s) * WINDOW_S, float(e) * WINDOW_S, int(c))
                for s, e, c in zip(
                    batch["start"][bi], batch["end"][bi], batch["class"][bi]
                )
                if int(c) != 0
            ]
            preds = [(s, e, c) for (s, e, c, _conf) in pred_events[bi]]
            ckpt_ev_f1s.append(f1_event(preds, gt, iou_threshold=0.5))
print(f"Subject {test_subject}, {model_source}: F1-event={np.mean(ckpt_ev_f1s):.3f}")

# Predictions on the first evaluation window.
with torch.no_grad():
    example = test_samples[0][0].unsqueeze(0).to(device)
    out = model.detect(example)
predicted = detections_to_events(out, duration=WINDOW_S)[0]
print(f"{len(predicted)} events predicted on the first held-out window:")
for s, e, label, conf in sorted(predicted, key=lambda ev: ev[0])[:10]:
    print(f"  [{s:5.2f}s, {e:5.2f}s]  class={label}  confidence={conf:.2f}")
Loaded the pretrained checkpoint from braindecode/plot_dance_event_detection at b1605cb57c4d5a87cd5c4617de5d9a2eb49c1f45.
Subject 3, published checkpoint (subject 3 used for epoch selection): F1-event=0.495
51 events predicted on the first held-out window:
  [ 0.00s,  0.36s]  class=1  confidence=0.99
  [ 0.02s,  0.98s]  class=2  confidence=0.96
  [ 0.02s,  0.82s]  class=1  confidence=0.98
  [ 0.63s,  1.41s]  class=1  confidence=0.86
  [ 1.30s,  2.05s]  class=1  confidence=0.95
  [ 1.87s,  2.74s]  class=1  confidence=0.93
  [ 2.35s,  3.22s]  class=1  confidence=0.75
  [ 2.57s,  4.13s]  class=2  confidence=0.95
  [ 4.68s,  5.70s]  class=1  confidence=0.64
  [ 5.72s,  6.65s]  class=1  confidence=0.85

Conclusion#

This tutorial trained DANCE on real, continuous P300 EEG, detecting target and non-target flashes directly from unaligned windows, without ever being told where a flash starts. The 2-epoch, 3-subject run is only a fast teaching example, so its F1 scores are low. The published checkpoint uses more subjects and longer training, but its reported subject-3 score was used for epoch selection. Evaluating generalization requires a separate subject not used in training or selection.

At full scale, following the paper’s protocol (BI2014a, all subjects, up to 100 epochs with early stopping and a OneCycle learning rate schedule), DANCE matches onset-informed models on this dataset without ever using the flash onset, and sets a new state of the art on the harder task of seizure monitoring (Temple University Seizure corpus), where onsets are unknown by construction. That is the core claim: one architecture performing on par with onset-informed baselines while requiring no onset information at all.

References#

Total running time of the script: (5 minutes 24.874 seconds)

Gallery generated by Sphinx-Gallery