>>> (indent 4)
    return doughnutFryer.start()
        .then((_) => _frostingGlazer.start())
        .then((_) =>
            Future.wait([
              _conveyorBelts.start(),
              sprinkleSprinkler.start(),
              sauceDripper.start()]))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) => tellEveryoneDonutsAreJustAboutDone())
        .then((_) =>
            Future.wait([
              croissantFactory.start(),
              _giantBakingOvens.start(),
              butterbutterer.start()])
            .catchError(_handleBakingFailures)
            .timeout(scriptLoadingTimeout, onTimeout: _handleBakingFailures)
            .catchError(cannotGetConveyorBeltRunning))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) {
          _logger.info("Let's eat!");
        });
<<<
    return doughnutFryer
        .start()
        .then((_) => _frostingGlazer.start())
        .then((_) => Future.wait([
              _conveyorBelts.start(),
              sprinkleSprinkler.start(),
              sauceDripper.start()
            ]))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) => tellEveryoneDonutsAreJustAboutDone())
        .then((_) => Future
            .wait([
              croissantFactory.start(),
              _giantBakingOvens.start(),
              butterbutterer.start()
            ])
            .catchError(_handleBakingFailures)
            .timeout(scriptLoadingTimeout, onTimeout: _handleBakingFailures)
            .catchError(cannotGetConveyorBeltRunning))
        .catchError(cannotGetConveyorBeltRunning)
        .then((_) {
      _logger.info("Let's eat!");
    });
>>> (indent 22)
                      someVeryLongFutureWithManyChars().then((foo) {
                        doAThing();
                      }).catchError((e) {
                        doAnotherThing;
                      }, test: someTestWithSoManyConditions(e) && itHasToWrap(e));
<<<
                      someVeryLongFutureWithManyChars().then((foo) {
                        doAThing();
                      }).catchError((e) {
                        doAnotherThing;
                      },
                          test: someTestWithSoManyConditions(e) &&
                              itHasToWrap(e));