text:
<?php

namespace Doctrine\Common\Annotations;

use Doctrine\Common\Annotations\Annotation\Attribute;
use ReflectionClass;
use Doctrine\Common\Annotations\Annotation\Enum;
use Doctrine\Common\Annotations\Annotation\Target;
use Doctrine\Common\Annotations\Annotation\Attributes;

/**
 * A parser for docblock annotations.
 *
 * It is strongly discouraged to change the default annotation parsing process.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
 * @author Jonathan Wage <jonwage@gmail.com>
 * @author Roman Borschel <roman@code-factory.org>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
 */
final class DocParser
{
    /**
     * An array of all valid tokens for a class name.
     *
     * @var array
     */
    private static $classIdentifiers = array(
        DocLexer::T_IDENTIFIER,
        DocLexer::T_TRUE,
        DocLexer::T_FALSE,
        DocLexer::T_NULL
    );

    /**
     * The lexer.
     *
     * @var \Doctrine\Common\Annotations\DocLexer
     */
    private $lexer;

    /**
     * Current target context.
     *
     * @var string
     */
    private $target;

    /**
     * Doc parser used to collect annotation target.
     *
     * @var \Doctrine\Common\Annotations\DocParser
     */
    private static $metadataParser;

    /**
     * Flag to control if the current annotation is nested or not.
     *
     * @var boolean
     */
    private $isNestedAnnotation = false;

    /**
     * Hashmap containing all use-statements that are to be used when parsing
     * the given doc block.
     *
     * @var array
     */
    private $imports = array();

    /**
     * This hashmap is used internally to cache results of class_exists()
     * look-ups.
     *
     * @var array
     */
    private $classExists = array();

    /**
     * Whether annotations that have not been imported should be ignored.
     *
     * @var boolean
     */
    private $ignoreNotImportedAnnotations = false;

    /**
     * An array of default namespaces if operating in simple mode.
     *
     * @var array
     */
    private $namespaces = array();

    /**
     * A list with annotations that are not causing exceptions when not resolved to an annotation class.
     *
     * The names must be the raw names as used in the class, not the fully qualified
     * class names.
     *
     * @var array
     */
    private $ignoredAnnotationNames = array();

    /**
     * @var string
     */
    private $context = '';

    /**
     * Hash-map for caching annotation metadata.
     *
     * @var array
     */
    private static $annotationMetadata = array(
        'Doctrine\Common\Annotations\Annotation\Target' => array(
            'is_annotation'    => true,
            'has_constructor'  => true,
            'properties'       => array(),
            'targets_literal'  => 'ANNOTATION_CLASS',
            'targets'          => Target::TARGET_CLASS,
            'default_property' => 'value',
            'attribute_types'  => array(
                'value'  => array(
                    'required'  => false,
                    'type'      =>'array',
                    'array_type'=>'string',
                    'value'     =>'array<string>'
                )
             ),
        ),
        'Doctrine\Common\Annotations\Annotation\Attribute' => array(
            'is_annotation'    => true,
            'has_constructor'  => false,
            'targets_literal'  => 'ANNOTATION_ANNOTATION',
            'targets'          => Target::TARGET_ANNOTATION,
            'default_property' => 'name',
            'properties'       => array(
                'name'      => 'name',
                'type'      => 'type',
                'required'  => 'required'
            ),
            'attribute_types'  => array(
                'value'  => array(
                    'required'  => true,
                    'type'      =>'string',
                    'value'     =>'string'
                ),
                'type'  => array(
                    'required'  =>true,
                    'type'      =>'string',
                    'value'     =>'string'
                ),
                'required'  => array(
                    'required'  =>false,
                    'type'      =>'boolean',
                    'value'     =>'boolean'
                )
             ),
        ),
        'Doctrine\Common\Annotations\Annotation\Attributes' => array(
            'is_annotation'    => true,
            'has_constructor'  => false,
            'targets_literal'  => 'ANNOTATION_CLASS',
            'targets'          => Target::TARGET_CLASS,
            'default_property' => 'value',
            'properties'       => array(
                'value' => 'value'
            ),
            'attribute_types'  => array(
                'value' => array(
                    'type'      =>'array',
                    'required'  =>true,
                    'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute',
                    'value'     =>'array<Doctrine\Common\Annotations\Annotation\Attribute>'
                )
             ),
        ),
        'Doctrine\Common\Annotations\Annotation\Enum' => array(
            'is_annotation'    => true,
            'has_constructor'  => true,
            'targets_literal'  => 'ANNOTATION_PROPERTY',
            'targets'          => Target::TARGET_PROPERTY,
            'default_property' => 'value',
            'properties'       => array(
                'value' => 'value'
            ),
            'attribute_types'  => array(
                'value' => array(
                    'type'      => 'array',
                    'required'  => true,
                ),
                'literal' => array(
                    'type'      => 'array',
                    'required'  => false,
                ),
             ),
        ),
    );

    /**
     * Hash-map for handle types declaration.
     *
     * @var array
     */
    private static $typeMap = array(
        'float'     => 'double',
        'bool'      => 'boolean',
        // allow uppercase Boolean in honor of George Boole
        'Boolean'   => 'boolean',
        'int'       => 'integer',
    );

    /**
     * Constructs a new DocParser.
     */
    public function __construct()
    {
        $this->lexer = new DocLexer;
    }

    /**
     * Sets the annotation names that are ignored during the parsing process.
     *
     * The names are supposed to be the raw names as used in the class, not the
     * fully qualified class names.
     *
     * @param array $names
     *
     * @return void
     */
    public function setIgnoredAnnotationNames(array $names)
    {
        $this->ignoredAnnotationNames = $names;
    }

    /**
     * Sets ignore on not-imported annotations.
     *
     * @param boolean $bool
     *
     * @return void
     */
    public function setIgnoreNotImportedAnnotations($bool)
    {
        $this->ignoreNotImportedAnnotations = (boolean) $bool;
    }

    /**
     * Sets the default namespaces.
     *
     * @param array $namespace
     *
     * @return void
     *
     * @throws \RuntimeException
     */
    public function addNamespace($namespace)
    {
        if ($this->imports) {
            throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.');
        }

        $this->namespaces[] = $namespace;
    }

    /**
     * Sets the imports.
     *
     * @param array $imports
     *
     * @return void
     *
     * @throws \RuntimeException
     */
    public function setImports(array $imports)
    {
        if ($this->namespaces) {
            throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.');
        }

        $this->imports = $imports;
    }

    /**
     * Sets current target context as bitmask.
     *
     * @param integer $target
     *
     * @return void
     */
    public function setTarget($target)
    {
        $this->target = $target;
    }

    /**
     * Parses the given docblock string for annotations.
     *
     * @param string $input   The docblock string to parse.
     * @param string $context The parsing context.
     *
     * @return array Array of annotations. If no annotations are found, an empty array is returned.
     */
    public function parse($input, $context = '')
    {
        $pos = $this->findInitialTokenPosition($input);
        if ($pos === null) {
            return array();
        }

        $this->context = $context;

        $this->lexer->setInput(trim(substr($input, $pos), '* /'));
        $this->lexer->moveNext();

        return $this->Annotations();
    }

    /**
     * Finds the first valid annotation
     *
     * @param string $input The docblock string to parse
     *
     * @return int|null
     */
    private function findInitialTokenPosition($input)
    {
        $pos = 0;

        // search for first valid annotation
        while (($pos = strpos($input, '@', $pos)) !== false) {
            // if the @ is preceded by a space or * it is valid
            if ($pos === 0 || $input[$pos - 1] === ' ' || $input[$pos - 1] === '*') {
                return $pos;
            }

            $pos++;
        }

        return null;
    }

    /**
     * Attempts to match the given token with the current lookahead token.
     * If they match, updates the lookahead token; otherwise raises a syntax error.
     *
     * @param integer $token Type of token.
     *
     * @return boolean True if tokens match; false otherwise.
     */
    private function match($token)
    {
        if ( ! $this->lexer->isNextToken($token) ) {
            $this->syntaxError($this->lexer->getLiteral($token));
        }

        return $this->lexer->moveNext();
    }

    /**
     * Attempts to match the current lookahead token with any of the given tokens.
     *
     * If any of them matches, this method updates the lookahead token; otherwise
     * a syntax error is raised.
     *
     * @param array $tokens
     *
     * @return boolean
     */
    private function matchAny(array $tokens)
    {
        if ( ! $this->lexer->isNextTokenAny($tokens)) {
            $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens)));
        }

        return $this->lexer->moveNext();
    }

    /**
     * Generates a new syntax error.
     *
     * @param string     $expected Expected string.
     * @param array|null $token    Optional token.
     *
     * @return void
     *
     * @throws AnnotationException
     */
    private function syntaxError($expected, $token = null)
    {
        if ($token === null) {
            $token = $this->lexer->lookahead;
        }

        $message  = sprintf('Expected %s, got ', $expected);
        $message .= ($this->lexer->lookahead === null)
            ? 'end of string'
            : sprintf("'%s' at position %s", $token['value'], $token['position']);

        if (strlen($this->context)) {
            $message .= ' in ' . $this->context;
        }

        $message .= '.';

        throw AnnotationException::syntaxError($message);
    }

    /**
     * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism
     * but uses the {@link AnnotationRegistry} to load classes.
     *
     * @param string $fqcn
     *
     * @return boolean
     */
    private function classExists($fqcn)
    {
        if (isset($this->classExists[$fqcn])) {
            return $this->classExists[$fqcn];
        }

        // first check if the class already exists, maybe loaded through another AnnotationReader
        if (class_exists($fqcn, false)) {
            return $this->classExists[$fqcn] = true;
        }

        // final check, does this class exist?
        return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn);
    }

    /**
     * Collects parsing metadata for a given annotation class
     *
     * @param string $name The annotation name
     *
     * @return void
     */
    private function collectAnnotationMetadata($name)
    {
        if (self::$metadataParser === null) {
            self::$metadataParser = new self();

            self::$metadataParser->setIgnoreNotImportedAnnotations(true);
            self::$metadataParser->setIgnoredAnnotationNames($this->ignoredAnnotationNames);
            self::$metadataParser->setImports(array(
                'enum'          => 'Doctrine\Common\Annotations\Annotation\Enum',
                'target'        => 'Doctrine\Common\Annotations\Annotation\Target',
                'attribute'     => 'Doctrine\Common\Annotations\Annotation\Attribute',
                'attributes'    => 'Doctrine\Common\Annotations\Annotation\Attributes'
            ));

            AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Enum.php');
            AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php');
            AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php');
            AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php');
        }

        $class      = new \ReflectionClass($name);
        $docComment = $class->getDocComment();

        // Sets default values for annotation metadata
        $metadata = array(
            'default_property' => null,
            'has_constructor'  => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0,
            'properties'       => array(),
            'property_types'   => array(),
            'attribute_types'  => array(),
            'targets_literal'  => null,
            'targets'          => Target::TARGET_ALL,
            'is_annotation'    => false !== strpos($docComment, '@Annotation'),
        );

        // verify that the class is really meant to be an annotation
        if ($metadata['is_annotation']) {
            self::$metadataParser->setTarget(Target::TARGET_CLASS);

            foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) {
                if ($annotation instanceof Target) {
                    $metadata['targets']         = $annotation->targets;
                    $metadata['targets_literal'] = $annotation->literal;

                    continue;
                }

                if ($annotation instanceof Attributes) {
                    foreach ($annotation->value as $attribute) {
                        $this->collectAttributeTypeMetadata($metadata, $attribute);
                    }
                }
            }

            // if not has a constructor will inject values into public properties
            if (false === $metadata['has_constructor']) {
                // collect all public properties
                foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
                    $metadata['properties'][$property->name] = $property->name;

                    if (false === ($propertyComment = $property->getDocComment())) {
                        continue;
                    }

                    $attribute = new Attribute();

                    $attribute->required = (false !== strpos($propertyComment, '@Required'));
                    $attribute->name     = $property->name;
                    $attribute->type     = (false !== strpos($propertyComment, '@var') && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches))
                        ? $matches[1]
                        : 'mixed';

                    $this->collectAttributeTypeMetadata($metadata, $attribute);

                    // checks if the property has @Enum
                    if (false !== strpos($propertyComment, '@Enum')) {
                        $context = 'property ' . $class->name . "::\$" . $property->name;

                        self::$metadataParser->setTarget(Target::TARGET_PROPERTY);

                        foreach (self::$metadataParser->parse($propertyComment, $context) as $annotation) {
                            if ( ! $annotation instanceof Enum) {
                                continue;
                            }

                            $metadata['enum'][$property->name]['value']   = $annotation->value;
                            $metadata['enum'][$property->name]['literal'] = ( ! empty($annotation->literal))
                                ? $annotation->literal
                                : $annotation->value;
                        }
                    }
                }

                // choose the first property as default property
                $metadata['default_property'] = reset($metadata['properties']);
            }
        }

        self::$annotationMetadata[$name] = $metadata;
    }

    /**
     * Collects parsing metadata for a given attribute.
     *
     * @param array     $metadata
     * @param Attribute $attribute
     *
     * @return void
     */
    private function collectAttributeTypeMetadata(&$metadata, Attribute $attribute)
    {
        // handle internal type declaration
        $type = isset(self::$typeMap[$attribute->type])
            ? self::$typeMap[$attribute->type]
            : $attribute->type;

        // handle the case if the property type is mixed
        if ('mixed' === $type) {
            return;
        }

        // Evaluate type
        switch (true) {
            // Checks if the property has array<type>
            case (false !== $pos = strpos($type, '<')):
                $arrayType  = substr($type, $pos + 1, -1);
                $type       = 'array';

                if (isset(self::$typeMap[$arrayType])) {
                    $arrayType = self::$typeMap[$arrayType];
                }

                $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType;
                break;

            // Checks if the property has type[]
            case (false !== $pos = strrpos($type, '[')):
                $arrayType  = substr($type, 0, $pos);
                $type       = 'array';

                if (isset(self::$typeMap[$arrayType])) {
                    $arrayType = self::$typeMap[$arrayType];
                }

                $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType;
                break;
        }

        $metadata['attribute_types'][$attribute->name]['type']     = $type;
        $metadata['attribute_types'][$attribute->name]['value']    = $attribute->type;
        $metadata['attribute_types'][$attribute->name]['required'] = $attribute->required;
    }

    /**
     * Annotations ::= Annotation {[ "*" ]* [Annotation]}*
     *
     * @return array
     */
    private function Annotations()
    {
        $annotations = array();

        while (null !== $this->lexer->lookahead) {
            if (DocLexer::T_AT !== $this->lexer->lookahead['type']) {
                $this->lexer->moveNext();
                continue;
            }

            // make sure the @ is preceded by non-catchable pattern
            if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) {
                $this->lexer->moveNext();
                continue;
            }

            // make sure the @ is followed by either a namespace separator, or
            // an identifier token
            if ((null === $peek = $this->lexer->glimpse())
                || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true))
                || $peek['position'] !== $this->lexer->lookahead['position'] + 1) {
                $this->lexer->moveNext();
                continue;
            }

            $this->isNestedAnnotation = false;
            if (false !== $annot = $this->Annotation()) {
                $annotations[] = $annot;
            }
        }

        return $annotations;
    }

    /**
     * Annotation     ::= "@" AnnotationName MethodCall
     * AnnotationName ::= QualifiedName | SimpleName
     * QualifiedName  ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName
     * NameSpacePart  ::= identifier | null | false | true
     * SimpleName     ::= identifier | null | false | true
     *
     * @return mixed False if it is not a valid annotation.
     *
     * @throws AnnotationException
     */
    private function Annotation()
    {
        $this->match(DocLexer::T_AT);

        // check if we have an annotation
        $name = $this->Identifier();

        // only process names which are not fully qualified, yet
        // fully qualified names must start with a \
        $originalName = $name;

        if ('\\' !== $name[0]) {
            $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos);
            $found = false;

            if ($this->namespaces) {
                foreach ($this->namespaces as $namespace) {
                    if ($this->classExists($namespace.'\\'.$name)) {
                        $name = $namespace.'\\'.$name;
                        $found = true;
                        break;
                    }
                }
            } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) {
                $found = true;
                $name  = (false !== $pos)
                    ? $this->imports[$loweredAlias] . substr($name, $pos)
                    : $this->imports[$loweredAlias];
            } elseif ( ! isset($this->ignoredAnnotationNames[$name])
                && isset($this->imports['__NAMESPACE__'])
                && $this->classExists($this->imports['__NAMESPACE__'] . '\\' . $name)
            ) {
                $name  = $this->imports['__NAMESPACE__'].'\\'.$name;
                $found = true;
            } elseif (! isset($this->ignoredAnnotationNames[$name]) && $this->classExists($name)) {
                $found = true;
            }

            if ( ! $found) {
                if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) {
                    return false;
                }

                throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context));
            }
        }

        if ( ! $this->classExists($name)) {
            throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context));
        }

        // at this point, $name contains the fully qualified class name of the
        // annotation, and it is also guaranteed that this class exists, and
        // that it is loaded

        // collects the metadata annotation only if there is not yet
        if ( ! isset(self::$annotationMetadata[$name])) {
            $this->collectAnnotationMetadata($name);
        }

        // verify that the class is really meant to be an annotation and not just any ordinary class
        if (self::$annotationMetadata[$name]['is_annotation'] === false) {
            if (isset($this->ignoredAnnotationNames[$originalName])) {
                return false;
            }

            throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context));
        }

        //if target is nested annotation
        $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target;

        // Next will be nested
        $this->isNestedAnnotation = true;

        //if annotation does not support current target
        if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) {
            throw AnnotationException::semanticalError(
                sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.',
                     $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal'])
            );
        }

        $values = $this->MethodCall();

        if (isset(self::$annotationMetadata[$name]['enum'])) {
            // checks all declared attributes
            foreach (self::$annotationMetadata[$name]['enum'] as $property => $enum) {
                // checks if the attribute is a valid enumerator
                if (isset($values[$property]) && ! in_array($values[$property], $enum['value'])) {
                    throw AnnotationException::enumeratorError($property, $name, $this->context, $enum['literal'], $values[$property]);
                }
            }
        }

        // checks all declared attributes
        foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) {
            if ($property === self::$annotationMetadata[$name]['default_property']
                && !isset($values[$property]) && isset($values['value'])) {
                $property = 'value';
            }

            // handle a not given attribute or null value
            if (!isset($values[$property])) {
                if ($type['required']) {
                    throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']);
                }

                continue;
            }

            if ($type['type'] === 'array') {
                // handle the case of a single value
                if ( ! is_array($values[$property])) {
                    $values[$property] = array($values[$property]);
                }

                // checks if the attribute has array type declaration, such as "array<string>"
                if (isset($type['array_type'])) {
                    foreach ($values[$property] as $item) {
                        if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) {
                            throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item);
                        }
                    }
                }
            } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) {
                throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]);
            }
        }

        // check if the annotation expects values via the constructor,
        // or directly injected into public properties
        if (self::$annotationMetadata[$name]['has_constructor'] === true) {
            return new $name($values);
        }

        $instance = new $name();

        foreach ($values as $property => $value) {
            if (!isset(self::$annotationMetadata[$name]['properties'][$property])) {
                if ('value' !== $property) {
                    throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties'])));
                }

                // handle the case if the property has no annotations
                if ( ! $property = self::$annotationMetadata[$name]['default_property']) {
                    throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values)));
                }
            }

            $instance->{$property} = $value;
        }

        return $instance;
    }

    /**
     * MethodCall ::= ["(" [Values] ")"]
     *
     * @return array
     */
    private function MethodCall()
    {
        $values = array();

        if ( ! $this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) {
            return $values;
        }

        $this->match(DocLexer::T_OPEN_PARENTHESIS);

        if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) {
            $values = $this->Values();
        }

        $this->match(DocLexer::T_CLOSE_PARENTHESIS);

        return $values;
    }

    /**
     * Values ::= Array | Value {"," Value}* [","]
     *
     * @return array
     */
    private function Values()
    {
        $values = array($this->Value());

        while ($this->lexer->isNextToken(DocLexer::T_COMMA)) {
            $this->match(DocLexer::T_COMMA);

            if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) {
                break;
            }

            $token = $this->lexer->lookahead;
            $value = $this->Value();

            if ( ! is_object($value) && ! is_array($value)) {
                $this->syntaxError('Value', $token);
            }

            $values[] = $value;
        }

        foreach ($values as $k => $value) {
            if (is_object($value) && $value instanceof \stdClass) {
                $values[$value->name] = $value->value;
            } else if ( ! isset($values['value'])){
                $values['value'] = $value;
            } else {
                if ( ! is_array($values['value'])) {
                    $values['value'] = array($values['value']);
                }

                $values['value'][] = $value;
            }

            unset($values[$k]);
        }

        return $values;
    }

    /**
     * Constant ::= integer | string | float | boolean
     *
     * @return mixed
     *
     * @throws AnnotationException
     */
    private function Constant()
    {
        $identifier = $this->Identifier();

        if ( ! defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) {
            list($className, $const) = explode('::', $identifier);

            $alias = (false === $pos = strpos($className, '\\')) ? $className : substr($className, 0, $pos);
            $found = false;

            switch (true) {
                case !empty ($this->namespaces):
                    foreach ($this->namespaces as $ns) {
                        if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) {
                             $className = $ns.'\\'.$className;
                             $found = true;
                             break;
                        }
                    }
                    break;

                case isset($this->imports[$loweredAlias = strtolower($alias)]):
                    $found     = true;
                    $className = (false !== $pos)
                        ? $this->imports[$loweredAlias] . substr($className, $pos)
                        : $this->imports[$loweredAlias];
                    break;

                default:
                    if(isset($this->imports['__NAMESPACE__'])) {
                        $ns = $this->imports['__NAMESPACE__'];

                        if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) {
                            $className = $ns.'\\'.$className;
                            $found = true;
                        }
                    }
                    break;
            }

            if ($found) {
                 $identifier = $className . '::' . $const;
            }
        }

        // checks if identifier ends with ::class, \strlen('::class') === 7
        $classPos = stripos($identifier, '::class');
        if ($classPos === strlen($identifier) - 7) {
            return substr($identifier, 0, $classPos);
        }

        if (!defined($identifier)) {
            throw AnnotationException::semanticalErrorConstants($identifier, $this->context);
        }

        return constant($identifier);
    }

    /**
     * Identifier ::= string
     *
     * @return string
     */
    private function Identifier()
    {
        // check if we have an annotation
        if ( ! $this->lexer->isNextTokenAny(self::$classIdentifiers)) {
            $this->syntaxError('namespace separator or identifier');
        }

        $this->lexer->moveNext();

        $className = $this->lexer->token['value'];

        while ($this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value']))
                && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) {

            $this->match(DocLexer::T_NAMESPACE_SEPARATOR);
            $this->matchAny(self::$classIdentifiers);

            $className .= '\\' . $this->lexer->token['value'];
        }

        return $className;
    }

    /**
     * Value ::= PlainValue | FieldAssignment
     *
     * @return mixed
     */
    private function Value()
    {
        $peek = $this->lexer->glimpse();

        if (DocLexer::T_EQUALS === $peek['type']) {
            return $this->FieldAssignment();
        }

        return $this->PlainValue();
    }

    /**
     * PlainValue ::= integer | string | float | boolean | Array | Annotation
     *
     * @return mixed
     */
    private function PlainValue()
    {
        if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) {
            return $this->Arrayx();
        }

        if ($this->lexer->isNextToken(DocLexer::T_AT)) {
            return $this->Annotation();
        }

        if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) {
            return $this->Constant();
        }

        switch ($this->lexer->lookahead['type']) {
            case DocLexer::T_STRING:
                $this->match(DocLexer::T_STRING);
                return $this->lexer->token['value'];

            case DocLexer::T_INTEGER:
                $this->match(DocLexer::T_INTEGER);
                return (int)$this->lexer->token['value'];

            case DocLexer::T_FLOAT:
                $this->match(DocLexer::T_FLOAT);
                return (float)$this->lexer->token['value'];

            case DocLexer::T_TRUE:
                $this->match(DocLexer::T_TRUE);
                return true;

            case DocLexer::T_FALSE:
                $this->match(DocLexer::T_FALSE);
                return false;

            case DocLexer::T_NULL:
                $this->match(DocLexer::T_NULL);
                return null;

            default:
                $this->syntaxError('PlainValue');
        }
    }

    /**
     * FieldAssignment ::= FieldName "=" PlainValue
     * FieldName ::= identifier
     *
     * @return array
     */
    private function FieldAssignment()
    {
        $this->match(DocLexer::T_IDENTIFIER);
        $fieldName = $this->lexer->token['value'];

        $this->match(DocLexer::T_EQUALS);

        $item = new \stdClass();
        $item->name  = $fieldName;
        $item->value = $this->PlainValue();

        return $item;
    }

    /**
     * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}"
     *
     * @return array
     */
    private function Arrayx()
    {
        $array = $values = array();

        $this->match(DocLexer::T_OPEN_CURLY_BRACES);

        // If the array is empty, stop parsing and return.
        if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) {
            $this->match(DocLexer::T_CLOSE_CURLY_BRACES);

            return $array;
        }

        $values[] = $this->ArrayEntry();

        while ($this->lexer->isNextToken(DocLexer::T_COMMA)) {
            $this->match(DocLexer::T_COMMA);

            // optional trailing comma
            if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) {
                break;
            }

            $values[] = $this->ArrayEntry();
        }

        $this->match(DocLexer::T_CLOSE_CURLY_BRACES);

        foreach ($values as $value) {
            list ($key, $val) = $value;

            if ($key !== null) {
                $array[$key] = $val;
            } else {
                $array[] = $val;
            }
        }

        return $array;
    }

    /**
     * ArrayEntry ::= Value | KeyValuePair
     * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant
     * Key ::= string | integer | Constant
     *
     * @return array
     */
    private function ArrayEntry()
    {
        $peek = $this->lexer->glimpse();

        if (DocLexer::T_EQUALS === $peek['type']
                || DocLexer::T_COLON === $peek['type']) {

            if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) {
                $key = $this->Constant();
            } else {
                $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING));
                $key = $this->lexer->token['value'];
            }

            $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON));

            return array($key, $this->PlainValue());
        }

        return array(null, $this->Value());
    }
}

redpajama_set_name: RedPajamaGithub


Good day there, there is a fresh gallery of apartment. And Junior One Bedroom Apartments Floor Plan Of is one idea that we want to talk about now.
When we switch down our mouse, we will get pictures of Junior One Bedroom Apartments Floor Plan Of, including junior one bedroom apartment floor plan, junior one bedroom apartment and 1 bedroom apartment floor plan. Such that we know, good style and color scheme will contribute for the apartment seem pleasant. When we move down, there we will get one bedroom apartment floor plan, junior 1 bedroom apartment and 1 bedroom apartment toronto. They are some examples of Junior One Bedroom Apartments Floor Plan Of that we can grab them for guidance.
If ever we need color sample, we pick most obtrusive color on each picture to fulfill our experience. Last, we wish these Junior One Bedroom Apartments Floor Plan Of can provide additional inspiration of what we are searching for. Don't forget to hit share button you want, so that your friends, family, also your community can get ideas too.


small undermount bar sink white sink white 7 8 ceramic bathroom sink with overflow small white bar sink tiny undermount bar sink.
satin nickel towel bar delta brushed nickel towel bar brushed nickel towel rack with shelf.
best rated counter depth refrigerator counter depth best counter depth refrigerators 2018 consumer reports.
dining table set with storage pub table sets under black dining table set pub table with storage pub style bistro table sets folding dining table with storage for chairs.
red kitchen mat red kitchen rugs red kitchen mat kitchen mat decorative kitchen floor mats chef kitchen rugs kitchen red and white kitchen mats.
black bar faucet home decor single handle bar faucet with base plate black wet bar faucet.
kitchenaid stand mixer comparison stand mixer kitchenaid stand mixer power rating.
round table with bench seat table with bench seating kitchen table with bench seat built in bench seat kitchen kitchen round outdoor table bench seats nz.
tall round end table tall round end table full size tall table lamps.
light blue lumbar pillow chevron powder blue lumbar pillow cad a liked on featuring home home decor throw pillows light blue throw pillows light blue velvet lumbar pillow.


Welcome to the web page of author Golden Czermak, your door to fantastic new worlds.
Want to know what events I'm attending and/or pre-order books?
Cooper Bennett 2 is NOW AVAILABLE ON AUDIO!
Cooper Bennett and the Devil's Ire (Cooper Bennett 2) - Audio Edition!
Experience the magic and adventure in this sequel to 2017's The Secret Life of Cooper Bennett as narrated by Wen Ross & Kai Kennicott.
Snag Cooper 2 on audio today!
Need an amazing and exclusive photo for a book cover or beautiful prints to decorate your home or phone?


Mirrorstone Heating's 595 x 995 Sailboat Printed Infrared Heating Panel 580W gives you a far more energy efficient and eco-friendly kind of heat, whilst providing you with scenes of absolute luxury.
In the midst of the sea with land close by, a sailboat passes by, gently rocking with the swaying water, with a completely clear blue sky overhead and the sun's rays beaming down.
Speaking of the sun's rays, our panel will emit infrared waves from its 595 x 995mm aluminium surface just like the sun, so that it can keep your room nice and warm. It'll consume 580W in the process, and reach temperatures as high as 95oC, though this is offset by the fact that it can be mounted high up on walls or on your ceiling, and therefore out of reach.
It'll look far better than conventional radiators once it's mounted too. This is mainly due to the image printed on the panel, a thickness of just 22mm, and a choice of white, silver or black frames that allow you to match it to your décor.
A trip over to our discount codes page could even save you a massive amount off your order total, so head on over and see how much you could save!
We've got loads of other photos to choose from in our range of 595 x 995 image IR heating panels, like our 595 x 995 Red Arrows Printed Infrared Heating Panel 580W. It emits the same amount of heat as our featured Sailboat panel, but features the amazing Red Arrows flying through the air.
For smaller areas of the home, your taste might launch you towards a completely different style – like our 595 x 595 Shuttle Printed Infrared Heater 350W. A trip to space is the order of the day here, with tonnes of burnt rocket fuel being left in its wake.
Our 595 x 1195 Milky Way Printed Infrared PanelHeater 700W provides a glimpse of where the shuttle from the previous panel might end up, as well as providing a better solution for slightly larger rooms! Beyond the cliff face lies the vast expanse of stars that make up our Milky Way galaxy.
If you're struggling to decide on an image, then why not take things into your own hands by opting for one of our custom image IR heaters – you can choose you own photo and we'll put it onto a panel for you! You're only limited by your imagination, and best of all it'll be ready for you within 7 days – faster than any other IR Panel retailer in the UK!
Working out how many panels you need is actually an easy process – all you need is a tape measure, calculator, and some knowledge about how well insulated your property is.
The first step is to measure your room in metres. You'll need the length, width and height. Then using your calculator, you'll need to multiply these three figures together, which will give you the volume in cubic metres.
Then, the level of insulation your home has will determine how much heat you need. Poorly insulated homes need 30W per cubic metre, moderately insulated homes need 25W per cubic metre, whilst well insulated homes need just 20W per cubic metre.
Multiplying the volume of your room by the recommended wattage per cubic metre will give you the total wattage requirement, and from here, you can begin to decide which panels you want.
For example, if your total wattage requirement for your room is 2000W, then a 1200W panel and a 700W panel would be sufficient.
Our 605 x 1005 Sailboat Printed Infrared Heating Panel 580W is covered by our 30 day home trial period, during which you can request a full refund or exchange and send you panel back to us.
Please note however that this panel is subject to a 15% restocking fee should it need to be returned.
You're also covered by Mirrorstone's 5 year replacement warranty should you have any unlikely issues further down the line.
Please give us a call on 0116 321 4124, or send us an email to sales@suryaheating.co.uk if you have any further questions about this panel, the wider range of panels that we have, why you should become a trade customer, or anything else.
We're also available on social media too, so feel free to post on our Facebook page or send us a tweet @SuryaHeating!
Question about 595x995 Sailboat NXT Gen Infrared Heating Panel 580W is successfully submitted.


Music is one of the many blessings we have to enlighten our hectic lifestyles. How about taking your favorite style of music and using that as a theme for a party to unwind after a hard week at work. Create a fun Rock 'n Roll theme for adults with a 50's party theme, a 1980's Rap theme, or whimsical children's party. We have just the accessories to help you with that. You could serve sandwiches or light snacks on our Musical Note Lunch Plates and Musical Note Dessert Plates. Our Musical Note Lunch Napkins are a great way to serve up some fresh home baked cookies. Would you like to add a hot or cold beverage to the mix? Whether it is punch or coffee, we carry White Hot/Cold Cups and Black Hot/Cold Cups for your drinking needs. All can be displayed in style on our Musical Notes Tablecover. Just put on some music to complete the fun! Regardless of what kind of Musical Note Tableware you're looking for we've got you covered right here at PartyCheap.com!
At your 50's themed party we want your guest to have a blast partying it up in the past. So all of your decorations need to represent the 50's, which means poodle skirts, sock hops and lots of music! You should have a jukebox, a guitar and some foot tapping notes. Why not use our musical tableware to set the mood for your awesome 50's bash! The tableware can be placed on the food table before they grab their delicious snacks. Behind the table you can place some music inspired cutouts. It wouldn't be a 50's party without a jukebox and we have some that your party is going to need. Behind the food table you can use our jukebox cutout and surrounding the jukebox you can add some of our cutout records. All of your friends and family will be begging you to tell them just where you got so many cool decorations, party supplies, and cool party tableware! No matter what kind of 1950's decorations or musical note party supplies you may need we've got you covered. We're PartyCheap.com and we know how to party!


text:
BTC Firebrand Michael Saylor Says FTX Implosion Could Set Off a Rapidly Growing Crypto Industry – Here's How
dailyhodl.com 11 November 2022 15:40, UTC
MicroStrategy founder and Bitcoin (BTC) bull Michael Saylor says the collapse of FTX could actually spark further growth in the crypto industry.
In a new interview with CNBC, Saylor says the collapse of Sam Bankman-Fried's crypto exchange FTX is likely going to speed up the implementation of US crypto regulations.
He also says those regulations could lead to greater adoption of digital assets with the entrance of more traditional financial institutions.
"If there is a progressive regulation, then I think you'll see, you won't see 20,000 tokens, you'll see a handful, dozens, but they'll be properly registered tokens. The industry is going to grow much more rapidly. And ultimately, we're moving from the entrepreneurial stage where this was a wild west offshore, where anything goes, to an institutional digital assets stage where the big players like Bank of America and Fidelity and BlackRock and the Goldman Sachs and JP Morgans are going to enter this space and we're all just going to grow up and the world is going to benefit from that."
Saylor warns that if regulators move too aggressively in response to FTX's implosion, it would harm the industry.
"I think it's definitely going to strengthen the hand of the regulators. It's going to accelerate their intervention. There's a regressive regulation, which is to say, you can't really do anything, and that'll contract the industry. Bitcoin will be the winner because Bitcoin is a digital commodity and it's the least controversial of everything."
He also says there is a need for US regulators to clearly lay out how crypto activities can come into compliance.
"The regulatory intervention of late has been all negative like enforcement, but the marketplace is waiting for the regulators to say this is how you register a digital currency, this is how you register a digital security or a digital commodity, and instead of saying all the crypto exchanges should register, we need to get the crypto exchanges registered because the future of the industry is registered digital assets trading on regulated exchanges, where everyone has the investor protections they need and the investors, in general, understand the difference between Bitcoin and a stablecoin and a security token."
Generated Image: DALLE-2

redpajama_set_name: RedPajamaCommonCrawl


text:
BBG Governor Victor Ashe pays tribute to Annette Lantos and her late husband
Annette Lantos with her husband Congressman Tom Lantos
At the meeting of the Broadcasting Board of Governors (BBG) in Miami on April 20, the federal agency in charge of U.S. international broadcasting decided to reverse its earlier decision on Voice of America (VOA) program cuts to China and Tibet. In expressing his full support for restoring funding for these broadcasts, BBG Governor Ambassador Victor Ashe said:
This will make people like Annette Lantos very pleased and happy. She is a special figure in history.
Annette Lantos is the Chairman of the Lantos Foundation for Human Rights and Justice. She and her late husband Congressman Tom Lantos were both Holocaust survivors. Click here for more information about Mrs. Lantos' pro-human rights activities.
Earlier this month, Annette Lantos had written a letter to the nine members of the bipartisan Board urging them to save U.S. taxpayer-funded news broadcasts to China, Tibet, and Russia. Her letter states:
"I write to you on a personal basis to express dismay that Voice of America radio and television broadcasts to Russia ceased in 2008. I am deeply concerned that although last year's proposed cuts of VOA Mandarin and Cantonese radio and television programs were halted, this year's proposal includes the elimination of VOA Cantonese services and VOA Tibetan Radio Services, at a time when there is significant unrest in Tibet. I urge you to continue the Cantonese and Tibetan broadcasts, and to restore them to Russia."
Victor Ashe spearheaded the effort to overturn the earlier decision on cuts in broadcasting to China and Tibet.
He recalled that as U.S. Ambassador he had the privilege to welcome to Poland Annette Lantos and her late husband Congressman Tom Lantos when they came in 2005 for the 60th anniversary of the liberation of the Auschwitz-Birkenau Nazi death camp.
"It was a very difficult time for him emotionally to visit the barracks where torture occurred every minute," said Ashe.
Speaking about the Broadcasting Board of Governors' decision to restore funding in the next fiscal year for Voice of America radio broadcasts to Tibet and for the VOA Cantonese Service with its radio, television and Internet programming to China, Victor Ashe said that "hopefully, the response of this committee will receive the same attention that her [Annette Lantos'] eloquent letter has received."
In her letter, Annette Lantos noted the efforts of the independent, nongovernmental Committee for U.S. International Broadcasting (CUSIB) in support of the free flow of uncensored news from the United States to countries without free media:
"I write in support of the efforts of the Committee for U.S. International Broadcasting. The CUSIB works to ensure that U.S. government-funded broadcasts promote respect for human rights and freedom of the press, especially in nations where these basic freedoms are under attack."
Reggie Littlejohn, President of Women's Rights Without Frontiers and member of CUSIB's Advisory Board, said, "I am deeply grateful to Mrs. Lantos for supporting Voice of America broadcasts into China, as she is a towering presence for human rights all over the globe, including millions who suffer at the hands of the brutal, totalitarian regime in China. With a wave of self-immolations in Tibet, now is not the time to cut off VOA broadcasting in Tibetan. The Cantonese broadcasts are essential as well."
In addition to Ambassador Victor Ashe, other BBG members: Susan McCue, Michael Meehan and Dennis Mulhaupt, also made strong public statements at the meeting in Miami last week in support of continuing U.S. broadcasts to Tibet and China.
To read the entire letter by Annette Lantos click here.
The Committee for U.S. International Broadcasting (CUSIB) is an independent, nongovernmental organization which supports free flow of uncensored news from the United States to countries without free media.
The Committee for U.S. International Broadcasting (CUSIB)
Ann Noonan, co-founder and Executive Director
Ted Lipien, co-founder and Director
Email: contact@cusib.org
www.cusib.org
AuschwitzBroadcasting Board of GovernorsChinaCUSIBDennis MulhauptHolocausthuman rightsMichael MeehanReggie LittlejohnRussiaSusan McCueTibetTom LantosVictor AsheVoice of AmericaWomen's Rights Without Frontiers


text:
Abantu Book Festival: nothing short of an introspective space
Spaces like the Abantu Book Festival are for the rewriting of the African narrative in African voices, for African readers and listeners. It is a space fully saturated in pro-black stories.
On the last day of the literary festival, Tsitsi Dangarembga said, "I write for transformation, not entertainment… it is up to you as a writer to ensure that what you say highlights that your humanity goes beyond what you've gone through".
And this, as Lola Shoneyin says is why an African author "cannot speak to a European audience the way they would to an African audience".
Festivals such as the Gabarone Book Festival, Aké Art and Book Festival as well as our very own Abantu Book Festival exist so that African authors can address African problems with an African audience.
On the very first night of the third edition of the Abantu Book Festival in Soweto, Johannesburg, Lebo Mashile said that these spaces are meant to create a safe space for Africans to discuss African matters in the safety of each other's company.
To the same effect, Lola jokingly said "you don't want to say anything that they will use to beat you later" when in European spaces. She went on to say that she writes for an African audience with the hope that exposing African problems to African people gives them the opportunity to reflect and come up with solutions and/or different ways of doing things.
The Abantu Book Festival has been nothing short of an introspective space.
While diversifying spaces is important, it should never compromise the ability of Africans – whether they are book lover or not – to narrate and write the best parts of our own history, the parts that no one else can tell but us.
This doesn't mean denying the very real problems we face in our daily lives, but it allows the lion freedom to roar without having to translate the roars to accommodate a foreign bystander. These spaces, therefore, validate the lion's voice to other lions, empowering them to claim and own their stories as well.
One could also liken this space to a gold refinery. This beautifully lit experience is the fire that purifies our stories into the gold that we then send out into the world.
From historical fiction to poetry to reliving people's memoirs, the Abantu Book Festival is definitely also an exhibition of the gold that already exists in African literature. Which, in my biased opinion, it the best form of art!
As The Cheeky Natives would say, African Literature gives form to the blunt language that English is. Not because English is superior, but because it is accessible. We have access to it and we should use the hell out of the language to make our writing accessible to all kinds of African audiences.
In a contradicting agreement, Nigerian writer Odafe Atogun says that he writes for universality and timelessness.
With that said, African Literature is for Abantu, by Abantu. And it is not our responsible to educate the world but theirs to pick up our books and learn.
African Historian Dr Sebabatso so beautifully said, "Europe is irrelevant to our history". Spaces like the Abantu Book Festival are for the rewriting of the African narrative in African voices, for African readers and listeners. It is a space fully saturated in pro-black stories.
This is where we safely reimagine our history together, shaping the future we long for by writing stories that are timeless, universal, accessible and transform the discourse.
ACTIVATE! Change Drivers and The Journalist will continue to keep you posted on Twitter, Instagram and Facebook. If you were not able to join the festival this year, there is always next year. In the meantime, stay updated by following us on social media. All images courtesy of Mmuso Mafisa and Abantu Book Festival.
PreviousSaartjie Baartman's final resting place
NextMusawenkosi Ama Xaba
Dewani & Pistorius: The Undercurrents
Housing income threshold must rise!
The Pitchforks Are Coming: Plutocrat warns of revolution
Election 2019: This time may be different
Brain Kinne on 3 January, 2023 at 8:30 am


Once subscribed you will receive a fortnightly collections for a 12-month period. This means you can join at any point in the year and the service will renew yearly from your sign up date.
If you are a new subscriber, you will receive a new wheelie bin(s) with a brown lid. If you have renewed your subscription you should continue to use your existing bin(s).
This service is operated by Veolia on behalf of Croydon Council.
The yearly cost of the service is £61.50, this charge is for the collection of your garden waste. The bin(s) remain the property of Croydon Council. A copy of the full terms and conditions is available for download below.
Competition - Win a year's free subscription!
If you subscribe by midnight on Friday 31 May 2019, you will automatically be entered into a prize draw to win your subscription fee back. We have two subscriptions to give away, worth £61.50 each! Please see terms and conditions at the bottom of this page.


text:
UC Riverside-led Team Wins $14.9 Million to Battle Disease-carrying Mosquitoes
DARPA award is largest ever for a UCR researcher
By J.D. Warren on July 19, 2017
RIVERSIDE, Calif. (www.ucr.edu) — A University of California, Riverside scientist is leading a team of researchers that will receive up to $14.9 million dollars from The Defense Advanced Research Projects Agency (DARPA) to be part of the "Safe Genes" program to study innovative genetic techniques to control disease-causing mosquitoes.
With the contract, the largest ever received by a UC Riverside researcher, Omar Akbari, an assistant professor of entomology, and his team will focus on a technique known as "gene drive." It has the potential to spread desirable genes in wild populations and suppress harmful organisms.
"Our primary goal is to safely test and innovate these technologies strictly in the laboratory," said Akbari, who led the collaboration of six UC campuses. "We hope our efforts will broaden our fundamental understanding of the potency of gene drives to help better understand how they may behave in the natural environment if ever released."
Omar Akbari
The researchers want to understand the potential risks and benefits of using gene drives to control mosquitoes that carry diseases including Zika, chikungunya, dengue, and yellow fever. Gene drives have ever greater promise because the recently discovered CRISPR/Cas9 gene editing technique has the potential to create, streamline, and improve the development of gene drives.
Insects that carry disease represent one of the greatest worldwide threats to human health, with billions of people at risk of infection. Last year, more than 700 million people were infected with malaria or dengue fever, resulting in 440,000 deaths. And the prevalence of the Zika virus is rising.
Protecting the public from these diseases is difficult. Vaccines to prevent the diseases either don't exist, or are not effective. And current mosquito control methods are inadequate, as mosquitoes have become resistant. That creates a critical need for a transformative, species-specific, safe, and effective method to control mosquitoes.
Recent advances in genetics and molecular biology allow researchers to use the gene drive technique to introduce genetic elements into a population to enforce the inheritance of selected genes. These elements increase transmission by more than 50 percent, resulting in rapid spread throughout a mosquito population.
The UC Riverside-led effort seeks to answer many of the unknowns that surround this novel approach, and will offer data for consideration by scientists, policy makers, and the public. Although gene drives have been discussed and studied for decades, the CRISPR/Cas9 gene editing technique, which relies on a Cas9 protein targeted to a specific genomic location by guide RNAs, has revolutionized the development of gene drive systems because it offers an increasingly inexpensive, efficient, and more reliable way to make precise, targeted changes to the genome.
With the DARPA contract, the researchers aim to develop and test several innovative, safe, gene drive approaches, integrate novel effectors to the drives, which are elements that can increase their utility and safety, and to use complex mathematical modeling to identify the most effective approaches. The team will also integrate ecological data by sampling and sequencing wild mosquitoes captured from locations spanning California. This data will help inform the designs of the drives and help predict how gene drives might behave in a natural setting. There will also be a public engagement component, an essential ingredient to establish public trust if field studies are to be considered.
The initial research will focus on the Aedes aegypti mosquito, which spreads diseases including Zika virus, dengue fever and yellow fever virus. But the technologies developed are meant to be later applied to other mosquito species, responsible for spreading diseases such as malaria and West Nile virus.
In addition to Akbari, the other team members are: Craig Montell (UC Santa Barbara); Anthony James (UC Irvine); Ethan Bier, Valentino Gantz, Sergey Kryazhimskiy, Justin Meyer and Cinnamon Bloss (UC San Diego); Gregory Lanzaro (UC Davis) and John Marshall (UC Berkeley).
Archived under: Science/Technology, DARPA, Defense Advanced Research Projects Agency, Entomology, gene drives, gene editing, mosquitoes, Omar Akbari, press release, West Nile virus, yellow fever, Zika


text:
Extended Courses
Witness the largest and finest collection of Indonesian birds in the world plus fantastic birds from Africa & South America. Encompassing two hectares of botanical landscape, the park provides sanctuary to almost 1,000 birds of 250 different species.The park accommodates an amazing display of flora with more than 2,000 tropical plants including 50 varieties of palms alone and attracting numerous butterflies.
Prices inclusive tax:
Adult – Rp 243 000
Child – Rp 122 000
For more information: http://www.bali-bird-park.com/
Activities / Activities & Tours / Self Guided
This Park is home to hundreds of amazing animals representing more than 60 species, including some rare and endangered species. Combining Balinese cultural ambiance with African Savannah, the Bali Safari and Marine Park features Sumatran elephants Sumatran tigers, white tigers, leopards, Komodo dragons and orangutans amongst many fascinating creatures. Part of its educational initiatives are many animal shows which delightfully inform. Set on 40 hectares of land with breathtaking natural surroundings at the cultural center of Bali, Gianyar, the Bali Safari and Marine Park is extremely active in assisting with the protection and conservation of endangered species that are constantly losing their habitat to natural and man-made encroachments and problems.
For more information: http://www.balisafarimarinepark.com
Bali's Rice Terraces
For the Balinese, rice is more than just their staple food; it is an integral part of their culture. The rituals of the cycle of planting, maintaining, irrigating and harvesting rice enrich the cultural life of Bali beyond a what any single staple can ever hope to do.
Tegalalang, Ubud
These rice terraces just north of Ubud are set on a cliff bank with a small river valley underneath it. The road leading to the most panoramic outlooks is lined with shops selling all types of crafts, so it may take a while to get there. However, it is the closest spot to Ubud to absorb the miraculous feat of agricultural engineering that makes Bali one of the most beautiful islands in the world.
Jatiluwih, Tabanan
Jatiluwih is a lovely spot to linger and enjoy the serenity of shimmering rice terraces and farming families working the land as their families have down for centuries. On a sunny day, Mount Batukaru dominates the backdrop. The most stunning days are when the rice starts to turn a vibrant shade of green just before harvest,
Tirta Gangga, East Bali
The many streams around Tirta Ganggafeeds the complicated irrigation systems that form the amazing rice terrace landscape found in this area. With Mount Lempuyan looming in the background, the view is quite breathtaking.
Balinese Dances
The very essence of Balinese culture is dance and drama, which is performed during temple festivals and ceremonies. Every movement of fingers, hands, head, body and feet is important and tells the story of the Balinese vision of life. Balinese dance cannot be separated from religion. Even the dances for the tourists are preceded by many dancers praying at their family shrine for taksu (inspiration) from the gods.Tickets are widely available on the streets of Ubud especially at Monkey Forest Road and around the Central Market. The most popular dances are the Kecak, Barong and Legong.
Kecak
No other dance is so unnerving as the amazing Kecak, also known as the ''monkey dance''. This dance is to protect the village of dark powers and is often performed when things go bad and to prevent more misfortune. A serpentine stream of bodies coils itself, circle within a circle, around a large, branching torch. Two hemispheres of men: one, a pattern of silhouettes; the other, sculptural faces of brown skin caught in a net of torchlight.
Kecak, a name indicating the "chak-a-chak" sounds, evolved from the male chorus of the ritual Sanghyang trance ceremony. By ingeniously simple choreography, the chorus is transfigured into ecstasy. Kecak include a drama, in which the circle of light around the torch becomes a stage, and it's a periphery of men, a living theatre with dramatic effects. Accompanied by the bizarre music of human instruments, the storyteller relates the episode enacted within the performance, usually one drawn from the Ramayana. At the end of the Ramayana story one man is in a trance. He performs the trance dance and rides on a wooden horse kicking burning coconut shells around.At the end of the dance a priest helps him to come out of the trance and the performance ends.
If black magic prevails, a village fails into danger, and extensive purification ceremonies become necessary to restore a proper equilibrium for the health of the community. Dramatic art is also a way of cleansing the village by strengthening its resistance to harmful forces through offerings, prayers and acts of exorcism. Such is the symbolic play of the two remarkable presences-the Barong and Rangda. Barong, a mystical creature with a long swayback and curved tail, represents the affirmative, the protector of mankind, the glory of the high sun, and the favorable spirits associated with the right and white magic.
Legong
This Bali dance of Legong (balih-balihan dance) is without any doubt the most gracious of all the dances. The dance is accompanied by the beautiful sounds of the gamelan.The Legong dancers are often young girls around 8 to 10 years old and selected from the village for their beauty and suppleness. They are wearing identical costumes with tightly bound gold brocades and their faces are made up with detail to the eyebrows and their hair decorated with beautiful frangipani flowers. Their movements are choreographed in detail with the twisting of the fingers, hands, feet and facial expression.
The Legong Kraton tells the story of a king, who kidnaps a maiden called Rangkesari. Her brother begs the king to let her free rather than to go to war. The king ignores his begging and is on his way to the battleground when he meets a bird that brings ill omens. He ignores the bird and continues to meet Rangkesari's brother on the battleground, who kills him.
Activities / Activities & Tours / Classes / Extended Courses / Self Guided
Balinese Spices
Activities / Activities & Tours / Classes
Batik Making
It would be impossible to visit Indonesia and not be exposed to one of the country's most highly developed art forms, batik, a traditional form of painting on fabric. Craftspeople painstakingly use dots and lines from wax to decorate the cloth – a delicate process which is quite impressive to watch.
The most famous center for Balinese Batik hand weaving is Tohpati Village. This village is widely known for handmade Balinese batik in myriad colors and shapes. Here visitors can observe first-hand the Batik making and hand weaving process.
Traditional Balinese Batik is recognized by strong Javanese motifs, but modern designs apply more images of Balinese culture, ceremonies, culturally rich sites and mythological Hindu figures.
Widya's Batik Workshops
Yogyakarta – born Widya offers batik instruction just north of Ubud for individuals or in a group workshop format with all materials provided. He can pick you and your imagination up at your Ubud accommodation.
Widya offers daily classes from 10am to 5pm for Rp 350,000 per student with a one day reservation. One class enables you to make a small batik painting. To produce larger pieces, you can choose a 3 day class. For further details e-mail yogawidya@hotmail.com.
Widya practices various kinds of Batik, such as:
Batik Tulis: Batik waxed by a hand process known as ''batik tulis'', the original way of creating batik.
Chanting: The tool used to apply wax in fine lines is called a ''chanting''. A chanting tool consists of two parts, the handle which is made from bamboo and the front spout which is made of copper.
Stamping: A method later developed in Java, stamping is another way to apply wax by hand or combined with ''batik tulis'. Mass produced batiks are often made with the help of machine stampers.
Dye and Color: Unlike in many batik studios which use chemically-based dyes, all of the dyes used in Widya's batik studio are organic, specially made from plants, flowers, vegetables and minerals. Some of Widya's color is ''light-activated'', stabilizing and changing to it's true color in the sun. Other colors change to their true color in the finishing process.
Boiling: When the dyes are set, the batik is boiled to remove the wax. After the boil the piece is washed in clean water, it then dried to reveal the beauty and originality of the batik.
Nirvana Batik Workshops
I Nyoman Suradnya with his son Tuadi and apprentices pass on their knowledge and enthusiasm to students attending their batik courses at their studio in Ubud's center. Nirvana offers classes from 10am to 2pm Monday to Saturday.
One/two day course; Rp 485 000 per person, per day, including
Brief introduction to the ''story'' of batik
The materials and tools used
The techniques for painting with canting and brush
Hand color & dip dying in ¾ color
Dying sequence
Finishing touch for final product
Three/four day course; Rp 470 000 per person, per day, including the above plus;
Expanded knowledge of types of wax and effects that can be created (eg. wax & cracking)
More variation of color through hand painting and dip dying
Wider use of tools (large, small spout cantings)
Working on 2 pieces of work to utilize a variety of techniques
Five day course; Rp 450 000 per person, per day
Includes both of the above, but allows the student to experience more independently using the knowledge gained in the first three days to be more creative – yet still under the teacher's guidance.
Activities / Activities & Tours / Classes / Extended Courses
Ubud is known as the art center of Bali, and that includes the art of cooking. This previously sleepy, but not bustling town offers a wide range of cooking courses, from village family-style up to high-end fusion cuisine and from half-day to full week programs.
Discover the unique cooking methods in the fascinating kitchen of Casa Luna with Janet DeNeefe and her team. Janet has been teaching Balinese cooking since 1987 and her cooking school has been published in the Australian newspaper as one of the best cooking schools in the world. Classes provide a fascinating insight into Balinese life, beliefs and culture through learning about its food, cooking and culinary myths. Participants learn about the exotic herbs and spices used in ceremonial and everyday Balinese dishes and are encouraged to actively help prepare the lavish Balinese feast that will then be enjoyed with a glass or two of the local rice wine or homemade hibiscus tea.
Or take the opportunity to learn the secret of creating a variety of delicious Balinese dishes in the kitchen of Bumbu Bali Restaurant. Jero Kartika and her team at Bumbu Bali Restaurant lead half-day cooking programs beginning with a visit to the Ubud traditional market just down the street. Guests participate in preparing a variety of dishes in a beautiful serene setting. They have a vegetarian course menu as well as non-vegetarian.
Activities / Activities & Tours / Extended Courses
Cremation – Periodically
The Ngaben is the last and most important ceremony of every Balinese life. It's the Balinese word for the cremation of the dead, in which the soul is released entirely from the body to ascend to heaven and to be reincarnated.
The cremation is a big happening in Bali, especially in the Ubud area.
But before a cremation can actually take place, there are many complicated ceremonies and preparations before and after the cremation.
The three major events which take place before the soul of the deceased is fully released are:
The Funeral: here the prethiwi (solids) are placed into the earth by burial
The Cremation: the teja (radiance) is released by burning with fire
The purification of the soul: the apah (liquids) is dispersed by throwing the ashes into the water
Before the influence of the Majapahit, which spread the Hindu religion throughout Bali, the Balinese guided the soul of the deceased in a more simple way. The deceased was taken into the forest where the high humidity and the animals would break the body down quickly. Through this way the soul would be released from the body. Today this burial method only takes place in the Bali Aga villages, such as Tenganan and Trunyan who have never been influenced by the Majapahit before.
The Funeral
In Bali a funeral takes place shortly after a person dies, unlike the Hindu in India where the deceased is cremated immediately. The deceased is buried at the Pura Dalem, the temple complex facing the sea. The Pura Dalem is also often referred to as 'the temple of the dead'.
The length of the period between the funeral and the ngaben depends entirely on the financial position of the family, sometimes it even takes years. Only the rich are cremated soon after they have died.
The pura dalem in Monkey Forest, Ubud
Priests, who always belong to the highest caste, are never buried. They are kept in their own house until the family has gathered sufficient money for the ngaben. Before the funeral the body of the deceased is purified according to several ceremonies and then buried. The family can place daily food offerings on a small shrine that is built next to the grave.
At the head and the feet of the grave the Balinese always place small coconut-leaves. This enables the demon of the deceased to find its way back after wandering at night. If there are no leaves at the grave, then the demon will wander for ever which the Balinese believe will have a negative impact on the village and family.
The whole period before the actual ngaben is experienced as a very sad time as the Balinese believe that during this period the soul is not able the reach heaven yet. Only when there is enough funding, all the preparations have been made and the appropriate date has been determined by the priests, will the soul of the deceased be released through the Ngaben.
The Cremation — Ngaben
Every Balinese family has the responsibility to ensure that a proper ngaben takes place if a family member dies. If this does not happen this will have severe consequences for the deceased and his/her family. Families who can't afford a cremation often await the ngaben of a important or royal person.
The preparations for these people are always the best one can have, as the best priest is called upon, the holiest water is used and the most appropriate date is chosen for the cremation.
With everything perfectly planned and set for the big cremation, other bodies will be cremated too so they can profit from the ideal setting in which the cremation will take place. The families of the deceased will then know for sure that the soul will be guided to heaven under the best circumstances.
The ceremonies before a mass cremation in Ubud
It is not uncommon to have a mass cremation of 100 people on the same day as the ultimate royal cremation when money does not play an issue. Unlike the funeral, the ngaben is a joyful occasion as the soul of the deceased is now ready to continue its journey to heaven followed by reincarnation.
Before the ngaben takes place, numerous preparations need to be organized. The body will be taken out of its temporary grave at the Pura Dalem and carried to its former house three days before the cremation. During the whole process complicated rituals follow a specific order.
The offerings are carried to the pura dalem
A day before the cremation one final ceremony is held at the Pura Dalem. This is when everybody is beautifully dressed in traditional Balinese clothing and when the colorful offerings are carried to the temple. On the day of the ngaben the body is transported to the Pura Dalem in a funeral tower. The tower is made out of wood and bamboo.
The village carpenter and carvers create an amazing structure full with bright decorations. The funeral tower can be a couple to 10 meters high. In the past it was common to see really high towers, however today this is hardly possible since there are to many telephone and electricity cables hanging over the streets…
The body of the deceased is transported in this tower
The tower consists of three levels, of which the platform is the highest. Here the body is placed while the priests stands next to it and escorts it to the Pura Dalem. The base of the tower is built on bamboo poles which is then placed on the shoulders of a group of men who will carry the tower to the temple.
In order to ensure that the soul of the deceased doesn't find his/her way back home the men confuse it by twisting, twirling and making full circles with the tower. All the men in the village are delighted to take part in this un-organized spectacle. As an spectator you are just surprised that the tower is still standing in the end…
In front of the procession another group of men are carrying the sarcophagus, often in the form of a black bull. It is a impressive structure and the decorations are often very grand as a lot of gold is used in the decorations.
The bull in which the body will be placed just before the cremation
The sarcophagus always arrives first at the temple, and waits here for the funeral tower to arrive. There is a opening on the back of the bull in which the body will be placed.
The final rituals are conducted by the priest who sprinkles holy water on the bull and offerings are placed. Then the sarcophagus is set on fire in order to purify the deceased.
Once everything is burnt to ashes, is the soul able to leave this world
In the past the widow would be cremated together with her deceased husband as it was her duty to assist him in finding the right way. But fortunately, when the Dutch ruled over Bali they forbade these practices…
The initial purification of the deceased is a fact only when the whole sarcophagus is turned into ashes. The white ashes of the bones are separated from the others and then places with flowers into yellow and white cloth. Only then is the soul of the deceased ready for the final ceremony, in which the soul of deceased is awaken by the priest one final time.
The Final Purification
The final ceremony after the ngaben is usually 12 days after the cremation. But because it is another expensive happening, it can take longer before this ceremony actually takes place. During this ceremony the remaining ashes that was placed in white and yellow cloth is transported on a beautiful construction to the sea. If the sea is too far, then the ashes will be taken to a river which will eventually carry it to sea.
The ashes will be placed at sea so the soul is fully released
During the ngaben the soul of the deceased has been purified by fire and resides in heaven where life is just as in Bali but without diseases and problems. However, during the last ceremony in which the ashes are placed in the water the soul is released to a higher level. From here the soul can follow the final stage of reincarnation.
The Balinese people believe that the soul will return back as a reincarnation of a new family member, such as the first baby born after this final ritual.
Elephant Safari Park
Meeting international standards for animal care, this fabulous park is set in more than 2 hectares of exotic, eco-tourism landscaped botanical gardens surrounded by national forest. Acclaimed as the World's Best Elephant Park, facilities include a full Reception area and Information Centre, comprehensive Museum with a large collection of elephant memorabilia, and the only Mammoth Skeleton in South East Asia.
Get up close and personal with these incredible animals. Watch them immersing themselves in the park's lake in-between elephant rides, shows and other pleasurable pursuits. Hand feed them, touch them, take photos with them, and learn more about their ancestry and diversity at the Park's historical and graphic displays.
Evening Performances
Ubud Area Markets
Ubud Market
Located on Jl. Raya Ubud, the Ubud Market has kept much of its traditional charm, with squatting Balinese sellers haggling loudly among spices and vegetables. The market also sells handicrafts which are primarily made in the neighbouring villages of Mas and Tegalalang. Early morning is a great time to visit as this is when the locals do much of their shopping.
Sukawati Art Market
Sukawati Art Market is located on Jl. Raya Sukawati, Gianyar, across the Sukawati Traditional Market. Set in a new two-store building, the art market sells a wide variety of merchandise, ranging from statues to dance costumes, all at reasonable prices. A large variety of woven baskets can be found here, along with Balinese ceremonial items made from colorful prada (gold painted cloth).
Batubulan Market
Batubulan Market, situated at the border of Denpasar and Gianyar, is the home of stone sculptures. You will find various kinds of styles here, from traditional to modern and small to large. Traditionally, stone sculptures carved from soft volcanic rock (paras) were used to decorate temples and palaces but recently they are sold for export as well. The craftsmen can make practically anything you request from small to large sculptures.
Beyond Ubud Markets
Galiran Market, Klungkung, East Bali
Galiran Market, Klungkung is known as the central market of Eastern Bali because of its agricultural commodities from Karangasem, Bangli and Gianyar. The most crowded market day falls every three days on pasha (a three-day week based on the Balinese calendar).
In 1994, the market area was extended to 3 hectares which consists of 14 building blocks each selling different goods. In addition to food, drinks and products for East Bali residents, it also is a great place for visitors to browse for handicrafts, artwork, traditional fabrics and much more at reasonable prices if you are willing to haggle.
Candi Kuning Market, Bedugal
This market is a favorite stop on day trips to the north of Ubud. With its cooler climate it features super fresh fruits, vegetables, spices, and exotic flowers as delicate orchids and roses to create an intoxicating array of wonderful colors. Spices include nutmeg, pepper, paprika and turmeric. Seasonal fruit includes jeruk Bali (pomelo), durian, strawberries and rambutan.
Kuta Art Market
Situated close to Kuta Beach on Jl. Bakung Sair, the Kuta Art Market has a large number of shops selling a wide variety of merchandise including sarongs, clothes, shoes, jewelry, handicrafts, leather goods and furniture. You can find some good pieces and reasonable prices if you shop carefully and exert strong bargaining techniques.
Sanur Art Market
Located on Jl. Danau Tamblingan, the Sanur Art Market has a relaxed atmosphere and is less crowded than Kuta. This art market has an interesting variety of shops selling a wide range of merchandises such as sarongs, woodcarvings and other handicrafts. It is also surrounded by lots of local style restaurants.
Kumbasari Market, Denpasar
Kumbasari Market is located on Jl. Gajah Mada near the Badung River. This traditional, non-air-conditioned market offers an interesting overview of an Indonesian market. In the basement, you will find the traditional market with loads of traditional kitchen crafts made from woven bamboo. The second floor provides spices and dried goods, as well as a wide variety of Balinese printed batik, Balinese and Javanese hand-woven textiles and various batik textiles at reasonable prices. Household wares and clothing can be found on the third floor.
Badung Market, Denpasar
This 24 hour traditional market is located on Jl. Gaja Mada across from the Kumbasari Market, yet separated by the Badung River. This largest and oldest market in Bali, it provides such local needs as meats, fish, vegetables, tropical and subtropical fruits, groceries, spices, clothes, textiles, and much more. Apart from consumables, one can also find betel leaves which are used in Balinese Hindu prayers, as well as fabrics and household supplies. Although it is rather unclean, this tent market attracts many local shoppers and wholesalers for its completeness and competitive prices. The peak hour is the afternoon when the big transaction occurs.
Pasar Burung (Bird Market), Denpasar
Pasar Burung (Bird Market) is located on Jl. Pramuka. This colorful and noisy market provides a wide range of birds and other such small animals such as monkeys, squirrels, small wild cats and other unidentifiable animals from the heart of the dark jungles of Indonesia.
Sanglah Market, Denpasar
Sanglah market is located in south Denpasar area, about 2,5km from the city center. Like other traditional markets in Denpasar, this market offers commodities for daily needs. Although it is open the whole day, the busy activities are only in the morning around 6 am.
Satria Market, Denpasar
Satria market is located at the north side of Gajah Mada Street, in the corner of Nukala Street and Veteran Street. This market sells art crafts such as wooden handicrafts, paintings, and other handicrafts on the second level, and daily commodities on the ground level.
Even today masks are still worn during temple dances in which the Balinese teach each other epic stories of their Hindu religion, and celebrate various stages of life, the rice planting and harvesting season and the victory of good over evil. A mask carver is called the 'undagitapel' and those who make the mask for temples have to be a member of the Brahman caste since he knows the required rituals involved with making a sacred mask. The Balinese believe that everything has a soul: the rain, the winds, a rock and even a mask.
The village of Mas just south of Ubud is most famous for its amazing masks and woodcarvings. When you walk around Mas you'll observe many craftsmen working on a mask or a wooden statue where they use over 30 different tools to carve out the wood. There are four types of Bali masks found in most of these shops – human, animal, gods and demons
Tilem Gallery, Tantra Gallery, Ida Bagus Anom (for masks), and Ida Bagus Sutarja (for masks) are some of the most renowned places where masterworks are still sold amid decorative pieces which are produced in quantity for the travel memento and mass export market.
The Houses of Masks and Puppets (Rumah Topeng and Wayang) displays various kinds of masks and puppets from different regions in Indonesia and around the world that have been collected, stored, and displayed for the public since 2006.The collection includes more than 1,200 masks and 4,700 puppets. Located just a few miles from the heart of Ubud, the House of Masks and Puppets covers more than 1 hectare of land surrounded by traditional Balinese village and rice fields. The land provides a wide range of facilities, including a tropical garden, exhibition rooms, performance buildings, and a Balinese house.
Sobek's well trained guides and welcoming operational staff, make your trip the most memorable and enjoyable trip possible. Sobek is world renowned for its brand new industry leading, safety approved equipment.
Sobek Ayng River Rafting
As you carve through some of Bali's most appealing landscape, the Ayung River provides a thrill that begins the moment you push of from the riverbanks. As you switch between Class I and II rapids, you will wind through deep valleys with cascading waterfalls and towering cliffs of prehistoric significance.
On the more leisurely stretches through tropical forests you will see Hindu shrines that are brightly decorated on ceremonial days of prayer. Just as you think it is all coming to an end, the unpredictable Ayung River propels your raft into yet another rapid.
Sobek's two hour, visually spectacular rafting trip down the Ayung River is made even more enjoyable and comfortable by the brand new industry leading, safety approved equipment.
Sobek Telaga Waya River Experience
The thrilling Telaga Waja adventure begins in the foothills of the sacred Mount Agung, after an in-depth safety and equipment briefing by Sobek's experienced guides. From the time you drop into the first set of rapids, your heart will be racing and your adrenalin pumping.
In a continual spray of white clear water, you will rush past steep banks and ancient hanging trees, whilst rafting straight through cascading waterfalls of cold natural spring water. The Sobek guides will give you instruction and work with you to safely navigate the raft through torrents, twists, tight turns and inclined rapids.
Over head obstacles, narrow gorges and breathtaking views of terraced rice plains all along the way will give you an appetite for your final challenge! The Water Dam! Hold on, Take a deep breath, and down you go!
Scuba DIving and Snorkeling
Bali's seas are surprisingly unheralded given its incredibly rich and varied dive and snorkeling sites. Deep drop-offs and steep banks, coral ridges and colorful fishes, volcanic outcrops and sea grass beds are all part of the underwater tapestry. With its diverse marine life and one of the world's most famous wrecks, there's enough here to keep you coming back for more. The best and most popular dive and snorkeling sites on Bali are Tulamben, Amed, Candidasa, Menjangan Island, Nusa Penida and Nusa Lembongan. There are many Dive organisations that offer 3 day courses to obtain an international dive certificate or you can opt for an introduction dive.
Silver Jewelry Making Classes
Studio Perak is a socially-responsible Ubud business where Bapak Ketut plies his trade of making beautiful, organically inspired jewelry with silver and semi-precious stones.
His one of a kind creations are sold from his two store locations in central Ubud. Ketut's designs are inspired by nature and simplicity, and the natural shape and properties of semi-precious stones. Traditional techniques of Balinese silver smiting are incorporated into fresh, contemporary designs.
In the 3 hour course you will be able to complete a ring or pendant of your own design, or borrow the base of one of their designs to make your piece. Studio Perak offers classes from Monday to Saturday from 9am to 12noon and / or 2pm to 5pm The price of Rp 35o,000 includes 5 grams of silver. If you would like to use more silver or use stones, these can purchased at an extra cost.
Call 62 361 974244 or e-mail: info@studioperak.co
Activities / Classes
The Art of Offerings
One of the most striking things about Bali is the daily profusion of offerings. They are vitally important as they give pleasure to Bali's Hindu gods and demons and provide positive karma to those involved in their preparation. They accompany all ceremonies and prayers. Some Balinese, mostly women, even spend all their lives making these unique gifts to the gods. They vary considerable in complexity. Some are very simple and tiny while others can be several meters high. One thing that they have in common is that they are made from natural things.
Nearly every village has its own unique forms of offerings as they are considered a means of giving something back. Of course, gifts obligate the recipient and so the system creates mutual obligations and favors, even between humans and spirits. With offerings to the demons, however, the person presenting the offer does not expect a gift in return, just the favor that the demons will go away.
To learn first – hand how to make a Balinese offering, schedule a class at Pondok Pekak located on the east side of the Ubud Football Field. The price is Rp 100,000 for 1.5 hours. Pondok Pekak is a non-profit community organization which holds a library for adults and children, as well as hosts a wide range of traditional Balinese music and dance groups.
Email:Pondok@indo.net.id or npoindo@yahoo.com


text:
La Línea 382 es una línea de colectivos del Área Metropolitana de Buenos Aires que une Ciudadela y Lomas del Mirador con Virrey del Pino y Pontevedra, en el Partido de Merlo.

Unidades al servicio
El parque automotor de la empresa está compuesto por unidades Mercedes Benz de los cuales están carrozados por Ugarte, Italbus y Metalpar.
Toda la flota cuenta con Piso Bajo y Aire Acondicionado.

Enlaces externos

382
382

redpajama_set_name: RedPajamaWikipedia


Blowout Sale! Up to 69% off on Bedding Sets & Collections at Hadley Society. Top brands include Disney, SNURK, Cliab, ORoa, BeddingHome, JORGE'S HOME FASHION, Fancy Linen, AMWAN, Star Wars, The Gift Scholars, MK Home, Marvel, CHF Industries, Pokémon, FADFAY, Ammybeddings, Peppa Pig, & Comfort Spaces. Hurry! Limited time offers. Offers valid only while supplies last.
© 2019 - hadleysociety.org. All Rights Reserved.


text:
Corey Finger
…is an upstate New York native, hailing from the the small town of Saugerties, which is nestled nicely between the mighty Hudson River and the scenic Catskill Mountains.
Currently Corey resides in Queens, the best of all the five boroughs of New York City. He lives with the love of his life, Daisy, whom he met after an Experimental Media Organization meeting while at college at SUNY-Binghamton way back in 1998, his mother-in-law, who is somewhat befuddled by Corey's obsession with birds, and his young son, Desmond, who is fortunate enough to have Shearwater as a middle name.
Corey came late to the world of birding, discovering his passion for birds when a Green Heron showed itself to him and Daisy. Since the trigger bird (which was seen in May 2005) Corey has been on a high-speed course from bird to bird, garnering an impressive (for a beginner) 316 birds in a New York State Big Year in 2007 and generally birding every chance he gets.
Because of simple geography most of Corey's birding has taken place in New York State and the northeastern United States in general, though near-yearly trips to southern California and Florida have allowed him to add many cool birds to his life list. He looks forward to eventually birding in every state in the nation!
A trip to Germany in October 2007 led Corey to the revelation that there are even more birds on other continents and since that trip he has visited and birded Ecuador (where he saw his 1,000th bird species), Honduras, Hungary, Austria, Costa Rica, Lichtenstein, Bahamas, Puerto Rico, Belize, Switzerland, Uganda, Trinidad and Tobago, Barbados, and Kazakhstan!
When he's not birding, which isn't often, Corey works as a union organizer and representative, reads, blogs, wanders around New York City, gets angry about politics, and spends time with his family. He's also written the ABA Field Guide to Birds of New York.
Corey's entire archive on 10,000 Birds is accessible here.
Corey's Bird Lists
Queens Life List
ABA Life List (needs lots of updating)
World Life List (needs even more updating)
2015 Year List
2008 Anti-Global Warming Big Year
2007 New York State Big Year List
Welcome to 10,000 Birds, the world's favorite birding blog! Learn more about our site, Mike, Corey, or our awesome team of Beat Writers.
Be sure to browse our extensive galleries, species accounts, and book and product reviews. Feel free to contact us and don't forget to subscribe!
Latest Destinations
The Biggest Urban Pygmy Cormorant Roost is Finally Protected!!
A Year of Birding in Costa Rica- Highlights and a Few Birds Missed
Casa Tangara dowii, Costa Rica: to claim our feathery gold
Highlights from the 2022 Arenal Christmas Count in Costa Rica
Casa Tangara dowii, Costa Rica, or over the Misty Mountains cold
© 2019 10,000 Birds // All rights reserved
All words, images, and opinions are the property of their respective authors unless stated otherwise.


Ruling Awami League leader Suranjit Sengupta has lambasted the Election Commission over its "failure to prevent violence in the union parishad elections".
"Nine people have been killed [in the second phase polls]; we can not keep close our eyes in this stage," said Suranjit at a programme at capital's Dhakeshwari Temple.
Suranjit, also the president of the parliamentary standing committee on law, justice and parliamentary affairs, also criticised the commission as it failed to hold trial for the election violence casualties.
Suranjit also criticised EC for inactive role in preventing attack on the minority community during the polls.
In the first-phase of the election held on March 22, at least 10 people lost their lives. The toll rised to 20 after completion of the second phase. At least 11 others were killed in pre-election violence.