text:
#include <algorithm>
#include <string.h>
#include "preflate_parameter_estimator.h"
#include "preflate_statistical_codec.h"
#include "preflate_statistical_model.h"
#include "support/array_helper.h"
#include "support/bit_helper.h"
#include <stdint.h>

template <unsigned N>
void PreflateSubModel<N>::build_impl(const unsigned* arr, const unsigned defval, const uint8_t prec) {
  if (N == 0) {
    isDefault = true;
    return;
  }
  for (unsigned i = 0; i < N; ++i) {
    ids[i] = i;
  }
  std::sort(ids, ids + N, [=](unsigned i1, unsigned i2) {
    if (arr[i1] != arr[i2]) {
      return arr[i1] < arr[i2];
    }
    return i1 < i2;
  });
  for (unsigned i = 0; i < N; ++i) {
    bounds[i] = arr[ids[i]];
    rids[ids[i]] = i;
  }
  unsigned sum = sumArray(bounds, N), acc, prev;
  prev = bounds[0];
  bounds[0] = acc = 0;
  for (unsigned i = 0; i < N; ++i) {
    if (prev) {
      acc += prev;
      prev = bounds[i + 1];
      int diff = (((uint64_t)acc) << 16) / sum - bounds[i];
      unsigned diff_bits = bitLength(diff);
      const unsigned k = 5;
      if (diff > 0 && diff_bits > k) {
        diff = diff & (((1 << k) - 1) << (diff_bits - k));
      }
      //        bounds[i + 1] = (((uint64_t)acc) << 16) / sum;
      bounds[i + 1] = bounds[i] + diff;
      if (bounds[i + 1] <= bounds[i]) {
        bounds[i + 1] = bounds[i] + 1;
      }
    } else {
      prev = bounds[i + 1];
      bounds[i + 1] = bounds[i];
    }
  }
  if (bounds[N] > 0) {
    bounds[N] = 1 << 16;
  }
  isDefault = N == 0 || bounds[N] == 0 || (bounds[N - 1] == 0 && ids[N - 1] == defval);

  build_scale_down();
}
template <unsigned N>
void PreflateSubModel<N>::buildDefault(const unsigned defval) {
  if (N == 0) {
    isDefault = true;
    return;
  }
  memset(bounds, 0, N * sizeof(unsigned));
  memset(scaledDownBounds, 0, N * sizeof(unsigned));
  bounds[N] = 0x10000;
  ids[N - 1] = defval;
  rids[defval] = N - 1;
  isDefault = true;
  build_scale_down();
}
template <unsigned N>
void PreflateSubModel<N>::build_scale_down() {
  unsigned boundBits = ~0xFFFFu; // Make sure that upper bits are all set, to limit the range of zeroJunk
  for (unsigned i = 0; i <= N; ++i) {
    boundBits |= bounds[i];
  }
  unsigned zeroJunk = bitTrailingZeroes(boundBits);
  scaleDownBits = (16 - zeroJunk);
  for (unsigned i = 0; i <= N; ++i) {
    scaledDownBounds[i] = bounds[i] >> zeroJunk;
  }

  isFixed = bounds[N - 1] == 0;

/*  for (unsigned i = 0; i <= N; ++i) {
    scaledDownBounds[i] = bounds[i];
  }
  scaleDownBits = 16;*/
}

static void encodeProb(ArithmeticEncoder& codec, const unsigned val) {
  unsigned bits = bitLength(val);
  // encode shift
  codec.encodeBits(bits - 1, 4);
  // and precision
  if (bits >= 5) {
    codec.encodeBits((val >> (bits - 5)) & 0xf, 4);
  } else {
    codec.encodeBits(val & ~(1 << (bits - 1)), bits - 1);
  }
}
static void encodeId(ArithmeticEncoder& codec,
              const unsigned id, const unsigned count) {
  unsigned bits = bitLength(count - 1);
  codec.encodeBits(id, bits);
}
static unsigned decodeProb(ArithmeticDecoder& codec) {
  // encode shift
  unsigned bits = codec.decodeBits(4) + 1;
  // and precision
  if (bits >= 5) {
    return (codec.decodeBits(4) | 0x10) << (bits - 5);
  } else {
    return codec.decodeBits(bits - 1) | (1 << (bits - 1));
  }
}
static unsigned decodeId(ArithmeticDecoder& codec, const unsigned count) {
  unsigned bits = bitLength(count - 1);
  return codec.decodeBits(bits);
}

template <unsigned N>
void PreflateSubModel<N>::write(ArithmeticEncoder& codec, const uint8_t) const {
  unsigned zeros = 0;
  for (unsigned i = 1; i < N; ++i) {
    if (!bounds[i]) {
      ++zeros;
    } else {
      break;
    }
  }
  codec.encodeBits(zeros, bitLength(N - 1));
  // Transmit values
  for (unsigned i = 1 + zeros; i < N; ++i) {
    encodeProb(codec, bounds[i] - bounds[i - 1]);
  }
  // Transmit ids
  for (unsigned i = zeros; i < N; ++i) {
    encodeId(codec, ids[i], N);
  }
}
template <unsigned N>
void PreflateSubModel<N>::read(ArithmeticDecoder& codec, const uint8_t) {
  unsigned zeros = codec.decodeBits(bitLength(N - 1));
  memset(bounds, 0, sizeof(bounds));
  // Transmit values
  for (unsigned i = 1 + zeros; i < N; ++i) {
    bounds[i] = decodeProb(codec) + bounds[i - 1];
  }
  bounds[N] = 1 << 16;
  // Transmit ids
  for (unsigned i = zeros; i < N; ++i) {
    ids[i] = decodeId(codec, N);
    rids[ids[i]] = i;
  }
  build_scale_down();
}

template <unsigned NEG, unsigned POS>
void PreflateCorrectionSubModel<NEG, POS>::build_impl(const unsigned* arr, const int defval, const uint8_t prec) {
  unsigned signArr[3] = {arr[NEG], sumArray(arr + NEG + 1, POS), sumArray(arr, NEG)};
  sign.build_impl(signArr, defval == 0 ? 0 : (defval > 0 ? 1 : 2), prec);
  unsigned posArr[POS + 1];
  for (unsigned i = 0; i < POS; ++i) {
    posArr[i] = arr[NEG + 1 + i];
  }
  pos.build_impl(posArr, defval > 0 && defval <= POS ? defval - 1 : POS - 1, prec);
  unsigned negArr[NEG + 1];
  for (unsigned i = 0; i < NEG; ++i) {
    negArr[i] = arr[NEG - 1 - i];
  }
  neg.build_impl(negArr, -defval > 0 && -defval <= NEG ? -defval - 1 : NEG - 1, prec);
  isDefault = sign.isDefault && pos.isDefault && neg.isDefault;
}

template <unsigned NEG, unsigned POS>
void PreflateCorrectionSubModel<NEG, POS>::buildDefault(const unsigned defval) {
  sign.buildDefault(defval == 0 ? 0 : (defval > 0 ? 1 : 2));
  pos.buildDefault(defval > 0 && defval <= POS ? defval - 1 : POS - 1);
  neg.buildDefault(-defval > 0 && -defval <= NEG ? -defval - 1 : NEG - 1);
  isDefault = sign.isDefault && pos.isDefault && neg.isDefault;
}
template <unsigned NEG, unsigned POS>
void PreflateCorrectionSubModel<NEG, POS>::write(ArithmeticEncoder& codec, const uint8_t prec) const {
  sign.write(codec, prec);
  if (POS > 0) {
    pos.write(codec, prec);
  }
  if (NEG > 0) {
    neg.write(codec, prec);
  }
}
template <unsigned NEG, unsigned POS>
void PreflateCorrectionSubModel<NEG, POS>::read(ArithmeticDecoder& codec, const uint8_t prec) {
  sign.read(codec, prec);
  if (POS > 0) {
    pos.read(codec, prec);
  }
  if (NEG > 0) {
    neg.read(codec, prec);
  }
}

// -------------------------------------

PreflateBaseModel::PreflateBaseModel()
  : encoder(nullptr), decoder(nullptr) {}

void PreflateBaseModel::setEncoderStream(ArithmeticEncoder* codec_) {
  encoder = codec_;
}
void PreflateBaseModel::setDecoderStream(ArithmeticDecoder* codec_) {
  decoder = codec_;
}

template <unsigned N>
void PreflateBaseModel::readSubModel(PreflateSubModel<N>& sm, const bool isFullDef, const PreflateModelCodec& cc,
                  const unsigned defVal, const uint8_t prec) {
  if (isFullDef || cc.nonDefaultValue.decode(*decoder) == 0) {
    sm.buildDefault(defVal);
  } else {
    sm.read(*decoder, prec);
  }
}

template <unsigned N, unsigned M>
void PreflateBaseModel::readSubModel(PreflateCorrectionSubModel<N, M>& sm, const bool isFullDef, const PreflateModelCodec& cc,
                  const unsigned defVal, const uint8_t prec) {
  if (isFullDef || cc.nonDefaultValue.decode(*decoder) == 0) {
    sm.buildDefault(defVal);
  } else {
    sm.read(*decoder, prec);
  }
}

template <unsigned N>
void PreflateBaseModel::writeSubModel(const PreflateSubModel<N>& sm, const bool isFullDef, const PreflateModelCodec& cc,
                   const unsigned defVal, const uint8_t prec) {
  if (isFullDef) {
    return;
  }
  bool ndef = !sm.isDefault;
  cc.nonDefaultValue.encode(*encoder, ndef);
  if (ndef) {
    sm.write(*encoder, prec);
  }
}

template <unsigned N, unsigned M>
void PreflateBaseModel::writeSubModel(const PreflateCorrectionSubModel<N, M>& sm, const bool isFullDef, const PreflateModelCodec& cc,
                   const unsigned defVal, const uint8_t prec) {
  if (isFullDef) {
    return;
  }
  bool ndef = !sm.isDefault;
  cc.nonDefaultValue.encode(*encoder, ndef);
  if (ndef) {
    sm.write(*encoder, prec);
  }
}

void PreflateBlockPredictionModel::read(const PreflateStatisticsCounter::BlockPrediction& blockModel, const PreflateModelCodec& cc) {
  blockType.build(blockModel.blockType, PreflateTokenBlock::DYNAMIC_HUFF, cc.MBprecision);
  EOBMisprediction.build(blockModel.EOBMisprediction, 0, cc.MBprecision);
  nonZeroPadding.build(blockModel.nonZeroPadding, 0, cc.MBprecisionP1);
}
void PreflateBlockPredictionModel::readFromStream(const PreflateModelCodec& cc) {
  readSubModel(blockType, cc.blockFullDefault, cc, PreflateTokenBlock::DYNAMIC_HUFF, cc.MBprecision);
  readSubModel(EOBMisprediction, cc.blockFullDefault, cc, 0, cc.MBprecision);
  readSubModel(nonZeroPadding, cc.blockFullDefault, cc, 0, cc.MBprecisionP1);
}
void PreflateBlockPredictionModel::writeToStream(const PreflateModelCodec& cc) {
  writeSubModel(blockType, cc.blockFullDefault, cc, PreflateTokenBlock::DYNAMIC_HUFF, cc.MBprecision);
  writeSubModel(EOBMisprediction, cc.blockFullDefault, cc, 0, cc.MBprecision);
  writeSubModel(nonZeroPadding, cc.blockFullDefault, cc, 0, cc.MBprecisionP1);
}

void PreflateTreeCodePredictionModel::read(const PreflateStatisticsCounter::TreeCodePrediction& treecodeModel, const PreflateModelCodec& cc) {
  TCCountMisprediction.build(treecodeModel.TCCountMisprediction, 0, cc.MBprecision);
  LCountMisprediction.build(treecodeModel.LCountMisprediction, 0, cc.MBprecision);
  DCountMisprediction.build(treecodeModel.DCountMisprediction, 0, cc.MBprecision);
  for (unsigned i = 0; i < 4; ++i) {
    LDTypeMisprediction[i].build(treecodeModel.LDTypeMisprediction[i], 0);
  }
  LDTypeReplacementBase.build(treecodeModel.LDTypeReplacement, 0);
  TCBitlengthCorrection.build(treecodeModel.TCBitlengthCorrection, 0);
  LDBitlengthCorrection.build(treecodeModel.LDBitlengthCorrection, 0);
  LDRepeatCountCorrection.build(treecodeModel.LDRepeatCountCorrection, 0);

  deriveLDTypeReplacement();
}
void PreflateTreeCodePredictionModel::readFromStream(const PreflateModelCodec& cc) {
  readSubModel(TCCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  readSubModel(LCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  readSubModel(DCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  for (unsigned i = 0; i < 4; ++i) {
    readSubModel(LDTypeMisprediction[i], cc.treecodeFullDefault, cc, 0);
  }
  readSubModel(LDTypeReplacementBase, cc.treecodeFullDefault, cc, 0);
  readSubModel(TCBitlengthCorrection, cc.treecodeFullDefault, cc, 0);
  readSubModel(LDBitlengthCorrection, cc.treecodeFullDefault, cc, 0);
  readSubModel(LDRepeatCountCorrection, cc.treecodeFullDefault, cc, 0);

  deriveLDTypeReplacement();
}
void PreflateTreeCodePredictionModel::writeToStream(const PreflateModelCodec& cc) {
  writeSubModel(TCCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  writeSubModel(LCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  writeSubModel(DCountMisprediction, cc.treecodeFullDefault, cc, 0, cc.MBprecision);
  for (unsigned i = 0; i < 4; ++i) {
    writeSubModel(LDTypeMisprediction[i], cc.treecodeFullDefault, cc, 0);
  }
  writeSubModel(LDTypeReplacementBase, cc.treecodeFullDefault, cc, 0);
  writeSubModel(TCBitlengthCorrection, cc.treecodeFullDefault, cc, 0);
  writeSubModel(LDBitlengthCorrection, cc.treecodeFullDefault, cc, 0);
  writeSubModel(LDRepeatCountCorrection, cc.treecodeFullDefault, cc, 0);
}
void PreflateTreeCodePredictionModel::deriveLDTypeReplacement() {
  unsigned arr[4], arr_mp[2], miss[4], hit[4], sumhit;
  LDTypeReplacementBase.extract(arr);
  for (unsigned i = 0; i < 4; ++i) {
    LDTypeMisprediction[i].extract(arr_mp);
    if (arr_mp[1] == 0) {
      DerivedLDTypeReplacement[i].buildDefault(i);
    } else {
      if (arr_mp[0] == 0) {
        arr_mp[1] = 1;
      }
      sumhit = 0;
      for (unsigned j = 0; j < 4; ++j) {
        hit[j] = arr[j] * arr_mp[0];
        miss[j] = arr[j] * arr_mp[1];
        sumhit += hit[j];
      }
      miss[i] = sumhit - hit[i];
      // Avoid the sum of all entries to exceed 32bit
      for (unsigned j = 0; j < 4; ++j) {
        if (miss[j] > 0 && miss[j] < 16) {
          miss[j] = 1;
        } else {
          miss[j] >>= 4;
        }
      }
      DerivedLDTypeReplacement[i].build(miss, i);
    }
  }
}

void PreflateTokenPredictionModel::read(const PreflateStatisticsCounter::TokenPrediction& tokenModel, const PreflateModelCodec& cc) {
  LITMisprediction.build(tokenModel.LITMisprediction, 0);
  REFMisprediction.build(tokenModel.REFMisprediction, 0);
  LENCorrection.build(tokenModel.LENCorrection, 0);
  DISTAfterLenCorrection.build(tokenModel.DISTAfterLenCorrection, 0);
  DISTOnlyCorrection.build(tokenModel.DISTOnlyCorrection, 0);
  IrregularLen258Encoding.build(tokenModel.LEN258IrregularEncoding, 0);
}
void PreflateTokenPredictionModel::readFromStream(const PreflateModelCodec& cc) {
  readSubModel(LITMisprediction, cc.tokenFullDefault, cc, 0);
  readSubModel(REFMisprediction, cc.tokenFullDefault, cc, 0);
  readSubModel(LENCorrection, cc.tokenFullDefault, cc, 0);
  readSubModel(DISTAfterLenCorrection, cc.tokenFullDefault, cc, 0);
  readSubModel(DISTOnlyCorrection, cc.tokenFullDefault, cc, 0);
  readSubModel(IrregularLen258Encoding, cc.tokenFullDefault, cc, 0);
}
void PreflateTokenPredictionModel::writeToStream(const PreflateModelCodec& cc) {
  writeSubModel(LITMisprediction, cc.tokenFullDefault, cc, 0);
  writeSubModel(REFMisprediction, cc.tokenFullDefault, cc, 0);
  writeSubModel(LENCorrection, cc.tokenFullDefault, cc, 0);
  writeSubModel(DISTAfterLenCorrection, cc.tokenFullDefault, cc, 0);
  writeSubModel(DISTOnlyCorrection, cc.tokenFullDefault, cc, 0);
  writeSubModel(IrregularLen258Encoding, cc.tokenFullDefault, cc, 0);
}

PreflatePredictionModel::PreflatePredictionModel() {}
PreflatePredictionModel::~PreflatePredictionModel() {}

void PreflatePredictionModel::read(const PreflateStatisticsCounter& model, const PreflateModelCodec& cc) {
  block.read(model.block, cc);
  treecode.read(model.treecode, cc);
  token.read(model.token, cc);
}
void PreflatePredictionModel::setEncoderStream(ArithmeticEncoder* codec) {
  block.setEncoderStream(codec);
  treecode.setEncoderStream(codec);
  token.setEncoderStream(codec);
}
void PreflatePredictionModel::setDecoderStream(ArithmeticDecoder* codec) {
  block.setDecoderStream(codec);
  treecode.setDecoderStream(codec);
  token.setDecoderStream(codec);
}
void PreflatePredictionModel::readFromStream(const PreflateModelCodec& cc) {
  block.readFromStream(cc);
  treecode.readFromStream(cc);
  token.readFromStream(cc);
}
void PreflatePredictionModel::writeToStream(const PreflateModelCodec& cc) {
  block.writeToStream(cc);
  treecode.writeToStream(cc);
  token.writeToStream(cc);
}

// ------------------------------------

PreflateModelCodec::PreflateModelCodec() {}
void PreflateModelCodec::initDefault() {
  blockFullDefault = true;
  treecodeFullDefault = true;
  tokenFullDefault = true;
  totalModels = 0;
  defaultingModels = 0;

  unsigned arr[2] = {1, 0};
  nonDefaultValue.build(arr, 0);

  MBprecision = 16;
  MBprecisionP1 = 16;
}

void PreflateModelCodec::read(const PreflateStatisticsCounter& m) {
  totalModels = 0;
  defaultingModels = 0;
  unsigned total_block = m.block.totalModels();
  unsigned defaulting_block = m.block.checkDefaultModels();
  blockFullDefault = total_block == defaulting_block;
  if (!blockFullDefault) {
    totalModels += total_block;
    defaultingModels += defaulting_block;
  }

  unsigned total_tree = m.treecode.totalModels();
  unsigned defaulting_tree = m.treecode.checkDefaultModels();
  treecodeFullDefault = total_tree == defaulting_tree;
  if (!treecodeFullDefault) {
    totalModels += total_tree;
    defaultingModels += defaulting_tree;
  }

  unsigned total_token = m.token.totalModels();
  unsigned defaulting_token = m.token.checkDefaultModels();
  tokenFullDefault = total_token == defaulting_token;
  if (!tokenFullDefault) {
    totalModels += total_token;
    defaultingModels += defaulting_token;
  }

  if (totalModels > 0) {
    unsigned arr[2] = {defaultingModels, totalModels - defaultingModels};
    nonDefaultValue.build(arr, 0);
  }
  MBprecision   = 16;
  MBprecisionP1 = 16;
}

void PreflateModelCodec::readFromStream(ArithmeticDecoder& codec) {
  blockFullDefault = codec.decodeBits(1);
  treecodeFullDefault = codec.decodeBits(1);
  tokenFullDefault = codec.decodeBits(1);
  totalModels = 0;
  if (!blockFullDefault) {
    totalModels += PreflateStatisticsCounter::BlockPrediction::totalModels();
  }
  if (!treecodeFullDefault) {
    totalModels += PreflateStatisticsCounter::TreeCodePrediction::totalModels();
  }
  if (!tokenFullDefault) {
    totalModels += PreflateStatisticsCounter::TokenPrediction::totalModels();
  }
  defaultingModels = PreflateBaseModel::decodeValue(codec, bitLength(totalModels));

  if (totalModels) {
    unsigned arr[2] = {defaultingModels, totalModels - defaultingModels};
    nonDefaultValue.build(arr, 0);
  }
  MBprecision = 16;
  MBprecisionP1 = 16;
}
void PreflateModelCodec::writeToStream(ArithmeticEncoder& codec) {
  codec.encodeBits(blockFullDefault, 1);
  codec.encodeBits(treecodeFullDefault, 1);
  codec.encodeBits(tokenFullDefault, 1);
  codec.encodeBits(defaultingModels, bitLength(totalModels));
}

// ------------------------------------

PreflatePredictionEncoder::PreflatePredictionEncoder()
  : storage(nullptr)
  , bos(nullptr)
  , encoder(nullptr)
{}

void PreflatePredictionEncoder::start(const PreflatePredictionModel& model_, const PreflateParameters& params_,
                                      const unsigned modelId_) {
  PreflatePredictionModel::operator =(model_);
  params = params_;
  modelid = modelId_;

  storage = new MemStream;
  bos = new BitOutputStream(*storage);
  encoder = new ArithmeticEncoder(*bos);
  setEncoderStream(encoder);
}
std::vector<uint8_t> PreflatePredictionEncoder::end() {
  setEncoderStream(nullptr);
  encoder->flush();
  delete encoder;

  bos->flush();
  delete bos;

  std::vector<unsigned char> result = storage->extractData();
  delete storage;
  return result;
}

PreflatePredictionDecoder::PreflatePredictionDecoder()
  : storage(nullptr)
  , bis(nullptr)
  , decoder(nullptr) {}

void PreflatePredictionDecoder::start(const PreflatePredictionModel& model_, const PreflateParameters& params_,
                                      const std::vector<uint8_t>& storage_, size_t off0, size_t size) {
  PreflatePredictionModel::operator =(model_);
  params = params_;
  storage = new MemStream(storage_, off0, size);
  bis = new BitInputStream(*storage);
  decoder = new ArithmeticDecoder(*bis);
  setDecoderStream(decoder);
}
void PreflatePredictionDecoder::end() {
  setDecoderStream(nullptr);
  delete decoder;
  delete bis;
  delete storage;
  decoder = nullptr;
  bis = nullptr;
  storage = nullptr;
}

// ------------------------------------

PreflateMetaEncoder::PreflateMetaEncoder()
  : inError(false) {
}
PreflateMetaEncoder::~PreflateMetaEncoder() {}

unsigned PreflateMetaEncoder::addModel(const PreflateStatisticsCounter& counter, const PreflateParameters& params) {
  unsigned modelId = modelList.size();
  modelType m;
  m.counter = counter;
  m.mcodec.read(counter);
  m.model.read(counter, m.mcodec);
  m.params = params;
  m.writtenId = 0;
  modelList.push_back(m);
  return modelId;
}

bool PreflateMetaEncoder::beginMetaBlockWithModel(PreflatePredictionEncoder& encoder, const unsigned modelId) {
  if (modelId >= modelList.size()) {
    return false;
  }
  encoder.start(modelList[modelId].model, modelList[modelId].params, modelId);
  return true;
}
bool PreflateMetaEncoder::endMetaBlock(PreflatePredictionEncoder& encoder, const size_t uncompressed) {
  if (encoder.modelId() >= modelList.size()) {
    return false;
  }
  metaBlockInfo m;
  std::vector<uint8_t> result = encoder.end();
  m.modelId = encoder.modelId();
  m.reconSize = result.size();
  m.uncompressedSize = uncompressed;
  blockList.push_back(m);
  reconData.insert(reconData.end(), result.begin(), result.end());
  return true;
}
std::vector<unsigned char> PreflateMetaEncoder::finish() {
  MemStream mem;
  BitOutputStream bos(mem);
  bos.put(0, 1); // no extension used
  bos.put(blockList.size() > 1, 1); // 1 or more meta blocks
  if (blockList.size() > 1) {
    bos.putVLI(blockList.size() - 2);
  }
  enum Mode {
    CREATE_NEW_MODEL /*, REUSE_LAST_MODEL, REUSE_PREVIOUS_MODEL*/
  };
  for (unsigned i = 0, n = blockList.size(); i < n; ++i) {
    const metaBlockInfo& mb = blockList[i];
    Mode mode = CREATE_NEW_MODEL;

    if (i > 0) {
      bos.put(3, 2); // create new model
    }

    switch (mode) {
    case CREATE_NEW_MODEL:
    {
      modelType& mt = modelList[mb.modelId];
      bool perfectZLIB = mt.mcodec.blockFullDefault && mt.mcodec.treecodeFullDefault && mt.mcodec.tokenFullDefault
        && mt.params.zlibCompatible;
      bos.put(!perfectZLIB, 1); // perfect zlib model
      bos.put(mt.params.compLevel, 4);
      bos.put(mt.params.memLevel, 4);
      bos.put(mt.params.windowBits - 8, 3);
      if (!perfectZLIB) {
        bos.put(mt.params.zlibCompatible, 1);
        if (!mt.params.zlibCompatible) {
          bos.put(mt.params.veryFarMatchesDetected, 1);
          bos.put(mt.params.matchesToStartDetected, 1);
        }
        bos.put(mt.params.log2OfMaxChainDepthM1, 4);
        MemStream tmp_data;
        {
          BitOutputStream tmp_bos(tmp_data);
          ArithmeticEncoder tmp_codec(tmp_bos);
          mt.mcodec.writeToStream(tmp_codec);
          mt.model.setEncoderStream(&tmp_codec);
          mt.model.writeToStream(mt.mcodec);
          mt.model.setEncoderStream(nullptr);
          tmp_codec.flush();
          tmp_bos.flush();
        }
        std::vector<uint8_t> tmp_res = tmp_data.extractData();
        // write length (vli) and model data
        bos.putVLI(tmp_res.size());
        bos.putBytes(tmp_res.data(), tmp_res.size());
      }
      break;
    }
    }
    // for the last block, the size of the reconstruction data and processed uncompressed data
    // is implicitly going to end of stream
    // -------------------
    if (i != n - 1) {
      bos.putVLI(mb.reconSize);
      bos.putVLI(mb.uncompressedSize);
    }
  }
  bos.flush();
  std::vector<uint8_t> result = mem.extractData();
  result.insert(result.end(), reconData.begin(), reconData.end());
  return result;
}

PreflateMetaDecoder::PreflateMetaDecoder(const std::vector<uint8_t>& reconData_, const uint64_t uncompressedSize_)
  : inError(false)
  , reconData(reconData_)
  , uncompressedSize(uncompressedSize_) {
  if (reconData.size() == 0) {
    inError = true;
    return;
  }
  MemStream mem(reconData);
  BitInputStream bis(mem);
  bool extension = bis.get(1);
  if (extension) {
    inError = true;
    return;
  }
  bool singleBlock = bis.get(1) == 0;
  size_t blockCount;
  if (singleBlock) {
    blockCount = 1;
  } else {
    blockCount = 2 + bis.getVLI();
  }
  enum Mode {
    CREATE_NEW_MODEL /*, REUSE_LAST_MODEL, REUSE_PREVIOUS_MODEL*/
  };
  for (size_t i = 0; i < blockCount; ++i) {
    metaBlockInfo mb;
    Mode mode = CREATE_NEW_MODEL;

    if (i > 0) {
      if (bis.get(2) != 3) { // must create new model for the moment
        inError = true;
        return;
      }
    }

    switch (mode) {
    case CREATE_NEW_MODEL:
    {
      modelType mt;
      memset(&mt, 0, sizeof(mt));
      bool perfectZLIB = bis.get(1) == 0;
      mt.params.compLevel = bis.get(4);
      mt.params.memLevel = bis.get(4);
      mt.params.windowBits = bis.get(3) + 8;
      if (perfectZLIB) {
        mt.params.zlibCompatible = true;
        mt.mcodec.blockFullDefault = true;
        mt.mcodec.treecodeFullDefault = true;
        mt.mcodec.tokenFullDefault = true;
        mt.model.readFromStream(mt.mcodec); // initialize with default model
      } else {
        mt.params.zlibCompatible = bis.get(1);
        if (!mt.params.zlibCompatible) {
          mt.params.veryFarMatchesDetected = bis.get(1);
          mt.params.matchesToStartDetected = bis.get(1);
        }
        mt.params.log2OfMaxChainDepthM1 = bis.get(4);
        // read length (vli) and model data
        size_t res_size = bis.getVLI();
        // interpret model data
        {
          MemStream tmp_mem;
          bis.copyBytesTo(tmp_mem, res_size);
          tmp_mem.seek(0);
          BitInputStream tmp_bis(tmp_mem);
          ArithmeticDecoder tmp_codec(tmp_bis);
          mt.mcodec.readFromStream(tmp_codec);
          mt.model.setDecoderStream(&tmp_codec);
          mt.model.readFromStream(mt.mcodec);
          mt.model.setDecoderStream(nullptr);
        }
      }
      mb.modelId = modelList.size();
      modelList.push_back(mt);
      break;
    }
    }
    // for the last block, the size of the reconstruction data and processed uncompressed data
    // is implicitly going to end of stream
    // -------------------
    if (i != blockCount - 1) {
      mb.reconSize = bis.getVLI();
      mb.uncompressedSize = bis.getVLI();
    }
    blockList.push_back(mb);
  }
  bis.skipToByte();

  size_t reconStart = bis.bitPos() >> 3;
  uint64_t uncStart = 0;
  for (size_t i = 0; i < blockCount; ++i) {
    blockList[i].reconStartOfs = reconStart;
    blockList[i].uncompressedStartOfs = uncStart;
    if (i != blockCount - 1) {
      reconStart += blockList[i].reconSize;
      uncStart += blockList[i].uncompressedSize;
      if (reconStart > reconData.size() || uncStart > uncompressedSize) {
        inError = true;
        return;
      }
    } else {
      blockList[i].reconSize = reconData.size() - blockList[i].reconStartOfs;
      blockList[i].uncompressedSize = uncompressedSize - blockList[i].uncompressedStartOfs;
    }
  }
}
PreflateMetaDecoder::~PreflateMetaDecoder() {}

bool PreflateMetaDecoder::beginMetaBlock(PreflatePredictionDecoder& decoder, PreflateParameters& params, const size_t index) {
  if (index >= blockList.size()) {
    return false;
  }
  const auto& mb = blockList[index];
  if (mb.modelId >= modelList.size()) {
    return false;
  }
  const auto& model = modelList[mb.modelId];
  params = model.params;
  decoder.start(model.model, model.params, reconData, mb.reconStartOfs, mb.reconSize);
  return true;
}
bool PreflateMetaDecoder::endMetaBlock(PreflatePredictionDecoder& decoder) {
  decoder.end();
  return true;
}
void PreflateMetaDecoder::finish() {}


HealthDay News — Children born to mothers who gain either too much or too little weight during their pregnancy are more likely to be overweight or obese, according to a study published in the American Journal of Obstetrics & Gynecology.
After looking at medical records of children aged 2 to 5 years born to more than 4,100 patients in California, Sneha B. Sridhar, MPH and colleagues found that patients who gained less than the recommended weight during pregnancy were 63% more likely to have an overweight or obese child.
More than 20% of children aged 2 to 5 years whose mothers gained more than the recommended amount of weight during pregnancy were overweight or obese, compared with 14.5% of those whose mothers gained weight within the recommended guidelines.
The risk of having an overweight or obese child was 80% higher among patients who gained more than the recommended amount of weight during their pregnancy.
"Gestational weight gain had a greater impact on childhood overweight/obesity among normal-weight women, suggesting that the effect may be independent of genetic predictors of obesity," wrote the researchers.


text:
All Organisations subcategories:
* Art
Committee for a Workers International
Left and radical
Nationalist and National Liberation
Pro capitalist and Imperialist
Voluntary & non-profit
Art keywords:
National Gallery (27)
National Museum of Wales (5)
From: The Socialist issue 1014, 17 October 2018: ToriesÂ' Brexit bust-up - general Election Now
Search site for keywords: Spain - Women - Strike - Government - Oppression - Feminist - Sexism - Rape - Education - Schools - Student - General strike - Catholic - Church - CWI - Violence against women
Libres y Combativas: striking for women's rights in the Spanish state
On 8 March 2018 - International Women's Day - an unprecedented strike against sexism and women's oppression took place across the Spanish state. The socialist-feminist organisation Libres y Combativas played a central role in organising and mobilising for this event. Now, the campaign is building for a new student strike against sexism in education to take place on 14 November. The Socialist spoke to Ana Garcia, an activist in Libres y Combativas and the general secretary of the Sindicato de Estudiantes (student union).
Women marching with the 'Libres y Combativas' campaign in Spain, photo Libres y Combativas (Click to enlarge)
Why did you set up Libres y Combativas and what makes it different to other campaigns or organisations set up to support women's rights?
Libres y Combativas is a socialist-feminist platform that was launched by the Sindicato de Estudiantes (SE), along with Izquierda Revolucionaria (IR - the CWI in the Spanish state). We launched the organisation as a response to the effects of capitalist crisis, particularly on young and working-class women.
Here, as in many other countries all over the world, the fight against the oppression of women is becoming a more and more important arena of struggle against the capitalist system.
The issue of sexism is among those prompting millions of people to wake up to politics - to the need to take action. What's more, young and working-class women are increasingly drawing the conclusion that it is the capitalist system which perpetuates sexism.
Within the movement for women's rights here in the Spanish state there are different debates ongoing. These have included discussion on the question of whether the fight against women's oppression is a task for women alone. We defend the idea that this is not just an issue for women but for the whole of the working class.
Of course, working-class women should take a lead in this struggle. But for us it is a class issue. Women are oppressed because they are workers as well as because of their gender. That's why we know this is not a task for every woman, but for the working class majority.
Female bankers who order evictions of poor single women, female owners of big companies who implement lower wages for women and fire women when they're pregnant, or female right-wing politicians who defend cuts in education and health care and who say abortion is murder: those women are not welcome at our protests.
On the other hand, working-class men, who fight on the same issues we do, are very welcome in this struggle. We need our male comrades on our side to defeat the system that promotes the oppression of women.
What kind of action has the campaign taken so far - what has it been able to achieve?
Libres y Combativas is composed of workers and young women. Its main strength is among young women. We have been taking part in movements which already existed.
But we make an important contribution to these movements by offering an anti-capitalist pers-pective and socialist ideas to solve the problems faced by women.
At the moment, there is a very angry mood about aspects of women's oppression which are being newly revealed and brought to light.
For example, a lot of capitalist institutions - including the government and the justice system - are in a state of crisis. Their reactionary character is being exposed.
Recently there have been several court cases involving rape and violence against women in which reactionary judgements were made. These have included judges blaming the victims.
This has highlighted that women's oppression is not 'natural' or 'inevitable'. It is governments who make reactionary laws, who implement cuts which often hit working-class women hardest.
It is the Francoist justice system which routinely blames women for their own experiences of rape and sexual violence.
One of our first and most significant actions was on 8 March this year, International Women's Day. This day marked a real explosion against the reactionary Partido Popular (PP) government.
This strike was a shout against all of the right-wing politicians - against the sexist justice system as well. But the 8 March general strike was not the only action.
SE organised several strikes, including one responding when five alleged gang rapists walked free following a very prominent court case. The response to this case had some of the characteristics of an explosion. Hundreds of thousands took to the streets.
The action was not only about showing solidarity with the victims of rape, but also about denouncing the kind of 'justice' offered by capitalism: 'justice' which effectively punishes women, essentially putting them on trial for reporting the violence they have suffered.
You've recently called for another strike to take place in November. I know that since the last strike in March, the government of Spain has changed. Now you have a government led by Pedro Sanchez and the so-called socialists of PSOE. Is the new government attempting to pose as feminist? Is there still a mood to come out and protest?
The PSOE government's main aim is to maintain social peace - to dampen the outbreaks of mass struggle that have rocked the Spanish state in the last period. They are giving a lot of speeches about women's rights, about the historic memory of people who were killed under the dictatorship, and so on. But they are not doing anything about the issues we face.
So the purpose of the strike we have called in November is to kick sexism out of schools. We argue that education should be used to help combat sexism and LGBT+phobia.
This raises the need for the restoration of funding taken from the public education system in the last years of austerity.
It also requires opposing the large amount of public money which is currently given to the Catholic Church to teach religion and to spread reactionary, sexist, homophobic and transphobic ideas within schools.
We are demanding the introduction of sex education in schools in order to counter sexual harassement and rape culture, and to help make young people feel free to be who they want to be - not to be bullied, not to be judged and not to be punished, as happens right now.
We are also fighting against sexist dress codes in schools. In particular, during the summer months when the weather is very hot, women are often forbidden from wearing appropriate clothes. Often students are asked to go home and change.
The argument used is that our clothes are a provocation. But our clothes don't provoke anything! This is an echo of the sexist arguments used against women in the justice system when they report experiences of rape and abuse.
We are saying to the government - if you say you oppose sexism, what are you going to do about it? PSOE like to call themselves "the feminist government" because they have more female ministers. But they have so far done nothing to change the situation for working-class women.
So you recently won a battle to call a strike on 8 March - on the next International Women's Day...
It wasn't only our victory. It was a victory of the working-class part of the women's movement which is by far the majority of people who have been in the streets demanding the end of our oppression.
There has been pressure coming from the supporters of the new government within the women's movement to 'keep social peace' and not mobilise to fight for our demands. The capitalist class is desperate to maintain the relative stability that the first few months of this new government has provided.
But we have not kicked out Rajoy's PP government only to remain in the same situation. Precisely now is the moment to go one step forward - not one step back!
So Libres y Combativas attended the '8M commission' - the open assembly set up to organise action for International Women's Day. We argued that there should be a general feminist strike - a strike by people of all genders to fight for women's rights - and that we should be exposing the hypocrisy of this new 'feminist government', demanding real changes.
We emphasised that even if it is a feminist strike this should not just be a strike of women. We want to stop everything! The whole economy! Challenge the big owners, bankers, political representatives who implement our oppression in every sense! For that, we need our male comrades to support our strike and to stop working too.
Our arguments made a big impact. The commission voted that there would be another general strike on 8 March.
This doesn't exclude further attempts to 'soften' this call by those whose priority is the maintenance of social peace. But the mood of the movement is so strong that I believe there is little question that it will go ahead on an equal or possibly even greater scale to last year.

redpajama_set_name: RedPajamaCommonCrawl


text:
The Meadowlark Blue Heron
This Bird Can Sing
Review by Wayne Donnelly
Fate has been kind to this reviewer recently, especially in the loudspeaker department. Just as I finished with the excellent Von Schweikert dB-100s, reviewed in December 2001, waiting in the wings (well, actually in my upstairs second system, breaking in) were the Blue Herons. Apart from the mighty Nightingale, with its active subwoofer system and $22,500 price tag, the BH is the big bird in the Meadowlark aviary. I have long admired Meadowlark loudspeakers for their musicality, rational design and attention to quality, and I happily use the company's smallest floorstanders, the Kestrel Hot Rods, in my smaller second system. Needless to say, I was eager to hear what Meadowlark honcho and designer Pat McGinty could do at a bigger price point. The Blue Herons retail for $8,800/pair in standard finishes. The review pair sported gorgeous Birdseye Maple veneer, one of several premium veneers for which there is an upcharge. (See their web site for details.)
The Blue Heron listening experience was not instant nirvana. McGinty had warned me that the BH takes a long time -- in excess of 200 hours -- to break in fully, and I think he was being optimistic. I had been playing the review pair for more than a month in my second system -- albeit at pretty low volume most of the time -- before installing them in the big system. They still sounded pretty stiff. Their potential was already clearly audible, with impressive detail, dynamics and extension, both high and low frequency. And it was impossible not to notice the loudspeakers' sheer speed and transient precision. So I commenced playing the system all day, cranking it up high when going out, and tried to keep from prematurely donning my reviewer's hat before the sound coalesced.
That break-in interval turned out to be another six weeks. It was not that the loudspeakers were hard to listen to-- far from it. Even at the beginning of the process they were better than a number of similar or higher-priced loudspeakers I have heard. But I kept waiting to hear the easy authority, the relaxed musical presentation that would leave me thinking not about the speakers per se, but about the music. And, gradually, the BHs got there. The break-in sequence progressed from high to low frequencies. The tweeter opened up noticeably in just a few days, and within a couple of weeks the midrange began to develop the kind of involving resolution I expected. The twin bass drivers took the longest to reach their full potential. But after about three weeks, their impact and extension seemed to be improving by increments virtually day to day.
I have belabored the break-in time not as a criticism, but as a caution to the prospective buyer. If you listen to a properly broken in pair of BHs at a store, you are going to notice that the new pair you bring home will not sound as good. Do not be discouraged if they take quite a while to get there. The reason, I believe, is that the rugged high-quality components -- drivers, crossover capacitors and resistors, internal wiring -- used in the BHs need more break-in than many cheaper components. So the extended break-in time augurs well for long-term trouble-free listening.
Anatomy Of A Blue Heron
First the drivers... Starting at the bottom, the BH uses two Scan Speak carbon graphite seven-inch woofers in a transmission line loading. The use of two smaller drivers rather than a single large one helps to achieve excellent speed, dynamics and articulation through the bass and lower midrange. Meadowlark claims very fast rise and subtle times for the bass system, and my listening unequivocally confirms that claim.
The cone of the 3.5" midrange driver, sourced from Audax, is made of a very light and stiff material called Aerogel. A symmetrical drive system ensures identical movement of the cone on both instroke and outstroke. This precision provides for a high degree of waveform fidelity across the driver's bandwidth of 300Hz to 5Khz.
The most unusual component in the BH is its "gas piezo" tweeter, also from Audax. This visually distinctive non-magnetic tweeter has none of the elements that make up conventional moving coil tweeters: pole piece, suspension, back cavity. Its only moving part is a very thin film diaphragm. It is said to combine the dispersion patterns of a conventional dome with the transparency of an electrostatic. I would extend that claim even further -- it sounds to me like a fine ribbon driver, but with broader dispersion. After weeks of listening, I have to rate this as one of the most remarkable drivers I have ever heard.
Every part used in the signal path of the Blue Heron is top quality. The simple first order crossovers (more on that below) are constructed using Auric capacitors, heat-sinked Caddock power resistors and very low Q Perfect Lay 14 gauge conductors. (In simple terms, Q represents susceptibility to resonance.) The internal wiring is Tara Labs' premium Rectangular Solid Core, and the bi-wire speaker terminals are Cardas gold rhodium posts. None of this stuff is cheap.
Meadowlark is obsessive about eliminating coloration caused by mechanical resonances. The crossover components are isolated from their mounting board with a damping material called Keldamp. That board is located in a separate dedicated compartment underneath the driver cabinet, and further isolated with Keldamp. The slanted baffle, of two-inch-thick MDF, is also decoupled from the cabinet, and the section of baffle holding the tweeter and midrange is decoupled from the woofer baffle to prevent low-frequency resonances from affecting the higher frequencies. The construction of the transmission line system and the internal cabinet bracing are robust and obviously very effective. All of these factors add up to a cabinet that is among the most acoustically inert I have ever seen. The ubiquitous knuckle rap test produces nothing but a very dull, damped sound -- no audible cabinet ringing. It's no surprise that this compact floorstander weighs in at a solid 120 lbs.
Time Is Of The Essence
Music -- and electronic reproduction of music -- comprises the elements of pitch (frequency), loudness (amplitude) and timing. At Meadowlark, the most essential aspect of a speaker's performance is time coherence. Put simply, time coherence means that the frequencies generated by each driver reach the listener's ear at precisely the same instant. Sounds simple, right? Without time coherence, a system, no matter how expensive, is not reproducing the original sounds accurately -- even if the speaker delivers flat frequency and amplitude response. In the Engineering Philosophy section of the Meadowlark web site, Pat McGinty argues very clearly -- and to me, persuasively -- the case for time coherence. Rather than reprise his argument, I urge interested parties (who should include anyone contemplating a speaker purchase) to read the material and think about its implications.
All Meadowlark speakers are designed for time coherence. Two factors are essential to achieving time coherence, according to McGinty. First, the baffle must be slanted so that the acoustic centers of the drivers are perfectly aligned. Second, first-order (6dB/octave) crossovers must be used. Again, these concepts are explained in the web site discussion. (I have been struck, over the years, by the number of avid audiophiles who don't understand what an octave is, much less a first-order, second-order, etc., crossover. But it's never too late to learn.)
Another factor contributes to the clarity and openness of the Blue Heron (and the other Meadowlark birds as well). That thick, decoupled baffle is nicely radiused around its periphery, and the grille is simply a sheer black elastic fabric that attaches by tucking it into a groove around the sides of the baffle. Both the rounded edges and the absence of a frame for the grille cloth are key to eliminating diffraction -- early reflections of driver output that are generated perpendicular to the direction toward which the drivers are pointed. Diffraction can subtly but materially affect the ear's perception of timing. (The grille fabric itself has only a slight audible effect on the sound, but the speaker sounds best with the grille fabric removed. For me, the appearance of the BH with grille removed is quite acceptable, as the baffle is nicely finished in black -- and I love the iridescent appearance of that tweeter.)
The Eye Candy Factor
At 11.5" x 15" x 44" (WxDxH), the Blue Herons can not be considered small. But if there were an index relating performance to size, they would score very high. Visitors to my listening room have been surprised at such a dynamic sound emanating from these unassuming, simply styled speakers. I find this design almost Shaker-like in its elegant, functional simplicity, and the slanted baffle makes it seem even less physically dominating. It is a sure bet, though, that the Shakers never dreamed of the multiplicity of veneers available from Meadowlark. In addition to the generous selection of standard veneers -- Rosewood, Ash, Mahogany, Ebony, Cherry -- the Meadowlark web site displays no less than sixteen optional extra-cost veneers, including such exotics as Anigre, Makore, Sapele, Cedar and Zebrawood. Both the Birdseye Maple of the review BHs and the Fiddleback Makore of my Kestrels are extremely beautiful. I am not aware of any other speaker manufacturer who offers this degree of choice.
Until now Meadowlark has offered its speakers without veneers on the rear surface, providing a neatly finished black paint instead. I have regarded that practice as a reasonable economy, given the price/performance value of the speakers. Henceforth, however all floorstanding Meadowlark speakers will be veneered on all four sides, with no increase in retail prices.
Listening Setup
The components used with the Blue Herons included the Basis 2800/Graham 2.2/Koetsu Urushi Platinum for analog; an Andy Bartha-modified Pioneer 434 DVD player and Thor DC-1000 DAC for CD; Paravicini 312 preamp [overdue review coming in May -- I promise!), Thor TA-1000 line stage, Thor and Vendetta phono preamps; VTL MB-750 Reference, VTL Tiny Triode and Andy Bartha solid-state monoblock amplifiers; various cables from Nordost, Transparent, Jena Labs and Townshend, as well as Jack Bybee custom-made interconnects. For most of the review., the BHs were spiked through carpet to the concrete subfloor. Toward the end I placed them on Townshend 2-D air-suspension Seismic Sinks comments to come).
The Blue Herons perform brilliantly in what I call the differentiation test. Whenever I substitute any of the above-listed elements, the effect on the sound is unfailingly audible and easy to characterize. They perform similarly in sorting out the sonic qualities of analog and digital software. The best things sound staggeringly good, and in the upper registers clearly better than I have previously heard in my system. Equally important, however, is that the shortcomings of source material are heard with equal clarity. The BHs are truth tellers, not sweeteners.
I am pleased to report that the BHs perform very well with all three amplifier options. The mighty VTL 750s, of course, will drive virtually anything, even in their half-power (350 watts each) triode setting. But the 45-watt Tiny Triodes, imported from the second system into the main listening room, also drive the BHs to soul-satisfying volumes, with excellent bass control. (VTL amps are designed with solid-state rectification and optimized for a 5-ohm load, so the BHs' 4ohm impedance poses no problem for them. Some tube amps are less comfortable with low-impedance speakers, and any prospective combination should be carefully auditioned.
The Andy Bartha 50-watt monoblocks (review to come) also make fine partners for the BHs. Compared to the Tiny Triodes, the Bartha amps seem to retrieve just as much inner detail, and the high frequencies are sweeter than I expected. The ability of the two sets of small amplifiers to control the bass was pretty much a dead heat. Next to the 750s, they both lack some weight and authority -- but since the combined price is roughly one-quarter that of the 750s, that's hardly a harsh criticism.
From A Whisper To A Roar -- It's All Good
Once fully broken in, the BHs' almost startling speed, dynamics and micro-resolution are so apparent that this listener, an orchestra junkie, found himself irresistibly drawn to large-scale music. Two Reference Recordings CDs by Eiji Oue conducting the Minnesota Orchestra have become virtual test recordings for me. On the Respighi disc (RR-95 CD), the shattering climaxes of the "Appian Way" movement from Pines of Rome ring out with no sense of strain or dynamic limiting, and the layout of the orchestra is credibly presented across a gratifyingly wide and deep soundstage. On the Bernstein disc (RR-87 CD), the composer's "Four Meditations from Mass," characterized by huge dynamic changes, from barely audible from taps to orchestral crescendos, the music takes on a spatial as well as tonal logic; the front-to-back layering of the sound is uncanny. My ultimate test CD for spatial reproduction is the Sibelius Violin Concerto, played with uncommon naturalness and conviction by little-known Finnish musicians (Musical Heritage Society 514261Z). Originally recorded for the Bis label by producer Robert von Bahr, using only four microphones, this wonderful performance is the most realistically proportioned recording of an orchestra and non-spotlighted violin soloist that I know. I have never heard its spatiality reproduced more convincingly than by the Blue Herons.
These speakers also very convincingly reproduce piano. That old standby Nojima Plays Liszt (Reference Recordings RR 29, LP), still one of the finest piano recordings I know, presents a formidable challenge to audio systems. It's not easy to capture accurately the powerful transients and full harmonic richness on this record, but I give the BHs a solid A. And, with the Wild/Fiedler/Boston Pops record of Gershwin's Concerto in F (RCA Living Stereo LSC 2586), the BHs easily clarify the sonic differences between the original LP and the Classic Records reissue. The latter, by comparison, has a slight glare in the piano and less warmth in the orchestral parts, especially the strings. (But if you're not comparing, the reissue sounds fabulous -- and in my book it's the best performance of the piece ever recorded.)
But it's also easy to appreciate the BHs' subtler virtues. After reveling in the sumptuous vocalism and yearning emotion of soprano Renee Fleming singing Richard Strauss's Four Last Songs (RCA Red Seal 0926-685392, CD), I am drawn in by her delicacy and nuance, her small expressive modulations, her subtle breath control, as she traverses a program of French, German and Russian art songs, sympathetically accompanied by pianist Jean-Yves Thibaudet (Nightsongs, Decca 289 467 697-2 CD). Other examples abound: Lucinda Williams' emotional range -- her fragile, vulnerable vocal on "I Envy the Wind" contrasted with her prowling sexuality on "Essence" (Essence, Lost Highway 088 170 197-2, CD). Or the capture of the multiplicity of picking, fiddling and vocal styles on the 0 Brother Where Art Thou soundtrack (Lost Highway 088 170 069-2, CD).
I could go on for pages, listing the musical epiphanies experienced with the Blue Herons. But the point is, whatever music I play through them comes to life, draws me in. Listening fatigue? Doesn't happen. There's something to this time coherence business.
Competition?
The Blue Herons, at $9,000, and the $10,000 Von Schweikert dB-100s I praised so highly in the December Review Magazine offer an interesting comparison. They do not compete directly, since the dB-100 is designed to be driven by low-power Single-Ended Triode amplifiers and the BH, although pretty efficient at 90 dB sensitivity, really needs fairly robust amplification. But they share some striking similarities. Both have dual-woofer transmission line bass systems. The dB-100 bass is driven by an internal 600-watt amplifier; not surprisingly, it goes that extra half octave deeper than the BH, and delivers more sheer "slam." But the BH is no slouch in the slam department, and its quick, tuneful bass is beautifully matched to its upper registers. The dB-100 midrange is a different Audax aerogel driver, a more efficient 6-incher. The two midrange presentations are different, but both are superb. In the tweeter, I give the Blue Heron's unusual gas piezo transducer a decided edge, not just over the front & back-firing dB-100 tweeter system, but over most other high-frequency systems I have heard. Both speakers deliver good imaging and soundstaging; again the BH is slightly more impressive.
The real competition for the Blue Heron, in my opinion, is any number of speakers with five-figure price tags. My Eggleston Andras, $15,000 retail, and significantly enhanced by the installation of Bybee Quantum Purifiers, simply cannot match the speed, dynamics, extension, inner detail, delicacy and spatial resolution of the Blue Herons. It's a speaker designed by a music lover for music lovers. If you have some cash to spend, and are not afflicted with "mine is bigger than yours" audiophile machismo, you owe it to yourself to give these extraordinary speakers a serious audition.
Tonality 99
Sub-bass (10 Hz - 60 Hz) 93
Mid-bass (60 Hz - 200 Hz) 97
Midrange (200 Hz - 3,000 Hz) 99
High-Frequencies (3,000 Hz on up) 99
Decay 99
Inner Resolution 99
Soundscape width front 95
Soundscape width rear 93
Soundscape depth behind speakers 92
Soundscape extension into the room 88
Fit and Finish 100
Self Noise N/A
Value for the Money 99
Editor's Note: Please see this month's Ear Wax featuring a close up look at Heron Audio by clicking here.
Type: three-way, four-driver, floorstanding loudspeaker system
Bass: two ScanSpeak 7" carbon graphite woofers in rear-ported transmission line system
Midrange: Audax Aerogel 3.5" driver
Tweeter: Audax "gas piezo" driver
Crossovers: 300Hz, 5kHz (first-order 6dB/octave)
Frequency response: 30Hz - 30kHZ (+/-3dB)
Sensitivity: 90dB/W/m
Dimensions: 11.5" x 15" x 44" (WxDxH)
Warranty: Five years
Price: $8800 in standard finishes; premium veneers available that extra charge
Meadowlark Audio Inc.
800 Starbuck Avenue Suite A-103
E-mail: meadowlarkaudio@meadowlarkaudio.com
Web: www.meadowlarkaudio.com


More than 30 participants from all over the world and with diverse backgrounds took part in a weeklong training on countering terrorism in The Hague. The Seventh Advanced Summer Programme on Countering Terrorism: Legal Challenges and Dilemmas, co-organised by Asser and the International Centre for Counter-Terrorism (ICCT), took place from 28 August to 1 September 2017.
The lectures followed an interactive format leading to lively exchanges, and were delivered by high-level speakers including Professor Helen Duffy from Leiden University, Judge David Baragwanath of the Special Tribunal For Lebanon (STL), Professor Richard English from Queen's University in Belfast, Dr Bibi van Ginkel from Clingendael Institute, and Dr Alastair Reed from ICCT.
The summer programme also constituted a great opportunity for participants with diverse backgrounds, including practitioners and policy-makers, to network and exchange experiences and perspectives.
Read the full report on the Advanced Summer Programme on Countering Terrorism here.


text:
Commission publishes study on the impact of Open Source on the European economy
Tuesday, September 7, 2021 - 13:38
It is estimated that companies located in the EU invested around €1 billion in Open Source Software in 2018, which brought about a positive impact on the European economy of b
Eclipse Foundation members Bosch.IO and Eurotech named best-in-class in 2021 PAC RADAR Report
The report, entitled "Open Digital Platforms for the Industrial World in Europe 2021," also notes that the Eclipse IoT Working Group is the leading open source community in IoT today.
4 Must See Talks For IoT Developers at EclipseCon 2021
Thursday, September 2, 2021 - 10:33
Are you interested in Industry 4.0, smart city, building automation, smart home, and other emerging use cases?
The missing Java data structures no one ever told you about
Wednesday, September 1, 2021 - 11:49
Donald Raab, creator of the Eclipse Collections framework, takes a look at data structures in Eclipse Collections that are lesser-known in the Java development community.
The Jakarta EE 10 Release Plan Is Approved!
Tuesday, August 31, 2021 - 10:51
The release plan for Jakarta EE 10 Platform and Web Profile has been approved and published with a target release date of Q1, 2022.
Farewell and Thanks - Thabang Mashologu
Thursday, August 26, 2021 - 15:09
This Friday I will be leaving my role as VP, Marketing and Corporate Development at the Eclipse Foundation.
4 Talks on Tools to Look Forward to at EclipseCon 2021
The Modeling Tools and Technologies track will cover the many Eclipse projects supporting the creation and deployment of modeling tools and low-code/no-code environments.
IoT and Edge Developers: Let Your Voices Be Heard
This is the seventh year for our annual survey, which has become one of the most widely referenced technical surveys within the IoT & edge computing industry.
SUMO User Conference 2021
We are just 18 days away from the SUMO User Conference 2021. Given the extraordinary situation we are facing, this year's conference will be again online - via Zoom.
Using Jlink in Dockerfiles instead of a JRE
Friday, August 20, 2021 - 10:31
The Eclipse Temurin project is excited to announce that the official docker images for Temurin binaries are now available on Docker Hub.
5 Talks Cloud Native Java Developers Won't Want To Miss at EclipseCon 2021
EclipseCon is the leading conference for developers, architects, and open source business leaders to learn about Eclipse technologies, share best practices, and more.
Eclipse IDE Working Group Established to Ensure Continued Sustainability - InfoQ
According to its charter, the working group establishes and drives funding, oversees the release plan, coordinates the simultaneous releases, helps to grow and evolve the ecos
Open Source Drives IoT and Edge Computing Adoption
Monday, August 16, 2021 - 12:28
The IoT and Edge Computing market is growing, and the Eclipse IoT & Edge Native working groups offer a mature and growing open source ecosystem upon which to build and deploy
Eclipse Temurin Java SE binaries debut
The Eclipse Foundation's Adoptium project has released its first Eclipse Temurin Java SE binaries, "production-ready" builds of the OpenJDK that cover the latest versions of J
Microsoft Steps Up Java Support at Eclipse Foundation with a New Strategic Membership
Microsoft has amped up its support of Java developers by expanding its participation in the Eclipse Foundation to become a Strategic Member, the company announced.
ADLINK: Giving Back to Open Source - The Entrepreneurial Open Source Podcast
On the fifth episode of the Entrepreneurial Open Source Podcast, we welcomed Angelo Corsaro, chief technology officer at ADLINK Technology.
Microsoft expands support with The Eclipse Foundation
Monday, August 9, 2021 - 09:13
Microsoft has announced that they are continuing to advance their support of the Eclipse Foundation AISBL by expanding their participation to a Strategic Member!
Adoptium Celebrates First Release
Eclipse Adoptium has achieved a major milestone with the first release of the project's Eclipse Temurin Java SE binaries.
JakartaOne Livestream Call for Papers Now Open
JakartaOne Livestream is a one-day virtual conference for developers and technical business leaders. The call for papers is open from July 15 to September 15.


text:
Home Airport News Governor Coumo announces New York airports revitalisation
Governor Coumo announces New York airports revitalisation
acweek
Stewart international airport is to become a regional cargo distribution hub, relieving John F. Kennedy International Airport (JFK) of most cargo facilities, in an announcement by New York governor, Andrew Cuomo, who was joined by US vice president, Joe Biden.
In a press conference on 20 October, called Modernize our Airports: Gateways to New York, Cuomo announced that Stewart's cargo capacity would grow, while LaGuardia Airport and JFK would be subject to full redesigns to modernise their facilities. A tax free zone will also be established at Stewart to give businesses that relocate there 10 years of tax-free development to help expansion. FedEx and UPS operate scheduled flights to Stewart and the United States Postal Service and US Department of Agriculture have facilities at the airport.
Cuomo (pictured on right, credit governor Andrew Cuomo) says: "Our airport modernisation plan not only enhances how our individual airport look and act in the 21st century, but addresses how they must fundamentally work together to strategically grow New York's economy."
He also announced master plan design competitions to revitalise the facilities at LaGuardia and JFK. Cuomo says designs must consider transport links to the airports, redesigning airport layout to increase access, modern amenities and resilient infrastructure to cope with extreme weather. The competition will begin in mid-November and design firms will have 60 days to develop plans, including implementation timeframes. Finalists selected by the Port Authority of New York and New Jersey board of commissioners will receive up to $500,000 to further develop concepts.
In Cuomo's state of the state address in January 2014, he announced his office would assume management responsibility of JFK and LaGuardia from the Port Authority as part of a $17 billion project called Reimagining New York for a New Reality. He said LaGuardia was ranked as the worst airport in the US and, "that is a disgrace my friends and it is unacceptable and it is going to change. We are going to redevelop those airports."
Previous articleSeptember sees new low for Frankfurt
Next articleUnited Airlines achieves 156% profit rise
https://www.aircargoweek.com
Munich Airport and Lufthansa expand their partnership
Dar – the master civil engineer for the Centralny Port Komunikacyjny Airport – inaugurates Poland office


text:
Two days with the Galaxy Watch: Bezels, Bixby and stress tests
Samsung's new wearable tries to do a bit of everything.
C. Velazco|08.24.18
@chrisvelazco
C. Velazco
In this article: galaxywatch, gear, impressions, mobile, preview, samsung, samsunggalaxywatch, tizen, wearables
Chris Velazco/Engadget
Samsung's Galaxy Note 9 and Galaxy Watch officially went on sale today, but here's the thing: we've fully reviewed the former and only just received the latter. (Well, 48 hours ago, to be precise.) As a result, we're still working on our full Galaxy Watch review, which should drop sometime next week. But, the first two days with the Galaxy Watch have already revealed a lot about how well Samsung's updated wearable experience works.
The best bezel
I've made this point in the past, but it's worth repeating: Samsung's rotating bezel is the best way to interact with a smartwatch, period. There's no room to argue here. The tiny touch targets on a smartwatch's diminutive screen can be a pain, and an overabundance of buttons only makes things more confusing. Even the Apple Watch's rotating Digital Crown doesn't quite compare to Samsung's surprisingly intuitive approach. Granted, it's a little too easy to clutter up the Galaxy Watch's interface with an endless list of widgets to scroll through, but the clicky, rotating bezel makes finding what you're looking for a breeze.
Gallery: Galaxy Watch review | 9 Photos
Bigger is arguably better
I'm wearing the bigger, 46mm version of the Watch for one reason: its battery. At 470mAh it's close to twice the size as the one you'll get in the smaller model, and to me, that's almost reason enough to write off the 42mm variant entirely. Samsung says that, if you play your cards right, this Watch will run for between four to six days on a single charge. For a full-blown smartwatch, that's pretty damned impressive. I haven't had the thing long enough to see if those claims hold up, but so far things are on the right track. The Watch had about an 80 percent charge when I picked it up from Samsung, and it died after two days of fairly consistent use — including some heavy-duty workouts that nearly killed me.
I could've squeezed more life out of it if I used the built-in Battery Saver mode, which turns the screen grayscale and shuts off all but the most basic smartwatch functionality. Since I just got the watch, intentionally hobbling it for a bit wasn't going to happen -- not now, anyway. Once the new gadget novelty wears off and I stop fiddling with the watch so often, it's possible (though unlikely) I could hit the six day mark Samsung crowed about. Emphasis on "possible." I've heard that some of the smaller Watches have put up less-than-impressive battery life figures, so unless it's just way too big for your tiny wrists, this version of Galaxy Watch is the better choice.
Bixby works, sort of
So long, S Voice! This year, Samsung decided its Bixby assistant should handle your spoken commands, and so far it handles the basics well enough. It doesn't have trouble telling when I've said "Hi, Bixby" to get its attention, and it's surprisingly good at converting spoken word to text messages. I need to spend more time digging in here though, because Bixby was always meant to handle much more. When it launched on the Galaxy S8 and S8 Plus, the assistant could handle surprisingly complex voice commands. And with the launch of the Galaxy Note 9, Bixby has received a major facelift and better integrations with third-party apps. Bixby as a whole still feels lacking, though, and my experience with Bixby on the Watch hasn't revealed much innovation.
Samsung seems acutely aware of this, too. Bringing its home-brew voice assistant to a wearable for the first time should probably merit some kind of fanfare, but look at Samsung's website and press releases about the Galaxy Watch: Bixby barely gets a nod at all.
Stress testing takes time
New to the Galaxy Watch is a stress management feature that tries to detect those moments when you're freaking out and offers breathing exercises to help you chill. The feature itself is fairly straightforward: the first few times you check your stress levels (though a handy widget that's enabled by default), the Watch sets up a baseline heart rate that it checks against in the future. Needless to say, you should be pretty relaxed when you first use the feature. The thing is, it seems to take a while for the Watch to figure out what your heart is doing when you're really stressed, so you'll have to wait at least a few for any real insight to kick in.
I logged my first stress test just after receiving the Watch, and my levels were all green — fitting, since I wasn't particularly worried about anything. The screen displayed the word "neutral" just to confirm that everything was alright. Shortly after that, though, Samsung put a group of gathered journalists through an intense workout and asked us to check our stress levels again. That time, the stress meter's digital needle was way in the red, and I would've expected the Watch to flag the situation in some way. It didn't. I can't be too harsh on this feature since it probably needs more time to really get acquainted with my resting heart rate but if there were ever a time to offer calming breathing exercises, that was it.
My testing isn't over yet, but I'm pleased to see Samsung trying to make its wearables a little more thoughtful. Even with Apple's own updated Watch on the horizon, the Galaxy Watch seems like a strong option for Samsung fans and people waiting for Google to do new things with Wear OS. Things could change over the next few days, though — you'll just have to stay tuned.
Crytek confirms a new Crysis game is in development


If you've ever drawn a heart for the word "love," you've written a rebus. Rebus, writing which substitutes images for words in the text, is used by authors to write books for young readers able to identify only a limited number of words, so why not use this same technique to teach writing?
Students are first introduced to a variety of books using rebus writing. They then brainstorm lists of rhyming words that they could use in their own rebus poems. Finally, students create their own rebus poems and share them with an audience. This lesson uses Jean Marzollo's book I Love You: A Rebus Poem as a model for using rebus writing to create wonderful poetry; however, any of the rebus books included on the accompanying book list would be appropriate for this activity. This makes a wonderful Valentine activity, although it is certainly not limited to that holiday.
Rhyming Picture Cards: These printable cards can be used for a variety of picture-rhyming activities. Included are nine rhyming words sets.
Rebus Book List: This sheet provides a list of rebus books that can be used as models before students create their own rebus poetry or stories.
Rebus books have long been used by teachers and parents to help young children learn to read. Rebus books substitute pictures for the harder words that young students cannot yet identify or decode. Many children are also familiar with electronic interactive play-a-sound books that allow them to match and touch the rebus pictures and hear the characters speak, laugh, or make sounds.
In this lesson, students use rebus writing to create their own poetry by drawing pictures of the words they need to complete a rhyming pattern. Karen daSilva explains, "Crayons and markers are such important tools in [students'] literacy. Children read pictures to understand, they make pictures to tell what they mean." This connection is strengthened in rebus poems, which specifically connect drawing and writing. As daSilva continues, "When drawing is part of the writing and reading process, it can help give ideas for writing and teach skills of observation, skills that encourage reading the world and reading the image" (p. 2).
daSilva, Karen Ernst. "Drawing on Experience: Connecting Art and Language." Primary Voices 10.2 (October 2001): 2-8.


Sorry for the delay in getting this lessons learned post about the BiggerPockets Real Estate Summit, but I took a trip through the North Dakota oil patch after leaving Denver and was overwhelmed with the possibilities!
As I look back at what a great experience participating in the BiggerPockets Summit was, I keep coming back to the recurring themes that I heard during almost every presentation and in almost every discussion I had the good luck to participate in. In fact, it was hard miss these "themes" as they appeared to be the essence from which all of the established and successful real estate investors were operating from!
Whether you are already in the trenches moving forward achieving great success as an investor, or are just getting started, I firmly believe that by embracing these themes you will move toward continued and sustained success. And, why not? The fastest way to success is to follow the actions of those who are already succeeding!
Successful real estate investors . . .
1. Prepare themselves for SUCCESS. Investors know that their success requires vast amounts of learning. They know that they must spend time and effort "learning" prior to jumping in and they must be willing to participate in every learning opportunity available to them. The next BiggerPockets Summit would be a great investment on your part.
2. Embrace their SUCCESS. Real estate investors have conditioned themselves to accept that they are worthy of success and that their success not only helps them, but also directly and indirectly helps many others as well.
3. Have learned the art of overcoming their FEARS. Successful investors know that they will need to take educated risks and make decisions which are new to them. They are unwilling to listen to their "mind-chatter" and know that getting out of their comfort zone is essential. These same investors have learned to take risks with certainty, overcome their fears, tune-out their mind-chatter and move forward having full confidence in their plan and their abilities.
4. Believe in ABUNDANCE. Every successful investor knows that their success is not a zero-sum game — a game where others must lose in order for these investors to succeed. These successful investors believe that there is vast never-ending abundance fueling their success and the success of others as well.
5. Real estate wealth is not a "Get Rich Scheme". Successful investors realize that with proper planning they will get "rich" investing in real estate. Yet more importantly, they know that the process of obtaining wealth through their real estate "entrepreneurial" efforts requires discipline and it won't happen overnight.
6. Have a clearly written set of GOALS. Their goals are S.M.A.R.T Specific, Measurable, Attainable, Realistic, and Time-based. These same investors not only know what their goals are, they have them written down, and they recite them everyday without fail.
7. First become an EXPERT in a single area of investing. Successful investors know that learning the ropes by becoming an expert in at least one real estate investment area will get them to their goals via the shortest path possible. These areas may include wholesaling, rehabbing and selling to homeowners or investors, holding properties as rentals, etc.
8. Have a success FORMULA. Our successful investors have spent substantial time and effort to develop a formula for achieving their success in real estate. This formula considers amongst other things local market conditions, their knowledge and abilities, their financial resources, and their risk tolerance.
9. Know the value of building a TEAM. This team made up of lenders, realtors, attorneys, contractors, property managers, and others allows the successful investor to focus their efforts on finding quality deals and more rapidly achieving their goals.
10. Know the value of STRATEGIC PARTNERSHIPS. They have learned that not every partner is a bad partner, and if chosen with care strategic partnering can be one of the quickest methods to achieving their goals.
Bottom line… have you embraced similar themes for your business? If not, what are you waiting for?
Photos: Dave Bowden, Julie D.
Great article Peter. It should be required reading for all investors. Success takes planning, focus and hard work.


Hope you had a healthy week! And if you didn't, it's never too late to start.
This healthy fish recipe is perfect to start your week. The Cod & Veg is light, clean and duh, full of flavor!
Place tray in pre heated oven and cook for approx. 30 mins.


text:
« Escape from Tomorrow (2013) | Main | Bastards (2013) »
MHHFF '13: Big Bad Wolves
***/****
starring Tzahi Grad, Llor Ashkenazi, Rotem Keinan, Dov Glickman
written and directed by Aharon Keshales and Navot Papushado
by Walter Chaw A winning, stylish mixture of black humour, perversion, and character study, Aharon Keshales and Navot Papushado's Big Bad Wolves presents a popular moral quandary in a way that would make Park Chan-wook proud. Indeed, it would fit comfortably in a conversation with that director's "Vengeance Trilogy" as a companion piece in theme, even execution, to Sympathy for Lady Vengeance that finds a father and a rogue police officer brutally torturing an unassuming schoolteacher because they both suspect he's responsible for the death of a little girl. With the question of guilt beside the point, the real thrust of the piece is the toll that some actions take on the soul, no matter why they're undertaken. Crucially, it's not a product of the United States or South Korea, two cultures married to a specific kind of morally relativistic nightmare that have produced films like this for years, but of an Israeli movie industry that marks this as only their second "horror" release. (The first, incidentally, was a product of this same writing-directing team: 2010's Kalavet.) For an Israeli thriller to tackle the issue of the zero sum game of rendition and torture without due process feels dangerous--particularly with the ancillary character of an Arab man on horseback who is wry, handsome, and utterly normal, nay, the only normal one in the entire film.
Detective Miki (Lior Ashkenazi, somewhere between Steve Carell and Ian McShane) is dismissed from a brutal child-murder case for getting caught on YouTube literally throwing the book at milquetoast Dror (Rotem Keinan). It's a moment of notoriety that causes Dror's students and colleagues to turn against him, and each finds himself out of a job. Meanwhile, Gidi, the former head of the Lebanese police and father of the latest victim, decides he'd like do a little interrogating of his own. With Miki an uneasy-at-times accomplice, the two summarily strap Dror into a chair in the basement of a remote farmhouse, arm themselves with rusty instruments, armour themselves in righteousness, and go to town.
Nothing special, really, in terms of plotting (frankly familiar in many instances, with certain points, like the baking of a drugged cake, telegraphed in the way only something this meticulously plotted can telegraph things), Big Bad Wolves nevertheless boasts flair, a tightness in its dialogue, and a mordant sense of humour, its moments of greatest tension relieved by regular calls from a prototypical Jewish mother. The arrival of Gidi's father (Menashe Noy) allows for more domestic situational comedy, while the interplay between Dror and Miki, alarmed for various reasons by Gidi's fervour, adds moments of moral complexity to the bloody shenanigans. Big Bad Wolves is beautifully crafted, from its virtuoso, wordless prologue to a midnight ride through a forest on a child's bike--which mixes just a hint of pathos with tension and well-choreographed slapstick--all the way up to a final twist that pulls the entire thing into focus without providing anything like a tidy resolution. It's as assured as any genre film in a year already packed to brimming with unusual, innovative, brilliant genre fare within and without the mainstream, doing nearly the impossible (and until recently almost the sole purvey of South Korean filmmakers) in maintaining a light tone while depicting a deeply-uncomfortable subject. And though it reminds thematically of Park Chan-wook's pictures, it ultimately has its closest analog in Bong Joon-ho's modern classic procedural Memories of Murder. If it doesn't transcend, in other words, it at least builds on the right shoulders. I can't wait for the next one.
MHHFF '13: Cheap Thrills
MHHFF '13: We Are What We Are (2013)
AICN HORROR from UK's Film 4 FrightFest Part 3: Dr Karen Outghton reviews REWIND THIS!, ODD THOMAS!
Posted in 2013, Authors: Walter Chaw, Comedy, Crime, Film Festivals, Israel, Thriller | Permalink
Tags: MHHFF 13


Financial aid is the assistance students receive from federal, state, institutional, and private sources to help finance their University educations. Financial aid may take the form of scholarships and grants (gift aid that does not require repayment), student loans, or student employment. Financial aid may be based on financial need and/or merit. Schools use information from the Free Application for Federal Student Aid (FAFSA) to determine a student's need.
Once a student has completed the financial aid application process and is found eligible for need-based and/or merit based aid, she will receive a financial aid package detailing the combination of sources used to provide financial assistance. It is our hope that the financial assistance offered through Chatham University, combined with family resources, will provide the funding necessary for all qualified students to obtain a Chatham education.
Click a box below to view further details for each type of financial aid.
In recognition of the academic achievements of our students, Chatham University offers a comprehensive merit scholarship program. Scholarships are awarded to full-time undergraduate students (including transfers and international students) without regard to financial need. All applicants are considered. Applicants may contact the Office of Admissions for full details at admission@chatham.edu or (412) 365-1100 or toll-free (800) 837-1290.
Click here to view Undergraduate Financial Aid Programs.
Federal Pell Grants are available to undergraduate students with demonstrated financial need.
Federal Supplemental Educational Opportunity Grants (SEOG) are available to undergraduate students with exceptional financial need.
Pennsylvania State Grants (PHEAA) are available to undergraduate Pennsylvania residents with demonstrated financial need.
Other State Grants are offered by some states offer grants for their residents to use toward educational costs outside the home state. Students in Arkansas, Connecticut, Delaware, Maine, Massachusetts, Ohio, Rhode Island, Vermont, West Virginia and Washington, DC should contact their state agencies for more information about these programs.
Chatham Grants and Endowed Scholarships are funds made available by Chatham University and are awarded to undergraduate students who demonstrate financial need. The amounts of these awards vary. Chatham aid is available for eight terms of full-time study.
The Federal Student Employment Program (formerly called work-study) is provided through federal funds and available to students with demonstrated financial need. Students employed under this program work approximately 13 – 16 hours per week in various jobs on campus or in off-campus community service positions. If you have questions about the program, see our answers to frequently asked questions. For information about job opportunities, contact Chatham's Career Development office.
The Federal Direct Subsidized Stafford Loan is awarded to students who have demonstrated financial need. Repayment and interest charges begin 6 months after graduation or cessation of at least half-time enrollment. Students must file a Master Promissory Note (MPN) to receive these funds. Direct Stafford Loans are funded through the US Department of Education using funds obtained from the US Treasury. The MPN can be completed online at www.studentloans.gov.
The Federal Direct Unsubsidized Stafford Loan is available to all students who have been denied or show reduced eligibility for the need-based Federal Subsidized Student Loan. The Unsubsidized Stafford loan also provides additional loan eligibility to independent students. While repayment beings 6 months after graduation or cessation of at least half-time enrollment, the student can make interest payments or have the interest capitalized during in-school, grace or deferment periods. Students must file a Master Promissory Note (MPN) to receive these funds. Direct Stafford Loans are funded through the US Department of Education using funds obtained from the US Treasury. The MPN can be completed online at www.studentloans.gov. You do not have to complete a separate MPN for Subsidized and Unsubsidized Stafford Loans. Your signature on the MPN will remain valid, so you will not need to complete a new MPN annually.
The Federal Direct Parent PLUS Loan is loan borrowed by a parent on the student's behalf. The parent must be credit-approved for the loan. This loan currently has a fixed interest rate of 7.9%, and the parent is able to defer the loan while the student is enrolled at least part-time. The PLUS loan is funded by the Department of Education. All parent borrowers much first complete a Master Promissory Note online at www.studentloans.gov. This process must be completed for each year or term that the parent intends to borrow a Parent PLUS Loan.
Other Non-Federal/Private Loans, sometimes called Alternative Loans, are available to all students to help fill the gap that sometimes exists between the cost of a Chatham education and a financial aid award. Private loan programs vary and are available from many lenders. These programs usually require the borrow to be creditworthy, or apply with a credithworhty cosigner. At this time, Chatham University does not have a preferred lender list, but as a borrower you have the option of choosing your own lender.
We understand that decisions involving alternative ways to finance your education can be very confusing. For your convenience we are providing a comparison chart, which contains pertinent information about both loans.
Financial aid for international students at Chatham is available to eligible students in the form of scholarships (aid that does not require repayment).
For more information, visit the International Scholoarship page or contact the international admissions counselor at the Office of Admissions.
If you have questions about financial aid options, please contact the Financial Aid Office at: 412-365-2781 or send us an e-mail at financialaid@chatham.edu.


The former Chelsea captain does not think his former club can dethrone City this season.
Former Chelsea captain Dennis Wise believes Manchester City will not be beaten to the Premier League title.
Pep Guardiola's side are two points clear of Liverpool at the top of the table, and now 10 ahead of Chelsea following the Blues' surprise defeat at Wolves.
Chelsea enjoyed a strong start to the season under their new manager Maurizio Sarri, but host the champions at Stamford Bridge on Saturday after suffering two defeats in their last three matches.
In contrast, City, unbeaten so far in their championship defence, are bidding for an eighth victory on the bounce.
"I don't think City can be stopped, and they will win the Premier League this season," Wise told Press Association Sport.
"They have got quality all over the place, and they can change their personnel with ease. Look at Kevin De Bruyne. He has been out with an injury, but he hasn't been missed with the way City have performed.
"So, they are the ones to chase, and the team that will get close to them is probably going to be Liverpool.
Wise was speaking at Friday's launch of the inaugural 'Sportsperson with a Personality Award'. He worked with betting app kwiff to compile a shortlist of sportspeople who he believed have shown personality this year, as well as sporting ability. The shortlist launches on Friday and people are able to vote at www.kwiff.com/swapa until December 12, with the winner announced on December 13.
Chelsea boss Sarri is hopeful midfielder Cesc Fabregas will extend his stay with the club, but it is understood the Spaniard is after a long-term deal.
It has been Chelsea's policy in recent times, however, to offer any player over 30 only a one-year contract extension.
Fabregas, 31, started for the Blues against Wolves on Wednesday, but he has largely been a bit-part player under Sarri, and Wise, who played 445 times for Chelsea, does not feel the club should adapt their contract strategy for the Spaniard.
"The club will do whatever suits them financially," he added. "If there is a situation where a player needs to be kept they will keep them, but it depends how important you are, and if there are other players in the squad that can replace you.
"Cesc hasn't played as much as he would have like to have done this year, and when you get older it becomes your choice as to whether you want to play week in, week out, or just be a part of the squad.
:: Dennis Wise was speaking as he launched the inaugural 'Sportsperson with a Personality Award', sponsored by kwiff – the only sports betting app where any bet could be supercharged.


A couple weeks ago, I (William) went to High River Alberta for a friend's graduation. I managed to slip in some birding along the way. Most of these pictures were taken while driving, so excuse the blurriness of some pictures.
I got 6 lifers on the trip, and another 7 when I met up with Ethan (Birdboy). I don't think I got many pictures of the lifers on the drive over, it's hard enough to identify them when your whizzing by at 110 km/h.
My friends and I started from our house at 5:30 AM. So I wasn't in any condition for birding that early in the morning. I started getting lifers in Saskatchewan, driving along, I managed a Ferruginous Hawk, Mountain Bluebird and Lark Bunting before Regina.
I stopped birding for the most part as we passed through Regina, but started again in earnest once out of the city.
After awhile we passed through what looked like snow, but it we figured it must be salt.
We arrived in Alberta, with my life count for the trip at 5, I kept checking the fence posts for Owls or Falcons, and my persistence paid off, another lifer, Prairie Falcon.
We arrived in High River, and spent the next few days keeping ourselves busy with the graduation, Calaway Park. And on Saturday we set out for Canmore, to meet up with Ethan for some birding. We were halfway there, when our car started acting up. It was overheating if we were traveling at anything but highway speed, and the way to Canmore was plagued with construction, which meant we'd have to travel way below highway speed. So we rescheduled with Ethan, to meet Monday instead, and we headed to Elbow Falls AB.
I didn't get anymore lifers at Elbow Falls, but it was an amazing area, full of awesome landscape, and I had a great time.
Sorry for the amount of pictures in this post, but I decided to put the whole trip in two posts, the next part will be about birding with Ethan. Stay tuned for part 2!


Apologies for the late response. We had an out-of-band session on Tuesday, March 29th, to make up for the lack of D&D over the next two weeks. I'll be out of town the week of April 11th, so our next play session will occur on Tuesday, April 19th. Hope to see you all there!
The party threw caution to the wind, heading back into the woods and finding a massive rock formation that concealed a natural cave system. Our intrepid explorers immediately came across a corpse that reanimated before their very eyes, a mere prelude to a multitude of zombies and skeletons that awaited them inside. Oni, Hytton, Temmie, Bosun, and Exees all fought bravely through several rooms full of traps and undead monstrosities, eventually catching sight of the Lord of Lance Rock himself (who promptly ran away).
The party earned a total of 700 XP (140 XP each). Characters present for all 5 sessions have earned a total of 654 XP each.
Temmie recovered a hooded bear-skin cloak from one zombie and Hytton kept a Jester's cap worn by a second zombie. The party also discovered 7 PP, 20 GP, 10 EP, 56 SP, and 147 CP (roughly 95GP in total).
I had a blast! Points to the DM for incorporating funny hats into the story. Keep 'em coming!
Also, don't forget the bear puns for this week!
"What a grizzly way to go~!"
Next time let's kill us a necromancer!!!
Points to the DM for incorporating funny hats into the story. Keep 'em coming!
It worked for Team Fortress 2! Now I just have to figure out how to monetize them!


text:
Home > Mansfield Library > Archives and Special Collections > Oral Histories > Unions and Labor Oral History Collection > 9
Unions and Labor Oral History Collection
Godfrey "Bob" Johnson Interview, September 1994
Godfrey Johnson
Judy Ellinghausen
Download Audio Interview (74.8 MB)
Download Transcript of Godfrey Johnson Interview (103 KB)
Godfrey Johnson discusses working a series of seasonal jobs after leaving home at the age of 15. He describes living as a hobo during the Great Depression, marrying and settling down in Great Falls, Montana, and getting work with the Great Northern Railway. Johnson also explains the relationship between the engineers and firemen working with the railroad.
Media is loading
Early twentieth century history; Great Depression, 1929-1939; Great Falls, Montana; Personal account; Life reminiscence; Great Northern Railway; Great Northern Railway employees
Original Date
Unions and Labor Oral History Collection, Archives and Special Collections, Mansfield Library, University of Montana-Missoula
Digital Publisher
University of Montana--Missoula. Mansfield Library
Copyright to this collection is held by the interview participants and by the Maureen and Mike Mansfield Library, University of Montana-Missoula. Permission may be required for use. For further information please contact Archives and Special Collections: (406) 243-2053 / library.archives@umontana.edu
Oral History Number
OH 330-001
Sound; Text
1 sound cassette (01:30:00 min.) analog + 1 transcript (28 p.: 28 cm.)
audio/mp3; application/pdf
01:01:28 minutes
Local Filename
OH_330_001.mp3; OH_330_001.pdf
Johnson, Godfrey, "Godfrey "Bob" Johnson Interview, September 1994" (1994). Unions and Labor Oral History Collection. 9.
https://scholarworks.umt.edu/mtunionsandlabor_oralhistory/9


Today's definition of freedom is nothing like it once was or what it should be! Today there is a lot of different technology out there that can track you, watch you and report you to authorities. They want neighbors and kids to spy on each other… We are living in a complete totalitarian society where the police can do what ever they want without any consequences… Remember this quote: "The Greatest Slave Is One Who Believes He Is Free…" Now that applies to America today! We are tricked into believing that this is freedom, tricked into believing that the police are to help us and tricked into thinking that our government is catching "terrorists" but is doing nothing more than hurting it's own citizens; trying to regain the freedom that our founding-fathers gave us for future generations to come! The government is scared of these true patriots who want to take back the country and the government from wealthy bankers who want a New World Order.. This list below is from this websiteIt has a lot of good information pointing to the big brother and police state conspiracy.. Well lets show you the facts, now if you think all these reasons are for your safety please think again!


The standard in the nuclear industry, Nickel Nuclear Grade is specially tested and certified pure for use in nuclear power plants. Each production of Nuclear Grade is tested for contaminants of sulfer, halogens and low-melt metals and each container is labeled with the lot number that certifies purity. Recommended for nuclear fittings, valves and steam manifolds. Provides maximum protection from high heat up to 2400ºF and aggressive chemicals.


contact us asap, or we will send the goods to the address you left on the order information only.
2.A tacking number will be updated on Aliexpress once your item is shipped.
All orders usually be shipped 1-3days after payment.
A "GIFT" with a low value.But we can not guarentee the CHARGES.
5.lf you have not received your parcel within 60days.Please contact us immediately for help.
We will reply the email within 24 hours.
1.Please check the tracking information on the tracking website.
2.Please contact us by message,email,or trade manager.
3.Check the package and item carefully.


Camaro Coloring Pages. You may make color books of figures, nature, the alphabet, the world and places, pets or cartoons. Moreover, keep it choose easy styles that also the kid can attempt to draw.
All children prefer to color, but there are important reasons to motivate this activity beyond the straightforward hedonistic inspiration to get fun.
Colours are exciting in addition to attract young children easily, that's the reason environmental surroundings connected with play schools or preschool periods includes numerous hues to create the children or little ones content along with enjoy. All young children love to coloring, although you can find essential causes to help motivate along with guidebook this particular task further than the straightforward hedonistic traction to have enjoyable. Dyes websites undoubtedly are a quick and simple method to keep youngsters pleased along with busy whilst they're understanding. Colour websites instructing youngsters to spot different colors. While each youngster should be aware of the essential reddish, eco-friendly, azure, white, yellow, the common colorings, there exists justified reason to show these individuals the brands connected with much more obscure hues. Colouring internet pages are a great way of permitting your kids expressing their particular thoughts, views and also understanding through artistic and also innovative procedures.
Thank you for visiting, hopefully this post inspired you and also assist you what you are looking for. Only for facts, Camaro Coloring Pages is entry has been published in Coloring Pages. We all also have other category is related with Coloring Pages. if you want to get this finest image about Camaro Coloring Pages, just click save button to save that photos for your on your computer. Finally if you need to get new and newest Coloring Pages related to Camaro Coloring Pages, please follow us on facebook or bookmark this website, we try our very best to provide you every day update with fresh new Coloring Pages. Don't forget to share this image with people via Facebook, Twitter, Pinterest or other social medias!. Hope you enjoy being in this article.
Related Posts of "Camaro Coloring Pages"


Conical shaped Samovar with panels and flutes on a circular base with stylized paw feet. Of polished yellow brass. Beautiful and rare carved bone handles with folkloric detail. Wooden lid knobs. Stylized figural spigot key. Engraved cypher NS on front. Four Presentation and Design Awards, 1888.
Dimensions: H 20" W 14"