  public static function parseQueryString($query)
  {
    $delimiterIndex = 0;
    /** @var UrlReplacement[] $replacements */
    $replacements = array();

    if (empty($query)) {
      return $replacements;
    }

    $queryBuilder = new StringBuilder($query);
    while ($delimiterIndex >= 0) {
      $pairSeparator = $queryBuilder->indexOf(Beauty::REPLACEMENT_DELIMITER);
      if ($pairSeparator < 0) {
        throw new ParserException("Replacement Query Delimiters did not match up");
      }
      $delimiterIndex = $queryBuilder->indexOf(Beauty::REPLACEMENT_DELIMITER, $pairSeparator + 2);
      if ($delimiterIndex < 0) {
        break;
      }
      array_push($replacements, self::fromString($queryBuilder->substring(0, $delimiterIndex)));
      $queryBuilder->delete(0, $delimiterIndex);

      if ($queryBuilder->getCharAt(0) == Beauty::REPLACEMENT_DELIMITER) {
        $queryBuilder->deleteCharAt(0);
      }
    }
    $finalQuery = $queryBuilder->__toString();
    if (!empty($finalQuery)) {
      array_push($replacements, self::fromString($finalQuery));
    }
    return array_reverse($replacements);
  }