text:
Dana Younger
Dana Younger is a Texas sculptor who earned a BA in Theater from the University of Texas at Austin. His experiences in the theater, as well as in construction and boatbuilding, led him to a career in fabrication. Younger began his work as an artist as a founding partner of Blue Genie Art Industries, an art fabrication company, and the Blue Genie Art Bazaar, an annual holiday art show now in its 18th year. Currently he is the Exhibits Manager for Texas Parks and Wildlife where he works with writers, designers and fabricators to make exhibits for Texas state parks. His sculpture work has been featured in galleries throughout Texas and the US including the Meijer Sculpture Garden in Grand Rapids, Michigan, New Mexico State University, the Louise Hopkins-Underwood Center for the Arts in Lubbock, Texas, Wright State University in Ohio, Purdue University in Indiana, Abilene Christian University, Texas A&M and Stephen F. Austin University in Texas . He says, "Sculpture is a complex puzzle that provides a steady stream of unique challenges to solve, that's why I love it."


text:
package microsoft.exchange.webservices.data.core;

import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
import com.sun.xml.internal.stream.XMLInputFactoryImpl;
import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlDeserializationException;
import microsoft.exchange.webservices.data.misc.OutParam;
import microsoft.exchange.webservices.data.security.XmlNodeType;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

/**
 * Defines the EwsXmlReader class.
 */
public class EwsXmlReader {

  private static final Log LOG = LogFactory.getLog(EwsXmlReader.class);

  /**
   * Default setting for ignore xml errors
   */

  private static final boolean IgnoreErrorsDefault = true;

  /**
   * The xml reader.
   */
  private XMLEventReader xmlReader = null;

  /**
   * The present event.
   */
  private XMLEvent presentEvent;

  /**
   * The prev event.
   */
  private XMLEvent prevEvent;

  /**
   * Initializes a new instance of the EwsXmlReader class.
   *
   * @param stream the stream
   * @throws Exception on error
   */
  public EwsXmlReader(InputStream stream) throws Exception {
    this.xmlReader = initializeXmlReader(stream, IgnoreErrorsDefault);
  }

  /**
   * Initializes a new instance of the EwsXmlReader class.
   *
   * @param stream the stream
   * @throws Exception on error
   */
  public EwsXmlReader(InputStream stream, boolean ignoreErrors) throws Exception {
    this.xmlReader = initializeXmlReader(stream, ignoreErrors);
  }

  protected XMLEventReader initializeXmlReader(InputStream stream, boolean ignoreErrors) throws Exception {
    XMLInputFactory inputFactory = new XMLInputFactoryImpl();
    inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);

    XMLEventReader reader = inputFactory.createXMLEventReader(stream);

    if (ignoreErrors) {
      //continue after fatal error to prevent "invalid character reference"
      XMLErrorReporter
          errorReporter =
          (XMLErrorReporter) reader
              .getProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY);

      if (errorReporter != null) {
        errorReporter
            .setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.CONTINUE_AFTER_FATAL_ERROR_FEATURE, true);
      } else {
        LOG.warn(
            "Failed to configure ignore errors for the XML Reader. Expected the Xerces parser implementation.");
      }
    }

    return reader;
  }

  /**
   * Formats the name of the element.
   *
   * @param namespacePrefix  The namespace prefix
   * @param localElementName Element name
   * @return the string
   */
  private static String formatElementName(String namespacePrefix, String localElementName) {

    return isNullOrEmpty(namespacePrefix) ? localElementName : namespacePrefix + ":" + localElementName;
  }

  /**
   * Read XML element.
   *
   * @param xmlNamespace The XML namespace
   * @param localName    Name of the local
   * @param nodeType     Type of the node
   * @throws Exception the exception
   */
  private void internalReadElement(XmlNamespace xmlNamespace, String localName, XmlNodeType nodeType)
      throws Exception {

    if (xmlNamespace == XmlNamespace.NotSpecified) {
      this.internalReadElement("", localName, nodeType);
    } else {
      this.read(nodeType);

      if ((!this.getLocalName().equals(localName)) || (!this.getNamespaceUri()
          .equals(EwsUtilities.getNamespaceUri(xmlNamespace)))) {
        throw new ServiceXmlDeserializationException(String.format(
            "An element node '%s:%s' of the type %s was expected, but node '%s' of type %s was found.",
            EwsUtilities.getNamespacePrefix(xmlNamespace), localName, nodeType.toString(), this.getName(),
            this.getNodeType().toString()));
      }
    }
  }

  /**
   * Read XML element.
   *
   * @param namespacePrefix The namespace prefix
   * @param localName       Name of the local
   * @param nodeType        Type of the node
   * @throws Exception the exception
   */
  private void internalReadElement(String namespacePrefix, String localName, XmlNodeType nodeType)
      throws Exception {
    read(nodeType);

    if ((!this.getLocalName().equals(localName)) || (!this.getNamespacePrefix().equals(namespacePrefix))) {
      throw new ServiceXmlDeserializationException(String.format(
          "An element node '%s:%s' of the type %s was expected, but node '%s' of type %s was found.",
          namespacePrefix, localName, nodeType.toString(), this.getName(), this.getNodeType().toString()));
    }
  }

  /**
   * Reads the specified node type.
   *
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws XMLStreamException                 the XML stream exception
   */
  public void read() throws ServiceXmlDeserializationException, XMLStreamException {
    read(false);
  }

  /**
   * Reads the specified node type.
   *
   * @param keepWhiteSpace Do not remove whitespace characters if true
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws XMLStreamException                 the XML stream exception
   */
  private void read(boolean keepWhiteSpace) throws ServiceXmlDeserializationException, XMLStreamException {
    // The caller to EwsXmlReader.Read expects
    // that there's another node to
    // read. Throw an exception if not true.
    while (true) {
      if (!xmlReader.hasNext()) {
        throw new ServiceXmlDeserializationException("Unexpected end of XML document.");
      } else {
        XMLEvent event = xmlReader.nextEvent();
        if (event.getEventType() == XMLStreamConstants.CHARACTERS) {
          Characters characters = (Characters) event;
          if (!keepWhiteSpace) {
            if (characters.isIgnorableWhiteSpace() || characters.isWhiteSpace()) {
              continue;
            }
          }
        }
        this.prevEvent = this.presentEvent;
        this.presentEvent = event;
        break;
      }
    }
  }

  /**
   * Reads the specified node type.
   *
   * @param nodeType Type of the node.
   * @throws Exception the exception
   */
  public void read(XmlNodeType nodeType) throws Exception {
    this.read();
    if (!this.getNodeType().equals(nodeType)) {
      throw new ServiceXmlDeserializationException(String.format(
          "The expected XML node type was %s, but the actual type is %s.", nodeType, this.getNodeType()));
    }
  }

  /**
   * Read attribute value from QName.
   *
   * @param qName QName of the attribute
   * @return Attribute Value
   * @throws Exception thrown if attribute value can not be read
   */
  private String readAttributeValue(QName qName) throws Exception {
    if (this.presentEvent.isStartElement()) {
      StartElement startElement = this.presentEvent.asStartElement();
      Attribute attr = startElement.getAttributeByName(qName);
      if (null != attr) {
        return attr.getValue();
      } else {
        return null;
      }
    } else {
      String errMsg = String.format("Could not fetch attribute %s", qName.toString());
      throw new Exception(errMsg);
    }
  }

  /**
   * Reads the attribute value.
   *
   * @param xmlNamespace  The XML namespace.
   * @param attributeName Name of the attribute
   * @return Attribute Value
   * @throws Exception the exception
   */
  public String readAttributeValue(XmlNamespace xmlNamespace, String attributeName) throws Exception {
    if (xmlNamespace == XmlNamespace.NotSpecified) {
      return this.readAttributeValue(attributeName);
    } else {
      QName qName = new QName(EwsUtilities.getNamespaceUri(xmlNamespace), attributeName);
      return readAttributeValue(qName);
    }
  }

  /**
   * Reads the attribute value.
   *
   * @param attributeName Name of the attribute
   * @return Attribute value.
   * @throws Exception the exception
   */
  public String readAttributeValue(String attributeName) throws Exception {
    QName qName = new QName(attributeName);
    return readAttributeValue(qName);
  }

  /**
   * Reads the attribute value.
   *
   * @param <T>           the generic type
   * @param cls           the cls
   * @param attributeName the attribute name
   * @return T
   * @throws Exception the exception
   */
  public <T> T readAttributeValue(Class<T> cls, String attributeName) throws Exception {
    return EwsUtilities.parse(cls, this.readAttributeValue(attributeName));
  }

  /**
   * Reads a nullable attribute value.
   *
   * @param <T>           the generic type
   * @param cls           the cls
   * @param attributeName the attribute name
   * @return T
   * @throws Exception the exception
   */
  public <T> T readNullableAttributeValue(Class<T> cls, String attributeName) throws Exception {
    String attributeValue = this.readAttributeValue(attributeName);
    if (attributeValue == null) {
      return null;
    } else {
      return EwsUtilities.parse(cls, attributeValue);
    }
  }

  /**
   * Reads the element value.
   *
   * @param namespacePrefix the namespace prefix
   * @param localName       the local name
   * @return String
   * @throws Exception the exception
   */
  public String readElementValue(String namespacePrefix, String localName) throws Exception {
    if (!this.isStartElement(namespacePrefix, localName)) {
      this.readStartElement(namespacePrefix, localName);
    }

    String value = null;

    if (!this.isEmptyElement()) {
      value = this.readValue();
    }
    return value;
  }

  /**
   * Reads the element value.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @return String
   * @throws Exception the exception
   */
  public String readElementValue(XmlNamespace xmlNamespace, String localName) throws Exception {

    if (!this.isStartElement(xmlNamespace, localName)) {
      this.readStartElement(xmlNamespace, localName);
    }

    String value = null;

    if (!this.isEmptyElement()) {
      value = this.readValue();
    } else {
      this.read();
    }

    return value;
  }

  /**
   * Read element value.
   *
   * @return String
   * @throws Exception the exception
   */
  public String readElementValue() throws Exception {
    this.ensureCurrentNodeIsStartElement();

    return this.readElementValue(this.getNamespacePrefix(), this.getLocalName());
  }

  /**
   * Reads the element value.
   *
   * @param <T>          the generic type
   * @param cls          the cls
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @return T
   * @throws Exception the exception
   */
  public <T> T readElementValue(Class<T> cls, XmlNamespace xmlNamespace, String localName) throws Exception {
    if (!this.isStartElement(xmlNamespace, localName)) {
      this.readStartElement(xmlNamespace, localName);
    }

    T value = null;

    if (!this.isEmptyElement()) {
      value = this.readValue(cls);
    }

    return value;
  }

  /**
   * Read element value.
   *
   * @param <T> the generic type
   * @param cls the cls
   * @return T
   * @throws Exception the exception
   */
  public <T> T readElementValue(Class<T> cls) throws Exception {
    this.ensureCurrentNodeIsStartElement();

    T value = null;

    if (!this.isEmptyElement()) {
      value = this.readValue(cls);
    }

    return value;
  }

  /**
   * Reads the value. Should return content element or text node as string Present event must be START
   * ELEMENT. After executing this function Present event will be set on END ELEMENT
   *
   * @return String
   * @throws XMLStreamException                 the XML stream exception
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   */
  public String readValue() throws XMLStreamException, ServiceXmlDeserializationException {
    return readValue(false);
  }

  /**
   * Reads the value. Should return content element or text node as string Present event must be START
   * ELEMENT. After executing this function Present event will be set on END ELEMENT
   *
   * @param keepWhiteSpace Do not remove whitespace characters if true
   * @return String
   * @throws XMLStreamException                 the XML stream exception
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   */
  public String readValue(boolean keepWhiteSpace)
      throws XMLStreamException, ServiceXmlDeserializationException {
    if (this.presentEvent.isStartElement()) {
      // Go to next event and check for Characters event
      this.read(keepWhiteSpace);
      if (this.presentEvent.isCharacters()) {
        final StringBuilder elementValue = new StringBuilder();
        do {
          if (this.getNodeType().nodeType == XmlNodeType.CHARACTERS) {
            Characters characters = (Characters) this.presentEvent;
            if (keepWhiteSpace || (!characters.isIgnorableWhiteSpace() && !characters.isWhiteSpace())) {
              final String charactersData = characters.getData();
              if (charactersData != null && !charactersData.isEmpty()) {
                elementValue.append(charactersData);
              }
            }
          }
          this.read();
        } while (!this.presentEvent.isEndElement());
        // Characters chars = this.presentEvent.asCharacters();
        // String elementValue = chars.getData();
        // Advance to next event post Characters (ideally it will be End
        // Element)
        // this.read();
        return elementValue.toString();
      } else if (this.presentEvent.isEndElement()) {
        return "";
      } else {
        throw new ServiceXmlDeserializationException(
            getReadValueErrMsg("Could not find " + XmlNodeType.getString(XmlNodeType.CHARACTERS)));
      }
    } else if (this.presentEvent.getEventType() == XmlNodeType.CHARACTERS && this.presentEvent
        .isCharacters()) {
      /*
       * if(this.presentEvent.asCharacters().getData().equals("<")) {
       */
      final String charData = this.presentEvent.asCharacters().getData();
      final StringBuilder data = new StringBuilder(charData == null ? "" : charData);
      do {
        this.read(keepWhiteSpace);
        if (this.getNodeType().nodeType == XmlNodeType.CHARACTERS) {
          Characters characters = (Characters) this.presentEvent;
          if (keepWhiteSpace || (!characters.isIgnorableWhiteSpace() && !characters.isWhiteSpace())) {
            final String charactersData = characters.getData();
            if (charactersData != null && !charactersData.isEmpty()) {
              data.append(charactersData);
            }
          }
        }
      } while (!this.presentEvent.isEndElement());
      return data.toString();// this.presentEvent. = new XMLEvent();
      /*
       * } else { Characters chars = this.presentEvent.asCharacters();
       * String elementValue = chars.getData(); // Advance to next event
       * post Characters (ideally it will be End // Element) this.read();
       * return elementValue; }
       */
    } else {
      throw new ServiceXmlDeserializationException(
          getReadValueErrMsg("Expected is " + XmlNodeType.getString(XmlNodeType.START_ELEMENT)));
    }

  }

  /**
   * Tries to read value.
   *
   * @param value the value
   * @return boolean
   * @throws XMLStreamException                 the XML stream exception
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   */
  public boolean tryReadValue(OutParam<String> value)
      throws XMLStreamException, ServiceXmlDeserializationException {
    if (!this.isEmptyElement()) {
      this.read();

      if (this.presentEvent.isCharacters()) {
        value.setParam(this.readValue());
        return true;
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

  /**
   * Reads the value.
   *
   * @param <T> the generic type
   * @param cls the cls
   * @return T
   * @throws Exception the exception
   */
  public <T> T readValue(Class<T> cls) throws Exception {
    return EwsUtilities.parse(cls, this.readValue());
  }

  /**
   * Reads the base64 element value.
   *
   * @return byte[]
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws XMLStreamException                 the XML stream exception
   * @throws IOException                        signals that an I/O exception has occurred
   */
  public byte[] readBase64ElementValue()
      throws ServiceXmlDeserializationException, XMLStreamException, IOException {
    this.ensureCurrentNodeIsStartElement();

    byte[] buffer = null;

    ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();

    buffer = Base64.decodeBase64(this.xmlReader.getElementText().toString());
    byteArrayStream.write(buffer);

    return byteArrayStream.toByteArray();

  }

  /**
   * Reads the base64 element value.
   *
   * @param outputStream the output stream
   * @throws Exception the exception
   */
  public void readBase64ElementValue(OutputStream outputStream) throws Exception {
    this.ensureCurrentNodeIsStartElement();

    byte[] buffer = null;
    buffer = Base64.decodeBase64(this.xmlReader.getElementText().toString());
    outputStream.write(buffer);
    outputStream.flush();
  }

  /**
   * Reads the start element.
   *
   * @param namespacePrefix the namespace prefix
   * @param localName       the local name
   * @throws Exception the exception
   */
  public void readStartElement(String namespacePrefix, String localName) throws Exception {
    this.internalReadElement(namespacePrefix, localName, new XmlNodeType(XmlNodeType.START_ELEMENT));
  }

  /**
   * Reads the start element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @throws Exception the exception
   */
  public void readStartElement(XmlNamespace xmlNamespace, String localName) throws Exception {
    this.internalReadElement(xmlNamespace, localName, new XmlNodeType(XmlNodeType.START_ELEMENT));
  }

  /**
   * Reads the end element.
   *
   * @param namespacePrefix the namespace prefix
   * @param elementName     the element name
   * @throws Exception the exception
   */
  public void readEndElement(String namespacePrefix, String elementName) throws Exception {
    this.internalReadElement(namespacePrefix, elementName, new XmlNodeType(XmlNodeType.END_ELEMENT));
  }

  /**
   * Reads the end element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @throws Exception the exception
   */
  public void readEndElement(XmlNamespace xmlNamespace, String localName) throws Exception {

    this.internalReadElement(xmlNamespace, localName, new XmlNodeType(XmlNodeType.END_ELEMENT));

  }

  /**
   * Reads the end element if necessary.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @throws Exception the exception
   */
  public void readEndElementIfNecessary(XmlNamespace xmlNamespace, String localName) throws Exception {

    if (!(this.isStartElement(xmlNamespace, localName) && this.isEmptyElement())) {
      if (!this.isEndElement(xmlNamespace, localName)) {
        this.readEndElement(xmlNamespace, localName);
      }
    }
  }

  /**
   * Determines whether current element is a start element.
   *
   * @return boolean
   */
  public boolean isStartElement() {
    return this.presentEvent.isStartElement();
  }

  /**
   * Determines whether current element is a start element.
   *
   * @param namespacePrefix the namespace prefix
   * @param localName       the local name
   * @return boolean
   */
  public boolean isStartElement(String namespacePrefix, String localName) {
    boolean isStart = false;
    if (this.presentEvent.isStartElement()) {
      StartElement startElement = this.presentEvent.asStartElement();
      QName qName = startElement.getName();
      isStart = qName.getLocalPart().equals(localName) && qName.getPrefix().equals(namespacePrefix);
    }
    return isStart;
  }

  /**
   * Determines whether current element is a start element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @return true for matching start element; false otherwise.
   */
  public boolean isStartElement(XmlNamespace xmlNamespace, String localName) {
    return this.isStartElement() && StringUtils.equals(getLocalName(), localName) && (
        StringUtils.equals(getNamespacePrefix(), EwsUtilities.getNamespacePrefix(xmlNamespace)) || StringUtils
            .equals(getNamespaceUri(), EwsUtilities.getNamespaceUri(xmlNamespace)));
  }

  /**
   * Determines whether current element is a end element.
   *
   * @param namespacePrefix the namespace prefix
   * @param localName       the local name
   * @return boolean
   */
  public boolean isEndElement(String namespacePrefix, String localName) {
    boolean isEndElement = false;
    if (this.presentEvent.isEndElement()) {
      EndElement endElement = this.presentEvent.asEndElement();
      QName qName = endElement.getName();
      isEndElement = qName.getLocalPart().equals(localName) && qName.getPrefix().equals(namespacePrefix);

    }
    return isEndElement;
  }

  /**
   * Determines whether current element is a end element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @return boolean
   */
  public boolean isEndElement(XmlNamespace xmlNamespace, String localName) {

    boolean isEndElement = false;
    /*
     * if(localName.equals("Body")) { return true; } else
     */
    if (this.presentEvent.isEndElement()) {
      EndElement endElement = this.presentEvent.asEndElement();
      QName qName = endElement.getName();
      isEndElement =
          qName.getLocalPart().equals(localName) && (
              qName.getPrefix().equals(EwsUtilities.getNamespacePrefix(xmlNamespace)) || qName
                  .getNamespaceURI().equals(EwsUtilities.getNamespaceUri(xmlNamespace)));

    }
    return isEndElement;
  }

  /**
   * Skips the element.
   *
   * @param namespacePrefix the namespace prefix
   * @param localName       the local name
   * @throws Exception the exception
   */
  public void skipElement(String namespacePrefix, String localName) throws Exception {
    if (!this.isEndElement(namespacePrefix, localName)) {
      if (!this.isStartElement(namespacePrefix, localName)) {
        this.readStartElement(namespacePrefix, localName);
      }

      if (!this.isEmptyElement()) {
        do {
          this.read();
        } while (!this.isEndElement(namespacePrefix, localName));
      }
    }
  }

  /**
   * Skips the current element.
   *
   * @throws Exception the exception
   */
  public void skipCurrentElement() throws Exception {
    this.skipElement(this.getNamespacePrefix(), this.getLocalName());
  }

  /**
   * Ensures the current node is start element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   */
  public void ensureCurrentNodeIsStartElement(XmlNamespace xmlNamespace, String localName)
      throws ServiceXmlDeserializationException {

    if (!this.isStartElement(xmlNamespace, localName)) {
      throw new ServiceXmlDeserializationException(String.format(
          "The element '%s' in namespace '%s' wasn't found at the current position.", localName,
          xmlNamespace));
    }
  }

  /**
   * Ensures the current node is start element.
   *
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   */
  public void ensureCurrentNodeIsStartElement() throws ServiceXmlDeserializationException {
    XmlNodeType presentNodeType = new XmlNodeType(this.presentEvent.getEventType());
    if (!this.presentEvent.isStartElement()) {
      throw new ServiceXmlDeserializationException(String.format(
          "The start element was expected, but node '%s' of type %s was found.", this.presentEvent.toString(),
          presentNodeType.toString()));
    }
  }

  /**
   * Ensures the current node is start element.
   *
   * @param xmlNamespace the xml namespace
   * @param localName    the local name
   * @throws Exception the exception
   */
  public void ensureCurrentNodeIsEndElement(XmlNamespace xmlNamespace, String localName) throws Exception {
    if (!this.isEndElement(xmlNamespace, localName)) {
      if (!(this.isStartElement(xmlNamespace, localName) && this.isEmptyElement())) {
        throw new ServiceXmlDeserializationException(String.format(
            "The element '%s' in namespace '%s' wasn't found at the current position.", xmlNamespace,
            localName));
      }
    }
  }

  /**
   * Outer XML as string.
   *
   * @return String
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws XMLStreamException                 the XML stream exception
   */
  public String readOuterXml() throws ServiceXmlDeserializationException, XMLStreamException {
    if (!this.isStartElement()) {
      throw new ServiceXmlDeserializationException("The current position is not the start of an element.");
    }

    XMLEvent startEvent = this.presentEvent;
    XMLEvent event;
    StringBuilder str = new StringBuilder();
    str.append(startEvent);
    do {
      event = this.xmlReader.nextEvent();
      str.append(event);
    } while (!checkEndElement(startEvent, event));

    return str.toString();
  }

  /**
   * Reads the Inner XML at the given location.
   *
   * @return String
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws XMLStreamException                 the XML stream exception
   */
  public String readInnerXml() throws ServiceXmlDeserializationException, XMLStreamException {
    if (!this.isStartElement()) {
      throw new ServiceXmlDeserializationException("The current position is not the start of an element.");
    }

    XMLEvent startEvent = this.presentEvent;
    StringBuilder str = new StringBuilder();
    do {
      XMLEvent event = this.xmlReader.nextEvent();
      if (checkEndElement(startEvent, event)) {
        break;
      }
      str.append(event);
    } while (true);

    return str.toString();
  }

  /**
   * Check end element.
   *
   * @param startEvent the start event
   * @param endEvent   the end event
   * @return true, if successful
   */
  public static boolean checkEndElement(XMLEvent startEvent, XMLEvent endEvent) {
    boolean isEndElement = false;
    if (endEvent.isEndElement()) {
      QName qEName = endEvent.asEndElement().getName();
      QName qSName = startEvent.asStartElement().getName();
      isEndElement =
          qEName.getLocalPart().equals(qSName.getLocalPart()) && (
              qEName.getPrefix().equals(qSName.getPrefix()) || qEName.getNamespaceURI().equals(qSName.
                  getNamespaceURI()));

    }
    return isEndElement;
  }

  /**
   * Gets the XML reader for node.
   *
   * @return null
   * @throws XMLStreamException                 the XML stream exception
   * @throws ServiceXmlDeserializationException the service xml deserialization exception
   * @throws FileNotFoundException              the file not found exception
   */
  public XMLEventReader getXmlReaderForNode()
      throws FileNotFoundException, ServiceXmlDeserializationException, XMLStreamException {
    return readSubtree();
  }

  public XMLEventReader readSubtree()
      throws XMLStreamException, FileNotFoundException, ServiceXmlDeserializationException {

    if (!this.isStartElement()) {
      throw new ServiceXmlDeserializationException("The current position is not the start of an element.");
    }

    XMLEventReader eventReader = null;
    InputStream in = null;
    XMLEvent startEvent = this.presentEvent;
    XMLEvent event = startEvent;
    StringBuilder str = new StringBuilder();
    str.append(startEvent);
    do {
      event = this.xmlReader.nextEvent();
      str.append(event);
    } while (!checkEndElement(startEvent, event));

    try {

      XMLInputFactory inputFactory = XMLInputFactory.newInstance();

      try {
        in = new ByteArrayInputStream(str.toString().getBytes("UTF-8"));
      } catch (UnsupportedEncodingException e) {
        LOG.error(e);
      }
      eventReader = inputFactory.createXMLEventReader(in);

    } catch (Exception e) {
      LOG.error(e);
    }
    return eventReader;
  }

  /**
   * Reads to the next descendant element with the specified local name and namespace.
   *
   * @param xmlNamespace The namespace of the element you with to move to.
   * @param localName    The local name of the element you wish to move to.
   * @throws XMLStreamException the XML stream exception
   */
  public void readToDescendant(XmlNamespace xmlNamespace, String localName) throws XMLStreamException {
    readToDescendant(localName, EwsUtilities.getNamespaceUri(xmlNamespace));
  }

  public boolean readToDescendant(String localName, String namespaceURI) throws XMLStreamException {

    if (!this.isStartElement()) {
      return false;
    }
    XMLEvent startEvent = this.presentEvent;
    XMLEvent event = this.presentEvent;
    do {
      if (event.isStartElement()) {
        QName qEName = event.asStartElement().getName();
        if (qEName.getLocalPart().equals(localName) && qEName.getNamespaceURI().equals(namespaceURI)) {
          return true;
        }
      }
      event = this.xmlReader.nextEvent();
    } while (!checkEndElement(startEvent, event));

    return false;
  }

  /**
   * Gets a value indicating whether this instance has attribute.
   *
   * @return boolean
   */
  public boolean hasAttributes() {

    if (this.presentEvent.isStartElement()) {
      StartElement startElement = this.presentEvent.asStartElement();
      return startElement.getAttributes().hasNext();
    } else {
      return false;
    }
  }

  /**
   * Gets a value indicating whether current element is empty.
   *
   * @return boolean
   */
  public boolean isEmptyElement() {
    boolean isPresentStartElement = false;
    boolean isNextEndElement = false;
    try {
      isPresentStartElement = this.presentEvent.isStartElement();
    } catch (Exception e) {
    }
    try {
      isNextEndElement = this.xmlReader.peek().isEndElement();
    } catch (Exception e) {
    }
    return isPresentStartElement && isNextEndElement;
  }

  /**
   * Gets the local name of the current element.
   *
   * @return String
   */
  public String getLocalName() {

    String localName = null;

    if (this.presentEvent.isStartElement()) {
      localName = this.presentEvent.asStartElement().getName().getLocalPart();
    } else {

      localName = this.presentEvent.asEndElement().getName().getLocalPart();
    }
    return localName;
  }

  /**
   * Gets the namespace prefix.
   *
   * @return String
   */
  protected String getNamespacePrefix() {
    if (this.presentEvent.isStartElement()) {
      return this.presentEvent.asStartElement().getName().getPrefix();
    }
    if (this.presentEvent.isEndElement()) {
      return this.presentEvent.asEndElement().getName().getPrefix();
    }
    return null;
  }

  /**
   * Gets the namespace URI.
   *
   * @return String
   */
  public String getNamespaceUri() {

    String nameSpaceUri = null;
    if (this.presentEvent.isStartElement()) {
      nameSpaceUri = this.presentEvent.asStartElement().getName().getNamespaceURI();
    } else {

      nameSpaceUri = this.presentEvent.asEndElement().getName().getNamespaceURI();
    }
    return nameSpaceUri;
  }

  /**
   * Gets the type of the node.
   *
   * @return XmlNodeType
   * @throws XMLStreamException the XML stream exception
   */
  public XmlNodeType getNodeType() throws XMLStreamException {
    XMLEvent event = this.presentEvent;
    return new XmlNodeType(event.getEventType());
  }

  /**
   * Gets the name of the current element.
   *
   * @return Object
   */
  protected Object getName() {
    String name = null;
    if (this.presentEvent.isStartElement()) {
      name = this.presentEvent.asStartElement().getName().toString();
    } else {

      name = this.presentEvent.asEndElement().getName().toString();
    }
    return name;
  }

  /**
   * Checks is the string is null or empty.
   *
   * @param namespacePrefix the namespace prefix
   * @return true, if is null or empty
   */
  private static boolean isNullOrEmpty(String namespacePrefix) {
    return (namespacePrefix == null || namespacePrefix.isEmpty());

  }

  /**
   * Gets the error message which happened during {@link #readValue()}.
   *
   * @param details details message
   * @return error message with details
   */
  private String getReadValueErrMsg(final String details) {
    final int eventType = this.presentEvent.getEventType();
    return "Could not read value from " + XmlNodeType.getString(eventType) + "." + details;
  }

}

redpajama_set_name: RedPajamaGithub


What does the "Delete all board cookies�? do?
What is the "Save�? button for in topic posting?
Where are the leagues and how do I join one?
How do I become a league leader?
Why do some leagues appear in a different colour?
What is a "Default league�??
What is "The team�? link?
You may not have to, it is up to the administrator of the board as to whether you need to register in order to post messages. However; registration will give you access to additional features not available to guest users such as definable avatar images, private messaging, emailing of fellow users, league subscription, etc. It only takes a few moments to register so it is recommended you do so.
Within your User Control Panel, under "Board preferences�?, you will find the option Hide your online status. Enable this option with Yes and you will only appear to the administrators, moderators and yourself. You will be counted as a hidden user.
"Delete all board cookies�? deletes the cookies created by phpBB which keep you authenticated and logged into the board. It also provides functions such as read tracking if they have been enabled by the board owner. If you are having login or logout problems, deleting board cookies may help.
When posting a new topic or editing the first post of a topic, click the "Poll creation�? tab below the main posting form; if you cannot see this, you do not have appropriate permissions to create polls. Enter a title and at least two options in the appropriate fields, making sure each option is on a separate line in the textarea. You can also set the number of options users may select during voting under "Options per user�?, a time limit in days for the poll (0 for infinite duration) and lastly the option to allow users to amend their votes.
Some forums may be limited to certain users or leagues. To view, read, post or perform another action you may need special permissions. Contact a moderator or board administrator to grant you access.
Attachment permissions are granted on a per forum, per league, or per user basis. The board administrator may not have allowed attachments to be added for the specific forum you are posting in, or perhaps only certain leagues can post attachments. Contact the board administrator if you are unsure about why you are unable to add attachments.
By clicking the "Bump topic�? link when you are viewing it, you can "bump�? the topic to the top of the forum on the first page. However, if you do not see this, then topic bumping may be disabled or the time allowance between bumps has not yet been reached. It is also possible to bump the topic simply by replying to it, however, be sure to follow the board rules when doing so.
Administrators are members assigned with the highest level of control over the entire board. These members can control all facets of board operation, including setting permissions, banning users, creating leagues or moderators, etc., dependent upon the board founder and what permissions he or she has given the other administrators. They may also have full moderator capabilities in all forums, depending on the settings put forth by the board founder.
Leagues are groups of users that divide the community into manageable sections board administrators can work with. Each user can belong to several leagues and each league can be assigned individual permissions. This provides an easy way for administrators to change permissions for many users at once, such as changing moderator permissions or granting users access to a private forum.
You can view all leagues via the "Leagues�? link within your User Control Panel. If you would like to join one, proceed by clicking the appropriate button. Not all leagues have open access, however. Some may require approval to join, some may be closed and some may even have hidden memberships. If the league is open, you can join it by clicking the appropriate button. If a league requires approval to join you may request to join by clicking the appropriate button. The league leader will need to approve your request and may ask why you want to join the league. Please do not harass a league leader if they reject your request; they will have their reasons.
A league leader is usually assigned when leages are initially created by a board administrator. If you are interested in creating a league, your first point of contact should be an administrator; try sending a private message.
It is possible for the board administrator to assign a colour to the members of a league to make it easy to identify the members of this league.
If you are a member of more than one league, your default is used to determine which league colour and league rank should be shown for you by default. The board administrator may grant you permission to change your default league via your User Control Panel.
Enter a search term in the search box located on the index, forum or topic pages. Advanced search can be accessed by clicking the "Advance Search�? link which is available on all pages on the forum. How to access the search may depend on the style used.
Your search returned too many results for the webserver to handle. Use "Advanced search�? and be more specific in the terms used and forums that are to be searched.
Visit to the "Members�? page and click the "Find a member�? link.
Your own posts can be retrieved either by clicking the "Search user's posts�? within the User Control Panel or via your own profile page. To search for your topics, use the Advanced search page and fill in the various options appropriately.
To subscribe to a specific forum, click the "Subscribe forum�? link upon entering the forum. To subscribe to a topic, reply to the topic with the subscribe checkbox checked or click the "Subscribe topic�? link within the topic itself.
Any of the administrators listed on the "The team�? page should be an appropriate point of contact for your complaints. If this still gets no response then you should contact the owner of the domain (do a whois lookup) or, if this is running on a free service (e.g. Yahoo!, free.fr, f2s.com, etc.), the management or abuse department of that service. Please note that the phpBB Group has absolutely no jurisdiction and cannot in any way be held liable over how, where or by whom this board is used. Do not contact the phpBB Group in relation to any legal (cease and desist, liable, defamatory comment, etc.) matter not directly related to the phpBB.com website or the discrete software of phpBB itself. If you do e-mail phpBB Group about any third party use of this software then you should expect a terse response or no response at all.


text:
opinion. Your opinion erroneous. Excuse, removed..
Pretending - Eric Clapton - Royal Albert Hall 2015 2nd Night "This shows for B.B." (CD)
Label: Beano - Beano-113 • Format: 2x, CD Limited Edition, Numbered, Unofficial Release • Country: Japan • Genre: Rock, Blues • Style: Rhythm & Blues
· Primary Content. Music icon Eric Clapton returns to the Royal Albert Hall to celebrate his 70th birthday. The shows will also mark 50 years since Clapton first played at the iconic London venue – his debut was on 7 December when he performed as part of the Yardbirds for BBC Two's Top Beat Show.. To date, the legendary guitarist has played the Hall on occasions, including
· Eric Clapton has completed a run of 7 concerts at the Royal Albert Hall to celebrate his 70th birthday. The May run saw Clapton surpass an unfathomable Hall performances, with 'Slowhand' now boasting a staggering appearances at London's most iconic venue to date, including headline shows.. He once likened performing at the Hall to "playing in my front room", and.
today: Ballet at the Royal Albert Hall Christmas at the Royal Albert Hall returns at full capacity with Trevor Nelson, Jonas Kaufmann, Professor Brian Cox, carols, The Nutcracker and more Pictures and reactions: Nick Cave and Warren Ellis' emotional return to the Royal Albert Hall.
The album was recorded in July at Madison Square Garden in New York City and the new version released on September 7, as a Super Deluxe Boxed Set, CD, Vinyl and Digital Versions, plus the full album's debut release in Hi-Res surround sound on blu-ray.
· · A full list of all Registry-named recordings with descriptions noting their aesthetic, historic or cultural significance. For many recordings, nationally-known scholars have kindly contributed short essays describing further the work's importance, and are available as indicated.
Rhb - Eddie And Key (File, MP3)
Here We Are - Gloria Estefan - Greatest Hits (Cassette)
Manhunt - Shadow Gallery - Room V (CD, Album)
Tell Me - hide (2) - We ♥ Hide - The Best In The World (Box Set)
Give It To Me (Dub Mix) - Magma (15) - Give It To Me (Vinyl)
In The Midnight Hour (Live)
Soul Pride (Part 1) - James Brown Directs And Dances With The James Brown Band* - The Popcorn (Vinyl
Kroppar - Carolina Falkholt - Kroppar / Landskap (Vinyl)
Acetate - Kingsize / Genetic Engineering (Vinyl)
Im On My Way - Various - Popular Music That Will Live Forever (Vinyl, LP) LEnfance Du Christ - Berlioz*, Colin Davis*, Elsie Morison ∙ Peter Pears, John Cameron ∙ Joseph Roul What I Found - Johnnys Little Rocketship - If Theres Good In This World (CD)
3 Replies to "Pretending - Eric Clapton - Royal Albert Hall 2015 2nd Night "This shows for B.B." (CD)"
Kill says:
Eric Clapton / Royal Albert Hall 2nd Night This Shows For BB / 2CD. in s, Beano, Eric Clapton /07/06 Views. Eric Clapton / Royal Albert Hall 2nd Night This Shows For BB / 2CD / Beano. Translated Text: Live at Royal Albert Hall, London, UK 15th May It will deliver a limitation of the press CD. Because there is a.
Golar says:
· Live At Royal Albert Hall, London, UK 5/15/ DISC ONE This Show's For Somebody's Knocking Key To The Highway Pretending Hoochie Coochie Man You Are So Beautiful Can't Find My Way Home I Shot The Sheriff "Happy Birthday Eric" Driftin' Blues 11, Nobody Knows You When You're Down.
Goltirr says:
· Eric Clapton: Live at the Royal Albert Hall: Directed by Blue Leach. With Paul Carrack, Eric Clapton, Nathan East, Andy Fairweather Low. Celebrating his 70th birthday and his th show at the Royal Albert Hall, Eric Clapton performs his hits in this concert from /10(56).
You have to write correct email here, ex. [email protected]
1 2 >Next page
2015Label: Beano - Beano-113 • Format: 2x, CD Limited Edition, Numbered, Unofficial Release • Country: Japan • Genre: Rock, Blues • Style: Rhythm & Blues · · The 50 Best Movie Theme Songs: A Hollywood Walk Of Fame. From the first talkie, theme songs in movies have found a treasured place in the popular consciousness, as these 50 best film songs prove. · · I would like see Eric do few Derek & Dominos shows next at the Albert Hall but this time with Bobby Whitlock on piano, Derek on slide guitar and a strong rhythm section (no Steve Gadd or Nathan East or Dave Bronze). Play material only . · · Clapton's version preceded Cale's "Naturally" LP by a year (). The song itself was known to Clapton, as Cale had released an earlier version during his brief recording career with Liberty Records in mid 60s. Indeed, Cale was about to "give it up" before Clapton had his hit of the song, which helped JJ get signed to Shelter Records. The Traveling Wilburys (sometimes shortened to the Wilburys) were an English–American supergroup consisting of Bob Dylan, George Harrison, Jeff Lynne, Roy Orbison and Tom ating from an idea discussed by Harrison and Lynne during the sessions for Harrison's album Cloud Nine, the band formed in April after the five members united to record a bonus track for Harrison's. · From guitar faces to the different kinds of axes, here is the Top 10 Greatest Guitar Players. Squeezing the talent that's blessed our ears for all these years into a list of 10 is just as difficult as choosing which limbs to lose or keep. The list is by no means definitive, but it's an accurate representation for the uniqueness of the music the guitarist has made. My People (The Shrink Mix) - Orphean Featuring Terry* - My People (CD) The Ice Bureau - Justin Robertson Presents Revtone - Justin Robertson Presents Revtone (CD, Album) Who Do You Think You Are? - Delores Banks - Who Do You Think You Are? (Vinyl) Cécilia - De Soleil Et De Glace (Vinyl) A La Tardecer Con Las Oropendolas The Proud Ones - Zaine Griff - Ashes And Diamonds / Figures (CD, Album, Album) Casualty - Snake River Conspiracy - Sonic Jihad (CD, Album) Dont You Worry Bout A Thing - Carmen McRae - Fine And Mellow (CD) Carlos Montoya, Sabicas, Juan Serrano, Miguel Gálvez, José Feràndez (Chaleco)* - Flamenco (Vinyl, LP Ty Cobb - Tadaima (2) - Whatever Feels Good (Cassette) Leink - Hadouken (File, MP3) Townes Van Zandt - High, Low And In Between (CD) Played Yourself - Sports (8) - Sports (Vinyl, LP, Album)
SRC - SRC (Vinyl, LP, Album)
Fuck Me, Товарищ Колобок - Various - Заяц Pop Шоу - Best (CD)
D.J. Delight
Different Klicks - Lanny May - Art Love Iam (File, MP3)
Going Crazy (Version)
Samusar on Pretending - Eric Clapton - Royal Albert Hall 2015 2nd Night "This shows for B.B." (CD)

redpajama_set_name: RedPajamaCommonCrawl


Are you saying that you cannot see where to control that formatting or the formatting is set but its not working? The formatting is set right where you have the formula built.
Where is this formatting for the calc column where I can set separation with commas for 1,000?
Not tested but try App Properties and let us know if that worked.
Thanks. That worked. For some reason I did have that set earlier and it changed. It would be nice to have a universal app properties to set at the account level so you don't have to remember what you prefer when setting up a new app. Again, you saved the day.
I quite agree, , that should be a realm account levelsetting. Most of us don't wake up each day and create a new app for a different region of the world.


text:
Explore And Learn Technology Insights
Mac Operating Systems Vulnerable to New Security Exploit
Bobby Kann
A recently discovered security vulnerability could leave Mac users exposed to malware disguising itself in other programs. If your business relies on Mac, it's important to know how you can protect your company from falling victim to a cyberattack. What is the Security Vulnerability? In early 2019, security expert Filippo Cavallarin discovered a bug in Apple's Gatekeeper…
A Law Firm's Guide To Managed IT Services
Technological downtime can make or break a law firm. Even an hour of downtime can cost a small or medium firm as much as $250,000. What Exactly Can Go Wrong? Unfortunately, Murphy's Law has been known to apply in legal cases, meaning if there is an opportunity for things to go wrong they will. It…
Using Today View in iOS 12
iOS 12 brings a lot to the table and you will want to take full advantage of it to get the most out of your device. The Today View in iOS 12 is one feature that is worth exploring to determine how you can leverage it to make your workday and personal life more organized….
Acquiring A New Business? Check Their Cybersecurity Posture
Buying a company is no small undertaking, even if the company is considered "small" by industry standards. Due diligence is a huge part of the process. Anyone considering purchasing business must review a whole host of issues with the company to ensure that they are making a good decision. Things like accounts receivable, market position,…
Why Security Awareness Training Makes Sense for Your Small Business
Your small business needs a cybersecurity strategy, but beyond that, it also needs security awareness training. These two areas are not one and the same. There are important, distinct differences. The Importance of a Cyber Security Strategy First, let's talk about cybersecurity in general. By now you likely understand the importance of cybersecurity for your…
What Houston IT Consulting Companies Really Do
Left scratching your head about what your Houston IT consulting company is doing for you? Well, you're not alone. Many of your peers don't know.
How To Use Incognito Mode To Privately Watch YouTube Video
When it comes to watching videos online, no name comes to mind more often than YouTube. They host nearly 2 billion users each month. 60% of people now prefer watching YouTube to watching TV. 80% of people under 49 are watching videos on YouTube. It's popular. We get it. Everyone is on it. And there's a…
What Are Google's Local Guides?
Local Guides have contributed content about hundreds of thousands of businesses. They get together and have held meetups and conducted projects in Europe, India, South America, North America, Australia, and Asia. How Are Google's Local Guides Different From Google Users? People have been contributing reviews, photos, and videos to Google for years. Google Local Guides…
What Can A Business Impact Analysis Do For Your Organization?
When a company functions at a high level, productivity and profitability appear seamless. But it's also incumbent on decision-makers to understand the potential ramifications for business disruption. Without a working knowledge of how a breakdown in one area of an operation impacts the other moving parts, viable solutions remain out of reach. Determined industry leaders…
What Is Technology Competence
According to the LawSites blog, as of this writing, there are 36 states that have adopted the ABA's updated Model Rule 1.1, which states that lawyers should maintain technology competence. The rule is purposefully vague to allow for the constant changes in technology that the legal industry is encountering. Unfortunately, the vagueness can create some anxiety…
« ‹45678› »


St. Louis 48HFP 2016 Returning Soon! On June 10-12, you can join hundreds of filmmakers and make a movie in 48 hours! That's right – write, shoot, edit and score a short film in 48 hours. Then see it premiered up on the big screen! Registration will begin at 12:01am on Tuesday, April 5.
The 48 Hour Film Project is spanning all six continents this year – visiting at least 144 cities. Which one of you will make the best short film to represent St. Louis against teams from around the world vying for the title of "The Best 48 Hour Film of 2016"?


Xi'an is the capital city of Shaanxi Province, located in Chin's northwestern region. It is one of the oldest cities in China with a history dating back more than 3000 years and is also one of the four Great Ancient Capitals of China.
Often regarded as the cradle of Chinese civilization, Xi'an's history has seen many dynasties; it is the home of the terracotta army of Emperor Qin during the Qin Dynasty. More importantly, Xi'an is the starting point of the Silk Road, which was a crucial passage linking China to the West. Given the city's place in China's history, it is fitting that Xi'an is home to some of the country's most important historical sites as well as a number of cultural and religious relics.
Since the early nineties, as part of China's economic effort to boost the economy of the country's interior regions, Xi'an has re-emerged as a cultural and industrial city which is profoundly influenced by education. The city holds great importance in the northwestern region. Xi'an is home to many excellent universities. The city's important industries include manufacturing, tourism and service outsourcing, making it a good option for our Asia internship programme. Xi'an has been reported to be on the list of the 13 emerging megacities in China.
Xi'an welcomes tourists, business people, artists, and scholars wishing to study in China; there is something for everyone!
Go Abroad China (GAC) offers a variety of programs in Xi'an, allowing you to come and experience the cultural history of Xi'an while you complete an internship, learn Chinese, Volunteer and more.
Go Abroad China's different programs run from a couple of weeks through to a full year. We can arrange anything for you right here in Xi'an, whether you plan to come and study or take an internship (or both).
If you are looking for professional career options, come and take part in our exciting internship program in Beijing, China. Go Abroad China provides participants with invaluable and inspiring experiences through a China internship program. Choose from any of our many industry sectors to develop your professional skills.
Xi'an offers an environment rich in history in which to learn Chinese and practice your pronunciations so that you can sound more like a native speaker. There is a lot to see and do around the city as you explore and experience the history of Xi'an.
The HSK, known as "Hanyu Shuiping Kaoshi" in Chinese, is the standard Chinese Language Proficiency Test for non-native Chinese speakers, such as foreigners and overseas Chinese. The primary objective of the HSK is to evaluate the level of standard Mandarin a person has learned. The modern HSK test begins at Level I and goes to Level VI. Go Abroad China has an HSK Preparation program to help you gain your HSK Certification.
Xi'an is the provincial capital of Shaanxi province. The cuisine, typical of northern China, is characterized by an array of cooking methods including deep frying, quick frying, steaming, and braising. The major flavors are sour, spicy and fragrant due to seasoning with salt, vinegar, capsicum and garlic. All sorts of snacks are available in Xi'an – from noodles and desserts to dried foods. Some famous dishes in Xi'an include crumbled flatbread in mutton stew, dumplings or cold noodles with mustard and vinegar. Come to Xi'an and try some of our food to see if you like it!
Xi'an is a city that blends both traditional and modern Chinese culture to give its visitors a memorable time. The Bell Tower area in the historical center of the city offers an assortment of traditional Chinese restaurants, shopping malls and alleyways selling snacks. This area comes alive at night with bright neon lights and the hustle and bustle of people getting out and about; KTV places are also available for the young crowd looking for a good time. For a more relaxed form of entertainment, the city of Xi'an has a variety of art shows, Chinese music, dance and opera. As you mingle with other foreigners and Chinese people, you will be able to practice your Chinese, learn conversational Mandarin and get to know some local phrases.
As an increasingly influential city, Xi'an is well connected to other cities and provinces by air, road and rail. Its airport is the largest in northwestern China; besides domestic flights, the Xi'an airport also operates international flights to other big cities in Southeastern Asia. Most people in Xi'an rely on the metro, public buses and electric bikes to move from one place to the next. In recent years, traffic congestion has been growing steadily as more and more people purchase cars.
Xi'an's climate is mild and temperate with four distinct seasons. Summers are usually hot and humid; winters are cold and dry with little snowfall; spring and autumn tend to be a bit more pleasant, with a fair amount of rainfall around September and October.
Tourism is a vital component of Xi'an's economy. The city has many significant historical and cultural sites to visit. The most famous landmark is, without a doubt, the Emperor Qin's Mausoleum and his Terracotta Army in the city's suburbs, the Bell and Drum towers, the ancient city wall, pagodas, gardens and mountain areas. The city also holds an annual Lantern Festival every winter on the city wall. Take a break from your intensive Chinese course and explore during your free time; there is plenty to see in Xi'an!


Archival photographs of various productions of Little Nemo in Slumberland. Copyright in each image resides in the photographer and may not be reproduced without written permission of the photographer. Click on any image to see a larger version.


text:
Varnado is een plaats (village) in de Amerikaanse staat Louisiana, en valt bestuurlijk gezien onder Washington Parish.

Demografie
Bij de volkstelling in 2000 werd het aantal inwoners vastgesteld op 342.
In 2006 is het aantal inwoners door het United States Census Bureau geschat op 348, een stijging van 6 (1,8%).

Geografie
Volgens het United States Census Bureau beslaat de plaats een oppervlakte van
2,2 km², geheel bestaande uit land.

Plaatsen in de nabije omgeving
De onderstaande figuur toont nabijgelegen plaatsen in een straal van 32 km rond Varnado.

Externe link

Plaats in Louisiana

redpajama_set_name: RedPajamaWikipedia


A local youth advocate and broadcaster in Niue Ina Vakaafi is hoping a new local talkback show will spark public debate and interest in the upcoming election.
Niueans go to the polls in May to elect 20 assembly members, 14 of them village representatives and six elected on a common roll.
Some of the seats traditionally go uncontested.
Ina Vakaafi told Sally Round it's hoped more women and young people will stand this time.
INA VAKAAFI: Everyone is focussed on the six common roll seats that we all get to vote for. The villages they select their members and often there have been some members who have been there for quite a long time. As part of a democractic society it would be good if people went and put their names forward and give us some options.
SALLY ROUND: Are there many young people do you think that are anticipating running?
IV: I have heard that there are some young people that have heard or are considering running, or are thinking about it. But no one has come out and said okay I am going to be the youth representative like last time. I would love to see more young people but often it comes down to how well grounded you are in your community. You need to do your community work you need to serve your people. You can't just wake up one day and say I am going to run. Because the way that people vote there is community votes. If there is a particular common roll member from a particular village of course that village will be behind that particular candidate. If you are from a quite prominent family the bigger the family you have the more support you will get. So sometimes the ideals of democracy doesn't really translate into the way people vote. So you have to really gauge if you go back and look at the results from the previous two elections. And you can tell okay, Alofi South is the largest constituency. Have you done enough in that community. Are you going to go and campaign or are you going to let your actions speak for themselves.
SR: You are going to be having talkback aren't you before the election. Are you hoping that people are really going to get involved?
IV: We are always hopeful. You know there is a lot of. A lot of the discussions about the pending elections it is good to go and sit in some of these you know the women's groups when they are weaving they are not just there to weave they are probably talking about, ' did you hear that this person is putting their name forward, what do you think?'. Looking at the number of voters you would think that because there are more women. That we would have more women voting for women to get into parliament. Like what they did back in Lady Rex's day where the council of women were actually the driving force behind getting a number of women into parliament that particular year. At the moment it is more individuals putting there name forward and they really need to campaign. Some people have already started campaigning. And time will tell. We are going to have talk back and we are going to start analysing Niuean politics from different perspectives. And people can call in and tell us what they think. Because everyone knows everyone and they know your voice. Maybe if we keep track of the discussions on social media that is another good indicator.


text:
La synthèse d'ouverture est un procédé d'interférométrie qui permet de regrouper les données issues d'un ensemble de télescopes pour produire une image qui a la même résolution angulaire que celle qu'aurait un télescope faisant la taille de l'ensemble tout entier.

Pour chaque séparation et chaque orientation, l'interféromètre produit un signal, composante de la transformée de Fourier de la distribution spatiale de la luminosité de l'objet observé. L'image (ou « carte ») de l'objet est obtenue à partir de ces différentes mesures. Les interféromètres astronomiques permettent ainsi des observations dans le visible, l'infrarouge, le sous-millimétrique et les ondes radio avec une grande précision.

Principe
Afin de former une image de haute qualité, un nombre important de séparations entre les télescopes est nécessaire. La séparation entre deux télescopes, vue depuis l'objet observé, est appelée « ligne de base ». Plus nombreuses sont les lignes de bases, meilleure sera l'image. Par exemple, le  regroupe 27 télescopes, qui forment 351 lignes de base indépendantes. En revanche, les plus grands ensembles de télescopes dans le visible regroupent 6 télescopes, et donnent des images de moins bonne qualité avec 15 lignes de base.

La plupart des systèmes utilisant la synthèse d'ouverture utilisent la rotation de la Terre afin d'augmenter le nombre de lignes de base. En regroupant les données prises à différents instants, on a accès à des angles et séparations plus variés, sans nécessiter de télescope supplémentaire. Quelques instruments utilisent une rotation artificielle de l'ensemble d'interféromètres, comme dans l'interférométrie de masquage d'ouverture.

Histoire
La synthèse d'ouverture fut développée à l'origine pour les ondes radio par Martin Ryle et ses assistants du groupe de radioastronomie de l'Université de Cambridge. Martin Ryle et Antony Hewish ont partagé un prix Nobel pour cela, et d'autres contributions dans le développement de l'interférométrie radio. Le groupe fonda dans les années 1950 l'observatoire de radioastronomie Mullard, près de Cambridge. Vers la fin des années 1960 et le début des années 1970, lorsque les ordinateurs devinrent accessibles et suffisamment performants pour réaliser les inversions de Fourier, ils furent utilisés pour tenter une synthèse d'ouverture sur  (), puis sur , avec les télescopes de l'observatoire Mullard. La technique fut affinée, pour donner l'interférométrie à très longue base, permettant des lignes de base de plusieurs milliers de kilomètres.

La synthèse d'ouverture est utilisée sur certains radars, dits radars à synthèse d'ouverture, et même sur certains télescopes travaillant dans le visible. En 2014, six interféromètres visibles/infrarouges ont produit des images à partir de la synthèse d'ouverture : COAST, NPOI, IOTA, ISI, CHARA et le VLTI.

Voir aussi

Articles connexes
 Radar à synthèse d'ouverture.

Liens externes
  Cambridge Optical Aperture Synthesis Telescope (COAST).

Notes et références

Technique de l'observation astronomique
Interféromètre
Radiotélescope


text:
What is Legal Custody in Indiana?
In Indiana there are two forms of custody that courts must determine in custody matters. The two are physical custody and legal custody. As I like to explain to my clients, "physical custody is where the child lays their head down at night" and "legal custody is who makes decisions on the child's upbringing."
Who has physical custody (or joint physical custody) is often the cause of litigation in paternity actions and dissolution (divorce) actions in Indiana. However, most of the time, legal custody does not get litigated. Fifteen years ago legal custody was the cause of many court battles as well. However, with the adoption of the Indiana Parenting Time Guidelines, court battles over legal custody are not that common (or shouldn't be). This is because legal custody is somewhat addressed by the Indiana Parenting Time Guidelines, which suggest both parents should have a say in the child's upbringing.
Legal custody is who makes decisions on the children's upbringing, such as: Where will the child go to school? What religion will the child be brought up? What doctors will the child go to? What medical treatment will the child receive? What daycare will the child attend?
If a parent has sole legal custody then that parent does not need the other parent to agree to these decisions for the child. This basically means the parent with sole legal custody has 100% control over the child's upbringing. This is why, unless the parents have a history of not agreeing to these matters, most judges grant the parents joint legal custody. The rationale behind this is that Judges want parents to co-parent their children. What better way to encourage this than to allow both parents to participate in the decision making for their child.
Joint Legal custody means the parties have to agree on those decisions relating to the child. If the parties do not agree then it doesn't take place. The other parent always has the right to petition the court to get involved if the parents cannot agree. For example, if a child requires surgery and the child's doctor is recommending the surgery, if the parents do not agree, then the parent may request the court make the decision. I can tell you through experience, a judge will not be very happy if the judge has to decide this issue. Parents should make these decisions for their children not a judge. In my experience unless there is a very good reason for the surgery not to take place, the judge is going to side with the medical professional and then question the non-agreeing parent's decision making ability and possibly modify the joint custody arrangement.


text:
2 unions resume efforts to reach new deals with NJ Transit
Two rail workers unions that recently rejected tentative contracts with New Jersey Transit are resuming efforts to reach new deals.
The Brotherhood of Locomotive Engineers said its negotiators met Monday with agency officials to discuss why the contract was rejected and related issues. Another meeting is planned for next week, the union said.
Officials with United Transportation Union Local 60 said they recently met to discuss feedback from members about their rejected contract and consider proposed changes. The union is now polling members about those changes.
NJ Transit officials declined to comment about the negotiations.
The unions were part of an 11-member coalition that reached deals with the agency in March. That came about 24 hours before a strike deadline.
The other unions have ratified their deals.
N.J. is eliminating 'patently unfair' motor vehicle surcharges — but not for 15 years
New Jersey will eliminate surcharges on motor vehicle violations, which defendants are required to pay in addition to court-imposed fines and penalties.
How #MeToo finally came to N.J. politics
New Jersey lawmakers are promising a "culture change" after 20 women in state politics shared their stories of being groped, harassed and even raped.
Seals return to island off the Jersey Shore
Seals have returned to an island off the northern New Jersey coast. Harbor, grey, and harp seals are typical winter visitors at the Jersey Shore.


Skirting the waterfront of Atlantic Canada's most vibrant urban harbour, King's Wharf has discovered the secret to creating the perfect community.
Each detail has been carefully considered to provide an elite living experience – an alchemy of nature and design sprinkled with salt water and sunlight.
Southern exposure, city skylines and salt air. Markets, dining and fine retailers. Boat slips and cocktails by sunset. Walking trails and boardwalks. The dynamic Halifax Harbour.
King's Wharf. Come home to the Sea.
Inspired by the vast ocean, the Halifax skyline and the charm of the community in which it resides. Rent or buy today.


Your own pRivate resort with paradise living! 2 bedrooms plus den and 3 full baths. PRivate elevator. Breathtaking bay view, post card gorgeous. Fall in love with the pRivate master suite with balcony over looking the water. The club at 1010, an exclusive two story amenity area with dozens of activities for all ages and interests! Indoor heated swimming pool positioned perfectly for sunrise and sunset with retractable Glass walls for flexible access to outdoors. Spa features a turkish steam bath area. Virtual golf stimulator, squash court, outdoor theater and fire pit. Roof top sun deck, access to bar, jacuzzi and pool. Full service building with 24 front desk attendant and valet.fabulous tenant in place until january 2020. More than gorgeous, exquisite beyond words.
CondoBlackBook.com and HB Roswell Realty are not responsible for the accuracy of the 1010 Brickell condos in Brickell Miami information listed above. The data relating to real estate for sale on this web page comes in part from the Internet Data Exchange Program and the South East Florida Regional MLS and is provided here for consumers personal, non-commercial use, It may not be used for any purpose other than to identify prospective Miami Beach area condos consumers may be interested in purchasing. Data provided is deemed reliable but not guaranteed. Listing provided by Florida Professional R E Inc.


text:
Queen's iconic album covers immortalised in new set of Royal Mail stamps
PUBLISHED: 11:56 09 July 2020 | UPDATED: 11:56 09 July 2020
Surrey-based band members Brian May and Roger Taylor said they were 'honoured' to have been featured | Images: Royal Mail
Queen has become the third band in history to be immortalised in a set of Royal Mail stamps, following the Beatles in 2007 and Pink Floyd in 2016.
The collection of 13 stamps, released today (July 9), features images of some of the band's iconic album covers, such as Sheer Heart Attack, A Night at the Opera, News of the World and Innuendo.
Magic Tour
It also includes shots of the four band members during various live performances, such as Freddie Mercury at Wembley Stadium in 1986; Roger Taylor at Hyde Park in 1976, John Deacon at Hammersmith Odeon in 1975 and Brian May in Budapest in 1986.
The centrepiece is the iconic photograph taken by Johnny Dewe Mathews at the group's first ever studio photoshoot in a Primrose Hill studio.
"Since we four precocious boys started out on our quest 50 years ago, our lives have been devoted to making our impossible dream come true.
"Sometimes it's strange to wake up and realise the position in which we are now held – we have become a national institution," May, who lives in Windlesham, said of the collection.
"It's particularly poignant to look at this collection of images now - now that we are all in a world dominated by a coronavirus, in which none of this could have happened."
Puttenham resident, Taylor, added: "Wow stamps featuring our albums! What an honour. We must be really part of the furniture now!"
The launch of the collection comes ahead of the band celebrating its 50th anniversary in 2021 – Mercury, Taylor, Deacon and May made their first live appearance together as Queen at Surrey College (thought to be West Surrey College of Art & Design, then in Guildford) on July 2, 1971.
The full set of 13 stamps are available in a presentation pack for £16. royalmail.com/queen


text:
"Distinguishing hope from hype in the search for stem-cell breakthroughs"
by Tech Council | Jul 1, 2007 | Featured, NEWSROOM, Tech Council News
By Tom Still
MADISON – Opponents of human embryonic stem-cell research are fond of saying it has yet to produce any cures. That's like asking a fourth-grader why he doesn't have a job, given that it's been only nine years since UW-Madison scientist James Thomson figured out how to keep stem cells alive long enough to study them.
On the opposite extreme, excited proponents of human embryonic stem-cell research helped bring on the "where are the cures?" chatter by suggesting the end of diseases such as Alzheimer's, Parkinson's and more was just around the corner. That's hyperbole, too, even though the potential for stem-cell research over time is enormous.
For reasons that have more to do with politics than science, human embryonic stem-cell research attracts claims – pro and con – that stretch the imagination, if not the truth. Separating hype from hope becomes a challenge, not only for policymakers and press, but for ordinary citizens. Recent disclosures about research breakthroughs provide a timely example.
Three teams of scientists announced in June they had coaxed ordinary mouse skin cells to become what are, in essence, embryonic stem cells without creating or destroying mouse embryos in the process. The scientists reported on two ways of turning back the biological clocks of skin cells growing in laboratory dishes. Thus rejuvenated, the mouse cells gave rise to "daughter" cells with the ability to become all of the bones, tissues and organs that make up a mouse.
"An end to stem cell debate?" asked one newspaper headline. Not exactly.
For starters, a mouse is not a primate is not a human, so there are layers upon levels of research necessary to determine if the same process could work with human skin cells. Second, the research involved activating and deactivating specific genes – a practice that could make it too dangerous to try in human clinical settings, even if it worked in a lab.
As one of the participating researchers said, "A human is not a mouse, so a lot more work has to be done."
Those same researchers, which included teams from Harvard and the Massachusetts Institute of Technology, called on Congress and President Bush to lift the six-year-old federal ban on funding new stem-cell lines. They noted it would be a mistake for anyone to put too much faith in one breakthrough, even their own.
That didn't prevent opponents of human embryonic stem-cell research from urging Congress and the president to focus on the new approach to the exclusion of everything else.
In his latest veto of a bill to increase funding for human embryonic stem-cell research, President Bush did precisely that. Bush suggested the stem-cell debate would fade away if only Congress would pay for other ways of deriving stem cells. He ordered the Department of Health and Human Services to promote research into stem cells that have the ability to regenerate cell types and body tissues – without use of embryonic stem cells.
The truth of the matter is that Congress and the president should be supporting multiple types of research into stem cells, whether they come from human embryos (donated by parents through in vitro clinics), adult stem cells (that research began in the 1960s) or other sources. Private dollars are being spent on all of those pathways because no one knows for sure what will yield the best results.
Science works best when scientists pursue a variety of related routes. Researchers who work with human embryonic stem cells learn from those who work with adult stem cells, and adult stem-cell researchers learn from those working with embryonic cells. The same kind of knowledge exchange takes place across disciplinary lines, as well. Toxicologists learn from development biologists, who learn from geneticists, and so on.
The next time a news story breaks about a "new" way to create human stem cells, join in the celebration because it's a step forward for science. But don't believe it will trump what science already knows about how human stem cells work, or immediately replace known processes and practices.
Stem-cell research today is built on the hope that science will continue to learn more until diagnostics, treatments, improved drugs and even cures are possible. Until then, don't get caught up in the hype of the breakthrough-of-the-week.
Still is president of the Wisconsin Technology Council. He is the former associate editor of the WisconsinState Journal in Madison.


Safely Remove SONAR.Cryptlck!g160 – How to Delete SONAR.Cryptlck!g160?
Are you infected with vicious SONAR.Cryptlck!g160 virus? Are you searching for the easiest and most effective ways to remove SONAR.Cryptlck!g160? Luckily, you've come to correct spot go through this post carefully to eliminate this threat effectively.
SONAR.Cryptlck!g160 is a nasty Trojan horse that can be so dangerous to your computer. It takes many actions to destroy the infected machine step by step. Each step it takes is capable to lessen the security level and aggravate the infection. It is be able to change system settings or modify system settings as it wishes in a secret way to allow some malicious execution to be effective, automatically launching and bring convenience for hiding behind the system. This is a very dangerous Trojan virus infection which is bringing infected computer to a worse situation like file corruption, especially some important system file corruption to destroy the whole operating system; slow network speed that you can barely open a single webpage quickly; taking other malware into the infected system or opening a backdoor to allow malware going freely.
SONAR.Cryptlck!g160 normally get distributed via spam emails bundled freeware, infected USB, malicious websites and p2p file sharing. After getting into your PC, it will start several malicious activities that will slow down your machine and downgrade your system performance. Many of your system program fail to work and show unexpected error. It can also download other harmful threats and malicious viruses on your computer without permission. This dubious threat will also delete important system files and programs. SONAR.Cryptlck!g160 can also steal your personal and confidential information like your bank account details, credit card number, IP address, mac address etc. and send to hackers. It can also open backdoor into your system for other threats and malware. You are advised to remove SONAR.Cryptlck!g160 soon from your computer.
As SONAR.Cryptlck!g160 virus is stubborn and dangerous, which has the ability to escape from the security tools, you can not rely on security tools to get out of it. To avoid further damage and lost, you are highly suggested to remove this Trojan as soon as possible. The following removal guides will help you delete the nasty infection from your computer thoroughly.
Note: You need to remove SONAR.Cryptlck!g160 from the PC as soon as possible to protect the computer from more other potential problems. If your computer encounters more serious problems apart from the pop-up ads, please be alert because your PC may be infected by other malware. Use a professional malware removal tool to scan the PC right now!
How to protect your PC from virus or malware infections?
1.Avoid clicking links to applications or "free online scans" in pop up windows as well. More often, pop up ads contain links to malware applications which often disguise as legitimate programs and security scanners. Download security applications only from official sites or well-known download sites.
2.Be cautious of file sharing services. According to the survey, some of the largest sources of viruses and malware applications are file-sharing services that host illegal files, pirated software and copyright-infringing music or videos. While downloading free copies of software or multimedia files may put your computer and data at high risk.
3.Be careful of those bogus software and add-ons applications during the installation process. Nowadays, many software developers prefer to bundle other programs in the setup routines or installers for their own applications. However, only few of the "bogus" applications are really useful and genuine, most of them are nothing more than malware or spyware designed to filch users' personal data. So before you install an add-on or bonus application, you are strongly to read the setup contents carefully. And make sure it is safe application and then you can install it on your PC.
4.Install a real-time anti-malware program on your PC which can effectively block online viruses or malware from attacking your computer. Although there are many anti-malware programs, few of them can really provide a real-time protection to the computer. For a real-time anti-malware program, SpyHunter should be your best choice as the powerful removal tool successfully helps many computer users to solve their computer problems and has a good reputation.


text:
CHT
_Khagrachari
_Rangamati
_Bandarban
1900's British Regulation is the only logical document of the CHT pepole`s struggle
Mail Staff January 20, 2021
photo: wikipedia.org PUBLIC OPINION : The Jumma peoples had an princely state and it`s recognized by the British Regulation Act, 1900 .This...
photo: wikipedia.org
PUBLIC OPINION:
The Jumma peoples had an princely state and it`s recognized by the British Regulation Act, 1900 .This princely state must be keep in mind. If international logical support is to seek the solution the CHT problem with the autonomy or independence of the Chittagong Hill Tracts, the only logical document is the "British Regulation Act of 1900 ". The charter handed over poltical power with autonomy to the people of the CHT by prohibiting infiltration and settlement of outsiders . It wouldn't be wrong if we can take it like a independence state . Like Palestine, the issue of the Chittagong Hill Tracts is raised at the UN, this document will serve as a legal proof that do not have such kind of legal proof in many disturbance regions in the world. The UN was compelled to recognize Israel because the Jews have many historical arguments.
By this this document, there have no obstacle for the cht peoples to fight for self-government or independence. Before 1947 partition of the country, the people of the Chittagong Hill Tracts enjoyed self-government and were never dominated by the ruler of Bengal. So the people of the CHT should have a demand for self-government and the restoration of independence consciousness with ``1900's British Regulation ". This charter recognized the Chittagong Hill Tracts as an Excluded Area which the demand for autonomy is logical. The struggle of the future should be based on the spirit of the British Regulation of 1900. It will affect the generation emotionally that they had a country. On the other hand, the message will also reach to the international community about how an independent land was lost.
Today's Israel didn't come into a being in a day. The Jews were evicted from their land and ever-after thousands of years nomadic life they did not forget Jerusalem. One generation did not forget to tell the next generation about their homeland. Thus, generation after generation, the Jews cherished their homeland in their herarhs for thousands of years. Finally, in 1948, after thousands of years of travelling around the world, they gained an independent state, Israel. That is why from now we have to fight with the spirit of princley state and let the generation know once they had an independent state
প্যারিস sent Today at 3:18 PM
Parish Chakma
Blogger & Activist
Bangladesh Government shuts five news portals in the Chittagong Hill Tracts.
Today the fourth death anniversary of Mithun chakma
The 38th Death anniversary of Leader MN Larma
BANGLADESH HAS FAILED TO PROVIDE SAFETY TO MINORITIES: AMNESTY INTERNATIONAL
The 7th anniversary of the communal attack in Bogachari
The 29th anniversary of Bharadwaj Muni's self-sacrifice.
Notice for CHTMAIL readers?
Bangladesh army searched the houses of 19 villagers in Rangamati
Bangladesh: Indigenous Activist Dies in Military Custody - Human Rights Watch
17 Tripura families in fear of eviction in Sajek tourist spot.
We, a group of self-motivated freelance activists living in and out of Bangladesh, are trying to cover news particularly on CHT affairs that never comes on national dailies in the country. Besides CHT, we also try to focus on trending issues happening all around the world.
Copyright © | CHT Mail | All Rights Reserved


After a decade working for the Volkswagen Group in various positions, Martin Hofmann became CIO of Europe's largest carmaker a year ago.
In line with those goals, Hofmann wants VW to have the best IT in the auto industry.
In an interview with automotiveIT, he explained how he plans to reach this goal: with a tightly coordinated leadership team, more employees and a growing awareness of the importance of IT for the group.
With 7,300 staff globally, the IT operation Hofmann oversees is global and integrated. That means each of VW's 12 car brands has its own IT staff, but all teams are networked and all work closely together.
In the interview, Hofmann also discusses his recruitment policy, his plan to in-source more IT and his continuing moves to align IT operations more closely with other VW Group departments.
Read the full interview in the January issue of the automotiveIT Executive Newsletter. To subscribe, please go to: www.automotiveIT.com/newsletter.