text:
package com.google.android.exoplayer2.ext.cronet;

import android.net.Uri;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
import com.google.android.exoplayer2.metadata.icy.IcyHeaders;
import com.google.android.exoplayer2.upstream.BaseDataSource;
import com.google.android.exoplayer2.upstream.DataSourceException;
import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.upstream.HttpDataSource;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.ConditionVariable;
import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.Predicate;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.chromium.net.CronetEngine;
import org.chromium.net.CronetException;
import org.chromium.net.NetworkException;
import org.chromium.net.UrlRequest;
import org.chromium.net.UrlRequest.Status;
import org.chromium.net.UrlResponseInfo;

/**
 * DataSource without intermediate buffer based on Cronet API set using UrlRequest.
 *
 * <p>This class's methods are organized in the sequence of expected calls.
 */
public class CronetDataSource extends BaseDataSource implements HttpDataSource {

  /**
   * Thrown when an error is encountered when trying to open a {@link CronetDataSource}.
   */
  public static final class OpenException extends HttpDataSourceException {

    /**
     * Returns the status of the connection establishment at the moment when the error occurred, as
     * defined by {@link UrlRequest.Status}.
     */
    public final int cronetConnectionStatus;

    public OpenException(IOException cause, DataSpec dataSpec, int cronetConnectionStatus) {
      super(cause, dataSpec, TYPE_OPEN);
      this.cronetConnectionStatus = cronetConnectionStatus;
    }

    public OpenException(String errorMessage, DataSpec dataSpec, int cronetConnectionStatus) {
      super(errorMessage, dataSpec, TYPE_OPEN);
      this.cronetConnectionStatus = cronetConnectionStatus;
    }

  }

  /** Thrown on catching an InterruptedException. */
  public static final class InterruptedIOException extends IOException {

    public InterruptedIOException(InterruptedException e) {
      super(e);
    }
  }

  static {
    ExoPlayerLibraryInfo.registerModule("goog.exo.cronet");
  }

  /**
   * The default connection timeout, in milliseconds.
   */
  public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000;
  /**
   * The default read timeout, in milliseconds.
   */
  public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000;

  /* package */ final UrlRequest.Callback urlRequestCallback;

  private static final String TAG = "CronetDataSource";
  private static final String CONTENT_TYPE = "Content-Type";
  private static final String SET_COOKIE = "Set-Cookie";
  private static final String COOKIE = "Cookie";

  private static final Pattern CONTENT_RANGE_HEADER_PATTERN =
      Pattern.compile("^bytes (\\d+)-(\\d+)/(\\d+)$");
  // The size of read buffer passed to cronet UrlRequest.read().
  private static final int READ_BUFFER_SIZE_BYTES = 32 * 1024;

  private final CronetEngine cronetEngine;
  private final Executor executor;
  private final Predicate<String> contentTypePredicate;
  private final int connectTimeoutMs;
  private final int readTimeoutMs;
  private final boolean resetTimeoutOnRedirects;
  private final boolean handleSetCookieRequests;
  private final RequestProperties defaultRequestProperties;
  private final RequestProperties requestProperties;
  private final ConditionVariable operation;
  private final Clock clock;

  // Accessed by the calling thread only.
  private boolean opened;
  private long bytesToSkip;
  private long bytesRemaining;

  // Written from the calling thread only. currentUrlRequest.start() calls ensure writes are visible
  // to reads made by the Cronet thread.
  private UrlRequest currentUrlRequest;
  private DataSpec currentDataSpec;

  // Reference written and read by calling thread only. Passed to Cronet thread as a local variable.
  // operation.open() calls ensure writes into the buffer are visible to reads made by the calling
  // thread.
  private ByteBuffer readBuffer;

  // Written from the Cronet thread only. operation.open() calls ensure writes are visible to reads
  // made by the calling thread.
  private UrlResponseInfo responseInfo;
  private IOException exception;
  private boolean finished;

  private volatile long currentConnectTimeoutMs;

  /**
   * @param cronetEngine A CronetEngine.
   * @param executor The {@link java.util.concurrent.Executor} that will handle responses. This may
   *     be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a thread
   *     hop from Cronet's internal network thread to the response handling thread. However, to
   *     avoid slowing down overall network performance, care must be taken to make sure response
   *     handling is a fast operation when using a direct executor.
   * @param contentTypePredicate An optional {@link Predicate}. If a content type is rejected by the
   *     predicate then an {@link InvalidContentTypeException} is thrown from {@link
   *     #open(DataSpec)}.
   */
  public CronetDataSource(
      CronetEngine cronetEngine, Executor executor, Predicate<String> contentTypePredicate) {
    this(
        cronetEngine,
        executor,
        contentTypePredicate,
        DEFAULT_CONNECT_TIMEOUT_MILLIS,
        DEFAULT_READ_TIMEOUT_MILLIS,
        false,
        null,
        false);
  }

  /**
   * @param cronetEngine A CronetEngine.
   * @param executor The {@link java.util.concurrent.Executor} that will handle responses. This may
   *     be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a thread
   *     hop from Cronet's internal network thread to the response handling thread. However, to
   *     avoid slowing down overall network performance, care must be taken to make sure response
   *     handling is a fast operation when using a direct executor.
   * @param contentTypePredicate An optional {@link Predicate}. If a content type is rejected by the
   *     predicate then an {@link InvalidContentTypeException} is thrown from {@link
   *     #open(DataSpec)}.
   * @param connectTimeoutMs The connection timeout, in milliseconds.
   * @param readTimeoutMs The read timeout, in milliseconds.
   * @param resetTimeoutOnRedirects Whether the connect timeout is reset when a redirect occurs.
   * @param defaultRequestProperties The default request properties to be used.
   */
  public CronetDataSource(
      CronetEngine cronetEngine,
      Executor executor,
      Predicate<String> contentTypePredicate,
      int connectTimeoutMs,
      int readTimeoutMs,
      boolean resetTimeoutOnRedirects,
      RequestProperties defaultRequestProperties) {
    this(
        cronetEngine,
        executor,
        contentTypePredicate,
        connectTimeoutMs,
        readTimeoutMs,
        resetTimeoutOnRedirects,
        Clock.DEFAULT,
        defaultRequestProperties,
        false);
  }

  /**
   * @param cronetEngine A CronetEngine.
   * @param executor The {@link java.util.concurrent.Executor} that will handle responses. This may
   *     be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a thread
   *     hop from Cronet's internal network thread to the response handling thread. However, to
   *     avoid slowing down overall network performance, care must be taken to make sure response
   *     handling is a fast operation when using a direct executor.
   * @param contentTypePredicate An optional {@link Predicate}. If a content type is rejected by the
   *     predicate then an {@link InvalidContentTypeException} is thrown from {@link
   *     #open(DataSpec)}.
   * @param connectTimeoutMs The connection timeout, in milliseconds.
   * @param readTimeoutMs The read timeout, in milliseconds.
   * @param resetTimeoutOnRedirects Whether the connect timeout is reset when a redirect occurs.
   * @param defaultRequestProperties The default request properties to be used.
   * @param handleSetCookieRequests Whether "Set-Cookie" requests on redirect should be forwarded to
   *     the redirect url in the "Cookie" header.
   */
  public CronetDataSource(
      CronetEngine cronetEngine,
      Executor executor,
      Predicate<String> contentTypePredicate,
      int connectTimeoutMs,
      int readTimeoutMs,
      boolean resetTimeoutOnRedirects,
      RequestProperties defaultRequestProperties,
      boolean handleSetCookieRequests) {
    this(
        cronetEngine,
        executor,
        contentTypePredicate,
        connectTimeoutMs,
        readTimeoutMs,
        resetTimeoutOnRedirects,
        Clock.DEFAULT,
        defaultRequestProperties,
        handleSetCookieRequests);
  }

  /* package */ CronetDataSource(
      CronetEngine cronetEngine,
      Executor executor,
      Predicate<String> contentTypePredicate,
      int connectTimeoutMs,
      int readTimeoutMs,
      boolean resetTimeoutOnRedirects,
      Clock clock,
      RequestProperties defaultRequestProperties,
      boolean handleSetCookieRequests) {
    super(/* isNetwork= */ true);
    this.urlRequestCallback = new UrlRequestCallback();
    this.cronetEngine = Assertions.checkNotNull(cronetEngine);
    this.executor = Assertions.checkNotNull(executor);
    this.contentTypePredicate = contentTypePredicate;
    this.connectTimeoutMs = connectTimeoutMs;
    this.readTimeoutMs = readTimeoutMs;
    this.resetTimeoutOnRedirects = resetTimeoutOnRedirects;
    this.clock = Assertions.checkNotNull(clock);
    this.defaultRequestProperties = defaultRequestProperties;
    this.handleSetCookieRequests = handleSetCookieRequests;
    requestProperties = new RequestProperties();
    operation = new ConditionVariable();
  }

  // HttpDataSource implementation.

  @Override
  public void setRequestProperty(String name, String value) {
    requestProperties.set(name, value);
  }

  @Override
  public void clearRequestProperty(String name) {
    requestProperties.remove(name);
  }

  @Override
  public void clearAllRequestProperties() {
    requestProperties.clear();
  }

  @Override
  public Map<String, List<String>> getResponseHeaders() {
    return responseInfo == null ? Collections.emptyMap() : responseInfo.getAllHeaders();
  }

  @Override
  public Uri getUri() {
    return responseInfo == null ? null : Uri.parse(responseInfo.getUrl());
  }

  @Override
  public long open(DataSpec dataSpec) throws HttpDataSourceException {
    Assertions.checkNotNull(dataSpec);
    Assertions.checkState(!opened);

    operation.close();
    resetConnectTimeout();
    currentDataSpec = dataSpec;
    try {
      currentUrlRequest = buildRequestBuilder(dataSpec).build();
    } catch (IOException e) {
      throw new OpenException(e, currentDataSpec, Status.IDLE);
    }
    currentUrlRequest.start();

    transferInitializing(dataSpec);
    try {
      boolean connectionOpened = blockUntilConnectTimeout();
      if (exception != null) {
        throw new OpenException(exception, currentDataSpec, getStatus(currentUrlRequest));
      } else if (!connectionOpened) {
        // The timeout was reached before the connection was opened.
        throw new OpenException(
            new SocketTimeoutException(), dataSpec, getStatus(currentUrlRequest));
      }
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      throw new OpenException(new InterruptedIOException(e), dataSpec, Status.INVALID);
    }

    // Check for a valid response code.
    int responseCode = responseInfo.getHttpStatusCode();
    if (responseCode < 200 || responseCode > 299) {
      InvalidResponseCodeException exception =
          new InvalidResponseCodeException(
              responseCode,
              responseInfo.getHttpStatusText(),
              responseInfo.getAllHeaders(),
              currentDataSpec);
      if (responseCode == 416) {
        exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
      }
      throw exception;
    }

    // Check for a valid content type.
    if (contentTypePredicate != null) {
      List<String> contentTypeHeaders = responseInfo.getAllHeaders().get(CONTENT_TYPE);
      String contentType = isEmpty(contentTypeHeaders) ? null : contentTypeHeaders.get(0);
      if (!contentTypePredicate.evaluate(contentType)) {
        throw new InvalidContentTypeException(contentType, currentDataSpec);
      }
    }

    // If we requested a range starting from a non-zero position and received a 200 rather than a
    // 206, then the server does not support partial requests. We'll need to manually skip to the
    // requested position.
    bytesToSkip = responseCode == 200 && dataSpec.position != 0 ? dataSpec.position : 0;

    // Calculate the content length.
    if (!getIsCompressed(responseInfo)) {
      if (dataSpec.length != C.LENGTH_UNSET) {
        bytesRemaining = dataSpec.length;
      } else {
        bytesRemaining = getContentLength(responseInfo);
      }
    } else {
      // If the response is compressed then the content length will be that of the compressed data
      // which isn't what we want. Always use the dataSpec length in this case.
      bytesRemaining = currentDataSpec.length;
    }

    opened = true;
    transferStarted(dataSpec);

    return bytesRemaining;
  }

  @Override
  public int read(byte[] buffer, int offset, int readLength) throws HttpDataSourceException {
    Assertions.checkState(opened);

    if (readLength == 0) {
      return 0;
    } else if (bytesRemaining == 0) {
      return C.RESULT_END_OF_INPUT;
    }

    if (readBuffer == null) {
      readBuffer = ByteBuffer.allocateDirect(READ_BUFFER_SIZE_BYTES);
      readBuffer.limit(0);
    }
    while (!readBuffer.hasRemaining()) {
      // Fill readBuffer with more data from Cronet.
      operation.close();
      readBuffer.clear();
      currentUrlRequest.read(readBuffer);
      try {
        if (!operation.block(readTimeoutMs)) {
          throw new SocketTimeoutException();
        }
      } catch (InterruptedException e) {
        // The operation is ongoing so replace readBuffer to avoid it being written to by this
        // operation during a subsequent request.
        readBuffer = null;
        Thread.currentThread().interrupt();
        throw new HttpDataSourceException(
            new InterruptedIOException(e), currentDataSpec, HttpDataSourceException.TYPE_READ);
      } catch (SocketTimeoutException e) {
        // The operation is ongoing so replace readBuffer to avoid it being written to by this
        // operation during a subsequent request.
        readBuffer = null;
        throw new HttpDataSourceException(e, currentDataSpec, HttpDataSourceException.TYPE_READ);
      }

      if (exception != null) {
        throw new HttpDataSourceException(exception, currentDataSpec,
            HttpDataSourceException.TYPE_READ);
      } else if (finished) {
        bytesRemaining = 0;
        return C.RESULT_END_OF_INPUT;
      } else {
        // The operation didn't time out, fail or finish, and therefore data must have been read.
        readBuffer.flip();
        Assertions.checkState(readBuffer.hasRemaining());
        if (bytesToSkip > 0) {
          int bytesSkipped = (int) Math.min(readBuffer.remaining(), bytesToSkip);
          readBuffer.position(readBuffer.position() + bytesSkipped);
          bytesToSkip -= bytesSkipped;
        }
      }
    }

    int bytesRead = Math.min(readBuffer.remaining(), readLength);
    readBuffer.get(buffer, offset, bytesRead);

    if (bytesRemaining != C.LENGTH_UNSET) {
      bytesRemaining -= bytesRead;
    }
    bytesTransferred(bytesRead);
    return bytesRead;
  }

  @Override
  public synchronized void close() {
    if (currentUrlRequest != null) {
      currentUrlRequest.cancel();
      currentUrlRequest = null;
    }
    if (readBuffer != null) {
      readBuffer.limit(0);
    }
    currentDataSpec = null;
    responseInfo = null;
    exception = null;
    finished = false;
    if (opened) {
      opened = false;
      transferEnded();
    }
  }

  /** Returns current {@link UrlRequest}. May be null if the data source is not opened. */
  @Nullable
  protected UrlRequest getCurrentUrlRequest() {
    return currentUrlRequest;
  }

  /** Returns current {@link UrlResponseInfo}. May be null if the data source is not opened. */
  @Nullable
  protected UrlResponseInfo getCurrentUrlResponseInfo() {
    return responseInfo;
  }

  // Internal methods.

  private UrlRequest.Builder buildRequestBuilder(DataSpec dataSpec) throws IOException {
    UrlRequest.Builder requestBuilder =
        cronetEngine
            .newUrlRequestBuilder(dataSpec.uri.toString(), urlRequestCallback, executor)
            .allowDirectExecutor();
    // Set the headers.
    boolean isContentTypeHeaderSet = false;
    if (defaultRequestProperties != null) {
      for (Entry<String, String> headerEntry : defaultRequestProperties.getSnapshot().entrySet()) {
        String key = headerEntry.getKey();
        isContentTypeHeaderSet = isContentTypeHeaderSet || CONTENT_TYPE.equals(key);
        requestBuilder.addHeader(key, headerEntry.getValue());
      }
    }
    Map<String, String> requestPropertiesSnapshot = requestProperties.getSnapshot();
    for (Entry<String, String> headerEntry : requestPropertiesSnapshot.entrySet()) {
      String key = headerEntry.getKey();
      isContentTypeHeaderSet = isContentTypeHeaderSet || CONTENT_TYPE.equals(key);
      requestBuilder.addHeader(key, headerEntry.getValue());
    }
    if (dataSpec.httpBody != null && !isContentTypeHeaderSet) {
      throw new IOException("HTTP request with non-empty body must set Content-Type");
    }
    if (dataSpec.isFlagSet(DataSpec.FLAG_ALLOW_ICY_METADATA)) {
      requestBuilder.addHeader(
          IcyHeaders.REQUEST_HEADER_ENABLE_METADATA_NAME,
          IcyHeaders.REQUEST_HEADER_ENABLE_METADATA_VALUE);
    }
    // Set the Range header.
    if (dataSpec.position != 0 || dataSpec.length != C.LENGTH_UNSET) {
      StringBuilder rangeValue = new StringBuilder();
      rangeValue.append("bytes=");
      rangeValue.append(dataSpec.position);
      rangeValue.append("-");
      if (dataSpec.length != C.LENGTH_UNSET) {
        rangeValue.append(dataSpec.position + dataSpec.length - 1);
      }
      requestBuilder.addHeader("Range", rangeValue.toString());
    }
    // TODO: Uncomment when https://bugs.chromium.org/p/chromium/issues/detail?id=767025 is fixed
    // (adjusting the code as necessary).
    // Force identity encoding unless gzip is allowed.
    // if (!dataSpec.isFlagSet(DataSpec.FLAG_ALLOW_GZIP)) {
    //   requestBuilder.addHeader("Accept-Encoding", "identity");
    // }
    // Set the method and (if non-empty) the body.
    requestBuilder.setHttpMethod(dataSpec.getHttpMethodString());
    if (dataSpec.httpBody != null) {
      requestBuilder.setUploadDataProvider(
          new ByteArrayUploadDataProvider(dataSpec.httpBody), executor);
    }
    return requestBuilder;
  }

  private boolean blockUntilConnectTimeout() throws InterruptedException {
    long now = clock.elapsedRealtime();
    boolean opened = false;
    while (!opened && now < currentConnectTimeoutMs) {
      opened = operation.block(currentConnectTimeoutMs - now + 5 /* fudge factor */);
      now = clock.elapsedRealtime();
    }
    return opened;
  }

  private void resetConnectTimeout() {
    currentConnectTimeoutMs = clock.elapsedRealtime() + connectTimeoutMs;
  }

  private static boolean getIsCompressed(UrlResponseInfo info) {
    for (Map.Entry<String, String> entry : info.getAllHeadersAsList()) {
      if (entry.getKey().equalsIgnoreCase("Content-Encoding")) {
        return !entry.getValue().equalsIgnoreCase("identity");
      }
    }
    return false;
  }

  private static long getContentLength(UrlResponseInfo info) {
    long contentLength = C.LENGTH_UNSET;
    Map<String, List<String>> headers = info.getAllHeaders();
    List<String> contentLengthHeaders = headers.get("Content-Length");
    String contentLengthHeader = null;
    if (!isEmpty(contentLengthHeaders)) {
      contentLengthHeader = contentLengthHeaders.get(0);
      if (!TextUtils.isEmpty(contentLengthHeader)) {
        try {
          contentLength = Long.parseLong(contentLengthHeader);
        } catch (NumberFormatException e) {
          Log.e(TAG, "Unexpected Content-Length [" + contentLengthHeader + "]");
        }
      }
    }
    List<String> contentRangeHeaders = headers.get("Content-Range");
    if (!isEmpty(contentRangeHeaders)) {
      String contentRangeHeader = contentRangeHeaders.get(0);
      Matcher matcher = CONTENT_RANGE_HEADER_PATTERN.matcher(contentRangeHeader);
      if (matcher.find()) {
        try {
          long contentLengthFromRange =
              Long.parseLong(matcher.group(2)) - Long.parseLong(matcher.group(1)) + 1;
          if (contentLength < 0) {
            // Some proxy servers strip the Content-Length header. Fall back to the length
            // calculated here in this case.
            contentLength = contentLengthFromRange;
          } else if (contentLength != contentLengthFromRange) {
            // If there is a discrepancy between the Content-Length and Content-Range headers,
            // assume the one with the larger value is correct. We have seen cases where carrier
            // change one of them to reduce the size of a request, but it is unlikely anybody
            // would increase it.
            Log.w(TAG, "Inconsistent headers [" + contentLengthHeader + "] [" + contentRangeHeader
                + "]");
            contentLength = Math.max(contentLength, contentLengthFromRange);
          }
        } catch (NumberFormatException e) {
          Log.e(TAG, "Unexpected Content-Range [" + contentRangeHeader + "]");
        }
      }
    }
    return contentLength;
  }

  private static String parseCookies(List<String> setCookieHeaders) {
    return TextUtils.join(";", setCookieHeaders);
  }

  private static void attachCookies(UrlRequest.Builder requestBuilder, String cookies) {
    if (TextUtils.isEmpty(cookies)) {
      return;
    }
    requestBuilder.addHeader(COOKIE, cookies);
  }

  private static int getStatus(UrlRequest request) throws InterruptedException {
    final ConditionVariable conditionVariable = new ConditionVariable();
    final int[] statusHolder = new int[1];
    request.getStatus(new UrlRequest.StatusListener() {
      @Override
      public void onStatus(int status) {
        statusHolder[0] = status;
        conditionVariable.open();
      }
    });
    conditionVariable.block();
    return statusHolder[0];
  }

  private static boolean isEmpty(List<?> list) {
    return list == null || list.isEmpty();
  }

  private final class UrlRequestCallback extends UrlRequest.Callback {

    @Override
    public synchronized void onRedirectReceived(
        UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
      if (request != currentUrlRequest) {
        return;
      }
      if (currentDataSpec.httpMethod == DataSpec.HTTP_METHOD_POST) {
        int responseCode = info.getHttpStatusCode();
        // The industry standard is to disregard POST redirects when the status code is 307 or 308.
        if (responseCode == 307 || responseCode == 308) {
          exception =
              new InvalidResponseCodeException(
                  responseCode, info.getHttpStatusText(), info.getAllHeaders(), currentDataSpec);
          operation.open();
          return;
        }
      }
      if (resetTimeoutOnRedirects) {
        resetConnectTimeout();
      }

      Map<String, List<String>> headers = info.getAllHeaders();
      if (!handleSetCookieRequests || isEmpty(headers.get(SET_COOKIE))) {
        request.followRedirect();
      } else {
        currentUrlRequest.cancel();
        DataSpec redirectUrlDataSpec;
        if (currentDataSpec.httpMethod == DataSpec.HTTP_METHOD_POST) {
          // For POST redirects that aren't 307 or 308, the redirect is followed but request is
          // transformed into a GET.
          redirectUrlDataSpec =
              new DataSpec(
                  Uri.parse(newLocationUrl),
                  DataSpec.HTTP_METHOD_GET,
                  /* httpBody= */ null,
                  currentDataSpec.absoluteStreamPosition,
                  currentDataSpec.position,
                  currentDataSpec.length,
                  currentDataSpec.key,
                  currentDataSpec.flags);
        } else {
          redirectUrlDataSpec = currentDataSpec.withUri(Uri.parse(newLocationUrl));
        }
        UrlRequest.Builder requestBuilder;
        try {
          requestBuilder = buildRequestBuilder(redirectUrlDataSpec);
        } catch (IOException e) {
          exception = e;
          return;
        }
        String cookieHeadersValue = parseCookies(headers.get(SET_COOKIE));
        attachCookies(requestBuilder, cookieHeadersValue);
        currentUrlRequest = requestBuilder.build();
        currentUrlRequest.start();
      }
    }

    @Override
    public synchronized void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
      if (request != currentUrlRequest) {
        return;
      }
      responseInfo = info;
      operation.open();
    }

    @Override
    public synchronized void onReadCompleted(
        UrlRequest request, UrlResponseInfo info, ByteBuffer buffer) {
      if (request != currentUrlRequest) {
        return;
      }
      operation.open();
    }

    @Override
    public synchronized void onSucceeded(UrlRequest request, UrlResponseInfo info) {
      if (request != currentUrlRequest) {
        return;
      }
      finished = true;
      operation.open();
    }

    @Override
    public synchronized void onFailed(
        UrlRequest request, UrlResponseInfo info, CronetException error) {
      if (request != currentUrlRequest) {
        return;
      }
      if (error instanceof NetworkException
          && ((NetworkException) error).getErrorCode()
              == NetworkException.ERROR_HOSTNAME_NOT_RESOLVED) {
        exception = new UnknownHostException();
      } else {
        exception = error;
      }
      operation.open();
    }
  }
}

redpajama_set_name: RedPajamaGithub


Happy Monday Loves! I hope you all had a wonderful weekend! I am off today and using this day to stay ahead and work on posts before the holiday week. I also have a Friendsgiving Party this Saturday and I am busy trying to stay ahead and gather all my items.
Today I have to share with you guys this cozy cardigan and I don't know about you guys but I am not ready for this cold weather!!! I don't know what it is but when you get older my body feels like it can't withstand the cold weather. LOL! Because I live in New England in order to withstand the cold I stock up on cozy warm cardigan and sweaters. The cozier the better I say!


Who Wants a Video Tour of Apple's Secret Design Studio?
Apple's secretive Industrial Design studio is on the ground floor of Infinite Loop II, one of the main buildings at Apple's Cupertino HQ.
Ever wanted to take a tour of Apple's secret Industrial Design studio in Cupertino? Now you can — a virtual one, anyway — just for writing a review of my new book about Jony Ive. It doesn't even have to be a good review!
Few have been inside — even some of Apple's own executives haven't seen it. Rumor has it that the former head of iOS, Scott Forstall, wasn't allowed inside, even when he was developing the iPhone's operating system. Only one published photograph has ever been taken inside the studio. And no, Blue Peter and the Objectified documentary weren't filmed there, contrary to popular opinion.
Now you can take a tour. I had a 3-D model of the studio created, based on detailed descriptions and diagrams by former designers who worked inside. I used it to create a video tour of the studio, showing the layout and explaining how everything works. I think the video turned out great, and here's how you get a sneak peek.
Inside Apple's secret industrial design studio.
The video is part of a mini-site I'm preparing. The mini-site is all the stuff that couldn't be included in Jony Ive: The Genius Behind Apple's Greatest Products — it's like a DVD of extras for the book. It features an illustrated history of Apple design, a detailed case study and, for the first time, an introduction to all the members of the elusive design team.
To get a sneak peek of the studio tour, please write a quick review of my book on Amazon or iBooks. It doesn't have to be a positive review; just an honest one. It takes just 30 seconds to bang out a quick opinion. Reviews are super-helpful to authors, especially in the run-up to the holidays. Nothing does more to validate a book. I'm trying to get as many as I can. I'd especially appreciate a review on iBooks.
When you've written the review, please email me at jonyivebook@cultofmac.com. Just let me know what Amazon or iBooks user name you used to write the review. You'll be emailed back with a URL to the video.
In addition, you'll get access to the mini-site when it is finished (which will be shortly, with any luck). Many thanks in advance!
Here's the iBooks U.S. link: Jony Ive: The Genius Behind Apple's Greatest Products.
Here's the Amazon U.S. link: Jony Ive: The Genius Behind Apple's Greatest Products.
And here's the Amazon U.K. link: Jony Ive: The Genius Behind Apple's Greatest Products.


The social, economic and environmental conditions in which children and families live, learn, work and play – the social determinants of health – impact how long and how well we live.
The quality of the environments within a community have a major impact on the ability of children and families to make choices that support healthy growth and development. When children and families have access to social, economic and physical resources that promote health and well-being (e.g. safe and affordable housing, quality education, public safety, availability of healthy foods, and safe play spaces), children have more opportunities to thrive. On the contrary, children growing up in communities that lack these positive environmental conditions often suffer poorer health outcomes than their peers.
Mayors and city leaders play a pivotal role in the overall health and well-being of the cities and towns they serve. By improving the social, economic, and physical conditions across various environments and settings, city leaders can improve the health and quality of life of residents in their communities.
Subscribe to our Culture of Health list that includes updates on our web forum series, CitiesSpeak blogs and upcoming Mayors' Institutes here.
Read more about the Culture of Health.


text:
Posts Tagged 'Fox Theatre'
"An American In Paris" at the Fox Takes Its Audience on a Dazzling Journey Through Dance
Posted in St Louis Theatre, USA Theatre, tagged an american in paris, christopher wheeldon, Fox Theatre, george gershwin, ira gershwin, review, st louis on January 20, 2017| Leave a Comment »
Music and Lyrics by George Gershwin and Ira Gershwin
Book by Craig Lucas
Directed and Choreographed by Christopher Wheeldon
The Fox Theatre
Garen Scribner, Sara Esty
Photo by Matthew Murphy
An American in Paris North American Tour
I have to admit that although I saw the classic film An American in Paris, starring Gene Kelly, when I was a small child, what I most remember about it is being somewhat confused and bored by the iconic dance sequence that ends the movie. I guess I was too young to appreciate it. Now, the tour of the stage version with the classic Gershwin score and a revised book is on stage at the Fox, and viewing the story and its dazzling dance sequences as an adult, I'm anything but bored and confused. Although the story has been modified somewhat from the film, this production is visually stunning, emotionally stirring and musically sensational.
The setting, as the title suggests, is Paris. The time is just after the end of World War II. Jerry Mulligan (Garen Scribner) is a young US Army vet and aspiring painter who finds himself intrigued with the City of Light and with a mysterious young woman that he meets but whose name he doesn't learn at first. He decides to stay in Paris and wanders into a cafe where he meets fellow American veteran Adam Hochberg (Etai Benson), who plays the piano and writes music, hoping to become a successful composer. He also meets Henri Baurel (Nick Spangler), the son of wealthy French manufacturers, who harbors the secret dream of becoming a song-and-dance man in America. Eventually, they cross paths with Jerry's mystery woman, the gifted young ballerina Lise Dassin (Sara Esty), whose mother had been a famous dancer. Lise herself has a secret that ties her to Henri, although both Jerry and Adam find themselves drawn to her and she herself feels drawn to Jerry. There's also wealthy heiress and arts patron Milo Davenport (Emily Ferranti), who forms an attachment to Jerry as well. All the complicated love polygons are only part of the plot, as the ghosts of the past and the spirit of the future battle within the various characters who strive to make something of their lives, and the world, after the war. It's a well-constructed plot that revises and fleshes out some of the stories from the film, adding extra Gershwin songs in a celebration of life, art, and ultimately hope.
This is such a dance-heavy show that I have to mention that director/choreographer Christopher Wheeldon's wonderful, lyrical work here. The strong influences of ballet, jazz, and occasionally tap are here in evidence, expertly, energetically, and emotionally danced by the top-notch ensemble and perfectly cast leads. The cast is ably led by Scribner as the outgoing, charming Jerry and Esty as the somewhat mysterious, conflicted Lise. Their chemistry is outstanding, and their dancing is simply wondrous, especially in the dazzling "An American in Paris" ballet near the end of the show. There are also strong performances from Benson as the sweetly snarky Adam and Ferranti in a witty, sympathetic performance as Milo. Spangler as Henri is also excellent, making the most of a spectacular showcase production number in "I'll Build a Stairway to Paradise". The whole cast here is incredibly strong, showing of incredible dancing skills on such Gershwin classics as "I Got Rhythm", "S'Wonderful", and more.
Technically, this show is just plain beautiful. Bob Crowley's glorious set design is remarkable in its simplicity and its elegance, relying largely on movable set pieces that flow onstage as if they are part of the dance, augmented by truly stunning projections by 59 Productions. Crowley also designed the gorgeous, stylish costumes that add much to the 1940's air of the production. There's also spectacular, atmospheric lighting by Natasha Katz that enhances every scene and production number.
This is such a wonderful show. It's poetic, balletic, and dramatic with just the right amount of humor to move the story along. The characters are well portrayed and their stories are convincing, but what is mostly evident about this production is its celebration of life, art, and music in a visual, auditory, and emotional sense. It's a screen-to-stage adaptation that honors its source material and manages to expand it in a richly compelling way, and it fills the Fox stage superbly. It's definitely a show not to be missed. Now, I need to see the movie again.
Cast of An American in Paris
The North American tour of An American In Paris runs at the Fox Theatre until January 29, 2017.
"Fun Home" at the Fox Is a Profound Portrait
Posted in St Louis Theatre, USA Theatre, tagged alison bechdel, Fox Theatre, fun home, jeanine tesori, lisa kron, review, sam gold, st louis on November 19, 2016| Leave a Comment »
Fun Home
Music by Jeanine Tesori, Book and Lyrics by Lisa Kron
Based on the Graphic Novel by Alison Bechdel
Directed by Sam Gold
Cast of Fun Home
Photo by Joan Marcus
Fun Home National Tour
Fun Home isn't a big musical. It's actually quite small, and not very long. It runs about 90 minutes with no intermission. Still, as short as it is, this is a powerful show. I hadn't seen it before the national tour came to the Fox, although I had heard great things about it. I'm happy to say that it lives up to the hype.
The show is inventively structured. Based on a celebrated graphic novel memoir by Alison Bechdel, the play introduces us to the author at three stages in her life, as adult Alison (Kate Shindle) is in the process of reflecting on her life story and writing and drawing the graphic novel. As Alison thinks and draws, we see a non-linear depiction of her life, meeting Small Alison (Alessandra Baldacchino) as she lives with her family in a small Pennsylvania town, the daughter of Bruce (Robert Petkoff), a high school English teacher and part-time funeral director; and Helen (Susan Moniz), an actress. Bruce is obsessed with redecorating his family's grand old house, as well as keeping up the appearance of the perfect happy family. We also get to meet Medium Alison (Abby Corrigan), who starts college and experiences many personal discoveries, from her own identity as a lesbian and her new relationship with girlfriend Joan (Karen Eilbacher), to continued revelations about her father, who is gay but closeted. As Alison learns about life and learns to make her own way, Bruce bristles against the changes in the world and the expectations of others, leading to despair as the older Alison reflects, ponders, and wonders how things could have turned out differently as she uses her art as a cartoonist as a vehicle for her own quest for answers. The structure is brilliant, as the various stories intertwine and interact, and there's a strong score to punctuate the drama.
This is an intensely dramatic play, no question, but it also has a great deal of humor, from adult Alison's wry commentary on her previous selves' lives as she writes about them, to Medium Alison's enthusiastic celebration of her feelings for Joan, to Small Alison's making a hilarious commercial with her brothers (Pierson Salvador as Christian, Lennon Nate Hammond as John) about the funeral home, complete with song and dance. In the midst of this though, is a family tragedy, of a man who cares so much about appearances and feels bound by society's expectations of him, and of his wife who knows what's going on and feels increasingly neglected and powerless, to the initially clueless Alison who doesn't know what's happening with her father until she's in college, and the older Alison who still tries to come to terms with the tragic consequences of her father's actions. It's a brilliantly written, insightful show full of excellent songs and lucid commentary on the subject of personal growth and development of identity as well as family dynamics and the constant pressure for the parents to keep up appearances, and for the kids, as they grow up, to search for their own authenticity.
There isn't a list of songs in the program, and I think that's because the songs are blended so seamlessly in with the rest of the dialogue. This isn't a sung-through show, but there's a lot of music packed into that 90 minutes, and it's excellent. The performers are all top-notch, as well, led by the three Alisons—the sometimes reflective, sometimes sarcastic Shindle as adult Alison, the wide-eyed, enthusiastic Corrigan as Medium Alison, and the thoughtful, playful, brash Baldacchino as Small Alison. Petkoff is also superb as the conflicted Bruce, who struggles to come to terms with his own feelings and reality in the midst of his efforts to construct and protect his own existence. Moniz is also strong as the neglected, caring but increasingly angry Helen, and there are also fine performances from Salvador and Hammond as Christian and John, by Eilbacher as Medium Alison's outgoing girlfriend Joan, and by Robert Hager as a variety of characters in Bruce's life.
The technical elements of the show work together well to help maintain the comic and dramatic atmosphere of this production. The Bechdels' meticulously well-appointed house, adult Alison's apartment/studio and Medium Alison's college dorm room and campus spaces, the family's "Fun Home" (their nickname for the funeral home) and more are well represented in David Zinn's versatile set. Zinn also designed the costumes, which are also superb, fitting the various characters as well as the changing time periods well. Ben Stanton's lighting is also remarkable, helping to maintain or shift the tone of scenes as needed and to enhance the overall mood of the production.
Fun Home is a short musical, but there's a whole lot to see and experience in this one act show. I haven't read the graphic novel on which it is based, but now I want to. This is a fascinating show, well-crafted in all areas and incredibly well performed. It's a story of an artist, of a family, and of personal discovery and the struggle for authenticity amid outside expectations as well as self-perception. It's an impressive, highly emotional show and I'm glad I was able to see it. There's still time to check it out at the Fox. I highly recommend it.
Kate Shindle, Robert Petkoff
The national tour of Fun Home is playing at the Fox Theatre until November 27, 2016.
The Fox Theatre is Alive With "The Sound of Music"
Posted in St Louis Theatre, USA Theatre, tagged Fox Theatre, howard lindsay, jack o'brien, oscar hammerstein ii, review, richard rodgers, rodgers and hammerstein, russel crouse, st louis, the sound of music on April 29, 2016| Leave a Comment »
Music by Richard Rodgers, Lyrics by Oscar Hammerstein II
Book by Howard Lindsay and Russel Crouse
Directed by Jack O'Brien
Kerstin Anderson
The Sound of Music National Tour
The Sound of Music is unquestionably a musical theatre classic. Since its debut on Broadway in 1959, it has been performed in various productions around the world as well as two live television productions and, of course, the Oscar-Winning movie. I personally have seen so many productions of it that I've almost got the show memorized. Audiences generally know what to expect when they see this show. With the new touring production now on stage at the Fox, director Jack O'Brien has brought a good mixture of timelessness and immediacy to this time-honored show, as well as finding a promising young star to lead the cast.
Everyone knows the story, it seems. As Maria (Kerstin Anderson) finds it difficult to fit in at Nonnburg Abbey, the Mother Abbess (Melody Betts) decides the young would-be nun needs to see more of the world. So for that purpose, Maria is sent to be a governess to the seven children of lonely widower Captain Georg Von Trapp (Ben Davis), who since the death of his wife has become more of an authoritarian commander than a father to his children. Maria soon wins her way into the hearts of the children and, eventually, their father as well, despite the romantic efforts of the wealthy widow Elsa Schraeder (Teri Hansen), who also wants to marry the Captain. And then there's the Captain's enterprising friend Max (Merwin Foard), who hopes to recruit the children–whom Maria has taught to sing–to perform in a big music festival. And then comes the Nazi occupation of Austria, and the drama that follows.
Kerstin Anderson follows in the footsteps of many a Maria, including stage legend Mary Martin and the movie's iconic Julie Andrews. Anderson, thankfully, doesn't try to imitate her famous predecessors, although she has a quirkiness about her that is more comparable to Martin than to Andrews. She also has a youthful, energetic spirit and a great voice. As Maria navigates her road from the convent to the Von Trapps' villa, Anderson visibly matures and acquires a sense of grace and poise. It's an impressive performance, although she also occasionally tends to deliver her lines in an over-rehearsed, somewhat artificial manner. For the most part, however, she makes an excellent Maria, and she has great chemistry with Ben Davis's charming, authoritative but increasingly boyish Von Trapp. Their love duet "Something Good" is very sweetly sung and their showcase dance charged with romantic tension. Davis also gets one of the show's best moments when he leads his family in singing "Edelweiss" at the concert. There's also a strong comedic performance by Foard as Max, and Betts as the Mother Abbess radiates kindness and strength, stopping the show with a soaring rendition of "Climb Ev'ry Mountain". Other standouts in the cast are Paige Silvester as a particularly rebellious eldest Von Trapp daughter, Liesl, and Svea Elizabeth Johnson as the wise, observant daughter Brigitta. The children have a good rapport with Anderson's Maria, and all the production numbers are well-done, including the energetic "Do Re Mi" and "The Lonely Goatherd".
Visually, the production is impressive as well. Douglas W. Schmidt's excellent set is notable for its period authenticity and colorful painted backdrops of beautiful mountain vistas, well-lit by lighting designer Natasha Katz. The costumes by Jane Greenwood are well-crafted and suited to the characters, from the nuns' habits to Maria's succession of dresses that range from the frumpy to the elegant. The children's play costumes, supposedly made by Maria from the curtains in her bedroom, are appropriately whimsical. Maria's hairstyles also go through a believable progression throughout the production, so kudos to hair designer Tom Watson for that effect.
Overall, the tone of this production strikes a good medium between the classic and the new. There's a sense of energy and urgency brought to the proceedings, as well as an authentic-seeming 1930's sensibility and an "old Broadway" style without seeming too dated. It's not trying to to overly innovative or different. It's just trying to tell the story and tell it well, and for the most part, this iteration of The Sound of Music achieves that goal. It's a delightful show.
Ben Davis and cast
The national tour of The Sound of Music is running at the Fox Theatre until May 8, 2016.
"Bridges" at the Fox Looks, Sounds Great, But the Story is Lacking
Posted in St Louis Theatre, USA Theatre, tagged bartlett sher, Fox Theatre, Jason Robert Brown, marsha norman, review, robert james waller, st louis, the bridges of madison county, tyne rafaeli on April 9, 2016| Leave a Comment »
Book by Marsha Norman, Music and Lyrics by Jason Robert Brown
Based the Novel by Robert James Waller
Original Direction by Bartlett Sher, Direction Recreated by Tyne Rafaeli
Elizabeth Stanley, Andrew Samonsky
The Bridges of Madison County National Tour
The Bridges of Madison County was one of those books that everyone seemed to be reading in the early 1990's. It has since become a well-known film, and now it's a musical, featuring a score by one of the most celebrated modern composers, Jason Robert Brown. And the score is gorgeous, as are the production values. Unfortunately, despite a good cast, the story isn't quite as gorgeous.
Although this was a best-selling book and a popular movie, I haven't read the book and this version is the first adaptation I've seen. It tells the story of a lonely Italian woman, Francesca (Elizabeth Stanley) who married an American soldier after World War II and moved with him to his farm in Iowa. After years of living with Bud (Cullen R. Titmas) and raising their now-teenage children Carolyn (Caitlin Houlahan) and Michael (John Campione), Francesca is bored with farm life and misses Italy. When Bud and the kids take a trip to a state fair to show off Carolyn's prize steer, Francesca stays home, where she soon meets traveling photographer Robert Kincaid (Andrew Samonsky), who has been sent by National Geographic to take pictures of the area's famous covered bridges. He stops at Francesca's to ask for directions to the last bridge, and the two are soon intrigued by one another, as Robert has recently traveled to Francesca's hometown of Naples and his more worldly, less conventional outlook on life intrigues her. They begin an affair, despite the frequent calls from Bud and Francesca's neighbor and friend Marge (Mary Callanan) to check up on her.
This affair is apparently supposed to be life-changing for both Francesca and Robert, but the way it's presented in this musical, I don't really buy it. Everything moves too quickly and isn't given the proper resonance. I keep finding myself sympathizing with the nice-but-boring Bud, and with his and Francesca's kids, who have no clue what's going on back home while they have their own "adventures" at the fair that don't have much bearing on the rest of the story. The music is gorgeous, representing a variety of styles from a more classical sound to country and folk, and there are some stand-out songs, some with clever settings like Marge standing in for a radio singer singing "Get Closer" as Robert and Francesca dance. There's also the haunting "Who You Are and Who We Want to Be" and Robert's memorable "It All Fades Away", but despite the beautiful music, the story around the songs reads as kind of shallow, with the connection between Francesca and Robert seeming little more than superficial, and the story's continuation after the key events making the supposedly torrid affair seem kind of pointless.
The show looks great, as well. With a positively stunning set design by Michael Yeargan, adapted for the tour by Mikiko Suzuki MacAdams and beautifully realized lighting by Donald Holder and Michael Jones, the atmosphere of the sweeping farmlands of Iowa is well-embodied. There's also excellent, well-suited costume design by Catherine Zuber that captures the style of the time period.
The cast for this show is also excellent, led by a top-notch performance by Stanley as the disillusioned Francesca. Her presence and strong voice help to make her character relatable despite the lack of chemistry with Samonsky's nice-looking but somewhat bland Robert. The real stand-outs in this cast are the supporting performers, especially Callanan as the nosy but supportive neighbor Marge, and David Hess as her affable, loving husband Charlie. Houlahan and Campione are also excellent as Francesca's children, the nervous but determined Carolyn and the initially rebellious but well-meaning Michael. Titmas is also fine in the somewhat flatly written role of Bud, and there's a strong ensemble that fills out the cast, representing townspeople and various people from Francesca's and Robert's personal history.
The Bridges of Madison County is a good-looking, great sounding show, but I wish it was more than that. It's set up as a great love story but it doesn't come across that way, especially with the lack of chemistry between the leads and the sense that most of the subplots are merely window-dressing for the unconvincing main event. I haven't read the book so I don't know if the story is better told in novel form, but here it's all kind of thin. Still, it's Jason Robert Brown, so the music is wonderful, and the songs are well-sung. There's enough here for a reasonably interesting story, but I wish there had been more of a point to it all.
The national tour of The Bridges of Madison County plays at the Fox Theatre until April 17, 2016.
"If/Then" at the Fox Presents an Intriguing, If Not Always Memorable, Dilemma
Posted in St Louis Theatre, USA Theatre, tagged Brian Yorkey, Fox Theatre, if/then, michael greif, review, st louis, Tom Kitt on March 18, 2016| Leave a Comment »
Music by Tom Kitt, Book and Lyrics by Brian Yorkey
Directed by Michael Greif
Jackie Burns (center) and Cast of If/Then
If/Then National Tour
I think most people have "what if" moments in their lives. Maybe it's that class in college that you wish you had taken, or that person whose invitation you wish you had accepted. How would your life have been different if you had made one simple choice differently? The musical If/Then, currently on stage at the Fox Theatre, takes questions like that and makes a story out of them–or more precisely, two stories running concurrently. It's an intriguing concept that's been given an inventive production, based on the Broadway staging. It's not always easy to follow, but it's an impressive production, and extremely entertaining.
If/Then's central figure is Elizabeth (Jackie Burns), who is seen wondering about a particular day in New York City's Central Park. Having just returned to the city to start over after a failed marriage and 12 years out West, Elizabeth is presented with a dilemma–two friends, and which one to follow. Does she stay in the park with her new neighbor Kate (Tamyra Gray), or does she leave to join her former college boyfriend Lucas (Anthony Rapp) in a protest he's organizing? The show presents both scenarios side-by-side, with Elizabeth going by the nickname "Liz" when she stays with Kate, and by "Beth" when she goes with Lucas. The name difference actually helps the audience to follow the plot, as Elizabeth's life verges in potentially confusing directions, and the two timelines both feature some of the same characters but also others who are unique to one particular path. Most importantly in the "Liz" plot is Josh (Matthew Hydzik), a doctor just returned from a military tour overseas, who becomes her love interest in that plot while in the "Beth" plot, she accepts a high-powered city planning job and becomes involved in more complicated personal relationships. There isn't much else I can say about the story that won't spoil it, but I will say that the fates of Elizabeth's friends are also affected by the divergence in her own paths, sometimes for the better and sometimes not.
This isn't an entirely original idea. There have been a few movies and stories with similar concepts, but this one has the team responsible for one of my favorite modern musicals, Next to Normal, behind it, and that definitely got my attention. Still, the music here isn't as memorable as it is in Next to Normal, and the story can be hard to follow at times. I can't even name many of the songs after seeing the show without having to consult the program. The show also seems to be suggesting a "moral" that is somewhat problematic, although explaining that in too much detail would spoil the ending. I'll just say that one of the endings seems happier based on whether love or career is put first in Elizabeth's life.
The casting is solid, with strong performances from the leads and the ensemble. Burns is a likable protagonist, with a strong, belty voice that's occasionally too reminiscent of her Broadway and tour predecessor Idina Menzel. Still, Burns portrays both the "Liz" and "Beth" sides of Elizabeth's story well, and her chemistry with Hydzik's amiable, charming Josh is particularly convincing. Gray is full of energy and confidence as Kate, and she's supported well by Janine DiVita as Kate's girlfriend, Anne. Anthony Rapp, reprising his Broadway role as Lucas, is strong in both timelines, one of which gets him a kind doctor boyfriend named David (Marc Delacruz). Lucas, in fact, probably has the most significant change depending on the timeline, and Rapp portrays these differences well. There's also a strong ensemble portraying various characters in support of both timelines.
Staging-wise, this show makes strong visual impression, but also somewhat generic. The set, designed by Mark Wendland, is a modular collection of beams, bridges, and modular set pieces that move about as needed, with a great use of projections designed by Peter Nigrini and Dan Scully, especially in the suggestion of moving Subway trains. The park setup is more "general park" than Central Park, really, and the costumes, by Emily Rebholz, are suitably New York-ish. It's a somewhat generalized version of New York that works for the show, but isn't particularly distinctive.
Overall, I would say If/Then is interesting and entertaining, although it tends to be a little confusing as well. It's not as brilliant or memorable as Next to Normal, but it's a good concept and generally well presented. Most of all, the great cast is what makes this show worth seeing. Your life probably won't change radically if you choose not to see it, but it if you do, it would be a good choice.
Tamyra Gray, Jackie Burns, Anthony Rapp and cast
The National Tour of If/Then runs at the Fox Theatre until March 27, 2016.
A "Beautiful" Celebration of a Legendary Artist at the Fox
Posted in St Louis Theatre, USA Theatre, tagged barry mann, beautiful the carole king musical, carole king, cynthia weil, douglas mcgrath, Fox Theatre, gerry goffin, marc bruni, review, st louis on February 26, 2016| Leave a Comment »
Beautiful, the Carole King Musical
Book by Douglas McGrath
Words and Music by Gerry Goffin and Carole King, Barry Mann and Cynthia Weil
Directed by Marc Bruni
Curt Bouril, Liam Tobin, Abby Mueller, Ben Fankhauser, Becky Gulsvig
Beautiful North American Tour
Carole King is a living legend. First as a songwriter and then as a singer-songwriter, she made a name for herself in the music industry with many memorable hits. Even today, many people who don't recognize her name will know her songs. Beautiful, The Carole King Musical tells the story of how she came to fame, as well as giving us a picture of the developing music scene in the 60s and 70s. The show was a big hit and is still running on Broadway, and now the North American Tour has brought this vibrant show to St. Louis, with an excellent cast and a whole lot of energy.
Although I'm generally skeptical of "jukebox" musicals, I had heard great things about this one, as well as comparisons to one of the best of this type of show, Jersey Boys. Beautiful has a lot in common with Jersey Boys, actually, in terms of its having a strong book telling the story of several important figures in the history of music. The tone is even more upbeat and optimistic, however, although it does cover some difficult times in King's life as well. King (Abbey Mueller) is obviously the central figure, but this isn't only her story. Her life entwines closely with that of her college sweetheart, songwriting partner, and eventual husband Gerry Goffin (Liam Tobin), as well as those of songwriting colleagues, friends, and friendly rivals Cynthia Weil (Becky Gulsvig) and Barry Mann (Ben Fankhauser). The story follows King from when she was still a teenager living with her mother, Genie Klein (Suzanne Grodner), to her early days as a songwriter for publisher Don Kirshner (Curt Bouril), to her heyday as part of a songwriting duo with Goffin, to marital struggles and changes in the country's musical tastes, and finally to her rise in fame as a singer, culminating in the release of her most famous album, Tapestry.
The story is told in generally linear format, after a small prologue scene set during King's Carnegie Hall concert that also ends the show. The story is punctuated with Goffin/King songs and Mann/Weil songs as well as a few other popular songs of the era. Groups like the Drifters, the Shirelles, and the Righteous Brothers are represented here as well, telling the story of King's career and rocky partnership with the charming but unpredictable Goffin. There's also a story of the developing relationship of Mann and Weil as a contrast to King and Goffin's tumultuous marriage. The song performances are a highlight, with famous hits such as "Will You Love Me Tomorrow" and "One Fine Day" given dramatic settings that serve to advance the plot as well as celebrate that period in music history. It's fascinating to watch as the songs are developed, and especially as King introduces some of her more well-known solo hits later in the show, such as "It's Too Late", "Beautiful", and an especially endearing staging of "You've Got a Friend".
The casting of King is essential, and Abby Mueller is an ideal choice for the role. With a voice remiscent of King's without sounding like an impression, and an engaging personality, warmth and energy, Mueller plays King's growth from a naive young aspiring songwriter to a more seasoned artist and performer extremely well. She carries the emotional weight of her personal story with admirable truth, as well. She's well-matched with Tobin as the charismatic, increasingly troubled Goffin. Gulsvig as Weil is a standout, with a strong voice and spunky personality, and Fankhouser is in excellent voice as Mann. There are also winning performances from Bouril as the supportive music publisher Kirshner, and Grodner as King's stubbornly devoted mother. There's a strong ensemble as well, playing a variety of roles from famous musical acts to session players and more.
The time and place, as well as the transition between the various periods of King's life, is evoked well by means of Derek McLane's versatile set, with set pieces that slide on and off stage as needed to represent King's various homes, the music publishing office, Carnegie Hall and beyond. There are also colorful, detailed costumes by Alejo Vietti, ranging from every day 50's, 60's and 70's fashions to the more glamorous, glitzy costumes of the various performers. The lighting by Peter Kaczorowski effectively sets the mood and scene, as well.
The formative years of popular music are well-represented in this energetic, well-constructed and impressively staged musical. It's about Carole King, and much of the show's appeal centers on Mueller's outstanding portrayal, but there's a lot more here as well. It's a story not only of music makers, but of the music itself, and the music is gloriously performed and presented. It's a brilliant celebration of the life and work of a well-known, much-lauded singer and songwriter.
Abby Mueller
The North American Tour of Beautiful, the Carole King Musical runs at the Fox Theatre until March 6, 2016.
"Wicked" at the Fox Casts an Entertaining Spell
Posted in St Louis Theatre, USA Theatre, tagged Fox Theatre, joe mantello, review, st louis, stephen schwartz, wayne cilento, wicked, wicked us national tour, winnie holzman on December 12, 2015| Leave a Comment »
Music and Lyrics by Stephen Schwartz, Book by Winnie Holzman
Based on the Novel by Gregory McGuire
Musical Staging by Wayne Cilento
Directed by Joe Mantello
Cast of Wicked
Wicked North American Tour
It seems like Wicked has become something more of a phenomenon than simply a musical. It's one of those shows that's so beloved and that has such a devoted following that it has essentially become "critic-proof". No matter what I or other reviewers say about the current touring production at the Fox, positive or negative, people will see it and love it. Still, it's my job to write what I think, and I think the current production is, for the most part, excellent.
Wicked is basically a revisionist take on The Wizard of Oz, focusing on the "good witch" Glinda (Amanda Jane Cooper) and the "Wicked Witch of the West", or as she is called here, Elphaba (Mary Kate Morrissey, standing in for principal Emily Koch). This story takes everything you think you know about the Oz story and turns it around, where the witches are given backstories and the villains aren't who you might think they are. In fact, both Elphaba and Glinda, although each has flaws, are portrayed as sympathetic college roommates, with Elphaba being the more misunderstood outcast (because she's green) and Glinda the more outgoing personality who is well-loved by her fellow students. After initial animosity demonstrated in the production number "What Is This Feeling?" an unlikely friendship is eventually formed, but the story doesn't end there. Presenting a unique twist on various Oz characters, we meet the cast of varying characters such as Elphaba's despondent sister Nessarose (Megan Masako Haley), who is obsessed with the Munchkin Boq (Sam Seferian), who is in turn infatuated with Glinda. There's also the self-absorbed prince Fiyero (Jake Boyd) who becomes involved with both Glinda and Elphaba. The story also involves something of a politcal plot that involves the illustrious Wizard himself (Stuart Zagnit) and the university's scheming headmistress, Madame Morrible (Wendy Worthington). Needless to say, there's a lot of plot, although the emphasis throughout is on the development of the Elphaba and Glinda characters and their growing and changing relationship.
I have to admit that, when it comes to this show, I'm in the "like it but don't love it" camp. It's an entertaining enough show, with some memorable music including the signature power ballads for Elphaba, "The Wizard and I" and "Defying Gravity" as well as the perky "Popular" for Glinda and some memorable production numbers like "What Is This Feeling" and "One Short Day". The best thing about the show is the developing friendship between the two main characters, and the way each character grows and changes. Still, there are some clunky lyrics and the dramatic tone changes a little too quickly once the characters get to the Emerald City, and the ending… Well, I won't spoil it, but I think it's not a little contrived. Wicked is a good show, but I don't think it's a great one, and I know some fans will passionately disagree with me about that.
Despite my personal opinion about the show itself, it's certainly a crowd-pleaser that resonates profoundly with its fans, and it can be extremely entertaining with some genuinely moving moments. As presented on tour, the production values are top-notch, with vibrant settings by Eugene Lee, colorful costumes by Susan Hilferty, spectacular lighting by Kenneth Posner and special effects by Chic Silber (including the spellbinding "Defying Gravity" sequence). It's all kind of Steampunk-ish with gears everywhere and mechanical devices like a giant dragon that surmounts the stage and the "bubble" in which Glinda arrives to start the show. It's all very stylish and extremely well-executed, except for the sound, which was so choppy at times that it was difficult to understand the words to the songs, especially in the production numbers in the first act. If I didn't already know the songs, I probably would have been at a loss. Otherwise, it's a well-presented show, with strong, dynamic staging that moves the story along well.
The cast is excellent as well. Cooper as Glinda was a standout for me, making her tour debut in St.Louis and doing an excellent job, portraying the character's bubbly energy well, but especially coming alive in the second act as her character matures and is called upon to display more leadership qualities. Morrissey, the stand-by for Elaphaba, is also excellent, with strong stage presence and a great voice for those big songs. Her chemistry with Cooper is excellent, as is that with the amiable Boyd in the somewhat underwritten role of Fiyero. There are also extremely strong performances from Zagnit as the conflicted Wizard and Worthington as the conniving Madame Morrible. There are fine performances all around, in fact, and an energetic ensemble that performs well in the show's production numbers.
Wicked is Wicked, simply stated. It's an entertaining show that offers an alternative take on the familiar Oz tale, and it's staged with energy and flair. As presented by the current North American touring company at the Fabulous Fox, this Wicked is a big, stylish, thoroughly enjoyable production.
The North American touring production of Wicked runs at the Fox Theatre until January 3, 2016.

redpajama_set_name: RedPajamaCommonCrawl


How to watch Horrid Henry: Series 3: Horrid Henry and the New Best Friend on Netflix Canada!
Yes, Horrid Henry: Series 3: Horrid Henry and the New Best Friend is now available on Canadian Netflix. It arrived for online streaming on January 10, 2019.
We'll keep checking Netflix Canada for Horrid Henry: Series 3: Horrid Henry and the New Best Friend, and this page will be updated with any changes.


I took a very serendipitous route to VOKRA…the universe was trying to tell me something. I first heard of VOKRA when I binge-watched the locally shot TV show Fringe and Googled lead actress Anna Torv. She was a foster to some very adorable VOKRA kittens and talked about them in interviews. Naturally my next step was to search for "VOKRA kittens", which led me to a gigantic cache of cute. I followed the kitten video trail until I found an article talking about VOKRA's new Operations Centre in East Van, which just happened to be a few blocks from my house. It was meant to be!
I think I was one of the first group of receptionists, as Ops had only been open for around 6 months when I started volunteering. We hadn't even taken over the space next door yet, which was a doggy daycare, although I'm sure they sensed the cats were going to win their territory when van-loads of mamas and babies started arriving. It all looked so organized and efficient, although co-founder Karen gave quite a laugh years later when I told her those initial impressions.
My main motivation for wanting to help rescue cats was how much of an impact my own kitty has had on my life. I was always an animal lover, but my parents were not cat people, to say the least. Even when I moved out on my own I wasn't able to take the leap. That changed when my partner and I adopted Minda. We found her through the SPCA and she was so sad and scared in her kennel that it broke my heart. She quickly became "my" kitty and I learned the joy of waking up to a cat cuddled on my stomach (I also learned the "joy" of being trained to dish out earlier and earlier breakfasts). When I developed health problems and couldn't participate in a lot of my former activities, Minda was there to purr beside me and keep me company. Not only is every cat worth saving, doing so may save a human as well. That's why my very favourite part of working the front desk is filing adoption papers, as each contract represents a wonderful new relationship forming.
I'm keeping it a secret from Minda, but other kitties have won my love as well. My very first "VOKRA crush" was sweet little Mei-Lei with her long coat and jaunty jackets. When she got injured and lost while in care I was among the many, many folks having a quiet heart attack desperately hoping she would be all right. I obviously have an "M" problem, because Meep was also very special to me around the same time. She would fall asleep in a blanket in my lap and she was around Ops for so long that we had a regular Saturday date to zone out after my shift before I went home.
Last summer I got to bottle-feed a kitten for the very first time, thanks to Little Dude. It's really an incredible feeling, I think I'm addicted now. Help! And of course, the kitties that are no longer with us like Stewart and Charlie. I was working my shift when Charlie first was surrendered by his family and got to see his pain and confusion turn to confidence and chattiness as he outlasted all predictions on how long he would be around. I miss you so much Charlie – every time I see those little dried fish I think of you.
My favourite memory of VOKRA itself is a night I spent at Ops in the days before we installed air conditioning. With the bay door open and warm summer air coming through, I got to witness all of the cats wake up from their after-supper naps and become the little lions that they are. Shy ferals came out of their hiding places and sleepy cats started to play recklessly with their toys. Kittens squeaked and pounced. It was like visiting the tiniest jungle and I feel honoured to have had an invite. Thank you so much, Karen and Maria, for creating a place where cats can be themselves and where we humans get to see them do so.
THANK YOU Monique!!! Your dedication to VOKRA and all the kitties is truly inspiring!


Web Clipping applications and how to interface those applications to Microsoft's Active Server Page framework.
Extending the AppForge Palm application using shared libraries and Active-X like components.
Programming Visual Basic for the Palm OS is the only book designed to help the Visual Basic desktop programmer to break into the Palm market. With Programming Visual Basic for the Palm OS, Visual Basic programmers can become Palm programmers almost over night.


MONTREAL -- Transport Minister Marc Garneau said he would board "without hesitation" the type of aircraft that crashed in the Ethiopian Airlines tragedy on Sunday, stressing his confidence in the new plane.
Garneau's remarks came minutes after a statement from the Air Canada Pilots Association that called on the minister "to take proactive action to ensure the safety of the Canadian travelling public."
The crash, which killed all 157 aboard the Boeing 737 Max 8 -- including 18 Canadians -- has raised concerns over parallels to a Lion Air crash of the same model of aircraft in Indonesia last October, killing 189 people.
Amid questions on continued Max 8 flights in Canada, Garneau warned against jumping to conclusions about the cause of the crash, telling reporters it could be one of "dozens of different possibilities."
"It was a sunny day, an experienced pilot, the plane was brand new. But we know little else," he said, noting flight recorders have been recovered.
"Flying in this country is one of the safest ways to travel. The statistics very, very clearly prove that."
Garneau said he has been in touch with U.S. Transportation Department Secretary Elaine Chao and is working with American aviation authorities to uncover the problem "and then take action."
Canada's major airlines have been inundated on social media with questions about the safety of their fleet in the wake of Sunday's fatal crash, which occurred after takeoff from Addis Ababa Bole International Airport.
Angie Hung, scheduled to take a WestJet flight June 5 from Calgary to Halifax en route to Scotland for a Spice Girls concert, was one of scores of Canadians asking airlines if they planned to ground the Max 8, the plane listed on her flight.
"I am planning to tweet, 'I love you Mom and Dad,"' she said in an interview, "in case something bad happens."
"If I could afford to cancel and change it, I would," said Hung, 42.
Fernando Candido, an Edmonton-based elementary school teacher, said he flies up to 10 times per year.
"I'm kind of worried. I'm sure eventually I'll have to use one of those planes," said Candido, 58. "Maybe in Canada they should not fly those planes any more until they figure out those issues."
Passenger rights advocate Gabor Lukacs said travellers aiming to change an already-booked flight have limited options.
"Passengers unfortunately do not have the right to cancel flights 1/8and receive compensation 3/8 based on subjective fears, even in the European Union, the gold standard for passenger rights," he said, pointing to the potential financial ramifications for companies and inconvenience to passengers.
The country's two largest airlines said they are confident in the safety of the Boeing 737 Max 8 and will continue to fly them.
"These aircraft have performed excellently from a safety, reliability and customer satisfaction perspective," Air Canada spokeswoman Isabelle Arthur said in an email. "We continue to operate our normal B737 schedule."
Air Canada said it has 24 Max 8 aircraft on routes that include Calgary to Vancouver and Montreal to Los Angeles.
WestJet Airlines Ltd. tweeted Monday that it is not grounding any of the 13 Max 8s in its fleet of 121 Boeing 737s.
"WestJet remains confident in the safety of our Boeing 737 fleet," spokeswoman Morgan Bell said in an email. The airline is "working with Boeing to ensure the continued safe operation of our Max fleet," she said.
The Calgary-based company has orders for 37 more 737s from the U.S.-based Boeing on the books.
Sunwing Airlines also has four 737 aircraft, according to civil aircraft registrations. The company did not respond to repeated requests for comment.
Until more is known about Sunday's disaster, safety experts cautioned against drawing too many comparisons with Lion Air Flight 610, which plunged into the Java Sea on Oct. 29.
The main similarities so far appear to be the aircraft model and the timing of the crash shortly after takeoff.
In November, Indonesia's National Transportation Safety Committee confirmed the plane's "angle-of-attack" sensors had malfunctioned and provided inaccurate data. The discovery prompted Boeing to issue a safety bulletin instructing crews on how to handle any erroneous data from the sensors on the Max 8.
The Boeing jetliner is relatively new, entering into service at Air Canada and WestJet in 2017.
Ethiopian Airlines as well as all Chinese and Indonesian airlines have grounded their Boeing 737 Max 8 planes indefinitely in the wake of the crash.
The unions for Air Canada and WestJet flight crews declined to comment on the crash of Ethiopian Airlines Flight 302.


STUDENT MATINEE DATES: September 27 and October 4. All student matinee performances start at 10 am.
The theatrical event of the season and Two River Theater's most ambitious musical to date, featuring a cast of 13 and full band. It's Pamela's birthday, and Aunt Louise is taking Pamela to her very first Broadway musical! Written by Tony Award and Pulitzer Prize-winner Wendy Wasserstein (adapted from her own children's book) and Tony and Obie Award-winner Christopher Durang, Pamela's First Musical captures the wonder of a child's first experience with the spectacular, whimsical, and splendiferous world of musical theater. The show features music and lyrics by Tony Award-winners Cy Coleman and David Zippel and choreography and direction by 10-time Tony Award nominee Graciela Daniele.


The Hispano Aviacion HA-200 "Saeta" ("Arrow") is one of the last designs fully developed by Willy Messerschmitt. It had its first flight on August, 12th 1955 in Sevilla.
50 years later I have been invited to do an air-air photo session with the only remaining airworthy HA-200 in Germany. It is part of the impressive collection of the "Messerschmitt Stiftung" and operated by EADS from their site in Manching.
The reason were some special markings that were applied to the aircraft remembering this anniversary and also a special guest has been invited to take a seat in the back of the "Saeta".
Prof. G. Madelung is the president of the board of trustees of the "Messerschmitt Stiftung" and was part of Willy Messerschmitt's team in Sevilla, that constructed this aircraft more than 50 years ago. Flying in it once again was an unforgettable experience for him, as it was for me as well to see this aircraft from the air.
This HA-200D was build in Sevilla in 1966 and was one of the last 55 aircraft constructed for the Spanish Air Force (Ejército del Aire). In the 2. Escuadron of Ala 46 it has been used mainly as a trainer with the number 462-67 on its fuselage. Still in its red/silver finish the aircraft was transferred to Las Palmas in 1970, but shortly afterwards it was used in the Spanish province "Spanish-Sahara" in Northern Africa, where it also received a new green/brown camouflage.
1976 it was transferred to ESC 214 of Ala 21 and got a new number, "214-67". Presumably the "Saeta" was flown there until 1982 when it was stored in Sevilla after 16 years of service. It was not until 12 later when it flew once again, still in camouflage but this time with a civil registration (EC-FVU).
To complete its collection in Manching the aircraft was bought by the Messerschmitt Stiftung in 1995 and transferred to its current homebase Manching, where it touched down on October 23rd, 1995. After a long period of rework and maintenance it took off on April, 29th 1998 for its second "first flight".
Even after 40 years the aircraft is still in an excellent conditions and flown on a regular basis with around 20-30 hours per year.
I would like to express my thanks to the Messerschmitt Stiftung and EADS for their support, Wolfgang Schirdewahn, chief test pilot EADS, and Horst Philipp for their excellent flying skills and everyone else who helped my during the preparation of this flight.


text:
Avant que l'ombre... à Bercy is the fourth live album by Mylène Farmer, released on 4 December 2006.

Background

Six years after her Mylenium Tour, Mylène Farmer came back on stage with a tour in 2006 which included 13 shows at Bercy, in Paris. This very successful series of concerts started on 13 January and ended 16 days later, on 29 January. As after each of her tour, Farmer decided to launch a live album retracing her concert. Thus, Jérome Devoise mixed the 20 songs performed on stage and the album "Avant que l'ombre... à Bercy" was eventually released on 4 December 2006 as CDs and DVDs, under various editions.

The album contains songs from all Farmer's studio albums, except Cendres de Lune and Innamoramento. The production enjoys very high quality in terms of sound effects. Some of the old hits were re-orchestred in a much modern version, while the slow songs from the last studio album are recorded in a more stripped style.

The various formats, particularly the DVD box, had huge success: the video was certified Diamond after a single week of release.

The two singles from this album, "Avant que l'ombre..." and "Déshabillez-moi", achieved a minor success in term of sales, but were both top ten hits in France.

Critical reception

This album was, on the whole, well received by media and contemporary pop music critics. Nicolas Gardon, in L'Echo Republicain, said that this album offers an "fair performance, but only a few surprises: the shimmering and coloured universe of Mylène Farmer is perfectly reproduced in this double CD. The release of this DVD was regarded as "the event of the week" by the magazine Télé Star.

Dvdrama qualifies the DVD as "sublime" video, specifying: "The image of this concert exceeds in all respects the nevertheless perfect image of the previous two already available concerts. The red and the black, the dominant colors, are staggering of beauty". On the other hand, it expressed some little criticisms on the quality of the sound.

Commercial performance

In France, the DVD was sold to 98,000 copies in its first week of release — what constitutes a record. On the French Videos Chart, it debuted at number 1 for four consecutive weeks and stayed in the top ten for 13 weeks. It managed to remain in the top 40 until 17 November 2007. Certified diamond, this DVD was, only 15 days after its release, the second best-selling video of 2006, just behind the musical Le Roi Soleil.

The CD was sold to 41,034 copies in the week of its release, and, as for the DVD, it went straight to number 1 on the French Albums Chart on 9 December 2006. However, it dropped to #8 the following week, stayed only for eight weeks in the top 50 and left the chart (Top 200) after its 18th week. So the DVD was preferred by the buyers. The album was nevertheless the 57th best-selling album of 2006 and totaled approximately 130,000 copies sold. It was certified Gold disc by the SNEP.

In Belgium Wallonia, the CD entered the album chart at #9 on 16 December 2006, and reached its peak position, #3, the week after. However, it dropped quickly then and stabilized in the last positions. It left the chart (Top 40) on 6 April 2007, after 12 weeks of attendance.
The DVD started directly to number 1 and kept this position for eight consecutive weeks. It stayed in the top ten for a total of 32 weeks. So, in Belgium too, the DVD was more sold than the CD.

The live CD was also charted in Switzerland, but had a moderate success in this country. It went to #20 on 17 December 2006 and reached its peak position, #18, the following week. After that, it kept on dropping and left the Top 100 after its 11 week.

Track listings

CD

 CD 1
 Introduction (5:30)
 "Peut-être toi" (3:27)
 "XXL" (5:27)
 "Dans les rues de Londres" (4:18)
 "California" (5:19)
 "Porno graphique" (4:13)
 "Sans contrefaçon" (4:46)
 "Q.I" (6:58)
 "C'est une belle journée" (8:21)
 "Ange, parle-moi" (4:50)
 "Redonne-moi" (5:44)

 CD 2
 "Rêver" (7:42)
 "L'Autre" (7:25)
 "Désenchantée" (6:42)
 "Nobody Knows" (5:36)
 "Je t'aime mélancolie" (4:53)
 "L'amour n'est rien..." (5:05)
 "Déshabillez-moi" (4:12)
 "Les Mots" (5:06)
 "Fuck Them All" (6:42)
 "Avant que l'ombre..." (7:26)

DVD

 Introduction (7:32)
 "Peut-être toi" (3:22)
 "XXL" (5:27)
 "Dans les rues de Londres" (4:16)
 "California" (5:15)
 "Porno graphique" (4:07)
 "Sans contrefaçon" (4:48)
 "Q.I" (6:50)
 "C'est une belle journée" (4:14)
 "Ange, parle-moi" (4:32)
 "Redonne-moi" (5:36)
 "Rêver" (7:41)
 "L'Autre" (7:25)
 "Désenchantée" (9:08)
 "Nobody Knows" (5:36)
 "Je t'aime mélancolie" (4:47)
 "L'amour n'est rien..." (4:59)
 "Déshabillez-moi" (3:54)
 "Les Mots" (5:05)
 "Fuck Them All" (8:18)
 "Avant que l'ombre..." (7:45)
 Générique de fin (3:56)

The second DVD contains several bonuses ("L'Ombre des autres", "Scene by scene views", "Works by Escalle", "Haute Couture", "Live Alternative"), and a hidden bonus: "La Cassar mobile".

Album charts

Weekly album charts

Year-end album charts

DVD charts

Weekly DVD charts

Year-end DVD charts

Certifications and sales

Credits

 Text: Mylène Farmer
Except: "Déshabillez-moi": Robert Nyel
 Music: Laurent Boutonnat
Except: "L'amour n'est rien...": Mylène Farmer and Laurent Boutonnat; "Déshabillez-moi": Gaby Verlor
 Editions: Requiem Publishing
Except: "Sans contrefaçon": Universal Music Publishing / BMG Music Publishing France; "Déshabillez-moi": Intersong
 Record label: Polydor
 Production: Stuffed Monkey
 Recorded and mixed by Jérôme Devoise, with Tristan Monrocq, at Studio Guillaume Tell
 Executive production: Paul Van Parys
 Mastering: André Perriat, at Top Master
 Management: Thierry Suc
 Photography: Claude Gassian
 Design: Henry Neu / Com' N.B

For more details about credits and personnel, see: Avant que l'ombre... à Bercy (tour).

Formats

 Audio
 Double CD
 Double CD — Collector
 Quadruple 7"
 Audio & Video
 Collector edition (2 CD + 2 DVD) - Limited edition (7,500)

 Video
 Double DVD
 Double DVD — Collector
 Blu-ray (since September 2008)

References

Mylène Farmer live albums
Mylène Farmer video albums
2006 video albums
Live video albums
2006 live albums
Polydor Records live albums
Polydor Records video albums

redpajama_set_name: RedPajamaWikipedia


His touch let's me know im wanted..
His touch leads me further to my destiny..
My head bow's as my knee's bend to His touch..
My will is given to Him to guide me to what i can only imagine will be wonderful as His touch.
I was empty and incomplete, but His touch i know will fill me, and the attention i crave He will offer me as i obey His touch.
As He shows kindness to my soul, body and mind.
His gentle touch is what gives me the peace i feel and joy and happiness i was missing.
I have freely given to him my gift of submission.


Slider's Son is a Midwest Book Award Winner!
Slider's Son is a Midwest Book Award Winner!
My novel Slider's Son has been published by North Star Press! Get it here.
Stay tuned for events near you!
Steph Borklund has completed the short film based on my novel Chasing AllieCat! It's being submitted to film festivals and contests. Stay tuned for news!


text:
import invariant from 'invariant'

import coerceSelection from './coerceSelection'
import defaultPropsDecorator from './defaultPropsDecorator'
import { isElement, isModifier } from './filterKeys'
import memoize from './memoize'
import { hoistModifierStylesRecursive, pickNestedStyles } from './pickStyles'
import type {
  ClassNamesT,
  DecoratorFuncT,
  KeysT,
  PropsT,
  SubstyleT,
} from './types'
import { compact, isPlainObject, keys, merge, values } from './utils'

const guessBaseClassName = (classNames: ?ClassNamesT): ?string => {
  // all class names must start with the same prefix: the component's base class name
  // which will finally go to the container element
  const firstKey = classNames && keys(classNames)[0]
  return firstKey && firstKey.split('__')[0].split('--')[0]
}

const deriveClassNames = (
  className: ?string,
  elementKeys: Array<string>,
  modifierKeys: Array<string>
): ?Array<string> => {
  // do not derive class names, if the user did not specify any class name
  if (!className) {
    return undefined
  }

  // derive class names based using the passed modifier/element keys
  const firstClassName = className.split(' ')[0]
  const derivedClassNames = [
    ...(elementKeys.length === 0
      ? modifierKeys.map(
          (key: string) => `${firstClassName}--${key.substring(1)}`
        )
      : []),
    ...elementKeys.map((key: string) => `${firstClassName}__${key}`),
  ]

  // also use the provided `className` if there is no sub-element selection
  return elementKeys.length === 0
    ? [className, ...derivedClassNames]
    : derivedClassNames
}

function createSubstyle(
  { style, className, classNames }: PropsT,
  propsDecorator: DecoratorFuncT = defaultPropsDecorator
): SubstyleT {
  const baseClassName =
    className || guessBaseClassName(classNames) || style?.className

  const substyle =
    typeof style === 'function'
      ? style
      : memoize((select: KeysT, defaultStyle?: Object) => {
          const selectedKeys = coerceSelection(select)

          invariant(
            Array.isArray(selectedKeys),
            'First parameter must be a string, an array of strings, ' +
              'a plain object with boolean values, or a falsy value.'
          )

          invariant(
            !defaultStyle || isPlainObject(defaultStyle),
            'Optional second parameter must be a plain object.'
          )

          const modifierKeys = selectedKeys.filter(isModifier)
          const elementKeys = selectedKeys.filter(isElement)

          const collectElementStyles =
            elementKeys.length > 0
              ? (fromStyle: Object) =>
                  values(pickNestedStyles(fromStyle, elementKeys))
              : (fromStyle: Object) => [fromStyle]

          const collectSelectedStyles = (fromStyle: Object = {}) => {
            return collectElementStyles(
              hoistModifierStylesRecursive(fromStyle, modifierKeys)
            )
          }

          const derivedClassNames = deriveClassNames(
            baseClassName,
            elementKeys,
            modifierKeys
          )

          return createSubstyle(
            {
              ...((style || defaultStyle) && {
                style: merge(
                  {},
                  ...collectSelectedStyles(defaultStyle),
                  ...collectSelectedStyles(style)
                ),
              }),

              ...(derivedClassNames && {
                className: derivedClassNames.join(' '),
              }),

              ...(classNames && { classNames }),
            },
            propsDecorator
          )
        })

  const styleProps = {
    ...(typeof style === 'function' ? style : { style }),
  }

  const classNameSplit = [
    ...new Set([
      ...(styleProps.className ? styleProps.className.split(' ') : []),
      ...(baseClassName ? baseClassName.split(' ') : []),
    ]),
  ]
  const mappedClassNames = classNames
    ? compact(
        classNameSplit.map(
          (singleClassName: string) => classNames[singleClassName]
        )
      )
    : classNameSplit

  const propsForSpread = propsDecorator({
    ...styleProps,
    ...(mappedClassNames.length > 0
      ? {
          className: mappedClassNames.join(' '),
        }
      : {}),
  })

  // assign `style`, `className`, and/or any props added by the decorator to the return function object
  Object.assign(substyle, propsForSpread)
  return substyle
}

export default createSubstyle


text:
UVM News Feeds
News from University Communications
A Note from Staff Council President Catherine Symans
By Catherine Symans
Greetings! The Runoff election, held on November 13 & 14 to determine if staff employees in the Administrative, Technical, and Specialist job families would be represented by a union, resulted in a strong turnout with very clear results. We are pleased to report that our efforts and those of many others had an impact on motivating those who were eligible to take part in this election. Throughout this process, Staff Council continued to fulfill its mission by working to keep all staff informed on the importance of voting. Staff Council has never taken a position on these organizing efforts because our organization is built upon the voice of staff and we have always wanted to respect the freedom of choice for all staff at UVM.
This experience has made it clear to me and many others that some staff at UVM feel that their voices are not heard nor respected. How we move forward is important because as a community, we have an opportunity to listen, collaborate, address, and resolve the issues that leave many feeling undervalued and unappreciated. As a community, we need to do more to encourage the building of relationships among students, staff, faculty, and the administration because we are all part of UVM and each of our individual actions contribute to the greatness of this institution. Staff Council will continue with the work it has done for over 40 years to serve as the voice and advocate of all staff at UVM since 1971.
Please know that I, along with the rest of Staff Council, welcome your comments, questions, concerns, input and feedback so that we can continue the great work that we do to make UVM a great place for staff. You can contact me directly or send an email to Staff.Council@uvm.edu
With the holiday season fast approaching, a wonderful way to build community relationships and get into the spirit of the holiday season is to attend the Staff Council's Annual Holiday Bazaar and Food Drive which will be held on Thursday, December 6th, 9:00 a.m. – 3:00 p.m. in the Davis Center Grand Maple Ballroom. This annual event is a wonderful example of staff coming together to recognize and celebrate the talents of our community while helping others.
Here's to a wonderful holiday season.
Catherine E. Symans
Staff Council President
Click below to learn about how Staff Council's Leadership has served UVM staff over the last month.
Staff Council President's Webpage
Staff Council Officers' Report
Got a question, concern, idea, or suggestion? Staff Council wants to hear them form you! Send us an email at Staff.Council@uvm.edu. Don't forget to follow us on Facebook and Twitter.


Ellen Matloff has one of the most unique stories in genetic counseling today. She worked at Yale to found the cancer counseling program in the early days of that discipline and was an early and highly visible voice in the battle against gene patenting. Eventually, her experience with the expanding presence of cancer susceptibility testing led her to found a business that attempts to provide a low-cost, scalable option to fill in the informational gaps for individuals who've had genetic testing.


text:
Eur J Appl Physiol. 2008 Apr;102(6):651-7. Epub 2007 Dec 11.
The effect of the Ramadan fast on physical performance and dietary habits in adolescent soccer players.
Meckel Y1, Ismaeel A, Eliakim A.
Life Science Department, The Zinman College for Physical Education and Sport Sciences, Wingate Institute, Netanya 42902, Israel. meckel@wincol.ac.il
The purpose of this study was to examine the effect of the Ramadan fast on performance capacities, dietary habits, and the daily behavioral patterns in adolescent (14-16-year-old) soccer players. Nineteen male players performed a series of fitness tests before and at the end of Ramadan fast. Caloric intake, physical activity pattern and sleep habits were evaluated during the week before the Ramadan fast and during the last week of the Ramadan fast. The fast resulted in a significant reduction in aerobic capacity [3,000 m run time (mean +/- SD): 812.8 +/- 73.3 s vs. 819.9 +/- 73.4 s, P < 0.001], speed endurance (Sum 6 x 40 m run time: 46.36 +/- 1.36 s vs. 46.73 +/- 1.31 s, P < 0.001, and performance decrement: 9.0 +/- 1.5% vs. 9.5 +/- 1.7%, P < 0.05), and jumping performance (44.8 +/- 4.5 cm vs. 44.0 +/- 4.5 cm, P < 0.05), but had no significant effect on sprint performance (7.38 +/- 0.25 s vs. 7.40 +/- 0.26 s, P = 0.20) or agility (4 x 10 m shuttle run time: 9.53 +/- 0.35 s vs. 9.55 +/- 0.37 s, P = 0.26). Daily intense physical activity was significantly reduced during Ramadan (6.4 +/- 0.2 h/week vs. 4.5 +/- 0.1 h/week, P < 0.005). There were no significant differences in total caloric intake (3,012 +/- 412 kcal/day vs. 3240 +/- 348 kcal/day, P = 0.39) or total daily sleeping hours (8.6 +/- 0.7 h/day vs. 8.6 +/- 0.5 h/day, P = 0.80) between Ramadan and a regular month. The results indicate that Ramadan fasting can lead to a significant decrease in athletic performance capacities. The decrease in performance does not necessarily relate to changes in caloric intake and sleeping hours during the fast.
Energy Intake/physiology
Fasting/physiology*
Feeding Behavior/physiology*
Motor Activity/physiology*
Physical Endurance/physiology
Sleep/physiology
Soccer/physiology*