>>> (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));