{"version":3,"file":"vendor.bundle.js","sources":["webpack:///./src/vendor.ts","webpack:///./~/@angular/core/bundles/core.umd.js","webpack:///./~/rxjs/Observable.js","webpack:///./~/@angular/router/bundles/router.umd.js","webpack:///./~/rxjs/Subscriber.js","webpack:///./~/rxjs/OuterSubscriber.js","webpack:///./~/rxjs/util/subscribeToResult.js","webpack:///./~/@ngrx/store/bundles/store.umd.js","webpack:///./~/rxjs/Subject.js","webpack:///./~/rxjs/BehaviorSubject.js","webpack:///./~/rxjs/Subscription.js","webpack:///./~/@angular/common/bundles/common.umd.js","webpack:///./~/rxjs/util/errorObject.js","webpack:///./~/rxjs/util/root.js","webpack:///./~/rxjs/util/tryCatch.js","webpack:///./~/rxjs/scheduler/async.js","webpack:///./~/@angular/platform-browser/bundles/platform-browser.umd.js","webpack:///./~/rxjs/util/isArray.js","webpack:///./~/rxjs/observable/ArrayObservable.js","webpack:///./~/@angular/http/bundles/http.umd.js","webpack:///./~/rxjs/observable/EmptyObservable.js","webpack:///./~/rxjs/operator/map.js","webpack:///./~/rxjs/util/isScheduler.js","webpack:///./~/rxjs/operator/filter.js","webpack:///./~/rxjs/Notification.js","webpack:///./~/rxjs/operator/mergeAll.js","webpack:///./~/rxjs/operator/observeOn.js","webpack:///./~/rxjs/scheduler/AsyncAction.js","webpack:///./~/rxjs/scheduler/AsyncScheduler.js","webpack:///./~/rxjs/symbol/iterator.js","webpack:///./~/rxjs/symbol/observable.js","webpack:///./~/rxjs/util/EmptyError.js","webpack:///./~/rxjs/operator/distinctUntilChanged.js","webpack:///./~/rxjs/operator/reduce.js","webpack:///./~/rxjs/scheduler/queue.js","webpack:///./~/rxjs/symbol/rxSubscriber.js","webpack:///./~/rxjs/util/ArgumentOutOfRangeError.js","webpack:///./~/rxjs/util/ObjectUnsubscribedError.js","webpack:///./~/rxjs/util/isDate.js","webpack:///./~/jquery/dist/jquery.js","webpack:///./~/rxjs/ReplaySubject.js","webpack:///./~/rxjs/add/operator/mergeMap.js","webpack:///./~/rxjs/observable/ScalarObservable.js","webpack:///./~/rxjs/observable/fromPromise.js","webpack:///./~/rxjs/observable/merge.js","webpack:///./~/rxjs/operator/combineLatest.js","webpack:///./~/rxjs/operator/merge.js","webpack:///./~/rxjs/operator/mergeMap.js","webpack:///./~/rxjs/operator/pluck.js","webpack:///./~/rxjs/operator/scan.js","webpack:///./~/rxjs/operator/withLatestFrom.js","webpack:///./~/rxjs/util/isFunction.js","webpack:///./~/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js","webpack:///./~/rxjs/Observer.js","webpack:///./~/rxjs/SubjectSubscription.js","webpack:///./~/rxjs/add/observable/combineLatest.js","webpack:///./~/rxjs/add/observable/dom/webSocket.js","webpack:///./~/rxjs/add/observable/empty.js","webpack:///./~/rxjs/add/observable/merge.js","webpack:///./~/rxjs/add/observable/of.js","webpack:///./~/rxjs/add/operator/catch.js","webpack:///./~/rxjs/add/operator/combineLatest.js","webpack:///./~/rxjs/add/operator/delay.js","webpack:///./~/rxjs/add/operator/filter.js","webpack:///./~/rxjs/add/operator/find.js","webpack:///./~/rxjs/add/operator/map.js","webpack:///./~/rxjs/add/operator/pluck.js","webpack:///./~/rxjs/add/operator/retryWhen.js","webpack:///./~/rxjs/add/operator/take.js","webpack:///./~/rxjs/add/operator/takeUntil.js","webpack:///./~/rxjs/add/operator/withLatestFrom.js","webpack:///./~/rxjs/observable/FromObservable.js","webpack:///./~/rxjs/observable/PromiseObservable.js","webpack:///./~/rxjs/observable/empty.js","webpack:///./~/rxjs/observable/from.js","webpack:///./~/rxjs/observable/of.js","webpack:///./~/rxjs/operator/catch.js","webpack:///./~/rxjs/operator/concatAll.js","webpack:///./~/rxjs/operator/concatMap.js","webpack:///./~/rxjs/operator/every.js","webpack:///./~/rxjs/operator/find.js","webpack:///./~/rxjs/operator/first.js","webpack:///./~/rxjs/operator/last.js","webpack:///./~/rxjs/operator/takeUntil.js","webpack:///./~/rxjs/util/UnsubscriptionError.js","webpack:///./~/rxjs/util/isObject.js","webpack:///./~/rxjs/util/isPromise.js","webpack:///./~/@angular/compiler/bundles/compiler.umd.js","webpack:///./~/@ngrx/core/bundles/core.umd.js","webpack:///./~/rxjs/InnerSubscriber.js","webpack:///./~/rxjs/Scheduler.js","webpack:///./~/rxjs/observable/ArrayLikeObservable.js","webpack:///./~/rxjs/observable/IteratorObservable.js","webpack:///./~/rxjs/observable/combineLatest.js","webpack:///./~/rxjs/observable/dom/WebSocketSubject.js","webpack:///./~/rxjs/observable/dom/webSocket.js","webpack:///./~/rxjs/operator/delay.js","webpack:///./~/rxjs/operator/retryWhen.js","webpack:///./~/rxjs/operator/take.js","webpack:///./~/rxjs/scheduler/Action.js","webpack:///./~/rxjs/scheduler/QueueAction.js","webpack:///./~/rxjs/scheduler/QueueScheduler.js","webpack:///./~/rxjs/util/assign.js","webpack:///./~/rxjs/util/toSubscriber.js"],"sourcesContent":["// Vendors\n\n// Angular 2\nimport '@angular/platform-browser-dynamic';\nimport '@angular/platform-browser';\nimport '@angular/core';\nimport '@angular/http';\nimport '@angular/router';\n\nimport 'rxjs/add/operator/filter';\nimport 'rxjs/add/operator/catch';\nimport 'rxjs/add/operator/delay';\nimport 'rxjs/add/operator/find';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/operator/mergeMap';\nimport 'rxjs/add/operator/combineLatest';\nimport 'rxjs/add/operator/withLatestFrom';\nimport 'rxjs/add/operator/take';\nimport 'rxjs/add/operator/pluck';\nimport 'rxjs/add/operator/takeUntil';\nimport 'rxjs/add/operator/retryWhen';\nimport 'rxjs/add/observable/of';\nimport 'rxjs/add/observable/empty';\nimport 'rxjs/add/observable/merge';\nimport 'rxjs/add/observable/dom/webSocket';\nimport 'rxjs/add/observable/combineLatest';\n\n// RxJS 5\n// import 'rxjs/Rx';\n\n\n// For vendors for example jQuery, Lodash, angular2-jwt import them here\n// Also see src/typings.d.ts as you also need to run `typings install x` where `x` is your module\n\nimport '@ngrx/store';\nimport 'jquery';\n\n\n\n// WEBPACK FOOTER //\n// node_modules/angular2-template-loader!./src/vendor.ts","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs/symbol/observable'), require('rxjs/Subject'), require('rxjs/Observable')) :\n    typeof define === 'function' && define.amd ? define(['exports', 'rxjs/symbol/observable', 'rxjs/Subject', 'rxjs/Observable'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.core = global.ng.core || {}),global.rxjs_symbol_observable,global.Rx,global.Rx));\n}(this, function (exports,rxjs_symbol_observable,rxjs_Subject,rxjs_Observable) { 'use strict';\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ globalScope;\n    if (typeof window === 'undefined') {\n        if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n            // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n            globalScope = (self);\n        }\n        else {\n            globalScope = (global);\n        }\n    }\n    else {\n        globalScope = (window);\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function scheduleMicroTask(fn) {\n        Zone.current.scheduleMicroTask('scheduleMicrotask', fn);\n    }\n    // Need to declare a new variable for global here since TypeScript\n    // exports the original value of the symbol.\n    var /** @type {?} */ global$1 = globalScope;\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function getTypeNameForDebugging(type) {\n        return type['name'] || typeof type;\n    }\n    // TODO: remove calls to assert in production environment\n    // Note: Can't just export this and import in in other files\n    // as `assert` is a reserved keyword in Dart\n    global$1.assert = function assert(condition) {\n        // TODO: to be fixed properly via #2830, noop for now\n    };\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPresent(obj) {\n        return obj != null;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isBlank(obj) {\n        return obj == null;\n    }\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function stringify(token) {\n        if (typeof token === 'string') {\n            return token;\n        }\n        if (token == null) {\n            return '' + token;\n        }\n        if (token.overriddenName) {\n            return \"\" + token.overriddenName;\n        }\n        if (token.name) {\n            return \"\" + token.name;\n        }\n        var /** @type {?} */ res = token.toString();\n        var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n        return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function looseIdentical(a, b) {\n        return a === b || typeof a === 'number' && typeof b === 'number' && isNaN(a) && isNaN(b);\n    }\n    /**\n     * @param {?} o\n     * @return {?}\n     */\n    function isJsObject(o) {\n        return o !== null && (typeof o === 'function' || typeof o === 'object');\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function print(obj) {\n        // tslint:disable-next-line:no-console\n        console.log(obj);\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function warn(obj) {\n        console.warn(obj);\n    }\n    var /** @type {?} */ _symbolIterator = null;\n    /**\n     * @return {?}\n     */\n    function getSymbolIterator() {\n        if (!_symbolIterator) {\n            if (((globalScope)).Symbol && Symbol.iterator) {\n                _symbolIterator = Symbol.iterator;\n            }\n            else {\n                // es6-shim specific logic\n                var /** @type {?} */ keys = Object.getOwnPropertyNames(Map.prototype);\n                for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n                    var /** @type {?} */ key = keys[i];\n                    if (key !== 'entries' && key !== 'size' &&\n                        ((Map)).prototype[key] === Map.prototype['entries']) {\n                        _symbolIterator = key;\n                    }\n                }\n            }\n        }\n        return _symbolIterator;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPrimitive(obj) {\n        return !isJsObject(obj);\n    }\n\n    var /** @type {?} */ _nextClassId = 0;\n    var /** @type {?} */ Reflect = global$1.Reflect;\n    /**\n     * @param {?} annotation\n     * @return {?}\n     */\n    function extractAnnotation(annotation) {\n        if (typeof annotation === 'function' && annotation.hasOwnProperty('annotation')) {\n            // it is a decorator, extract annotation\n            annotation = annotation.annotation;\n        }\n        return annotation;\n    }\n    /**\n     * @param {?} fnOrArray\n     * @param {?} key\n     * @return {?}\n     */\n    function applyParams(fnOrArray, key) {\n        if (fnOrArray === Object || fnOrArray === String || fnOrArray === Function ||\n            fnOrArray === Number || fnOrArray === Array) {\n            throw new Error(\"Can not use native \" + stringify(fnOrArray) + \" as constructor\");\n        }\n        if (typeof fnOrArray === 'function') {\n            return fnOrArray;\n        }\n        if (Array.isArray(fnOrArray)) {\n            var /** @type {?} */ annotations = fnOrArray;\n            var /** @type {?} */ annoLength = annotations.length - 1;\n            var /** @type {?} */ fn = fnOrArray[annoLength];\n            if (typeof fn !== 'function') {\n                throw new Error(\"Last position of Class method array must be Function in key \" + key + \" was '\" + stringify(fn) + \"'\");\n            }\n            if (annoLength != fn.length) {\n                throw new Error(\"Number of annotations (\" + annoLength + \") does not match number of arguments (\" + fn.length + \") in the function: \" + stringify(fn));\n            }\n            var /** @type {?} */ paramsAnnotations = [];\n            for (var /** @type {?} */ i = 0, /** @type {?} */ ii = annotations.length - 1; i < ii; i++) {\n                var /** @type {?} */ paramAnnotations = [];\n                paramsAnnotations.push(paramAnnotations);\n                var /** @type {?} */ annotation = annotations[i];\n                if (Array.isArray(annotation)) {\n                    for (var /** @type {?} */ j = 0; j < annotation.length; j++) {\n                        paramAnnotations.push(extractAnnotation(annotation[j]));\n                    }\n                }\n                else if (typeof annotation === 'function') {\n                    paramAnnotations.push(extractAnnotation(annotation));\n                }\n                else {\n                    paramAnnotations.push(annotation);\n                }\n            }\n            Reflect.defineMetadata('parameters', paramsAnnotations, fn);\n            return fn;\n        }\n        throw new Error(\"Only Function or Array is supported in Class definition for key '\" + key + \"' is '\" + stringify(fnOrArray) + \"'\");\n    }\n    /**\n     * Provides a way for expressing ES6 classes with parameter annotations in ES5.\n     *\n     * ## Basic Example\n     *\n     * ```\n     * var Greeter = ng.Class({\n     *   constructor: function(name) {\n     *     this.name = name;\n     *   },\n     *\n     *   greet: function() {\n     *     alert('Hello ' + this.name + '!');\n     *   }\n     * });\n     * ```\n     *\n     * is equivalent to ES6:\n     *\n     * ```\n     * class Greeter {\n     *   constructor(name) {\n     *     this.name = name;\n     *   }\n     *\n     *   greet() {\n     *     alert('Hello ' + this.name + '!');\n     *   }\n     * }\n     * ```\n     *\n     * or equivalent to ES5:\n     *\n     * ```\n     * var Greeter = function (name) {\n     *   this.name = name;\n     * }\n     *\n     * Greeter.prototype.greet = function () {\n     *   alert('Hello ' + this.name + '!');\n     * }\n     * ```\n     *\n     * ### Example with parameter annotations\n     *\n     * ```\n     * var MyService = ng.Class({\n     *   constructor: [String, [new Optional(), Service], function(name, myService) {\n     *     ...\n     *   }]\n     * });\n     * ```\n     *\n     * is equivalent to ES6:\n     *\n     * ```\n     * class MyService {\n     *   constructor(name: string, \\@Optional() myService: Service) {\n     *     ...\n     *   }\n     * }\n     * ```\n     *\n     * ### Example with inheritance\n     *\n     * ```\n     * var Shape = ng.Class({\n     *   constructor: (color) {\n     *     this.color = color;\n     *   }\n     * });\n     *\n     * var Square = ng.Class({\n     *   extends: Shape,\n     *   constructor: function(color, size) {\n     *     Shape.call(this, color);\n     *     this.size = size;\n     *   }\n     * });\n     * ```\n     * \\@stable\n     * @param {?} clsDef\n     * @return {?}\n     */\n    function Class(clsDef) {\n        var /** @type {?} */ constructor = applyParams(clsDef.hasOwnProperty('constructor') ? clsDef.constructor : undefined, 'constructor');\n        var /** @type {?} */ proto = constructor.prototype;\n        if (clsDef.hasOwnProperty('extends')) {\n            if (typeof clsDef.extends === 'function') {\n                ((constructor)).prototype = proto =\n                    Object.create(((clsDef.extends)).prototype);\n            }\n            else {\n                throw new Error(\"Class definition 'extends' property must be a constructor function was: \" + stringify(clsDef.extends));\n            }\n        }\n        for (var key in clsDef) {\n            if (key !== 'extends' && key !== 'prototype' && clsDef.hasOwnProperty(key)) {\n                proto[key] = applyParams(clsDef[key], key);\n            }\n        }\n        if (this && this.annotations instanceof Array) {\n            Reflect.defineMetadata('annotations', this.annotations, constructor);\n        }\n        var /** @type {?} */ constructorName = constructor['name'];\n        if (!constructorName || constructorName === 'constructor') {\n            ((constructor))['overriddenName'] = \"class\" + _nextClassId++;\n        }\n        return (constructor);\n    }\n    /**\n     * @param {?} name\n     * @param {?} props\n     * @param {?=} parentClass\n     * @param {?=} chainFn\n     * @return {?}\n     */\n    function makeDecorator(name, props, parentClass, chainFn) {\n        if (chainFn === void 0) { chainFn = null; }\n        var /** @type {?} */ metaCtor = makeMetadataCtor([props]);\n        /**\n         * @param {?} objOrType\n         * @return {?}\n         */\n        function DecoratorFactory(objOrType) {\n            if (!(Reflect && Reflect.getOwnMetadata)) {\n                throw 'reflect-metadata shim is required when using class decorators';\n            }\n            if (this instanceof DecoratorFactory) {\n                metaCtor.call(this, objOrType);\n                return this;\n            }\n            var /** @type {?} */ annotationInstance = new ((DecoratorFactory))(objOrType);\n            var /** @type {?} */ chainAnnotation = typeof this === 'function' && Array.isArray(this.annotations) ? this.annotations : [];\n            chainAnnotation.push(annotationInstance);\n            var /** @type {?} */ TypeDecorator = (function TypeDecorator(cls) {\n                var /** @type {?} */ annotations = Reflect.getOwnMetadata('annotations', cls) || [];\n                annotations.push(annotationInstance);\n                Reflect.defineMetadata('annotations', annotations, cls);\n                return cls;\n            });\n            TypeDecorator.annotations = chainAnnotation;\n            TypeDecorator.Class = Class;\n            if (chainFn)\n                chainFn(TypeDecorator);\n            return TypeDecorator;\n        }\n        if (parentClass) {\n            DecoratorFactory.prototype = Object.create(parentClass.prototype);\n        }\n        DecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n        ((DecoratorFactory)).annotationCls = DecoratorFactory;\n        return DecoratorFactory;\n    }\n    /**\n     * @param {?} props\n     * @return {?}\n     */\n    function makeMetadataCtor(props) {\n        return function ctor() {\n            var _this = this;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            props.forEach(function (prop, i) {\n                var /** @type {?} */ argVal = args[i];\n                if (Array.isArray(prop)) {\n                    // plain parameter\n                    _this[prop[0]] = argVal === undefined ? prop[1] : argVal;\n                }\n                else {\n                    for (var propName in prop) {\n                        _this[propName] =\n                            argVal && argVal.hasOwnProperty(propName) ? argVal[propName] : prop[propName];\n                    }\n                }\n            });\n        };\n    }\n    /**\n     * @param {?} name\n     * @param {?} props\n     * @param {?=} parentClass\n     * @return {?}\n     */\n    function makeParamDecorator(name, props, parentClass) {\n        var /** @type {?} */ metaCtor = makeMetadataCtor(props);\n        /**\n         * @param {...?} args\n         * @return {?}\n         */\n        function ParamDecoratorFactory() {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            if (this instanceof ParamDecoratorFactory) {\n                metaCtor.apply(this, args);\n                return this;\n            }\n            var /** @type {?} */ annotationInstance = new ((_a = ((ParamDecoratorFactory))).bind.apply(_a, [void 0].concat(args)))();\n            ((ParamDecorator)).annotation = annotationInstance;\n            return ParamDecorator;\n            /**\n             * @param {?} cls\n             * @param {?} unusedKey\n             * @param {?} index\n             * @return {?}\n             */\n            function ParamDecorator(cls, unusedKey, index) {\n                var /** @type {?} */ parameters = Reflect.getOwnMetadata('parameters', cls) || [];\n                // there might be gaps if some in between parameters do not have annotations.\n                // we pad with nulls.\n                while (parameters.length <= index) {\n                    parameters.push(null);\n                }\n                parameters[index] = parameters[index] || [];\n                parameters[index].push(annotationInstance);\n                Reflect.defineMetadata('parameters', parameters, cls);\n                return cls;\n            }\n            var _a;\n        }\n        if (parentClass) {\n            ParamDecoratorFactory.prototype = Object.create(parentClass.prototype);\n        }\n        ParamDecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n        ((ParamDecoratorFactory)).annotationCls = ParamDecoratorFactory;\n        return ParamDecoratorFactory;\n    }\n    /**\n     * @param {?} name\n     * @param {?} props\n     * @param {?=} parentClass\n     * @return {?}\n     */\n    function makePropDecorator(name, props, parentClass) {\n        var /** @type {?} */ metaCtor = makeMetadataCtor(props);\n        /**\n         * @param {...?} args\n         * @return {?}\n         */\n        function PropDecoratorFactory() {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            if (this instanceof PropDecoratorFactory) {\n                metaCtor.apply(this, args);\n                return this;\n            }\n            var /** @type {?} */ decoratorInstance = new ((_a = ((PropDecoratorFactory))).bind.apply(_a, [void 0].concat(args)))();\n            return function PropDecorator(target, name) {\n                var /** @type {?} */ meta = Reflect.getOwnMetadata('propMetadata', target.constructor) || {};\n                meta[name] = meta.hasOwnProperty(name) && meta[name] || [];\n                meta[name].unshift(decoratorInstance);\n                Reflect.defineMetadata('propMetadata', meta, target.constructor);\n            };\n            var _a;\n        }\n        if (parentClass) {\n            PropDecoratorFactory.prototype = Object.create(parentClass.prototype);\n        }\n        PropDecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n        ((PropDecoratorFactory)).annotationCls = PropDecoratorFactory;\n        return PropDecoratorFactory;\n    }\n\n    /**\n     * Inject decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Inject = makeParamDecorator('Inject', [['token', undefined]]);\n    /**\n     * Optional decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Optional = makeParamDecorator('Optional', []);\n    /**\n     * Injectable decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Injectable = (makeDecorator('Injectable', []));\n    /**\n     * Self decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Self = makeParamDecorator('Self', []);\n    /**\n     * SkipSelf decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ SkipSelf = makeParamDecorator('SkipSelf', []);\n    /**\n     * Host decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Host = makeParamDecorator('Host', []);\n\n    var OpaqueToken = (function () {\n        /**\n         * @param {?} _desc\n         */\n        function OpaqueToken(_desc) {\n            this._desc = _desc;\n        }\n        /**\n         * @return {?}\n         */\n        OpaqueToken.prototype.toString = function () { return \"Token \" + this._desc; };\n        OpaqueToken.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        OpaqueToken.ctorParameters = function () { return [\n            null,\n        ]; };\n        return OpaqueToken;\n    }());\n\n    /**\n     * This token can be used to create a virtual provider that will populate the\n     * `entryComponents` fields of components and ng modules based on its `useValue`.\n     * All components that are referenced in the `useValue` value (either directly\n     * or in a nested array or map) will be added to the `entryComponents` property.\n     *\n     * ### Example\n     * The following example shows how the router can populate the `entryComponents`\n     * field of an NgModule based on the router configuration which refers\n     * to components.\n     *\n     * ```typescript\n     * // helper function inside the router\n     * function provideRoutes(routes) {\n     *   return [\n     *     {provide: ROUTES, useValue: routes},\n     *     {provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: routes, multi: true}\n     *   ];\n     * }\n     *\n     * // user code\n     * let routes = [\n     *   {path: '/root', component: RootComp},\n     *   {path: '/teams', component: TeamsComp}\n     * ];\n     *\n     * @NgModule({\n     *   providers: [provideRoutes(routes)]\n     * })\n     * class ModuleWithRoutes {}\n     * ```\n     *\n     * @experimental\n     */\n    var /** @type {?} */ ANALYZE_FOR_ENTRY_COMPONENTS = new OpaqueToken('AnalyzeForEntryComponents');\n    /**\n     * Attribute decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Attribute = makeParamDecorator('Attribute', [['attributeName', undefined]]);\n    /**\n     * Base class for query metadata.\n     *\n     * See {\\@link ContentChildren}, {\\@link ContentChild}, {\\@link ViewChildren}, {\\@link ViewChild} for\n     * more information.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var Query = (function () {\n        function Query() {\n        }\n        return Query;\n    }());\n    /**\n     * ContentChildren decorator and metadata.\n     *\n     *  @stable\n     *  @Annotation\n     */\n    var /** @type {?} */ ContentChildren = (makePropDecorator('ContentChildren', [\n        ['selector', undefined], {\n            first: false,\n            isViewQuery: false,\n            descendants: false,\n            read: undefined,\n        }\n    ], Query));\n    /**\n     * ContentChild decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ ContentChild = makePropDecorator('ContentChild', [\n        ['selector', undefined], {\n            first: true,\n            isViewQuery: false,\n            descendants: true,\n            read: undefined,\n        }\n    ], Query);\n    /**\n     * ViewChildren decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ ViewChildren = makePropDecorator('ViewChildren', [\n        ['selector', undefined], {\n            first: false,\n            isViewQuery: true,\n            descendants: true,\n            read: undefined,\n        }\n    ], Query);\n    /**\n     * ViewChild decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ ViewChild = makePropDecorator('ViewChild', [\n        ['selector', undefined], {\n            first: true,\n            isViewQuery: true,\n            descendants: true,\n            read: undefined,\n        }\n    ], Query);\n\n    var ChangeDetectionStrategy = {};\n    ChangeDetectionStrategy.OnPush = 0;\n    ChangeDetectionStrategy.Default = 1;\n    ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = \"OnPush\";\n    ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = \"Default\";\n    var ChangeDetectorStatus = {};\n    ChangeDetectorStatus.CheckOnce = 0;\n    ChangeDetectorStatus.Checked = 1;\n    ChangeDetectorStatus.CheckAlways = 2;\n    ChangeDetectorStatus.Detached = 3;\n    ChangeDetectorStatus.Errored = 4;\n    ChangeDetectorStatus.Destroyed = 5;\n    ChangeDetectorStatus[ChangeDetectorStatus.CheckOnce] = \"CheckOnce\";\n    ChangeDetectorStatus[ChangeDetectorStatus.Checked] = \"Checked\";\n    ChangeDetectorStatus[ChangeDetectorStatus.CheckAlways] = \"CheckAlways\";\n    ChangeDetectorStatus[ChangeDetectorStatus.Detached] = \"Detached\";\n    ChangeDetectorStatus[ChangeDetectorStatus.Errored] = \"Errored\";\n    ChangeDetectorStatus[ChangeDetectorStatus.Destroyed] = \"Destroyed\";\n    /**\n     * @param {?} changeDetectionStrategy\n     * @return {?}\n     */\n    function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {\n        return isBlank(changeDetectionStrategy) ||\n            changeDetectionStrategy === ChangeDetectionStrategy.Default;\n    }\n\n    /**\n     * Directive decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Directive = (makeDecorator('Directive', {\n        selector: undefined,\n        inputs: undefined,\n        outputs: undefined,\n        host: undefined,\n        providers: undefined,\n        exportAs: undefined,\n        queries: undefined\n    }));\n    /**\n     * Component decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Component = (makeDecorator('Component', {\n        selector: undefined,\n        inputs: undefined,\n        outputs: undefined,\n        host: undefined,\n        exportAs: undefined,\n        moduleId: undefined,\n        providers: undefined,\n        viewProviders: undefined,\n        changeDetection: ChangeDetectionStrategy.Default,\n        queries: undefined,\n        templateUrl: undefined,\n        template: undefined,\n        styleUrls: undefined,\n        styles: undefined,\n        animations: undefined,\n        encapsulation: undefined,\n        interpolation: undefined,\n        entryComponents: undefined\n    }, Directive));\n    /**\n     * Pipe decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Pipe = (makeDecorator('Pipe', {\n        name: undefined,\n        pure: true,\n    }));\n    /**\n     * Input decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Input = makePropDecorator('Input', [['bindingPropertyName', undefined]]);\n    /**\n     * Output decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ Output = makePropDecorator('Output', [['bindingPropertyName', undefined]]);\n    /**\n     * HostBinding decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ HostBinding = makePropDecorator('HostBinding', [['hostPropertyName', undefined]]);\n    /**\n     * HostListener decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ HostListener = makePropDecorator('HostListener', [['eventName', undefined], ['args', []]]);\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var LifecycleHooks = {};\n    LifecycleHooks.OnInit = 0;\n    LifecycleHooks.OnDestroy = 1;\n    LifecycleHooks.DoCheck = 2;\n    LifecycleHooks.OnChanges = 3;\n    LifecycleHooks.AfterContentInit = 4;\n    LifecycleHooks.AfterContentChecked = 5;\n    LifecycleHooks.AfterViewInit = 6;\n    LifecycleHooks.AfterViewChecked = 7;\n    LifecycleHooks[LifecycleHooks.OnInit] = \"OnInit\";\n    LifecycleHooks[LifecycleHooks.OnDestroy] = \"OnDestroy\";\n    LifecycleHooks[LifecycleHooks.DoCheck] = \"DoCheck\";\n    LifecycleHooks[LifecycleHooks.OnChanges] = \"OnChanges\";\n    LifecycleHooks[LifecycleHooks.AfterContentInit] = \"AfterContentInit\";\n    LifecycleHooks[LifecycleHooks.AfterContentChecked] = \"AfterContentChecked\";\n    LifecycleHooks[LifecycleHooks.AfterViewInit] = \"AfterViewInit\";\n    LifecycleHooks[LifecycleHooks.AfterViewChecked] = \"AfterViewChecked\";\n    var /** @type {?} */ LIFECYCLE_HOOKS_VALUES = [\n        LifecycleHooks.OnInit, LifecycleHooks.OnDestroy, LifecycleHooks.DoCheck, LifecycleHooks.OnChanges,\n        LifecycleHooks.AfterContentInit, LifecycleHooks.AfterContentChecked, LifecycleHooks.AfterViewInit,\n        LifecycleHooks.AfterViewChecked\n    ];\n    /**\n     * \\@whatItDoes Lifecycle hook that is called when any data-bound property of a directive changes.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnChanges'}\n     *\n     * \\@description\n     * `ngOnChanges` is called right after the data-bound properties have been checked and before view\n     * and content children are checked if at least one of them has changed.\n     * The `changes` parameter contains the changed properties.\n     *\n     * See {\\@linkDocs guide/lifecycle-hooks#onchanges \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var OnChanges = (function () {\n        function OnChanges() {\n        }\n        /**\n         * @abstract\n         * @param {?} changes\n         * @return {?}\n         */\n        OnChanges.prototype.ngOnChanges = function (changes) { };\n        return OnChanges;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called after data-bound properties of a directive are\n     * initialized.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnInit'}\n     *\n     * \\@description\n     * `ngOnInit` is called right after the directive's data-bound properties have been checked for the\n     * first time, and before any of its children have been checked. It is invoked only once when the\n     * directive is instantiated.\n     *\n     * See {\\@linkDocs guide/lifecycle-hooks \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var OnInit = (function () {\n        function OnInit() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        OnInit.prototype.ngOnInit = function () { };\n        return OnInit;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called when Angular dirty checks a directive.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='DoCheck'}\n     *\n     * \\@description\n     * `ngDoCheck` gets called to check the changes in the directives in addition to the default\n     * algorithm. The default change detection algorithm looks for differences by comparing\n     * bound-property values by reference across change detection runs.\n     *\n     * Note that a directive typically should not use both `DoCheck` and {\\@link OnChanges} to respond to\n     * changes on the same input, as `ngOnChanges` will continue to be called when the default change\n     * detector detects changes.\n     *\n     * See {\\@link KeyValueDiffers} and {\\@link IterableDiffers} for implementing custom dirty checking\n     * for collections.\n     *\n     * See {\\@linkDocs guide/lifecycle-hooks#docheck \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var DoCheck = (function () {\n        function DoCheck() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DoCheck.prototype.ngDoCheck = function () { };\n        return DoCheck;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called when a directive, pipe or service is destroyed.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnDestroy'}\n     *\n     * \\@description\n     * `ngOnDestroy` callback is typically used for any custom cleanup that needs to occur when the\n     * instance is destroyed.\n     *\n     * See {\\@linkDocs guide/lifecycle-hooks \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var OnDestroy = (function () {\n        function OnDestroy() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        OnDestroy.prototype.ngOnDestroy = function () { };\n        return OnDestroy;\n    }());\n    /**\n     *\n     * \\@whatItDoes Lifecycle hook that is called after a directive's content has been fully\n     * initialized.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentInit'}\n     *\n     * \\@description\n     * See {\\@linkDocs guide/lifecycle-hooks#aftercontent \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var AfterContentInit = (function () {\n        function AfterContentInit() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AfterContentInit.prototype.ngAfterContentInit = function () { };\n        return AfterContentInit;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called after every check of a directive's content.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentChecked'}\n     *\n     * \\@description\n     * See {\\@linkDocs guide/lifecycle-hooks#aftercontent \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var AfterContentChecked = (function () {\n        function AfterContentChecked() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AfterContentChecked.prototype.ngAfterContentChecked = function () { };\n        return AfterContentChecked;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called after a component's view has been fully\n     * initialized.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewInit'}\n     *\n     * \\@description\n     * See {\\@linkDocs guide/lifecycle-hooks#afterview \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var AfterViewInit = (function () {\n        function AfterViewInit() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AfterViewInit.prototype.ngAfterViewInit = function () { };\n        return AfterViewInit;\n    }());\n    /**\n     * \\@whatItDoes Lifecycle hook that is called after every check of a component's view.\n     * \\@howToUse\n     * {\\@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewChecked'}\n     *\n     * \\@description\n     * See {\\@linkDocs guide/lifecycle-hooks#afterview \"Lifecycle Hooks Guide\"}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var AfterViewChecked = (function () {\n        function AfterViewChecked() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AfterViewChecked.prototype.ngAfterViewChecked = function () { };\n        return AfterViewChecked;\n    }());\n\n    /**\n     * Defines a schema that will allow:\n     * - any non-Angular elements with a `-` in their name,\n     * - any properties on elements with a `-` in their name which is the common rule for custom\n     * elements.\n     *\n     * @stable\n     */\n    var /** @type {?} */ CUSTOM_ELEMENTS_SCHEMA = {\n        name: 'custom-elements'\n    };\n    /**\n     * Defines a schema that will allow any property on any element.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ NO_ERRORS_SCHEMA = {\n        name: 'no-errors-schema'\n    };\n    /**\n     * NgModule decorator and metadata.\n     *\n     * @stable\n     * @Annotation\n     */\n    var /** @type {?} */ NgModule = (makeDecorator('NgModule', {\n        providers: undefined,\n        declarations: undefined,\n        imports: undefined,\n        exports: undefined,\n        entryComponents: undefined,\n        bootstrap: undefined,\n        schemas: undefined,\n        id: undefined,\n    }));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var ViewEncapsulation = {};\n    ViewEncapsulation.Emulated = 0;\n    ViewEncapsulation.Native = 1;\n    ViewEncapsulation.None = 2;\n    ViewEncapsulation[ViewEncapsulation.Emulated] = \"Emulated\";\n    ViewEncapsulation[ViewEncapsulation.Native] = \"Native\";\n    ViewEncapsulation[ViewEncapsulation.None] = \"None\";\n    /**\n     * Metadata properties available for configuring Views.\n     *\n     * For details on the `\\@Component` annotation, see {\\@link Component}.\n     *\n     * ### Example\n     *\n     * ```\n     * \\@Component({\n     *   selector: 'greet',\n     *   template: 'Hello {{name}}!',\n     * })\n     * class Greet {\n     *   name: string;\n     *\n     *   constructor() {\n     *     this.name = 'World';\n     *   }\n     * }\n     * ```\n     *\n     * @deprecated Use Component instead.\n     *\n     * {\\@link Component}\n     */\n    var ViewMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function ViewMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, templateUrl = _b.templateUrl, template = _b.template, encapsulation = _b.encapsulation, styles = _b.styles, styleUrls = _b.styleUrls, animations = _b.animations, interpolation = _b.interpolation;\n            this.templateUrl = templateUrl;\n            this.template = template;\n            this.styleUrls = styleUrls;\n            this.styles = styles;\n            this.encapsulation = encapsulation;\n            this.animations = animations;\n            this.interpolation = interpolation;\n        }\n        return ViewMetadata;\n    }());\n\n    /**\n     * \\@whatItDoes Represents the version of Angular\n     *\n     * \\@stable\n     */\n    var Version = (function () {\n        /**\n         * @param {?} full\n         */\n        function Version(full) {\n            this.full = full;\n        }\n        Object.defineProperty(Version.prototype, \"major\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.full.split('.')[0]; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(Version.prototype, \"minor\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.full.split('.')[1]; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(Version.prototype, \"patch\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.full.split('.').slice(2).join('.'); },\n            enumerable: true,\n            configurable: true\n        });\n        return Version;\n    }());\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new Version('2.4.8');\n\n    /**\n     * Allows to refer to references which are not yet defined.\n     *\n     * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of\n     * DI is declared,\n     * but not yet defined. It is also used when the `token` which we use when creating a query is not\n     * yet defined.\n     *\n     * ### Example\n     * {\\@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}\n     * \\@experimental\n     * @param {?} forwardRefFn\n     * @return {?}\n     */\n    function forwardRef(forwardRefFn) {\n        ((forwardRefFn)).__forward_ref__ = forwardRef;\n        ((forwardRefFn)).toString = function () { return stringify(this()); };\n        return (((forwardRefFn)));\n    }\n    /**\n     * Lazily retrieves the reference value from a forwardRef.\n     *\n     * Acts as the identity function when given a non-forward-ref value.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/GU72mJrk1fiodChcmiDR?p=preview))\n     *\n     * {\\@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}\n     *\n     * See: {\\@link forwardRef}\n     * \\@experimental\n     * @param {?} type\n     * @return {?}\n     */\n    function resolveForwardRef(type) {\n        if (typeof type === 'function' && type.hasOwnProperty('__forward_ref__') &&\n            type.__forward_ref__ === forwardRef) {\n            return ((type))();\n        }\n        else {\n            return type;\n        }\n    }\n\n    var /** @type {?} */ _THROW_IF_NOT_FOUND = new Object();\n    var /** @type {?} */ THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;\n    var _NullInjector = (function () {\n        function _NullInjector() {\n        }\n        /**\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        _NullInjector.prototype.get = function (token, notFoundValue) {\n            if (notFoundValue === void 0) { notFoundValue = _THROW_IF_NOT_FOUND; }\n            if (notFoundValue === _THROW_IF_NOT_FOUND) {\n                throw new Error(\"No provider for \" + stringify(token) + \"!\");\n            }\n            return notFoundValue;\n        };\n        return _NullInjector;\n    }());\n    /**\n     * \\@whatItDoes Injector interface\n     * \\@howToUse\n     * ```\n     * const injector: Injector = ...;\n     * injector.get(...);\n     * ```\n     *\n     * \\@description\n     * For more details, see the {\\@linkDocs guide/dependency-injection \"Dependency Injection Guide\"}.\n     *\n     * ### Example\n     *\n     * {\\@example core/di/ts/injector_spec.ts region='Injector'}\n     *\n     * `Injector` returns itself when given `Injector` as a token:\n     * {\\@example core/di/ts/injector_spec.ts region='injectInjector'}\n     *\n     * \\@stable\n     * @abstract\n     */\n    var Injector = (function () {\n        function Injector() {\n        }\n        /**\n         * Retrieves an instance from the injector based on the provided token.\n         * If not found:\n         * - Throws {\\@link NoProviderError} if no `notFoundValue` that is not equal to\n         * Injector.THROW_IF_NOT_FOUND is given\n         * - Returns the `notFoundValue` otherwise\n         * @abstract\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        Injector.prototype.get = function (token, notFoundValue) { };\n        Injector.THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;\n        Injector.NULL = new _NullInjector();\n        return Injector;\n    }());\n\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@stable\n     */\n    var BaseError = (function (_super) {\n        __extends$1(BaseError, _super);\n        /**\n         * @param {?} message\n         */\n        function BaseError(message) {\n            _super.call(this, message);\n            // Errors don't use current this, instead they create a new instance.\n            // We have to do forward all of our api to the nativeInstance.\n            // TODO(bradfordcsmith): Remove this hack when\n            //     google/closure-compiler/issues/2102 is fixed.\n            var nativeError = new Error(message);\n            this._nativeError = nativeError;\n        }\n        Object.defineProperty(BaseError.prototype, \"message\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.message; },\n            /**\n             * @param {?} message\n             * @return {?}\n             */\n            set: function (message) { this._nativeError.message = message; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"name\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.name; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return ((this._nativeError)).stack; },\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) { ((this._nativeError)).stack = value; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n        return BaseError;\n    }(Error));\n    /**\n     * \\@stable\n     */\n    var WrappedError = (function (_super) {\n        __extends$1(WrappedError, _super);\n        /**\n         * @param {?} message\n         * @param {?} error\n         */\n        function WrappedError(message, error) {\n            _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n            this.originalError = error;\n        }\n        Object.defineProperty(WrappedError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n                    .stack;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return WrappedError;\n    }(BaseError));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @param {?} keys\n     * @return {?}\n     */\n    function findFirstClosedCycle(keys) {\n        var /** @type {?} */ res = [];\n        for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n            if (res.indexOf(keys[i]) > -1) {\n                res.push(keys[i]);\n                return res;\n            }\n            res.push(keys[i]);\n        }\n        return res;\n    }\n    /**\n     * @param {?} keys\n     * @return {?}\n     */\n    function constructResolvingPath(keys) {\n        if (keys.length > 1) {\n            var /** @type {?} */ reversed = findFirstClosedCycle(keys.slice().reverse());\n            var /** @type {?} */ tokenStrs = reversed.map(function (k) { return stringify(k.token); });\n            return ' (' + tokenStrs.join(' -> ') + ')';\n        }\n        return '';\n    }\n    /**\n     * Base class for all errors arising from misconfigured providers.\n     * \\@stable\n     */\n    var AbstractProviderError = (function (_super) {\n        __extends(AbstractProviderError, _super);\n        /**\n         * @param {?} injector\n         * @param {?} key\n         * @param {?} constructResolvingMessage\n         */\n        function AbstractProviderError(injector, key, constructResolvingMessage) {\n            _super.call(this, 'DI Error');\n            this.keys = [key];\n            this.injectors = [injector];\n            this.constructResolvingMessage = constructResolvingMessage;\n            this.message = this.constructResolvingMessage(this.keys);\n        }\n        /**\n         * @param {?} injector\n         * @param {?} key\n         * @return {?}\n         */\n        AbstractProviderError.prototype.addKey = function (injector, key) {\n            this.injectors.push(injector);\n            this.keys.push(key);\n            this.message = this.constructResolvingMessage(this.keys);\n        };\n        return AbstractProviderError;\n    }(BaseError));\n    /**\n     * Thrown when trying to retrieve a dependency by key from {\\@link Injector}, but the\n     * {\\@link Injector} does not have a {\\@link Provider} for the given key.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview))\n     *\n     * ```typescript\n     * class A {\n     *   constructor(b:B) {}\n     * }\n     *\n     * expect(() => Injector.resolveAndCreate([A])).toThrowError();\n     * ```\n     * \\@stable\n     */\n    var NoProviderError = (function (_super) {\n        __extends(NoProviderError, _super);\n        /**\n         * @param {?} injector\n         * @param {?} key\n         */\n        function NoProviderError(injector, key) {\n            _super.call(this, injector, key, function (keys) {\n                var first = stringify(keys[0].token);\n                return \"No provider for \" + first + \"!\" + constructResolvingPath(keys);\n            });\n        }\n        return NoProviderError;\n    }(AbstractProviderError));\n    /**\n     * Thrown when dependencies form a cycle.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info))\n     *\n     * ```typescript\n     * var injector = Injector.resolveAndCreate([\n     *   {provide: \"one\", useFactory: (two) => \"two\", deps: [[new Inject(\"two\")]]},\n     *   {provide: \"two\", useFactory: (one) => \"one\", deps: [[new Inject(\"one\")]]}\n     * ]);\n     *\n     * expect(() => injector.get(\"one\")).toThrowError();\n     * ```\n     *\n     * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.\n     * \\@stable\n     */\n    var CyclicDependencyError = (function (_super) {\n        __extends(CyclicDependencyError, _super);\n        /**\n         * @param {?} injector\n         * @param {?} key\n         */\n        function CyclicDependencyError(injector, key) {\n            _super.call(this, injector, key, function (keys) {\n                return \"Cannot instantiate cyclic dependency!\" + constructResolvingPath(keys);\n            });\n        }\n        return CyclicDependencyError;\n    }(AbstractProviderError));\n    /**\n     * Thrown when a constructing type returns with an Error.\n     *\n     * The `InstantiationError` class contains the original error plus the dependency graph which caused\n     * this object to be instantiated.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview))\n     *\n     * ```typescript\n     * class A {\n     *   constructor() {\n     *     throw new Error('message');\n     *   }\n     * }\n     *\n     * var injector = Injector.resolveAndCreate([A]);\n     * try {\n     *   injector.get(A);\n     * } catch (e) {\n     *   expect(e instanceof InstantiationError).toBe(true);\n     *   expect(e.originalException.message).toEqual(\"message\");\n     *   expect(e.originalStack).toBeDefined();\n     * }\n     * ```\n     * \\@stable\n     */\n    var InstantiationError = (function (_super) {\n        __extends(InstantiationError, _super);\n        /**\n         * @param {?} injector\n         * @param {?} originalException\n         * @param {?} originalStack\n         * @param {?} key\n         */\n        function InstantiationError(injector, originalException, originalStack, key) {\n            _super.call(this, 'DI Error', originalException);\n            this.keys = [key];\n            this.injectors = [injector];\n        }\n        /**\n         * @param {?} injector\n         * @param {?} key\n         * @return {?}\n         */\n        InstantiationError.prototype.addKey = function (injector, key) {\n            this.injectors.push(injector);\n            this.keys.push(key);\n        };\n        Object.defineProperty(InstantiationError.prototype, \"message\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ first = stringify(this.keys[0].token);\n                return this.originalError.message + \": Error during instantiation of \" + first + \"!\" + constructResolvingPath(this.keys) + \".\";\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(InstantiationError.prototype, \"causeKey\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.keys[0]; },\n            enumerable: true,\n            configurable: true\n        });\n        return InstantiationError;\n    }(WrappedError));\n    /**\n     * Thrown when an object other then {\\@link Provider} (or `Type`) is passed to {\\@link Injector}\n     * creation.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview))\n     *\n     * ```typescript\n     * expect(() => Injector.resolveAndCreate([\"not a type\"])).toThrowError();\n     * ```\n     * \\@stable\n     */\n    var InvalidProviderError = (function (_super) {\n        __extends(InvalidProviderError, _super);\n        /**\n         * @param {?} provider\n         */\n        function InvalidProviderError(provider) {\n            _super.call(this, \"Invalid provider - only instances of Provider and Type are allowed, got: \" + provider);\n        }\n        return InvalidProviderError;\n    }(BaseError));\n    /**\n     * Thrown when the class has no annotation information.\n     *\n     * Lack of annotation information prevents the {\\@link Injector} from determining which dependencies\n     * need to be injected into the constructor.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview))\n     *\n     * ```typescript\n     * class A {\n     *   constructor(b) {}\n     * }\n     *\n     * expect(() => Injector.resolveAndCreate([A])).toThrowError();\n     * ```\n     *\n     * This error is also thrown when the class not marked with {\\@link Injectable} has parameter types.\n     *\n     * ```typescript\n     * class B {}\n     *\n     * class A {\n     *   constructor(b:B) {} // no information about the parameter types of A is available at runtime.\n     * }\n     *\n     * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();\n     * ```\n     * \\@stable\n     */\n    var NoAnnotationError = (function (_super) {\n        __extends(NoAnnotationError, _super);\n        /**\n         * @param {?} typeOrFunc\n         * @param {?} params\n         */\n        function NoAnnotationError(typeOrFunc, params) {\n            _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params));\n        }\n        /**\n         * @param {?} typeOrFunc\n         * @param {?} params\n         * @return {?}\n         */\n        NoAnnotationError._genMessage = function (typeOrFunc, params) {\n            var /** @type {?} */ signature = [];\n            for (var /** @type {?} */ i = 0, /** @type {?} */ ii = params.length; i < ii; i++) {\n                var /** @type {?} */ parameter = params[i];\n                if (!parameter || parameter.length == 0) {\n                    signature.push('?');\n                }\n                else {\n                    signature.push(parameter.map(stringify).join(' '));\n                }\n            }\n            return 'Cannot resolve all parameters for \\'' + stringify(typeOrFunc) + '\\'(' +\n                signature.join(', ') + '). ' +\n                'Make sure that all the parameters are decorated with Inject or have valid type annotations and that \\'' +\n                stringify(typeOrFunc) + '\\' is decorated with Injectable.';\n        };\n        return NoAnnotationError;\n    }(BaseError));\n    /**\n     * Thrown when getting an object by index.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview))\n     *\n     * ```typescript\n     * class A {}\n     *\n     * var injector = Injector.resolveAndCreate([A]);\n     *\n     * expect(() => injector.getAt(100)).toThrowError();\n     * ```\n     * \\@stable\n     */\n    var OutOfBoundsError = (function (_super) {\n        __extends(OutOfBoundsError, _super);\n        /**\n         * @param {?} index\n         */\n        function OutOfBoundsError(index) {\n            _super.call(this, \"Index \" + index + \" is out-of-bounds.\");\n        }\n        return OutOfBoundsError;\n    }(BaseError));\n    /**\n     * Thrown when a multi provider and a regular provider are bound to the same token.\n     *\n     * ### Example\n     *\n     * ```typescript\n     * expect(() => Injector.resolveAndCreate([\n     *   { provide: \"Strings\", useValue: \"string1\", multi: true},\n     *   { provide: \"Strings\", useValue: \"string2\", multi: false}\n     * ])).toThrowError();\n     * ```\n     */\n    var MixingMultiProvidersWithRegularProvidersError = (function (_super) {\n        __extends(MixingMultiProvidersWithRegularProvidersError, _super);\n        /**\n         * @param {?} provider1\n         * @param {?} provider2\n         */\n        function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) {\n            _super.call(this, 'Cannot mix multi providers and regular providers, got: ' + provider1.toString() + ' ' +\n                provider2.toString());\n        }\n        return MixingMultiProvidersWithRegularProvidersError;\n    }(BaseError));\n\n    /**\n     * A unique object used for retrieving items from the {\\@link ReflectiveInjector}.\n     *\n     * Keys have:\n     * - a system-wide unique `id`.\n     * - a `token`.\n     *\n     * `Key` is used internally by {\\@link ReflectiveInjector} because its system-wide unique `id` allows\n     * the\n     * injector to store created objects in a more efficient way.\n     *\n     * `Key` should not be created directly. {\\@link ReflectiveInjector} creates keys automatically when\n     * resolving\n     * providers.\n     * \\@experimental\n     */\n    var ReflectiveKey = (function () {\n        /**\n         * Private\n         * @param {?} token\n         * @param {?} id\n         */\n        function ReflectiveKey(token, id) {\n            this.token = token;\n            this.id = id;\n            if (!token) {\n                throw new Error('Token must be defined!');\n            }\n        }\n        Object.defineProperty(ReflectiveKey.prototype, \"displayName\", {\n            /**\n             * Returns a stringified token.\n             * @return {?}\n             */\n            get: function () { return stringify(this.token); },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * Retrieves a `Key` for a token.\n         * @param {?} token\n         * @return {?}\n         */\n        ReflectiveKey.get = function (token) {\n            return _globalKeyRegistry.get(resolveForwardRef(token));\n        };\n        Object.defineProperty(ReflectiveKey, \"numberOfKeys\", {\n            /**\n             * @return {?} the number of keys registered in the system.\n             */\n            get: function () { return _globalKeyRegistry.numberOfKeys; },\n            enumerable: true,\n            configurable: true\n        });\n        return ReflectiveKey;\n    }());\n    /**\n     * \\@internal\n     */\n    var KeyRegistry = (function () {\n        function KeyRegistry() {\n            this._allKeys = new Map();\n        }\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        KeyRegistry.prototype.get = function (token) {\n            if (token instanceof ReflectiveKey)\n                return token;\n            if (this._allKeys.has(token)) {\n                return this._allKeys.get(token);\n            }\n            var /** @type {?} */ newKey = new ReflectiveKey(token, ReflectiveKey.numberOfKeys);\n            this._allKeys.set(token, newKey);\n            return newKey;\n        };\n        Object.defineProperty(KeyRegistry.prototype, \"numberOfKeys\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._allKeys.size; },\n            enumerable: true,\n            configurable: true\n        });\n        return KeyRegistry;\n    }());\n    var /** @type {?} */ _globalKeyRegistry = new KeyRegistry();\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * @whatItDoes Represents a type that a Component or other object is instances of.\n     *\n     * @description\n     *\n     * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is be represented by\n     * the `MyCustomComponent` constructor function.\n     *\n     * @stable\n     */\n    var /** @type {?} */ Type = Function;\n    /**\n     * @param {?} v\n     * @return {?}\n     */\n    function isType(v) {\n        return typeof v === 'function';\n    }\n\n    /**\n     * Attention: This regex has to hold even if the code is minified!\n     */\n    var /** @type {?} */ DELEGATE_CTOR = /^function\\s+\\S+\\(\\)\\s*{\\s*(\"use strict\";)?\\s*(return\\s+)?\\S+\\.apply\\(this,\\s*arguments\\)/;\n    var ReflectionCapabilities = (function () {\n        /**\n         * @param {?=} reflect\n         */\n        function ReflectionCapabilities(reflect) {\n            this._reflect = reflect || global$1.Reflect;\n        }\n        /**\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };\n        /**\n         * @param {?} t\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.factory = function (t) { return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            return new (t.bind.apply(t, [void 0].concat(args)))();\n        }; };\n        /**\n         * \\@internal\n         * @param {?} paramTypes\n         * @param {?} paramAnnotations\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype._zipTypesAndAnnotations = function (paramTypes, paramAnnotations) {\n            var /** @type {?} */ result;\n            if (typeof paramTypes === 'undefined') {\n                result = new Array(paramAnnotations.length);\n            }\n            else {\n                result = new Array(paramTypes.length);\n            }\n            for (var /** @type {?} */ i = 0; i < result.length; i++) {\n                // TS outputs Object for parameters without types, while Traceur omits\n                // the annotations. For now we preserve the Traceur behavior to aid\n                // migration, but this can be revisited.\n                if (typeof paramTypes === 'undefined') {\n                    result[i] = [];\n                }\n                else if (paramTypes[i] != Object) {\n                    result[i] = [paramTypes[i]];\n                }\n                else {\n                    result[i] = [];\n                }\n                if (paramAnnotations && isPresent(paramAnnotations[i])) {\n                    result[i] = result[i].concat(paramAnnotations[i]);\n                }\n            }\n            return result;\n        };\n        /**\n         * @param {?} type\n         * @param {?} parentCtor\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype._ownParameters = function (type, parentCtor) {\n            // If we have no decorators, we only have function.length as metadata.\n            // In that case, to detect whether a child class declared an own constructor or not,\n            // we need to look inside of that constructor to check whether it is\n            // just calling the parent.\n            // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439\n            // that sets 'design:paramtypes' to []\n            // if a class inherits from another class but has no ctor declared itself.\n            if (DELEGATE_CTOR.exec(type.toString())) {\n                return null;\n            }\n            // Prefer the direct API.\n            if (((type)).parameters && ((type)).parameters !== parentCtor.parameters) {\n                return ((type)).parameters;\n            }\n            // API of tsickle for lowering decorators to properties on the class.\n            var /** @type {?} */ tsickleCtorParams = ((type)).ctorParameters;\n            if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {\n                // Newer tsickle uses a function closure\n                // Retain the non-function case for compatibility with older tsickle\n                var /** @type {?} */ ctorParameters = typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;\n                var /** @type {?} */ paramTypes = ctorParameters.map(function (ctorParam) { return ctorParam && ctorParam.type; });\n                var /** @type {?} */ paramAnnotations = ctorParameters.map(function (ctorParam) {\n                    return ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators);\n                });\n                return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n            }\n            // API for metadata created by invoking the decorators.\n            if (isPresent(this._reflect) && isPresent(this._reflect.getOwnMetadata)) {\n                var /** @type {?} */ paramAnnotations = this._reflect.getOwnMetadata('parameters', type);\n                var /** @type {?} */ paramTypes = this._reflect.getOwnMetadata('design:paramtypes', type);\n                if (paramTypes || paramAnnotations) {\n                    return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n                }\n            }\n            // If a class has no decorators, at least create metadata\n            // based on function.length.\n            // Note: We know that this is a real constructor as we checked\n            // the content of the constructor above.\n            return new Array(((type.length))).fill(undefined);\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.parameters = function (type) {\n            // Note: only report metadata if we have at least one class decorator\n            // to stay in sync with the static reflector.\n            if (!isType(type)) {\n                return [];\n            }\n            var /** @type {?} */ parentCtor = getParentCtor(type);\n            var /** @type {?} */ parameters = this._ownParameters(type, parentCtor);\n            if (!parameters && parentCtor !== Object) {\n                parameters = this.parameters(parentCtor);\n            }\n            return parameters || [];\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @param {?} parentCtor\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype._ownAnnotations = function (typeOrFunc, parentCtor) {\n            // Prefer the direct API.\n            if (((typeOrFunc)).annotations && ((typeOrFunc)).annotations !== parentCtor.annotations) {\n                var /** @type {?} */ annotations = ((typeOrFunc)).annotations;\n                if (typeof annotations === 'function' && annotations.annotations) {\n                    annotations = annotations.annotations;\n                }\n                return annotations;\n            }\n            // API of tsickle for lowering decorators to properties on the class.\n            if (((typeOrFunc)).decorators && ((typeOrFunc)).decorators !== parentCtor.decorators) {\n                return convertTsickleDecoratorIntoMetadata(((typeOrFunc)).decorators);\n            }\n            // API for metadata created by invoking the decorators.\n            if (this._reflect && this._reflect.getOwnMetadata) {\n                return this._reflect.getOwnMetadata('annotations', typeOrFunc);\n            }\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {\n            if (!isType(typeOrFunc)) {\n                return [];\n            }\n            var /** @type {?} */ parentCtor = getParentCtor(typeOrFunc);\n            var /** @type {?} */ ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];\n            var /** @type {?} */ parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];\n            return parentAnnotations.concat(ownAnnotations);\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @param {?} parentCtor\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype._ownPropMetadata = function (typeOrFunc, parentCtor) {\n            // Prefer the direct API.\n            if (((typeOrFunc)).propMetadata &&\n                ((typeOrFunc)).propMetadata !== parentCtor.propMetadata) {\n                var /** @type {?} */ propMetadata = ((typeOrFunc)).propMetadata;\n                if (typeof propMetadata === 'function' && propMetadata.propMetadata) {\n                    propMetadata = propMetadata.propMetadata;\n                }\n                return propMetadata;\n            }\n            // API of tsickle for lowering decorators to properties on the class.\n            if (((typeOrFunc)).propDecorators &&\n                ((typeOrFunc)).propDecorators !== parentCtor.propDecorators) {\n                var /** @type {?} */ propDecorators_1 = ((typeOrFunc)).propDecorators;\n                var /** @type {?} */ propMetadata_1 = ({});\n                Object.keys(propDecorators_1).forEach(function (prop) {\n                    propMetadata_1[prop] = convertTsickleDecoratorIntoMetadata(propDecorators_1[prop]);\n                });\n                return propMetadata_1;\n            }\n            // API for metadata created by invoking the decorators.\n            if (this._reflect && this._reflect.getOwnMetadata) {\n                return this._reflect.getOwnMetadata('propMetadata', typeOrFunc);\n            }\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {\n            if (!isType(typeOrFunc)) {\n                return {};\n            }\n            var /** @type {?} */ parentCtor = getParentCtor(typeOrFunc);\n            var /** @type {?} */ propMetadata = {};\n            if (parentCtor !== Object) {\n                var /** @type {?} */ parentPropMetadata_1 = this.propMetadata(parentCtor);\n                Object.keys(parentPropMetadata_1).forEach(function (propName) {\n                    propMetadata[propName] = parentPropMetadata_1[propName];\n                });\n            }\n            var /** @type {?} */ ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);\n            if (ownPropMetadata) {\n                Object.keys(ownPropMetadata).forEach(function (propName) {\n                    var /** @type {?} */ decorators = [];\n                    if (propMetadata.hasOwnProperty(propName)) {\n                        decorators.push.apply(decorators, propMetadata[propName]);\n                    }\n                    decorators.push.apply(decorators, ownPropMetadata[propName]);\n                    propMetadata[propName] = decorators;\n                });\n            }\n            return propMetadata;\n        };\n        /**\n         * @param {?} type\n         * @param {?} lcProperty\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.hasLifecycleHook = function (type, lcProperty) {\n            return type instanceof Type && lcProperty in type.prototype;\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.getter = function (name) { return ((new Function('o', 'return o.' + name + ';'))); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.setter = function (name) {\n            return ((new Function('o', 'v', 'return o.' + name + ' = v;')));\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.method = function (name) {\n            var /** @type {?} */ functionBody = \"if (!o.\" + name + \") throw new Error('\\\"\" + name + \"\\\" is undefined');\\n        return o.\" + name + \".apply(o, args);\";\n            return ((new Function('o', 'args', functionBody)));\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.importUri = function (type) {\n            // StaticSymbol\n            if (typeof type === 'object' && type['filePath']) {\n                return type['filePath'];\n            }\n            // Runtime type\n            return \"./\" + stringify(type);\n        };\n        /**\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @param {?} runtime\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.resolveIdentifier = function (name, moduleUrl, runtime) { return runtime; };\n        /**\n         * @param {?} enumIdentifier\n         * @param {?} name\n         * @return {?}\n         */\n        ReflectionCapabilities.prototype.resolveEnum = function (enumIdentifier, name) { return enumIdentifier[name]; };\n        return ReflectionCapabilities;\n    }());\n    /**\n     * @param {?} decoratorInvocations\n     * @return {?}\n     */\n    function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {\n        if (!decoratorInvocations) {\n            return [];\n        }\n        return decoratorInvocations.map(function (decoratorInvocation) {\n            var /** @type {?} */ decoratorType = decoratorInvocation.type;\n            var /** @type {?} */ annotationCls = decoratorType.annotationCls;\n            var /** @type {?} */ annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];\n            return new (annotationCls.bind.apply(annotationCls, [void 0].concat(annotationArgs)))();\n        });\n    }\n    /**\n     * @param {?} ctor\n     * @return {?}\n     */\n    function getParentCtor(ctor) {\n        var /** @type {?} */ parentProto = Object.getPrototypeOf(ctor.prototype);\n        var /** @type {?} */ parentCtor = parentProto ? parentProto.constructor : null;\n        // Note: We always use `Object` as the null value\n        // to simplify checking later on.\n        return parentCtor || Object;\n    }\n\n    /**\n     * Provides read-only access to reflection data about symbols. Used internally by Angular\n     * to power dependency injection and compilation.\n     * @abstract\n     */\n    var ReflectorReader = (function () {\n        function ReflectorReader() {\n        }\n        /**\n         * @abstract\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectorReader.prototype.parameters = function (typeOrFunc) { };\n        /**\n         * @abstract\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectorReader.prototype.annotations = function (typeOrFunc) { };\n        /**\n         * @abstract\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectorReader.prototype.propMetadata = function (typeOrFunc) { };\n        /**\n         * @abstract\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        ReflectorReader.prototype.importUri = function (typeOrFunc) { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @param {?} runtime\n         * @return {?}\n         */\n        ReflectorReader.prototype.resolveIdentifier = function (name, moduleUrl, runtime) { };\n        /**\n         * @abstract\n         * @param {?} identifier\n         * @param {?} name\n         * @return {?}\n         */\n        ReflectorReader.prototype.resolveEnum = function (identifier, name) { };\n        return ReflectorReader;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$2 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Provides access to reflection data about symbols. Used internally by Angular\n     * to power dependency injection and compilation.\n     */\n    var Reflector = (function (_super) {\n        __extends$2(Reflector, _super);\n        /**\n         * @param {?} reflectionCapabilities\n         */\n        function Reflector(reflectionCapabilities) {\n            _super.call(this);\n            this.reflectionCapabilities = reflectionCapabilities;\n        }\n        /**\n         * @param {?} caps\n         * @return {?}\n         */\n        Reflector.prototype.updateCapabilities = function (caps) { this.reflectionCapabilities = caps; };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        Reflector.prototype.factory = function (type) { return this.reflectionCapabilities.factory(type); };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        Reflector.prototype.parameters = function (typeOrFunc) {\n            return this.reflectionCapabilities.parameters(typeOrFunc);\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        Reflector.prototype.annotations = function (typeOrFunc) {\n            return this.reflectionCapabilities.annotations(typeOrFunc);\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        Reflector.prototype.propMetadata = function (typeOrFunc) {\n            return this.reflectionCapabilities.propMetadata(typeOrFunc);\n        };\n        /**\n         * @param {?} type\n         * @param {?} lcProperty\n         * @return {?}\n         */\n        Reflector.prototype.hasLifecycleHook = function (type, lcProperty) {\n            return this.reflectionCapabilities.hasLifecycleHook(type, lcProperty);\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        Reflector.prototype.getter = function (name) { return this.reflectionCapabilities.getter(name); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        Reflector.prototype.setter = function (name) { return this.reflectionCapabilities.setter(name); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        Reflector.prototype.method = function (name) { return this.reflectionCapabilities.method(name); };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };\n        /**\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @param {?} runtime\n         * @return {?}\n         */\n        Reflector.prototype.resolveIdentifier = function (name, moduleUrl, runtime) {\n            return this.reflectionCapabilities.resolveIdentifier(name, moduleUrl, runtime);\n        };\n        /**\n         * @param {?} identifier\n         * @param {?} name\n         * @return {?}\n         */\n        Reflector.prototype.resolveEnum = function (identifier, name) {\n            return this.reflectionCapabilities.resolveEnum(identifier, name);\n        };\n        return Reflector;\n    }(ReflectorReader));\n\n    /**\n     * The {@link Reflector} used internally in Angular to access metadata\n     * about symbols.\n     */\n    var /** @type {?} */ reflector = new Reflector(new ReflectionCapabilities());\n\n    /**\n     * `Dependency` is used by the framework to extend DI.\n     * This is internal to Angular and should not be used directly.\n     */\n    var ReflectiveDependency = (function () {\n        /**\n         * @param {?} key\n         * @param {?} optional\n         * @param {?} visibility\n         */\n        function ReflectiveDependency(key, optional, visibility) {\n            this.key = key;\n            this.optional = optional;\n            this.visibility = visibility;\n        }\n        /**\n         * @param {?} key\n         * @return {?}\n         */\n        ReflectiveDependency.fromKey = function (key) {\n            return new ReflectiveDependency(key, false, null);\n        };\n        return ReflectiveDependency;\n    }());\n    var /** @type {?} */ _EMPTY_LIST = [];\n    var ResolvedReflectiveProvider_ = (function () {\n        /**\n         * @param {?} key\n         * @param {?} resolvedFactories\n         * @param {?} multiProvider\n         */\n        function ResolvedReflectiveProvider_(key, resolvedFactories, multiProvider) {\n            this.key = key;\n            this.resolvedFactories = resolvedFactories;\n            this.multiProvider = multiProvider;\n        }\n        Object.defineProperty(ResolvedReflectiveProvider_.prototype, \"resolvedFactory\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.resolvedFactories[0]; },\n            enumerable: true,\n            configurable: true\n        });\n        return ResolvedReflectiveProvider_;\n    }());\n    /**\n     * An internal resolved representation of a factory function created by resolving {\\@link\n     * Provider}.\n     * \\@experimental\n     */\n    var ResolvedReflectiveFactory = (function () {\n        /**\n         * @param {?} factory\n         * @param {?} dependencies\n         */\n        function ResolvedReflectiveFactory(factory, dependencies) {\n            this.factory = factory;\n            this.dependencies = dependencies;\n        }\n        return ResolvedReflectiveFactory;\n    }());\n    /**\n     * Resolve a single provider.\n     * @param {?} provider\n     * @return {?}\n     */\n    function resolveReflectiveFactory(provider) {\n        var /** @type {?} */ factoryFn;\n        var /** @type {?} */ resolvedDeps;\n        if (provider.useClass) {\n            var /** @type {?} */ useClass = resolveForwardRef(provider.useClass);\n            factoryFn = reflector.factory(useClass);\n            resolvedDeps = _dependenciesFor(useClass);\n        }\n        else if (provider.useExisting) {\n            factoryFn = function (aliasInstance) { return aliasInstance; };\n            resolvedDeps = [ReflectiveDependency.fromKey(ReflectiveKey.get(provider.useExisting))];\n        }\n        else if (provider.useFactory) {\n            factoryFn = provider.useFactory;\n            resolvedDeps = constructDependencies(provider.useFactory, provider.deps);\n        }\n        else {\n            factoryFn = function () { return provider.useValue; };\n            resolvedDeps = _EMPTY_LIST;\n        }\n        return new ResolvedReflectiveFactory(factoryFn, resolvedDeps);\n    }\n    /**\n     * Converts the {\\@link Provider} into {\\@link ResolvedProvider}.\n     *\n     * {\\@link Injector} internally only uses {\\@link ResolvedProvider}, {\\@link Provider} contains\n     * convenience provider syntax.\n     * @param {?} provider\n     * @return {?}\n     */\n    function resolveReflectiveProvider(provider) {\n        return new ResolvedReflectiveProvider_(ReflectiveKey.get(provider.provide), [resolveReflectiveFactory(provider)], provider.multi);\n    }\n    /**\n     * Resolve a list of Providers.\n     * @param {?} providers\n     * @return {?}\n     */\n    function resolveReflectiveProviders(providers) {\n        var /** @type {?} */ normalized = _normalizeProviders(providers, []);\n        var /** @type {?} */ resolved = normalized.map(resolveReflectiveProvider);\n        var /** @type {?} */ resolvedProviderMap = mergeResolvedReflectiveProviders(resolved, new Map());\n        return Array.from(resolvedProviderMap.values());\n    }\n    /**\n     * Merges a list of ResolvedProviders into a list where\n     * each key is contained exactly once and multi providers\n     * have been merged.\n     * @param {?} providers\n     * @param {?} normalizedProvidersMap\n     * @return {?}\n     */\n    function mergeResolvedReflectiveProviders(providers, normalizedProvidersMap) {\n        for (var /** @type {?} */ i = 0; i < providers.length; i++) {\n            var /** @type {?} */ provider = providers[i];\n            var /** @type {?} */ existing = normalizedProvidersMap.get(provider.key.id);\n            if (existing) {\n                if (provider.multiProvider !== existing.multiProvider) {\n                    throw new MixingMultiProvidersWithRegularProvidersError(existing, provider);\n                }\n                if (provider.multiProvider) {\n                    for (var /** @type {?} */ j = 0; j < provider.resolvedFactories.length; j++) {\n                        existing.resolvedFactories.push(provider.resolvedFactories[j]);\n                    }\n                }\n                else {\n                    normalizedProvidersMap.set(provider.key.id, provider);\n                }\n            }\n            else {\n                var /** @type {?} */ resolvedProvider = void 0;\n                if (provider.multiProvider) {\n                    resolvedProvider = new ResolvedReflectiveProvider_(provider.key, provider.resolvedFactories.slice(), provider.multiProvider);\n                }\n                else {\n                    resolvedProvider = provider;\n                }\n                normalizedProvidersMap.set(provider.key.id, resolvedProvider);\n            }\n        }\n        return normalizedProvidersMap;\n    }\n    /**\n     * @param {?} providers\n     * @param {?} res\n     * @return {?}\n     */\n    function _normalizeProviders(providers, res) {\n        providers.forEach(function (b) {\n            if (b instanceof Type) {\n                res.push({ provide: b, useClass: b });\n            }\n            else if (b && typeof b == 'object' && ((b)).provide !== undefined) {\n                res.push(/** @type {?} */ (b));\n            }\n            else if (b instanceof Array) {\n                _normalizeProviders(b, res);\n            }\n            else {\n                throw new InvalidProviderError(b);\n            }\n        });\n        return res;\n    }\n    /**\n     * @param {?} typeOrFunc\n     * @param {?} dependencies\n     * @return {?}\n     */\n    function constructDependencies(typeOrFunc, dependencies) {\n        if (!dependencies) {\n            return _dependenciesFor(typeOrFunc);\n        }\n        else {\n            var /** @type {?} */ params_1 = dependencies.map(function (t) { return [t]; });\n            return dependencies.map(function (t) { return _extractToken(typeOrFunc, t, params_1); });\n        }\n    }\n    /**\n     * @param {?} typeOrFunc\n     * @return {?}\n     */\n    function _dependenciesFor(typeOrFunc) {\n        var /** @type {?} */ params = reflector.parameters(typeOrFunc);\n        if (!params)\n            return [];\n        if (params.some(function (p) { return p == null; })) {\n            throw new NoAnnotationError(typeOrFunc, params);\n        }\n        return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });\n    }\n    /**\n     * @param {?} typeOrFunc\n     * @param {?} metadata\n     * @param {?} params\n     * @return {?}\n     */\n    function _extractToken(typeOrFunc, metadata, params) {\n        var /** @type {?} */ token = null;\n        var /** @type {?} */ optional = false;\n        if (!Array.isArray(metadata)) {\n            if (metadata instanceof Inject) {\n                return _createDependency(metadata.token, optional, null);\n            }\n            else {\n                return _createDependency(metadata, optional, null);\n            }\n        }\n        var /** @type {?} */ visibility = null;\n        for (var /** @type {?} */ i = 0; i < metadata.length; ++i) {\n            var /** @type {?} */ paramMetadata = metadata[i];\n            if (paramMetadata instanceof Type) {\n                token = paramMetadata;\n            }\n            else if (paramMetadata instanceof Inject) {\n                token = paramMetadata.token;\n            }\n            else if (paramMetadata instanceof Optional) {\n                optional = true;\n            }\n            else if (paramMetadata instanceof Self || paramMetadata instanceof SkipSelf) {\n                visibility = paramMetadata;\n            }\n        }\n        token = resolveForwardRef(token);\n        if (token != null) {\n            return _createDependency(token, optional, visibility);\n        }\n        else {\n            throw new NoAnnotationError(typeOrFunc, params);\n        }\n    }\n    /**\n     * @param {?} token\n     * @param {?} optional\n     * @param {?} visibility\n     * @return {?}\n     */\n    function _createDependency(token, optional, visibility) {\n        return new ReflectiveDependency(ReflectiveKey.get(token), optional, visibility);\n    }\n\n    // Threshold for the dynamic version\n    var /** @type {?} */ UNDEFINED = new Object();\n    /**\n     * A ReflectiveDependency injection container used for instantiating objects and resolving\n     * dependencies.\n     *\n     * An `Injector` is a replacement for a `new` operator, which can automatically resolve the\n     * constructor dependencies.\n     *\n     * In typical use, application code asks for the dependencies in the constructor and they are\n     * resolved by the `Injector`.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))\n     *\n     * The following example creates an `Injector` configured to create `Engine` and `Car`.\n     *\n     * ```typescript\n     * \\@Injectable()\n     * class Engine {\n     * }\n     *\n     * \\@Injectable()\n     * class Car {\n     *   constructor(public engine:Engine) {}\n     * }\n     *\n     * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);\n     * var car = injector.get(Car);\n     * expect(car instanceof Car).toBe(true);\n     * expect(car.engine instanceof Engine).toBe(true);\n     * ```\n     *\n     * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`\n     * resolve all of the object's dependencies automatically.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var ReflectiveInjector = (function () {\n        function ReflectiveInjector() {\n        }\n        /**\n         * Turns an array of provider definitions into an array of resolved providers.\n         *\n         * A resolution is a process of flattening multiple nested arrays and converting individual\n         * providers into an array of {\\@link ResolvedReflectiveProvider}s.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))\n         *\n         * ```typescript\n         * \\@Injectable()\n         * class Engine {\n         * }\n         *\n         * \\@Injectable()\n         * class Car {\n         *   constructor(public engine:Engine) {}\n         * }\n         *\n         * var providers = ReflectiveInjector.resolve([Car, [[Engine]]]);\n         *\n         * expect(providers.length).toEqual(2);\n         *\n         * expect(providers[0] instanceof ResolvedReflectiveProvider).toBe(true);\n         * expect(providers[0].key.displayName).toBe(\"Car\");\n         * expect(providers[0].dependencies.length).toEqual(1);\n         * expect(providers[0].factory).toBeDefined();\n         *\n         * expect(providers[1].key.displayName).toBe(\"Engine\");\n         * });\n         * ```\n         *\n         * See {\\@link ReflectiveInjector#fromResolvedProviders} for more info.\n         * @param {?} providers\n         * @return {?}\n         */\n        ReflectiveInjector.resolve = function (providers) {\n            return resolveReflectiveProviders(providers);\n        };\n        /**\n         * Resolves an array of providers and creates an injector from those providers.\n         *\n         * The passed-in providers can be an array of `Type`, {\\@link Provider},\n         * or a recursive array of more providers.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))\n         *\n         * ```typescript\n         * \\@Injectable()\n         * class Engine {\n         * }\n         *\n         * \\@Injectable()\n         * class Car {\n         *   constructor(public engine:Engine) {}\n         * }\n         *\n         * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);\n         * expect(injector.get(Car) instanceof Car).toBe(true);\n         * ```\n         *\n         * This function is slower than the corresponding `fromResolvedProviders`\n         * because it needs to resolve the passed-in providers first.\n         * See {\\@link Injector#resolve} and {\\@link Injector#fromResolvedProviders}.\n         * @param {?} providers\n         * @param {?=} parent\n         * @return {?}\n         */\n        ReflectiveInjector.resolveAndCreate = function (providers, parent) {\n            if (parent === void 0) { parent = null; }\n            var /** @type {?} */ ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);\n            return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders, parent);\n        };\n        /**\n         * Creates an injector from previously resolved providers.\n         *\n         * This API is the recommended way to construct injectors in performance-sensitive parts.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))\n         *\n         * ```typescript\n         * \\@Injectable()\n         * class Engine {\n         * }\n         *\n         * \\@Injectable()\n         * class Car {\n         *   constructor(public engine:Engine) {}\n         * }\n         *\n         * var providers = ReflectiveInjector.resolve([Car, Engine]);\n         * var injector = ReflectiveInjector.fromResolvedProviders(providers);\n         * expect(injector.get(Car) instanceof Car).toBe(true);\n         * ```\n         * \\@experimental\n         * @param {?} providers\n         * @param {?=} parent\n         * @return {?}\n         */\n        ReflectiveInjector.fromResolvedProviders = function (providers, parent) {\n            if (parent === void 0) { parent = null; }\n            return new ReflectiveInjector_(providers, parent);\n        };\n        /**\n         * Parent of this injector.\n         *\n         * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n         * -->\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))\n         *\n         * ```typescript\n         * var parent = ReflectiveInjector.resolveAndCreate([]);\n         * var child = parent.resolveAndCreateChild([]);\n         * expect(child.parent).toBe(parent);\n         * ```\n         * @abstract\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.parent = function () { };\n        /**\n         * Resolves an array of providers and creates a child injector from those providers.\n         *\n         * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n         * -->\n         *\n         * The passed-in providers can be an array of `Type`, {\\@link Provider},\n         * or a recursive array of more providers.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))\n         *\n         * ```typescript\n         * class ParentProvider {}\n         * class ChildProvider {}\n         *\n         * var parent = ReflectiveInjector.resolveAndCreate([ParentProvider]);\n         * var child = parent.resolveAndCreateChild([ChildProvider]);\n         *\n         * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);\n         * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);\n         * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));\n         * ```\n         *\n         * This function is slower than the corresponding `createChildFromResolved`\n         * because it needs to resolve the passed-in providers first.\n         * See {\\@link Injector#resolve} and {\\@link Injector#createChildFromResolved}.\n         * @abstract\n         * @param {?} providers\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.resolveAndCreateChild = function (providers) { };\n        /**\n         * Creates a child injector from previously resolved providers.\n         *\n         * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n         * -->\n         *\n         * This API is the recommended way to construct injectors in performance-sensitive parts.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))\n         *\n         * ```typescript\n         * class ParentProvider {}\n         * class ChildProvider {}\n         *\n         * var parentProviders = ReflectiveInjector.resolve([ParentProvider]);\n         * var childProviders = ReflectiveInjector.resolve([ChildProvider]);\n         *\n         * var parent = ReflectiveInjector.fromResolvedProviders(parentProviders);\n         * var child = parent.createChildFromResolved(childProviders);\n         *\n         * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);\n         * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);\n         * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));\n         * ```\n         * @abstract\n         * @param {?} providers\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.createChildFromResolved = function (providers) { };\n        /**\n         * Resolves a provider and instantiates an object in the context of the injector.\n         *\n         * The created object does not get cached by the injector.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))\n         *\n         * ```typescript\n         * \\@Injectable()\n         * class Engine {\n         * }\n         *\n         * \\@Injectable()\n         * class Car {\n         *   constructor(public engine:Engine) {}\n         * }\n         *\n         * var injector = ReflectiveInjector.resolveAndCreate([Engine]);\n         *\n         * var car = injector.resolveAndInstantiate(Car);\n         * expect(car.engine).toBe(injector.get(Engine));\n         * expect(car).not.toBe(injector.resolveAndInstantiate(Car));\n         * ```\n         * @abstract\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.resolveAndInstantiate = function (provider) { };\n        /**\n         * Instantiates an object using a resolved provider in the context of the injector.\n         *\n         * The created object does not get cached by the injector.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))\n         *\n         * ```typescript\n         * \\@Injectable()\n         * class Engine {\n         * }\n         *\n         * \\@Injectable()\n         * class Car {\n         *   constructor(public engine:Engine) {}\n         * }\n         *\n         * var injector = ReflectiveInjector.resolveAndCreate([Engine]);\n         * var carProvider = ReflectiveInjector.resolve([Car])[0];\n         * var car = injector.instantiateResolved(carProvider);\n         * expect(car.engine).toBe(injector.get(Engine));\n         * expect(car).not.toBe(injector.instantiateResolved(carProvider));\n         * ```\n         * @abstract\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.instantiateResolved = function (provider) { };\n        /**\n         * @abstract\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        ReflectiveInjector.prototype.get = function (token, notFoundValue) { };\n        return ReflectiveInjector;\n    }());\n    var ReflectiveInjector_ = (function () {\n        /**\n         * Private\n         * @param {?} _providers\n         * @param {?=} _parent\n         */\n        function ReflectiveInjector_(_providers, _parent) {\n            if (_parent === void 0) { _parent = null; }\n            /** @internal */\n            this._constructionCounter = 0;\n            this._providers = _providers;\n            this._parent = _parent;\n            var len = _providers.length;\n            this.keyIds = new Array(len);\n            this.objs = new Array(len);\n            for (var i = 0; i < len; i++) {\n                this.keyIds[i] = _providers[i].key.id;\n                this.objs[i] = UNDEFINED;\n            }\n        }\n        /**\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.get = function (token, notFoundValue) {\n            if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n            return this._getByKey(ReflectiveKey.get(token), null, notFoundValue);\n        };\n        Object.defineProperty(ReflectiveInjector_.prototype, \"parent\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._parent; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} providers\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.resolveAndCreateChild = function (providers) {\n            var /** @type {?} */ ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);\n            return this.createChildFromResolved(ResolvedReflectiveProviders);\n        };\n        /**\n         * @param {?} providers\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.createChildFromResolved = function (providers) {\n            var /** @type {?} */ inj = new ReflectiveInjector_(providers);\n            inj._parent = this;\n            return inj;\n        };\n        /**\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.resolveAndInstantiate = function (provider) {\n            return this.instantiateResolved(ReflectiveInjector.resolve([provider])[0]);\n        };\n        /**\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.instantiateResolved = function (provider) {\n            return this._instantiateProvider(provider);\n        };\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.getProviderAtIndex = function (index) {\n            if (index < 0 || index >= this._providers.length) {\n                throw new OutOfBoundsError(index);\n            }\n            return this._providers[index];\n        };\n        /**\n         * \\@internal\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._new = function (provider) {\n            if (this._constructionCounter++ > this._getMaxNumberOfObjects()) {\n                throw new CyclicDependencyError(this, provider.key);\n            }\n            return this._instantiateProvider(provider);\n        };\n        /**\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getMaxNumberOfObjects = function () { return this.objs.length; };\n        /**\n         * @param {?} provider\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._instantiateProvider = function (provider) {\n            if (provider.multiProvider) {\n                var /** @type {?} */ res = new Array(provider.resolvedFactories.length);\n                for (var /** @type {?} */ i = 0; i < provider.resolvedFactories.length; ++i) {\n                    res[i] = this._instantiate(provider, provider.resolvedFactories[i]);\n                }\n                return res;\n            }\n            else {\n                return this._instantiate(provider, provider.resolvedFactories[0]);\n            }\n        };\n        /**\n         * @param {?} provider\n         * @param {?} ResolvedReflectiveFactory\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._instantiate = function (provider, ResolvedReflectiveFactory) {\n            var _this = this;\n            var /** @type {?} */ factory = ResolvedReflectiveFactory.factory;\n            var /** @type {?} */ deps;\n            try {\n                deps =\n                    ResolvedReflectiveFactory.dependencies.map(function (dep) { return _this._getByReflectiveDependency(dep); });\n            }\n            catch (e) {\n                if (e instanceof AbstractProviderError || e instanceof InstantiationError) {\n                    e.addKey(this, provider.key);\n                }\n                throw e;\n            }\n            var /** @type {?} */ obj;\n            try {\n                obj = factory.apply(void 0, deps);\n            }\n            catch (e) {\n                throw new InstantiationError(this, e, e.stack, provider.key);\n            }\n            return obj;\n        };\n        /**\n         * @param {?} dep\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getByReflectiveDependency = function (dep) {\n            return this._getByKey(dep.key, dep.visibility, dep.optional ? null : THROW_IF_NOT_FOUND);\n        };\n        /**\n         * @param {?} key\n         * @param {?} visibility\n         * @param {?} notFoundValue\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getByKey = function (key, visibility, notFoundValue) {\n            if (key === INJECTOR_KEY) {\n                return this;\n            }\n            if (visibility instanceof Self) {\n                return this._getByKeySelf(key, notFoundValue);\n            }\n            else {\n                return this._getByKeyDefault(key, notFoundValue, visibility);\n            }\n        };\n        /**\n         * @param {?} keyId\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getObjByKeyId = function (keyId) {\n            for (var /** @type {?} */ i = 0; i < this.keyIds.length; i++) {\n                if (this.keyIds[i] === keyId) {\n                    if (this.objs[i] === UNDEFINED) {\n                        this.objs[i] = this._new(this._providers[i]);\n                    }\n                    return this.objs[i];\n                }\n            }\n            return UNDEFINED;\n        };\n        /**\n         * \\@internal\n         * @param {?} key\n         * @param {?} notFoundValue\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._throwOrNull = function (key, notFoundValue) {\n            if (notFoundValue !== THROW_IF_NOT_FOUND) {\n                return notFoundValue;\n            }\n            else {\n                throw new NoProviderError(this, key);\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} key\n         * @param {?} notFoundValue\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getByKeySelf = function (key, notFoundValue) {\n            var /** @type {?} */ obj = this._getObjByKeyId(key.id);\n            return (obj !== UNDEFINED) ? obj : this._throwOrNull(key, notFoundValue);\n        };\n        /**\n         * \\@internal\n         * @param {?} key\n         * @param {?} notFoundValue\n         * @param {?} visibility\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype._getByKeyDefault = function (key, notFoundValue, visibility) {\n            var /** @type {?} */ inj;\n            if (visibility instanceof SkipSelf) {\n                inj = this._parent;\n            }\n            else {\n                inj = this;\n            }\n            while (inj instanceof ReflectiveInjector_) {\n                var /** @type {?} */ inj_ = (inj);\n                var /** @type {?} */ obj = inj_._getObjByKeyId(key.id);\n                if (obj !== UNDEFINED)\n                    return obj;\n                inj = inj_._parent;\n            }\n            if (inj !== null) {\n                return inj.get(key.token, notFoundValue);\n            }\n            else {\n                return this._throwOrNull(key, notFoundValue);\n            }\n        };\n        Object.defineProperty(ReflectiveInjector_.prototype, \"displayName\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ providers = _mapProviders(this, function (b) { return ' \"' + b.key.displayName + '\" '; })\n                    .join(', ');\n                return \"ReflectiveInjector(providers: [\" + providers + \"])\";\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        ReflectiveInjector_.prototype.toString = function () { return this.displayName; };\n        return ReflectiveInjector_;\n    }());\n    var /** @type {?} */ INJECTOR_KEY = ReflectiveKey.get(Injector);\n    /**\n     * @param {?} injector\n     * @param {?} fn\n     * @return {?}\n     */\n    function _mapProviders(injector, fn) {\n        var /** @type {?} */ res = new Array(injector._providers.length);\n        for (var /** @type {?} */ i = 0; i < injector._providers.length; ++i) {\n            res[i] = fn(injector.getProviderAtIndex(i));\n        }\n        return res;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * \\@whatItDoes Provides a hook for centralized exception handling.\n     *\n     * \\@description\n     *\n     * The default implementation of `ErrorHandler` prints error messages to the `console`. To\n     * intercept error handling, write a custom exception handler that replaces this default as\n     * appropriate for your app.\n     *\n     * ### Example\n     *\n     * ```\n     * class MyErrorHandler implements ErrorHandler {\n     *   handleError(error) {\n     *     // do something with the exception\n     *   }\n     * }\n     *\n     * \\@NgModule({\n     *   providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]\n     * })\n     * class MyModule {}\n     * ```\n     *\n     * \\@stable\n     */\n    var ErrorHandler = (function () {\n        /**\n         * @param {?=} rethrowError\n         */\n        function ErrorHandler(rethrowError) {\n            if (rethrowError === void 0) { rethrowError = true; }\n            /**\n             * @internal\n             */\n            this._console = console;\n            this.rethrowError = rethrowError;\n        }\n        /**\n         * @param {?} error\n         * @return {?}\n         */\n        ErrorHandler.prototype.handleError = function (error) {\n            var /** @type {?} */ originalError = this._findOriginalError(error);\n            var /** @type {?} */ originalStack = this._findOriginalStack(error);\n            var /** @type {?} */ context = this._findContext(error);\n            this._console.error(\"EXCEPTION: \" + this._extractMessage(error));\n            if (originalError) {\n                this._console.error(\"ORIGINAL EXCEPTION: \" + this._extractMessage(originalError));\n            }\n            if (originalStack) {\n                this._console.error('ORIGINAL STACKTRACE:');\n                this._console.error(originalStack);\n            }\n            if (context) {\n                this._console.error('ERROR CONTEXT:');\n                this._console.error(context);\n            }\n            // We rethrow exceptions, so operations like 'bootstrap' will result in an error\n            // when an error happens. If we do not rethrow, bootstrap will always succeed.\n            if (this.rethrowError)\n                throw error;\n        };\n        /**\n         * \\@internal\n         * @param {?} error\n         * @return {?}\n         */\n        ErrorHandler.prototype._extractMessage = function (error) {\n            return error instanceof Error ? error.message : error.toString();\n        };\n        /**\n         * \\@internal\n         * @param {?} error\n         * @return {?}\n         */\n        ErrorHandler.prototype._findContext = function (error) {\n            if (error) {\n                return error.context ? error.context :\n                    this._findContext(((error)).originalError);\n            }\n            return null;\n        };\n        /**\n         * \\@internal\n         * @param {?} error\n         * @return {?}\n         */\n        ErrorHandler.prototype._findOriginalError = function (error) {\n            var /** @type {?} */ e = ((error)).originalError;\n            while (e && ((e)).originalError) {\n                e = ((e)).originalError;\n            }\n            return e;\n        };\n        /**\n         * \\@internal\n         * @param {?} error\n         * @return {?}\n         */\n        ErrorHandler.prototype._findOriginalStack = function (error) {\n            if (!(error instanceof Error))\n                return null;\n            var /** @type {?} */ e = error;\n            var /** @type {?} */ stack = e.stack;\n            while (e instanceof Error && ((e)).originalError) {\n                e = ((e)).originalError;\n                if (e instanceof Error && e.stack) {\n                    stack = e.stack;\n                }\n            }\n            return stack;\n        };\n        return ErrorHandler;\n    }());\n\n    /**\n     * Wraps Javascript Objects\n     */\n    var StringMapWrapper = (function () {\n        function StringMapWrapper() {\n        }\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.merge = function (m1, m2) {\n            var /** @type {?} */ m = {};\n            for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n                var k = _a[_i];\n                m[k] = m1[k];\n            }\n            for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n                var k = _c[_b];\n                m[k] = m2[k];\n            }\n            return m;\n        };\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.equals = function (m1, m2) {\n            var /** @type {?} */ k1 = Object.keys(m1);\n            var /** @type {?} */ k2 = Object.keys(m2);\n            if (k1.length != k2.length) {\n                return false;\n            }\n            for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n                var /** @type {?} */ key = k1[i];\n                if (m1[key] !== m2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        return StringMapWrapper;\n    }());\n    var ListWrapper = (function () {\n        function ListWrapper() {\n        }\n        /**\n         * @param {?} arr\n         * @param {?} condition\n         * @return {?}\n         */\n        ListWrapper.findLast = function (arr, condition) {\n            for (var /** @type {?} */ i = arr.length - 1; i >= 0; i--) {\n                if (condition(arr[i])) {\n                    return arr[i];\n                }\n            }\n            return null;\n        };\n        /**\n         * @param {?} list\n         * @param {?} items\n         * @return {?}\n         */\n        ListWrapper.removeAll = function (list, items) {\n            for (var /** @type {?} */ i = 0; i < items.length; ++i) {\n                var /** @type {?} */ index = list.indexOf(items[i]);\n                if (index > -1) {\n                    list.splice(index, 1);\n                }\n            }\n        };\n        /**\n         * @param {?} list\n         * @param {?} el\n         * @return {?}\n         */\n        ListWrapper.remove = function (list, el) {\n            var /** @type {?} */ index = list.indexOf(el);\n            if (index > -1) {\n                list.splice(index, 1);\n                return true;\n            }\n            return false;\n        };\n        /**\n         * @param {?} a\n         * @param {?} b\n         * @return {?}\n         */\n        ListWrapper.equals = function (a, b) {\n            if (a.length != b.length)\n                return false;\n            for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n                if (a[i] !== b[i])\n                    return false;\n            }\n            return true;\n        };\n        /**\n         * @param {?} list\n         * @return {?}\n         */\n        ListWrapper.flatten = function (list) {\n            return list.reduce(function (flat, item) {\n                var /** @type {?} */ flatItem = Array.isArray(item) ? ListWrapper.flatten(item) : item;\n                return ((flat)).concat(flatItem);\n            }, []);\n        };\n        return ListWrapper;\n    }());\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isListLikeIterable(obj) {\n        if (!isJsObject(obj))\n            return false;\n        return Array.isArray(obj) ||\n            (!(obj instanceof Map) &&\n                getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @param {?} comparator\n     * @return {?}\n     */\n    function areIterablesEqual(a, b, comparator) {\n        var /** @type {?} */ iterator1 = a[getSymbolIterator()]();\n        var /** @type {?} */ iterator2 = b[getSymbolIterator()]();\n        while (true) {\n            var /** @type {?} */ item1 = iterator1.next();\n            var /** @type {?} */ item2 = iterator2.next();\n            if (item1.done && item2.done)\n                return true;\n            if (item1.done || item2.done)\n                return false;\n            if (!comparator(item1.value, item2.value))\n                return false;\n        }\n    }\n    /**\n     * @param {?} obj\n     * @param {?} fn\n     * @return {?}\n     */\n    function iterateListLike(obj, fn) {\n        if (Array.isArray(obj)) {\n            for (var /** @type {?} */ i = 0; i < obj.length; i++) {\n                fn(obj[i]);\n            }\n        }\n        else {\n            var /** @type {?} */ iterator = obj[getSymbolIterator()]();\n            var /** @type {?} */ item = void 0;\n            while (!((item = iterator.next()).done)) {\n                fn(item.value);\n            }\n        }\n    }\n\n    /**\n     * Determine if the argument is shaped like a Promise\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPromise(obj) {\n        // allow any Promise/A+ compliant thenable.\n        // It's up to the caller to ensure that obj.then conforms to the spec\n        return !!obj && typeof obj.then === 'function';\n    }\n    /**\n     * Determine if the argument is an Observable\n     * @param {?} obj\n     * @return {?}\n     */\n    function isObservable(obj) {\n        return !!(obj && obj[rxjs_symbol_observable.$$observable]);\n    }\n\n    /**\n     * A function that will be executed when an application is initialized.\n     * @experimental\n     */\n    var /** @type {?} */ APP_INITIALIZER = new OpaqueToken('Application Initializer');\n    /**\n     * A class that reflects the state of running {\\@link APP_INITIALIZER}s.\n     *\n     * \\@experimental\n     */\n    var ApplicationInitStatus = (function () {\n        /**\n         * @param {?} appInits\n         */\n        function ApplicationInitStatus(appInits) {\n            var _this = this;\n            this._done = false;\n            var asyncInitPromises = [];\n            if (appInits) {\n                for (var i = 0; i < appInits.length; i++) {\n                    var initResult = appInits[i]();\n                    if (isPromise(initResult)) {\n                        asyncInitPromises.push(initResult);\n                    }\n                }\n            }\n            this._donePromise = Promise.all(asyncInitPromises).then(function () { _this._done = true; });\n            if (asyncInitPromises.length === 0) {\n                this._done = true;\n            }\n        }\n        Object.defineProperty(ApplicationInitStatus.prototype, \"done\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._done; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ApplicationInitStatus.prototype, \"donePromise\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._donePromise; },\n            enumerable: true,\n            configurable: true\n        });\n        ApplicationInitStatus.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        ApplicationInitStatus.ctorParameters = function () { return [\n            { type: Array, decorators: [{ type: Inject, args: [APP_INITIALIZER,] }, { type: Optional },] },\n        ]; };\n        return ApplicationInitStatus;\n    }());\n\n    /**\n     * A DI Token representing a unique string id assigned to the application by Angular and used\n     * primarily for prefixing application attributes and CSS styles when\n     * {@link ViewEncapsulation#Emulated} is being used.\n     *\n     * If you need to avoid randomly generated value to be used as an application id, you can provide\n     * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}\n     * using this token.\n     * @experimental\n     */\n    var /** @type {?} */ APP_ID = new OpaqueToken('AppId');\n    /**\n     * @return {?}\n     */\n    function _appIdRandomProviderFactory() {\n        return \"\" + _randomChar() + _randomChar() + _randomChar();\n    }\n    /**\n     * Providers that will generate a random APP_ID_TOKEN.\n     * @experimental\n     */\n    var /** @type {?} */ APP_ID_RANDOM_PROVIDER = {\n        provide: APP_ID,\n        useFactory: _appIdRandomProviderFactory,\n        deps: /** @type {?} */ ([]),\n    };\n    /**\n     * @return {?}\n     */\n    function _randomChar() {\n        return String.fromCharCode(97 + Math.floor(Math.random() * 25));\n    }\n    /**\n     * A function that will be executed when a platform is initialized.\n     * @experimental\n     */\n    var /** @type {?} */ PLATFORM_INITIALIZER = new OpaqueToken('Platform Initializer');\n    /**\n     * All callbacks provided via this token will be called for every component that is bootstrapped.\n     * Signature of the callback:\n     *\n     * `(componentRef: ComponentRef) => void`.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ APP_BOOTSTRAP_LISTENER = new OpaqueToken('appBootstrapListener');\n    /**\n     * A token which indicates the root directory of the application\n     * @experimental\n     */\n    var /** @type {?} */ PACKAGE_ROOT_URL = new OpaqueToken('Application Packages Root URL');\n\n    var Console = (function () {\n        function Console() {\n        }\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Console.prototype.log = function (message) { print(message); };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Console.prototype.warn = function (message) { warn(message); };\n        Console.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        Console.ctorParameters = function () { return []; };\n        return Console;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$4 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Indicates that a component is still being loaded in a synchronous compile.\n     *\n     * \\@stable\n     */\n    var ComponentStillLoadingError = (function (_super) {\n        __extends$4(ComponentStillLoadingError, _super);\n        /**\n         * @param {?} compType\n         */\n        function ComponentStillLoadingError(compType) {\n            _super.call(this, \"Can't compile synchronously as \" + stringify(compType) + \" is still being loaded!\");\n            this.compType = compType;\n        }\n        return ComponentStillLoadingError;\n    }(BaseError));\n    /**\n     * Combination of NgModuleFactory and ComponentFactorys.\n     *\n     * \\@experimental\n     */\n    var ModuleWithComponentFactories = (function () {\n        /**\n         * @param {?} ngModuleFactory\n         * @param {?} componentFactories\n         */\n        function ModuleWithComponentFactories(ngModuleFactory, componentFactories) {\n            this.ngModuleFactory = ngModuleFactory;\n            this.componentFactories = componentFactories;\n        }\n        return ModuleWithComponentFactories;\n    }());\n    /**\n     * @return {?}\n     */\n    function _throwError() {\n        throw new Error(\"Runtime compiler is not loaded\");\n    }\n    /**\n     * Low-level service for running the angular compiler during runtime\n     * to create {\\@link ComponentFactory}s, which\n     * can later be used to create and render a Component instance.\n     *\n     * Each `\\@NgModule` provides an own `Compiler` to its injector,\n     * that will use the directives/pipes of the ng module for compilation\n     * of components.\n     * \\@stable\n     */\n    var Compiler = (function () {\n        function Compiler() {\n        }\n        /**\n         * Compiles the given NgModule and all of its components. All templates of the components listed\n         * in `entryComponents`\n         * have to be inlined. Otherwise throws a {\\@link ComponentStillLoadingError}.\n         * @param {?} moduleType\n         * @return {?}\n         */\n        Compiler.prototype.compileModuleSync = function (moduleType) { throw _throwError(); };\n        /**\n         * Compiles the given NgModule and all of its components\n         * @param {?} moduleType\n         * @return {?}\n         */\n        Compiler.prototype.compileModuleAsync = function (moduleType) { throw _throwError(); };\n        /**\n         * Same as {\\@link compileModuleSync} but also creates ComponentFactories for all components.\n         * @param {?} moduleType\n         * @return {?}\n         */\n        Compiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n            throw _throwError();\n        };\n        /**\n         * Same as {\\@link compileModuleAsync} but also creates ComponentFactories for all components.\n         * @param {?} moduleType\n         * @return {?}\n         */\n        Compiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n            throw _throwError();\n        };\n        /**\n         * Exposes the CSS-style selectors that have been used in `ngContent` directives within\n         * the template of the given component.\n         * This is used by the `upgrade` library to compile the appropriate transclude content\n         * in the Angular 1 wrapper component.\n         * @param {?} component\n         * @return {?}\n         */\n        Compiler.prototype.getNgContentSelectors = function (component) { throw _throwError(); };\n        /**\n         * Clears all caches.\n         * @return {?}\n         */\n        Compiler.prototype.clearCache = function () { };\n        /**\n         * Clears the cache for the given component/ngModule.\n         * @param {?} type\n         * @return {?}\n         */\n        Compiler.prototype.clearCacheFor = function (type) { };\n        Compiler.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        Compiler.ctorParameters = function () { return []; };\n        return Compiler;\n    }());\n    /**\n     * Token to provide CompilerOptions in the platform injector.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ COMPILER_OPTIONS = new OpaqueToken('compilerOptions');\n    /**\n     * A factory for creating a Compiler\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var CompilerFactory = (function () {\n        function CompilerFactory() {\n        }\n        /**\n         * @abstract\n         * @param {?=} options\n         * @return {?}\n         */\n        CompilerFactory.prototype.createCompiler = function (options) { };\n        return CompilerFactory;\n    }());\n\n    var ElementRef = (function () {\n        /**\n         * @param {?} nativeElement\n         */\n        function ElementRef(nativeElement) {\n            this.nativeElement = nativeElement;\n        }\n        return ElementRef;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$6 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Use by directives and components to emit custom Events.\n     *\n     * ### Examples\n     *\n     * In the following example, `Zippy` alternatively emits `open` and `close` events when its\n     * title gets clicked:\n     *\n     * ```\n     * \\@Component({\n     *   selector: 'zippy',\n     *   template: `\n     *   <div class=\"zippy\">\n     *     <div (click)=\"toggle()\">Toggle</div>\n     *     <div [hidden]=\"!visible\">\n     *       <ng-content></ng-content>\n     *     </div>\n     *  </div>`})\n     * export class Zippy {\n     *   visible: boolean = true;\n     *   \\@Output() open: EventEmitter<any> = new EventEmitter();\n     *   \\@Output() close: EventEmitter<any> = new EventEmitter();\n     *\n     *   toggle() {\n     *     this.visible = !this.visible;\n     *     if (this.visible) {\n     *       this.open.emit(null);\n     *     } else {\n     *       this.close.emit(null);\n     *     }\n     *   }\n     * }\n     * ```\n     *\n     * The events payload can be accessed by the parameter `$event` on the components output event\n     * handler:\n     *\n     * ```\n     * <zippy (open)=\"onOpen($event)\" (close)=\"onClose($event)\"></zippy>\n     * ```\n     *\n     * Uses Rx.Observable but provides an adapter to make it work as specified here:\n     * https://github.com/jhusain/observable-spec\n     *\n     * Once a reference implementation of the spec is available, switch to it.\n     * \\@stable\n     */\n    var EventEmitter = (function (_super) {\n        __extends$6(EventEmitter, _super);\n        /**\n         * Creates an instance of [EventEmitter], which depending on [isAsync],\n         * delivers events synchronously or asynchronously.\n         * @param {?=} isAsync\n         */\n        function EventEmitter(isAsync) {\n            if (isAsync === void 0) { isAsync = false; }\n            _super.call(this);\n            this.__isAsync = isAsync;\n        }\n        /**\n         * @param {?=} value\n         * @return {?}\n         */\n        EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };\n        /**\n         * @param {?=} generatorOrNext\n         * @param {?=} error\n         * @param {?=} complete\n         * @return {?}\n         */\n        EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {\n            var /** @type {?} */ schedulerFn;\n            var /** @type {?} */ errorFn = function (err) { return null; };\n            var /** @type {?} */ completeFn = function () { return null; };\n            if (generatorOrNext && typeof generatorOrNext === 'object') {\n                schedulerFn = this.__isAsync ? function (value) {\n                    setTimeout(function () { return generatorOrNext.next(value); });\n                } : function (value) { generatorOrNext.next(value); };\n                if (generatorOrNext.error) {\n                    errorFn = this.__isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :\n                        function (err) { generatorOrNext.error(err); };\n                }\n                if (generatorOrNext.complete) {\n                    completeFn = this.__isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :\n                        function () { generatorOrNext.complete(); };\n                }\n            }\n            else {\n                schedulerFn = this.__isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :\n                    function (value) { generatorOrNext(value); };\n                if (error) {\n                    errorFn =\n                        this.__isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };\n                }\n                if (complete) {\n                    completeFn =\n                        this.__isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };\n                }\n            }\n            return _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);\n        };\n        return EventEmitter;\n    }(rxjs_Subject.Subject));\n\n    /**\n     * An injectable service for executing work inside or outside of the Angular zone.\n     *\n     * The most common use of this service is to optimize performance when starting a work consisting of\n     * one or more asynchronous tasks that don't require UI updates or error handling to be handled by\n     * Angular. Such tasks can be kicked off via {\\@link runOutsideAngular} and if needed, these tasks\n     * can reenter the Angular zone via {\\@link run}.\n     *\n     * <!-- TODO: add/fix links to:\n     *   - docs explaining zones and the use of zones in Angular and change-detection\n     *   - link to runOutsideAngular/run (throughout this file!)\n     *   -->\n     *\n     * ### Example\n     *\n     * ```\n     * import {Component, NgZone} from '\\@angular/core';\n     * import {NgIf} from '\\@angular/common';\n     *\n     * \\@Component({\n     *   selector: 'ng-zone-demo'.\n     *   template: `\n     *     <h2>Demo: NgZone</h2>\n     *\n     *     <p>Progress: {{progress}}%</p>\n     *     <p *ngIf=\"progress >= 100\">Done processing {{label}} of Angular zone!</p>\n     *\n     *     <button (click)=\"processWithinAngularZone()\">Process within Angular zone</button>\n     *     <button (click)=\"processOutsideOfAngularZone()\">Process outside of Angular zone</button>\n     *   `,\n     * })\n     * export class NgZoneDemo {\n     *   progress: number = 0;\n     *   label: string;\n     *\n     *   constructor(private _ngZone: NgZone) {}\n     *\n     *   // Loop inside the Angular zone\n     *   // so the UI DOES refresh after each setTimeout cycle\n     *   processWithinAngularZone() {\n     *     this.label = 'inside';\n     *     this.progress = 0;\n     *     this._increaseProgress(() => console.log('Inside Done!'));\n     *   }\n     *\n     *   // Loop outside of the Angular zone\n     *   // so the UI DOES NOT refresh after each setTimeout cycle\n     *   processOutsideOfAngularZone() {\n     *     this.label = 'outside';\n     *     this.progress = 0;\n     *     this._ngZone.runOutsideAngular(() => {\n     *       this._increaseProgress(() => {\n     *       // reenter the Angular zone and display done\n     *       this._ngZone.run(() => {console.log('Outside Done!') });\n     *     }}));\n     *   }\n     *\n     *   _increaseProgress(doneCallback: () => void) {\n     *     this.progress += 1;\n     *     console.log(`Current progress: ${this.progress}%`);\n     *\n     *     if (this.progress < 100) {\n     *       window.setTimeout(() => this._increaseProgress(doneCallback)), 10)\n     *     } else {\n     *       doneCallback();\n     *     }\n     *   }\n     * }\n     * ```\n     *\n     * \\@experimental\n     */\n    var NgZone = (function () {\n        /**\n         * @param {?} __0\n         */\n        function NgZone(_a) {\n            var _b = _a.enableLongStackTrace, enableLongStackTrace = _b === void 0 ? false : _b;\n            this._hasPendingMicrotasks = false;\n            this._hasPendingMacrotasks = false;\n            this._isStable = true;\n            this._nesting = 0;\n            this._onUnstable = new EventEmitter(false);\n            this._onMicrotaskEmpty = new EventEmitter(false);\n            this._onStable = new EventEmitter(false);\n            this._onErrorEvents = new EventEmitter(false);\n            if (typeof Zone == 'undefined') {\n                throw new Error('Angular requires Zone.js prolyfill.');\n            }\n            Zone.assertZonePatched();\n            this.outer = this.inner = Zone.current;\n            if (Zone['wtfZoneSpec']) {\n                this.inner = this.inner.fork(Zone['wtfZoneSpec']);\n            }\n            if (enableLongStackTrace && Zone['longStackTraceZoneSpec']) {\n                this.inner = this.inner.fork(Zone['longStackTraceZoneSpec']);\n            }\n            this.forkInnerZoneWithAngularBehavior();\n        }\n        /**\n         * @return {?}\n         */\n        NgZone.isInAngularZone = function () { return Zone.current.get('isAngularZone') === true; };\n        /**\n         * @return {?}\n         */\n        NgZone.assertInAngularZone = function () {\n            if (!NgZone.isInAngularZone()) {\n                throw new Error('Expected to be in Angular Zone, but it is not!');\n            }\n        };\n        /**\n         * @return {?}\n         */\n        NgZone.assertNotInAngularZone = function () {\n            if (NgZone.isInAngularZone()) {\n                throw new Error('Expected to not be in Angular Zone, but it is!');\n            }\n        };\n        /**\n         * Executes the `fn` function synchronously within the Angular zone and returns value returned by\n         * the function.\n         *\n         * Running functions via `run` allows you to reenter Angular zone from a task that was executed\n         * outside of the Angular zone (typically started via {\\@link runOutsideAngular}).\n         *\n         * Any future tasks or microtasks scheduled from within this function will continue executing from\n         * within the Angular zone.\n         *\n         * If a synchronous error happens it will be rethrown and not reported via `onError`.\n         * @param {?} fn\n         * @return {?}\n         */\n        NgZone.prototype.run = function (fn) { return this.inner.run(fn); };\n        /**\n         * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not\n         * rethrown.\n         * @param {?} fn\n         * @return {?}\n         */\n        NgZone.prototype.runGuarded = function (fn) { return this.inner.runGuarded(fn); };\n        /**\n         * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by\n         * the function.\n         *\n         * Running functions via `runOutsideAngular` allows you to escape Angular's zone and do work that\n         * doesn't trigger Angular change-detection or is subject to Angular's error handling.\n         *\n         * Any future tasks or microtasks scheduled from within this function will continue executing from\n         * outside of the Angular zone.\n         *\n         * Use {\\@link run} to reenter the Angular zone and do work that updates the application model.\n         * @param {?} fn\n         * @return {?}\n         */\n        NgZone.prototype.runOutsideAngular = function (fn) { return this.outer.run(fn); };\n        Object.defineProperty(NgZone.prototype, \"onUnstable\", {\n            /**\n             * Notifies when code enters Angular Zone. This gets fired first on VM Turn.\n             * @return {?}\n             */\n            get: function () { return this._onUnstable; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"onMicrotaskEmpty\", {\n            /**\n             * Notifies when there is no more microtasks enqueue in the current VM Turn.\n             * This is a hint for Angular to do change detection, which may enqueue more microtasks.\n             * For this reason this event can fire multiple times per VM Turn.\n             * @return {?}\n             */\n            get: function () { return this._onMicrotaskEmpty; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"onStable\", {\n            /**\n             * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which\n             * implies we are about to relinquish VM turn.\n             * This event gets called just once.\n             * @return {?}\n             */\n            get: function () { return this._onStable; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"onError\", {\n            /**\n             * Notify that an error has been delivered.\n             * @return {?}\n             */\n            get: function () { return this._onErrorEvents; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"isStable\", {\n            /**\n             * Whether there are no outstanding microtasks or macrotasks.\n             * @return {?}\n             */\n            get: function () { return this._isStable; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"hasPendingMicrotasks\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._hasPendingMicrotasks; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgZone.prototype, \"hasPendingMacrotasks\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._hasPendingMacrotasks; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        NgZone.prototype.checkStable = function () {\n            var _this = this;\n            if (this._nesting == 0 && !this._hasPendingMicrotasks && !this._isStable) {\n                try {\n                    this._nesting++;\n                    this._onMicrotaskEmpty.emit(null);\n                }\n                finally {\n                    this._nesting--;\n                    if (!this._hasPendingMicrotasks) {\n                        try {\n                            this.runOutsideAngular(function () { return _this._onStable.emit(null); });\n                        }\n                        finally {\n                            this._isStable = true;\n                        }\n                    }\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        NgZone.prototype.forkInnerZoneWithAngularBehavior = function () {\n            var _this = this;\n            this.inner = this.inner.fork({\n                name: 'angular',\n                properties: /** @type {?} */ ({ 'isAngularZone': true }),\n                onInvokeTask: function (delegate, current, target, task, applyThis, applyArgs) {\n                    try {\n                        _this.onEnter();\n                        return delegate.invokeTask(target, task, applyThis, applyArgs);\n                    }\n                    finally {\n                        _this.onLeave();\n                    }\n                },\n                onInvoke: function (delegate, current, target, callback, applyThis, applyArgs, source) {\n                    try {\n                        _this.onEnter();\n                        return delegate.invoke(target, callback, applyThis, applyArgs, source);\n                    }\n                    finally {\n                        _this.onLeave();\n                    }\n                },\n                onHasTask: function (delegate, current, target, hasTaskState) {\n                    delegate.hasTask(target, hasTaskState);\n                    if (current === target) {\n                        // We are only interested in hasTask events which originate from our zone\n                        // (A child hasTask event is not interesting to us)\n                        if (hasTaskState.change == 'microTask') {\n                            _this.setHasMicrotask(hasTaskState.microTask);\n                        }\n                        else if (hasTaskState.change == 'macroTask') {\n                            _this.setHasMacrotask(hasTaskState.macroTask);\n                        }\n                    }\n                },\n                onHandleError: function (delegate, current, target, error) {\n                    delegate.handleError(target, error);\n                    _this.triggerError(error);\n                    return false;\n                }\n            });\n        };\n        /**\n         * @return {?}\n         */\n        NgZone.prototype.onEnter = function () {\n            this._nesting++;\n            if (this._isStable) {\n                this._isStable = false;\n                this._onUnstable.emit(null);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        NgZone.prototype.onLeave = function () {\n            this._nesting--;\n            this.checkStable();\n        };\n        /**\n         * @param {?} hasMicrotasks\n         * @return {?}\n         */\n        NgZone.prototype.setHasMicrotask = function (hasMicrotasks) {\n            this._hasPendingMicrotasks = hasMicrotasks;\n            this.checkStable();\n        };\n        /**\n         * @param {?} hasMacrotasks\n         * @return {?}\n         */\n        NgZone.prototype.setHasMacrotask = function (hasMacrotasks) { this._hasPendingMacrotasks = hasMacrotasks; };\n        /**\n         * @param {?} error\n         * @return {?}\n         */\n        NgZone.prototype.triggerError = function (error) { this._onErrorEvents.emit(error); };\n        return NgZone;\n    }());\n\n    var AnimationQueue = (function () {\n        /**\n         * @param {?} _zone\n         */\n        function AnimationQueue(_zone) {\n            this._zone = _zone;\n            this.entries = [];\n        }\n        /**\n         * @param {?} player\n         * @return {?}\n         */\n        AnimationQueue.prototype.enqueue = function (player) { this.entries.push(player); };\n        /**\n         * @return {?}\n         */\n        AnimationQueue.prototype.flush = function () {\n            var _this = this;\n            // given that each animation player may set aside\n            // microtasks and rely on DOM-based events, this\n            // will cause Angular to run change detection after\n            // each request. This sidesteps the issue. If a user\n            // hooks into an animation via (@anim.start) or (@anim.done)\n            // then those methods will automatically trigger change\n            // detection by wrapping themselves inside of a zone\n            if (this.entries.length) {\n                this._zone.runOutsideAngular(function () {\n                    // this code is wrapped into a single promise such that the\n                    // onStart and onDone player callbacks are triggered outside\n                    // of the digest cycle of animations\n                    Promise.resolve(null).then(function () { return _this._triggerAnimations(); });\n                });\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationQueue.prototype._triggerAnimations = function () {\n            NgZone.assertNotInAngularZone();\n            while (this.entries.length) {\n                var /** @type {?} */ player = this.entries.shift();\n                // in the event that an animation throws an error then we do\n                // not want to re-run animations on any previous animations\n                // if they have already been kicked off beforehand\n                if (!player.hasStarted()) {\n                    player.play();\n                }\n            }\n        };\n        AnimationQueue.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        AnimationQueue.ctorParameters = function () { return [\n            { type: NgZone, },\n        ]; };\n        return AnimationQueue;\n    }());\n\n    var DefaultIterableDifferFactory = (function () {\n        function DefaultIterableDifferFactory() {\n        }\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        DefaultIterableDifferFactory.prototype.supports = function (obj) { return isListLikeIterable(obj); };\n        /**\n         * @param {?} cdRef\n         * @param {?=} trackByFn\n         * @return {?}\n         */\n        DefaultIterableDifferFactory.prototype.create = function (cdRef, trackByFn) {\n            return new DefaultIterableDiffer(trackByFn);\n        };\n        return DefaultIterableDifferFactory;\n    }());\n    var /** @type {?} */ trackByIdentity = function (index, item) { return item; };\n    /**\n     * \\@stable\n     */\n    var DefaultIterableDiffer = (function () {\n        /**\n         * @param {?=} _trackByFn\n         */\n        function DefaultIterableDiffer(_trackByFn) {\n            this._trackByFn = _trackByFn;\n            this._length = null;\n            this._collection = null;\n            this._linkedRecords = null;\n            this._unlinkedRecords = null;\n            this._previousItHead = null;\n            this._itHead = null;\n            this._itTail = null;\n            this._additionsHead = null;\n            this._additionsTail = null;\n            this._movesHead = null;\n            this._movesTail = null;\n            this._removalsHead = null;\n            this._removalsTail = null;\n            this._identityChangesHead = null;\n            this._identityChangesTail = null;\n            this._trackByFn = this._trackByFn || trackByIdentity;\n        }\n        Object.defineProperty(DefaultIterableDiffer.prototype, \"collection\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._collection; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DefaultIterableDiffer.prototype, \"length\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._length; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._itHead; record !== null; record = record._next) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachOperation = function (fn) {\n            var /** @type {?} */ nextIt = this._itHead;\n            var /** @type {?} */ nextRemove = this._removalsHead;\n            var /** @type {?} */ addRemoveOffset = 0;\n            var /** @type {?} */ moveOffsets = null;\n            while (nextIt || nextRemove) {\n                // Figure out which is the next record to process\n                // Order: remove, add, move\n                var /** @type {?} */ record = !nextRemove ||\n                    nextIt &&\n                        nextIt.currentIndex < getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets) ?\n                    nextIt :\n                    nextRemove;\n                var /** @type {?} */ adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);\n                var /** @type {?} */ currentIndex = record.currentIndex;\n                // consume the item, and adjust the addRemoveOffset and update moveDistance if necessary\n                if (record === nextRemove) {\n                    addRemoveOffset--;\n                    nextRemove = nextRemove._nextRemoved;\n                }\n                else {\n                    nextIt = nextIt._next;\n                    if (record.previousIndex == null) {\n                        addRemoveOffset++;\n                    }\n                    else {\n                        // INVARIANT:  currentIndex < previousIndex\n                        if (!moveOffsets)\n                            moveOffsets = [];\n                        var /** @type {?} */ localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;\n                        var /** @type {?} */ localCurrentIndex = currentIndex - addRemoveOffset;\n                        if (localMovePreviousIndex != localCurrentIndex) {\n                            for (var /** @type {?} */ i = 0; i < localMovePreviousIndex; i++) {\n                                var /** @type {?} */ offset = i < moveOffsets.length ? moveOffsets[i] : (moveOffsets[i] = 0);\n                                var /** @type {?} */ index = offset + i;\n                                if (localCurrentIndex <= index && index < localMovePreviousIndex) {\n                                    moveOffsets[i] = offset + 1;\n                                }\n                            }\n                            var /** @type {?} */ previousIndex = record.previousIndex;\n                            moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;\n                        }\n                    }\n                }\n                if (adjPreviousIndex !== currentIndex) {\n                    fn(record, adjPreviousIndex, currentIndex);\n                }\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._previousItHead; record !== null; record = record._nextPrevious) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._movesHead; record !== null; record = record._nextMoved) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.forEachIdentityChange = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} collection\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.diff = function (collection) {\n            if (isBlank(collection))\n                collection = [];\n            if (!isListLikeIterable(collection)) {\n                throw new Error(\"Error trying to diff '\" + collection + \"'\");\n            }\n            if (this.check(collection)) {\n                return this;\n            }\n            else {\n                return null;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.onDestroy = function () { };\n        /**\n         * @param {?} collection\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.check = function (collection) {\n            var _this = this;\n            this._reset();\n            var /** @type {?} */ record = this._itHead;\n            var /** @type {?} */ mayBeDirty = false;\n            var /** @type {?} */ index;\n            var /** @type {?} */ item;\n            var /** @type {?} */ itemTrackBy;\n            if (Array.isArray(collection)) {\n                var /** @type {?} */ list = collection;\n                this._length = collection.length;\n                for (var /** @type {?} */ index_1 = 0; index_1 < this._length; index_1++) {\n                    item = list[index_1];\n                    itemTrackBy = this._trackByFn(index_1, item);\n                    if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {\n                        record = this._mismatch(record, item, itemTrackBy, index_1);\n                        mayBeDirty = true;\n                    }\n                    else {\n                        if (mayBeDirty) {\n                            // TODO(misko): can we limit this to duplicates only?\n                            record = this._verifyReinsertion(record, item, itemTrackBy, index_1);\n                        }\n                        if (!looseIdentical(record.item, item))\n                            this._addIdentityChange(record, item);\n                    }\n                    record = record._next;\n                }\n            }\n            else {\n                index = 0;\n                iterateListLike(collection, function (item /** TODO #9100 */) {\n                    itemTrackBy = _this._trackByFn(index, item);\n                    if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {\n                        record = _this._mismatch(record, item, itemTrackBy, index);\n                        mayBeDirty = true;\n                    }\n                    else {\n                        if (mayBeDirty) {\n                            // TODO(misko): can we limit this to duplicates only?\n                            record = _this._verifyReinsertion(record, item, itemTrackBy, index);\n                        }\n                        if (!looseIdentical(record.item, item))\n                            _this._addIdentityChange(record, item);\n                    }\n                    record = record._next;\n                    index++;\n                });\n                this._length = index;\n            }\n            this._truncate(record);\n            this._collection = collection;\n            return this.isDirty;\n        };\n        Object.defineProperty(DefaultIterableDiffer.prototype, \"isDirty\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._additionsHead !== null || this._movesHead !== null ||\n                    this._removalsHead !== null || this._identityChangesHead !== null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * Reset the state of the change objects to show no changes. This means set previousKey to\n         * currentKey, and clear all of the queues (additions, moves, removals).\n         * Set the previousIndexes of moved and added items to their currentIndexes\n         * Reset the list of additions, moves and removals\n         *\n         * \\@internal\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._reset = function () {\n            if (this.isDirty) {\n                var /** @type {?} */ record = void 0;\n                var /** @type {?} */ nextRecord = void 0;\n                for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {\n                    record._nextPrevious = record._next;\n                }\n                for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n                    record.previousIndex = record.currentIndex;\n                }\n                this._additionsHead = this._additionsTail = null;\n                for (record = this._movesHead; record !== null; record = nextRecord) {\n                    record.previousIndex = record.currentIndex;\n                    nextRecord = record._nextMoved;\n                }\n                this._movesHead = this._movesTail = null;\n                this._removalsHead = this._removalsTail = null;\n                this._identityChangesHead = this._identityChangesTail = null;\n            }\n        };\n        /**\n         * This is the core function which handles differences between collections.\n         *\n         * - `record` is the record which we saw at this position last time. If null then it is a new\n         *   item.\n         * - `item` is the current item in the collection\n         * - `index` is the position of the item in the collection\n         *\n         * \\@internal\n         * @param {?} record\n         * @param {?} item\n         * @param {?} itemTrackBy\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._mismatch = function (record, item, itemTrackBy, index) {\n            // The previous record after which we will append the current one.\n            var /** @type {?} */ previousRecord;\n            if (record === null) {\n                previousRecord = this._itTail;\n            }\n            else {\n                previousRecord = record._prev;\n                // Remove the record from the collection since we know it does not match the item.\n                this._remove(record);\n            }\n            // Attempt to see if we have seen the item before.\n            record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);\n            if (record !== null) {\n                // We have seen this before, we need to move it forward in the collection.\n                // But first we need to check if identity changed, so we can update in view if necessary\n                if (!looseIdentical(record.item, item))\n                    this._addIdentityChange(record, item);\n                this._moveAfter(record, previousRecord, index);\n            }\n            else {\n                // Never seen it, check evicted list.\n                record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy);\n                if (record !== null) {\n                    // It is an item which we have evicted earlier: reinsert it back into the list.\n                    // But first we need to check if identity changed, so we can update in view if necessary\n                    if (!looseIdentical(record.item, item))\n                        this._addIdentityChange(record, item);\n                    this._reinsertAfter(record, previousRecord, index);\n                }\n                else {\n                    // It is a new item: add it.\n                    record =\n                        this._addAfter(new CollectionChangeRecord(item, itemTrackBy), previousRecord, index);\n                }\n            }\n            return record;\n        };\n        /**\n         * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)\n         *\n         * Use case: `[a, a]` => `[b, a, a]`\n         *\n         * If we did not have this check then the insertion of `b` would:\n         *   1) evict first `a`\n         *   2) insert `b` at `0` index.\n         *   3) leave `a` at index `1` as is. <-- this is wrong!\n         *   3) reinsert `a` at index 2. <-- this is wrong!\n         *\n         * The correct behavior is:\n         *   1) evict first `a`\n         *   2) insert `b` at `0` index.\n         *   3) reinsert `a` at index 1.\n         *   3) move `a` at from `1` to `2`.\n         *\n         *\n         * Double check that we have not evicted a duplicate item. We need to check if the item type may\n         * have already been removed:\n         * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted\n         * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a\n         * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'\n         * at the end.\n         *\n         * \\@internal\n         * @param {?} record\n         * @param {?} item\n         * @param {?} itemTrackBy\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, itemTrackBy, index) {\n            var /** @type {?} */ reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy);\n            if (reinsertRecord !== null) {\n                record = this._reinsertAfter(reinsertRecord, record._prev, index);\n            }\n            else if (record.currentIndex != index) {\n                record.currentIndex = index;\n                this._addToMoves(record, index);\n            }\n            return record;\n        };\n        /**\n         * Get rid of any excess {\\@link CollectionChangeRecord}s from the previous collection\n         *\n         * - `record` The first excess {\\@link CollectionChangeRecord}.\n         *\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._truncate = function (record) {\n            // Anything after that needs to be removed;\n            while (record !== null) {\n                var /** @type {?} */ nextRecord = record._next;\n                this._addToRemovals(this._unlink(record));\n                record = nextRecord;\n            }\n            if (this._unlinkedRecords !== null) {\n                this._unlinkedRecords.clear();\n            }\n            if (this._additionsTail !== null) {\n                this._additionsTail._nextAdded = null;\n            }\n            if (this._movesTail !== null) {\n                this._movesTail._nextMoved = null;\n            }\n            if (this._itTail !== null) {\n                this._itTail._next = null;\n            }\n            if (this._removalsTail !== null) {\n                this._removalsTail._nextRemoved = null;\n            }\n            if (this._identityChangesTail !== null) {\n                this._identityChangesTail._nextIdentityChange = null;\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} prevRecord\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {\n            if (this._unlinkedRecords !== null) {\n                this._unlinkedRecords.remove(record);\n            }\n            var /** @type {?} */ prev = record._prevRemoved;\n            var /** @type {?} */ next = record._nextRemoved;\n            if (prev === null) {\n                this._removalsHead = next;\n            }\n            else {\n                prev._nextRemoved = next;\n            }\n            if (next === null) {\n                this._removalsTail = prev;\n            }\n            else {\n                next._prevRemoved = prev;\n            }\n            this._insertAfter(record, prevRecord, index);\n            this._addToMoves(record, index);\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} prevRecord\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {\n            this._unlink(record);\n            this._insertAfter(record, prevRecord, index);\n            this._addToMoves(record, index);\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} prevRecord\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {\n            this._insertAfter(record, prevRecord, index);\n            if (this._additionsTail === null) {\n                // todo(vicb)\n                // assert(this._additionsHead === null);\n                this._additionsTail = this._additionsHead = record;\n            }\n            else {\n                // todo(vicb)\n                // assert(_additionsTail._nextAdded === null);\n                // assert(record._nextAdded === null);\n                this._additionsTail = this._additionsTail._nextAdded = record;\n            }\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} prevRecord\n         * @param {?} index\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {\n            // todo(vicb)\n            // assert(record != prevRecord);\n            // assert(record._next === null);\n            // assert(record._prev === null);\n            var /** @type {?} */ next = prevRecord === null ? this._itHead : prevRecord._next;\n            // todo(vicb)\n            // assert(next != record);\n            // assert(prevRecord != record);\n            record._next = next;\n            record._prev = prevRecord;\n            if (next === null) {\n                this._itTail = record;\n            }\n            else {\n                next._prev = record;\n            }\n            if (prevRecord === null) {\n                this._itHead = record;\n            }\n            else {\n                prevRecord._next = record;\n            }\n            if (this._linkedRecords === null) {\n                this._linkedRecords = new _DuplicateMap();\n            }\n            this._linkedRecords.put(record);\n            record.currentIndex = index;\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._remove = function (record) {\n            return this._addToRemovals(this._unlink(record));\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._unlink = function (record) {\n            if (this._linkedRecords !== null) {\n                this._linkedRecords.remove(record);\n            }\n            var /** @type {?} */ prev = record._prev;\n            var /** @type {?} */ next = record._next;\n            // todo(vicb)\n            // assert((record._prev = null) === null);\n            // assert((record._next = null) === null);\n            if (prev === null) {\n                this._itHead = next;\n            }\n            else {\n                prev._next = next;\n            }\n            if (next === null) {\n                this._itTail = prev;\n            }\n            else {\n                next._prev = prev;\n            }\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} toIndex\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {\n            // todo(vicb)\n            // assert(record._nextMoved === null);\n            if (record.previousIndex === toIndex) {\n                return record;\n            }\n            if (this._movesTail === null) {\n                // todo(vicb)\n                // assert(_movesHead === null);\n                this._movesTail = this._movesHead = record;\n            }\n            else {\n                // todo(vicb)\n                // assert(_movesTail._nextMoved === null);\n                this._movesTail = this._movesTail._nextMoved = record;\n            }\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._addToRemovals = function (record) {\n            if (this._unlinkedRecords === null) {\n                this._unlinkedRecords = new _DuplicateMap();\n            }\n            this._unlinkedRecords.put(record);\n            record.currentIndex = null;\n            record._nextRemoved = null;\n            if (this._removalsTail === null) {\n                // todo(vicb)\n                // assert(_removalsHead === null);\n                this._removalsTail = this._removalsHead = record;\n                record._prevRemoved = null;\n            }\n            else {\n                // todo(vicb)\n                // assert(_removalsTail._nextRemoved === null);\n                // assert(record._nextRemoved === null);\n                record._prevRemoved = this._removalsTail;\n                this._removalsTail = this._removalsTail._nextRemoved = record;\n            }\n            return record;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @param {?} item\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype._addIdentityChange = function (record, item) {\n            record.item = item;\n            if (this._identityChangesTail === null) {\n                this._identityChangesTail = this._identityChangesHead = record;\n            }\n            else {\n                this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;\n            }\n            return record;\n        };\n        /**\n         * @return {?}\n         */\n        DefaultIterableDiffer.prototype.toString = function () {\n            var /** @type {?} */ list = [];\n            this.forEachItem(function (record /** TODO #9100 */) { return list.push(record); });\n            var /** @type {?} */ previous = [];\n            this.forEachPreviousItem(function (record /** TODO #9100 */) { return previous.push(record); });\n            var /** @type {?} */ additions = [];\n            this.forEachAddedItem(function (record /** TODO #9100 */) { return additions.push(record); });\n            var /** @type {?} */ moves = [];\n            this.forEachMovedItem(function (record /** TODO #9100 */) { return moves.push(record); });\n            var /** @type {?} */ removals = [];\n            this.forEachRemovedItem(function (record /** TODO #9100 */) { return removals.push(record); });\n            var /** @type {?} */ identityChanges = [];\n            this.forEachIdentityChange(function (record /** TODO #9100 */) { return identityChanges.push(record); });\n            return 'collection: ' + list.join(', ') + '\\n' +\n                'previous: ' + previous.join(', ') + '\\n' +\n                'additions: ' + additions.join(', ') + '\\n' +\n                'moves: ' + moves.join(', ') + '\\n' +\n                'removals: ' + removals.join(', ') + '\\n' +\n                'identityChanges: ' + identityChanges.join(', ') + '\\n';\n        };\n        return DefaultIterableDiffer;\n    }());\n    /**\n     * \\@stable\n     */\n    var CollectionChangeRecord = (function () {\n        /**\n         * @param {?} item\n         * @param {?} trackById\n         */\n        function CollectionChangeRecord(item, trackById) {\n            this.item = item;\n            this.trackById = trackById;\n            this.currentIndex = null;\n            this.previousIndex = null;\n            /** @internal */\n            this._nextPrevious = null;\n            /** @internal */\n            this._prev = null;\n            /** @internal */\n            this._next = null;\n            /** @internal */\n            this._prevDup = null;\n            /** @internal */\n            this._nextDup = null;\n            /** @internal */\n            this._prevRemoved = null;\n            /** @internal */\n            this._nextRemoved = null;\n            /** @internal */\n            this._nextAdded = null;\n            /** @internal */\n            this._nextMoved = null;\n            /** @internal */\n            this._nextIdentityChange = null;\n        }\n        /**\n         * @return {?}\n         */\n        CollectionChangeRecord.prototype.toString = function () {\n            return this.previousIndex === this.currentIndex ? stringify(this.item) :\n                stringify(this.item) + '[' +\n                    stringify(this.previousIndex) + '->' + stringify(this.currentIndex) + ']';\n        };\n        return CollectionChangeRecord;\n    }());\n    var _DuplicateItemRecordList = (function () {\n        function _DuplicateItemRecordList() {\n            /** @internal */\n            this._head = null;\n            /** @internal */\n            this._tail = null;\n        }\n        /**\n         * Append the record to the list of duplicates.\n         *\n         * Note: by design all records in the list of duplicates hold the same value in record.item.\n         * @param {?} record\n         * @return {?}\n         */\n        _DuplicateItemRecordList.prototype.add = function (record) {\n            if (this._head === null) {\n                this._head = this._tail = record;\n                record._nextDup = null;\n                record._prevDup = null;\n            }\n            else {\n                // todo(vicb)\n                // assert(record.item ==  _head.item ||\n                //       record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);\n                this._tail._nextDup = record;\n                record._prevDup = this._tail;\n                record._nextDup = null;\n                this._tail = record;\n            }\n        };\n        /**\n         * @param {?} trackById\n         * @param {?} afterIndex\n         * @return {?}\n         */\n        _DuplicateItemRecordList.prototype.get = function (trackById, afterIndex) {\n            var /** @type {?} */ record;\n            for (record = this._head; record !== null; record = record._nextDup) {\n                if ((afterIndex === null || afterIndex < record.currentIndex) &&\n                    looseIdentical(record.trackById, trackById)) {\n                    return record;\n                }\n            }\n            return null;\n        };\n        /**\n         * Remove one {\\@link CollectionChangeRecord} from the list of duplicates.\n         *\n         * Returns whether the list of duplicates is empty.\n         * @param {?} record\n         * @return {?}\n         */\n        _DuplicateItemRecordList.prototype.remove = function (record) {\n            // todo(vicb)\n            // assert(() {\n            //  // verify that the record being removed is in the list.\n            //  for (CollectionChangeRecord cursor = _head; cursor != null; cursor = cursor._nextDup) {\n            //    if (identical(cursor, record)) return true;\n            //  }\n            //  return false;\n            //});\n            var /** @type {?} */ prev = record._prevDup;\n            var /** @type {?} */ next = record._nextDup;\n            if (prev === null) {\n                this._head = next;\n            }\n            else {\n                prev._nextDup = next;\n            }\n            if (next === null) {\n                this._tail = prev;\n            }\n            else {\n                next._prevDup = prev;\n            }\n            return this._head === null;\n        };\n        return _DuplicateItemRecordList;\n    }());\n    var _DuplicateMap = (function () {\n        function _DuplicateMap() {\n            this.map = new Map();\n        }\n        /**\n         * @param {?} record\n         * @return {?}\n         */\n        _DuplicateMap.prototype.put = function (record) {\n            var /** @type {?} */ key = record.trackById;\n            var /** @type {?} */ duplicates = this.map.get(key);\n            if (!duplicates) {\n                duplicates = new _DuplicateItemRecordList();\n                this.map.set(key, duplicates);\n            }\n            duplicates.add(record);\n        };\n        /**\n         * Retrieve the `value` using key. Because the CollectionChangeRecord value may be one which we\n         * have already iterated over, we use the afterIndex to pretend it is not there.\n         *\n         * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we\n         * have any more `a`s needs to return the last `a` not the first or second.\n         * @param {?} trackById\n         * @param {?=} afterIndex\n         * @return {?}\n         */\n        _DuplicateMap.prototype.get = function (trackById, afterIndex) {\n            if (afterIndex === void 0) { afterIndex = null; }\n            var /** @type {?} */ key = trackById;\n            var /** @type {?} */ recordList = this.map.get(key);\n            return recordList ? recordList.get(trackById, afterIndex) : null;\n        };\n        /**\n         * Removes a {\\@link CollectionChangeRecord} from the list of duplicates.\n         *\n         * The list of duplicates also is removed from the map if it gets empty.\n         * @param {?} record\n         * @return {?}\n         */\n        _DuplicateMap.prototype.remove = function (record) {\n            var /** @type {?} */ key = record.trackById;\n            var /** @type {?} */ recordList = this.map.get(key);\n            // Remove the list of duplicates when it gets empty\n            if (recordList.remove(record)) {\n                this.map.delete(key);\n            }\n            return record;\n        };\n        Object.defineProperty(_DuplicateMap.prototype, \"isEmpty\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.map.size === 0; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        _DuplicateMap.prototype.clear = function () { this.map.clear(); };\n        /**\n         * @return {?}\n         */\n        _DuplicateMap.prototype.toString = function () { return '_DuplicateMap(' + stringify(this.map) + ')'; };\n        return _DuplicateMap;\n    }());\n    /**\n     * @param {?} item\n     * @param {?} addRemoveOffset\n     * @param {?} moveOffsets\n     * @return {?}\n     */\n    function getPreviousIndex(item, addRemoveOffset, moveOffsets) {\n        var /** @type {?} */ previousIndex = item.previousIndex;\n        if (previousIndex === null)\n            return previousIndex;\n        var /** @type {?} */ moveOffset = 0;\n        if (moveOffsets && previousIndex < moveOffsets.length) {\n            moveOffset = moveOffsets[previousIndex];\n        }\n        return previousIndex + addRemoveOffset + moveOffset;\n    }\n\n    var DefaultKeyValueDifferFactory = (function () {\n        function DefaultKeyValueDifferFactory() {\n        }\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || isJsObject(obj); };\n        /**\n         * @param {?} cdRef\n         * @return {?}\n         */\n        DefaultKeyValueDifferFactory.prototype.create = function (cdRef) { return new DefaultKeyValueDiffer(); };\n        return DefaultKeyValueDifferFactory;\n    }());\n    var DefaultKeyValueDiffer = (function () {\n        function DefaultKeyValueDiffer() {\n            this._records = new Map();\n            this._mapHead = null;\n            this._previousMapHead = null;\n            this._changesHead = null;\n            this._changesTail = null;\n            this._additionsHead = null;\n            this._additionsTail = null;\n            this._removalsHead = null;\n            this._removalsTail = null;\n        }\n        Object.defineProperty(DefaultKeyValueDiffer.prototype, \"isDirty\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._additionsHead !== null || this._changesHead !== null ||\n                    this._removalsHead !== null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._mapHead; record !== null; record = record._next) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._changesHead; record !== null; record = record._nextChanged) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {\n            var /** @type {?} */ record;\n            for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n                fn(record);\n            }\n        };\n        /**\n         * @param {?} map\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.diff = function (map) {\n            if (!map) {\n                map = new Map();\n            }\n            else if (!(map instanceof Map || isJsObject(map))) {\n                throw new Error(\"Error trying to diff '\" + map + \"'\");\n            }\n            return this.check(map) ? this : null;\n        };\n        /**\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.onDestroy = function () { };\n        /**\n         * @param {?} map\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.check = function (map) {\n            var _this = this;\n            this._reset();\n            var /** @type {?} */ records = this._records;\n            var /** @type {?} */ oldSeqRecord = this._mapHead;\n            var /** @type {?} */ lastOldSeqRecord = null;\n            var /** @type {?} */ lastNewSeqRecord = null;\n            var /** @type {?} */ seqChanged = false;\n            this._forEach(map, function (value, key) {\n                var /** @type {?} */ newSeqRecord;\n                if (oldSeqRecord && key === oldSeqRecord.key) {\n                    newSeqRecord = oldSeqRecord;\n                    _this._maybeAddToChanges(newSeqRecord, value);\n                }\n                else {\n                    seqChanged = true;\n                    if (oldSeqRecord !== null) {\n                        _this._removeFromSeq(lastOldSeqRecord, oldSeqRecord);\n                        _this._addToRemovals(oldSeqRecord);\n                    }\n                    if (records.has(key)) {\n                        newSeqRecord = records.get(key);\n                        _this._maybeAddToChanges(newSeqRecord, value);\n                    }\n                    else {\n                        newSeqRecord = new KeyValueChangeRecord(key);\n                        records.set(key, newSeqRecord);\n                        newSeqRecord.currentValue = value;\n                        _this._addToAdditions(newSeqRecord);\n                    }\n                }\n                if (seqChanged) {\n                    if (_this._isInRemovals(newSeqRecord)) {\n                        _this._removeFromRemovals(newSeqRecord);\n                    }\n                    if (lastNewSeqRecord == null) {\n                        _this._mapHead = newSeqRecord;\n                    }\n                    else {\n                        lastNewSeqRecord._next = newSeqRecord;\n                    }\n                }\n                lastOldSeqRecord = oldSeqRecord;\n                lastNewSeqRecord = newSeqRecord;\n                oldSeqRecord = oldSeqRecord && oldSeqRecord._next;\n            });\n            this._truncate(lastOldSeqRecord, oldSeqRecord);\n            return this.isDirty;\n        };\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._reset = function () {\n            if (this.isDirty) {\n                var /** @type {?} */ record = void 0;\n                // Record the state of the mapping\n                for (record = this._previousMapHead = this._mapHead; record !== null; record = record._next) {\n                    record._nextPrevious = record._next;\n                }\n                for (record = this._changesHead; record !== null; record = record._nextChanged) {\n                    record.previousValue = record.currentValue;\n                }\n                for (record = this._additionsHead; record != null; record = record._nextAdded) {\n                    record.previousValue = record.currentValue;\n                }\n                this._changesHead = this._changesTail = null;\n                this._additionsHead = this._additionsTail = null;\n                this._removalsHead = this._removalsTail = null;\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} lastRecord\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._truncate = function (lastRecord, record) {\n            while (record !== null) {\n                if (lastRecord === null) {\n                    this._mapHead = null;\n                }\n                else {\n                    lastRecord._next = null;\n                }\n                var /** @type {?} */ nextRecord = record._next;\n                this._addToRemovals(record);\n                lastRecord = record;\n                record = nextRecord;\n            }\n            for (var /** @type {?} */ rec = this._removalsHead; rec !== null; rec = rec._nextRemoved) {\n                rec.previousValue = rec.currentValue;\n                rec.currentValue = null;\n                this._records.delete(rec.key);\n            }\n        };\n        /**\n         * @param {?} record\n         * @param {?} newValue\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._maybeAddToChanges = function (record, newValue) {\n            if (!looseIdentical(newValue, record.currentValue)) {\n                record.previousValue = record.currentValue;\n                record.currentValue = newValue;\n                this._addToChanges(record);\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._isInRemovals = function (record) {\n            return record === this._removalsHead || record._nextRemoved !== null ||\n                record._prevRemoved !== null;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._addToRemovals = function (record) {\n            if (this._removalsHead === null) {\n                this._removalsHead = this._removalsTail = record;\n            }\n            else {\n                this._removalsTail._nextRemoved = record;\n                record._prevRemoved = this._removalsTail;\n                this._removalsTail = record;\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} prev\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._removeFromSeq = function (prev, record) {\n            var /** @type {?} */ next = record._next;\n            if (prev === null) {\n                this._mapHead = next;\n            }\n            else {\n                prev._next = next;\n            }\n            record._next = null;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._removeFromRemovals = function (record) {\n            var /** @type {?} */ prev = record._prevRemoved;\n            var /** @type {?} */ next = record._nextRemoved;\n            if (prev === null) {\n                this._removalsHead = next;\n            }\n            else {\n                prev._nextRemoved = next;\n            }\n            if (next === null) {\n                this._removalsTail = prev;\n            }\n            else {\n                next._prevRemoved = prev;\n            }\n            record._prevRemoved = record._nextRemoved = null;\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {\n            if (this._additionsHead === null) {\n                this._additionsHead = this._additionsTail = record;\n            }\n            else {\n                this._additionsTail._nextAdded = record;\n                this._additionsTail = record;\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} record\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._addToChanges = function (record) {\n            if (this._changesHead === null) {\n                this._changesHead = this._changesTail = record;\n            }\n            else {\n                this._changesTail._nextChanged = record;\n                this._changesTail = record;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype.toString = function () {\n            var /** @type {?} */ items = [];\n            var /** @type {?} */ previous = [];\n            var /** @type {?} */ changes = [];\n            var /** @type {?} */ additions = [];\n            var /** @type {?} */ removals = [];\n            var /** @type {?} */ record;\n            for (record = this._mapHead; record !== null; record = record._next) {\n                items.push(stringify(record));\n            }\n            for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {\n                previous.push(stringify(record));\n            }\n            for (record = this._changesHead; record !== null; record = record._nextChanged) {\n                changes.push(stringify(record));\n            }\n            for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n                additions.push(stringify(record));\n            }\n            for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n                removals.push(stringify(record));\n            }\n            return 'map: ' + items.join(', ') + '\\n' +\n                'previous: ' + previous.join(', ') + '\\n' +\n                'additions: ' + additions.join(', ') + '\\n' +\n                'changes: ' + changes.join(', ') + '\\n' +\n                'removals: ' + removals.join(', ') + '\\n';\n        };\n        /**\n         * \\@internal\n         * @param {?} obj\n         * @param {?} fn\n         * @return {?}\n         */\n        DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {\n            if (obj instanceof Map) {\n                obj.forEach(fn);\n            }\n            else {\n                Object.keys(obj).forEach(function (k) { return fn(obj[k], k); });\n            }\n        };\n        return DefaultKeyValueDiffer;\n    }());\n    /**\n     * \\@stable\n     */\n    var KeyValueChangeRecord = (function () {\n        /**\n         * @param {?} key\n         */\n        function KeyValueChangeRecord(key) {\n            this.key = key;\n            this.previousValue = null;\n            this.currentValue = null;\n            /** @internal */\n            this._nextPrevious = null;\n            /** @internal */\n            this._next = null;\n            /** @internal */\n            this._nextAdded = null;\n            /** @internal */\n            this._nextRemoved = null;\n            /** @internal */\n            this._prevRemoved = null;\n            /** @internal */\n            this._nextChanged = null;\n        }\n        /**\n         * @return {?}\n         */\n        KeyValueChangeRecord.prototype.toString = function () {\n            return looseIdentical(this.previousValue, this.currentValue) ?\n                stringify(this.key) :\n                (stringify(this.key) + '[' + stringify(this.previousValue) + '->' +\n                    stringify(this.currentValue) + ']');\n        };\n        return KeyValueChangeRecord;\n    }());\n\n    /**\n     * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.\n     * \\@stable\n     */\n    var IterableDiffers = (function () {\n        /**\n         * @param {?} factories\n         */\n        function IterableDiffers(factories) {\n            this.factories = factories;\n        }\n        /**\n         * @param {?} factories\n         * @param {?=} parent\n         * @return {?}\n         */\n        IterableDiffers.create = function (factories, parent) {\n            if (isPresent(parent)) {\n                var /** @type {?} */ copied = parent.factories.slice();\n                factories = factories.concat(copied);\n                return new IterableDiffers(factories);\n            }\n            else {\n                return new IterableDiffers(factories);\n            }\n        };\n        /**\n         * Takes an array of {\\@link IterableDifferFactory} and returns a provider used to extend the\n         * inherited {\\@link IterableDiffers} instance with the provided factories and return a new\n         * {\\@link IterableDiffers} instance.\n         *\n         * The following example shows how to extend an existing list of factories,\n         * which will only be applied to the injector for this component and its children.\n         * This step is all that's required to make a new {\\@link IterableDiffer} available.\n         *\n         * ### Example\n         *\n         * ```\n         * \\@Component({\n         *   viewProviders: [\n         *     IterableDiffers.extend([new ImmutableListDiffer()])\n         *   ]\n         * })\n         * ```\n         * @param {?} factories\n         * @return {?}\n         */\n        IterableDiffers.extend = function (factories) {\n            return {\n                provide: IterableDiffers,\n                useFactory: function (parent) {\n                    if (!parent) {\n                        // Typically would occur when calling IterableDiffers.extend inside of dependencies passed\n                        // to\n                        // bootstrap(), which would override default pipes instead of extending them.\n                        throw new Error('Cannot extend IterableDiffers without a parent injector');\n                    }\n                    return IterableDiffers.create(factories, parent);\n                },\n                // Dependency technically isn't optional, but we can provide a better error message this way.\n                deps: [[IterableDiffers, new SkipSelf(), new Optional()]]\n            };\n        };\n        /**\n         * @param {?} iterable\n         * @return {?}\n         */\n        IterableDiffers.prototype.find = function (iterable) {\n            var /** @type {?} */ factory = this.factories.find(function (f) { return f.supports(iterable); });\n            if (isPresent(factory)) {\n                return factory;\n            }\n            else {\n                throw new Error(\"Cannot find a differ supporting object '\" + iterable + \"' of type '\" + getTypeNameForDebugging(iterable) + \"'\");\n            }\n        };\n        return IterableDiffers;\n    }());\n\n    /**\n     * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.\n     * \\@stable\n     */\n    var KeyValueDiffers = (function () {\n        /**\n         * @param {?} factories\n         */\n        function KeyValueDiffers(factories) {\n            this.factories = factories;\n        }\n        /**\n         * @param {?} factories\n         * @param {?=} parent\n         * @return {?}\n         */\n        KeyValueDiffers.create = function (factories, parent) {\n            if (isPresent(parent)) {\n                var /** @type {?} */ copied = parent.factories.slice();\n                factories = factories.concat(copied);\n                return new KeyValueDiffers(factories);\n            }\n            else {\n                return new KeyValueDiffers(factories);\n            }\n        };\n        /**\n         * Takes an array of {\\@link KeyValueDifferFactory} and returns a provider used to extend the\n         * inherited {\\@link KeyValueDiffers} instance with the provided factories and return a new\n         * {\\@link KeyValueDiffers} instance.\n         *\n         * The following example shows how to extend an existing list of factories,\n         * which will only be applied to the injector for this component and its children.\n         * This step is all that's required to make a new {\\@link KeyValueDiffer} available.\n         *\n         * ### Example\n         *\n         * ```\n         * \\@Component({\n         *   viewProviders: [\n         *     KeyValueDiffers.extend([new ImmutableMapDiffer()])\n         *   ]\n         * })\n         * ```\n         * @param {?} factories\n         * @return {?}\n         */\n        KeyValueDiffers.extend = function (factories) {\n            return {\n                provide: KeyValueDiffers,\n                useFactory: function (parent) {\n                    if (!parent) {\n                        // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed\n                        // to\n                        // bootstrap(), which would override default pipes instead of extending them.\n                        throw new Error('Cannot extend KeyValueDiffers without a parent injector');\n                    }\n                    return KeyValueDiffers.create(factories, parent);\n                },\n                // Dependency technically isn't optional, but we can provide a better error message this way.\n                deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]]\n            };\n        };\n        /**\n         * @param {?} kv\n         * @return {?}\n         */\n        KeyValueDiffers.prototype.find = function (kv) {\n            var /** @type {?} */ factory = this.factories.find(function (f) { return f.supports(kv); });\n            if (isPresent(factory)) {\n                return factory;\n            }\n            else {\n                throw new Error(\"Cannot find a differ supporting object '\" + kv + \"'\");\n            }\n        };\n        return KeyValueDiffers;\n    }());\n\n    var /** @type {?} */ UNINITIALIZED = {\n        toString: function () { return 'CD_INIT_VALUE'; }\n    };\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function devModeEqual(a, b) {\n        if (isListLikeIterable(a) && isListLikeIterable(b)) {\n            return areIterablesEqual(a, b, devModeEqual);\n        }\n        else if (!isListLikeIterable(a) && !isPrimitive(a) && !isListLikeIterable(b) && !isPrimitive(b)) {\n            return true;\n        }\n        else {\n            return looseIdentical(a, b);\n        }\n    }\n    /**\n     * Indicates that the result of a {\\@link Pipe} transformation has changed even though the\n     * reference\n     * has not changed.\n     *\n     * The wrapped value will be unwrapped by change detection, and the unwrapped value will be stored.\n     *\n     * Example:\n     *\n     * ```\n     * if (this._latestValue === this._latestReturnedValue) {\n     *    return this._latestReturnedValue;\n     *  } else {\n     *    this._latestReturnedValue = this._latestValue;\n     *    return WrappedValue.wrap(this._latestValue); // this will force update\n     *  }\n     * ```\n     * \\@stable\n     */\n    var WrappedValue = (function () {\n        /**\n         * @param {?} wrapped\n         */\n        function WrappedValue(wrapped) {\n            this.wrapped = wrapped;\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        WrappedValue.wrap = function (value) { return new WrappedValue(value); };\n        return WrappedValue;\n    }());\n    /**\n     * Helper class for unwrapping WrappedValue s\n     */\n    var ValueUnwrapper = (function () {\n        function ValueUnwrapper() {\n            this.hasWrappedValue = false;\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ValueUnwrapper.prototype.unwrap = function (value) {\n            if (value instanceof WrappedValue) {\n                this.hasWrappedValue = true;\n                return value.wrapped;\n            }\n            return value;\n        };\n        /**\n         * @return {?}\n         */\n        ValueUnwrapper.prototype.reset = function () { this.hasWrappedValue = false; };\n        return ValueUnwrapper;\n    }());\n    /**\n     * Represents a basic change from a previous to a new value.\n     * \\@stable\n     */\n    var SimpleChange = (function () {\n        /**\n         * @param {?} previousValue\n         * @param {?} currentValue\n         */\n        function SimpleChange(previousValue, currentValue) {\n            this.previousValue = previousValue;\n            this.currentValue = currentValue;\n        }\n        /**\n         * Check whether the new value is the first value assigned.\n         * @return {?}\n         */\n        SimpleChange.prototype.isFirstChange = function () { return this.previousValue === UNINITIALIZED; };\n        return SimpleChange;\n    }());\n\n    /**\n     * \\@stable\n     * @abstract\n     */\n    var ChangeDetectorRef = (function () {\n        function ChangeDetectorRef() {\n        }\n        /**\n         * Marks all {\\@link ChangeDetectionStrategy#OnPush} ancestors as to be checked.\n         *\n         * <!-- TODO: Add a link to a chapter on OnPush components -->\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/GC512b?p=preview))\n         *\n         * ```typescript\n         * \\@Component({\n         *   selector: 'cmp',\n         *   changeDetection: ChangeDetectionStrategy.OnPush,\n         *   template: `Number of ticks: {{numberOfTicks}}`\n         * })\n         * class Cmp {\n         *   numberOfTicks = 0;\n         *\n         *   constructor(ref: ChangeDetectorRef) {\n         *     setInterval(() => {\n         *       this.numberOfTicks ++\n         *       // the following is required, otherwise the view will not be updated\n         *       this.ref.markForCheck();\n         *     }, 1000);\n         *   }\n         * }\n         *\n         * \\@Component({\n         *   selector: 'app',\n         *   changeDetection: ChangeDetectionStrategy.OnPush,\n         *   template: `\n         *     <cmp><cmp>\n         *   `,\n         * })\n         * class App {\n         * }\n         * ```\n         * @abstract\n         * @return {?}\n         */\n        ChangeDetectorRef.prototype.markForCheck = function () { };\n        /**\n         * Detaches the change detector from the change detector tree.\n         *\n         * The detached change detector will not be checked until it is reattached.\n         *\n         * This can also be used in combination with {\\@link ChangeDetectorRef#detectChanges} to implement\n         * local change\n         * detection checks.\n         *\n         * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n         * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n         *\n         * ### Example\n         *\n         * The following example defines a component with a large list of readonly data.\n         * Imagine the data changes constantly, many times per second. For performance reasons,\n         * we want to check and update the list every five seconds. We can do that by detaching\n         * the component's change detector and doing a local check every five seconds.\n         *\n         * ```typescript\n         * class DataProvider {\n         *   // in a real application the returned data will be different every time\n         *   get data() {\n         *     return [1,2,3,4,5];\n         *   }\n         * }\n         *\n         * \\@Component({\n         *   selector: 'giant-list',\n         *   template: `\n         *     <li *ngFor=\"let d of dataProvider.data\">Data {{d}}</lig>\n         *   `,\n         * })\n         * class GiantList {\n         *   constructor(private ref: ChangeDetectorRef, private dataProvider:DataProvider) {\n         *     ref.detach();\n         *     setInterval(() => {\n         *       this.ref.detectChanges();\n         *     }, 5000);\n         *   }\n         * }\n         *\n         * \\@Component({\n         *   selector: 'app',\n         *   providers: [DataProvider],\n         *   template: `\n         *     <giant-list><giant-list>\n         *   `,\n         * })\n         * class App {\n         * }\n         * ```\n         * @abstract\n         * @return {?}\n         */\n        ChangeDetectorRef.prototype.detach = function () { };\n        /**\n         * Checks the change detector and its children.\n         *\n         * This can also be used in combination with {\\@link ChangeDetectorRef#detach} to implement local\n         * change detection\n         * checks.\n         *\n         * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n         * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n         *\n         * ### Example\n         *\n         * The following example defines a component with a large list of readonly data.\n         * Imagine, the data changes constantly, many times per second. For performance reasons,\n         * we want to check and update the list every five seconds.\n         *\n         * We can do that by detaching the component's change detector and doing a local change detection\n         * check\n         * every five seconds.\n         *\n         * See {\\@link ChangeDetectorRef#detach} for more information.\n         * @abstract\n         * @return {?}\n         */\n        ChangeDetectorRef.prototype.detectChanges = function () { };\n        /**\n         * Checks the change detector and its children, and throws if any changes are detected.\n         *\n         * This is used in development mode to verify that running change detection doesn't introduce\n         * other changes.\n         * @abstract\n         * @return {?}\n         */\n        ChangeDetectorRef.prototype.checkNoChanges = function () { };\n        /**\n         * Reattach the change detector to the change detector tree.\n         *\n         * This also marks OnPush ancestors as to be checked. This reattached change detector will be\n         * checked during the next change detection run.\n         *\n         * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/aUhZha?p=preview))\n         *\n         * The following example creates a component displaying `live` data. The component will detach\n         * its change detector from the main change detector tree when the component's live property\n         * is set to false.\n         *\n         * ```typescript\n         * class DataProvider {\n         *   data = 1;\n         *\n         *   constructor() {\n         *     setInterval(() => {\n         *       this.data = this.data * 2;\n         *     }, 500);\n         *   }\n         * }\n         *\n         * \\@Component({\n         *   selector: 'live-data',\n         *   inputs: ['live'],\n         *   template: 'Data: {{dataProvider.data}}'\n         * })\n         * class LiveData {\n         *   constructor(private ref: ChangeDetectorRef, private dataProvider:DataProvider) {}\n         *\n         *   set live(value) {\n         *     if (value)\n         *       this.ref.reattach();\n         *     else\n         *       this.ref.detach();\n         *   }\n         * }\n         *\n         * \\@Component({\n         *   selector: 'app',\n         *   providers: [DataProvider],\n         *   template: `\n         *     Live Update: <input type=\"checkbox\" [(ngModel)]=\"live\">\n         *     <live-data [live]=\"live\"><live-data>\n         *   `,\n         * })\n         * class App {\n         *   live = true;\n         * }\n         * ```\n         * @abstract\n         * @return {?}\n         */\n        ChangeDetectorRef.prototype.reattach = function () { };\n        return ChangeDetectorRef;\n    }());\n\n    /**\n     * Structural diffing for `Object`s and `Map`s.\n     */\n    var /** @type {?} */ keyValDiff = [new DefaultKeyValueDifferFactory()];\n    /**\n     * Structural diffing for `Iterable` types such as `Array`s.\n     */\n    var /** @type {?} */ iterableDiff = [new DefaultIterableDifferFactory()];\n    var /** @type {?} */ defaultIterableDiffers = new IterableDiffers(iterableDiff);\n    var /** @type {?} */ defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var RenderComponentType = (function () {\n        /**\n         * @param {?} id\n         * @param {?} templateUrl\n         * @param {?} slotCount\n         * @param {?} encapsulation\n         * @param {?} styles\n         * @param {?} animations\n         */\n        function RenderComponentType(id, templateUrl, slotCount, encapsulation, styles, animations) {\n            this.id = id;\n            this.templateUrl = templateUrl;\n            this.slotCount = slotCount;\n            this.encapsulation = encapsulation;\n            this.styles = styles;\n            this.animations = animations;\n        }\n        return RenderComponentType;\n    }());\n    /**\n     * @abstract\n     */\n    var RenderDebugInfo = (function () {\n        function RenderDebugInfo() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.injector = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.component = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.providerTokens = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.references = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.context = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderDebugInfo.prototype.source = function () { };\n        return RenderDebugInfo;\n    }());\n    /**\n     * \\@experimental\n     * @abstract\n     */\n    var Renderer = (function () {\n        function Renderer() {\n        }\n        /**\n         * @abstract\n         * @param {?} selectorOrNode\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        Renderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) { };\n        /**\n         * @abstract\n         * @param {?} parentElement\n         * @param {?} name\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        Renderer.prototype.createElement = function (parentElement, name, debugInfo) { };\n        /**\n         * @abstract\n         * @param {?} hostElement\n         * @return {?}\n         */\n        Renderer.prototype.createViewRoot = function (hostElement) { };\n        /**\n         * @abstract\n         * @param {?} parentElement\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        Renderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) { };\n        /**\n         * @abstract\n         * @param {?} parentElement\n         * @param {?} value\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        Renderer.prototype.createText = function (parentElement, value, debugInfo) { };\n        /**\n         * @abstract\n         * @param {?} parentElement\n         * @param {?} nodes\n         * @return {?}\n         */\n        Renderer.prototype.projectNodes = function (parentElement, nodes) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        Renderer.prototype.attachViewAfter = function (node, viewRootNodes) { };\n        /**\n         * @abstract\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        Renderer.prototype.detachView = function (viewRootNodes) { };\n        /**\n         * @abstract\n         * @param {?} hostElement\n         * @param {?} viewAllNodes\n         * @return {?}\n         */\n        Renderer.prototype.destroyView = function (hostElement, viewAllNodes) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        Renderer.prototype.listen = function (renderElement, name, callback) { };\n        /**\n         * @abstract\n         * @param {?} target\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        Renderer.prototype.listenGlobal = function (target, name, callback) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        Renderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} attributeName\n         * @param {?} attributeValue\n         * @return {?}\n         */\n        Renderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) { };\n        /**\n         * Used only in debug mode to serialize property changes to dom nodes as attributes.\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        Renderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} className\n         * @param {?} isAdd\n         * @return {?}\n         */\n        Renderer.prototype.setElementClass = function (renderElement, className, isAdd) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} styleName\n         * @param {?} styleValue\n         * @return {?}\n         */\n        Renderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) { };\n        /**\n         * @abstract\n         * @param {?} renderElement\n         * @param {?} methodName\n         * @param {?=} args\n         * @return {?}\n         */\n        Renderer.prototype.invokeElementMethod = function (renderElement, methodName, args) { };\n        /**\n         * @abstract\n         * @param {?} renderNode\n         * @param {?} text\n         * @return {?}\n         */\n        Renderer.prototype.setText = function (renderNode, text) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        Renderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) { };\n        return Renderer;\n    }());\n    /**\n     * Injectable service that provides a low-level interface for modifying the UI.\n     *\n     * Use this service to bypass Angular's templating and make custom UI changes that can't be\n     * expressed declaratively. For example if you need to set a property or an attribute whose name is\n     * not statically known, use {\\@link #setElementProperty} or {\\@link #setElementAttribute}\n     * respectively.\n     *\n     * If you are implementing a custom renderer, you must implement this interface.\n     *\n     * The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.\n     * \\@experimental\n     * @abstract\n     */\n    var RootRenderer = (function () {\n        function RootRenderer() {\n        }\n        /**\n         * @abstract\n         * @param {?} componentType\n         * @return {?}\n         */\n        RootRenderer.prototype.renderComponent = function (componentType) { };\n        return RootRenderer;\n    }());\n\n    var SecurityContext = {};\n    SecurityContext.NONE = 0;\n    SecurityContext.HTML = 1;\n    SecurityContext.STYLE = 2;\n    SecurityContext.SCRIPT = 3;\n    SecurityContext.URL = 4;\n    SecurityContext.RESOURCE_URL = 5;\n    SecurityContext[SecurityContext.NONE] = \"NONE\";\n    SecurityContext[SecurityContext.HTML] = \"HTML\";\n    SecurityContext[SecurityContext.STYLE] = \"STYLE\";\n    SecurityContext[SecurityContext.SCRIPT] = \"SCRIPT\";\n    SecurityContext[SecurityContext.URL] = \"URL\";\n    SecurityContext[SecurityContext.RESOURCE_URL] = \"RESOURCE_URL\";\n    /**\n     * Sanitizer is used by the views to sanitize potentially dangerous values.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var Sanitizer = (function () {\n        function Sanitizer() {\n        }\n        /**\n         * @abstract\n         * @param {?} context\n         * @param {?} value\n         * @return {?}\n         */\n        Sanitizer.prototype.sanitize = function (context, value) { };\n        return Sanitizer;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$7 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * An error thrown if application changes model breaking the top-down data flow.\n     *\n     * This exception is only thrown in dev mode.\n     *\n     * <!-- TODO: Add a link once the dev mode option is configurable -->\n     *\n     * ### Example\n     *\n     * ```typescript\n     * \\@Component({\n     *   selector: 'parent',\n     *   template: '<child [prop]=\"parentProp\"></child>',\n     * })\n     * class Parent {\n     *   parentProp = 'init';\n     * }\n     *\n     * \\@Directive({selector: 'child', inputs: ['prop']})\n     * class Child {\n     *   constructor(public parent: Parent) {}\n     *\n     *   set prop(v) {\n     *     // this updates the parent property, which is disallowed during change detection\n     *     // this will result in ExpressionChangedAfterItHasBeenCheckedError\n     *     this.parent.parentProp = 'updated';\n     *   }\n     * }\n     * ```\n     * \\@stable\n     */\n    var ExpressionChangedAfterItHasBeenCheckedError = (function (_super) {\n        __extends$7(ExpressionChangedAfterItHasBeenCheckedError, _super);\n        /**\n         * @param {?} oldValue\n         * @param {?} currValue\n         */\n        function ExpressionChangedAfterItHasBeenCheckedError(oldValue, currValue) {\n            var msg = \"Expression has changed after it was checked. Previous value: '\" + oldValue + \"'. Current value: '\" + currValue + \"'.\";\n            if (oldValue === UNINITIALIZED) {\n                msg +=\n                    \" It seems like the view has been created after its parent and its children have been dirty checked.\" +\n                        \" Has it been created in a change detection hook ?\";\n            }\n            _super.call(this, msg);\n        }\n        return ExpressionChangedAfterItHasBeenCheckedError;\n    }(BaseError));\n    /**\n     * Thrown when an exception was raised during view creation, change detection or destruction.\n     *\n     * This error wraps the original exception to attach additional contextual information that can\n     * be useful for debugging.\n     * \\@stable\n     */\n    var ViewWrappedError = (function (_super) {\n        __extends$7(ViewWrappedError, _super);\n        /**\n         * @param {?} originalError\n         * @param {?} context\n         */\n        function ViewWrappedError(originalError, context) {\n            _super.call(this, \"Error in \" + context.source, originalError);\n            this.context = context;\n        }\n        return ViewWrappedError;\n    }(WrappedError));\n    /**\n     * Thrown when a destroyed view is used.\n     *\n     * This error indicates a bug in the framework.\n     *\n     * This is an internal Angular error.\n     * \\@stable\n     */\n    var ViewDestroyedError = (function (_super) {\n        __extends$7(ViewDestroyedError, _super);\n        /**\n         * @param {?} details\n         */\n        function ViewDestroyedError(details) {\n            _super.call(this, \"Attempt to use a destroyed view: \" + details);\n        }\n        return ViewDestroyedError;\n    }(BaseError));\n\n    var ViewUtils = (function () {\n        /**\n         * @param {?} _renderer\n         * @param {?} sanitizer\n         * @param {?} animationQueue\n         */\n        function ViewUtils(_renderer, sanitizer, animationQueue) {\n            this._renderer = _renderer;\n            this.animationQueue = animationQueue;\n            this.sanitizer = sanitizer;\n        }\n        /**\n         * \\@internal\n         * @param {?} renderComponentType\n         * @return {?}\n         */\n        ViewUtils.prototype.renderComponent = function (renderComponentType) {\n            return this._renderer.renderComponent(renderComponentType);\n        };\n        ViewUtils.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        ViewUtils.ctorParameters = function () { return [\n            { type: RootRenderer, },\n            { type: Sanitizer, },\n            { type: AnimationQueue, },\n        ]; };\n        return ViewUtils;\n    }());\n    var /** @type {?} */ nextRenderComponentTypeId = 0;\n    /**\n     * @param {?} templateUrl\n     * @param {?} slotCount\n     * @param {?} encapsulation\n     * @param {?} styles\n     * @param {?} animations\n     * @return {?}\n     */\n    function createRenderComponentType(templateUrl, slotCount, encapsulation, styles, animations) {\n        return new RenderComponentType(\"\" + nextRenderComponentTypeId++, templateUrl, slotCount, encapsulation, styles, animations);\n    }\n    /**\n     * @param {?} e\n     * @param {?} array\n     * @return {?}\n     */\n    function addToArray(e, array) {\n        array.push(e);\n    }\n    /**\n     * @param {?} valueCount\n     * @param {?} constAndInterp\n     * @return {?}\n     */\n    function interpolate(valueCount, constAndInterp) {\n        var /** @type {?} */ result = '';\n        for (var /** @type {?} */ i = 0; i < valueCount * 2; i = i + 2) {\n            result = result + constAndInterp[i] + _toStringWithNull(constAndInterp[i + 1]);\n        }\n        return result + constAndInterp[valueCount * 2];\n    }\n    /**\n     * @param {?} valueCount\n     * @param {?} c0\n     * @param {?} a1\n     * @param {?} c1\n     * @param {?=} a2\n     * @param {?=} c2\n     * @param {?=} a3\n     * @param {?=} c3\n     * @param {?=} a4\n     * @param {?=} c4\n     * @param {?=} a5\n     * @param {?=} c5\n     * @param {?=} a6\n     * @param {?=} c6\n     * @param {?=} a7\n     * @param {?=} c7\n     * @param {?=} a8\n     * @param {?=} c8\n     * @param {?=} a9\n     * @param {?=} c9\n     * @return {?}\n     */\n    function inlineInterpolate(valueCount, c0, a1, c1, a2, c2, a3, c3, a4, c4, a5, c5, a6, c6, a7, c7, a8, c8, a9, c9) {\n        switch (valueCount) {\n            case 1:\n                return c0 + _toStringWithNull(a1) + c1;\n            case 2:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2;\n            case 3:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3;\n            case 4:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4;\n            case 5:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5;\n            case 6:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) + c6;\n            case 7:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n                    c6 + _toStringWithNull(a7) + c7;\n            case 8:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n                    c6 + _toStringWithNull(a7) + c7 + _toStringWithNull(a8) + c8;\n            case 9:\n                return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n                    c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n                    c6 + _toStringWithNull(a7) + c7 + _toStringWithNull(a8) + c8 + _toStringWithNull(a9) + c9;\n            default:\n                throw new Error(\"Does not support more than 9 expressions\");\n        }\n    }\n    /**\n     * @param {?} v\n     * @return {?}\n     */\n    function _toStringWithNull(v) {\n        return v != null ? v.toString() : '';\n    }\n    /**\n     * @param {?} throwOnChange\n     * @param {?} oldValue\n     * @param {?} newValue\n     * @return {?}\n     */\n    function checkBinding(throwOnChange, oldValue, newValue) {\n        if (throwOnChange) {\n            if (!devModeEqual(oldValue, newValue)) {\n                throw new ExpressionChangedAfterItHasBeenCheckedError(oldValue, newValue);\n            }\n            return false;\n        }\n        else {\n            return !looseIdentical(oldValue, newValue);\n        }\n    }\n    /**\n     * @param {?} input\n     * @param {?} value\n     * @return {?}\n     */\n    function castByValue(input, value) {\n        return (input);\n    }\n    var /** @type {?} */ EMPTY_ARRAY = [];\n    var /** @type {?} */ EMPTY_MAP = {};\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy1(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0 = UNINITIALIZED;\n        return function (p0) {\n            if (!looseIdentical(v0, p0)) {\n                v0 = p0;\n                result = fn(p0);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy2(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0 = UNINITIALIZED;\n        var /** @type {?} */ v1 = UNINITIALIZED;\n        return function (p0, p1) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1)) {\n                v0 = p0;\n                v1 = p1;\n                result = fn(p0, p1);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy3(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0 = UNINITIALIZED;\n        var /** @type {?} */ v1 = UNINITIALIZED;\n        var /** @type {?} */ v2 = UNINITIALIZED;\n        return function (p0, p1, p2) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                result = fn(p0, p1, p2);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy4(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3;\n        v0 = v1 = v2 = v3 = UNINITIALIZED;\n        return function (p0, p1, p2, p3) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                result = fn(p0, p1, p2, p3);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy5(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4;\n        v0 = v1 = v2 = v3 = v4 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                result = fn(p0, p1, p2, p3, p4);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy6(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5;\n        v0 = v1 = v2 = v3 = v4 = v5 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4, p5) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                v5 = p5;\n                result = fn(p0, p1, p2, p3, p4, p5);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy7(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6;\n        v0 = v1 = v2 = v3 = v4 = v5 = v6 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4, p5, p6) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n                !looseIdentical(v6, p6)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                v5 = p5;\n                v6 = p6;\n                result = fn(p0, p1, p2, p3, p4, p5, p6);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy8(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7;\n        v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4, p5, p6, p7) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n                !looseIdentical(v6, p6) || !looseIdentical(v7, p7)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                v5 = p5;\n                v6 = p6;\n                v7 = p7;\n                result = fn(p0, p1, p2, p3, p4, p5, p6, p7);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy9(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7, /** @type {?} */ v8;\n        v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4, p5, p6, p7, p8) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n                !looseIdentical(v6, p6) || !looseIdentical(v7, p7) || !looseIdentical(v8, p8)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                v5 = p5;\n                v6 = p6;\n                v7 = p7;\n                v8 = p8;\n                result = fn(p0, p1, p2, p3, p4, p5, p6, p7, p8);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} fn\n     * @return {?}\n     */\n    function pureProxy10(fn) {\n        var /** @type {?} */ result;\n        var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7, /** @type {?} */ v8, /** @type {?} */ v9;\n        v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = UNINITIALIZED;\n        return function (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) {\n            if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n                !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n                !looseIdentical(v6, p6) || !looseIdentical(v7, p7) || !looseIdentical(v8, p8) ||\n                !looseIdentical(v9, p9)) {\n                v0 = p0;\n                v1 = p1;\n                v2 = p2;\n                v3 = p3;\n                v4 = p4;\n                v5 = p5;\n                v6 = p6;\n                v7 = p7;\n                v8 = p8;\n                v9 = p9;\n                result = fn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);\n            }\n            return result;\n        };\n    }\n    /**\n     * @param {?} renderer\n     * @param {?} el\n     * @param {?} changes\n     * @return {?}\n     */\n    function setBindingDebugInfoForChanges(renderer, el, changes) {\n        Object.keys(changes).forEach(function (propName) {\n            setBindingDebugInfo(renderer, el, propName, changes[propName].currentValue);\n        });\n    }\n    /**\n     * @param {?} renderer\n     * @param {?} el\n     * @param {?} propName\n     * @param {?} value\n     * @return {?}\n     */\n    function setBindingDebugInfo(renderer, el, propName, value) {\n        try {\n            renderer.setBindingDebugInfo(el, \"ng-reflect-\" + camelCaseToDashCase(propName), value ? value.toString() : null);\n        }\n        catch (e) {\n            renderer.setBindingDebugInfo(el, \"ng-reflect-\" + camelCaseToDashCase(propName), '[ERROR] Exception while trying to serialize the value');\n        }\n    }\n    var /** @type {?} */ CAMEL_CASE_REGEXP = /([A-Z])/g;\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function camelCaseToDashCase(input) {\n        return input.replace(CAMEL_CASE_REGEXP, function () {\n            var m = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                m[_i - 0] = arguments[_i];\n            }\n            return '-' + m[1].toLowerCase();\n        });\n    }\n    /**\n     * @param {?} renderer\n     * @param {?} parentElement\n     * @param {?} name\n     * @param {?} attrs\n     * @param {?=} debugInfo\n     * @return {?}\n     */\n    function createRenderElement(renderer, parentElement, name, attrs, debugInfo) {\n        var /** @type {?} */ el = renderer.createElement(parentElement, name, debugInfo);\n        for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n            renderer.setElementAttribute(el, attrs.get(i), attrs.get(i + 1));\n        }\n        return el;\n    }\n    /**\n     * @param {?} renderer\n     * @param {?} elementName\n     * @param {?} attrs\n     * @param {?} rootSelectorOrNode\n     * @param {?=} debugInfo\n     * @return {?}\n     */\n    function selectOrCreateRenderHostElement(renderer, elementName, attrs, rootSelectorOrNode, debugInfo) {\n        var /** @type {?} */ hostElement;\n        if (isPresent(rootSelectorOrNode)) {\n            hostElement = renderer.selectRootElement(rootSelectorOrNode, debugInfo);\n            for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n                renderer.setElementAttribute(hostElement, attrs.get(i), attrs.get(i + 1));\n            }\n            renderer.setElementAttribute(hostElement, 'ng-version', VERSION.full);\n        }\n        else {\n            hostElement = createRenderElement(renderer, null, elementName, attrs, debugInfo);\n        }\n        return hostElement;\n    }\n    /**\n     * @param {?} view\n     * @param {?} element\n     * @param {?} eventNamesAndTargets\n     * @param {?} listener\n     * @return {?}\n     */\n    function subscribeToRenderElement(view, element, eventNamesAndTargets, listener) {\n        var /** @type {?} */ disposables = createEmptyInlineArray(eventNamesAndTargets.length / 2);\n        for (var /** @type {?} */ i = 0; i < eventNamesAndTargets.length; i += 2) {\n            var /** @type {?} */ eventName = eventNamesAndTargets.get(i);\n            var /** @type {?} */ eventTarget = eventNamesAndTargets.get(i + 1);\n            var /** @type {?} */ disposable = void 0;\n            if (eventTarget) {\n                disposable = view.renderer.listenGlobal(eventTarget, eventName, listener.bind(view, eventTarget + \":\" + eventName));\n            }\n            else {\n                disposable = view.renderer.listen(element, eventName, listener.bind(view, eventName));\n            }\n            disposables.set(i / 2, disposable);\n        }\n        return disposeInlineArray.bind(null, disposables);\n    }\n    /**\n     * @param {?} disposables\n     * @return {?}\n     */\n    function disposeInlineArray(disposables) {\n        for (var /** @type {?} */ i = 0; i < disposables.length; i++) {\n            disposables.get(i)();\n        }\n    }\n    /**\n     * @return {?}\n     */\n    function noop() { }\n    /**\n     * @param {?} length\n     * @return {?}\n     */\n    function createEmptyInlineArray(length) {\n        var /** @type {?} */ ctor;\n        if (length <= 2) {\n            ctor = InlineArray2;\n        }\n        else if (length <= 4) {\n            ctor = InlineArray4;\n        }\n        else if (length <= 8) {\n            ctor = InlineArray8;\n        }\n        else if (length <= 16) {\n            ctor = InlineArray16;\n        }\n        else {\n            ctor = InlineArrayDynamic;\n        }\n        return new ctor(length);\n    }\n    var InlineArray0 = (function () {\n        function InlineArray0() {\n            this.length = 0;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArray0.prototype.get = function (index) { return undefined; };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArray0.prototype.set = function (index, value) { };\n        return InlineArray0;\n    }());\n    var InlineArray2 = (function () {\n        /**\n         * @param {?} length\n         * @param {?=} _v0\n         * @param {?=} _v1\n         */\n        function InlineArray2(length, _v0, _v1) {\n            this.length = length;\n            this._v0 = _v0;\n            this._v1 = _v1;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArray2.prototype.get = function (index) {\n            switch (index) {\n                case 0:\n                    return this._v0;\n                case 1:\n                    return this._v1;\n                default:\n                    return undefined;\n            }\n        };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArray2.prototype.set = function (index, value) {\n            switch (index) {\n                case 0:\n                    this._v0 = value;\n                    break;\n                case 1:\n                    this._v1 = value;\n                    break;\n            }\n        };\n        return InlineArray2;\n    }());\n    var InlineArray4 = (function () {\n        /**\n         * @param {?} length\n         * @param {?=} _v0\n         * @param {?=} _v1\n         * @param {?=} _v2\n         * @param {?=} _v3\n         */\n        function InlineArray4(length, _v0, _v1, _v2, _v3) {\n            this.length = length;\n            this._v0 = _v0;\n            this._v1 = _v1;\n            this._v2 = _v2;\n            this._v3 = _v3;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArray4.prototype.get = function (index) {\n            switch (index) {\n                case 0:\n                    return this._v0;\n                case 1:\n                    return this._v1;\n                case 2:\n                    return this._v2;\n                case 3:\n                    return this._v3;\n                default:\n                    return undefined;\n            }\n        };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArray4.prototype.set = function (index, value) {\n            switch (index) {\n                case 0:\n                    this._v0 = value;\n                    break;\n                case 1:\n                    this._v1 = value;\n                    break;\n                case 2:\n                    this._v2 = value;\n                    break;\n                case 3:\n                    this._v3 = value;\n                    break;\n            }\n        };\n        return InlineArray4;\n    }());\n    var InlineArray8 = (function () {\n        /**\n         * @param {?} length\n         * @param {?=} _v0\n         * @param {?=} _v1\n         * @param {?=} _v2\n         * @param {?=} _v3\n         * @param {?=} _v4\n         * @param {?=} _v5\n         * @param {?=} _v6\n         * @param {?=} _v7\n         */\n        function InlineArray8(length, _v0, _v1, _v2, _v3, _v4, _v5, _v6, _v7) {\n            this.length = length;\n            this._v0 = _v0;\n            this._v1 = _v1;\n            this._v2 = _v2;\n            this._v3 = _v3;\n            this._v4 = _v4;\n            this._v5 = _v5;\n            this._v6 = _v6;\n            this._v7 = _v7;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArray8.prototype.get = function (index) {\n            switch (index) {\n                case 0:\n                    return this._v0;\n                case 1:\n                    return this._v1;\n                case 2:\n                    return this._v2;\n                case 3:\n                    return this._v3;\n                case 4:\n                    return this._v4;\n                case 5:\n                    return this._v5;\n                case 6:\n                    return this._v6;\n                case 7:\n                    return this._v7;\n                default:\n                    return undefined;\n            }\n        };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArray8.prototype.set = function (index, value) {\n            switch (index) {\n                case 0:\n                    this._v0 = value;\n                    break;\n                case 1:\n                    this._v1 = value;\n                    break;\n                case 2:\n                    this._v2 = value;\n                    break;\n                case 3:\n                    this._v3 = value;\n                    break;\n                case 4:\n                    this._v4 = value;\n                    break;\n                case 5:\n                    this._v5 = value;\n                    break;\n                case 6:\n                    this._v6 = value;\n                    break;\n                case 7:\n                    this._v7 = value;\n                    break;\n            }\n        };\n        return InlineArray8;\n    }());\n    var InlineArray16 = (function () {\n        /**\n         * @param {?} length\n         * @param {?=} _v0\n         * @param {?=} _v1\n         * @param {?=} _v2\n         * @param {?=} _v3\n         * @param {?=} _v4\n         * @param {?=} _v5\n         * @param {?=} _v6\n         * @param {?=} _v7\n         * @param {?=} _v8\n         * @param {?=} _v9\n         * @param {?=} _v10\n         * @param {?=} _v11\n         * @param {?=} _v12\n         * @param {?=} _v13\n         * @param {?=} _v14\n         * @param {?=} _v15\n         */\n        function InlineArray16(length, _v0, _v1, _v2, _v3, _v4, _v5, _v6, _v7, _v8, _v9, _v10, _v11, _v12, _v13, _v14, _v15) {\n            this.length = length;\n            this._v0 = _v0;\n            this._v1 = _v1;\n            this._v2 = _v2;\n            this._v3 = _v3;\n            this._v4 = _v4;\n            this._v5 = _v5;\n            this._v6 = _v6;\n            this._v7 = _v7;\n            this._v8 = _v8;\n            this._v9 = _v9;\n            this._v10 = _v10;\n            this._v11 = _v11;\n            this._v12 = _v12;\n            this._v13 = _v13;\n            this._v14 = _v14;\n            this._v15 = _v15;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArray16.prototype.get = function (index) {\n            switch (index) {\n                case 0:\n                    return this._v0;\n                case 1:\n                    return this._v1;\n                case 2:\n                    return this._v2;\n                case 3:\n                    return this._v3;\n                case 4:\n                    return this._v4;\n                case 5:\n                    return this._v5;\n                case 6:\n                    return this._v6;\n                case 7:\n                    return this._v7;\n                case 8:\n                    return this._v8;\n                case 9:\n                    return this._v9;\n                case 10:\n                    return this._v10;\n                case 11:\n                    return this._v11;\n                case 12:\n                    return this._v12;\n                case 13:\n                    return this._v13;\n                case 14:\n                    return this._v14;\n                case 15:\n                    return this._v15;\n                default:\n                    return undefined;\n            }\n        };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArray16.prototype.set = function (index, value) {\n            switch (index) {\n                case 0:\n                    this._v0 = value;\n                    break;\n                case 1:\n                    this._v1 = value;\n                    break;\n                case 2:\n                    this._v2 = value;\n                    break;\n                case 3:\n                    this._v3 = value;\n                    break;\n                case 4:\n                    this._v4 = value;\n                    break;\n                case 5:\n                    this._v5 = value;\n                    break;\n                case 6:\n                    this._v6 = value;\n                    break;\n                case 7:\n                    this._v7 = value;\n                    break;\n                case 8:\n                    this._v8 = value;\n                    break;\n                case 9:\n                    this._v9 = value;\n                    break;\n                case 10:\n                    this._v10 = value;\n                    break;\n                case 11:\n                    this._v11 = value;\n                    break;\n                case 12:\n                    this._v12 = value;\n                    break;\n                case 13:\n                    this._v13 = value;\n                    break;\n                case 14:\n                    this._v14 = value;\n                    break;\n                case 15:\n                    this._v15 = value;\n                    break;\n            }\n        };\n        return InlineArray16;\n    }());\n    var InlineArrayDynamic = (function () {\n        /**\n         * @param {?} length\n         * @param {...?} values\n         */\n        function InlineArrayDynamic(length) {\n            var values = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                values[_i - 1] = arguments[_i];\n            }\n            this.length = length;\n            this._values = values;\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        InlineArrayDynamic.prototype.get = function (index) { return this._values[index]; };\n        /**\n         * @param {?} index\n         * @param {?} value\n         * @return {?}\n         */\n        InlineArrayDynamic.prototype.set = function (index, value) { this._values[index] = value; };\n        return InlineArrayDynamic;\n    }());\n    var /** @type {?} */ EMPTY_INLINE_ARRAY = new InlineArray0();\n\n\n    var view_utils = Object.freeze({\n        ViewUtils: ViewUtils,\n        createRenderComponentType: createRenderComponentType,\n        addToArray: addToArray,\n        interpolate: interpolate,\n        inlineInterpolate: inlineInterpolate,\n        checkBinding: checkBinding,\n        castByValue: castByValue,\n        EMPTY_ARRAY: EMPTY_ARRAY,\n        EMPTY_MAP: EMPTY_MAP,\n        pureProxy1: pureProxy1,\n        pureProxy2: pureProxy2,\n        pureProxy3: pureProxy3,\n        pureProxy4: pureProxy4,\n        pureProxy5: pureProxy5,\n        pureProxy6: pureProxy6,\n        pureProxy7: pureProxy7,\n        pureProxy8: pureProxy8,\n        pureProxy9: pureProxy9,\n        pureProxy10: pureProxy10,\n        setBindingDebugInfoForChanges: setBindingDebugInfoForChanges,\n        setBindingDebugInfo: setBindingDebugInfo,\n        createRenderElement: createRenderElement,\n        selectOrCreateRenderHostElement: selectOrCreateRenderHostElement,\n        subscribeToRenderElement: subscribeToRenderElement,\n        noop: noop,\n        InlineArray2: InlineArray2,\n        InlineArray4: InlineArray4,\n        InlineArray8: InlineArray8,\n        InlineArray16: InlineArray16,\n        InlineArrayDynamic: InlineArrayDynamic,\n        EMPTY_INLINE_ARRAY: EMPTY_INLINE_ARRAY\n    });\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$5 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Represents an instance of a Component created via a {\\@link ComponentFactory}.\n     *\n     * `ComponentRef` provides access to the Component Instance as well other objects related to this\n     * Component Instance and allows you to destroy the Component Instance via the {\\@link #destroy}\n     * method.\n     * \\@stable\n     * @abstract\n     */\n    var ComponentRef = (function () {\n        function ComponentRef() {\n        }\n        /**\n         * Location of the Host Element of this Component Instance.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.location = function () { };\n        /**\n         * The injector on which the component instance exists.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.injector = function () { };\n        /**\n         * The instance of the Component.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.instance = function () { };\n        /**\n         * The {\\@link ViewRef} of the Host View of this Component instance.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.hostView = function () { };\n        /**\n         * The {\\@link ChangeDetectorRef} of the Component instance.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.changeDetectorRef = function () { };\n        /**\n         * The component type.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.componentType = function () { };\n        /**\n         * Destroys the component instance and all of the data structures associated with it.\n         * @abstract\n         * @return {?}\n         */\n        ComponentRef.prototype.destroy = function () { };\n        /**\n         * Allows to register a callback that will be called when the component is destroyed.\n         * @abstract\n         * @param {?} callback\n         * @return {?}\n         */\n        ComponentRef.prototype.onDestroy = function (callback) { };\n        return ComponentRef;\n    }());\n    var ComponentRef_ = (function (_super) {\n        __extends$5(ComponentRef_, _super);\n        /**\n         * @param {?} _index\n         * @param {?} _parentView\n         * @param {?} _nativeElement\n         * @param {?} _component\n         */\n        function ComponentRef_(_index, _parentView, _nativeElement, _component) {\n            _super.call(this);\n            this._index = _index;\n            this._parentView = _parentView;\n            this._nativeElement = _nativeElement;\n            this._component = _component;\n        }\n        Object.defineProperty(ComponentRef_.prototype, \"location\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return new ElementRef(this._nativeElement); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ComponentRef_.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._parentView.injector(this._index); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ComponentRef_.prototype, \"instance\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._component; },\n            enumerable: true,\n            configurable: true\n        });\n        ;\n        Object.defineProperty(ComponentRef_.prototype, \"hostView\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._parentView.ref; },\n            enumerable: true,\n            configurable: true\n        });\n        ;\n        Object.defineProperty(ComponentRef_.prototype, \"changeDetectorRef\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._parentView.ref; },\n            enumerable: true,\n            configurable: true\n        });\n        ;\n        Object.defineProperty(ComponentRef_.prototype, \"componentType\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return (this._component.constructor); },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        ComponentRef_.prototype.destroy = function () { this._parentView.detachAndDestroy(); };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        ComponentRef_.prototype.onDestroy = function (callback) { this.hostView.onDestroy(callback); };\n        return ComponentRef_;\n    }(ComponentRef));\n    /**\n     * \\@stable\n     */\n    var ComponentFactory = (function () {\n        /**\n         * @param {?} selector\n         * @param {?} _viewClass\n         * @param {?} _componentType\n         */\n        function ComponentFactory(selector, _viewClass, _componentType) {\n            this.selector = selector;\n            this._viewClass = _viewClass;\n            this._componentType = _componentType;\n        }\n        Object.defineProperty(ComponentFactory.prototype, \"componentType\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._componentType; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * Creates a new component.\n         * @param {?} injector\n         * @param {?=} projectableNodes\n         * @param {?=} rootSelectorOrNode\n         * @return {?}\n         */\n        ComponentFactory.prototype.create = function (injector, projectableNodes, rootSelectorOrNode) {\n            if (projectableNodes === void 0) { projectableNodes = null; }\n            if (rootSelectorOrNode === void 0) { rootSelectorOrNode = null; }\n            var /** @type {?} */ vu = injector.get(ViewUtils);\n            if (!projectableNodes) {\n                projectableNodes = [];\n            }\n            var /** @type {?} */ hostView = new this._viewClass(vu, null, null, null);\n            return hostView.createHostView(rootSelectorOrNode, injector, projectableNodes);\n        };\n        return ComponentFactory;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$8 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@stable\n     */\n    var NoComponentFactoryError = (function (_super) {\n        __extends$8(NoComponentFactoryError, _super);\n        /**\n         * @param {?} component\n         */\n        function NoComponentFactoryError(component) {\n            _super.call(this, \"No component factory found for \" + stringify(component) + \". Did you add it to @NgModule.entryComponents?\");\n            this.component = component;\n        }\n        return NoComponentFactoryError;\n    }(BaseError));\n    var _NullComponentFactoryResolver = (function () {\n        function _NullComponentFactoryResolver() {\n        }\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        _NullComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {\n            throw new NoComponentFactoryError(component);\n        };\n        return _NullComponentFactoryResolver;\n    }());\n    /**\n     * \\@stable\n     * @abstract\n     */\n    var ComponentFactoryResolver = (function () {\n        function ComponentFactoryResolver() {\n        }\n        /**\n         * @abstract\n         * @param {?} component\n         * @return {?}\n         */\n        ComponentFactoryResolver.prototype.resolveComponentFactory = function (component) { };\n        ComponentFactoryResolver.NULL = new _NullComponentFactoryResolver();\n        return ComponentFactoryResolver;\n    }());\n    var CodegenComponentFactoryResolver = (function () {\n        /**\n         * @param {?} factories\n         * @param {?} _parent\n         */\n        function CodegenComponentFactoryResolver(factories, _parent) {\n            this._parent = _parent;\n            this._factories = new Map();\n            for (var i = 0; i < factories.length; i++) {\n                var factory = factories[i];\n                this._factories.set(factory.componentType, factory);\n            }\n        }\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        CodegenComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {\n            var /** @type {?} */ result = this._factories.get(component);\n            if (!result) {\n                result = this._parent.resolveComponentFactory(component);\n            }\n            return result;\n        };\n        return CodegenComponentFactoryResolver;\n    }());\n\n    var /** @type {?} */ trace;\n    var /** @type {?} */ events;\n    /**\n     * @return {?}\n     */\n    function detectWTF() {\n        var /** @type {?} */ wtf = ((global$1) /** TODO #9100 */)['wtf'];\n        if (wtf) {\n            trace = wtf['trace'];\n            if (trace) {\n                events = trace['events'];\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * @param {?} signature\n     * @param {?=} flags\n     * @return {?}\n     */\n    function createScope(signature, flags) {\n        if (flags === void 0) { flags = null; }\n        return events.createScope(signature, flags);\n    }\n    /**\n     * @param {?} scope\n     * @param {?=} returnValue\n     * @return {?}\n     */\n    function leave(scope, returnValue) {\n        trace.leaveScope(scope, returnValue);\n        return returnValue;\n    }\n    /**\n     * @param {?} rangeType\n     * @param {?} action\n     * @return {?}\n     */\n    function startTimeRange(rangeType, action) {\n        return trace.beginTimeRange(rangeType, action);\n    }\n    /**\n     * @param {?} range\n     * @return {?}\n     */\n    function endTimeRange(range) {\n        trace.endTimeRange(range);\n    }\n\n    /**\n     * True if WTF is enabled.\n     */\n    var /** @type {?} */ wtfEnabled = detectWTF();\n    /**\n     * @param {?=} arg0\n     * @param {?=} arg1\n     * @return {?}\n     */\n    function noopScope(arg0, arg1) {\n        return null;\n    }\n    /**\n     * Create trace scope.\n     *\n     * Scopes must be strictly nested and are analogous to stack frames, but\n     * do not have to follow the stack frames. Instead it is recommended that they follow logical\n     * nesting. You may want to use\n     * [Event\n     * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)\n     * as they are defined in WTF.\n     *\n     * Used to mark scope entry. The return value is used to leave the scope.\n     *\n     *     var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');\n     *\n     *     someMethod() {\n     *        var s = myScope('Foo'); // 'Foo' gets stored in tracing UI\n     *        // DO SOME WORK HERE\n     *        return wtfLeave(s, 123); // Return value 123\n     *     }\n     *\n     * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can\n     * negatively impact the performance of your application. For this reason we recommend that\n     * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and\n     * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to\n     * exception, will produce incorrect trace, but presence of exception signifies logic error which\n     * needs to be fixed before the app should be profiled. Add try-finally only when you expect that\n     * an exception is expected during normal execution while profiling.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ wtfCreateScope = wtfEnabled ? createScope : function (signature, flags) { return noopScope; };\n    /**\n     * Used to mark end of Scope.\n     *\n     * - `scope` to end.\n     * - `returnValue` (optional) to be passed to the WTF.\n     *\n     * Returns the `returnValue for easy chaining.\n     * @experimental\n     */\n    var /** @type {?} */ wtfLeave = wtfEnabled ? leave : function (s, r) { return r; };\n    /**\n     * Used to mark Async start. Async are similar to scope but they don't have to be strictly nested.\n     * The return value is used in the call to [endAsync]. Async ranges only work if WTF has been\n     * enabled.\n     *\n     *     someMethod() {\n     *        var s = wtfStartTimeRange('HTTP:GET', 'some.url');\n     *        var future = new Future.delay(5).then((_) {\n     *          wtfEndTimeRange(s);\n     *        });\n     *     }\n     * @experimental\n     */\n    var /** @type {?} */ wtfStartTimeRange = wtfEnabled ? startTimeRange : function (rangeType, action) { return null; };\n    /**\n     * Ends a async time range operation.\n     * [range] is the return value from [wtfStartTimeRange] Async ranges only work if WTF has been\n     * enabled.\n     * @experimental\n     */\n    var /** @type {?} */ wtfEndTimeRange = wtfEnabled ? endTimeRange : function (r) { return null; };\n\n    /**\n     * The Testability service provides testing hooks that can be accessed from\n     * the browser and by services such as Protractor. Each bootstrapped Angular\n     * application on the page will have an instance of Testability.\n     * \\@experimental\n     */\n    var Testability = (function () {\n        /**\n         * @param {?} _ngZone\n         */\n        function Testability(_ngZone) {\n            this._ngZone = _ngZone;\n            /** @internal */\n            this._pendingCount = 0;\n            /** @internal */\n            this._isZoneStable = true;\n            /**\n             * Whether any work was done since the last 'whenStable' callback. This is\n             * useful to detect if this could have potentially destabilized another\n             * component while it is stabilizing.\n             * @internal\n             */\n            this._didWork = false;\n            /** @internal */\n            this._callbacks = [];\n            this._watchAngularEvents();\n        }\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        Testability.prototype._watchAngularEvents = function () {\n            var _this = this;\n            this._ngZone.onUnstable.subscribe({\n                next: function () {\n                    _this._didWork = true;\n                    _this._isZoneStable = false;\n                }\n            });\n            this._ngZone.runOutsideAngular(function () {\n                _this._ngZone.onStable.subscribe({\n                    next: function () {\n                        NgZone.assertNotInAngularZone();\n                        scheduleMicroTask(function () {\n                            _this._isZoneStable = true;\n                            _this._runCallbacksIfReady();\n                        });\n                    }\n                });\n            });\n        };\n        /**\n         * @return {?}\n         */\n        Testability.prototype.increasePendingRequestCount = function () {\n            this._pendingCount += 1;\n            this._didWork = true;\n            return this._pendingCount;\n        };\n        /**\n         * @return {?}\n         */\n        Testability.prototype.decreasePendingRequestCount = function () {\n            this._pendingCount -= 1;\n            if (this._pendingCount < 0) {\n                throw new Error('pending async requests below zero');\n            }\n            this._runCallbacksIfReady();\n            return this._pendingCount;\n        };\n        /**\n         * @return {?}\n         */\n        Testability.prototype.isStable = function () {\n            return this._isZoneStable && this._pendingCount == 0 && !this._ngZone.hasPendingMacrotasks;\n        };\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        Testability.prototype._runCallbacksIfReady = function () {\n            var _this = this;\n            if (this.isStable()) {\n                // Schedules the call backs in a new frame so that it is always async.\n                scheduleMicroTask(function () {\n                    while (_this._callbacks.length !== 0) {\n                        (_this._callbacks.pop())(_this._didWork);\n                    }\n                    _this._didWork = false;\n                });\n            }\n            else {\n                // Not Ready\n                this._didWork = true;\n            }\n        };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        Testability.prototype.whenStable = function (callback) {\n            this._callbacks.push(callback);\n            this._runCallbacksIfReady();\n        };\n        /**\n         * @return {?}\n         */\n        Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };\n        /**\n         * @deprecated use findProviders\n         * @param {?} using\n         * @param {?} provider\n         * @param {?} exactMatch\n         * @return {?}\n         */\n        Testability.prototype.findBindings = function (using, provider, exactMatch) {\n            // TODO(juliemr): implement.\n            return [];\n        };\n        /**\n         * @param {?} using\n         * @param {?} provider\n         * @param {?} exactMatch\n         * @return {?}\n         */\n        Testability.prototype.findProviders = function (using, provider, exactMatch) {\n            // TODO(juliemr): implement.\n            return [];\n        };\n        Testability.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        Testability.ctorParameters = function () { return [\n            { type: NgZone, },\n        ]; };\n        return Testability;\n    }());\n    /**\n     * A global registry of {\\@link Testability} instances for specific elements.\n     * \\@experimental\n     */\n    var TestabilityRegistry = (function () {\n        function TestabilityRegistry() {\n            /** @internal */\n            this._applications = new Map();\n            _testabilityGetter.addToWindow(this);\n        }\n        /**\n         * @param {?} token\n         * @param {?} testability\n         * @return {?}\n         */\n        TestabilityRegistry.prototype.registerApplication = function (token, testability) {\n            this._applications.set(token, testability);\n        };\n        /**\n         * @param {?} elem\n         * @return {?}\n         */\n        TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem); };\n        /**\n         * @return {?}\n         */\n        TestabilityRegistry.prototype.getAllTestabilities = function () { return Array.from(this._applications.values()); };\n        /**\n         * @return {?}\n         */\n        TestabilityRegistry.prototype.getAllRootElements = function () { return Array.from(this._applications.keys()); };\n        /**\n         * @param {?} elem\n         * @param {?=} findInAncestors\n         * @return {?}\n         */\n        TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {\n            if (findInAncestors === void 0) { findInAncestors = true; }\n            return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);\n        };\n        TestabilityRegistry.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        TestabilityRegistry.ctorParameters = function () { return []; };\n        return TestabilityRegistry;\n    }());\n    var _NoopGetTestability = (function () {\n        function _NoopGetTestability() {\n        }\n        /**\n         * @param {?} registry\n         * @return {?}\n         */\n        _NoopGetTestability.prototype.addToWindow = function (registry) { };\n        /**\n         * @param {?} registry\n         * @param {?} elem\n         * @param {?} findInAncestors\n         * @return {?}\n         */\n        _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {\n            return null;\n        };\n        return _NoopGetTestability;\n    }());\n    /**\n     * Set the {\\@link GetTestability} implementation used by the Angular testing framework.\n     * \\@experimental\n     * @param {?} getter\n     * @return {?}\n     */\n    function setTestabilityGetter(getter) {\n        _testabilityGetter = getter;\n    }\n    var /** @type {?} */ _testabilityGetter = new _NoopGetTestability();\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$3 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _devMode = true;\n    var /** @type {?} */ _runModeLocked = false;\n    var /** @type {?} */ _platform;\n    /**\n     * Disable Angular's development mode, which turns off assertions and other\n     * checks within the framework.\n     *\n     * One important assertion this disables verifies that a change detection pass\n     * does not result in additional changes to any bindings (also known as\n     * unidirectional data flow).\n     *\n     * \\@stable\n     * @return {?}\n     */\n    function enableProdMode() {\n        if (_runModeLocked) {\n            throw new Error('Cannot enable prod mode after platform setup.');\n        }\n        _devMode = false;\n    }\n    /**\n     * Returns whether Angular is in development mode. After called once,\n     * the value is locked and won't change any more.\n     *\n     * By default, this is true, unless a user calls `enableProdMode` before calling this.\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @return {?}\n     */\n    function isDevMode() {\n        _runModeLocked = true;\n        return _devMode;\n    }\n    /**\n     * A token for third-party components that can register themselves with NgProbe.\n     *\n     * \\@experimental\n     */\n    var NgProbeToken = (function () {\n        /**\n         * @param {?} name\n         * @param {?} token\n         */\n        function NgProbeToken(name, token) {\n            this.name = name;\n            this.token = token;\n        }\n        return NgProbeToken;\n    }());\n    /**\n     * Creates a platform.\n     * Platforms have to be eagerly created via this function.\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @param {?} injector\n     * @return {?}\n     */\n    function createPlatform(injector) {\n        if (_platform && !_platform.destroyed) {\n            throw new Error('There can be only one platform. Destroy the previous one to create a new one.');\n        }\n        _platform = injector.get(PlatformRef);\n        var /** @type {?} */ inits = (injector.get(PLATFORM_INITIALIZER, null));\n        if (inits)\n            inits.forEach(function (init) { return init(); });\n        return _platform;\n    }\n    /**\n     * Creates a factory for a platform\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @param {?} parentPlatformFactory\n     * @param {?} name\n     * @param {?=} providers\n     * @return {?}\n     */\n    function createPlatformFactory(parentPlatformFactory, name, providers) {\n        if (providers === void 0) { providers = []; }\n        var /** @type {?} */ marker = new OpaqueToken(\"Platform: \" + name);\n        return function (extraProviders) {\n            if (extraProviders === void 0) { extraProviders = []; }\n            if (!getPlatform()) {\n                if (parentPlatformFactory) {\n                    parentPlatformFactory(providers.concat(extraProviders).concat({ provide: marker, useValue: true }));\n                }\n                else {\n                    createPlatform(ReflectiveInjector.resolveAndCreate(providers.concat(extraProviders).concat({ provide: marker, useValue: true })));\n                }\n            }\n            return assertPlatform(marker);\n        };\n    }\n    /**\n     * Checks that there currently is a platform\n     * which contains the given token as a provider.\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @param {?} requiredToken\n     * @return {?}\n     */\n    function assertPlatform(requiredToken) {\n        var /** @type {?} */ platform = getPlatform();\n        if (!platform) {\n            throw new Error('No platform exists!');\n        }\n        if (!platform.injector.get(requiredToken, null)) {\n            throw new Error('A platform with a different configuration has been created. Please destroy it first.');\n        }\n        return platform;\n    }\n    /**\n     * Destroy the existing platform.\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @return {?}\n     */\n    function destroyPlatform() {\n        if (_platform && !_platform.destroyed) {\n            _platform.destroy();\n        }\n    }\n    /**\n     * Returns the current platform.\n     *\n     * \\@experimental APIs related to application bootstrap are currently under review.\n     * @return {?}\n     */\n    function getPlatform() {\n        return _platform && !_platform.destroyed ? _platform : null;\n    }\n    /**\n     * The Angular platform is the entry point for Angular on a web page. Each page\n     * has exactly one platform, and services (such as reflection) which are common\n     * to every Angular application running on the page are bound in its scope.\n     *\n     * A page's platform is initialized implicitly when {\\@link bootstrap}() is called, or\n     * explicitly by calling {\\@link createPlatform}().\n     *\n     * \\@stable\n     * @abstract\n     */\n    var PlatformRef = (function () {\n        function PlatformRef() {\n        }\n        /**\n         * Creates an instance of an `\\@NgModule` for the given platform\n         * for offline compilation.\n         *\n         * ## Simple Example\n         *\n         * ```typescript\n         * my_module.ts:\n         *\n         * \\@NgModule({\n         *   imports: [BrowserModule]\n         * })\n         * class MyModule {}\n         *\n         * main.ts:\n         * import {MyModuleNgFactory} from './my_module.ngfactory';\n         * import {platformBrowser} from '\\@angular/platform-browser';\n         *\n         * let moduleRef = platformBrowser().bootstrapModuleFactory(MyModuleNgFactory);\n         * ```\n         *\n         * \\@experimental APIs related to application bootstrap are currently under review.\n         * @abstract\n         * @param {?} moduleFactory\n         * @return {?}\n         */\n        PlatformRef.prototype.bootstrapModuleFactory = function (moduleFactory) { };\n        /**\n         * Creates an instance of an `\\@NgModule` for a given platform using the given runtime compiler.\n         *\n         * ## Simple Example\n         *\n         * ```typescript\n         * \\@NgModule({\n         *   imports: [BrowserModule]\n         * })\n         * class MyModule {}\n         *\n         * let moduleRef = platformBrowser().bootstrapModule(MyModule);\n         * ```\n         * \\@stable\n         * @abstract\n         * @param {?} moduleType\n         * @param {?=} compilerOptions\n         * @return {?}\n         */\n        PlatformRef.prototype.bootstrapModule = function (moduleType, compilerOptions) { };\n        /**\n         * Register a listener to be called when the platform is disposed.\n         * @abstract\n         * @param {?} callback\n         * @return {?}\n         */\n        PlatformRef.prototype.onDestroy = function (callback) { };\n        /**\n         * Retrieve the platform {\\@link Injector}, which is the parent injector for\n         * every Angular application on the page and provides singleton providers.\n         * @abstract\n         * @return {?}\n         */\n        PlatformRef.prototype.injector = function () { };\n        /**\n         * Destroy the Angular platform and all Angular applications on the page.\n         * @abstract\n         * @return {?}\n         */\n        PlatformRef.prototype.destroy = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        PlatformRef.prototype.destroyed = function () { };\n        return PlatformRef;\n    }());\n    /**\n     * @param {?} errorHandler\n     * @param {?} callback\n     * @return {?}\n     */\n    function _callAndReportToErrorHandler(errorHandler, callback) {\n        try {\n            var /** @type {?} */ result = callback();\n            if (isPromise(result)) {\n                return result.catch(function (e) {\n                    errorHandler.handleError(e);\n                    // rethrow as the exception handler might not do it\n                    throw e;\n                });\n            }\n            return result;\n        }\n        catch (e) {\n            errorHandler.handleError(e);\n            // rethrow as the exception handler might not do it\n            throw e;\n        }\n    }\n    var PlatformRef_ = (function (_super) {\n        __extends$3(PlatformRef_, _super);\n        /**\n         * @param {?} _injector\n         */\n        function PlatformRef_(_injector) {\n            _super.call(this);\n            this._injector = _injector;\n            this._modules = [];\n            this._destroyListeners = [];\n            this._destroyed = false;\n        }\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        PlatformRef_.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };\n        Object.defineProperty(PlatformRef_.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._injector; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(PlatformRef_.prototype, \"destroyed\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._destroyed; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        PlatformRef_.prototype.destroy = function () {\n            if (this._destroyed) {\n                throw new Error('The platform has already been destroyed!');\n            }\n            this._modules.slice().forEach(function (module) { return module.destroy(); });\n            this._destroyListeners.forEach(function (listener) { return listener(); });\n            this._destroyed = true;\n        };\n        /**\n         * @param {?} moduleFactory\n         * @return {?}\n         */\n        PlatformRef_.prototype.bootstrapModuleFactory = function (moduleFactory) {\n            return this._bootstrapModuleFactoryWithZone(moduleFactory, null);\n        };\n        /**\n         * @param {?} moduleFactory\n         * @param {?} ngZone\n         * @return {?}\n         */\n        PlatformRef_.prototype._bootstrapModuleFactoryWithZone = function (moduleFactory, ngZone) {\n            var _this = this;\n            // Note: We need to create the NgZone _before_ we instantiate the module,\n            // as instantiating the module creates some providers eagerly.\n            // So we create a mini parent injector that just contains the new NgZone and\n            // pass that as parent to the NgModuleFactory.\n            if (!ngZone)\n                ngZone = new NgZone({ enableLongStackTrace: isDevMode() });\n            // Attention: Don't use ApplicationRef.run here,\n            // as we want to be sure that all possible constructor calls are inside `ngZone.run`!\n            return ngZone.run(function () {\n                var /** @type {?} */ ngZoneInjector = ReflectiveInjector.resolveAndCreate([{ provide: NgZone, useValue: ngZone }], _this.injector);\n                var /** @type {?} */ moduleRef = (moduleFactory.create(ngZoneInjector));\n                var /** @type {?} */ exceptionHandler = moduleRef.injector.get(ErrorHandler, null);\n                if (!exceptionHandler) {\n                    throw new Error('No ErrorHandler. Is platform module (BrowserModule) included?');\n                }\n                moduleRef.onDestroy(function () { return ListWrapper.remove(_this._modules, moduleRef); });\n                ngZone.onError.subscribe({ next: function (error) { exceptionHandler.handleError(error); } });\n                return _callAndReportToErrorHandler(exceptionHandler, function () {\n                    var /** @type {?} */ initStatus = moduleRef.injector.get(ApplicationInitStatus);\n                    return initStatus.donePromise.then(function () {\n                        _this._moduleDoBootstrap(moduleRef);\n                        return moduleRef;\n                    });\n                });\n            });\n        };\n        /**\n         * @param {?} moduleType\n         * @param {?=} compilerOptions\n         * @return {?}\n         */\n        PlatformRef_.prototype.bootstrapModule = function (moduleType, compilerOptions) {\n            if (compilerOptions === void 0) { compilerOptions = []; }\n            return this._bootstrapModuleWithZone(moduleType, compilerOptions, null);\n        };\n        /**\n         * @param {?} moduleType\n         * @param {?=} compilerOptions\n         * @param {?} ngZone\n         * @param {?=} componentFactoryCallback\n         * @return {?}\n         */\n        PlatformRef_.prototype._bootstrapModuleWithZone = function (moduleType, compilerOptions, ngZone, componentFactoryCallback) {\n            var _this = this;\n            if (compilerOptions === void 0) { compilerOptions = []; }\n            var /** @type {?} */ compilerFactory = this.injector.get(CompilerFactory);\n            var /** @type {?} */ compiler = compilerFactory.createCompiler(Array.isArray(compilerOptions) ? compilerOptions : [compilerOptions]);\n            // ugly internal api hack: generate host component factories for all declared components and\n            // pass the factories into the callback - this is used by UpdateAdapter to get hold of all\n            // factories.\n            if (componentFactoryCallback) {\n                return compiler.compileModuleAndAllComponentsAsync(moduleType)\n                    .then(function (_a) {\n                    var ngModuleFactory = _a.ngModuleFactory, componentFactories = _a.componentFactories;\n                    componentFactoryCallback(componentFactories);\n                    return _this._bootstrapModuleFactoryWithZone(ngModuleFactory, ngZone);\n                });\n            }\n            return compiler.compileModuleAsync(moduleType)\n                .then(function (moduleFactory) { return _this._bootstrapModuleFactoryWithZone(moduleFactory, ngZone); });\n        };\n        /**\n         * @param {?} moduleRef\n         * @return {?}\n         */\n        PlatformRef_.prototype._moduleDoBootstrap = function (moduleRef) {\n            var /** @type {?} */ appRef = moduleRef.injector.get(ApplicationRef);\n            if (moduleRef.bootstrapFactories.length > 0) {\n                moduleRef.bootstrapFactories.forEach(function (compFactory) { return appRef.bootstrap(compFactory); });\n            }\n            else if (moduleRef.instance.ngDoBootstrap) {\n                moduleRef.instance.ngDoBootstrap(appRef);\n            }\n            else {\n                throw new Error((\"The module \" + stringify(moduleRef.instance.constructor) + \" was bootstrapped, but it does not declare \\\"@NgModule.bootstrap\\\" components nor a \\\"ngDoBootstrap\\\" method. \") +\n                    \"Please define one of these.\");\n            }\n            this._modules.push(moduleRef);\n        };\n        PlatformRef_.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        PlatformRef_.ctorParameters = function () { return [\n            { type: Injector, },\n        ]; };\n        return PlatformRef_;\n    }(PlatformRef));\n    /**\n     * A reference to an Angular application running on a page.\n     *\n     * For more about Angular applications, see the documentation for {\\@link bootstrap}.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var ApplicationRef = (function () {\n        function ApplicationRef() {\n        }\n        /**\n         * Bootstrap a new component at the root level of the application.\n         *\n         * ### Bootstrap process\n         *\n         * When bootstrapping a new root component into an application, Angular mounts the\n         * specified application component onto DOM elements identified by the [componentType]'s\n         * selector and kicks off automatic change detection to finish initializing the component.\n         *\n         * ### Example\n         * {\\@example core/ts/platform/platform.ts region='longform'}\n         * @abstract\n         * @param {?} componentFactory\n         * @return {?}\n         */\n        ApplicationRef.prototype.bootstrap = function (componentFactory) { };\n        /**\n         * Invoke this method to explicitly process change detection and its side-effects.\n         *\n         * In development mode, `tick()` also performs a second change detection cycle to ensure that no\n         * further changes are detected. If additional changes are picked up during this second cycle,\n         * bindings in the app have side-effects that cannot be resolved in a single change detection\n         * pass.\n         * In this case, Angular throws an error, since an Angular application can only have one change\n         * detection pass during which all change detection must complete.\n         * @abstract\n         * @return {?}\n         */\n        ApplicationRef.prototype.tick = function () { };\n        /**\n         * Get a list of component types registered to this application.\n         * This list is populated even before the component is created.\n         * @abstract\n         * @return {?}\n         */\n        ApplicationRef.prototype.componentTypes = function () { };\n        /**\n         * Get a list of components registered to this application.\n         * @abstract\n         * @return {?}\n         */\n        ApplicationRef.prototype.components = function () { };\n        /**\n         * Attaches a view so that it will be dirty checked.\n         * The view will be automatically detached when it is destroyed.\n         * This will throw if the view is already attached to a ViewContainer.\n         * @abstract\n         * @param {?} view\n         * @return {?}\n         */\n        ApplicationRef.prototype.attachView = function (view) { };\n        /**\n         * Detaches a view from dirty checking again.\n         * @abstract\n         * @param {?} view\n         * @return {?}\n         */\n        ApplicationRef.prototype.detachView = function (view) { };\n        /**\n         * Returns the number of attached views.\n         * @abstract\n         * @return {?}\n         */\n        ApplicationRef.prototype.viewCount = function () { };\n        return ApplicationRef;\n    }());\n    var ApplicationRef_ = (function (_super) {\n        __extends$3(ApplicationRef_, _super);\n        /**\n         * @param {?} _zone\n         * @param {?} _console\n         * @param {?} _injector\n         * @param {?} _exceptionHandler\n         * @param {?} _componentFactoryResolver\n         * @param {?} _initStatus\n         * @param {?} _testabilityRegistry\n         * @param {?} _testability\n         */\n        function ApplicationRef_(_zone, _console, _injector, _exceptionHandler, _componentFactoryResolver, _initStatus, _testabilityRegistry, _testability) {\n            var _this = this;\n            _super.call(this);\n            this._zone = _zone;\n            this._console = _console;\n            this._injector = _injector;\n            this._exceptionHandler = _exceptionHandler;\n            this._componentFactoryResolver = _componentFactoryResolver;\n            this._initStatus = _initStatus;\n            this._testabilityRegistry = _testabilityRegistry;\n            this._testability = _testability;\n            this._bootstrapListeners = [];\n            this._rootComponents = [];\n            this._rootComponentTypes = [];\n            this._views = [];\n            this._runningTick = false;\n            this._enforceNoNewChanges = false;\n            this._enforceNoNewChanges = isDevMode();\n            this._zone.onMicrotaskEmpty.subscribe({ next: function () { _this._zone.run(function () { _this.tick(); }); } });\n        }\n        /**\n         * @param {?} viewRef\n         * @return {?}\n         */\n        ApplicationRef_.prototype.attachView = function (viewRef) {\n            var /** @type {?} */ view = ((viewRef)).internalView;\n            this._views.push(view);\n            view.attachToAppRef(this);\n        };\n        /**\n         * @param {?} viewRef\n         * @return {?}\n         */\n        ApplicationRef_.prototype.detachView = function (viewRef) {\n            var /** @type {?} */ view = ((viewRef)).internalView;\n            ListWrapper.remove(this._views, view);\n            view.detach();\n        };\n        /**\n         * @param {?} componentOrFactory\n         * @return {?}\n         */\n        ApplicationRef_.prototype.bootstrap = function (componentOrFactory) {\n            var _this = this;\n            if (!this._initStatus.done) {\n                throw new Error('Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.');\n            }\n            var /** @type {?} */ componentFactory;\n            if (componentOrFactory instanceof ComponentFactory) {\n                componentFactory = componentOrFactory;\n            }\n            else {\n                componentFactory = this._componentFactoryResolver.resolveComponentFactory(componentOrFactory);\n            }\n            this._rootComponentTypes.push(componentFactory.componentType);\n            var /** @type {?} */ compRef = componentFactory.create(this._injector, [], componentFactory.selector);\n            compRef.onDestroy(function () { _this._unloadComponent(compRef); });\n            var /** @type {?} */ testability = compRef.injector.get(Testability, null);\n            if (testability) {\n                compRef.injector.get(TestabilityRegistry)\n                    .registerApplication(compRef.location.nativeElement, testability);\n            }\n            this._loadComponent(compRef);\n            if (isDevMode()) {\n                this._console.log(\"Angular is running in the development mode. Call enableProdMode() to enable the production mode.\");\n            }\n            return compRef;\n        };\n        /**\n         * @param {?} componentRef\n         * @return {?}\n         */\n        ApplicationRef_.prototype._loadComponent = function (componentRef) {\n            this.attachView(componentRef.hostView);\n            this.tick();\n            this._rootComponents.push(componentRef);\n            // Get the listeners lazily to prevent DI cycles.\n            var /** @type {?} */ listeners = (this._injector.get(APP_BOOTSTRAP_LISTENER, [])\n                .concat(this._bootstrapListeners));\n            listeners.forEach(function (listener) { return listener(componentRef); });\n        };\n        /**\n         * @param {?} componentRef\n         * @return {?}\n         */\n        ApplicationRef_.prototype._unloadComponent = function (componentRef) {\n            this.detachView(componentRef.hostView);\n            ListWrapper.remove(this._rootComponents, componentRef);\n        };\n        /**\n         * @return {?}\n         */\n        ApplicationRef_.prototype.tick = function () {\n            if (this._runningTick) {\n                throw new Error('ApplicationRef.tick is called recursively');\n            }\n            var /** @type {?} */ scope = ApplicationRef_._tickScope();\n            try {\n                this._runningTick = true;\n                this._views.forEach(function (view) { return view.ref.detectChanges(); });\n                if (this._enforceNoNewChanges) {\n                    this._views.forEach(function (view) { return view.ref.checkNoChanges(); });\n                }\n            }\n            finally {\n                this._runningTick = false;\n                wtfLeave(scope);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        ApplicationRef_.prototype.ngOnDestroy = function () {\n            // TODO(alxhub): Dispose of the NgZone.\n            this._views.slice().forEach(function (view) { return view.destroy(); });\n        };\n        Object.defineProperty(ApplicationRef_.prototype, \"viewCount\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._views.length; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ApplicationRef_.prototype, \"componentTypes\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._rootComponentTypes; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ApplicationRef_.prototype, \"components\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._rootComponents; },\n            enumerable: true,\n            configurable: true\n        });\n        /** @internal */\n        ApplicationRef_._tickScope = wtfCreateScope('ApplicationRef#tick()');\n        ApplicationRef_.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        ApplicationRef_.ctorParameters = function () { return [\n            { type: NgZone, },\n            { type: Console, },\n            { type: Injector, },\n            { type: ErrorHandler, },\n            { type: ComponentFactoryResolver, },\n            { type: ApplicationInitStatus, },\n            { type: TestabilityRegistry, decorators: [{ type: Optional },] },\n            { type: Testability, decorators: [{ type: Optional },] },\n        ]; };\n        return ApplicationRef_;\n    }(ApplicationRef));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$9 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Represents an instance of an NgModule created via a {\\@link NgModuleFactory}.\n     *\n     * `NgModuleRef` provides access to the NgModule Instance as well other objects related to this\n     * NgModule Instance.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var NgModuleRef = (function () {\n        function NgModuleRef() {\n        }\n        /**\n         * The injector that contains all of the providers of the NgModule.\n         * @abstract\n         * @return {?}\n         */\n        NgModuleRef.prototype.injector = function () { };\n        /**\n         * The ComponentFactoryResolver to get hold of the ComponentFactories\n         * declared in the `entryComponents` property of the module.\n         * @abstract\n         * @return {?}\n         */\n        NgModuleRef.prototype.componentFactoryResolver = function () { };\n        /**\n         * The NgModule instance.\n         * @abstract\n         * @return {?}\n         */\n        NgModuleRef.prototype.instance = function () { };\n        /**\n         * Destroys the module instance and all of the data structures associated with it.\n         * @abstract\n         * @return {?}\n         */\n        NgModuleRef.prototype.destroy = function () { };\n        /**\n         * Allows to register a callback that will be called when the module is destroyed.\n         * @abstract\n         * @param {?} callback\n         * @return {?}\n         */\n        NgModuleRef.prototype.onDestroy = function (callback) { };\n        return NgModuleRef;\n    }());\n    /**\n     * \\@experimental\n     */\n    var NgModuleFactory = (function () {\n        /**\n         * @param {?} _injectorClass\n         * @param {?} _moduleType\n         */\n        function NgModuleFactory(_injectorClass, _moduleType) {\n            this._injectorClass = _injectorClass;\n            this._moduleType = _moduleType;\n        }\n        Object.defineProperty(NgModuleFactory.prototype, \"moduleType\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._moduleType; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} parentInjector\n         * @return {?}\n         */\n        NgModuleFactory.prototype.create = function (parentInjector) {\n            if (!parentInjector) {\n                parentInjector = Injector.NULL;\n            }\n            var /** @type {?} */ instance = new this._injectorClass(parentInjector);\n            instance.create();\n            return instance;\n        };\n        return NgModuleFactory;\n    }());\n    var /** @type {?} */ _UNDEFINED = new Object();\n    /**\n     * @abstract\n     */\n    var NgModuleInjector = (function (_super) {\n        __extends$9(NgModuleInjector, _super);\n        /**\n         * @param {?} parent\n         * @param {?} factories\n         * @param {?} bootstrapFactories\n         */\n        function NgModuleInjector(parent, factories, bootstrapFactories) {\n            _super.call(this, factories, parent.get(ComponentFactoryResolver, ComponentFactoryResolver.NULL));\n            this.parent = parent;\n            this.bootstrapFactories = bootstrapFactories;\n            this._destroyListeners = [];\n            this._destroyed = false;\n        }\n        /**\n         * @return {?}\n         */\n        NgModuleInjector.prototype.create = function () { this.instance = this.createInternal(); };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        NgModuleInjector.prototype.createInternal = function () { };\n        /**\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        NgModuleInjector.prototype.get = function (token, notFoundValue) {\n            if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n            if (token === Injector || token === ComponentFactoryResolver) {\n                return this;\n            }\n            var /** @type {?} */ result = this.getInternal(token, _UNDEFINED);\n            return result === _UNDEFINED ? this.parent.get(token, notFoundValue) : result;\n        };\n        /**\n         * @abstract\n         * @param {?} token\n         * @param {?} notFoundValue\n         * @return {?}\n         */\n        NgModuleInjector.prototype.getInternal = function (token, notFoundValue) { };\n        Object.defineProperty(NgModuleInjector.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgModuleInjector.prototype, \"componentFactoryResolver\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        NgModuleInjector.prototype.destroy = function () {\n            if (this._destroyed) {\n                throw new Error(\"The ng module \" + stringify(this.instance.constructor) + \" has already been destroyed.\");\n            }\n            this._destroyed = true;\n            this.destroyInternal();\n            this._destroyListeners.forEach(function (listener) { return listener(); });\n        };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        NgModuleInjector.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        NgModuleInjector.prototype.destroyInternal = function () { };\n        return NgModuleInjector;\n    }(CodegenComponentFactoryResolver));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * Used to load ng module factories.\n     * \\@stable\n     * @abstract\n     */\n    var NgModuleFactoryLoader = (function () {\n        function NgModuleFactoryLoader() {\n        }\n        /**\n         * @abstract\n         * @param {?} path\n         * @return {?}\n         */\n        NgModuleFactoryLoader.prototype.load = function (path) { };\n        return NgModuleFactoryLoader;\n    }());\n    var /** @type {?} */ moduleFactories = new Map();\n    /**\n     * Registers a loaded module. Should only be called from generated NgModuleFactory code.\n     * \\@experimental\n     * @param {?} id\n     * @param {?} factory\n     * @return {?}\n     */\n    function registerModuleFactory(id, factory) {\n        var /** @type {?} */ existing = moduleFactories.get(id);\n        if (existing) {\n            throw new Error(\"Duplicate module registered for \" + id + \" - \" + existing.moduleType.name + \" vs \" + factory.moduleType.name);\n        }\n        moduleFactories.set(id, factory);\n    }\n    /**\n     * Returns the NgModuleFactory with the given id, if it exists and has been loaded.\n     * Factories for modules that do not specify an `id` cannot be retrieved. Throws if the module\n     * cannot be found.\n     * \\@experimental\n     * @param {?} id\n     * @return {?}\n     */\n    function getModuleFactory(id) {\n        var /** @type {?} */ factory = moduleFactories.get(id);\n        if (!factory)\n            throw new Error(\"No module with ID \" + id + \" loaded\");\n        return factory;\n    }\n\n    /**\n     * An unmodifiable list of items that Angular keeps up to date when the state\n     * of the application changes.\n     *\n     * The type of object that {\\@link Query} and {\\@link ViewQueryMetadata} provide.\n     *\n     * Implements an iterable interface, therefore it can be used in both ES6\n     * javascript `for (var i of items)` loops as well as in Angular templates with\n     * `*ngFor=\"let i of myList\"`.\n     *\n     * Changes can be observed by subscribing to the changes `Observable`.\n     *\n     * NOTE: In the future this class will implement an `Observable` interface.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/RX8sJnQYl9FWuSCWme5z?p=preview))\n     * ```typescript\n     * \\@Component({...})\n     * class Container {\n     *   \\@ViewChildren(Item) items:QueryList<Item>;\n     * }\n     * ```\n     * \\@stable\n     */\n    var QueryList = (function () {\n        function QueryList() {\n            this._dirty = true;\n            this._results = [];\n            this._emitter = new EventEmitter();\n        }\n        Object.defineProperty(QueryList.prototype, \"changes\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._emitter; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(QueryList.prototype, \"length\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._results.length; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(QueryList.prototype, \"first\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._results[0]; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(QueryList.prototype, \"last\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._results[this.length - 1]; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * See\n         * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)\n         * @param {?} fn\n         * @return {?}\n         */\n        QueryList.prototype.map = function (fn) { return this._results.map(fn); };\n        /**\n         * See\n         * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)\n         * @param {?} fn\n         * @return {?}\n         */\n        QueryList.prototype.filter = function (fn) {\n            return this._results.filter(fn);\n        };\n        /**\n         * See\n         * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)\n         * @param {?} fn\n         * @return {?}\n         */\n        QueryList.prototype.find = function (fn) { return this._results.find(fn); };\n        /**\n         * See\n         * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)\n         * @param {?} fn\n         * @param {?} init\n         * @return {?}\n         */\n        QueryList.prototype.reduce = function (fn, init) {\n            return this._results.reduce(fn, init);\n        };\n        /**\n         * See\n         * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)\n         * @param {?} fn\n         * @return {?}\n         */\n        QueryList.prototype.forEach = function (fn) { this._results.forEach(fn); };\n        /**\n         * See\n         * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)\n         * @param {?} fn\n         * @return {?}\n         */\n        QueryList.prototype.some = function (fn) {\n            return this._results.some(fn);\n        };\n        /**\n         * @return {?}\n         */\n        QueryList.prototype.toArray = function () { return this._results.slice(); };\n        /**\n         * @return {?}\n         */\n        QueryList.prototype[getSymbolIterator()] = function () { return ((this._results))[getSymbolIterator()](); };\n        /**\n         * @return {?}\n         */\n        QueryList.prototype.toString = function () { return this._results.toString(); };\n        /**\n         * @param {?} res\n         * @return {?}\n         */\n        QueryList.prototype.reset = function (res) {\n            this._results = ListWrapper.flatten(res);\n            this._dirty = false;\n        };\n        /**\n         * @return {?}\n         */\n        QueryList.prototype.notifyOnChanges = function () { this._emitter.emit(this); };\n        /**\n         * internal\n         * @return {?}\n         */\n        QueryList.prototype.setDirty = function () { this._dirty = true; };\n        Object.defineProperty(QueryList.prototype, \"dirty\", {\n            /**\n             * internal\n             * @return {?}\n             */\n            get: function () { return this._dirty; },\n            enumerable: true,\n            configurable: true\n        });\n        return QueryList;\n    }());\n\n    var /** @type {?} */ _SEPARATOR = '#';\n    var /** @type {?} */ FACTORY_CLASS_SUFFIX = 'NgFactory';\n    /**\n     * Configuration for SystemJsNgModuleLoader.\n     * token.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var SystemJsNgModuleLoaderConfig = (function () {\n        function SystemJsNgModuleLoaderConfig() {\n        }\n        return SystemJsNgModuleLoaderConfig;\n    }());\n    var /** @type {?} */ DEFAULT_CONFIG = {\n        factoryPathPrefix: '',\n        factoryPathSuffix: '.ngfactory',\n    };\n    /**\n     * NgModuleFactoryLoader that uses SystemJS to load NgModuleFactory\n     * \\@experimental\n     */\n    var SystemJsNgModuleLoader = (function () {\n        /**\n         * @param {?} _compiler\n         * @param {?=} config\n         */\n        function SystemJsNgModuleLoader(_compiler, config) {\n            this._compiler = _compiler;\n            this._config = config || DEFAULT_CONFIG;\n        }\n        /**\n         * @param {?} path\n         * @return {?}\n         */\n        SystemJsNgModuleLoader.prototype.load = function (path) {\n            var /** @type {?} */ offlineMode = this._compiler instanceof Compiler;\n            return offlineMode ? this.loadFactory(path) : this.loadAndCompile(path);\n        };\n        /**\n         * @param {?} path\n         * @return {?}\n         */\n        SystemJsNgModuleLoader.prototype.loadAndCompile = function (path) {\n            var _this = this;\n            var _a = path.split(_SEPARATOR), module = _a[0], exportName = _a[1];\n            if (exportName === undefined) {\n                exportName = 'default';\n            }\n            return System.import(module)\n                .then(function (module) { return module[exportName]; })\n                .then(function (type) { return checkNotEmpty(type, module, exportName); })\n                .then(function (type) { return _this._compiler.compileModuleAsync(type); });\n        };\n        /**\n         * @param {?} path\n         * @return {?}\n         */\n        SystemJsNgModuleLoader.prototype.loadFactory = function (path) {\n            var _a = path.split(_SEPARATOR), module = _a[0], exportName = _a[1];\n            var /** @type {?} */ factoryClassSuffix = FACTORY_CLASS_SUFFIX;\n            if (exportName === undefined) {\n                exportName = 'default';\n                factoryClassSuffix = '';\n            }\n            return System.import(this._config.factoryPathPrefix + module + this._config.factoryPathSuffix)\n                .then(function (module) { return module[exportName + factoryClassSuffix]; })\n                .then(function (factory) { return checkNotEmpty(factory, module, exportName); });\n        };\n        SystemJsNgModuleLoader.decorators = [\n            { type: Injectable },\n        ];\n        /** @nocollapse */\n        SystemJsNgModuleLoader.ctorParameters = function () { return [\n            { type: Compiler, },\n            { type: SystemJsNgModuleLoaderConfig, decorators: [{ type: Optional },] },\n        ]; };\n        return SystemJsNgModuleLoader;\n    }());\n    /**\n     * @param {?} value\n     * @param {?} modulePath\n     * @param {?} exportName\n     * @return {?}\n     */\n    function checkNotEmpty(value, modulePath, exportName) {\n        if (!value) {\n            throw new Error(\"Cannot find '\" + exportName + \"' in '\" + modulePath + \"'\");\n        }\n        return value;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$10 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Represents an Embedded Template that can be used to instantiate Embedded Views.\n     *\n     * You can access a `TemplateRef`, in two ways. Via a directive placed on a `<template>` element (or\n     * directive prefixed with `*`) and have the `TemplateRef` for this Embedded View injected into the\n     * constructor of the directive using the `TemplateRef` Token. Alternatively you can query for the\n     * `TemplateRef` from a Component or a Directive via {\\@link Query}.\n     *\n     * To instantiate Embedded Views based on a Template, use\n     * {\\@link ViewContainerRef#createEmbeddedView}, which will create the View and attach it to the\n     * View Container.\n     * \\@stable\n     * @abstract\n     */\n    var TemplateRef = (function () {\n        function TemplateRef() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        TemplateRef.prototype.elementRef = function () { };\n        /**\n         * @abstract\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateRef.prototype.createEmbeddedView = function (context) { };\n        return TemplateRef;\n    }());\n    var TemplateRef_ = (function (_super) {\n        __extends$10(TemplateRef_, _super);\n        /**\n         * @param {?} _parentView\n         * @param {?} _nodeIndex\n         * @param {?} _nativeElement\n         */\n        function TemplateRef_(_parentView, _nodeIndex, _nativeElement) {\n            _super.call(this);\n            this._parentView = _parentView;\n            this._nodeIndex = _nodeIndex;\n            this._nativeElement = _nativeElement;\n        }\n        /**\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateRef_.prototype.createEmbeddedView = function (context) {\n            var /** @type {?} */ view = this._parentView.createEmbeddedViewInternal(this._nodeIndex);\n            view.create(context || ({}));\n            return view.ref;\n        };\n        Object.defineProperty(TemplateRef_.prototype, \"elementRef\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return new ElementRef(this._nativeElement); },\n            enumerable: true,\n            configurable: true\n        });\n        return TemplateRef_;\n    }(TemplateRef));\n\n    /**\n     * Represents a container where one or more Views can be attached.\n     *\n     * The container can contain two kinds of Views. Host Views, created by instantiating a\n     * {\\@link Component} via {\\@link #createComponent}, and Embedded Views, created by instantiating an\n     * {\\@link TemplateRef Embedded Template} via {\\@link #createEmbeddedView}.\n     *\n     * The location of the View Container within the containing View is specified by the Anchor\n     * `element`. Each View Container can have only one Anchor Element and each Anchor Element can only\n     * have a single View Container.\n     *\n     * Root elements of Views attached to this container become siblings of the Anchor Element in\n     * the Rendered View.\n     *\n     * To access a `ViewContainerRef` of an Element, you can either place a {\\@link Directive} injected\n     * with `ViewContainerRef` on the Element, or you obtain it via a {\\@link ViewChild} query.\n     * \\@stable\n     * @abstract\n     */\n    var ViewContainerRef = (function () {\n        function ViewContainerRef() {\n        }\n        /**\n         * Anchor element that specifies the location of this container in the containing View.\n         * <!-- TODO: rename to anchorElement -->\n         * @abstract\n         * @return {?}\n         */\n        ViewContainerRef.prototype.element = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        ViewContainerRef.prototype.injector = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        ViewContainerRef.prototype.parentInjector = function () { };\n        /**\n         * Destroys all Views in this container.\n         * @abstract\n         * @return {?}\n         */\n        ViewContainerRef.prototype.clear = function () { };\n        /**\n         * Returns the {\\@link ViewRef} for the View located in this container at the specified index.\n         * @abstract\n         * @param {?} index\n         * @return {?}\n         */\n        ViewContainerRef.prototype.get = function (index) { };\n        /**\n         * Returns the number of Views currently attached to this container.\n         * @abstract\n         * @return {?}\n         */\n        ViewContainerRef.prototype.length = function () { };\n        /**\n         * Instantiates an Embedded View based on the {\\@link TemplateRef `templateRef`} and inserts it\n         * into this container at the specified `index`.\n         *\n         * If `index` is not specified, the new View will be inserted as the last View in the container.\n         *\n         * Returns the {\\@link ViewRef} for the newly created View.\n         * @abstract\n         * @param {?} templateRef\n         * @param {?=} context\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef.prototype.createEmbeddedView = function (templateRef, context, index) { };\n        /**\n         * Instantiates a single {\\@link Component} and inserts its Host View into this container at the\n         * specified `index`.\n         *\n         * The component is instantiated using its {\\@link ComponentFactory} which can be\n         * obtained via {\\@link ComponentFactoryResolver#resolveComponentFactory}.\n         *\n         * If `index` is not specified, the new View will be inserted as the last View in the container.\n         *\n         * You can optionally specify the {\\@link Injector} that will be used as parent for the Component.\n         *\n         * Returns the {\\@link ComponentRef} of the Host View created for the newly instantiated Component.\n         * @abstract\n         * @param {?} componentFactory\n         * @param {?=} index\n         * @param {?=} injector\n         * @param {?=} projectableNodes\n         * @return {?}\n         */\n        ViewContainerRef.prototype.createComponent = function (componentFactory, index, injector, projectableNodes) { };\n        /**\n         * Inserts a View identified by a {\\@link ViewRef} into the container at the specified `index`.\n         *\n         * If `index` is not specified, the new View will be inserted as the last View in the container.\n         *\n         * Returns the inserted {\\@link ViewRef}.\n         * @abstract\n         * @param {?} viewRef\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef.prototype.insert = function (viewRef, index) { };\n        /**\n         * Moves a View identified by a {\\@link ViewRef} into the container at the specified `index`.\n         *\n         * Returns the inserted {\\@link ViewRef}.\n         * @abstract\n         * @param {?} viewRef\n         * @param {?} currentIndex\n         * @return {?}\n         */\n        ViewContainerRef.prototype.move = function (viewRef, currentIndex) { };\n        /**\n         * Returns the index of the View, specified via {\\@link ViewRef}, within the current container or\n         * `-1` if this container doesn't contain the View.\n         * @abstract\n         * @param {?} viewRef\n         * @return {?}\n         */\n        ViewContainerRef.prototype.indexOf = function (viewRef) { };\n        /**\n         * Destroys a View attached to this container at the specified `index`.\n         *\n         * If `index` is not specified, the last View in the container will be removed.\n         * @abstract\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef.prototype.remove = function (index) { };\n        /**\n         * Use along with {\\@link #insert} to move a View within the current container.\n         *\n         * If the `index` param is omitted, the last {\\@link ViewRef} is detached.\n         * @abstract\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef.prototype.detach = function (index) { };\n        return ViewContainerRef;\n    }());\n    var ViewContainerRef_ = (function () {\n        /**\n         * @param {?} _element\n         */\n        function ViewContainerRef_(_element) {\n            this._element = _element;\n            /** @internal */\n            this._createComponentInContainerScope = wtfCreateScope('ViewContainerRef#createComponent()');\n            /** @internal */\n            this._insertScope = wtfCreateScope('ViewContainerRef#insert()');\n            /** @internal */\n            this._removeScope = wtfCreateScope('ViewContainerRef#remove()');\n            /** @internal */\n            this._detachScope = wtfCreateScope('ViewContainerRef#detach()');\n        }\n        /**\n         * @param {?} index\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.get = function (index) { return this._element.nestedViews[index].ref; };\n        Object.defineProperty(ViewContainerRef_.prototype, \"length\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ views = this._element.nestedViews;\n                return isPresent(views) ? views.length : 0;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainerRef_.prototype, \"element\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._element.elementRef; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainerRef_.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._element.injector; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainerRef_.prototype, \"parentInjector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._element.parentInjector; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} templateRef\n         * @param {?=} context\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, context, index) {\n            if (context === void 0) { context = null; }\n            if (index === void 0) { index = -1; }\n            var /** @type {?} */ viewRef = templateRef.createEmbeddedView(context);\n            this.insert(viewRef, index);\n            return viewRef;\n        };\n        /**\n         * @param {?} componentFactory\n         * @param {?=} index\n         * @param {?=} injector\n         * @param {?=} projectableNodes\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.createComponent = function (componentFactory, index, injector, projectableNodes) {\n            if (index === void 0) { index = -1; }\n            if (injector === void 0) { injector = null; }\n            if (projectableNodes === void 0) { projectableNodes = null; }\n            var /** @type {?} */ s = this._createComponentInContainerScope();\n            var /** @type {?} */ contextInjector = injector || this._element.parentInjector;\n            var /** @type {?} */ componentRef = componentFactory.create(contextInjector, projectableNodes);\n            this.insert(componentRef.hostView, index);\n            return wtfLeave(s, componentRef);\n        };\n        /**\n         * @param {?} viewRef\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.insert = function (viewRef, index) {\n            if (index === void 0) { index = -1; }\n            var /** @type {?} */ s = this._insertScope();\n            if (index == -1)\n                index = this.length;\n            var /** @type {?} */ viewRef_ = (viewRef);\n            this._element.attachView(viewRef_.internalView, index);\n            return wtfLeave(s, viewRef_);\n        };\n        /**\n         * @param {?} viewRef\n         * @param {?} currentIndex\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.move = function (viewRef, currentIndex) {\n            var /** @type {?} */ s = this._insertScope();\n            if (currentIndex == -1)\n                return;\n            var /** @type {?} */ viewRef_ = (viewRef);\n            this._element.moveView(viewRef_.internalView, currentIndex);\n            return wtfLeave(s, viewRef_);\n        };\n        /**\n         * @param {?} viewRef\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.indexOf = function (viewRef) {\n            return this.length ? this._element.nestedViews.indexOf(((viewRef)).internalView) :\n                -1;\n        };\n        /**\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.remove = function (index) {\n            if (index === void 0) { index = -1; }\n            var /** @type {?} */ s = this._removeScope();\n            if (index == -1)\n                index = this.length - 1;\n            var /** @type {?} */ view = this._element.detachView(index);\n            view.destroy();\n            // view is intentionally not returned to the client.\n            wtfLeave(s);\n        };\n        /**\n         * @param {?=} index\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.detach = function (index) {\n            if (index === void 0) { index = -1; }\n            var /** @type {?} */ s = this._detachScope();\n            if (index == -1)\n                index = this.length - 1;\n            var /** @type {?} */ view = this._element.detachView(index);\n            return wtfLeave(s, view.ref);\n        };\n        /**\n         * @return {?}\n         */\n        ViewContainerRef_.prototype.clear = function () {\n            for (var /** @type {?} */ i = this.length - 1; i >= 0; i--) {\n                this.remove(i);\n            }\n        };\n        return ViewContainerRef_;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$11 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@stable\n     * @abstract\n     */\n    var ViewRef = (function (_super) {\n        __extends$11(ViewRef, _super);\n        function ViewRef() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * Destroys the view and all of the data structures associated with it.\n         * @abstract\n         * @return {?}\n         */\n        ViewRef.prototype.destroy = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        ViewRef.prototype.destroyed = function () { };\n        /**\n         * @abstract\n         * @param {?} callback\n         * @return {?}\n         */\n        ViewRef.prototype.onDestroy = function (callback) { };\n        return ViewRef;\n    }(ChangeDetectorRef));\n    /**\n     * Represents an Angular View.\n     *\n     * <!-- TODO: move the next two paragraphs to the dev guide -->\n     * A View is a fundamental building block of the application UI. It is the smallest grouping of\n     * Elements which are created and destroyed together.\n     *\n     * Properties of elements in a View can change, but the structure (number and order) of elements in\n     * a View cannot. Changing the structure of Elements can only be done by inserting, moving or\n     * removing nested Views via a {\\@link ViewContainerRef}. Each View can contain many View Containers.\n     * <!-- /TODO -->\n     *\n     * ### Example\n     *\n     * Given this template...\n     *\n     * ```\n     * Count: {{items.length}}\n     * <ul>\n     *   <li *ngFor=\"let  item of items\">{{item}}</li>\n     * </ul>\n     * ```\n     *\n     * We have two {\\@link TemplateRef}s:\n     *\n     * Outer {\\@link TemplateRef}:\n     * ```\n     * Count: {{items.length}}\n     * <ul>\n     *   <template ngFor let-item [ngForOf]=\"items\"></template>\n     * </ul>\n     * ```\n     *\n     * Inner {\\@link TemplateRef}:\n     * ```\n     *   <li>{{item}}</li>\n     * ```\n     *\n     * Notice that the original template is broken down into two separate {\\@link TemplateRef}s.\n     *\n     * The outer/inner {\\@link TemplateRef}s are then assembled into views like so:\n     *\n     * ```\n     * <!-- ViewRef: outer-0 -->\n     * Count: 2\n     * <ul>\n     *   <template view-container-ref></template>\n     *   <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->\n     *   <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->\n     * </ul>\n     * <!-- /ViewRef: outer-0 -->\n     * ```\n     * \\@experimental\n     * @abstract\n     */\n    var EmbeddedViewRef = (function (_super) {\n        __extends$11(EmbeddedViewRef, _super);\n        function EmbeddedViewRef() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        EmbeddedViewRef.prototype.context = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        EmbeddedViewRef.prototype.rootNodes = function () { };\n        return EmbeddedViewRef;\n    }(ViewRef));\n    var ViewRef_ = (function () {\n        /**\n         * @param {?} _view\n         * @param {?} animationQueue\n         */\n        function ViewRef_(_view, animationQueue) {\n            this._view = _view;\n            this.animationQueue = animationQueue;\n            this._view = _view;\n            this._originalMode = this._view.cdMode;\n        }\n        Object.defineProperty(ViewRef_.prototype, \"internalView\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewRef_.prototype, \"rootNodes\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view.flatRootNodes; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewRef_.prototype, \"context\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view.context; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewRef_.prototype, \"destroyed\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view.destroyed; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.markForCheck = function () { this._view.markPathToRootAsCheckOnce(); };\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.detach = function () { this._view.cdMode = ChangeDetectorStatus.Detached; };\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.detectChanges = function () {\n            this._view.detectChanges(false);\n            this.animationQueue.flush();\n        };\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.checkNoChanges = function () { this._view.detectChanges(true); };\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.reattach = function () {\n            this._view.cdMode = this._originalMode;\n            this.markForCheck();\n        };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        ViewRef_.prototype.onDestroy = function (callback) {\n            if (!this._view.disposables) {\n                this._view.disposables = [];\n            }\n            this._view.disposables.push(callback);\n        };\n        /**\n         * @return {?}\n         */\n        ViewRef_.prototype.destroy = function () { this._view.detachAndDestroy(); };\n        return ViewRef_;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$12 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var EventListener = (function () {\n        /**\n         * @param {?} name\n         * @param {?} callback\n         */\n        function EventListener(name, callback) {\n            this.name = name;\n            this.callback = callback;\n        }\n        ;\n        return EventListener;\n    }());\n    /**\n     * \\@experimental All debugging apis are currently experimental.\n     */\n    var DebugNode = (function () {\n        /**\n         * @param {?} nativeNode\n         * @param {?} parent\n         * @param {?} _debugInfo\n         */\n        function DebugNode(nativeNode, parent, _debugInfo) {\n            this._debugInfo = _debugInfo;\n            this.nativeNode = nativeNode;\n            if (parent && parent instanceof DebugElement) {\n                parent.addChild(this);\n            }\n            else {\n                this.parent = null;\n            }\n            this.listeners = [];\n        }\n        Object.defineProperty(DebugNode.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._debugInfo ? this._debugInfo.injector : null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugNode.prototype, \"componentInstance\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._debugInfo ? this._debugInfo.component : null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugNode.prototype, \"context\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._debugInfo ? this._debugInfo.context : null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugNode.prototype, \"references\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._debugInfo ? this._debugInfo.references : null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugNode.prototype, \"providerTokens\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._debugInfo ? this._debugInfo.providerTokens : null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugNode.prototype, \"source\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._debugInfo ? this._debugInfo.source : null; },\n            enumerable: true,\n            configurable: true\n        });\n        return DebugNode;\n    }());\n    /**\n     * \\@experimental All debugging apis are currently experimental.\n     */\n    var DebugElement = (function (_super) {\n        __extends$12(DebugElement, _super);\n        /**\n         * @param {?} nativeNode\n         * @param {?} parent\n         * @param {?} _debugInfo\n         */\n        function DebugElement(nativeNode, parent, _debugInfo) {\n            _super.call(this, nativeNode, parent, _debugInfo);\n            this.properties = {};\n            this.attributes = {};\n            this.classes = {};\n            this.styles = {};\n            this.childNodes = [];\n            this.nativeElement = nativeNode;\n        }\n        /**\n         * @param {?} child\n         * @return {?}\n         */\n        DebugElement.prototype.addChild = function (child) {\n            if (child) {\n                this.childNodes.push(child);\n                child.parent = this;\n            }\n        };\n        /**\n         * @param {?} child\n         * @return {?}\n         */\n        DebugElement.prototype.removeChild = function (child) {\n            var /** @type {?} */ childIndex = this.childNodes.indexOf(child);\n            if (childIndex !== -1) {\n                child.parent = null;\n                this.childNodes.splice(childIndex, 1);\n            }\n        };\n        /**\n         * @param {?} child\n         * @param {?} newChildren\n         * @return {?}\n         */\n        DebugElement.prototype.insertChildrenAfter = function (child, newChildren) {\n            var /** @type {?} */ siblingIndex = this.childNodes.indexOf(child);\n            if (siblingIndex !== -1) {\n                var /** @type {?} */ previousChildren = this.childNodes.slice(0, siblingIndex + 1);\n                var /** @type {?} */ nextChildren = this.childNodes.slice(siblingIndex + 1);\n                this.childNodes = previousChildren.concat(newChildren, nextChildren);\n                for (var /** @type {?} */ i = 0; i < newChildren.length; ++i) {\n                    var /** @type {?} */ newChild = newChildren[i];\n                    if (newChild.parent) {\n                        newChild.parent.removeChild(newChild);\n                    }\n                    newChild.parent = this;\n                }\n            }\n        };\n        /**\n         * @param {?} predicate\n         * @return {?}\n         */\n        DebugElement.prototype.query = function (predicate) {\n            var /** @type {?} */ results = this.queryAll(predicate);\n            return results[0] || null;\n        };\n        /**\n         * @param {?} predicate\n         * @return {?}\n         */\n        DebugElement.prototype.queryAll = function (predicate) {\n            var /** @type {?} */ matches = [];\n            _queryElementChildren(this, predicate, matches);\n            return matches;\n        };\n        /**\n         * @param {?} predicate\n         * @return {?}\n         */\n        DebugElement.prototype.queryAllNodes = function (predicate) {\n            var /** @type {?} */ matches = [];\n            _queryNodeChildren(this, predicate, matches);\n            return matches;\n        };\n        Object.defineProperty(DebugElement.prototype, \"children\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return (this.childNodes.filter(function (node) { return node instanceof DebugElement; }));\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} eventName\n         * @param {?} eventObj\n         * @return {?}\n         */\n        DebugElement.prototype.triggerEventHandler = function (eventName, eventObj) {\n            this.listeners.forEach(function (listener) {\n                if (listener.name == eventName) {\n                    listener.callback(eventObj);\n                }\n            });\n        };\n        return DebugElement;\n    }(DebugNode));\n    /**\n     * \\@experimental\n     * @param {?} debugEls\n     * @return {?}\n     */\n    function asNativeElements(debugEls) {\n        return debugEls.map(function (el) { return el.nativeElement; });\n    }\n    /**\n     * @param {?} element\n     * @param {?} predicate\n     * @param {?} matches\n     * @return {?}\n     */\n    function _queryElementChildren(element, predicate, matches) {\n        element.childNodes.forEach(function (node) {\n            if (node instanceof DebugElement) {\n                if (predicate(node)) {\n                    matches.push(node);\n                }\n                _queryElementChildren(node, predicate, matches);\n            }\n        });\n    }\n    /**\n     * @param {?} parentNode\n     * @param {?} predicate\n     * @param {?} matches\n     * @return {?}\n     */\n    function _queryNodeChildren(parentNode, predicate, matches) {\n        if (parentNode instanceof DebugElement) {\n            parentNode.childNodes.forEach(function (node) {\n                if (predicate(node)) {\n                    matches.push(node);\n                }\n                if (node instanceof DebugElement) {\n                    _queryNodeChildren(node, predicate, matches);\n                }\n            });\n        }\n    }\n    // Need to keep the nodes in a global Map so that multiple angular apps are supported.\n    var /** @type {?} */ _nativeNodeToDebugNode = new Map();\n    /**\n     * \\@experimental\n     * @param {?} nativeNode\n     * @return {?}\n     */\n    function getDebugNode(nativeNode) {\n        return _nativeNodeToDebugNode.get(nativeNode);\n    }\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function indexDebugNode(node) {\n        _nativeNodeToDebugNode.set(node.nativeNode, node);\n    }\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function removeDebugNodeFromIndex(node) {\n        _nativeNodeToDebugNode.delete(node.nativeNode);\n    }\n\n    /**\n     * @return {?}\n     */\n    function _reflector() {\n        return reflector;\n    }\n    var /** @type {?} */ _CORE_PLATFORM_PROVIDERS = [\n        PlatformRef_,\n        { provide: PlatformRef, useExisting: PlatformRef_ },\n        { provide: Reflector, useFactory: _reflector, deps: [] },\n        { provide: ReflectorReader, useExisting: Reflector },\n        TestabilityRegistry,\n        Console,\n    ];\n    /**\n     * This platform has to be included in any other platform\n     *\n     * @experimental\n     */\n    var /** @type {?} */ platformCore = createPlatformFactory(null, 'core', _CORE_PLATFORM_PROVIDERS);\n\n    /**\n     * @experimental i18n support is experimental.\n     */\n    var /** @type {?} */ LOCALE_ID = new OpaqueToken('LocaleId');\n    /**\n     * @experimental i18n support is experimental.\n     */\n    var /** @type {?} */ TRANSLATIONS = new OpaqueToken('Translations');\n    /**\n     * @experimental i18n support is experimental.\n     */\n    var /** @type {?} */ TRANSLATIONS_FORMAT = new OpaqueToken('TranslationsFormat');\n\n    /**\n     * @return {?}\n     */\n    function _iterableDiffersFactory() {\n        return defaultIterableDiffers;\n    }\n    /**\n     * @return {?}\n     */\n    function _keyValueDiffersFactory() {\n        return defaultKeyValueDiffers;\n    }\n    /**\n     * @param {?=} locale\n     * @return {?}\n     */\n    function _localeFactory(locale) {\n        return locale || 'en-US';\n    }\n    /**\n     * This module includes the providers of \\@angular/core that are needed\n     * to bootstrap components via `ApplicationRef`.\n     *\n     * \\@experimental\n     */\n    var ApplicationModule = (function () {\n        function ApplicationModule() {\n        }\n        ApplicationModule.decorators = [\n            { type: NgModule, args: [{\n                        providers: [\n                            ApplicationRef_,\n                            { provide: ApplicationRef, useExisting: ApplicationRef_ },\n                            ApplicationInitStatus,\n                            Compiler,\n                            APP_ID_RANDOM_PROVIDER,\n                            ViewUtils,\n                            AnimationQueue,\n                            { provide: IterableDiffers, useFactory: _iterableDiffersFactory },\n                            { provide: KeyValueDiffers, useFactory: _keyValueDiffersFactory },\n                            {\n                                provide: LOCALE_ID,\n                                useFactory: _localeFactory,\n                                deps: [[new Inject(LOCALE_ID), new Optional(), new SkipSelf()]]\n                            },\n                        ]\n                    },] },\n        ];\n        /** @nocollapse */\n        ApplicationModule.ctorParameters = function () { return []; };\n        return ApplicationModule;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ FILL_STYLE_FLAG = 'true'; // TODO (matsko): change to boolean\n    var /** @type {?} */ ANY_STATE = '*';\n    var /** @type {?} */ DEFAULT_STATE = '*';\n    var /** @type {?} */ EMPTY_STATE = 'void';\n\n    var AnimationGroupPlayer = (function () {\n        /**\n         * @param {?} _players\n         */\n        function AnimationGroupPlayer(_players) {\n            var _this = this;\n            this._players = _players;\n            this._onDoneFns = [];\n            this._onStartFns = [];\n            this._finished = false;\n            this._started = false;\n            this._destroyed = false;\n            this.parentPlayer = null;\n            var count = 0;\n            var total = this._players.length;\n            if (total == 0) {\n                scheduleMicroTask(function () { return _this._onFinish(); });\n            }\n            else {\n                this._players.forEach(function (player) {\n                    player.parentPlayer = _this;\n                    player.onDone(function () {\n                        if (++count >= total) {\n                            _this._onFinish();\n                        }\n                    });\n                });\n            }\n        }\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype._onFinish = function () {\n            if (!this._finished) {\n                this._finished = true;\n                this._onDoneFns.forEach(function (fn) { return fn(); });\n                this._onDoneFns = [];\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.init = function () { this._players.forEach(function (player) { return player.init(); }); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.hasStarted = function () { return this._started; };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.play = function () {\n            if (!isPresent(this.parentPlayer)) {\n                this.init();\n            }\n            if (!this.hasStarted()) {\n                this._onStartFns.forEach(function (fn) { return fn(); });\n                this._onStartFns = [];\n                this._started = true;\n            }\n            this._players.forEach(function (player) { return player.play(); });\n        };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.pause = function () { this._players.forEach(function (player) { return player.pause(); }); };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.restart = function () { this._players.forEach(function (player) { return player.restart(); }); };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.finish = function () {\n            this._onFinish();\n            this._players.forEach(function (player) { return player.finish(); });\n        };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.destroy = function () {\n            if (!this._destroyed) {\n                this._onFinish();\n                this._players.forEach(function (player) { return player.destroy(); });\n                this._destroyed = true;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.reset = function () {\n            this._players.forEach(function (player) { return player.reset(); });\n            this._destroyed = false;\n            this._finished = false;\n            this._started = false;\n        };\n        /**\n         * @param {?} p\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.setPosition = function (p) {\n            this._players.forEach(function (player) { player.setPosition(p); });\n        };\n        /**\n         * @return {?}\n         */\n        AnimationGroupPlayer.prototype.getPosition = function () {\n            var /** @type {?} */ min = 0;\n            this._players.forEach(function (player) {\n                var /** @type {?} */ p = player.getPosition();\n                min = Math.min(p, min);\n            });\n            return min;\n        };\n        Object.defineProperty(AnimationGroupPlayer.prototype, \"players\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._players; },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationGroupPlayer;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * `AnimationKeyframe` consists of a series of styles (contained within {\\@link AnimationStyles\n     * `AnimationStyles`})\n     * and an offset value indicating when those styles are applied within the `duration/delay/easing`\n     * timings.\n     * `AnimationKeyframe` is mostly an internal class which is designed to be used alongside {\\@link\n     * Renderer#animate-anchor `Renderer.animate`}.\n     *\n     * \\@experimental Animation support is experimental\n     */\n    var AnimationKeyframe = (function () {\n        /**\n         * @param {?} offset\n         * @param {?} styles\n         */\n        function AnimationKeyframe(offset, styles) {\n            this.offset = offset;\n            this.styles = styles;\n        }\n        return AnimationKeyframe;\n    }());\n\n    /**\n     * \\@experimental Animation support is experimental.\n     * @abstract\n     */\n    var AnimationPlayer = (function () {\n        function AnimationPlayer() {\n        }\n        /**\n         * @abstract\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationPlayer.prototype.onDone = function (fn) { };\n        /**\n         * @abstract\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationPlayer.prototype.onStart = function (fn) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.init = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.hasStarted = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.play = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.pause = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.restart = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.finish = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.destroy = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.reset = function () { };\n        /**\n         * @abstract\n         * @param {?} p\n         * @return {?}\n         */\n        AnimationPlayer.prototype.setPosition = function (p) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        AnimationPlayer.prototype.getPosition = function () { };\n        Object.defineProperty(AnimationPlayer.prototype, \"parentPlayer\", {\n            /**\n             * @return {?}\n             */\n            get: function () { throw new Error('NOT IMPLEMENTED: Base Class'); },\n            /**\n             * @param {?} player\n             * @return {?}\n             */\n            set: function (player) { throw new Error('NOT IMPLEMENTED: Base Class'); },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationPlayer;\n    }());\n    var NoOpAnimationPlayer = (function () {\n        function NoOpAnimationPlayer() {\n            var _this = this;\n            this._onDoneFns = [];\n            this._onStartFns = [];\n            this._started = false;\n            this.parentPlayer = null;\n            scheduleMicroTask(function () { return _this._onFinish(); });\n        }\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype._onFinish = function () {\n            this._onDoneFns.forEach(function (fn) { return fn(); });\n            this._onDoneFns = [];\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.hasStarted = function () { return this._started; };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.init = function () { };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.play = function () {\n            if (!this.hasStarted()) {\n                this._onStartFns.forEach(function (fn) { return fn(); });\n                this._onStartFns = [];\n            }\n            this._started = true;\n        };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.pause = function () { };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.restart = function () { };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.finish = function () { this._onFinish(); };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.destroy = function () { };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.reset = function () { };\n        /**\n         * @param {?} p\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.setPosition = function (p) { };\n        /**\n         * @return {?}\n         */\n        NoOpAnimationPlayer.prototype.getPosition = function () { return 0; };\n        return NoOpAnimationPlayer;\n    }());\n\n    var AnimationSequencePlayer = (function () {\n        /**\n         * @param {?} _players\n         */\n        function AnimationSequencePlayer(_players) {\n            var _this = this;\n            this._players = _players;\n            this._currentIndex = 0;\n            this._onDoneFns = [];\n            this._onStartFns = [];\n            this._finished = false;\n            this._started = false;\n            this._destroyed = false;\n            this.parentPlayer = null;\n            this._players.forEach(function (player) { player.parentPlayer = _this; });\n            this._onNext(false);\n        }\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype._onNext = function (start) {\n            var _this = this;\n            if (this._finished)\n                return;\n            if (this._players.length == 0) {\n                this._activePlayer = new NoOpAnimationPlayer();\n                scheduleMicroTask(function () { return _this._onFinish(); });\n            }\n            else if (this._currentIndex >= this._players.length) {\n                this._activePlayer = new NoOpAnimationPlayer();\n                this._onFinish();\n            }\n            else {\n                var /** @type {?} */ player = this._players[this._currentIndex++];\n                player.onDone(function () { return _this._onNext(true); });\n                this._activePlayer = player;\n                if (start) {\n                    player.play();\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype._onFinish = function () {\n            if (!this._finished) {\n                this._finished = true;\n                this._onDoneFns.forEach(function (fn) { return fn(); });\n                this._onDoneFns = [];\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.init = function () { this._players.forEach(function (player) { return player.init(); }); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.hasStarted = function () { return this._started; };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.play = function () {\n            if (!isPresent(this.parentPlayer)) {\n                this.init();\n            }\n            if (!this.hasStarted()) {\n                this._onStartFns.forEach(function (fn) { return fn(); });\n                this._onStartFns = [];\n                this._started = true;\n            }\n            this._activePlayer.play();\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.pause = function () { this._activePlayer.pause(); };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.restart = function () {\n            this.reset();\n            if (this._players.length > 0) {\n                this._players[0].restart();\n            }\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.reset = function () {\n            this._players.forEach(function (player) { return player.reset(); });\n            this._destroyed = false;\n            this._finished = false;\n            this._started = false;\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.finish = function () {\n            this._onFinish();\n            this._players.forEach(function (player) { return player.finish(); });\n        };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.destroy = function () {\n            if (!this._destroyed) {\n                this._onFinish();\n                this._players.forEach(function (player) { return player.destroy(); });\n                this._destroyed = true;\n                this._activePlayer = new NoOpAnimationPlayer();\n            }\n        };\n        /**\n         * @param {?} p\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.setPosition = function (p) { this._players[0].setPosition(p); };\n        /**\n         * @return {?}\n         */\n        AnimationSequencePlayer.prototype.getPosition = function () { return this._players[0].getPosition(); };\n        Object.defineProperty(AnimationSequencePlayer.prototype, \"players\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._players; },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationSequencePlayer;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$13 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @experimental Animation support is experimental.\n     */\n    var /** @type {?} */ AUTO_STYLE = '*';\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link trigger trigger\n     * animation function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationEntryMetadata = (function () {\n        /**\n         * @param {?} name\n         * @param {?} definitions\n         */\n        function AnimationEntryMetadata(name, definitions) {\n            this.name = name;\n            this.definitions = definitions;\n        }\n        return AnimationEntryMetadata;\n    }());\n    /**\n     * \\@experimental Animation support is experimental.\n     * @abstract\n     */\n    var AnimationStateMetadata = (function () {\n        function AnimationStateMetadata() {\n        }\n        return AnimationStateMetadata;\n    }());\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link state state animation\n     * function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationStateDeclarationMetadata = (function (_super) {\n        __extends$13(AnimationStateDeclarationMetadata, _super);\n        /**\n         * @param {?} stateNameExpr\n         * @param {?} styles\n         */\n        function AnimationStateDeclarationMetadata(stateNameExpr, styles) {\n            _super.call(this);\n            this.stateNameExpr = stateNameExpr;\n            this.styles = styles;\n        }\n        return AnimationStateDeclarationMetadata;\n    }(AnimationStateMetadata));\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the\n     * {\\@link transition transition animation function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationStateTransitionMetadata = (function (_super) {\n        __extends$13(AnimationStateTransitionMetadata, _super);\n        /**\n         * @param {?} stateChangeExpr\n         * @param {?} steps\n         */\n        function AnimationStateTransitionMetadata(stateChangeExpr, steps) {\n            _super.call(this);\n            this.stateChangeExpr = stateChangeExpr;\n            this.steps = steps;\n        }\n        return AnimationStateTransitionMetadata;\n    }(AnimationStateMetadata));\n    /**\n     * \\@experimental Animation support is experimental.\n     * @abstract\n     */\n    var AnimationMetadata = (function () {\n        function AnimationMetadata() {\n        }\n        return AnimationMetadata;\n    }());\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link keyframes keyframes\n     * animation function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationKeyframesSequenceMetadata = (function (_super) {\n        __extends$13(AnimationKeyframesSequenceMetadata, _super);\n        /**\n         * @param {?} steps\n         */\n        function AnimationKeyframesSequenceMetadata(steps) {\n            _super.call(this);\n            this.steps = steps;\n        }\n        return AnimationKeyframesSequenceMetadata;\n    }(AnimationMetadata));\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link style style animation\n     * function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationStyleMetadata = (function (_super) {\n        __extends$13(AnimationStyleMetadata, _super);\n        /**\n         * @param {?} styles\n         * @param {?=} offset\n         */\n        function AnimationStyleMetadata(styles, offset) {\n            if (offset === void 0) { offset = null; }\n            _super.call(this);\n            this.styles = styles;\n            this.offset = offset;\n        }\n        return AnimationStyleMetadata;\n    }(AnimationMetadata));\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link animate animate\n     * animation function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationAnimateMetadata = (function (_super) {\n        __extends$13(AnimationAnimateMetadata, _super);\n        /**\n         * @param {?} timings\n         * @param {?} styles\n         */\n        function AnimationAnimateMetadata(timings, styles) {\n            _super.call(this);\n            this.timings = timings;\n            this.styles = styles;\n        }\n        return AnimationAnimateMetadata;\n    }(AnimationMetadata));\n    /**\n     * \\@experimental Animation support is experimental.\n     * @abstract\n     */\n    var AnimationWithStepsMetadata = (function (_super) {\n        __extends$13(AnimationWithStepsMetadata, _super);\n        function AnimationWithStepsMetadata() {\n            _super.call(this);\n        }\n        Object.defineProperty(AnimationWithStepsMetadata.prototype, \"steps\", {\n            /**\n             * @return {?}\n             */\n            get: function () { throw new Error('NOT IMPLEMENTED: Base Class'); },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationWithStepsMetadata;\n    }(AnimationMetadata));\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link sequence sequence\n     * animation function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationSequenceMetadata = (function (_super) {\n        __extends$13(AnimationSequenceMetadata, _super);\n        /**\n         * @param {?} _steps\n         */\n        function AnimationSequenceMetadata(_steps) {\n            _super.call(this);\n            this._steps = _steps;\n        }\n        Object.defineProperty(AnimationSequenceMetadata.prototype, \"steps\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._steps; },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationSequenceMetadata;\n    }(AnimationWithStepsMetadata));\n    /**\n     * Metadata representing the entry of animations.\n     * Instances of this class are provided via the animation DSL when the {\\@link group group animation\n     * function} is called.\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationGroupMetadata = (function (_super) {\n        __extends$13(AnimationGroupMetadata, _super);\n        /**\n         * @param {?} _steps\n         */\n        function AnimationGroupMetadata(_steps) {\n            _super.call(this);\n            this._steps = _steps;\n        }\n        Object.defineProperty(AnimationGroupMetadata.prototype, \"steps\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._steps; },\n            enumerable: true,\n            configurable: true\n        });\n        return AnimationGroupMetadata;\n    }(AnimationWithStepsMetadata));\n    /**\n     * `animate` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `animate` specifies an animation step that will apply the provided `styles` data for a given\n     * amount of\n     * time based on the provided `timing` expression value. Calls to `animate` are expected to be\n     * used within {\\@link sequence an animation sequence}, {\\@link group group}, or {\\@link transition\n     * transition}.\n     *\n     * ### Usage\n     *\n     * The `animate` function accepts two input parameters: `timing` and `styles`:\n     *\n     * - `timing` is a string based value that can be a combination of a duration with optional\n     * delay and easing values. The format for the expression breaks down to `duration delay easing`\n     * (therefore a value such as `1s 100ms ease-out` will be parse itself into `duration=1000,\n     * delay=100, easing=ease-out`.\n     * If a numeric value is provided then that will be used as the `duration` value in millisecond\n     * form.\n     * - `styles` is the style input data which can either be a call to {\\@link style style} or {\\@link\n     * keyframes keyframes}.\n     * If left empty then the styles from the destination state will be collected and used (this is\n     * useful when\n     * describing an animation step that will complete an animation by {\\@link\n     * transition#the-final-animate-call animating to the final state}).\n     *\n     * ```typescript\n     * // various functions for specifying timing data\n     * animate(500, style(...))\n     * animate(\"1s\", style(...))\n     * animate(\"100ms 0.5s\", style(...))\n     * animate(\"5s ease\", style(...))\n     * animate(\"5s 10ms cubic-bezier(.17,.67,.88,.1)\", style(...))\n     *\n     * // either style() of keyframes() can be used\n     * animate(500, style({ background: \"red\" }))\n     * animate(500, keyframes([\n     *   style({ background: \"blue\" })),\n     *   style({ background: \"red\" }))\n     * ])\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} timing\n     * @param {?=} styles\n     * @return {?}\n     */\n    function animate(timing, styles) {\n        if (styles === void 0) { styles = null; }\n        var /** @type {?} */ stylesEntry = styles;\n        if (!isPresent(stylesEntry)) {\n            var /** @type {?} */ EMPTY_STYLE = {};\n            stylesEntry = new AnimationStyleMetadata([EMPTY_STYLE], 1);\n        }\n        return new AnimationAnimateMetadata(timing, stylesEntry);\n    }\n    /**\n     * `group` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `group` specifies a list of animation steps that are all run in parallel. Grouped animations\n     * are useful when a series of styles must be animated/closed off\n     * at different statrting/ending times.\n     *\n     * The `group` function can either be used within a {\\@link sequence sequence} or a {\\@link transition\n     * transition}\n     * and it will only continue to the next instruction once all of the inner animation steps\n     * have completed.\n     *\n     * ### Usage\n     *\n     * The `steps` data that is passed into the `group` animation function can either consist\n     * of {\\@link style style} or {\\@link animate animate} function calls. Each call to `style()` or\n     * `animate()`\n     * within a group will be executed instantly (use {\\@link keyframes keyframes} or a\n     * {\\@link animate#usage animate() with a delay value} to offset styles to be applied at a later\n     * time).\n     *\n     * ```typescript\n     * group([\n     *   animate(\"1s\", { background: \"black\" }))\n     *   animate(\"2s\", { color: \"white\" }))\n     * ])\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} steps\n     * @return {?}\n     */\n    function group(steps) {\n        return new AnimationGroupMetadata(steps);\n    }\n    /**\n     * `sequence` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `sequence` Specifies a list of animation steps that are run one by one. (`sequence` is used\n     * by default when an array is passed as animation data into {\\@link transition transition}.)\n     *\n     * The `sequence` function can either be used within a {\\@link group group} or a {\\@link transition\n     * transition}\n     * and it will only continue to the next instruction once each of the inner animation steps\n     * have completed.\n     *\n     * To perform animation styling in parallel with other animation steps then\n     * have a look at the {\\@link group group} animation function.\n     *\n     * ### Usage\n     *\n     * The `steps` data that is passed into the `sequence` animation function can either consist\n     * of {\\@link style style} or {\\@link animate animate} function calls. A call to `style()` will apply\n     * the\n     * provided styling data immediately while a call to `animate()` will apply its styling\n     * data over a given time depending on its timing data.\n     *\n     * ```typescript\n     * sequence([\n     *   style({ opacity: 0 })),\n     *   animate(\"1s\", { opacity: 1 }))\n     * ])\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} steps\n     * @return {?}\n     */\n    function sequence(steps) {\n        return new AnimationSequenceMetadata(steps);\n    }\n    /**\n     * `style` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `style` declares a key/value object containing CSS properties/styles that can then\n     * be used for {\\@link state animation states}, within an {\\@link sequence animation sequence}, or as\n     * styling data for both {\\@link animate animate} and {\\@link keyframes keyframes}.\n     *\n     * ### Usage\n     *\n     * `style` takes in a key/value string map as data and expects one or more CSS property/value\n     * pairs to be defined.\n     *\n     * ```typescript\n     * // string values are used for css properties\n     * style({ background: \"red\", color: \"blue\" })\n     *\n     * // numerical (pixel) values are also supported\n     * style({ width: 100, height: 0 })\n     * ```\n     *\n     * #### Auto-styles (using `*`)\n     *\n     * When an asterix (`*`) character is used as a value then it will be detected from the element\n     * being animated\n     * and applied as animation data when the animation starts.\n     *\n     * This feature proves useful for a state depending on layout and/or environment factors; in such\n     * cases\n     * the styles are calculated just before the animation starts.\n     *\n     * ```typescript\n     * // the steps below will animate from 0 to the\n     * // actual height of the element\n     * style({ height: 0 }),\n     * animate(\"1s\", style({ height: \"*\" }))\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} tokens\n     * @return {?}\n     */\n    function style(tokens) {\n        var /** @type {?} */ input;\n        var /** @type {?} */ offset = null;\n        if (typeof tokens === 'string') {\n            input = [(tokens)];\n        }\n        else {\n            if (Array.isArray(tokens)) {\n                input = (tokens);\n            }\n            else {\n                input = [(tokens)];\n            }\n            input.forEach(function (entry) {\n                var /** @type {?} */ entryOffset = ((entry) /** TODO #9100 */)['offset'];\n                if (isPresent(entryOffset)) {\n                    offset = offset == null ? parseFloat(entryOffset) : offset;\n                }\n            });\n        }\n        return new AnimationStyleMetadata(input, offset);\n    }\n    /**\n     * `state` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `state` declares an animation state within the given trigger. When a state is\n     * active within a component then its associated styles will persist on\n     * the element that the trigger is attached to (even when the animation ends).\n     *\n     * To animate between states, have a look at the animation {\\@link transition transition}\n     * DSL function. To register states to an animation trigger please have a look\n     * at the {\\@link trigger trigger} function.\n     *\n     * #### The `void` state\n     *\n     * The `void` state value is a reserved word that angular uses to determine when the element is not\n     * apart\n     * of the application anymore (e.g. when an `ngIf` evaluates to false then the state of the\n     * associated element\n     * is void).\n     *\n     * #### The `*` (default) state\n     *\n     * The `*` state (when styled) is a fallback state that will be used if\n     * the state that is being animated is not declared within the trigger.\n     *\n     * ### Usage\n     *\n     * `state` will declare an animation state with its associated styles\n     * within the given trigger.\n     *\n     * - `stateNameExpr` can be one or more state names separated by commas.\n     * - `styles` refers to the {\\@link style styling data} that will be persisted on the element once\n     * the state\n     * has been reached.\n     *\n     * ```typescript\n     * // \"void\" is a reserved name for a state and is used to represent\n     * // the state in which an element is detached from from the application.\n     * state(\"void\", style({ height: 0 }))\n     *\n     * // user-defined states\n     * state(\"closed\", style({ height: 0 }))\n     * state(\"open, visible\", style({ height: \"*\" }))\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} stateNameExpr\n     * @param {?} styles\n     * @return {?}\n     */\n    function state(stateNameExpr, styles) {\n        return new AnimationStateDeclarationMetadata(stateNameExpr, styles);\n    }\n    /**\n     * `keyframes` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `keyframes` specifies a collection of {\\@link style style} entries each optionally characterized\n     * by an `offset` value.\n     *\n     * ### Usage\n     *\n     * The `keyframes` animation function is designed to be used alongside the {\\@link animate animate}\n     * animation function. Instead of applying animations from where they are\n     * currently to their destination, keyframes can describe how each style entry is applied\n     * and at what point within the animation arc (much like CSS Keyframe Animations do).\n     *\n     * For each `style()` entry an `offset` value can be set. Doing so allows to specifiy at\n     * what percentage of the animate time the styles will be applied.\n     *\n     * ```typescript\n     * // the provided offset values describe when each backgroundColor value is applied.\n     * animate(\"5s\", keyframes([\n     *   style({ backgroundColor: \"red\", offset: 0 }),\n     *   style({ backgroundColor: \"blue\", offset: 0.2 }),\n     *   style({ backgroundColor: \"orange\", offset: 0.3 }),\n     *   style({ backgroundColor: \"black\", offset: 1 })\n     * ]))\n     * ```\n     *\n     * Alternatively, if there are no `offset` values used within the style entries then the offsets\n     * will\n     * be calculated automatically.\n     *\n     * ```typescript\n     * animate(\"5s\", keyframes([\n     *   style({ backgroundColor: \"red\" }) // offset = 0\n     *   style({ backgroundColor: \"blue\" }) // offset = 0.33\n     *   style({ backgroundColor: \"orange\" }) // offset = 0.66\n     *   style({ backgroundColor: \"black\" }) // offset = 1\n     * ]))\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} steps\n     * @return {?}\n     */\n    function keyframes(steps) {\n        return new AnimationKeyframesSequenceMetadata(steps);\n    }\n    /**\n     * `transition` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `transition` declares the {\\@link sequence sequence of animation steps} that will be run when the\n     * provided\n     * `stateChangeExpr` value is satisfied. The `stateChangeExpr` consists of a `state1 => state2`\n     * which consists\n     * of two known states (use an asterix (`*`) to refer to a dynamic starting and/or ending state).\n     *\n     * Animation transitions are placed within an {\\@link trigger animation trigger}. For an transition\n     * to animate to\n     * a state value and persist its styles then one or more {\\@link state animation states} is expected\n     * to be defined.\n     *\n     * ### Usage\n     *\n     * An animation transition is kicked off the `stateChangeExpr` predicate evaluates to true based on\n     * what the\n     * previous state is and what the current state has become. In other words, if a transition is\n     * defined that\n     * matches the old/current state criteria then the associated animation will be triggered.\n     *\n     * ```typescript\n     * // all transition/state changes are defined within an animation trigger\n     * trigger(\"myAnimationTrigger\", [\n     *   // if a state is defined then its styles will be persisted when the\n     *   // animation has fully completed itself\n     *   state(\"on\", style({ background: \"green\" })),\n     *   state(\"off\", style({ background: \"grey\" })),\n     *\n     *   // a transition animation that will be kicked off when the state value\n     *   // bound to \"myAnimationTrigger\" changes from \"on\" to \"off\"\n     *   transition(\"on => off\", animate(500)),\n     *\n     *   // it is also possible to do run the same animation for both directions\n     *   transition(\"on <=> off\", animate(500)),\n     *\n     *   // or to define multiple states pairs separated by commas\n     *   transition(\"on => off, off => void\", animate(500)),\n     *\n     *   // this is a catch-all state change for when an element is inserted into\n     *   // the page and the destination state is unknown\n     *   transition(\"void => *\", [\n     *     style({ opacity: 0 }),\n     *     animate(500)\n     *   ]),\n     *\n     *   // this will capture a state change between any states\n     *   transition(\"* => *\", animate(\"1s 0s\")),\n     * ])\n     * ```\n     *\n     * The template associated with this component will make use of the `myAnimationTrigger`\n     * animation trigger by binding to an element within its template code.\n     *\n     * ```html\n     * <!-- somewhere inside of my-component-tpl.html -->\n     * <div [\\@myAnimationTrigger]=\"myStatusExp\">...</div>\n     * ```\n     *\n     * #### The final `animate` call\n     *\n     * If the final step within the transition steps is a call to `animate()` that **only**\n     * uses a timing value with **no style data** then it will be automatically used as the final\n     * animation\n     * arc for the element to animate itself to the final state. This involves an automatic mix of\n     * adding/removing CSS styles so that the element will be in the exact state it should be for the\n     * applied state to be presented correctly.\n     *\n     * ```\n     * // start off by hiding the element, but make sure that it animates properly to whatever state\n     * // is currently active for \"myAnimationTrigger\"\n     * transition(\"void => *\", [\n     *   style({ opacity: 0 }),\n     *   animate(500)\n     * ])\n     * ```\n     *\n     * ### Transition Aliases (`:enter` and `:leave`)\n     *\n     * Given that enter (insertion) and leave (removal) animations are so common,\n     * the `transition` function accepts both `:enter` and `:leave` values which\n     * are aliases for the `void => *` and `* => void` state changes.\n     *\n     * ```\n     * transition(\":enter\", [\n     *   style({ opacity: 0 }),\n     *   animate(500, style({ opacity: 1 }))\n     * ])\n     * transition(\":leave\", [\n     *   animate(500, style({ opacity: 0 }))\n     * ])\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} stateChangeExpr\n     * @param {?} steps\n     * @return {?}\n     */\n    function transition(stateChangeExpr, steps) {\n        var /** @type {?} */ animationData = Array.isArray(steps) ? new AnimationSequenceMetadata(steps) : steps;\n        return new AnimationStateTransitionMetadata(stateChangeExpr, animationData);\n    }\n    /**\n     * `trigger` is an animation-specific function that is designed to be used inside of Angular2's\n     * animation\n     * DSL language. If this information is new, please navigate to the\n     * {\\@link Component#animations-anchor component animations metadata\n     * page} to gain a better understanding of how animations in Angular2 are used.\n     *\n     * `trigger` Creates an animation trigger which will a list of {\\@link state state} and {\\@link\n     * transition transition}\n     * entries that will be evaluated when the expression bound to the trigger changes.\n     *\n     * Triggers are registered within the component annotation data under the\n     * {\\@link Component#animations-anchor animations section}. An animation trigger can\n     * be placed on an element within a template by referencing the name of the\n     * trigger followed by the expression value that the trigger is bound to\n     * (in the form of `[\\@triggerName]=\"expression\"`.\n     *\n     * ### Usage\n     *\n     * `trigger` will create an animation trigger reference based on the provided `name` value.\n     * The provided `animation` value is expected to be an array consisting of {\\@link state state} and\n     * {\\@link transition transition}\n     * declarations.\n     *\n     * ```typescript\n     * \\@Component({\n     *   selector: 'my-component',\n     *   templateUrl: 'my-component-tpl.html',\n     *   animations: [\n     *     trigger(\"myAnimationTrigger\", [\n     *       state(...),\n     *       state(...),\n     *       transition(...),\n     *       transition(...)\n     *     ])\n     *   ]\n     * })\n     * class MyComponent {\n     *   myStatusExp = \"something\";\n     * }\n     * ```\n     *\n     * The template associated with this component will make use of the `myAnimationTrigger`\n     * animation trigger by binding to an element within its template code.\n     *\n     * ```html\n     * <!-- somewhere inside of my-component-tpl.html -->\n     * <div [\\@myAnimationTrigger]=\"myStatusExp\">...</div>\n     * ```\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n     *\n     * {\\@example core/animation/ts/dsl/animation_example.ts region='Component'}\n     *\n     * \\@experimental Animation support is experimental.\n     * @param {?} name\n     * @param {?} animation\n     * @return {?}\n     */\n    function trigger(name, animation) {\n        return new AnimationEntryMetadata(name, animation);\n    }\n\n    /**\n     * @param {?} previousStyles\n     * @param {?} newStyles\n     * @param {?=} nullValue\n     * @return {?}\n     */\n    function prepareFinalAnimationStyles(previousStyles, newStyles, nullValue) {\n        if (nullValue === void 0) { nullValue = null; }\n        var /** @type {?} */ finalStyles = {};\n        Object.keys(newStyles).forEach(function (prop) {\n            var /** @type {?} */ value = newStyles[prop];\n            finalStyles[prop] = value == AUTO_STYLE ? nullValue : value.toString();\n        });\n        Object.keys(previousStyles).forEach(function (prop) {\n            if (!isPresent(finalStyles[prop])) {\n                finalStyles[prop] = nullValue;\n            }\n        });\n        return finalStyles;\n    }\n    /**\n     * @param {?} collectedStyles\n     * @param {?} finalStateStyles\n     * @param {?} keyframes\n     * @return {?}\n     */\n    function balanceAnimationKeyframes(collectedStyles, finalStateStyles, keyframes) {\n        var /** @type {?} */ limit = keyframes.length - 1;\n        var /** @type {?} */ firstKeyframe = keyframes[0];\n        // phase 1: copy all the styles from the first keyframe into the lookup map\n        var /** @type {?} */ flatenedFirstKeyframeStyles = flattenStyles(firstKeyframe.styles.styles);\n        var /** @type {?} */ extraFirstKeyframeStyles = {};\n        var /** @type {?} */ hasExtraFirstStyles = false;\n        Object.keys(collectedStyles).forEach(function (prop) {\n            var /** @type {?} */ value = (collectedStyles[prop]);\n            // if the style is already defined in the first keyframe then\n            // we do not replace it.\n            if (!flatenedFirstKeyframeStyles[prop]) {\n                flatenedFirstKeyframeStyles[prop] = value;\n                extraFirstKeyframeStyles[prop] = value;\n                hasExtraFirstStyles = true;\n            }\n        });\n        var /** @type {?} */ keyframeCollectedStyles = StringMapWrapper.merge({}, flatenedFirstKeyframeStyles);\n        // phase 2: normalize the final keyframe\n        var /** @type {?} */ finalKeyframe = keyframes[limit];\n        finalKeyframe.styles.styles.unshift(finalStateStyles);\n        var /** @type {?} */ flatenedFinalKeyframeStyles = flattenStyles(finalKeyframe.styles.styles);\n        var /** @type {?} */ extraFinalKeyframeStyles = {};\n        var /** @type {?} */ hasExtraFinalStyles = false;\n        Object.keys(keyframeCollectedStyles).forEach(function (prop) {\n            if (!isPresent(flatenedFinalKeyframeStyles[prop])) {\n                extraFinalKeyframeStyles[prop] = AUTO_STYLE;\n                hasExtraFinalStyles = true;\n            }\n        });\n        if (hasExtraFinalStyles) {\n            finalKeyframe.styles.styles.push(extraFinalKeyframeStyles);\n        }\n        Object.keys(flatenedFinalKeyframeStyles).forEach(function (prop) {\n            if (!isPresent(flatenedFirstKeyframeStyles[prop])) {\n                extraFirstKeyframeStyles[prop] = AUTO_STYLE;\n                hasExtraFirstStyles = true;\n            }\n        });\n        if (hasExtraFirstStyles) {\n            firstKeyframe.styles.styles.push(extraFirstKeyframeStyles);\n        }\n        collectAndResolveStyles(collectedStyles, [finalStateStyles]);\n        return keyframes;\n    }\n    /**\n     * @param {?} styles\n     * @return {?}\n     */\n    function clearStyles(styles) {\n        var /** @type {?} */ finalStyles = {};\n        Object.keys(styles).forEach(function (key) { finalStyles[key] = null; });\n        return finalStyles;\n    }\n    /**\n     * @param {?} collection\n     * @param {?} styles\n     * @return {?}\n     */\n    function collectAndResolveStyles(collection, styles) {\n        return styles.map(function (entry) {\n            var /** @type {?} */ stylesObj = {};\n            Object.keys(entry).forEach(function (prop) {\n                var /** @type {?} */ value = entry[prop];\n                if (value == FILL_STYLE_FLAG) {\n                    value = collection[prop];\n                    if (!isPresent(value)) {\n                        value = AUTO_STYLE;\n                    }\n                }\n                collection[prop] = value;\n                stylesObj[prop] = value;\n            });\n            return stylesObj;\n        });\n    }\n    /**\n     * @param {?} element\n     * @param {?} renderer\n     * @param {?} styles\n     * @return {?}\n     */\n    function renderStyles(element, renderer, styles) {\n        Object.keys(styles).forEach(function (prop) { renderer.setElementStyle(element, prop, styles[prop]); });\n    }\n    /**\n     * @param {?} styles\n     * @return {?}\n     */\n    function flattenStyles(styles) {\n        var /** @type {?} */ finalStyles = {};\n        styles.forEach(function (entry) {\n            Object.keys(entry).forEach(function (prop) { finalStyles[prop] = (entry[prop]); });\n        });\n        return finalStyles;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * `AnimationStyles` consists of a collection of key/value maps containing CSS-based style data\n     * that can either be used as initial styling data or apart of a series of keyframes within an\n     * animation.\n     * This class is mostly internal, and it is designed to be used alongside\n     * {\\@link AnimationKeyframe `AnimationKeyframe`} and {\\@link Renderer#animate-anchor\n     * `Renderer.animate`}.\n     *\n     * \\@experimental Animation support is experimental\n     */\n    var AnimationStyles = (function () {\n        /**\n         * @param {?} styles\n         */\n        function AnimationStyles(styles) {\n            this.styles = styles;\n        }\n        return AnimationStyles;\n    }());\n\n    /**\n     * An instance of this class is returned as an event parameter when an animation\n     * callback is captured for an animation either during the start or done phase.\n     *\n     * ```typescript\n     * \\@Component({\n     *   host: {\n     *     '[\\@myAnimationTrigger]': 'someExpression',\n     *     '(\\@myAnimationTrigger.start)': 'captureStartEvent($event)',\n     *     '(\\@myAnimationTrigger.done)': 'captureDoneEvent($event)',\n     *   },\n     *   animations: [\n     *     trigger(\"myAnimationTrigger\", [\n     *        // ...\n     *     ])\n     *   ]\n     * })\n     * class MyComponent {\n     *   someExpression: any = false;\n     *   captureStartEvent(event: AnimationTransitionEvent) {\n     *     // the toState, fromState and totalTime data is accessible from the event variable\n     *   }\n     *\n     *   captureDoneEvent(event: AnimationTransitionEvent) {\n     *     // the toState, fromState and totalTime data is accessible from the event variable\n     *   }\n     * }\n     * ```\n     *\n     * \\@experimental Animation support is experimental.\n     */\n    var AnimationTransitionEvent = (function () {\n        /**\n         * @param {?} __0\n         */\n        function AnimationTransitionEvent(_a) {\n            var fromState = _a.fromState, toState = _a.toState, totalTime = _a.totalTime, phaseName = _a.phaseName;\n            this.fromState = fromState;\n            this.toState = toState;\n            this.totalTime = totalTime;\n            this.phaseName = phaseName;\n        }\n        return AnimationTransitionEvent;\n    }());\n\n    var AnimationTransition = (function () {\n        /**\n         * @param {?} _player\n         * @param {?} _fromState\n         * @param {?} _toState\n         * @param {?} _totalTime\n         */\n        function AnimationTransition(_player, _fromState, _toState, _totalTime) {\n            this._player = _player;\n            this._fromState = _fromState;\n            this._toState = _toState;\n            this._totalTime = _totalTime;\n        }\n        /**\n         * @param {?} phaseName\n         * @return {?}\n         */\n        AnimationTransition.prototype._createEvent = function (phaseName) {\n            return new AnimationTransitionEvent({\n                fromState: this._fromState,\n                toState: this._toState,\n                totalTime: this._totalTime,\n                phaseName: phaseName\n            });\n        };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        AnimationTransition.prototype.onStart = function (callback) {\n            var _this = this;\n            var /** @type {?} */ fn = (Zone.current.wrap(function () { return callback(_this._createEvent('start')); }, 'player.onStart'));\n            this._player.onStart(fn);\n        };\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        AnimationTransition.prototype.onDone = function (callback) {\n            var _this = this;\n            var /** @type {?} */ fn = (Zone.current.wrap(function () { return callback(_this._createEvent('done')); }, 'player.onDone'));\n            this._player.onDone(fn);\n        };\n        return AnimationTransition;\n    }());\n\n    var DebugDomRootRenderer = (function () {\n        /**\n         * @param {?} _delegate\n         */\n        function DebugDomRootRenderer(_delegate) {\n            this._delegate = _delegate;\n        }\n        /**\n         * @param {?} componentProto\n         * @return {?}\n         */\n        DebugDomRootRenderer.prototype.renderComponent = function (componentProto) {\n            return new DebugDomRenderer(this._delegate.renderComponent(componentProto));\n        };\n        return DebugDomRootRenderer;\n    }());\n    var DebugDomRenderer = (function () {\n        /**\n         * @param {?} _delegate\n         */\n        function DebugDomRenderer(_delegate) {\n            this._delegate = _delegate;\n        }\n        /**\n         * @param {?} selectorOrNode\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) {\n            var /** @type {?} */ nativeEl = this._delegate.selectRootElement(selectorOrNode, debugInfo);\n            var /** @type {?} */ debugEl = new DebugElement(nativeEl, null, debugInfo);\n            indexDebugNode(debugEl);\n            return nativeEl;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} name\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.createElement = function (parentElement, name, debugInfo) {\n            var /** @type {?} */ nativeEl = this._delegate.createElement(parentElement, name, debugInfo);\n            var /** @type {?} */ debugEl = new DebugElement(nativeEl, getDebugNode(parentElement), debugInfo);\n            debugEl.name = name;\n            indexDebugNode(debugEl);\n            return nativeEl;\n        };\n        /**\n         * @param {?} hostElement\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.createViewRoot = function (hostElement) { return this._delegate.createViewRoot(hostElement); };\n        /**\n         * @param {?} parentElement\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) {\n            var /** @type {?} */ comment = this._delegate.createTemplateAnchor(parentElement, debugInfo);\n            var /** @type {?} */ debugEl = new DebugNode(comment, getDebugNode(parentElement), debugInfo);\n            indexDebugNode(debugEl);\n            return comment;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} value\n         * @param {?=} debugInfo\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.createText = function (parentElement, value, debugInfo) {\n            var /** @type {?} */ text = this._delegate.createText(parentElement, value, debugInfo);\n            var /** @type {?} */ debugEl = new DebugNode(text, getDebugNode(parentElement), debugInfo);\n            indexDebugNode(debugEl);\n            return text;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} nodes\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.projectNodes = function (parentElement, nodes) {\n            var /** @type {?} */ debugParent = getDebugNode(parentElement);\n            if (isPresent(debugParent) && debugParent instanceof DebugElement) {\n                var /** @type {?} */ debugElement_1 = debugParent;\n                nodes.forEach(function (node) { debugElement_1.addChild(getDebugNode(node)); });\n            }\n            this._delegate.projectNodes(parentElement, nodes);\n        };\n        /**\n         * @param {?} node\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.attachViewAfter = function (node, viewRootNodes) {\n            var /** @type {?} */ debugNode = getDebugNode(node);\n            if (isPresent(debugNode)) {\n                var /** @type {?} */ debugParent = debugNode.parent;\n                if (viewRootNodes.length > 0 && isPresent(debugParent)) {\n                    var /** @type {?} */ debugViewRootNodes_1 = [];\n                    viewRootNodes.forEach(function (rootNode) { return debugViewRootNodes_1.push(getDebugNode(rootNode)); });\n                    debugParent.insertChildrenAfter(debugNode, debugViewRootNodes_1);\n                }\n            }\n            this._delegate.attachViewAfter(node, viewRootNodes);\n        };\n        /**\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.detachView = function (viewRootNodes) {\n            viewRootNodes.forEach(function (node) {\n                var /** @type {?} */ debugNode = getDebugNode(node);\n                if (isPresent(debugNode) && isPresent(debugNode.parent)) {\n                    debugNode.parent.removeChild(debugNode);\n                }\n            });\n            this._delegate.detachView(viewRootNodes);\n        };\n        /**\n         * @param {?} hostElement\n         * @param {?} viewAllNodes\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.destroyView = function (hostElement, viewAllNodes) {\n            viewAllNodes = viewAllNodes || [];\n            viewAllNodes.forEach(function (node) { removeDebugNodeFromIndex(getDebugNode(node)); });\n            this._delegate.destroyView(hostElement, viewAllNodes);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.listen = function (renderElement, name, callback) {\n            var /** @type {?} */ debugEl = getDebugNode(renderElement);\n            if (isPresent(debugEl)) {\n                debugEl.listeners.push(new EventListener(name, callback));\n            }\n            return this._delegate.listen(renderElement, name, callback);\n        };\n        /**\n         * @param {?} target\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.listenGlobal = function (target, name, callback) {\n            return this._delegate.listenGlobal(target, name, callback);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) {\n            var /** @type {?} */ debugEl = getDebugNode(renderElement);\n            if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n                debugEl.properties[propertyName] = propertyValue;\n            }\n            this._delegate.setElementProperty(renderElement, propertyName, propertyValue);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} attributeName\n         * @param {?} attributeValue\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) {\n            var /** @type {?} */ debugEl = getDebugNode(renderElement);\n            if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n                debugEl.attributes[attributeName] = attributeValue;\n            }\n            this._delegate.setElementAttribute(renderElement, attributeName, attributeValue);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) {\n            this._delegate.setBindingDebugInfo(renderElement, propertyName, propertyValue);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} className\n         * @param {?} isAdd\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setElementClass = function (renderElement, className, isAdd) {\n            var /** @type {?} */ debugEl = getDebugNode(renderElement);\n            if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n                debugEl.classes[className] = isAdd;\n            }\n            this._delegate.setElementClass(renderElement, className, isAdd);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} styleName\n         * @param {?} styleValue\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) {\n            var /** @type {?} */ debugEl = getDebugNode(renderElement);\n            if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n                debugEl.styles[styleName] = styleValue;\n            }\n            this._delegate.setElementStyle(renderElement, styleName, styleValue);\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} methodName\n         * @param {?=} args\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.invokeElementMethod = function (renderElement, methodName, args) {\n            this._delegate.invokeElementMethod(renderElement, methodName, args);\n        };\n        /**\n         * @param {?} renderNode\n         * @param {?} text\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.setText = function (renderNode, text) { this._delegate.setText(renderNode, text); };\n        /**\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        DebugDomRenderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            return this._delegate.animate(element, startingStyles, keyframes, duration, delay, easing, previousPlayers);\n        };\n        return DebugDomRenderer;\n    }());\n\n    var ViewType = {};\n    ViewType.HOST = 0;\n    ViewType.COMPONENT = 1;\n    ViewType.EMBEDDED = 2;\n    ViewType[ViewType.HOST] = \"HOST\";\n    ViewType[ViewType.COMPONENT] = \"COMPONENT\";\n    ViewType[ViewType.EMBEDDED] = \"EMBEDDED\";\n\n    var StaticNodeDebugInfo = (function () {\n        /**\n         * @param {?} providerTokens\n         * @param {?} componentToken\n         * @param {?} refTokens\n         */\n        function StaticNodeDebugInfo(providerTokens, componentToken, refTokens) {\n            this.providerTokens = providerTokens;\n            this.componentToken = componentToken;\n            this.refTokens = refTokens;\n        }\n        return StaticNodeDebugInfo;\n    }());\n    var DebugContext = (function () {\n        /**\n         * @param {?} _view\n         * @param {?} _nodeIndex\n         * @param {?} _tplRow\n         * @param {?} _tplCol\n         */\n        function DebugContext(_view, _nodeIndex, _tplRow, _tplCol) {\n            this._view = _view;\n            this._nodeIndex = _nodeIndex;\n            this._tplRow = _tplRow;\n            this._tplCol = _tplCol;\n        }\n        Object.defineProperty(DebugContext.prototype, \"_staticNodeInfo\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return isPresent(this._nodeIndex) ? this._view.staticNodeDebugInfos[this._nodeIndex] : null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"context\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view.context; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"component\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n                if (isPresent(staticNodeInfo) && isPresent(staticNodeInfo.componentToken)) {\n                    return this.injector.get(staticNodeInfo.componentToken);\n                }\n                return null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"componentRenderElement\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ componentView = this._view;\n                while (isPresent(componentView.parentView) && componentView.type !== ViewType.COMPONENT) {\n                    componentView = (componentView.parentView);\n                }\n                return componentView.parentElement;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._view.injector(this._nodeIndex); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"renderNode\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                if (isPresent(this._nodeIndex) && this._view.allNodes) {\n                    return this._view.allNodes[this._nodeIndex];\n                }\n                else {\n                    return null;\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"providerTokens\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n                return isPresent(staticNodeInfo) ? staticNodeInfo.providerTokens : null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"source\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._view.componentType.templateUrl + \":\" + this._tplRow + \":\" + this._tplCol;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(DebugContext.prototype, \"references\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var _this = this;\n                var /** @type {?} */ varValues = {};\n                var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n                if (isPresent(staticNodeInfo)) {\n                    var /** @type {?} */ refs_1 = staticNodeInfo.refTokens;\n                    Object.keys(refs_1).forEach(function (refName) {\n                        var /** @type {?} */ refToken = refs_1[refName];\n                        var /** @type {?} */ varValue;\n                        if (isBlank(refToken)) {\n                            varValue = _this._view.allNodes ? _this._view.allNodes[_this._nodeIndex] : null;\n                        }\n                        else {\n                            varValue = _this._view.injectorGet(refToken, _this._nodeIndex, null);\n                        }\n                        varValues[refName] = varValue;\n                    });\n                }\n                return varValues;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return DebugContext;\n    }());\n\n    var ViewAnimationMap = (function () {\n        function ViewAnimationMap() {\n            this._map = new Map();\n            this._allPlayers = [];\n        }\n        /**\n         * @param {?} element\n         * @param {?} animationName\n         * @return {?}\n         */\n        ViewAnimationMap.prototype.find = function (element, animationName) {\n            var /** @type {?} */ playersByAnimation = this._map.get(element);\n            if (isPresent(playersByAnimation)) {\n                return playersByAnimation[animationName];\n            }\n        };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        ViewAnimationMap.prototype.findAllPlayersByElement = function (element) {\n            var /** @type {?} */ el = this._map.get(element);\n            return el ? Object.keys(el).map(function (k) { return el[k]; }) : [];\n        };\n        /**\n         * @param {?} element\n         * @param {?} animationName\n         * @param {?} player\n         * @return {?}\n         */\n        ViewAnimationMap.prototype.set = function (element, animationName, player) {\n            var /** @type {?} */ playersByAnimation = this._map.get(element);\n            if (!isPresent(playersByAnimation)) {\n                playersByAnimation = {};\n            }\n            var /** @type {?} */ existingEntry = playersByAnimation[animationName];\n            if (isPresent(existingEntry)) {\n                this.remove(element, animationName);\n            }\n            playersByAnimation[animationName] = player;\n            this._allPlayers.push(player);\n            this._map.set(element, playersByAnimation);\n        };\n        /**\n         * @return {?}\n         */\n        ViewAnimationMap.prototype.getAllPlayers = function () { return this._allPlayers; };\n        /**\n         * @param {?} element\n         * @param {?} animationName\n         * @param {?=} targetPlayer\n         * @return {?}\n         */\n        ViewAnimationMap.prototype.remove = function (element, animationName, targetPlayer) {\n            if (targetPlayer === void 0) { targetPlayer = null; }\n            var /** @type {?} */ playersByAnimation = this._map.get(element);\n            if (playersByAnimation) {\n                var /** @type {?} */ player = playersByAnimation[animationName];\n                if (!targetPlayer || player === targetPlayer) {\n                    delete playersByAnimation[animationName];\n                    var /** @type {?} */ index = this._allPlayers.indexOf(player);\n                    this._allPlayers.splice(index, 1);\n                    if (Object.keys(playersByAnimation).length === 0) {\n                        this._map.delete(element);\n                    }\n                }\n            }\n        };\n        return ViewAnimationMap;\n    }());\n\n    var AnimationViewContext = (function () {\n        /**\n         * @param {?} _animationQueue\n         */\n        function AnimationViewContext(_animationQueue) {\n            this._animationQueue = _animationQueue;\n            this._players = new ViewAnimationMap();\n        }\n        /**\n         * @param {?} callback\n         * @return {?}\n         */\n        AnimationViewContext.prototype.onAllActiveAnimationsDone = function (callback) {\n            var /** @type {?} */ activeAnimationPlayers = this._players.getAllPlayers();\n            // we check for the length to avoid having GroupAnimationPlayer\n            // issue an unnecessary microtask when zero players are passed in\n            if (activeAnimationPlayers.length) {\n                new AnimationGroupPlayer(activeAnimationPlayers).onDone(function () { return callback(); });\n            }\n            else {\n                callback();\n            }\n        };\n        /**\n         * @param {?} element\n         * @param {?} animationName\n         * @param {?} player\n         * @return {?}\n         */\n        AnimationViewContext.prototype.queueAnimation = function (element, animationName, player) {\n            var _this = this;\n            this._animationQueue.enqueue(player);\n            this._players.set(element, animationName, player);\n            player.onDone(function () { return _this._players.remove(element, animationName, player); });\n        };\n        /**\n         * @param {?} element\n         * @param {?=} animationName\n         * @return {?}\n         */\n        AnimationViewContext.prototype.getAnimationPlayers = function (element, animationName) {\n            if (animationName === void 0) { animationName = null; }\n            var /** @type {?} */ players = [];\n            if (animationName) {\n                var /** @type {?} */ currentPlayer = this._players.find(element, animationName);\n                if (currentPlayer) {\n                    _recursePlayers(currentPlayer, players);\n                }\n            }\n            else {\n                this._players.findAllPlayersByElement(element).forEach(function (player) { return _recursePlayers(player, players); });\n            }\n            return players;\n        };\n        return AnimationViewContext;\n    }());\n    /**\n     * @param {?} player\n     * @param {?} collectedPlayers\n     * @return {?}\n     */\n    function _recursePlayers(player, collectedPlayers) {\n        if ((player instanceof AnimationGroupPlayer) || (player instanceof AnimationSequencePlayer)) {\n            player.players.forEach(function (player) { return _recursePlayers(player, collectedPlayers); });\n        }\n        else {\n            collectedPlayers.push(player);\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$15 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var ElementInjector = (function (_super) {\n        __extends$15(ElementInjector, _super);\n        /**\n         * @param {?} _view\n         * @param {?} _nodeIndex\n         */\n        function ElementInjector(_view, _nodeIndex) {\n            _super.call(this);\n            this._view = _view;\n            this._nodeIndex = _nodeIndex;\n        }\n        /**\n         * @param {?} token\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        ElementInjector.prototype.get = function (token, notFoundValue) {\n            if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n            return this._view.injectorGet(token, this._nodeIndex, notFoundValue);\n        };\n        return ElementInjector;\n    }(Injector));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$14 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _scope_check = wtfCreateScope(\"AppView#check(ascii id)\");\n    /**\n     * @experimental\n     */\n    var /** @type {?} */ EMPTY_CONTEXT = new Object();\n    var /** @type {?} */ UNDEFINED$1 = new Object();\n    /**\n     * Cost of making objects: http://jsperf.com/instantiate-size-of-object\n     *\n     * @abstract\n     */\n    var AppView = (function () {\n        /**\n         * @param {?} clazz\n         * @param {?} componentType\n         * @param {?} type\n         * @param {?} viewUtils\n         * @param {?} parentView\n         * @param {?} parentIndex\n         * @param {?} parentElement\n         * @param {?} cdMode\n         * @param {?=} declaredViewContainer\n         */\n        function AppView(clazz, componentType, type, viewUtils, parentView, parentIndex, parentElement, cdMode, declaredViewContainer) {\n            if (declaredViewContainer === void 0) { declaredViewContainer = null; }\n            this.clazz = clazz;\n            this.componentType = componentType;\n            this.type = type;\n            this.viewUtils = viewUtils;\n            this.parentView = parentView;\n            this.parentIndex = parentIndex;\n            this.parentElement = parentElement;\n            this.cdMode = cdMode;\n            this.declaredViewContainer = declaredViewContainer;\n            this.numberOfChecks = 0;\n            this.ref = new ViewRef_(this, viewUtils.animationQueue);\n            if (type === ViewType.COMPONENT || type === ViewType.HOST) {\n                this.renderer = viewUtils.renderComponent(componentType);\n            }\n            else {\n                this.renderer = parentView.renderer;\n            }\n            this._directRenderer = this.renderer.directRenderer;\n        }\n        Object.defineProperty(AppView.prototype, \"animationContext\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                if (!this._animationContext) {\n                    this._animationContext = new AnimationViewContext(this.viewUtils.animationQueue);\n                }\n                return this._animationContext;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppView.prototype, \"destroyed\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.cdMode === ChangeDetectorStatus.Destroyed; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} context\n         * @return {?}\n         */\n        AppView.prototype.create = function (context) {\n            this.context = context;\n            return this.createInternal(null);\n        };\n        /**\n         * @param {?} rootSelectorOrNode\n         * @param {?} hostInjector\n         * @param {?} projectableNodes\n         * @return {?}\n         */\n        AppView.prototype.createHostView = function (rootSelectorOrNode, hostInjector, projectableNodes) {\n            this.context = (EMPTY_CONTEXT);\n            this._hasExternalHostElement = isPresent(rootSelectorOrNode);\n            this._hostInjector = hostInjector;\n            this._hostProjectableNodes = projectableNodes;\n            return this.createInternal(rootSelectorOrNode);\n        };\n        /**\n         * Overwritten by implementations.\n         * Returns the ComponentRef for the host element for ViewType.HOST.\n         * @param {?} rootSelectorOrNode\n         * @return {?}\n         */\n        AppView.prototype.createInternal = function (rootSelectorOrNode) { return null; };\n        /**\n         * Overwritten by implementations.\n         * @param {?} templateNodeIndex\n         * @return {?}\n         */\n        AppView.prototype.createEmbeddedViewInternal = function (templateNodeIndex) { return null; };\n        /**\n         * @param {?} lastRootNode\n         * @param {?} allNodes\n         * @param {?} disposables\n         * @return {?}\n         */\n        AppView.prototype.init = function (lastRootNode, allNodes, disposables) {\n            this.lastRootNode = lastRootNode;\n            this.allNodes = allNodes;\n            this.disposables = disposables;\n            if (this.type === ViewType.COMPONENT) {\n                this.dirtyParentQueriesInternal();\n            }\n        };\n        /**\n         * @param {?} token\n         * @param {?} nodeIndex\n         * @param {?=} notFoundValue\n         * @return {?}\n         */\n        AppView.prototype.injectorGet = function (token, nodeIndex, notFoundValue) {\n            if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n            var /** @type {?} */ result = UNDEFINED$1;\n            var /** @type {?} */ view = this;\n            while (result === UNDEFINED$1) {\n                if (isPresent(nodeIndex)) {\n                    result = view.injectorGetInternal(token, nodeIndex, UNDEFINED$1);\n                }\n                if (result === UNDEFINED$1 && view.type === ViewType.HOST) {\n                    result = view._hostInjector.get(token, notFoundValue);\n                }\n                nodeIndex = view.parentIndex;\n                view = view.parentView;\n            }\n            return result;\n        };\n        /**\n         * Overwritten by implementations\n         * @param {?} token\n         * @param {?} nodeIndex\n         * @param {?} notFoundResult\n         * @return {?}\n         */\n        AppView.prototype.injectorGetInternal = function (token, nodeIndex, notFoundResult) {\n            return notFoundResult;\n        };\n        /**\n         * @param {?} nodeIndex\n         * @return {?}\n         */\n        AppView.prototype.injector = function (nodeIndex) { return new ElementInjector(this, nodeIndex); };\n        /**\n         * @return {?}\n         */\n        AppView.prototype.detachAndDestroy = function () {\n            if (this.viewContainer) {\n                this.viewContainer.detachView(this.viewContainer.nestedViews.indexOf(this));\n            }\n            else if (this.appRef) {\n                this.appRef.detachView(this.ref);\n            }\n            else if (this._hasExternalHostElement) {\n                this.detach();\n            }\n            this.destroy();\n        };\n        /**\n         * @return {?}\n         */\n        AppView.prototype.destroy = function () {\n            var _this = this;\n            if (this.cdMode === ChangeDetectorStatus.Destroyed) {\n                return;\n            }\n            var /** @type {?} */ hostElement = this.type === ViewType.COMPONENT ? this.parentElement : null;\n            if (this.disposables) {\n                for (var /** @type {?} */ i = 0; i < this.disposables.length; i++) {\n                    this.disposables[i]();\n                }\n            }\n            this.destroyInternal();\n            this.dirtyParentQueriesInternal();\n            if (this._animationContext) {\n                this._animationContext.onAllActiveAnimationsDone(function () { return _this.renderer.destroyView(hostElement, _this.allNodes); });\n            }\n            else {\n                this.renderer.destroyView(hostElement, this.allNodes);\n            }\n            this.cdMode = ChangeDetectorStatus.Destroyed;\n        };\n        /**\n         * Overwritten by implementations\n         * @return {?}\n         */\n        AppView.prototype.destroyInternal = function () { };\n        /**\n         * Overwritten by implementations\n         * @return {?}\n         */\n        AppView.prototype.detachInternal = function () { };\n        /**\n         * @return {?}\n         */\n        AppView.prototype.detach = function () {\n            var _this = this;\n            this.detachInternal();\n            if (this._animationContext) {\n                this._animationContext.onAllActiveAnimationsDone(function () { return _this._renderDetach(); });\n            }\n            else {\n                this._renderDetach();\n            }\n            if (this.declaredViewContainer && this.declaredViewContainer !== this.viewContainer &&\n                this.declaredViewContainer.projectedViews) {\n                var /** @type {?} */ projectedViews = this.declaredViewContainer.projectedViews;\n                var /** @type {?} */ index = projectedViews.indexOf(this);\n                // perf: pop is faster than splice!\n                if (index >= projectedViews.length - 1) {\n                    projectedViews.pop();\n                }\n                else {\n                    projectedViews.splice(index, 1);\n                }\n            }\n            this.appRef = null;\n            this.viewContainer = null;\n            this.dirtyParentQueriesInternal();\n        };\n        /**\n         * @return {?}\n         */\n        AppView.prototype._renderDetach = function () {\n            if (this._directRenderer) {\n                this.visitRootNodesInternal(this._directRenderer.remove, null);\n            }\n            else {\n                this.renderer.detachView(this.flatRootNodes);\n            }\n        };\n        /**\n         * @param {?} appRef\n         * @return {?}\n         */\n        AppView.prototype.attachToAppRef = function (appRef) {\n            if (this.viewContainer) {\n                throw new Error('This view is already attached to a ViewContainer!');\n            }\n            this.appRef = appRef;\n            this.dirtyParentQueriesInternal();\n        };\n        /**\n         * @param {?} viewContainer\n         * @param {?} prevView\n         * @return {?}\n         */\n        AppView.prototype.attachAfter = function (viewContainer, prevView) {\n            if (this.appRef) {\n                throw new Error('This view is already attached directly to the ApplicationRef!');\n            }\n            this._renderAttach(viewContainer, prevView);\n            this.viewContainer = viewContainer;\n            if (this.declaredViewContainer && this.declaredViewContainer !== viewContainer) {\n                if (!this.declaredViewContainer.projectedViews) {\n                    this.declaredViewContainer.projectedViews = [];\n                }\n                this.declaredViewContainer.projectedViews.push(this);\n            }\n            this.dirtyParentQueriesInternal();\n        };\n        /**\n         * @param {?} viewContainer\n         * @param {?} prevView\n         * @return {?}\n         */\n        AppView.prototype.moveAfter = function (viewContainer, prevView) {\n            this._renderAttach(viewContainer, prevView);\n            this.dirtyParentQueriesInternal();\n        };\n        /**\n         * @param {?} viewContainer\n         * @param {?} prevView\n         * @return {?}\n         */\n        AppView.prototype._renderAttach = function (viewContainer, prevView) {\n            var /** @type {?} */ prevNode = prevView ? prevView.lastRootNode : viewContainer.nativeElement;\n            if (this._directRenderer) {\n                var /** @type {?} */ nextSibling = this._directRenderer.nextSibling(prevNode);\n                if (nextSibling) {\n                    this.visitRootNodesInternal(this._directRenderer.insertBefore, nextSibling);\n                }\n                else {\n                    var /** @type {?} */ parentElement = this._directRenderer.parentElement(prevNode);\n                    if (parentElement) {\n                        this.visitRootNodesInternal(this._directRenderer.appendChild, parentElement);\n                    }\n                }\n            }\n            else {\n                this.renderer.attachViewAfter(prevNode, this.flatRootNodes);\n            }\n        };\n        Object.defineProperty(AppView.prototype, \"changeDetectorRef\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.ref; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(AppView.prototype, \"flatRootNodes\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ nodes = [];\n                this.visitRootNodesInternal(addToArray, nodes);\n                return nodes;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} parentElement\n         * @param {?} ngContentIndex\n         * @return {?}\n         */\n        AppView.prototype.projectNodes = function (parentElement, ngContentIndex) {\n            if (this._directRenderer) {\n                this.visitProjectedNodes(ngContentIndex, this._directRenderer.appendChild, parentElement);\n            }\n            else {\n                var /** @type {?} */ nodes = [];\n                this.visitProjectedNodes(ngContentIndex, addToArray, nodes);\n                this.renderer.projectNodes(parentElement, nodes);\n            }\n        };\n        /**\n         * @param {?} ngContentIndex\n         * @param {?} cb\n         * @param {?} c\n         * @return {?}\n         */\n        AppView.prototype.visitProjectedNodes = function (ngContentIndex, cb, c) {\n            switch (this.type) {\n                case ViewType.EMBEDDED:\n                    this.parentView.visitProjectedNodes(ngContentIndex, cb, c);\n                    break;\n                case ViewType.COMPONENT:\n                    if (this.parentView.type === ViewType.HOST) {\n                        var /** @type {?} */ nodes = this.parentView._hostProjectableNodes[ngContentIndex] || [];\n                        for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n                            cb(nodes[i], c);\n                        }\n                    }\n                    else {\n                        this.parentView.visitProjectableNodesInternal(this.parentIndex, ngContentIndex, cb, c);\n                    }\n                    break;\n            }\n        };\n        /**\n         * Overwritten by implementations\n         * @param {?} cb\n         * @param {?} c\n         * @return {?}\n         */\n        AppView.prototype.visitRootNodesInternal = function (cb, c) { };\n        /**\n         * Overwritten by implementations\n         * @param {?} nodeIndex\n         * @param {?} ngContentIndex\n         * @param {?} cb\n         * @param {?} c\n         * @return {?}\n         */\n        AppView.prototype.visitProjectableNodesInternal = function (nodeIndex, ngContentIndex, cb, c) { };\n        /**\n         * Overwritten by implementations\n         * @return {?}\n         */\n        AppView.prototype.dirtyParentQueriesInternal = function () { };\n        /**\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        AppView.prototype.internalDetectChanges = function (throwOnChange) {\n            if (this.cdMode !== ChangeDetectorStatus.Detached) {\n                this.detectChanges(throwOnChange);\n            }\n        };\n        /**\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        AppView.prototype.detectChanges = function (throwOnChange) {\n            var /** @type {?} */ s = _scope_check(this.clazz);\n            if (this.cdMode === ChangeDetectorStatus.Checked ||\n                this.cdMode === ChangeDetectorStatus.Errored)\n                return;\n            if (this.cdMode === ChangeDetectorStatus.Destroyed) {\n                this.throwDestroyedError('detectChanges');\n            }\n            this.detectChangesInternal(throwOnChange);\n            if (this.cdMode === ChangeDetectorStatus.CheckOnce)\n                this.cdMode = ChangeDetectorStatus.Checked;\n            this.numberOfChecks++;\n            wtfLeave(s);\n        };\n        /**\n         * Overwritten by implementations\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        AppView.prototype.detectChangesInternal = function (throwOnChange) { };\n        /**\n         * @return {?}\n         */\n        AppView.prototype.markAsCheckOnce = function () { this.cdMode = ChangeDetectorStatus.CheckOnce; };\n        /**\n         * @return {?}\n         */\n        AppView.prototype.markPathToRootAsCheckOnce = function () {\n            var /** @type {?} */ c = this;\n            while (isPresent(c) && c.cdMode !== ChangeDetectorStatus.Detached) {\n                if (c.cdMode === ChangeDetectorStatus.Checked) {\n                    c.cdMode = ChangeDetectorStatus.CheckOnce;\n                }\n                if (c.type === ViewType.COMPONENT) {\n                    c = c.parentView;\n                }\n                else {\n                    c = c.viewContainer ? c.viewContainer.parentView : null;\n                }\n            }\n        };\n        /**\n         * @param {?} cb\n         * @return {?}\n         */\n        AppView.prototype.eventHandler = function (cb) {\n            return cb;\n        };\n        /**\n         * @param {?} details\n         * @return {?}\n         */\n        AppView.prototype.throwDestroyedError = function (details) { throw new ViewDestroyedError(details); };\n        return AppView;\n    }());\n    var DebugAppView = (function (_super) {\n        __extends$14(DebugAppView, _super);\n        /**\n         * @param {?} clazz\n         * @param {?} componentType\n         * @param {?} type\n         * @param {?} viewUtils\n         * @param {?} parentView\n         * @param {?} parentIndex\n         * @param {?} parentNode\n         * @param {?} cdMode\n         * @param {?} staticNodeDebugInfos\n         * @param {?=} declaredViewContainer\n         */\n        function DebugAppView(clazz, componentType, type, viewUtils, parentView, parentIndex, parentNode, cdMode, staticNodeDebugInfos, declaredViewContainer) {\n            if (declaredViewContainer === void 0) { declaredViewContainer = null; }\n            _super.call(this, clazz, componentType, type, viewUtils, parentView, parentIndex, parentNode, cdMode, declaredViewContainer);\n            this.staticNodeDebugInfos = staticNodeDebugInfos;\n            this._currentDebugContext = null;\n        }\n        /**\n         * @param {?} context\n         * @return {?}\n         */\n        DebugAppView.prototype.create = function (context) {\n            this._resetDebug();\n            try {\n                return _super.prototype.create.call(this, context);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @param {?} rootSelectorOrNode\n         * @param {?} injector\n         * @param {?=} projectableNodes\n         * @return {?}\n         */\n        DebugAppView.prototype.createHostView = function (rootSelectorOrNode, injector, projectableNodes) {\n            if (projectableNodes === void 0) { projectableNodes = null; }\n            this._resetDebug();\n            try {\n                return _super.prototype.createHostView.call(this, rootSelectorOrNode, injector, projectableNodes);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @param {?} token\n         * @param {?} nodeIndex\n         * @param {?=} notFoundResult\n         * @return {?}\n         */\n        DebugAppView.prototype.injectorGet = function (token, nodeIndex, notFoundResult) {\n            this._resetDebug();\n            try {\n                return _super.prototype.injectorGet.call(this, token, nodeIndex, notFoundResult);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DebugAppView.prototype.detach = function () {\n            this._resetDebug();\n            try {\n                _super.prototype.detach.call(this);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DebugAppView.prototype.destroy = function () {\n            this._resetDebug();\n            try {\n                _super.prototype.destroy.call(this);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        DebugAppView.prototype.detectChanges = function (throwOnChange) {\n            this._resetDebug();\n            try {\n                _super.prototype.detectChanges.call(this, throwOnChange);\n            }\n            catch (e) {\n                this._rethrowWithContext(e);\n                throw e;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DebugAppView.prototype._resetDebug = function () { this._currentDebugContext = null; };\n        /**\n         * @param {?} nodeIndex\n         * @param {?} rowNum\n         * @param {?} colNum\n         * @return {?}\n         */\n        DebugAppView.prototype.debug = function (nodeIndex, rowNum, colNum) {\n            return this._currentDebugContext = new DebugContext(this, nodeIndex, rowNum, colNum);\n        };\n        /**\n         * @param {?} e\n         * @return {?}\n         */\n        DebugAppView.prototype._rethrowWithContext = function (e) {\n            if (!(e instanceof ViewWrappedError)) {\n                if (!(e instanceof ExpressionChangedAfterItHasBeenCheckedError)) {\n                    this.cdMode = ChangeDetectorStatus.Errored;\n                }\n                if (isPresent(this._currentDebugContext)) {\n                    throw new ViewWrappedError(e, this._currentDebugContext);\n                }\n            }\n        };\n        /**\n         * @param {?} cb\n         * @return {?}\n         */\n        DebugAppView.prototype.eventHandler = function (cb) {\n            var _this = this;\n            var /** @type {?} */ superHandler = _super.prototype.eventHandler.call(this, cb);\n            return function (eventName, event) {\n                _this._resetDebug();\n                try {\n                    return superHandler.call(_this, eventName, event);\n                }\n                catch (e) {\n                    _this._rethrowWithContext(e);\n                    throw e;\n                }\n            };\n        };\n        return DebugAppView;\n    }(AppView));\n\n    /**\n     * A ViewContainer is created for elements that have a ViewContainerRef\n     * to keep track of the nested views.\n     */\n    var ViewContainer = (function () {\n        /**\n         * @param {?} index\n         * @param {?} parentIndex\n         * @param {?} parentView\n         * @param {?} nativeElement\n         */\n        function ViewContainer(index, parentIndex, parentView, nativeElement) {\n            this.index = index;\n            this.parentIndex = parentIndex;\n            this.parentView = parentView;\n            this.nativeElement = nativeElement;\n        }\n        Object.defineProperty(ViewContainer.prototype, \"elementRef\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return new ElementRef(this.nativeElement); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainer.prototype, \"vcRef\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return new ViewContainerRef_(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainer.prototype, \"parentInjector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.parentView.injector(this.parentIndex); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ViewContainer.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.parentView.injector(this.index); },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        ViewContainer.prototype.detectChangesInNestedViews = function (throwOnChange) {\n            if (this.nestedViews) {\n                for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n                    this.nestedViews[i].detectChanges(throwOnChange);\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        ViewContainer.prototype.destroyNestedViews = function () {\n            if (this.nestedViews) {\n                for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n                    this.nestedViews[i].destroy();\n                }\n            }\n        };\n        /**\n         * @param {?} cb\n         * @param {?} c\n         * @return {?}\n         */\n        ViewContainer.prototype.visitNestedViewRootNodes = function (cb, c) {\n            if (this.nestedViews) {\n                for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n                    this.nestedViews[i].visitRootNodesInternal(cb, c);\n                }\n            }\n        };\n        /**\n         * @param {?} nestedViewClass\n         * @param {?} callback\n         * @return {?}\n         */\n        ViewContainer.prototype.mapNestedViews = function (nestedViewClass, callback) {\n            var /** @type {?} */ result = [];\n            if (this.nestedViews) {\n                for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n                    var /** @type {?} */ nestedView = this.nestedViews[i];\n                    if (nestedView.clazz === nestedViewClass) {\n                        result.push(callback(nestedView));\n                    }\n                }\n            }\n            if (this.projectedViews) {\n                for (var /** @type {?} */ i = 0; i < this.projectedViews.length; i++) {\n                    var /** @type {?} */ projectedView = this.projectedViews[i];\n                    if (projectedView.clazz === nestedViewClass) {\n                        result.push(callback(projectedView));\n                    }\n                }\n            }\n            return result;\n        };\n        /**\n         * @param {?} view\n         * @param {?} currentIndex\n         * @return {?}\n         */\n        ViewContainer.prototype.moveView = function (view, currentIndex) {\n            var /** @type {?} */ previousIndex = this.nestedViews.indexOf(view);\n            if (view.type === ViewType.COMPONENT) {\n                throw new Error(\"Component views can't be moved!\");\n            }\n            var /** @type {?} */ nestedViews = this.nestedViews;\n            if (nestedViews == null) {\n                nestedViews = [];\n                this.nestedViews = nestedViews;\n            }\n            nestedViews.splice(previousIndex, 1);\n            nestedViews.splice(currentIndex, 0, view);\n            var /** @type {?} */ prevView = currentIndex > 0 ? nestedViews[currentIndex - 1] : null;\n            view.moveAfter(this, prevView);\n        };\n        /**\n         * @param {?} view\n         * @param {?} viewIndex\n         * @return {?}\n         */\n        ViewContainer.prototype.attachView = function (view, viewIndex) {\n            if (view.type === ViewType.COMPONENT) {\n                throw new Error(\"Component views can't be moved!\");\n            }\n            var /** @type {?} */ nestedViews = this.nestedViews;\n            if (nestedViews == null) {\n                nestedViews = [];\n                this.nestedViews = nestedViews;\n            }\n            // perf: array.push is faster than array.splice!\n            if (viewIndex >= nestedViews.length) {\n                nestedViews.push(view);\n            }\n            else {\n                nestedViews.splice(viewIndex, 0, view);\n            }\n            var /** @type {?} */ prevView = viewIndex > 0 ? nestedViews[viewIndex - 1] : null;\n            view.attachAfter(this, prevView);\n        };\n        /**\n         * @param {?} viewIndex\n         * @return {?}\n         */\n        ViewContainer.prototype.detachView = function (viewIndex) {\n            var /** @type {?} */ view = this.nestedViews[viewIndex];\n            // perf: array.pop is faster than array.splice!\n            if (viewIndex >= this.nestedViews.length - 1) {\n                this.nestedViews.pop();\n            }\n            else {\n                this.nestedViews.splice(viewIndex, 1);\n            }\n            if (view.type === ViewType.COMPONENT) {\n                throw new Error(\"Component views can't be moved!\");\n            }\n            view.detach();\n            return view;\n        };\n        return ViewContainer;\n    }());\n\n    var /** @type {?} */ __core_private__ = {\n        isDefaultChangeDetectionStrategy: isDefaultChangeDetectionStrategy,\n        ChangeDetectorStatus: ChangeDetectorStatus,\n        constructDependencies: constructDependencies,\n        LifecycleHooks: LifecycleHooks,\n        LIFECYCLE_HOOKS_VALUES: LIFECYCLE_HOOKS_VALUES,\n        ReflectorReader: ReflectorReader,\n        CodegenComponentFactoryResolver: CodegenComponentFactoryResolver,\n        ComponentRef_: ComponentRef_,\n        ViewContainer: ViewContainer,\n        AppView: AppView,\n        DebugAppView: DebugAppView,\n        NgModuleInjector: NgModuleInjector,\n        registerModuleFactory: registerModuleFactory,\n        ViewType: ViewType,\n        view_utils: view_utils,\n        ViewMetadata: ViewMetadata,\n        DebugContext: DebugContext,\n        StaticNodeDebugInfo: StaticNodeDebugInfo,\n        devModeEqual: devModeEqual,\n        UNINITIALIZED: UNINITIALIZED,\n        ValueUnwrapper: ValueUnwrapper,\n        RenderDebugInfo: RenderDebugInfo,\n        TemplateRef_: TemplateRef_,\n        ReflectionCapabilities: ReflectionCapabilities,\n        makeDecorator: makeDecorator,\n        DebugDomRootRenderer: DebugDomRootRenderer,\n        Console: Console,\n        reflector: reflector,\n        Reflector: Reflector,\n        NoOpAnimationPlayer: NoOpAnimationPlayer,\n        AnimationPlayer: AnimationPlayer,\n        AnimationSequencePlayer: AnimationSequencePlayer,\n        AnimationGroupPlayer: AnimationGroupPlayer,\n        AnimationKeyframe: AnimationKeyframe,\n        prepareFinalAnimationStyles: prepareFinalAnimationStyles,\n        balanceAnimationKeyframes: balanceAnimationKeyframes,\n        flattenStyles: flattenStyles,\n        clearStyles: clearStyles,\n        renderStyles: renderStyles,\n        collectAndResolveStyles: collectAndResolveStyles,\n        APP_ID_RANDOM_PROVIDER: APP_ID_RANDOM_PROVIDER,\n        AnimationStyles: AnimationStyles,\n        ANY_STATE: ANY_STATE,\n        DEFAULT_STATE: DEFAULT_STATE,\n        EMPTY_STATE: EMPTY_STATE,\n        FILL_STYLE_FLAG: FILL_STYLE_FLAG,\n        ComponentStillLoadingError: ComponentStillLoadingError,\n        isPromise: isPromise,\n        isObservable: isObservable,\n        AnimationTransition: AnimationTransition\n    };\n\n    exports.createPlatform = createPlatform;\n    exports.assertPlatform = assertPlatform;\n    exports.destroyPlatform = destroyPlatform;\n    exports.getPlatform = getPlatform;\n    exports.PlatformRef = PlatformRef;\n    exports.ApplicationRef = ApplicationRef;\n    exports.enableProdMode = enableProdMode;\n    exports.isDevMode = isDevMode;\n    exports.createPlatformFactory = createPlatformFactory;\n    exports.NgProbeToken = NgProbeToken;\n    exports.APP_ID = APP_ID;\n    exports.PACKAGE_ROOT_URL = PACKAGE_ROOT_URL;\n    exports.PLATFORM_INITIALIZER = PLATFORM_INITIALIZER;\n    exports.APP_BOOTSTRAP_LISTENER = APP_BOOTSTRAP_LISTENER;\n    exports.APP_INITIALIZER = APP_INITIALIZER;\n    exports.ApplicationInitStatus = ApplicationInitStatus;\n    exports.DebugElement = DebugElement;\n    exports.DebugNode = DebugNode;\n    exports.asNativeElements = asNativeElements;\n    exports.getDebugNode = getDebugNode;\n    exports.Testability = Testability;\n    exports.TestabilityRegistry = TestabilityRegistry;\n    exports.setTestabilityGetter = setTestabilityGetter;\n    exports.TRANSLATIONS = TRANSLATIONS;\n    exports.TRANSLATIONS_FORMAT = TRANSLATIONS_FORMAT;\n    exports.LOCALE_ID = LOCALE_ID;\n    exports.ApplicationModule = ApplicationModule;\n    exports.wtfCreateScope = wtfCreateScope;\n    exports.wtfLeave = wtfLeave;\n    exports.wtfStartTimeRange = wtfStartTimeRange;\n    exports.wtfEndTimeRange = wtfEndTimeRange;\n    exports.Type = Type;\n    exports.EventEmitter = EventEmitter;\n    exports.ErrorHandler = ErrorHandler;\n    exports.AnimationTransitionEvent = AnimationTransitionEvent;\n    exports.AnimationPlayer = AnimationPlayer;\n    exports.AnimationStyles = AnimationStyles;\n    exports.AnimationKeyframe = AnimationKeyframe;\n    exports.Sanitizer = Sanitizer;\n    exports.SecurityContext = SecurityContext;\n    exports.ANALYZE_FOR_ENTRY_COMPONENTS = ANALYZE_FOR_ENTRY_COMPONENTS;\n    exports.Attribute = Attribute;\n    exports.ContentChild = ContentChild;\n    exports.ContentChildren = ContentChildren;\n    exports.Query = Query;\n    exports.ViewChild = ViewChild;\n    exports.ViewChildren = ViewChildren;\n    exports.Component = Component;\n    exports.Directive = Directive;\n    exports.HostBinding = HostBinding;\n    exports.HostListener = HostListener;\n    exports.Input = Input;\n    exports.Output = Output;\n    exports.Pipe = Pipe;\n    exports.AfterContentChecked = AfterContentChecked;\n    exports.AfterContentInit = AfterContentInit;\n    exports.AfterViewChecked = AfterViewChecked;\n    exports.AfterViewInit = AfterViewInit;\n    exports.DoCheck = DoCheck;\n    exports.OnChanges = OnChanges;\n    exports.OnDestroy = OnDestroy;\n    exports.OnInit = OnInit;\n    exports.CUSTOM_ELEMENTS_SCHEMA = CUSTOM_ELEMENTS_SCHEMA;\n    exports.NO_ERRORS_SCHEMA = NO_ERRORS_SCHEMA;\n    exports.NgModule = NgModule;\n    exports.ViewEncapsulation = ViewEncapsulation;\n    exports.Version = Version;\n    exports.VERSION = VERSION;\n    exports.Class = Class;\n    exports.forwardRef = forwardRef;\n    exports.resolveForwardRef = resolveForwardRef;\n    exports.Injector = Injector;\n    exports.ReflectiveInjector = ReflectiveInjector;\n    exports.ResolvedReflectiveFactory = ResolvedReflectiveFactory;\n    exports.ReflectiveKey = ReflectiveKey;\n    exports.OpaqueToken = OpaqueToken;\n    exports.Inject = Inject;\n    exports.Optional = Optional;\n    exports.Injectable = Injectable;\n    exports.Self = Self;\n    exports.SkipSelf = SkipSelf;\n    exports.Host = Host;\n    exports.NgZone = NgZone;\n    exports.RenderComponentType = RenderComponentType;\n    exports.Renderer = Renderer;\n    exports.RootRenderer = RootRenderer;\n    exports.COMPILER_OPTIONS = COMPILER_OPTIONS;\n    exports.Compiler = Compiler;\n    exports.CompilerFactory = CompilerFactory;\n    exports.ModuleWithComponentFactories = ModuleWithComponentFactories;\n    exports.ComponentFactory = ComponentFactory;\n    exports.ComponentRef = ComponentRef;\n    exports.ComponentFactoryResolver = ComponentFactoryResolver;\n    exports.ElementRef = ElementRef;\n    exports.NgModuleFactory = NgModuleFactory;\n    exports.NgModuleRef = NgModuleRef;\n    exports.NgModuleFactoryLoader = NgModuleFactoryLoader;\n    exports.getModuleFactory = getModuleFactory;\n    exports.QueryList = QueryList;\n    exports.SystemJsNgModuleLoader = SystemJsNgModuleLoader;\n    exports.SystemJsNgModuleLoaderConfig = SystemJsNgModuleLoaderConfig;\n    exports.TemplateRef = TemplateRef;\n    exports.ViewContainerRef = ViewContainerRef;\n    exports.EmbeddedViewRef = EmbeddedViewRef;\n    exports.ViewRef = ViewRef;\n    exports.ChangeDetectionStrategy = ChangeDetectionStrategy;\n    exports.ChangeDetectorRef = ChangeDetectorRef;\n    exports.CollectionChangeRecord = CollectionChangeRecord;\n    exports.DefaultIterableDiffer = DefaultIterableDiffer;\n    exports.IterableDiffers = IterableDiffers;\n    exports.KeyValueChangeRecord = KeyValueChangeRecord;\n    exports.KeyValueDiffers = KeyValueDiffers;\n    exports.SimpleChange = SimpleChange;\n    exports.WrappedValue = WrappedValue;\n    exports.platformCore = platformCore;\n    exports.__core_private__ = __core_private__;\n    exports.AUTO_STYLE = AUTO_STYLE;\n    exports.AnimationEntryMetadata = AnimationEntryMetadata;\n    exports.AnimationStateMetadata = AnimationStateMetadata;\n    exports.AnimationStateDeclarationMetadata = AnimationStateDeclarationMetadata;\n    exports.AnimationStateTransitionMetadata = AnimationStateTransitionMetadata;\n    exports.AnimationMetadata = AnimationMetadata;\n    exports.AnimationKeyframesSequenceMetadata = AnimationKeyframesSequenceMetadata;\n    exports.AnimationStyleMetadata = AnimationStyleMetadata;\n    exports.AnimationAnimateMetadata = AnimationAnimateMetadata;\n    exports.AnimationWithStepsMetadata = AnimationWithStepsMetadata;\n    exports.AnimationSequenceMetadata = AnimationSequenceMetadata;\n    exports.AnimationGroupMetadata = AnimationGroupMetadata;\n    exports.animate = animate;\n    exports.group = group;\n    exports.sequence = sequence;\n    exports.style = style;\n    exports.state = state;\n    exports.keyframes = keyframes;\n    exports.transition = transition;\n    exports.trigger = trigger;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/core/bundles/core.umd.js\n// module id = 1\n// module chunks = 2","\"use strict\";\nvar root_1 = require('./util/root');\nvar toSubscriber_1 = require('./util/toSubscriber');\nvar observable_1 = require('./symbol/observable');\n/**\n * A representation of any set of values over any amount of time. This the most basic building block\n * of RxJS.\n *\n * @class Observable<T>\n */\nvar Observable = (function () {\n    /**\n     * @constructor\n     * @param {Function} subscribe the function that is  called when the Observable is\n     * initially subscribed to. This function is given a Subscriber, to which new values\n     * can be `next`ed, or an `error` method can be called to raise an error, or\n     * `complete` can be called to notify of a successful completion.\n     */\n    function Observable(subscribe) {\n        this._isScalar = false;\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    /**\n     * Creates a new Observable, with this Observable as the source, and the passed\n     * operator defined as the new observable's operator.\n     * @method lift\n     * @param {Operator} operator the operator defining the operation to take on the observable\n     * @return {Observable} a new observable with the Operator applied\n     */\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var operator = this.operator;\n        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);\n        if (operator) {\n            operator.call(sink, this.source);\n        }\n        else {\n            sink.add(this._subscribe(sink));\n        }\n        if (sink.syncErrorThrowable) {\n            sink.syncErrorThrowable = false;\n            if (sink.syncErrorThrown) {\n                throw sink.syncErrorValue;\n            }\n        }\n        return sink;\n    };\n    /**\n     * @method forEach\n     * @param {Function} next a handler for each value emitted by the observable\n     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise\n     * @return {Promise} a promise that either resolves on observable completion or\n     *  rejects with the handled error\n     */\n    Observable.prototype.forEach = function (next, PromiseCtor) {\n        var _this = this;\n        if (!PromiseCtor) {\n            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n                PromiseCtor = root_1.root.Rx.config.Promise;\n            }\n            else if (root_1.root.Promise) {\n                PromiseCtor = root_1.root.Promise;\n            }\n        }\n        if (!PromiseCtor) {\n            throw new Error('no Promise impl found');\n        }\n        return new PromiseCtor(function (resolve, reject) {\n            var subscription = _this.subscribe(function (value) {\n                if (subscription) {\n                    // if there is a subscription, then we can surmise\n                    // the next handling is asynchronous. Any errors thrown\n                    // need to be rejected explicitly and unsubscribe must be\n                    // called manually\n                    try {\n                        next(value);\n                    }\n                    catch (err) {\n                        reject(err);\n                        subscription.unsubscribe();\n                    }\n                }\n                else {\n                    // if there is NO subscription, then we're getting a nexted\n                    // value synchronously during subscription. We can just call it.\n                    // If it errors, Observable's `subscribe` will ensure the\n                    // unsubscription logic is called, then synchronously rethrow the error.\n                    // After that, Promise will trap the error and send it\n                    // down the rejection path.\n                    next(value);\n                }\n            }, reject, resolve);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        return this.source.subscribe(subscriber);\n    };\n    /**\n     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n     * @method Symbol.observable\n     * @return {Observable} this instance of the observable\n     */\n    Observable.prototype[observable_1.$$observable] = function () {\n        return this;\n    };\n    // HACK: Since TypeScript inherits static properties too, we have to\n    // fight against TypeScript here so Subject can have a different static create signature\n    /**\n     * Creates a new cold Observable by calling the Observable constructor\n     * @static true\n     * @owner Observable\n     * @method create\n     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n     * @return {Observable} a new cold observable\n     */\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\nexports.Observable = Observable;\n//# sourceMappingURL=Observable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Observable.js\n// module id = 2\n// module chunks = 2","/**\n * @license Angular v3.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('rxjs/BehaviorSubject'), require('rxjs/Subject'), require('rxjs/observable/from'), require('rxjs/observable/of'), require('rxjs/operator/concatMap'), require('rxjs/operator/every'), require('rxjs/operator/first'), require('rxjs/operator/map'), require('rxjs/operator/mergeMap'), require('rxjs/operator/reduce'), require('rxjs/Observable'), require('rxjs/operator/catch'), require('rxjs/operator/concatAll'), require('rxjs/util/EmptyError'), require('rxjs/observable/fromPromise'), require('rxjs/operator/last'), require('rxjs/operator/mergeAll'), require('@angular/platform-browser'), require('rxjs/operator/filter')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/common', '@angular/core', 'rxjs/BehaviorSubject', 'rxjs/Subject', 'rxjs/observable/from', 'rxjs/observable/of', 'rxjs/operator/concatMap', 'rxjs/operator/every', 'rxjs/operator/first', 'rxjs/operator/map', 'rxjs/operator/mergeMap', 'rxjs/operator/reduce', 'rxjs/Observable', 'rxjs/operator/catch', 'rxjs/operator/concatAll', 'rxjs/util/EmptyError', 'rxjs/observable/fromPromise', 'rxjs/operator/last', 'rxjs/operator/mergeAll', '@angular/platform-browser', 'rxjs/operator/filter'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.router = global.ng.router || {}),global.ng.common,global.ng.core,global.Rx,global.Rx,global.Rx.Observable,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.ng.platformBrowser,global.Rx.Observable.prototype));\n}(this, function (exports,_angular_common,_angular_core,rxjs_BehaviorSubject,rxjs_Subject,rxjs_observable_from,rxjs_observable_of,rxjs_operator_concatMap,rxjs_operator_every,rxjs_operator_first,rxjs_operator_map,rxjs_operator_mergeMap,rxjs_operator_reduce,rxjs_Observable,rxjs_operator_catch,rxjs_operator_concatAll,rxjs_util_EmptyError,rxjs_observable_fromPromise,l,rxjs_operator_mergeAll,_angular_platformBrowser,rxjs_operator_filter) { 'use strict';\n\n    var /** @type {?} */ isPromise = _angular_core.__core_private__.isPromise;\n    var /** @type {?} */ isObservable = _angular_core.__core_private__.isObservable;\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @whatItDoes Name of the primary outlet.\n     *\n     * @stable\n     */\n    var /** @type {?} */ PRIMARY_OUTLET = 'primary';\n    var NavigationCancelingError = (function (_super) {\n        __extends(NavigationCancelingError, _super);\n        /**\n         * @param {?} message\n         */\n        function NavigationCancelingError(message) {\n            _super.call(this, message);\n            this.message = message;\n            this.stack = (new Error(message)).stack;\n        }\n        /**\n         * @return {?}\n         */\n        NavigationCancelingError.prototype.toString = function () { return this.message; };\n        return NavigationCancelingError;\n    }(Error));\n    /**\n     * @param {?} segments\n     * @param {?} segmentGroup\n     * @param {?} route\n     * @return {?}\n     */\n    function defaultUrlMatcher(segments, segmentGroup, route) {\n        var /** @type {?} */ path = route.path;\n        var /** @type {?} */ parts = path.split('/');\n        var /** @type {?} */ posParams = {};\n        var /** @type {?} */ consumed = [];\n        var /** @type {?} */ currentIndex = 0;\n        for (var /** @type {?} */ i = 0; i < parts.length; ++i) {\n            if (currentIndex >= segments.length)\n                return null;\n            var /** @type {?} */ current = segments[currentIndex];\n            var /** @type {?} */ p = parts[i];\n            var /** @type {?} */ isPosParam = p.startsWith(':');\n            if (!isPosParam && p !== current.path)\n                return null;\n            if (isPosParam) {\n                posParams[p.substring(1)] = current;\n            }\n            consumed.push(current);\n            currentIndex++;\n        }\n        if (route.pathMatch === 'full' &&\n            (segmentGroup.hasChildren() || currentIndex < segments.length)) {\n            return null;\n        }\n        else {\n            return { consumed: consumed, posParams: posParams };\n        }\n    }\n\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function shallowEqualArrays(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n            if (!shallowEqual(a[i], b[i]))\n                return false;\n        }\n        return true;\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function shallowEqual(a, b) {\n        var /** @type {?} */ k1 = Object.keys(a);\n        var /** @type {?} */ k2 = Object.keys(b);\n        if (k1.length != k2.length) {\n            return false;\n        }\n        var /** @type {?} */ key;\n        for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n            key = k1[i];\n            if (a[key] !== b[key]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * @param {?} a\n     * @return {?}\n     */\n    function flatten(a) {\n        var /** @type {?} */ target = [];\n        for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n            for (var /** @type {?} */ j = 0; j < a[i].length; ++j) {\n                target.push(a[i][j]);\n            }\n        }\n        return target;\n    }\n    /**\n     * @param {?} a\n     * @return {?}\n     */\n    function last(a) {\n        return a.length > 0 ? a[a.length - 1] : null;\n    }\n    /**\n     * @param {?} m1\n     * @param {?} m2\n     * @return {?}\n     */\n    function merge(m1, m2) {\n        var /** @type {?} */ m = {};\n        for (var attr in m1) {\n            if (m1.hasOwnProperty(attr)) {\n                m[attr] = m1[attr];\n            }\n        }\n        for (var attr in m2) {\n            if (m2.hasOwnProperty(attr)) {\n                m[attr] = m2[attr];\n            }\n        }\n        return m;\n    }\n    /**\n     * @param {?} map\n     * @param {?} callback\n     * @return {?}\n     */\n    function forEach(map, callback) {\n        for (var prop in map) {\n            if (map.hasOwnProperty(prop)) {\n                callback(map[prop], prop);\n            }\n        }\n    }\n    /**\n     * @param {?} obj\n     * @param {?} fn\n     * @return {?}\n     */\n    function waitForMap(obj, fn) {\n        var /** @type {?} */ waitFor = [];\n        var /** @type {?} */ res = {};\n        forEach(obj, function (a, k) {\n            if (k === PRIMARY_OUTLET) {\n                waitFor.push(rxjs_operator_map.map.call(fn(k, a), function (_) {\n                    res[k] = _;\n                    return _;\n                }));\n            }\n        });\n        forEach(obj, function (a, k) {\n            if (k !== PRIMARY_OUTLET) {\n                waitFor.push(rxjs_operator_map.map.call(fn(k, a), function (_) {\n                    res[k] = _;\n                    return _;\n                }));\n            }\n        });\n        if (waitFor.length > 0) {\n            var /** @type {?} */ concatted$ = rxjs_operator_concatAll.concatAll.call(rxjs_observable_of.of.apply(void 0, waitFor));\n            var /** @type {?} */ last$ = l.last.call(concatted$);\n            return rxjs_operator_map.map.call(last$, function () { return res; });\n        }\n        return rxjs_observable_of.of(res);\n    }\n    /**\n     * @param {?} observables\n     * @return {?}\n     */\n    function andObservables(observables) {\n        var /** @type {?} */ merged$ = rxjs_operator_mergeAll.mergeAll.call(observables);\n        return rxjs_operator_every.every.call(merged$, function (result) { return result === true; });\n    }\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    function wrapIntoObservable(value) {\n        if (isObservable(value)) {\n            return value;\n        }\n        if (isPromise(value)) {\n            return rxjs_observable_fromPromise.fromPromise(value);\n        }\n        return rxjs_observable_of.of(value);\n    }\n\n    /**\n     * @experimental\n     */\n    var /** @type {?} */ ROUTES = new _angular_core.OpaqueToken('ROUTES');\n    var LoadedRouterConfig = (function () {\n        /**\n         * @param {?} routes\n         * @param {?} injector\n         * @param {?} factoryResolver\n         * @param {?} injectorFactory\n         */\n        function LoadedRouterConfig(routes, injector, factoryResolver, injectorFactory) {\n            this.routes = routes;\n            this.injector = injector;\n            this.factoryResolver = factoryResolver;\n            this.injectorFactory = injectorFactory;\n        }\n        return LoadedRouterConfig;\n    }());\n    var RouterConfigLoader = (function () {\n        /**\n         * @param {?} loader\n         * @param {?} compiler\n         */\n        function RouterConfigLoader(loader, compiler) {\n            this.loader = loader;\n            this.compiler = compiler;\n        }\n        /**\n         * @param {?} parentInjector\n         * @param {?} loadChildren\n         * @return {?}\n         */\n        RouterConfigLoader.prototype.load = function (parentInjector, loadChildren) {\n            return rxjs_operator_map.map.call(this.loadModuleFactory(loadChildren), function (r) {\n                var /** @type {?} */ ref = r.create(parentInjector);\n                var /** @type {?} */ injectorFactory = function (parent) { return r.create(parent).injector; };\n                return new LoadedRouterConfig(flatten(ref.injector.get(ROUTES)), ref.injector, ref.componentFactoryResolver, injectorFactory);\n            });\n        };\n        /**\n         * @param {?} loadChildren\n         * @return {?}\n         */\n        RouterConfigLoader.prototype.loadModuleFactory = function (loadChildren) {\n            var _this = this;\n            if (typeof loadChildren === 'string') {\n                return rxjs_observable_fromPromise.fromPromise(this.loader.load(loadChildren));\n            }\n            else {\n                var /** @type {?} */ offlineMode_1 = this.compiler instanceof _angular_core.Compiler;\n                return rxjs_operator_mergeMap.mergeMap.call(wrapIntoObservable(loadChildren()), function (t) { return offlineMode_1 ? rxjs_observable_of.of(/** @type {?} */ (t)) : rxjs_observable_fromPromise.fromPromise(_this.compiler.compileModuleAsync(t)); });\n            }\n        };\n        return RouterConfigLoader;\n    }());\n\n    /**\n     * @return {?}\n     */\n    function createEmptyUrlTree() {\n        return new UrlTree(new UrlSegmentGroup([], {}), {}, null);\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @param {?} exact\n     * @return {?}\n     */\n    function containsTree(container, containee, exact) {\n        if (exact) {\n            return equalQueryParams(container.queryParams, containee.queryParams) &&\n                equalSegmentGroups(container.root, containee.root);\n        }\n        return containsQueryParams(container.queryParams, containee.queryParams) &&\n            containsSegmentGroup(container.root, containee.root);\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @return {?}\n     */\n    function equalQueryParams(container, containee) {\n        return shallowEqual(container, containee);\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @return {?}\n     */\n    function equalSegmentGroups(container, containee) {\n        if (!equalPath(container.segments, containee.segments))\n            return false;\n        if (container.numberOfChildren !== containee.numberOfChildren)\n            return false;\n        for (var c in containee.children) {\n            if (!container.children[c])\n                return false;\n            if (!equalSegmentGroups(container.children[c], containee.children[c]))\n                return false;\n        }\n        return true;\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @return {?}\n     */\n    function containsQueryParams(container, containee) {\n        return Object.keys(containee).length <= Object.keys(container).length &&\n            Object.keys(containee).every(function (key) { return containee[key] === container[key]; });\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @return {?}\n     */\n    function containsSegmentGroup(container, containee) {\n        return containsSegmentGroupHelper(container, containee, containee.segments);\n    }\n    /**\n     * @param {?} container\n     * @param {?} containee\n     * @param {?} containeePaths\n     * @return {?}\n     */\n    function containsSegmentGroupHelper(container, containee, containeePaths) {\n        if (container.segments.length > containeePaths.length) {\n            var /** @type {?} */ current = container.segments.slice(0, containeePaths.length);\n            if (!equalPath(current, containeePaths))\n                return false;\n            if (containee.hasChildren())\n                return false;\n            return true;\n        }\n        else if (container.segments.length === containeePaths.length) {\n            if (!equalPath(container.segments, containeePaths))\n                return false;\n            for (var c in containee.children) {\n                if (!container.children[c])\n                    return false;\n                if (!containsSegmentGroup(container.children[c], containee.children[c]))\n                    return false;\n            }\n            return true;\n        }\n        else {\n            var /** @type {?} */ current = containeePaths.slice(0, container.segments.length);\n            var /** @type {?} */ next = containeePaths.slice(container.segments.length);\n            if (!equalPath(container.segments, current))\n                return false;\n            if (!container.children[PRIMARY_OUTLET])\n                return false;\n            return containsSegmentGroupHelper(container.children[PRIMARY_OUTLET], containee, next);\n        }\n    }\n    /**\n     * \\@whatItDoes Represents the parsed URL.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({templateUrl:'template.html'})\n     * class MyComponent {\n     *   constructor(router: Router) {\n     *     const tree: UrlTree =\n     *       router.parseUrl('/team/33/(user/victor//support:help)?debug=true#fragment');\n     *     const f = tree.fragment; // return 'fragment'\n     *     const q = tree.queryParams; // returns {debug: 'true'}\n     *     const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n     *     const s: UrlSegment[] = g.segments; // returns 2 segments 'team' and '33'\n     *     g.children[PRIMARY_OUTLET].segments; // returns 2 segments 'user' and 'victor'\n     *     g.children['support'].segments; // return 1 segment 'help'\n     *   }\n     * }\n     * ```\n     *\n     * \\@description\n     *\n     * Since a router state is a tree, and the URL is nothing but a serialized state, the URL is a\n     * serialized tree.\n     * UrlTree is a data structure that provides a lot of affordances in dealing with URLs\n     *\n     * \\@stable\n     */\n    var UrlTree = (function () {\n        /**\n         * \\@internal\n         * @param {?} root\n         * @param {?} queryParams\n         * @param {?} fragment\n         */\n        function UrlTree(root, queryParams, fragment) {\n            this.root = root;\n            this.queryParams = queryParams;\n            this.fragment = fragment;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        UrlTree.prototype.toString = function () { return new DefaultUrlSerializer().serialize(this); };\n        return UrlTree;\n    }());\n    /**\n     * \\@whatItDoes Represents the parsed URL segment group.\n     *\n     * See {\\@link UrlTree} for more information.\n     *\n     * \\@stable\n     */\n    var UrlSegmentGroup = (function () {\n        /**\n         * @param {?} segments\n         * @param {?} children\n         */\n        function UrlSegmentGroup(segments, children) {\n            var _this = this;\n            this.segments = segments;\n            this.children = children;\n            /** The parent node in the url tree */\n            this.parent = null;\n            forEach(children, function (v, k) { return v.parent = _this; });\n        }\n        /**\n         * Wether the segment has child segments\n         * @return {?}\n         */\n        UrlSegmentGroup.prototype.hasChildren = function () { return this.numberOfChildren > 0; };\n        Object.defineProperty(UrlSegmentGroup.prototype, \"numberOfChildren\", {\n            /**\n             * Number of child segments\n             * @return {?}\n             */\n            get: function () { return Object.keys(this.children).length; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        UrlSegmentGroup.prototype.toString = function () { return serializePaths(this); };\n        return UrlSegmentGroup;\n    }());\n    /**\n     * \\@whatItDoes Represents a single URL segment.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({templateUrl:'template.html'})\n     * class MyComponent {\n     *   constructor(router: Router) {\n     *     const tree: UrlTree = router.parseUrl('/team;id=33');\n     *     const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n     *     const s: UrlSegment[] = g.segments;\n     *     s[0].path; // returns 'team'\n     *     s[0].parameters; // returns {id: 33}\n     *   }\n     * }\n     * ```\n     *\n     * \\@description\n     *\n     * A UrlSegment is a part of a URL between the two slashes. It contains a path and the matrix\n     * parameters associated with the segment.\n     *\n     * \\@stable\n     */\n    var UrlSegment = (function () {\n        /**\n         * @param {?} path\n         * @param {?} parameters\n         */\n        function UrlSegment(path, parameters) {\n            this.path = path;\n            this.parameters = parameters;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        UrlSegment.prototype.toString = function () { return serializePath(this); };\n        return UrlSegment;\n    }());\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function equalSegments(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n            if (a[i].path !== b[i].path)\n                return false;\n            if (!shallowEqual(a[i].parameters, b[i].parameters))\n                return false;\n        }\n        return true;\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function equalPath(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n            if (a[i].path !== b[i].path)\n                return false;\n        }\n        return true;\n    }\n    /**\n     * @param {?} segment\n     * @param {?} fn\n     * @return {?}\n     */\n    function mapChildrenIntoArray(segment, fn) {\n        var /** @type {?} */ res = [];\n        forEach(segment.children, function (child, childOutlet) {\n            if (childOutlet === PRIMARY_OUTLET) {\n                res = res.concat(fn(child, childOutlet));\n            }\n        });\n        forEach(segment.children, function (child, childOutlet) {\n            if (childOutlet !== PRIMARY_OUTLET) {\n                res = res.concat(fn(child, childOutlet));\n            }\n        });\n        return res;\n    }\n    /**\n     * \\@whatItDoes Serializes and deserializes a URL string into a URL tree.\n     *\n     * \\@description The url serialization strategy is customizable. You can\n     * make all URLs case insensitive by providing a custom UrlSerializer.\n     *\n     * See {\\@link DefaultUrlSerializer} for an example of a URL serializer.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var UrlSerializer = (function () {\n        function UrlSerializer() {\n        }\n        /**\n         * Parse a url into a {\\@link UrlTree}\n         * @abstract\n         * @param {?} url\n         * @return {?}\n         */\n        UrlSerializer.prototype.parse = function (url) { };\n        /**\n         * Converts a {\\@link UrlTree} into a url\n         * @abstract\n         * @param {?} tree\n         * @return {?}\n         */\n        UrlSerializer.prototype.serialize = function (tree) { };\n        return UrlSerializer;\n    }());\n    /**\n     * \\@whatItDoes A default implementation of the {\\@link UrlSerializer}.\n     *\n     * \\@description\n     *\n     * Example URLs:\n     *\n     * ```\n     * /inbox/33(popup:compose)\n     * /inbox/33;open=true/messages/44\n     * ```\n     *\n     * DefaultUrlSerializer uses parentheses to serialize secondary segments (e.g., popup:compose), the\n     * colon syntax to specify the outlet, and the ';parameter=value' syntax (e.g., open=true) to\n     * specify route specific parameters.\n     *\n     * \\@stable\n     */\n    var DefaultUrlSerializer = (function () {\n        function DefaultUrlSerializer() {\n        }\n        /**\n         * Parses a url into a {\\@link UrlTree}\n         * @param {?} url\n         * @return {?}\n         */\n        DefaultUrlSerializer.prototype.parse = function (url) {\n            var /** @type {?} */ p = new UrlParser(url);\n            return new UrlTree(p.parseRootSegment(), p.parseQueryParams(), p.parseFragment());\n        };\n        /**\n         * Converts a {\\@link UrlTree} into a url\n         * @param {?} tree\n         * @return {?}\n         */\n        DefaultUrlSerializer.prototype.serialize = function (tree) {\n            var /** @type {?} */ segment = \"/\" + serializeSegment(tree.root, true);\n            var /** @type {?} */ query = serializeQueryParams(tree.queryParams);\n            var /** @type {?} */ fragment = tree.fragment !== null && tree.fragment !== undefined ? \"#\" + encodeURI(tree.fragment) : '';\n            return \"\" + segment + query + fragment;\n        };\n        return DefaultUrlSerializer;\n    }());\n    /**\n     * @param {?} segment\n     * @return {?}\n     */\n    function serializePaths(segment) {\n        return segment.segments.map(function (p) { return serializePath(p); }).join('/');\n    }\n    /**\n     * @param {?} segment\n     * @param {?} root\n     * @return {?}\n     */\n    function serializeSegment(segment, root) {\n        if (segment.hasChildren() && root) {\n            var /** @type {?} */ primary = segment.children[PRIMARY_OUTLET] ?\n                serializeSegment(segment.children[PRIMARY_OUTLET], false) :\n                '';\n            var /** @type {?} */ children_1 = [];\n            forEach(segment.children, function (v, k) {\n                if (k !== PRIMARY_OUTLET) {\n                    children_1.push(k + \":\" + serializeSegment(v, false));\n                }\n            });\n            if (children_1.length > 0) {\n                return primary + \"(\" + children_1.join('//') + \")\";\n            }\n            else {\n                return \"\" + primary;\n            }\n        }\n        else if (segment.hasChildren() && !root) {\n            var /** @type {?} */ children = mapChildrenIntoArray(segment, function (v, k) {\n                if (k === PRIMARY_OUTLET) {\n                    return [serializeSegment(segment.children[PRIMARY_OUTLET], false)];\n                }\n                else {\n                    return [(k + \":\" + serializeSegment(v, false))];\n                }\n            });\n            return serializePaths(segment) + \"/(\" + children.join('//') + \")\";\n        }\n        else {\n            return serializePaths(segment);\n        }\n    }\n    /**\n     * @param {?} s\n     * @return {?}\n     */\n    function encode(s) {\n        return encodeURIComponent(s);\n    }\n    /**\n     * @param {?} s\n     * @return {?}\n     */\n    function decode(s) {\n        return decodeURIComponent(s);\n    }\n    /**\n     * @param {?} path\n     * @return {?}\n     */\n    function serializePath(path) {\n        return \"\" + encode(path.path) + serializeParams(path.parameters);\n    }\n    /**\n     * @param {?} params\n     * @return {?}\n     */\n    function serializeParams(params) {\n        return pairs(params).map(function (p) { return (\";\" + encode(p.first) + \"=\" + encode(p.second)); }).join('');\n    }\n    /**\n     * @param {?} params\n     * @return {?}\n     */\n    function serializeQueryParams(params) {\n        var /** @type {?} */ strParams = Object.keys(params).map(function (name) {\n            var /** @type {?} */ value = params[name];\n            return Array.isArray(value) ? value.map(function (v) { return (encode(name) + \"=\" + encode(v)); }).join('&') :\n                encode(name) + \"=\" + encode(value);\n        });\n        return strParams.length ? \"?\" + strParams.join(\"&\") : '';\n    }\n    var Pair = (function () {\n        /**\n         * @param {?} first\n         * @param {?} second\n         */\n        function Pair(first, second) {\n            this.first = first;\n            this.second = second;\n        }\n        return Pair;\n    }());\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function pairs(obj) {\n        var /** @type {?} */ res = [];\n        for (var prop in obj) {\n            if (obj.hasOwnProperty(prop)) {\n                res.push(new Pair(prop, obj[prop]));\n            }\n        }\n        return res;\n    }\n    var /** @type {?} */ SEGMENT_RE = /^[^\\/()?;=&#]+/;\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function matchSegments(str) {\n        SEGMENT_RE.lastIndex = 0;\n        var /** @type {?} */ match = str.match(SEGMENT_RE);\n        return match ? match[0] : '';\n    }\n    var /** @type {?} */ QUERY_PARAM_RE = /^[^=?&#]+/;\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function matchQueryParams(str) {\n        QUERY_PARAM_RE.lastIndex = 0;\n        var /** @type {?} */ match = str.match(SEGMENT_RE);\n        return match ? match[0] : '';\n    }\n    var /** @type {?} */ QUERY_PARAM_VALUE_RE = /^[^?&#]+/;\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function matchUrlQueryParamValue(str) {\n        QUERY_PARAM_VALUE_RE.lastIndex = 0;\n        var /** @type {?} */ match = str.match(QUERY_PARAM_VALUE_RE);\n        return match ? match[0] : '';\n    }\n    var UrlParser = (function () {\n        /**\n         * @param {?} url\n         */\n        function UrlParser(url) {\n            this.url = url;\n            this.remaining = url;\n        }\n        /**\n         * @param {?} str\n         * @return {?}\n         */\n        UrlParser.prototype.peekStartsWith = function (str) { return this.remaining.startsWith(str); };\n        /**\n         * @param {?} str\n         * @return {?}\n         */\n        UrlParser.prototype.capture = function (str) {\n            if (!this.remaining.startsWith(str)) {\n                throw new Error(\"Expected \\\"\" + str + \"\\\".\");\n            }\n            this.remaining = this.remaining.substring(str.length);\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseRootSegment = function () {\n            if (this.remaining.startsWith('/')) {\n                this.capture('/');\n            }\n            if (this.remaining === '' || this.remaining.startsWith('?') || this.remaining.startsWith('#')) {\n                return new UrlSegmentGroup([], {});\n            }\n            return new UrlSegmentGroup([], this.parseChildren());\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseChildren = function () {\n            if (this.remaining.length == 0) {\n                return {};\n            }\n            if (this.peekStartsWith('/')) {\n                this.capture('/');\n            }\n            var /** @type {?} */ paths = [];\n            if (!this.peekStartsWith('(')) {\n                paths.push(this.parseSegments());\n            }\n            while (this.peekStartsWith('/') && !this.peekStartsWith('//') && !this.peekStartsWith('/(')) {\n                this.capture('/');\n                paths.push(this.parseSegments());\n            }\n            var /** @type {?} */ children = {};\n            if (this.peekStartsWith('/(')) {\n                this.capture('/');\n                children = this.parseParens(true);\n            }\n            var /** @type {?} */ res = {};\n            if (this.peekStartsWith('(')) {\n                res = this.parseParens(false);\n            }\n            if (paths.length > 0 || Object.keys(children).length > 0) {\n                res[PRIMARY_OUTLET] = new UrlSegmentGroup(paths, children);\n            }\n            return res;\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseSegments = function () {\n            var /** @type {?} */ path = matchSegments(this.remaining);\n            if (path === '' && this.peekStartsWith(';')) {\n                throw new Error(\"Empty path url segment cannot have parameters: '\" + this.remaining + \"'.\");\n            }\n            this.capture(path);\n            var /** @type {?} */ matrixParams = {};\n            if (this.peekStartsWith(';')) {\n                matrixParams = this.parseMatrixParams();\n            }\n            return new UrlSegment(decode(path), matrixParams);\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseQueryParams = function () {\n            var /** @type {?} */ params = {};\n            if (this.peekStartsWith('?')) {\n                this.capture('?');\n                this.parseQueryParam(params);\n                while (this.remaining.length > 0 && this.peekStartsWith('&')) {\n                    this.capture('&');\n                    this.parseQueryParam(params);\n                }\n            }\n            return params;\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseFragment = function () {\n            if (this.peekStartsWith('#')) {\n                return decodeURI(this.remaining.substring(1));\n            }\n            return null;\n        };\n        /**\n         * @return {?}\n         */\n        UrlParser.prototype.parseMatrixParams = function () {\n            var /** @type {?} */ params = {};\n            while (this.remaining.length > 0 && this.peekStartsWith(';')) {\n                this.capture(';');\n                this.parseParam(params);\n            }\n            return params;\n        };\n        /**\n         * @param {?} params\n         * @return {?}\n         */\n        UrlParser.prototype.parseParam = function (params) {\n            var /** @type {?} */ key = matchSegments(this.remaining);\n            if (!key) {\n                return;\n            }\n            this.capture(key);\n            var /** @type {?} */ value = '';\n            if (this.peekStartsWith('=')) {\n                this.capture('=');\n                var /** @type {?} */ valueMatch = matchSegments(this.remaining);\n                if (valueMatch) {\n                    value = valueMatch;\n                    this.capture(value);\n                }\n            }\n            params[decode(key)] = decode(value);\n        };\n        /**\n         * @param {?} params\n         * @return {?}\n         */\n        UrlParser.prototype.parseQueryParam = function (params) {\n            var /** @type {?} */ key = matchQueryParams(this.remaining);\n            if (!key) {\n                return;\n            }\n            this.capture(key);\n            var /** @type {?} */ value = '';\n            if (this.peekStartsWith('=')) {\n                this.capture('=');\n                var /** @type {?} */ valueMatch = matchUrlQueryParamValue(this.remaining);\n                if (valueMatch) {\n                    value = valueMatch;\n                    this.capture(value);\n                }\n            }\n            var /** @type {?} */ decodedKey = decode(key);\n            var /** @type {?} */ decodedVal = decode(value);\n            if (params.hasOwnProperty(decodedKey)) {\n                // Append to existing values\n                var /** @type {?} */ currentVal = params[decodedKey];\n                if (!Array.isArray(currentVal)) {\n                    currentVal = [currentVal];\n                    params[decodedKey] = currentVal;\n                }\n                currentVal.push(decodedVal);\n            }\n            else {\n                // Create a new value\n                params[decodedKey] = decodedVal;\n            }\n        };\n        /**\n         * @param {?} allowPrimary\n         * @return {?}\n         */\n        UrlParser.prototype.parseParens = function (allowPrimary) {\n            var /** @type {?} */ segments = {};\n            this.capture('(');\n            while (!this.peekStartsWith(')') && this.remaining.length > 0) {\n                var /** @type {?} */ path = matchSegments(this.remaining);\n                var /** @type {?} */ next = this.remaining[path.length];\n                // if is is not one of these characters, then the segment was unescaped\n                // or the group was not closed\n                if (next !== '/' && next !== ')' && next !== ';') {\n                    throw new Error(\"Cannot parse url '\" + this.url + \"'\");\n                }\n                var /** @type {?} */ outletName = void 0;\n                if (path.indexOf(':') > -1) {\n                    outletName = path.substr(0, path.indexOf(':'));\n                    this.capture(outletName);\n                    this.capture(':');\n                }\n                else if (allowPrimary) {\n                    outletName = PRIMARY_OUTLET;\n                }\n                var /** @type {?} */ children = this.parseChildren();\n                segments[outletName] = Object.keys(children).length === 1 ? children[PRIMARY_OUTLET] :\n                    new UrlSegmentGroup([], children);\n                if (this.peekStartsWith('//')) {\n                    this.capture('//');\n                }\n            }\n            this.capture(')');\n            return segments;\n        };\n        return UrlParser;\n    }());\n\n    var NoMatch = (function () {\n        /**\n         * @param {?=} segmentGroup\n         */\n        function NoMatch(segmentGroup) {\n            if (segmentGroup === void 0) { segmentGroup = null; }\n            this.segmentGroup = segmentGroup;\n        }\n        return NoMatch;\n    }());\n    var AbsoluteRedirect = (function () {\n        /**\n         * @param {?} urlTree\n         */\n        function AbsoluteRedirect(urlTree) {\n            this.urlTree = urlTree;\n        }\n        return AbsoluteRedirect;\n    }());\n    /**\n     * @param {?} segmentGroup\n     * @return {?}\n     */\n    function noMatch(segmentGroup) {\n        return new rxjs_Observable.Observable(function (obs) { return obs.error(new NoMatch(segmentGroup)); });\n    }\n    /**\n     * @param {?} newTree\n     * @return {?}\n     */\n    function absoluteRedirect(newTree) {\n        return new rxjs_Observable.Observable(function (obs) { return obs.error(new AbsoluteRedirect(newTree)); });\n    }\n    /**\n     * @param {?} redirectTo\n     * @return {?}\n     */\n    function namedOutletsRedirect(redirectTo) {\n        return new rxjs_Observable.Observable(function (obs) { return obs.error(new Error(\"Only absolute redirects can have named outlets. redirectTo: '\" + redirectTo + \"'\")); });\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function canLoadFails(route) {\n        return new rxjs_Observable.Observable(function (obs) { return obs.error(new NavigationCancelingError(\"Cannot load children because the guard of the route \\\"path: '\" + route.path + \"'\\\" returned false\")); });\n    }\n    /**\n     * @param {?} injector\n     * @param {?} configLoader\n     * @param {?} urlSerializer\n     * @param {?} urlTree\n     * @param {?} config\n     * @return {?}\n     */\n    function applyRedirects(injector, configLoader, urlSerializer, urlTree, config) {\n        return new ApplyRedirects(injector, configLoader, urlSerializer, urlTree, config).apply();\n    }\n    var ApplyRedirects = (function () {\n        /**\n         * @param {?} injector\n         * @param {?} configLoader\n         * @param {?} urlSerializer\n         * @param {?} urlTree\n         * @param {?} config\n         */\n        function ApplyRedirects(injector, configLoader, urlSerializer, urlTree, config) {\n            this.injector = injector;\n            this.configLoader = configLoader;\n            this.urlSerializer = urlSerializer;\n            this.urlTree = urlTree;\n            this.config = config;\n            this.allowRedirects = true;\n        }\n        /**\n         * @return {?}\n         */\n        ApplyRedirects.prototype.apply = function () {\n            var _this = this;\n            var /** @type {?} */ expanded$ = this.expandSegmentGroup(this.injector, this.config, this.urlTree.root, PRIMARY_OUTLET);\n            var /** @type {?} */ urlTrees$ = rxjs_operator_map.map.call(expanded$, function (rootSegmentGroup) { return _this.createUrlTree(rootSegmentGroup, _this.urlTree.queryParams, _this.urlTree.fragment); });\n            return rxjs_operator_catch._catch.call(urlTrees$, function (e) {\n                if (e instanceof AbsoluteRedirect) {\n                    // after an absolute redirect we do not apply any more redirects!\n                    _this.allowRedirects = false;\n                    // we need to run matching, so we can fetch all lazy-loaded modules\n                    return _this.match(e.urlTree);\n                }\n                else if (e instanceof NoMatch) {\n                    throw _this.noMatchError(e);\n                }\n                else {\n                    throw e;\n                }\n            });\n        };\n        /**\n         * @param {?} tree\n         * @return {?}\n         */\n        ApplyRedirects.prototype.match = function (tree) {\n            var _this = this;\n            var /** @type {?} */ expanded$ = this.expandSegmentGroup(this.injector, this.config, tree.root, PRIMARY_OUTLET);\n            var /** @type {?} */ mapped$ = rxjs_operator_map.map.call(expanded$, function (rootSegmentGroup) {\n                return _this.createUrlTree(rootSegmentGroup, tree.queryParams, tree.fragment);\n            });\n            return rxjs_operator_catch._catch.call(mapped$, function (e) {\n                if (e instanceof NoMatch) {\n                    throw _this.noMatchError(e);\n                }\n                else {\n                    throw e;\n                }\n            });\n        };\n        /**\n         * @param {?} e\n         * @return {?}\n         */\n        ApplyRedirects.prototype.noMatchError = function (e) {\n            return new Error(\"Cannot match any routes. URL Segment: '\" + e.segmentGroup + \"'\");\n        };\n        /**\n         * @param {?} rootCandidate\n         * @param {?} queryParams\n         * @param {?} fragment\n         * @return {?}\n         */\n        ApplyRedirects.prototype.createUrlTree = function (rootCandidate, queryParams, fragment) {\n            var /** @type {?} */ root = rootCandidate.segments.length > 0 ?\n                new UrlSegmentGroup([], (_a = {}, _a[PRIMARY_OUTLET] = rootCandidate, _a)) :\n                rootCandidate;\n            return new UrlTree(root, queryParams, fragment);\n            var _a;\n        };\n        /**\n         * @param {?} injector\n         * @param {?} routes\n         * @param {?} segmentGroup\n         * @param {?} outlet\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandSegmentGroup = function (injector, routes, segmentGroup, outlet) {\n            if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n                return rxjs_operator_map.map.call(this.expandChildren(injector, routes, segmentGroup), function (children) { return new UrlSegmentGroup([], children); });\n            }\n            else {\n                return this.expandSegment(injector, segmentGroup, routes, segmentGroup.segments, outlet, true);\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} routes\n         * @param {?} segmentGroup\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandChildren = function (injector, routes, segmentGroup) {\n            var _this = this;\n            return waitForMap(segmentGroup.children, function (childOutlet, child) { return _this.expandSegmentGroup(injector, routes, child, childOutlet); });\n        };\n        /**\n         * @param {?} injector\n         * @param {?} segmentGroup\n         * @param {?} routes\n         * @param {?} segments\n         * @param {?} outlet\n         * @param {?} allowRedirects\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandSegment = function (injector, segmentGroup, routes, segments, outlet, allowRedirects) {\n            var _this = this;\n            var /** @type {?} */ routes$ = rxjs_observable_of.of.apply(void 0, routes);\n            var /** @type {?} */ processedRoutes$ = rxjs_operator_map.map.call(routes$, function (r) {\n                var /** @type {?} */ expanded$ = _this.expandSegmentAgainstRoute(injector, segmentGroup, routes, r, segments, outlet, allowRedirects);\n                return rxjs_operator_catch._catch.call(expanded$, function (e) {\n                    if (e instanceof NoMatch)\n                        return rxjs_observable_of.of(null);\n                    else\n                        throw e;\n                });\n            });\n            var /** @type {?} */ concattedProcessedRoutes$ = rxjs_operator_concatAll.concatAll.call(processedRoutes$);\n            var /** @type {?} */ first$ = rxjs_operator_first.first.call(concattedProcessedRoutes$, function (s) { return !!s; });\n            return rxjs_operator_catch._catch.call(first$, function (e, _) {\n                if (e instanceof rxjs_util_EmptyError.EmptyError) {\n                    if (_this.noLeftoversInUrl(segmentGroup, segments, outlet)) {\n                        return rxjs_observable_of.of(new UrlSegmentGroup([], {}));\n                    }\n                    else {\n                        throw new NoMatch(segmentGroup);\n                    }\n                }\n                else {\n                    throw e;\n                }\n            });\n        };\n        /**\n         * @param {?} segmentGroup\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        ApplyRedirects.prototype.noLeftoversInUrl = function (segmentGroup, segments, outlet) {\n            return segments.length === 0 && !segmentGroup.children[outlet];\n        };\n        /**\n         * @param {?} injector\n         * @param {?} segmentGroup\n         * @param {?} routes\n         * @param {?} route\n         * @param {?} paths\n         * @param {?} outlet\n         * @param {?} allowRedirects\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandSegmentAgainstRoute = function (injector, segmentGroup, routes, route, paths, outlet, allowRedirects) {\n            if (getOutlet$1(route) !== outlet)\n                return noMatch(segmentGroup);\n            if (route.redirectTo !== undefined && !(allowRedirects && this.allowRedirects))\n                return noMatch(segmentGroup);\n            if (route.redirectTo === undefined) {\n                return this.matchSegmentAgainstRoute(injector, segmentGroup, route, paths);\n            }\n            else {\n                return this.expandSegmentAgainstRouteUsingRedirect(injector, segmentGroup, routes, route, paths, outlet);\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} segmentGroup\n         * @param {?} routes\n         * @param {?} route\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandSegmentAgainstRouteUsingRedirect = function (injector, segmentGroup, routes, route, segments, outlet) {\n            if (route.path === '**') {\n                return this.expandWildCardWithParamsAgainstRouteUsingRedirect(injector, routes, route, outlet);\n            }\n            else {\n                return this.expandRegularSegmentAgainstRouteUsingRedirect(injector, segmentGroup, routes, route, segments, outlet);\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} routes\n         * @param {?} route\n         * @param {?} outlet\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect = function (injector, routes, route, outlet) {\n            var _this = this;\n            var /** @type {?} */ newTree = this.applyRedirectCommands([], route.redirectTo, {});\n            if (route.redirectTo.startsWith('/')) {\n                return absoluteRedirect(newTree);\n            }\n            else {\n                return rxjs_operator_mergeMap.mergeMap.call(this.lineralizeSegments(route, newTree), function (newSegments) {\n                    var /** @type {?} */ group = new UrlSegmentGroup(newSegments, {});\n                    return _this.expandSegment(injector, group, routes, newSegments, outlet, false);\n                });\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} segmentGroup\n         * @param {?} routes\n         * @param {?} route\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        ApplyRedirects.prototype.expandRegularSegmentAgainstRouteUsingRedirect = function (injector, segmentGroup, routes, route, segments, outlet) {\n            var _this = this;\n            var _a = match(segmentGroup, route, segments), matched = _a.matched, consumedSegments = _a.consumedSegments, lastChild = _a.lastChild, positionalParamSegments = _a.positionalParamSegments;\n            if (!matched)\n                return noMatch(segmentGroup);\n            var /** @type {?} */ newTree = this.applyRedirectCommands(consumedSegments, route.redirectTo, /** @type {?} */ (positionalParamSegments));\n            if (route.redirectTo.startsWith('/')) {\n                return absoluteRedirect(newTree);\n            }\n            else {\n                return rxjs_operator_mergeMap.mergeMap.call(this.lineralizeSegments(route, newTree), function (newSegments) {\n                    return _this.expandSegment(injector, segmentGroup, routes, newSegments.concat(segments.slice(lastChild)), outlet, false);\n                });\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} rawSegmentGroup\n         * @param {?} route\n         * @param {?} segments\n         * @return {?}\n         */\n        ApplyRedirects.prototype.matchSegmentAgainstRoute = function (injector, rawSegmentGroup, route, segments) {\n            var _this = this;\n            if (route.path === '**') {\n                if (route.loadChildren) {\n                    return rxjs_operator_map.map.call(this.configLoader.load(injector, route.loadChildren), function (r) {\n                        ((route))._loadedConfig = r;\n                        return new UrlSegmentGroup(segments, {});\n                    });\n                }\n                else {\n                    return rxjs_observable_of.of(new UrlSegmentGroup(segments, {}));\n                }\n            }\n            else {\n                var _a = match(rawSegmentGroup, route, segments), matched = _a.matched, consumedSegments_1 = _a.consumedSegments, lastChild = _a.lastChild;\n                if (!matched)\n                    return noMatch(rawSegmentGroup);\n                var /** @type {?} */ rawSlicedSegments_1 = segments.slice(lastChild);\n                var /** @type {?} */ childConfig$ = this.getChildConfig(injector, route);\n                return rxjs_operator_mergeMap.mergeMap.call(childConfig$, function (routerConfig) {\n                    var /** @type {?} */ childInjector = routerConfig.injector;\n                    var /** @type {?} */ childConfig = routerConfig.routes;\n                    var _a = split(rawSegmentGroup, consumedSegments_1, rawSlicedSegments_1, childConfig), segmentGroup = _a.segmentGroup, slicedSegments = _a.slicedSegments;\n                    if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {\n                        var /** @type {?} */ expanded$ = _this.expandChildren(childInjector, childConfig, segmentGroup);\n                        return rxjs_operator_map.map.call(expanded$, function (children) { return new UrlSegmentGroup(consumedSegments_1, children); });\n                    }\n                    else if (childConfig.length === 0 && slicedSegments.length === 0) {\n                        return rxjs_observable_of.of(new UrlSegmentGroup(consumedSegments_1, {}));\n                    }\n                    else {\n                        var /** @type {?} */ expanded$ = _this.expandSegment(childInjector, segmentGroup, childConfig, slicedSegments, PRIMARY_OUTLET, true);\n                        return rxjs_operator_map.map.call(expanded$, function (cs) { return new UrlSegmentGroup(consumedSegments_1.concat(cs.segments), cs.children); });\n                    }\n                });\n            }\n        };\n        /**\n         * @param {?} injector\n         * @param {?} route\n         * @return {?}\n         */\n        ApplyRedirects.prototype.getChildConfig = function (injector, route) {\n            var _this = this;\n            if (route.children) {\n                return rxjs_observable_of.of(new LoadedRouterConfig(route.children, injector, null, null));\n            }\n            else if (route.loadChildren) {\n                return rxjs_operator_mergeMap.mergeMap.call(runGuards(injector, route), function (shouldLoad) {\n                    if (shouldLoad) {\n                        if (((route))._loadedConfig) {\n                            return rxjs_observable_of.of(((route))._loadedConfig);\n                        }\n                        else {\n                            return rxjs_operator_map.map.call(_this.configLoader.load(injector, route.loadChildren), function (r) {\n                                ((route))._loadedConfig = r;\n                                return r;\n                            });\n                        }\n                    }\n                    else {\n                        return canLoadFails(route);\n                    }\n                });\n            }\n            else {\n                return rxjs_observable_of.of(new LoadedRouterConfig([], injector, null, null));\n            }\n        };\n        /**\n         * @param {?} route\n         * @param {?} urlTree\n         * @return {?}\n         */\n        ApplyRedirects.prototype.lineralizeSegments = function (route, urlTree) {\n            var /** @type {?} */ res = [];\n            var /** @type {?} */ c = urlTree.root;\n            while (true) {\n                res = res.concat(c.segments);\n                if (c.numberOfChildren === 0) {\n                    return rxjs_observable_of.of(res);\n                }\n                else if (c.numberOfChildren > 1 || !c.children[PRIMARY_OUTLET]) {\n                    return namedOutletsRedirect(route.redirectTo);\n                }\n                else {\n                    c = c.children[PRIMARY_OUTLET];\n                }\n            }\n        };\n        /**\n         * @param {?} segments\n         * @param {?} redirectTo\n         * @param {?} posParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.applyRedirectCommands = function (segments, redirectTo, posParams) {\n            var /** @type {?} */ t = this.urlSerializer.parse(redirectTo);\n            return this.applyRedirectCreatreUrlTree(redirectTo, this.urlSerializer.parse(redirectTo), segments, posParams);\n        };\n        /**\n         * @param {?} redirectTo\n         * @param {?} urlTree\n         * @param {?} segments\n         * @param {?} posParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.applyRedirectCreatreUrlTree = function (redirectTo, urlTree, segments, posParams) {\n            var /** @type {?} */ newRoot = this.createSegmentGroup(redirectTo, urlTree.root, segments, posParams);\n            return new UrlTree(newRoot, this.createQueryParams(urlTree.queryParams, this.urlTree.queryParams), urlTree.fragment);\n        };\n        /**\n         * @param {?} redirectToParams\n         * @param {?} actualParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.createQueryParams = function (redirectToParams, actualParams) {\n            var /** @type {?} */ res = {};\n            forEach(redirectToParams, function (v, k) {\n                if (v.startsWith(':')) {\n                    res[k] = actualParams[v.substring(1)];\n                }\n                else {\n                    res[k] = v;\n                }\n            });\n            return res;\n        };\n        /**\n         * @param {?} redirectTo\n         * @param {?} group\n         * @param {?} segments\n         * @param {?} posParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.createSegmentGroup = function (redirectTo, group, segments, posParams) {\n            var _this = this;\n            var /** @type {?} */ updatedSegments = this.createSegments(redirectTo, group.segments, segments, posParams);\n            var /** @type {?} */ children = {};\n            forEach(group.children, function (child, name) {\n                children[name] = _this.createSegmentGroup(redirectTo, child, segments, posParams);\n            });\n            return new UrlSegmentGroup(updatedSegments, children);\n        };\n        /**\n         * @param {?} redirectTo\n         * @param {?} redirectToSegments\n         * @param {?} actualSegments\n         * @param {?} posParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.createSegments = function (redirectTo, redirectToSegments, actualSegments, posParams) {\n            var _this = this;\n            return redirectToSegments.map(function (s) { return s.path.startsWith(':') ? _this.findPosParam(redirectTo, s, posParams) :\n                _this.findOrReturn(s, actualSegments); });\n        };\n        /**\n         * @param {?} redirectTo\n         * @param {?} redirectToUrlSegment\n         * @param {?} posParams\n         * @return {?}\n         */\n        ApplyRedirects.prototype.findPosParam = function (redirectTo, redirectToUrlSegment, posParams) {\n            var /** @type {?} */ pos = posParams[redirectToUrlSegment.path.substring(1)];\n            if (!pos)\n                throw new Error(\"Cannot redirect to '\" + redirectTo + \"'. Cannot find '\" + redirectToUrlSegment.path + \"'.\");\n            return pos;\n        };\n        /**\n         * @param {?} redirectToUrlSegment\n         * @param {?} actualSegments\n         * @return {?}\n         */\n        ApplyRedirects.prototype.findOrReturn = function (redirectToUrlSegment, actualSegments) {\n            var /** @type {?} */ idx = 0;\n            for (var _i = 0, actualSegments_1 = actualSegments; _i < actualSegments_1.length; _i++) {\n                var s = actualSegments_1[_i];\n                if (s.path === redirectToUrlSegment.path) {\n                    actualSegments.splice(idx);\n                    return s;\n                }\n                idx++;\n            }\n            return redirectToUrlSegment;\n        };\n        return ApplyRedirects;\n    }());\n    /**\n     * @param {?} injector\n     * @param {?} route\n     * @return {?}\n     */\n    function runGuards(injector, route) {\n        var /** @type {?} */ canLoad = route.canLoad;\n        if (!canLoad || canLoad.length === 0)\n            return rxjs_observable_of.of(true);\n        var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(canLoad), function (c) {\n            var /** @type {?} */ guard = injector.get(c);\n            if (guard.canLoad) {\n                return wrapIntoObservable(guard.canLoad(route));\n            }\n            else {\n                return wrapIntoObservable(guard(route));\n            }\n        });\n        return andObservables(obs);\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} route\n     * @param {?} segments\n     * @return {?}\n     */\n    function match(segmentGroup, route, segments) {\n        var /** @type {?} */ noMatch = { matched: false, consumedSegments: /** @type {?} */ ([]), lastChild: 0, positionalParamSegments: {} };\n        if (route.path === '') {\n            if ((route.pathMatch === 'full') && (segmentGroup.hasChildren() || segments.length > 0)) {\n                return { matched: false, consumedSegments: [], lastChild: 0, positionalParamSegments: {} };\n            }\n            else {\n                return { matched: true, consumedSegments: [], lastChild: 0, positionalParamSegments: {} };\n            }\n        }\n        var /** @type {?} */ matcher = route.matcher || defaultUrlMatcher;\n        var /** @type {?} */ res = matcher(segments, segmentGroup, route);\n        if (!res)\n            return noMatch;\n        return {\n            matched: true,\n            consumedSegments: res.consumed,\n            lastChild: res.consumed.length,\n            positionalParamSegments: res.posParams\n        };\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} consumedSegments\n     * @param {?} slicedSegments\n     * @param {?} config\n     * @return {?}\n     */\n    function split(segmentGroup, consumedSegments, slicedSegments, config) {\n        if (slicedSegments.length > 0 &&\n            containsEmptyPathRedirectsWithNamedOutlets(segmentGroup, slicedSegments, config)) {\n            var /** @type {?} */ s = new UrlSegmentGroup(consumedSegments, createChildrenForEmptySegments(config, new UrlSegmentGroup(slicedSegments, segmentGroup.children)));\n            return { segmentGroup: mergeTrivialChildren(s), slicedSegments: [] };\n        }\n        else if (slicedSegments.length === 0 &&\n            containsEmptyPathRedirects(segmentGroup, slicedSegments, config)) {\n            var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, addEmptySegmentsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children));\n            return { segmentGroup: mergeTrivialChildren(s), slicedSegments: slicedSegments };\n        }\n        else {\n            return { segmentGroup: segmentGroup, slicedSegments: slicedSegments };\n        }\n    }\n    /**\n     * @param {?} s\n     * @return {?}\n     */\n    function mergeTrivialChildren(s) {\n        if (s.numberOfChildren === 1 && s.children[PRIMARY_OUTLET]) {\n            var /** @type {?} */ c = s.children[PRIMARY_OUTLET];\n            return new UrlSegmentGroup(s.segments.concat(c.segments), c.children);\n        }\n        else {\n            return s;\n        }\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @param {?} children\n     * @return {?}\n     */\n    function addEmptySegmentsToChildrenIfNeeded(segmentGroup, slicedSegments, routes, children) {\n        var /** @type {?} */ res = {};\n        for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n            var r = routes_1[_i];\n            if (emptyPathRedirect(segmentGroup, slicedSegments, r) && !children[getOutlet$1(r)]) {\n                res[getOutlet$1(r)] = new UrlSegmentGroup([], {});\n            }\n        }\n        return merge(children, res);\n    }\n    /**\n     * @param {?} routes\n     * @param {?} primarySegmentGroup\n     * @return {?}\n     */\n    function createChildrenForEmptySegments(routes, primarySegmentGroup) {\n        var /** @type {?} */ res = {};\n        res[PRIMARY_OUTLET] = primarySegmentGroup;\n        for (var _i = 0, routes_2 = routes; _i < routes_2.length; _i++) {\n            var r = routes_2[_i];\n            if (r.path === '' && getOutlet$1(r) !== PRIMARY_OUTLET) {\n                res[getOutlet$1(r)] = new UrlSegmentGroup([], {});\n            }\n        }\n        return res;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @return {?}\n     */\n    function containsEmptyPathRedirectsWithNamedOutlets(segmentGroup, slicedSegments, routes) {\n        return routes\n            .filter(function (r) { return emptyPathRedirect(segmentGroup, slicedSegments, r) &&\n            getOutlet$1(r) !== PRIMARY_OUTLET; })\n            .length > 0;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @return {?}\n     */\n    function containsEmptyPathRedirects(segmentGroup, slicedSegments, routes) {\n        return routes.filter(function (r) { return emptyPathRedirect(segmentGroup, slicedSegments, r); }).length > 0;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} r\n     * @return {?}\n     */\n    function emptyPathRedirect(segmentGroup, slicedSegments, r) {\n        if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === 'full')\n            return false;\n        return r.path === '' && r.redirectTo !== undefined;\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function getOutlet$1(route) {\n        return route.outlet ? route.outlet : PRIMARY_OUTLET;\n    }\n\n    /**\n     * @param {?} config\n     * @param {?=} parentPath\n     * @return {?}\n     */\n    function validateConfig(config, parentPath) {\n        if (parentPath === void 0) { parentPath = ''; }\n        // forEach doesn't iterate undefined values\n        for (var /** @type {?} */ i = 0; i < config.length; i++) {\n            var /** @type {?} */ route = config[i];\n            var /** @type {?} */ fullPath = getFullPath(parentPath, route);\n            validateNode(route, fullPath);\n        }\n    }\n    /**\n     * @param {?} route\n     * @param {?} fullPath\n     * @return {?}\n     */\n    function validateNode(route, fullPath) {\n        if (!route) {\n            throw new Error(\"\\n      Invalid configuration of route '\" + fullPath + \"': Encountered undefined route.\\n      The reason might be an extra comma.\\n       \\n      Example: \\n      const routes: Routes = [\\n        { path: '', redirectTo: '/dashboard', pathMatch: 'full' },\\n        { path: 'dashboard',  component: DashboardComponent },, << two commas\\n        { path: 'detail/:id', component: HeroDetailComponent }\\n      ];\\n    \");\n        }\n        if (Array.isArray(route)) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': Array cannot be specified\");\n        }\n        if (!route.component && (route.outlet && route.outlet !== PRIMARY_OUTLET)) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': a componentless route cannot have a named outlet set\");\n        }\n        if (route.redirectTo && route.children) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and children cannot be used together\");\n        }\n        if (route.redirectTo && route.loadChildren) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and loadChildren cannot be used together\");\n        }\n        if (route.children && route.loadChildren) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': children and loadChildren cannot be used together\");\n        }\n        if (route.redirectTo && route.component) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and component cannot be used together\");\n        }\n        if (route.path && route.matcher) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': path and matcher cannot be used together\");\n        }\n        if (route.redirectTo === void 0 && !route.component && !route.children && !route.loadChildren) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"'. One of the following must be provided: component, redirectTo, children or loadChildren\");\n        }\n        if (route.path === void 0 && route.matcher === void 0) {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': routes must have either a path or a matcher specified\");\n        }\n        if (typeof route.path === 'string' && route.path.charAt(0) === '/') {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': path cannot start with a slash\");\n        }\n        if (route.path === '' && route.redirectTo !== void 0 && route.pathMatch === void 0) {\n            var /** @type {?} */ exp = \"The default value of 'pathMatch' is 'prefix', but often the intent is to use 'full'.\";\n            throw new Error(\"Invalid configuration of route '{path: \\\"\" + fullPath + \"\\\", redirectTo: \\\"\" + route.redirectTo + \"\\\"}': please provide 'pathMatch'. \" + exp);\n        }\n        if (route.pathMatch !== void 0 && route.pathMatch !== 'full' && route.pathMatch !== 'prefix') {\n            throw new Error(\"Invalid configuration of route '\" + fullPath + \"': pathMatch can only be set to 'prefix' or 'full'\");\n        }\n        if (route.children) {\n            validateConfig(route.children, fullPath);\n        }\n    }\n    /**\n     * @param {?} parentPath\n     * @param {?} currentRoute\n     * @return {?}\n     */\n    function getFullPath(parentPath, currentRoute) {\n        if (!currentRoute) {\n            return parentPath;\n        }\n        if (!parentPath && !currentRoute.path) {\n            return '';\n        }\n        else if (parentPath && !currentRoute.path) {\n            return parentPath + \"/\";\n        }\n        else if (!parentPath && currentRoute.path) {\n            return currentRoute.path;\n        }\n        else {\n            return parentPath + \"/\" + currentRoute.path;\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var Tree = (function () {\n        /**\n         * @param {?} root\n         */\n        function Tree(root) {\n            this._root = root;\n        }\n        Object.defineProperty(Tree.prototype, \"root\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._root.value; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * \\@internal\n         * @param {?} t\n         * @return {?}\n         */\n        Tree.prototype.parent = function (t) {\n            var /** @type {?} */ p = this.pathFromRoot(t);\n            return p.length > 1 ? p[p.length - 2] : null;\n        };\n        /**\n         * \\@internal\n         * @param {?} t\n         * @return {?}\n         */\n        Tree.prototype.children = function (t) {\n            var /** @type {?} */ n = findNode(t, this._root);\n            return n ? n.children.map(function (t) { return t.value; }) : [];\n        };\n        /**\n         * \\@internal\n         * @param {?} t\n         * @return {?}\n         */\n        Tree.prototype.firstChild = function (t) {\n            var /** @type {?} */ n = findNode(t, this._root);\n            return n && n.children.length > 0 ? n.children[0].value : null;\n        };\n        /**\n         * \\@internal\n         * @param {?} t\n         * @return {?}\n         */\n        Tree.prototype.siblings = function (t) {\n            var /** @type {?} */ p = findPath(t, this._root, []);\n            if (p.length < 2)\n                return [];\n            var /** @type {?} */ c = p[p.length - 2].children.map(function (c) { return c.value; });\n            return c.filter(function (cc) { return cc !== t; });\n        };\n        /**\n         * \\@internal\n         * @param {?} t\n         * @return {?}\n         */\n        Tree.prototype.pathFromRoot = function (t) { return findPath(t, this._root, []).map(function (s) { return s.value; }); };\n        return Tree;\n    }());\n    /**\n     * @param {?} expected\n     * @param {?} c\n     * @return {?}\n     */\n    function findNode(expected, c) {\n        if (expected === c.value)\n            return c;\n        for (var _i = 0, _a = c.children; _i < _a.length; _i++) {\n            var cc = _a[_i];\n            var /** @type {?} */ r = findNode(expected, cc);\n            if (r)\n                return r;\n        }\n        return null;\n    }\n    /**\n     * @param {?} expected\n     * @param {?} c\n     * @param {?} collected\n     * @return {?}\n     */\n    function findPath(expected, c, collected) {\n        collected.push(c);\n        if (expected === c.value)\n            return collected;\n        for (var _i = 0, _a = c.children; _i < _a.length; _i++) {\n            var cc = _a[_i];\n            var /** @type {?} */ cloned = collected.slice(0);\n            var /** @type {?} */ r = findPath(expected, cc, cloned);\n            if (r.length > 0)\n                return r;\n        }\n        return [];\n    }\n    var TreeNode = (function () {\n        /**\n         * @param {?} value\n         * @param {?} children\n         */\n        function TreeNode(value, children) {\n            this.value = value;\n            this.children = children;\n        }\n        /**\n         * @return {?}\n         */\n        TreeNode.prototype.toString = function () { return \"TreeNode(\" + this.value + \")\"; };\n        return TreeNode;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@whatItDoes Represents the state of the router.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({templateUrl:'template.html'})\n     * class MyComponent {\n     *   constructor(router: Router) {\n     *     const state: RouterState = router.routerState;\n     *     const root: ActivatedRoute = state.root;\n     *     const child = root.firstChild;\n     *     const id: Observable<string> = child.params.map(p => p.id);\n     *     //...\n     *   }\n     * }\n     * ```\n     *\n     * \\@description\n     * RouterState is a tree of activated routes. Every node in this tree knows about the \"consumed\" URL\n     * segments,\n     * the extracted parameters, and the resolved data.\n     *\n     * See {\\@link ActivatedRoute} for more information.\n     *\n     * \\@stable\n     */\n    var RouterState = (function (_super) {\n        __extends$1(RouterState, _super);\n        /**\n         * \\@internal\n         * @param {?} root\n         * @param {?} snapshot\n         */\n        function RouterState(root, snapshot) {\n            _super.call(this, root);\n            this.snapshot = snapshot;\n            setRouterStateSnapshot(this, root);\n        }\n        /**\n         * @return {?}\n         */\n        RouterState.prototype.toString = function () { return this.snapshot.toString(); };\n        return RouterState;\n    }(Tree));\n    /**\n     * @param {?} urlTree\n     * @param {?} rootComponent\n     * @return {?}\n     */\n    function createEmptyState(urlTree, rootComponent) {\n        var /** @type {?} */ snapshot = createEmptyStateSnapshot(urlTree, rootComponent);\n        var /** @type {?} */ emptyUrl = new rxjs_BehaviorSubject.BehaviorSubject([new UrlSegment('', {})]);\n        var /** @type {?} */ emptyParams = new rxjs_BehaviorSubject.BehaviorSubject({});\n        var /** @type {?} */ emptyData = new rxjs_BehaviorSubject.BehaviorSubject({});\n        var /** @type {?} */ emptyQueryParams = new rxjs_BehaviorSubject.BehaviorSubject({});\n        var /** @type {?} */ fragment = new rxjs_BehaviorSubject.BehaviorSubject('');\n        var /** @type {?} */ activated = new ActivatedRoute(emptyUrl, emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, snapshot.root);\n        activated.snapshot = snapshot.root;\n        return new RouterState(new TreeNode(activated, []), snapshot);\n    }\n    /**\n     * @param {?} urlTree\n     * @param {?} rootComponent\n     * @return {?}\n     */\n    function createEmptyStateSnapshot(urlTree, rootComponent) {\n        var /** @type {?} */ emptyParams = {};\n        var /** @type {?} */ emptyData = {};\n        var /** @type {?} */ emptyQueryParams = {};\n        var /** @type {?} */ fragment = '';\n        var /** @type {?} */ activated = new ActivatedRouteSnapshot([], emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, null, urlTree.root, -1, {});\n        return new RouterStateSnapshot('', new TreeNode(activated, []));\n    }\n    /**\n     * \\@whatItDoes Contains the information about a route associated with a component loaded in an\n     * outlet.\n     * An `ActivatedRoute` can also be used to traverse the router state tree.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({...})\n     * class MyComponent {\n     *   constructor(route: ActivatedRoute) {\n     *     const id: Observable<string> = route.params.map(p => p.id);\n     *     const url: Observable<string> = route.url.map(segments => segments.join(''));\n     *     // route.data includes both `data` and `resolve`\n     *     const user = route.data.map(d => d.user);\n     *   }\n     * }\n     * ```\n     *\n     * \\@stable\n     */\n    var ActivatedRoute = (function () {\n        /**\n         * \\@internal\n         * @param {?} url\n         * @param {?} params\n         * @param {?} queryParams\n         * @param {?} fragment\n         * @param {?} data\n         * @param {?} outlet\n         * @param {?} component\n         * @param {?} futureSnapshot\n         */\n        function ActivatedRoute(url, params, queryParams, fragment, data, outlet, component, futureSnapshot) {\n            this.url = url;\n            this.params = params;\n            this.queryParams = queryParams;\n            this.fragment = fragment;\n            this.data = data;\n            this.outlet = outlet;\n            this.component = component;\n            this._futureSnapshot = futureSnapshot;\n        }\n        Object.defineProperty(ActivatedRoute.prototype, \"routeConfig\", {\n            /**\n             * The configuration used to match this route\n             * @return {?}\n             */\n            get: function () { return this._futureSnapshot.routeConfig; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRoute.prototype, \"root\", {\n            /**\n             * The root of the router state\n             * @return {?}\n             */\n            get: function () { return this._routerState.root; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRoute.prototype, \"parent\", {\n            /**\n             * The parent of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.parent(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRoute.prototype, \"firstChild\", {\n            /**\n             * The first child of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.firstChild(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRoute.prototype, \"children\", {\n            /**\n             * The children of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.children(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRoute.prototype, \"pathFromRoot\", {\n            /**\n             * The path from the root of the router state tree to this route\n             * @return {?}\n             */\n            get: function () { return this._routerState.pathFromRoot(this); },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        ActivatedRoute.prototype.toString = function () {\n            return this.snapshot ? this.snapshot.toString() : \"Future(\" + this._futureSnapshot + \")\";\n        };\n        return ActivatedRoute;\n    }());\n    /**\n     * \\@internal\n     * @param {?} route\n     * @return {?}\n     */\n    function inheritedParamsDataResolve(route) {\n        var /** @type {?} */ pathToRoot = route.pathFromRoot;\n        var /** @type {?} */ inhertingStartingFrom = pathToRoot.length - 1;\n        while (inhertingStartingFrom >= 1) {\n            var /** @type {?} */ current = pathToRoot[inhertingStartingFrom];\n            var /** @type {?} */ parent_1 = pathToRoot[inhertingStartingFrom - 1];\n            // current route is an empty path => inherits its parent's params and data\n            if (current.routeConfig && current.routeConfig.path === '') {\n                inhertingStartingFrom--;\n            }\n            else if (!parent_1.component) {\n                inhertingStartingFrom--;\n            }\n            else {\n                break;\n            }\n        }\n        return pathToRoot.slice(inhertingStartingFrom).reduce(function (res, curr) {\n            var /** @type {?} */ params = merge(res.params, curr.params);\n            var /** @type {?} */ data = merge(res.data, curr.data);\n            var /** @type {?} */ resolve = merge(res.resolve, curr._resolvedData);\n            return { params: params, data: data, resolve: resolve };\n        }, /** @type {?} */ ({ params: {}, data: {}, resolve: {} }));\n    }\n    /**\n     * \\@whatItDoes Contains the information about a route associated with a component loaded in an\n     * outlet\n     * at a particular moment in time. ActivatedRouteSnapshot can also be used to traverse the router\n     * state tree.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({templateUrl:'./my-component.html'})\n     * class MyComponent {\n     *   constructor(route: ActivatedRoute) {\n     *     const id: string = route.snapshot.params.id;\n     *     const url: string = route.snapshot.url.join('');\n     *     const user = route.snapshot.data.user;\n     *   }\n     * }\n     * ```\n     *\n     * \\@stable\n     */\n    var ActivatedRouteSnapshot = (function () {\n        /**\n         * \\@internal\n         * @param {?} url\n         * @param {?} params\n         * @param {?} queryParams\n         * @param {?} fragment\n         * @param {?} data\n         * @param {?} outlet\n         * @param {?} component\n         * @param {?} routeConfig\n         * @param {?} urlSegment\n         * @param {?} lastPathIndex\n         * @param {?} resolve\n         */\n        function ActivatedRouteSnapshot(url, params, queryParams, fragment, data, outlet, component, routeConfig, urlSegment, lastPathIndex, resolve) {\n            this.url = url;\n            this.params = params;\n            this.queryParams = queryParams;\n            this.fragment = fragment;\n            this.data = data;\n            this.outlet = outlet;\n            this.component = component;\n            this._routeConfig = routeConfig;\n            this._urlSegment = urlSegment;\n            this._lastPathIndex = lastPathIndex;\n            this._resolve = resolve;\n        }\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"routeConfig\", {\n            /**\n             * The configuration used to match this route\n             * @return {?}\n             */\n            get: function () { return this._routeConfig; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"root\", {\n            /**\n             * The root of the router state\n             * @return {?}\n             */\n            get: function () { return this._routerState.root; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"parent\", {\n            /**\n             * The parent of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.parent(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"firstChild\", {\n            /**\n             * The first child of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.firstChild(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"children\", {\n            /**\n             * The children of this route in the router state tree\n             * @return {?}\n             */\n            get: function () { return this._routerState.children(this); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ActivatedRouteSnapshot.prototype, \"pathFromRoot\", {\n            /**\n             * The path from the root of the router state tree to this route\n             * @return {?}\n             */\n            get: function () { return this._routerState.pathFromRoot(this); },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        ActivatedRouteSnapshot.prototype.toString = function () {\n            var /** @type {?} */ url = this.url.map(function (segment) { return segment.toString(); }).join('/');\n            var /** @type {?} */ matched = this._routeConfig ? this._routeConfig.path : '';\n            return \"Route(url:'\" + url + \"', path:'\" + matched + \"')\";\n        };\n        return ActivatedRouteSnapshot;\n    }());\n    /**\n     * \\@whatItDoes Represents the state of the router at a moment in time.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@Component({templateUrl:'template.html'})\n     * class MyComponent {\n     *   constructor(router: Router) {\n     *     const state: RouterState = router.routerState;\n     *     const snapshot: RouterStateSnapshot = state.snapshot;\n     *     const root: ActivatedRouteSnapshot = snapshot.root;\n     *     const child = root.firstChild;\n     *     const id: Observable<string> = child.params.map(p => p.id);\n     *     //...\n     *   }\n     * }\n     * ```\n     *\n     * \\@description\n     * RouterStateSnapshot is a tree of activated route snapshots. Every node in this tree knows about\n     * the \"consumed\" URL segments, the extracted parameters, and the resolved data.\n     *\n     * \\@stable\n     */\n    var RouterStateSnapshot = (function (_super) {\n        __extends$1(RouterStateSnapshot, _super);\n        /**\n         * \\@internal\n         * @param {?} url\n         * @param {?} root\n         */\n        function RouterStateSnapshot(url, root) {\n            _super.call(this, root);\n            this.url = url;\n            setRouterStateSnapshot(this, root);\n        }\n        /**\n         * @return {?}\n         */\n        RouterStateSnapshot.prototype.toString = function () { return serializeNode(this._root); };\n        return RouterStateSnapshot;\n    }(Tree));\n    /**\n     * @param {?} state\n     * @param {?} node\n     * @return {?}\n     */\n    function setRouterStateSnapshot(state, node) {\n        node.value._routerState = state;\n        node.children.forEach(function (c) { return setRouterStateSnapshot(state, c); });\n    }\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function serializeNode(node) {\n        var /** @type {?} */ c = node.children.length > 0 ? \" { \" + node.children.map(serializeNode).join(\", \") + \" } \" : '';\n        return \"\" + node.value + c;\n    }\n    /**\n     * The expectation is that the activate route is created with the right set of parameters.\n     * So we push new values into the observables only when they are not the initial values.\n     * And we detect that by checking if the snapshot field is set.\n     * @param {?} route\n     * @return {?}\n     */\n    function advanceActivatedRoute(route) {\n        if (route.snapshot) {\n            var /** @type {?} */ currentSnapshot = route.snapshot;\n            route.snapshot = route._futureSnapshot;\n            if (!shallowEqual(currentSnapshot.queryParams, route._futureSnapshot.queryParams)) {\n                ((route.queryParams)).next(route._futureSnapshot.queryParams);\n            }\n            if (currentSnapshot.fragment !== route._futureSnapshot.fragment) {\n                ((route.fragment)).next(route._futureSnapshot.fragment);\n            }\n            if (!shallowEqual(currentSnapshot.params, route._futureSnapshot.params)) {\n                ((route.params)).next(route._futureSnapshot.params);\n            }\n            if (!shallowEqualArrays(currentSnapshot.url, route._futureSnapshot.url)) {\n                ((route.url)).next(route._futureSnapshot.url);\n            }\n            if (!equalParamsAndUrlSegments(currentSnapshot, route._futureSnapshot)) {\n                ((route.data)).next(route._futureSnapshot.data);\n            }\n        }\n        else {\n            route.snapshot = route._futureSnapshot;\n            // this is for resolved data\n            ((route.data)).next(route._futureSnapshot.data);\n        }\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function equalParamsAndUrlSegments(a, b) {\n        return shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);\n    }\n\n    /**\n     * @param {?} routeReuseStrategy\n     * @param {?} curr\n     * @param {?} prevState\n     * @return {?}\n     */\n    function createRouterState(routeReuseStrategy, curr, prevState) {\n        var /** @type {?} */ root = createNode(routeReuseStrategy, curr._root, prevState ? prevState._root : undefined);\n        return new RouterState(root, curr);\n    }\n    /**\n     * @param {?} routeReuseStrategy\n     * @param {?} curr\n     * @param {?=} prevState\n     * @return {?}\n     */\n    function createNode(routeReuseStrategy, curr, prevState) {\n        // reuse an activated route that is currently displayed on the screen\n        if (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) {\n            var /** @type {?} */ value = prevState.value;\n            value._futureSnapshot = curr.value;\n            var /** @type {?} */ children = createOrReuseChildren(routeReuseStrategy, curr, prevState);\n            return new TreeNode(value, children);\n        }\n        else if (routeReuseStrategy.retrieve(curr.value)) {\n            var /** @type {?} */ tree = ((routeReuseStrategy.retrieve(curr.value))).route;\n            setFutureSnapshotsOfActivatedRoutes(curr, tree);\n            return tree;\n        }\n        else {\n            var /** @type {?} */ value = createActivatedRoute(curr.value);\n            var /** @type {?} */ children = curr.children.map(function (c) { return createNode(routeReuseStrategy, c); });\n            return new TreeNode(value, children);\n        }\n    }\n    /**\n     * @param {?} curr\n     * @param {?} result\n     * @return {?}\n     */\n    function setFutureSnapshotsOfActivatedRoutes(curr, result) {\n        if (curr.value.routeConfig !== result.value.routeConfig) {\n            throw new Error('Cannot reattach ActivatedRouteSnapshot created from a different route');\n        }\n        if (curr.children.length !== result.children.length) {\n            throw new Error('Cannot reattach ActivatedRouteSnapshot with a different number of children');\n        }\n        result.value._futureSnapshot = curr.value;\n        for (var /** @type {?} */ i = 0; i < curr.children.length; ++i) {\n            setFutureSnapshotsOfActivatedRoutes(curr.children[i], result.children[i]);\n        }\n    }\n    /**\n     * @param {?} routeReuseStrategy\n     * @param {?} curr\n     * @param {?} prevState\n     * @return {?}\n     */\n    function createOrReuseChildren(routeReuseStrategy, curr, prevState) {\n        return curr.children.map(function (child) {\n            for (var _i = 0, _a = prevState.children; _i < _a.length; _i++) {\n                var p = _a[_i];\n                if (routeReuseStrategy.shouldReuseRoute(p.value.snapshot, child.value)) {\n                    return createNode(routeReuseStrategy, child, p);\n                }\n            }\n            return createNode(routeReuseStrategy, child);\n        });\n    }\n    /**\n     * @param {?} c\n     * @return {?}\n     */\n    function createActivatedRoute(c) {\n        return new ActivatedRoute(new rxjs_BehaviorSubject.BehaviorSubject(c.url), new rxjs_BehaviorSubject.BehaviorSubject(c.params), new rxjs_BehaviorSubject.BehaviorSubject(c.queryParams), new rxjs_BehaviorSubject.BehaviorSubject(c.fragment), new rxjs_BehaviorSubject.BehaviorSubject(c.data), c.outlet, c.component, c);\n    }\n\n    /**\n     * @param {?} route\n     * @param {?} urlTree\n     * @param {?} commands\n     * @param {?} queryParams\n     * @param {?} fragment\n     * @return {?}\n     */\n    function createUrlTree(route, urlTree, commands, queryParams, fragment) {\n        if (commands.length === 0) {\n            return tree(urlTree.root, urlTree.root, urlTree, queryParams, fragment);\n        }\n        var /** @type {?} */ nav = computeNavigation(commands);\n        if (nav.toRoot()) {\n            return tree(urlTree.root, new UrlSegmentGroup([], {}), urlTree, queryParams, fragment);\n        }\n        var /** @type {?} */ startingPosition = findStartingPosition(nav, urlTree, route);\n        var /** @type {?} */ segmentGroup = startingPosition.processChildren ?\n            updateSegmentGroupChildren(startingPosition.segmentGroup, startingPosition.index, nav.commands) :\n            updateSegmentGroup(startingPosition.segmentGroup, startingPosition.index, nav.commands);\n        return tree(startingPosition.segmentGroup, segmentGroup, urlTree, queryParams, fragment);\n    }\n    /**\n     * @param {?} command\n     * @return {?}\n     */\n    function isMatrixParams(command) {\n        return typeof command === 'object' && command != null && !command.outlets && !command.segmentPath;\n    }\n    /**\n     * @param {?} oldSegmentGroup\n     * @param {?} newSegmentGroup\n     * @param {?} urlTree\n     * @param {?} queryParams\n     * @param {?} fragment\n     * @return {?}\n     */\n    function tree(oldSegmentGroup, newSegmentGroup, urlTree, queryParams, fragment) {\n        if (urlTree.root === oldSegmentGroup) {\n            return new UrlTree(newSegmentGroup, stringify(queryParams), fragment);\n        }\n        return new UrlTree(replaceSegment(urlTree.root, oldSegmentGroup, newSegmentGroup), stringify(queryParams), fragment);\n    }\n    /**\n     * @param {?} current\n     * @param {?} oldSegment\n     * @param {?} newSegment\n     * @return {?}\n     */\n    function replaceSegment(current, oldSegment, newSegment) {\n        var /** @type {?} */ children = {};\n        forEach(current.children, function (c, outletName) {\n            if (c === oldSegment) {\n                children[outletName] = newSegment;\n            }\n            else {\n                children[outletName] = replaceSegment(c, oldSegment, newSegment);\n            }\n        });\n        return new UrlSegmentGroup(current.segments, children);\n    }\n    var Navigation = (function () {\n        /**\n         * @param {?} isAbsolute\n         * @param {?} numberOfDoubleDots\n         * @param {?} commands\n         */\n        function Navigation(isAbsolute, numberOfDoubleDots, commands) {\n            this.isAbsolute = isAbsolute;\n            this.numberOfDoubleDots = numberOfDoubleDots;\n            this.commands = commands;\n            if (isAbsolute && commands.length > 0 && isMatrixParams(commands[0])) {\n                throw new Error('Root segment cannot have matrix parameters');\n            }\n            var cmdWithOutlet = commands.find(function (c) { return typeof c === 'object' && c != null && c.outlets; });\n            if (cmdWithOutlet && cmdWithOutlet !== last(commands)) {\n                throw new Error('{outlets:{}} has to be the last command');\n            }\n        }\n        /**\n         * @return {?}\n         */\n        Navigation.prototype.toRoot = function () {\n            return this.isAbsolute && this.commands.length === 1 && this.commands[0] == '/';\n        };\n        return Navigation;\n    }());\n    /**\n     * Transforms commands to a normalized `Navigation`\n     * @param {?} commands\n     * @return {?}\n     */\n    function computeNavigation(commands) {\n        if ((typeof commands[0] === 'string') && commands.length === 1 && commands[0] === '/') {\n            return new Navigation(true, 0, commands);\n        }\n        var /** @type {?} */ numberOfDoubleDots = 0;\n        var /** @type {?} */ isAbsolute = false;\n        var /** @type {?} */ res = commands.reduce(function (res, cmd, cmdIdx) {\n            if (typeof cmd === 'object' && cmd != null) {\n                if (cmd.outlets) {\n                    var /** @type {?} */ outlets_1 = {};\n                    forEach(cmd.outlets, function (commands, name) {\n                        outlets_1[name] = typeof commands === 'string' ? commands.split('/') : commands;\n                    });\n                    return res.concat([{ outlets: outlets_1 }]);\n                }\n                if (cmd.segmentPath) {\n                    return res.concat([cmd.segmentPath]);\n                }\n            }\n            if (!(typeof cmd === 'string')) {\n                return res.concat([cmd]);\n            }\n            if (cmdIdx === 0) {\n                cmd.split('/').forEach(function (urlPart, partIndex) {\n                    if (partIndex == 0 && urlPart === '.') {\n                    }\n                    else if (partIndex == 0 && urlPart === '') {\n                        isAbsolute = true;\n                    }\n                    else if (urlPart === '..') {\n                        numberOfDoubleDots++;\n                    }\n                    else if (urlPart != '') {\n                        res.push(urlPart);\n                    }\n                });\n                return res;\n            }\n            return res.concat([cmd]);\n        }, []);\n        return new Navigation(isAbsolute, numberOfDoubleDots, res);\n    }\n    var Position = (function () {\n        /**\n         * @param {?} segmentGroup\n         * @param {?} processChildren\n         * @param {?} index\n         */\n        function Position(segmentGroup, processChildren, index) {\n            this.segmentGroup = segmentGroup;\n            this.processChildren = processChildren;\n            this.index = index;\n        }\n        return Position;\n    }());\n    /**\n     * @param {?} nav\n     * @param {?} tree\n     * @param {?} route\n     * @return {?}\n     */\n    function findStartingPosition(nav, tree, route) {\n        if (nav.isAbsolute) {\n            return new Position(tree.root, true, 0);\n        }\n        if (route.snapshot._lastPathIndex === -1) {\n            return new Position(route.snapshot._urlSegment, true, 0);\n        }\n        var /** @type {?} */ modifier = isMatrixParams(nav.commands[0]) ? 0 : 1;\n        var /** @type {?} */ index = route.snapshot._lastPathIndex + modifier;\n        return createPositionApplyingDoubleDots(route.snapshot._urlSegment, index, nav.numberOfDoubleDots);\n    }\n    /**\n     * @param {?} group\n     * @param {?} index\n     * @param {?} numberOfDoubleDots\n     * @return {?}\n     */\n    function createPositionApplyingDoubleDots(group, index, numberOfDoubleDots) {\n        var /** @type {?} */ g = group;\n        var /** @type {?} */ ci = index;\n        var /** @type {?} */ dd = numberOfDoubleDots;\n        while (dd > ci) {\n            dd -= ci;\n            g = g.parent;\n            if (!g) {\n                throw new Error('Invalid number of \\'../\\'');\n            }\n            ci = g.segments.length;\n        }\n        return new Position(g, false, ci - dd);\n    }\n    /**\n     * @param {?} command\n     * @return {?}\n     */\n    function getPath(command) {\n        if (typeof command === 'object' && command != null && command.outlets) {\n            return command.outlets[PRIMARY_OUTLET];\n        }\n        return \"\" + command;\n    }\n    /**\n     * @param {?} commands\n     * @return {?}\n     */\n    function getOutlets(commands) {\n        if (!(typeof commands[0] === 'object'))\n            return (_a = {}, _a[PRIMARY_OUTLET] = commands, _a);\n        if (commands[0].outlets === undefined)\n            return (_b = {}, _b[PRIMARY_OUTLET] = commands, _b);\n        return commands[0].outlets;\n        var _a, _b;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} startIndex\n     * @param {?} commands\n     * @return {?}\n     */\n    function updateSegmentGroup(segmentGroup, startIndex, commands) {\n        if (!segmentGroup) {\n            segmentGroup = new UrlSegmentGroup([], {});\n        }\n        if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n            return updateSegmentGroupChildren(segmentGroup, startIndex, commands);\n        }\n        var /** @type {?} */ m = prefixedWith(segmentGroup, startIndex, commands);\n        var /** @type {?} */ slicedCommands = commands.slice(m.commandIndex);\n        if (m.match && m.pathIndex < segmentGroup.segments.length) {\n            var /** @type {?} */ g = new UrlSegmentGroup(segmentGroup.segments.slice(0, m.pathIndex), {});\n            g.children[PRIMARY_OUTLET] =\n                new UrlSegmentGroup(segmentGroup.segments.slice(m.pathIndex), segmentGroup.children);\n            return updateSegmentGroupChildren(g, 0, slicedCommands);\n        }\n        else if (m.match && slicedCommands.length === 0) {\n            return new UrlSegmentGroup(segmentGroup.segments, {});\n        }\n        else if (m.match && !segmentGroup.hasChildren()) {\n            return createNewSegmentGroup(segmentGroup, startIndex, commands);\n        }\n        else if (m.match) {\n            return updateSegmentGroupChildren(segmentGroup, 0, slicedCommands);\n        }\n        else {\n            return createNewSegmentGroup(segmentGroup, startIndex, commands);\n        }\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} startIndex\n     * @param {?} commands\n     * @return {?}\n     */\n    function updateSegmentGroupChildren(segmentGroup, startIndex, commands) {\n        if (commands.length === 0) {\n            return new UrlSegmentGroup(segmentGroup.segments, {});\n        }\n        else {\n            var /** @type {?} */ outlets_2 = getOutlets(commands);\n            var /** @type {?} */ children_1 = {};\n            forEach(outlets_2, function (commands, outlet) {\n                if (commands !== null) {\n                    children_1[outlet] = updateSegmentGroup(segmentGroup.children[outlet], startIndex, commands);\n                }\n            });\n            forEach(segmentGroup.children, function (child, childOutlet) {\n                if (outlets_2[childOutlet] === undefined) {\n                    children_1[childOutlet] = child;\n                }\n            });\n            return new UrlSegmentGroup(segmentGroup.segments, children_1);\n        }\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} startIndex\n     * @param {?} commands\n     * @return {?}\n     */\n    function prefixedWith(segmentGroup, startIndex, commands) {\n        var /** @type {?} */ currentCommandIndex = 0;\n        var /** @type {?} */ currentPathIndex = startIndex;\n        var /** @type {?} */ noMatch = { match: false, pathIndex: 0, commandIndex: 0 };\n        while (currentPathIndex < segmentGroup.segments.length) {\n            if (currentCommandIndex >= commands.length)\n                return noMatch;\n            var /** @type {?} */ path = segmentGroup.segments[currentPathIndex];\n            var /** @type {?} */ curr = getPath(commands[currentCommandIndex]);\n            var /** @type {?} */ next = currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;\n            if (currentPathIndex > 0 && curr === undefined)\n                break;\n            if (curr && next && (typeof next === 'object') && next.outlets === undefined) {\n                if (!compare(curr, next, path))\n                    return noMatch;\n                currentCommandIndex += 2;\n            }\n            else {\n                if (!compare(curr, {}, path))\n                    return noMatch;\n                currentCommandIndex++;\n            }\n            currentPathIndex++;\n        }\n        return { match: true, pathIndex: currentPathIndex, commandIndex: currentCommandIndex };\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} startIndex\n     * @param {?} commands\n     * @return {?}\n     */\n    function createNewSegmentGroup(segmentGroup, startIndex, commands) {\n        var /** @type {?} */ paths = segmentGroup.segments.slice(0, startIndex);\n        var /** @type {?} */ i = 0;\n        while (i < commands.length) {\n            if (typeof commands[i] === 'object' && commands[i].outlets !== undefined) {\n                var /** @type {?} */ children = createNewSegmentChildren(commands[i].outlets);\n                return new UrlSegmentGroup(paths, children);\n            }\n            // if we start with an object literal, we need to reuse the path part from the segment\n            if (i === 0 && isMatrixParams(commands[0])) {\n                var /** @type {?} */ p = segmentGroup.segments[startIndex];\n                paths.push(new UrlSegment(p.path, commands[0]));\n                i++;\n                continue;\n            }\n            var /** @type {?} */ curr = getPath(commands[i]);\n            var /** @type {?} */ next = (i < commands.length - 1) ? commands[i + 1] : null;\n            if (curr && next && isMatrixParams(next)) {\n                paths.push(new UrlSegment(curr, stringify(next)));\n                i += 2;\n            }\n            else {\n                paths.push(new UrlSegment(curr, {}));\n                i++;\n            }\n        }\n        return new UrlSegmentGroup(paths, {});\n    }\n    /**\n     * @param {?} outlets\n     * @return {?}\n     */\n    function createNewSegmentChildren(outlets) {\n        var /** @type {?} */ children = {};\n        forEach(outlets, function (commands, outlet) {\n            if (commands !== null) {\n                children[outlet] = createNewSegmentGroup(new UrlSegmentGroup([], {}), 0, commands);\n            }\n        });\n        return children;\n    }\n    /**\n     * @param {?} params\n     * @return {?}\n     */\n    function stringify(params) {\n        var /** @type {?} */ res = {};\n        forEach(params, function (v, k) { return res[k] = \"\" + v; });\n        return res;\n    }\n    /**\n     * @param {?} path\n     * @param {?} params\n     * @param {?} segment\n     * @return {?}\n     */\n    function compare(path, params, segment) {\n        return path == segment.path && shallowEqual(params, segment.parameters);\n    }\n\n    var NoMatch$1 = (function () {\n        function NoMatch() {\n        }\n        return NoMatch;\n    }());\n    /**\n     * @param {?} rootComponentType\n     * @param {?} config\n     * @param {?} urlTree\n     * @param {?} url\n     * @return {?}\n     */\n    function recognize(rootComponentType, config, urlTree, url) {\n        return new Recognizer(rootComponentType, config, urlTree, url).recognize();\n    }\n    var Recognizer = (function () {\n        /**\n         * @param {?} rootComponentType\n         * @param {?} config\n         * @param {?} urlTree\n         * @param {?} url\n         */\n        function Recognizer(rootComponentType, config, urlTree, url) {\n            this.rootComponentType = rootComponentType;\n            this.config = config;\n            this.urlTree = urlTree;\n            this.url = url;\n        }\n        /**\n         * @return {?}\n         */\n        Recognizer.prototype.recognize = function () {\n            try {\n                var /** @type {?} */ rootSegmentGroup = split$1(this.urlTree.root, [], [], this.config).segmentGroup;\n                var /** @type {?} */ children = this.processSegmentGroup(this.config, rootSegmentGroup, PRIMARY_OUTLET);\n                var /** @type {?} */ root = new ActivatedRouteSnapshot([], Object.freeze({}), Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, {}, PRIMARY_OUTLET, this.rootComponentType, null, this.urlTree.root, -1, {});\n                var /** @type {?} */ rootNode = new TreeNode(root, children);\n                var /** @type {?} */ routeState = new RouterStateSnapshot(this.url, rootNode);\n                this.inheriteParamsAndData(routeState._root);\n                return rxjs_observable_of.of(routeState);\n            }\n            catch (e) {\n                return new rxjs_Observable.Observable(function (obs) { return obs.error(e); });\n            }\n        };\n        /**\n         * @param {?} routeNode\n         * @return {?}\n         */\n        Recognizer.prototype.inheriteParamsAndData = function (routeNode) {\n            var _this = this;\n            var /** @type {?} */ route = routeNode.value;\n            var /** @type {?} */ i = inheritedParamsDataResolve(route);\n            route.params = Object.freeze(i.params);\n            route.data = Object.freeze(i.data);\n            routeNode.children.forEach(function (n) { return _this.inheriteParamsAndData(n); });\n        };\n        /**\n         * @param {?} config\n         * @param {?} segmentGroup\n         * @param {?} outlet\n         * @return {?}\n         */\n        Recognizer.prototype.processSegmentGroup = function (config, segmentGroup, outlet) {\n            if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n                return this.processChildren(config, segmentGroup);\n            }\n            else {\n                return this.processSegment(config, segmentGroup, segmentGroup.segments, outlet);\n            }\n        };\n        /**\n         * @param {?} config\n         * @param {?} segmentGroup\n         * @return {?}\n         */\n        Recognizer.prototype.processChildren = function (config, segmentGroup) {\n            var _this = this;\n            var /** @type {?} */ children = mapChildrenIntoArray(segmentGroup, function (child, childOutlet) { return _this.processSegmentGroup(config, child, childOutlet); });\n            checkOutletNameUniqueness(children);\n            sortActivatedRouteSnapshots(children);\n            return children;\n        };\n        /**\n         * @param {?} config\n         * @param {?} segmentGroup\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        Recognizer.prototype.processSegment = function (config, segmentGroup, segments, outlet) {\n            for (var _i = 0, config_1 = config; _i < config_1.length; _i++) {\n                var r = config_1[_i];\n                try {\n                    return this.processSegmentAgainstRoute(r, segmentGroup, segments, outlet);\n                }\n                catch (e) {\n                    if (!(e instanceof NoMatch$1))\n                        throw e;\n                }\n            }\n            if (this.noLeftoversInUrl(segmentGroup, segments, outlet)) {\n                return [];\n            }\n            else {\n                throw new NoMatch$1();\n            }\n        };\n        /**\n         * @param {?} segmentGroup\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        Recognizer.prototype.noLeftoversInUrl = function (segmentGroup, segments, outlet) {\n            return segments.length === 0 && !segmentGroup.children[outlet];\n        };\n        /**\n         * @param {?} route\n         * @param {?} rawSegment\n         * @param {?} segments\n         * @param {?} outlet\n         * @return {?}\n         */\n        Recognizer.prototype.processSegmentAgainstRoute = function (route, rawSegment, segments, outlet) {\n            if (route.redirectTo)\n                throw new NoMatch$1();\n            if ((route.outlet ? route.outlet : PRIMARY_OUTLET) !== outlet)\n                throw new NoMatch$1();\n            if (route.path === '**') {\n                var /** @type {?} */ params = segments.length > 0 ? last(segments).parameters : {};\n                var /** @type {?} */ snapshot_1 = new ActivatedRouteSnapshot(segments, params, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, getData(route), outlet, route.component, route, getSourceSegmentGroup(rawSegment), getPathIndexShift(rawSegment) + segments.length, getResolve(route));\n                return [new TreeNode(snapshot_1, [])];\n            }\n            var _a = match$1(rawSegment, route, segments), consumedSegments = _a.consumedSegments, parameters = _a.parameters, lastChild = _a.lastChild;\n            var /** @type {?} */ rawSlicedSegments = segments.slice(lastChild);\n            var /** @type {?} */ childConfig = getChildConfig(route);\n            var _b = split$1(rawSegment, consumedSegments, rawSlicedSegments, childConfig), segmentGroup = _b.segmentGroup, slicedSegments = _b.slicedSegments;\n            var /** @type {?} */ snapshot = new ActivatedRouteSnapshot(consumedSegments, parameters, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, getData(route), outlet, route.component, route, getSourceSegmentGroup(rawSegment), getPathIndexShift(rawSegment) + consumedSegments.length, getResolve(route));\n            if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {\n                var /** @type {?} */ children = this.processChildren(childConfig, segmentGroup);\n                return [new TreeNode(snapshot, children)];\n            }\n            else if (childConfig.length === 0 && slicedSegments.length === 0) {\n                return [new TreeNode(snapshot, [])];\n            }\n            else {\n                var /** @type {?} */ children = this.processSegment(childConfig, segmentGroup, slicedSegments, PRIMARY_OUTLET);\n                return [new TreeNode(snapshot, children)];\n            }\n        };\n        return Recognizer;\n    }());\n    /**\n     * @param {?} nodes\n     * @return {?}\n     */\n    function sortActivatedRouteSnapshots(nodes) {\n        nodes.sort(function (a, b) {\n            if (a.value.outlet === PRIMARY_OUTLET)\n                return -1;\n            if (b.value.outlet === PRIMARY_OUTLET)\n                return 1;\n            return a.value.outlet.localeCompare(b.value.outlet);\n        });\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function getChildConfig(route) {\n        if (route.children) {\n            return route.children;\n        }\n        else if (route.loadChildren) {\n            return ((route))._loadedConfig.routes;\n        }\n        else {\n            return [];\n        }\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} route\n     * @param {?} segments\n     * @return {?}\n     */\n    function match$1(segmentGroup, route, segments) {\n        if (route.path === '') {\n            if (route.pathMatch === 'full' && (segmentGroup.hasChildren() || segments.length > 0)) {\n                throw new NoMatch$1();\n            }\n            else {\n                return { consumedSegments: [], lastChild: 0, parameters: {} };\n            }\n        }\n        var /** @type {?} */ matcher = route.matcher || defaultUrlMatcher;\n        var /** @type {?} */ res = matcher(segments, segmentGroup, route);\n        if (!res)\n            throw new NoMatch$1();\n        var /** @type {?} */ posParams = {};\n        forEach(res.posParams, function (v, k) { posParams[k] = v.path; });\n        var /** @type {?} */ parameters = merge(posParams, res.consumed[res.consumed.length - 1].parameters);\n        return { consumedSegments: res.consumed, lastChild: res.consumed.length, parameters: parameters };\n    }\n    /**\n     * @param {?} nodes\n     * @return {?}\n     */\n    function checkOutletNameUniqueness(nodes) {\n        var /** @type {?} */ names = {};\n        nodes.forEach(function (n) {\n            var /** @type {?} */ routeWithSameOutletName = names[n.value.outlet];\n            if (routeWithSameOutletName) {\n                var /** @type {?} */ p = routeWithSameOutletName.url.map(function (s) { return s.toString(); }).join('/');\n                var /** @type {?} */ c = n.value.url.map(function (s) { return s.toString(); }).join('/');\n                throw new Error(\"Two segments cannot have the same outlet name: '\" + p + \"' and '\" + c + \"'.\");\n            }\n            names[n.value.outlet] = n.value;\n        });\n    }\n    /**\n     * @param {?} segmentGroup\n     * @return {?}\n     */\n    function getSourceSegmentGroup(segmentGroup) {\n        var /** @type {?} */ s = segmentGroup;\n        while (s._sourceSegment) {\n            s = s._sourceSegment;\n        }\n        return s;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @return {?}\n     */\n    function getPathIndexShift(segmentGroup) {\n        var /** @type {?} */ s = segmentGroup;\n        var /** @type {?} */ res = (s._segmentIndexShift ? s._segmentIndexShift : 0);\n        while (s._sourceSegment) {\n            s = s._sourceSegment;\n            res += (s._segmentIndexShift ? s._segmentIndexShift : 0);\n        }\n        return res - 1;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} consumedSegments\n     * @param {?} slicedSegments\n     * @param {?} config\n     * @return {?}\n     */\n    function split$1(segmentGroup, consumedSegments, slicedSegments, config) {\n        if (slicedSegments.length > 0 &&\n            containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, config)) {\n            var /** @type {?} */ s = new UrlSegmentGroup(consumedSegments, createChildrenForEmptyPaths(segmentGroup, consumedSegments, config, new UrlSegmentGroup(slicedSegments, segmentGroup.children)));\n            s._sourceSegment = segmentGroup;\n            s._segmentIndexShift = consumedSegments.length;\n            return { segmentGroup: s, slicedSegments: [] };\n        }\n        else if (slicedSegments.length === 0 &&\n            containsEmptyPathMatches(segmentGroup, slicedSegments, config)) {\n            var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children));\n            s._sourceSegment = segmentGroup;\n            s._segmentIndexShift = consumedSegments.length;\n            return { segmentGroup: s, slicedSegments: slicedSegments };\n        }\n        else {\n            var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, segmentGroup.children);\n            s._sourceSegment = segmentGroup;\n            s._segmentIndexShift = consumedSegments.length;\n            return { segmentGroup: s, slicedSegments: slicedSegments };\n        }\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @param {?} children\n     * @return {?}\n     */\n    function addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, routes, children) {\n        var /** @type {?} */ res = {};\n        for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n            var r = routes_1[_i];\n            if (emptyPathMatch(segmentGroup, slicedSegments, r) && !children[getOutlet$2(r)]) {\n                var /** @type {?} */ s = new UrlSegmentGroup([], {});\n                s._sourceSegment = segmentGroup;\n                s._segmentIndexShift = segmentGroup.segments.length;\n                res[getOutlet$2(r)] = s;\n            }\n        }\n        return merge(children, res);\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} consumedSegments\n     * @param {?} routes\n     * @param {?} primarySegment\n     * @return {?}\n     */\n    function createChildrenForEmptyPaths(segmentGroup, consumedSegments, routes, primarySegment) {\n        var /** @type {?} */ res = {};\n        res[PRIMARY_OUTLET] = primarySegment;\n        primarySegment._sourceSegment = segmentGroup;\n        primarySegment._segmentIndexShift = consumedSegments.length;\n        for (var _i = 0, routes_2 = routes; _i < routes_2.length; _i++) {\n            var r = routes_2[_i];\n            if (r.path === '' && getOutlet$2(r) !== PRIMARY_OUTLET) {\n                var /** @type {?} */ s = new UrlSegmentGroup([], {});\n                s._sourceSegment = segmentGroup;\n                s._segmentIndexShift = consumedSegments.length;\n                res[getOutlet$2(r)] = s;\n            }\n        }\n        return res;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @return {?}\n     */\n    function containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, routes) {\n        return routes\n            .filter(function (r) { return emptyPathMatch(segmentGroup, slicedSegments, r) &&\n            getOutlet$2(r) !== PRIMARY_OUTLET; })\n            .length > 0;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} routes\n     * @return {?}\n     */\n    function containsEmptyPathMatches(segmentGroup, slicedSegments, routes) {\n        return routes.filter(function (r) { return emptyPathMatch(segmentGroup, slicedSegments, r); }).length > 0;\n    }\n    /**\n     * @param {?} segmentGroup\n     * @param {?} slicedSegments\n     * @param {?} r\n     * @return {?}\n     */\n    function emptyPathMatch(segmentGroup, slicedSegments, r) {\n        if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === 'full')\n            return false;\n        return r.path === '' && r.redirectTo === undefined;\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function getOutlet$2(route) {\n        return route.outlet ? route.outlet : PRIMARY_OUTLET;\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function getData(route) {\n        return route.data ? route.data : {};\n    }\n    /**\n     * @param {?} route\n     * @return {?}\n     */\n    function getResolve(route) {\n        return route.resolve ? route.resolve : {};\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * \\@whatItDoes Contains all the router outlets created in a component.\n     *\n     * \\@stable\n     */\n    var RouterOutletMap = (function () {\n        function RouterOutletMap() {\n            /** @internal */\n            this._outlets = {};\n        }\n        /**\n         * Adds an outlet to this map.\n         * @param {?} name\n         * @param {?} outlet\n         * @return {?}\n         */\n        RouterOutletMap.prototype.registerOutlet = function (name, outlet) { this._outlets[name] = outlet; };\n        /**\n         * Removes an outlet from this map.\n         * @param {?} name\n         * @return {?}\n         */\n        RouterOutletMap.prototype.removeOutlet = function (name) { this._outlets[name] = undefined; };\n        return RouterOutletMap;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * \\@whatItDoes Provides a way to migrate Angular 1 applications to Angular 2.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var UrlHandlingStrategy = (function () {\n        function UrlHandlingStrategy() {\n        }\n        /**\n         * Tells the router if this URL should be processed.\n         *\n         * When it returns true, the router will execute the regular navigation.\n         * When it returns false, the router will set the router state to an empty state.\n         * As a result, all the active components will be destroyed.\n         *\n         * @abstract\n         * @param {?} url\n         * @return {?}\n         */\n        UrlHandlingStrategy.prototype.shouldProcessUrl = function (url) { };\n        /**\n         * Extracts the part of the URL that should be handled by the router.\n         * The rest of the URL will remain untouched.\n         * @abstract\n         * @param {?} url\n         * @return {?}\n         */\n        UrlHandlingStrategy.prototype.extract = function (url) { };\n        /**\n         * Merges the URL fragment with the rest of the URL.\n         * @abstract\n         * @param {?} newUrlPart\n         * @param {?} rawUrl\n         * @return {?}\n         */\n        UrlHandlingStrategy.prototype.merge = function (newUrlPart, rawUrl) { };\n        return UrlHandlingStrategy;\n    }());\n    /**\n     * \\@experimental\n     */\n    var DefaultUrlHandlingStrategy = (function () {\n        function DefaultUrlHandlingStrategy() {\n        }\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        DefaultUrlHandlingStrategy.prototype.shouldProcessUrl = function (url) { return true; };\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        DefaultUrlHandlingStrategy.prototype.extract = function (url) { return url; };\n        /**\n         * @param {?} newUrlPart\n         * @param {?} wholeUrl\n         * @return {?}\n         */\n        DefaultUrlHandlingStrategy.prototype.merge = function (newUrlPart, wholeUrl) { return newUrlPart; };\n        return DefaultUrlHandlingStrategy;\n    }());\n\n    /**\n     * \\@whatItDoes Represents an event triggered when a navigation starts.\n     *\n     * \\@stable\n     */\n    var NavigationStart = (function () {\n        /**\n         * @param {?} id\n         * @param {?} url\n         */\n        function NavigationStart(id, url) {\n            this.id = id;\n            this.url = url;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        NavigationStart.prototype.toString = function () { return \"NavigationStart(id: \" + this.id + \", url: '\" + this.url + \"')\"; };\n        return NavigationStart;\n    }());\n    /**\n     * \\@whatItDoes Represents an event triggered when a navigation ends successfully.\n     *\n     * \\@stable\n     */\n    var NavigationEnd = (function () {\n        /**\n         * @param {?} id\n         * @param {?} url\n         * @param {?} urlAfterRedirects\n         */\n        function NavigationEnd(id, url, urlAfterRedirects) {\n            this.id = id;\n            this.url = url;\n            this.urlAfterRedirects = urlAfterRedirects;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        NavigationEnd.prototype.toString = function () {\n            return \"NavigationEnd(id: \" + this.id + \", url: '\" + this.url + \"', urlAfterRedirects: '\" + this.urlAfterRedirects + \"')\";\n        };\n        return NavigationEnd;\n    }());\n    /**\n     * \\@whatItDoes Represents an event triggered when a navigation is canceled.\n     *\n     * \\@stable\n     */\n    var NavigationCancel = (function () {\n        /**\n         * @param {?} id\n         * @param {?} url\n         * @param {?} reason\n         */\n        function NavigationCancel(id, url, reason) {\n            this.id = id;\n            this.url = url;\n            this.reason = reason;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        NavigationCancel.prototype.toString = function () { return \"NavigationCancel(id: \" + this.id + \", url: '\" + this.url + \"')\"; };\n        return NavigationCancel;\n    }());\n    /**\n     * \\@whatItDoes Represents an event triggered when a navigation fails due to an unexpected error.\n     *\n     * \\@stable\n     */\n    var NavigationError = (function () {\n        /**\n         * @param {?} id\n         * @param {?} url\n         * @param {?} error\n         */\n        function NavigationError(id, url, error) {\n            this.id = id;\n            this.url = url;\n            this.error = error;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        NavigationError.prototype.toString = function () {\n            return \"NavigationError(id: \" + this.id + \", url: '\" + this.url + \"', error: \" + this.error + \")\";\n        };\n        return NavigationError;\n    }());\n    /**\n     * \\@whatItDoes Represents an event triggered when routes are recognized.\n     *\n     * \\@stable\n     */\n    var RoutesRecognized = (function () {\n        /**\n         * @param {?} id\n         * @param {?} url\n         * @param {?} urlAfterRedirects\n         * @param {?} state\n         */\n        function RoutesRecognized(id, url, urlAfterRedirects, state) {\n            this.id = id;\n            this.url = url;\n            this.urlAfterRedirects = urlAfterRedirects;\n            this.state = state;\n        }\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        RoutesRecognized.prototype.toString = function () {\n            return \"RoutesRecognized(id: \" + this.id + \", url: '\" + this.url + \"', urlAfterRedirects: '\" + this.urlAfterRedirects + \"', state: \" + this.state + \")\";\n        };\n        return RoutesRecognized;\n    }());\n    /**\n     * @param {?} error\n     * @return {?}\n     */\n    function defaultErrorHandler(error) {\n        throw error;\n    }\n    /**\n     * \\@internal\n     * @param {?} snapshot\n     * @return {?}\n     */\n    function defaultRouterHook(snapshot) {\n        return rxjs_observable_of.of(null);\n    }\n    /**\n     * Does not detach any subtrees. Reuses routes as long as their route config is the same.\n     */\n    var DefaultRouteReuseStrategy = (function () {\n        function DefaultRouteReuseStrategy() {\n        }\n        /**\n         * @param {?} route\n         * @return {?}\n         */\n        DefaultRouteReuseStrategy.prototype.shouldDetach = function (route) { return false; };\n        /**\n         * @param {?} route\n         * @param {?} detachedTree\n         * @return {?}\n         */\n        DefaultRouteReuseStrategy.prototype.store = function (route, detachedTree) { };\n        /**\n         * @param {?} route\n         * @return {?}\n         */\n        DefaultRouteReuseStrategy.prototype.shouldAttach = function (route) { return false; };\n        /**\n         * @param {?} route\n         * @return {?}\n         */\n        DefaultRouteReuseStrategy.prototype.retrieve = function (route) { return null; };\n        /**\n         * @param {?} future\n         * @param {?} curr\n         * @return {?}\n         */\n        DefaultRouteReuseStrategy.prototype.shouldReuseRoute = function (future, curr) {\n            return future.routeConfig === curr.routeConfig;\n        };\n        return DefaultRouteReuseStrategy;\n    }());\n    /**\n     * \\@whatItDoes Provides the navigation and url manipulation capabilities.\n     *\n     * See {\\@link Routes} for more details and examples.\n     *\n     * \\@ngModule RouterModule\n     *\n     * \\@stable\n     */\n    var Router = (function () {\n        /**\n         * @param {?} rootComponentType\n         * @param {?} urlSerializer\n         * @param {?} outletMap\n         * @param {?} location\n         * @param {?} injector\n         * @param {?} loader\n         * @param {?} compiler\n         * @param {?} config\n         */\n        function Router(rootComponentType, urlSerializer, outletMap, location, injector, loader, compiler, config) {\n            this.rootComponentType = rootComponentType;\n            this.urlSerializer = urlSerializer;\n            this.outletMap = outletMap;\n            this.location = location;\n            this.injector = injector;\n            this.config = config;\n            this.navigations = new rxjs_BehaviorSubject.BehaviorSubject(null);\n            this.routerEvents = new rxjs_Subject.Subject();\n            this.navigationId = 0;\n            /**\n             * Error handler that is invoked when a navigation errors.\n             *\n             * See {@link ErrorHandler} for more information.\n             */\n            this.errorHandler = defaultErrorHandler;\n            /**\n             * Indicates if at least one navigation happened.\n             */\n            this.navigated = false;\n            /**\n             * Used by RouterModule. This allows us to\n             * pause the navigation either before preactivation or after it.\n             * @internal\n             */\n            this.hooks = {\n                beforePreactivation: defaultRouterHook,\n                afterPreactivation: defaultRouterHook\n            };\n            /**\n             * Extracts and merges URLs. Used for Angular 1 to Angular 2 migrations.\n             */\n            this.urlHandlingStrategy = new DefaultUrlHandlingStrategy();\n            this.routeReuseStrategy = new DefaultRouteReuseStrategy();\n            this.resetConfig(config);\n            this.currentUrlTree = createEmptyUrlTree();\n            this.rawUrlTree = this.currentUrlTree;\n            this.configLoader = new RouterConfigLoader(loader, compiler);\n            this.currentRouterState = createEmptyState(this.currentUrlTree, this.rootComponentType);\n            this.processNavigations();\n        }\n        /**\n         * \\@internal\n         * TODO: this should be removed once the constructor of the router made internal\n         * @param {?} rootComponentType\n         * @return {?}\n         */\n        Router.prototype.resetRootComponentType = function (rootComponentType) {\n            this.rootComponentType = rootComponentType;\n            // TODO: vsavkin router 4.0 should make the root component set to null\n            // this will simplify the lifecycle of the router.\n            this.currentRouterState.root.component = this.rootComponentType;\n        };\n        /**\n         * Sets up the location change listener and performs the initial navigation.\n         * @return {?}\n         */\n        Router.prototype.initialNavigation = function () {\n            this.setUpLocationChangeListener();\n            if (this.navigationId === 0) {\n                this.navigateByUrl(this.location.path(true), { replaceUrl: true });\n            }\n        };\n        /**\n         * Sets up the location change listener.\n         * @return {?}\n         */\n        Router.prototype.setUpLocationChangeListener = function () {\n            var _this = this;\n            // Zone.current.wrap is needed because of the issue with RxJS scheduler,\n            // which does not work properly with zone.js in IE and Safari\n            if (!this.locationSubscription) {\n                this.locationSubscription = (this.location.subscribe(Zone.current.wrap(function (change) {\n                    var /** @type {?} */ rawUrlTree = _this.urlSerializer.parse(change['url']);\n                    var /** @type {?} */ source = change['type'] === 'popstate' ? 'popstate' : 'hashchange';\n                    setTimeout(function () { _this.scheduleNavigation(rawUrlTree, source, { replaceUrl: true }); }, 0);\n                })));\n            }\n        };\n        Object.defineProperty(Router.prototype, \"routerState\", {\n            /**\n             * The current route state\n             * @return {?}\n             */\n            get: function () { return this.currentRouterState; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(Router.prototype, \"url\", {\n            /**\n             * The current url\n             * @return {?}\n             */\n            get: function () { return this.serializeUrl(this.currentUrlTree); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(Router.prototype, \"events\", {\n            /**\n             * An observable of router events\n             * @return {?}\n             */\n            get: function () { return this.routerEvents; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * Resets the configuration used for navigation and generating links.\n         *\n         * ### Usage\n         *\n         * ```\n         * router.resetConfig([\n         *  { path: 'team/:id', component: TeamCmp, children: [\n         *    { path: 'simple', component: SimpleCmp },\n         *    { path: 'user/:name', component: UserCmp }\n         *  ]}\n         * ]);\n         * ```\n         * @param {?} config\n         * @return {?}\n         */\n        Router.prototype.resetConfig = function (config) {\n            validateConfig(config);\n            this.config = config;\n        };\n        /**\n         * \\@docsNotRequired\n         * @return {?}\n         */\n        Router.prototype.ngOnDestroy = function () { this.dispose(); };\n        /**\n         * Disposes of the router\n         * @return {?}\n         */\n        Router.prototype.dispose = function () {\n            if (this.locationSubscription) {\n                this.locationSubscription.unsubscribe();\n                this.locationSubscription = null;\n            }\n        };\n        /**\n         * Applies an array of commands to the current url tree and creates a new url tree.\n         *\n         * When given an activate route, applies the given commands starting from the route.\n         * When not given a route, applies the given command starting from the root.\n         *\n         * ### Usage\n         *\n         * ```\n         * // create /team/33/user/11\n         * router.createUrlTree(['/team', 33, 'user', 11]);\n         *\n         * // create /team/33;expand=true/user/11\n         * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n         *\n         * // you can collapse static segments like this (this works only with the first passed-in value):\n         * router.createUrlTree(['/team/33/user', userId]);\n         *\n         * // If the first segment can contain slashes, and you do not want the router to split it, you\n         * // can do the following:\n         *\n         * router.createUrlTree([{segmentPath: '/one/two'}]);\n         *\n         * // create /team/33/(user/11//right:chat)\n         * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: 'chat'}}]);\n         *\n         * // remove the right secondary node\n         * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: null}}]);\n         *\n         * // assuming the current url is `/team/33/user/11` and the route points to `user/11`\n         *\n         * // navigate to /team/33/user/11/details\n         * router.createUrlTree(['details'], {relativeTo: route});\n         *\n         * // navigate to /team/33/user/22\n         * router.createUrlTree(['../22'], {relativeTo: route});\n         *\n         * // navigate to /team/44/user/22\n         * router.createUrlTree(['../../team/44/user/22'], {relativeTo: route});\n         * ```\n         * @param {?} commands\n         * @param {?=} __1\n         * @return {?}\n         */\n        Router.prototype.createUrlTree = function (commands, _a) {\n            var _b = _a === void 0 ? {} : _a, relativeTo = _b.relativeTo, queryParams = _b.queryParams, fragment = _b.fragment, preserveQueryParams = _b.preserveQueryParams, preserveFragment = _b.preserveFragment;\n            var /** @type {?} */ a = relativeTo || this.routerState.root;\n            var /** @type {?} */ q = preserveQueryParams ? this.currentUrlTree.queryParams : queryParams;\n            var /** @type {?} */ f = preserveFragment ? this.currentUrlTree.fragment : fragment;\n            return createUrlTree(a, this.currentUrlTree, commands, q, f);\n        };\n        /**\n         * Navigate based on the provided url. This navigation is always absolute.\n         *\n         * Returns a promise that:\n         * - resolves to 'true' when navigation succeeds,\n         * - resolves to 'false' when navigation fails,\n         * - is rejected when an error happens.\n         *\n         * ### Usage\n         *\n         * ```\n         * router.navigateByUrl(\"/team/33/user/11\");\n         *\n         * // Navigate without updating the URL\n         * router.navigateByUrl(\"/team/33/user/11\", { skipLocationChange: true });\n         * ```\n         *\n         * In opposite to `navigate`, `navigateByUrl` takes a whole URL\n         * and does not apply any delta to the current one.\n         * @param {?} url\n         * @param {?=} extras\n         * @return {?}\n         */\n        Router.prototype.navigateByUrl = function (url, extras) {\n            if (extras === void 0) { extras = { skipLocationChange: false }; }\n            if (url instanceof UrlTree) {\n                return this.scheduleNavigation(this.urlHandlingStrategy.merge(url, this.rawUrlTree), 'imperative', extras);\n            }\n            var /** @type {?} */ urlTree = this.urlSerializer.parse(url);\n            return this.scheduleNavigation(this.urlHandlingStrategy.merge(urlTree, this.rawUrlTree), 'imperative', extras);\n        };\n        /**\n         * Navigate based on the provided array of commands and a starting point.\n         * If no starting route is provided, the navigation is absolute.\n         *\n         * Returns a promise that:\n         * - resolves to 'true' when navigation succeeds,\n         * - resolves to 'false' when navigation fails,\n         * - is rejected when an error happens.\n         *\n         * ### Usage\n         *\n         * ```\n         * router.navigate(['team', 33, 'user', 11], {relativeTo: route});\n         *\n         * // Navigate without updating the URL\n         * router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});\n         * ```\n         *\n         * In opposite to `navigateByUrl`, `navigate` always takes a delta that is applied to the current\n         * URL.\n         * @param {?} commands\n         * @param {?=} extras\n         * @return {?}\n         */\n        Router.prototype.navigate = function (commands, extras) {\n            if (extras === void 0) { extras = { skipLocationChange: false }; }\n            validateCommands(commands);\n            if (typeof extras.queryParams === 'object' && extras.queryParams !== null) {\n                extras.queryParams = this.removeEmptyProps(extras.queryParams);\n            }\n            return this.navigateByUrl(this.createUrlTree(commands, extras), extras);\n        };\n        /**\n         * Serializes a {\\@link UrlTree} into a string\n         * @param {?} url\n         * @return {?}\n         */\n        Router.prototype.serializeUrl = function (url) { return this.urlSerializer.serialize(url); };\n        /**\n         * Parses a string into a {\\@link UrlTree}\n         * @param {?} url\n         * @return {?}\n         */\n        Router.prototype.parseUrl = function (url) { return this.urlSerializer.parse(url); };\n        /**\n         * Returns whether the url is activated\n         * @param {?} url\n         * @param {?} exact\n         * @return {?}\n         */\n        Router.prototype.isActive = function (url, exact) {\n            if (url instanceof UrlTree) {\n                return containsTree(this.currentUrlTree, url, exact);\n            }\n            else {\n                var /** @type {?} */ urlTree = this.urlSerializer.parse(url);\n                return containsTree(this.currentUrlTree, urlTree, exact);\n            }\n        };\n        /**\n         * @param {?} params\n         * @return {?}\n         */\n        Router.prototype.removeEmptyProps = function (params) {\n            return Object.keys(params).reduce(function (result, key) {\n                var /** @type {?} */ value = params[key];\n                if (value !== null && value !== undefined) {\n                    result[key] = value;\n                }\n                return result;\n            }, {});\n        };\n        /**\n         * @return {?}\n         */\n        Router.prototype.processNavigations = function () {\n            var _this = this;\n            rxjs_operator_concatMap.concatMap\n                .call(this.navigations, function (nav) {\n                if (nav) {\n                    _this.executeScheduledNavigation(nav);\n                    // a failed navigation should not stop the router from processing\n                    // further navigations => the catch\n                    return nav.promise.catch(function () { });\n                }\n                else {\n                    return (rxjs_observable_of.of(null));\n                }\n            })\n                .subscribe(function () { });\n        };\n        /**\n         * @param {?} rawUrl\n         * @param {?} source\n         * @param {?} extras\n         * @return {?}\n         */\n        Router.prototype.scheduleNavigation = function (rawUrl, source, extras) {\n            var /** @type {?} */ lastNavigation = this.navigations.value;\n            // If the user triggers a navigation imperatively (e.g., by using navigateByUrl),\n            // and that navigation results in 'replaceState' that leads to the same URL,\n            // we should skip those.\n            if (lastNavigation && source !== 'imperative' && lastNavigation.source === 'imperative' &&\n                lastNavigation.rawUrl.toString() === rawUrl.toString()) {\n                return null; // return value is not used\n            }\n            // Because of a bug in IE and Edge, the location class fires two events (popstate and\n            // hashchange)\n            // every single time. The second one should be ignored. Otherwise, the URL will flicker.\n            if (lastNavigation && source == 'hashchange' && lastNavigation.source === 'popstate' &&\n                lastNavigation.rawUrl.toString() === rawUrl.toString()) {\n                return null; // return value is not used\n            }\n            var /** @type {?} */ resolve = null;\n            var /** @type {?} */ reject = null;\n            var /** @type {?} */ promise = new Promise(function (res, rej) {\n                resolve = res;\n                reject = rej;\n            });\n            var /** @type {?} */ id = ++this.navigationId;\n            this.navigations.next({ id: id, source: source, rawUrl: rawUrl, extras: extras, resolve: resolve, reject: reject, promise: promise });\n            // Make sure that the error is propagated even though `processNavigations` catch\n            // handler does not rethrow\n            return promise.catch(function (e) { return Promise.reject(e); });\n        };\n        /**\n         * @param {?} __0\n         * @return {?}\n         */\n        Router.prototype.executeScheduledNavigation = function (_a) {\n            var _this = this;\n            var id = _a.id, rawUrl = _a.rawUrl, extras = _a.extras, resolve = _a.resolve, reject = _a.reject;\n            var /** @type {?} */ url = this.urlHandlingStrategy.extract(rawUrl);\n            var /** @type {?} */ urlTransition = !this.navigated || url.toString() !== this.currentUrlTree.toString();\n            if (urlTransition && this.urlHandlingStrategy.shouldProcessUrl(rawUrl)) {\n                this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));\n                Promise.resolve()\n                    .then(function (_) { return _this.runNavigate(url, rawUrl, extras.skipLocationChange, extras.replaceUrl, id, null); })\n                    .then(resolve, reject);\n            }\n            else if (urlTransition && this.rawUrlTree &&\n                this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)) {\n                this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));\n                Promise.resolve()\n                    .then(function (_) { return _this.runNavigate(url, rawUrl, false, false, id, createEmptyState(url, _this.rootComponentType).snapshot); })\n                    .then(resolve, reject);\n            }\n            else {\n                this.rawUrlTree = rawUrl;\n                resolve(null);\n            }\n        };\n        /**\n         * @param {?} url\n         * @param {?} rawUrl\n         * @param {?} shouldPreventPushState\n         * @param {?} shouldReplaceUrl\n         * @param {?} id\n         * @param {?} precreatedState\n         * @return {?}\n         */\n        Router.prototype.runNavigate = function (url, rawUrl, shouldPreventPushState, shouldReplaceUrl, id, precreatedState) {\n            var _this = this;\n            if (id !== this.navigationId) {\n                this.location.go(this.urlSerializer.serialize(this.currentUrlTree));\n                this.routerEvents.next(new NavigationCancel(id, this.serializeUrl(url), \"Navigation ID \" + id + \" is not equal to the current navigation id \" + this.navigationId));\n                return Promise.resolve(false);\n            }\n            return new Promise(function (resolvePromise, rejectPromise) {\n                // create an observable of the url and route state snapshot\n                // this operation do not result in any side effects\n                var /** @type {?} */ urlAndSnapshot$;\n                if (!precreatedState) {\n                    var /** @type {?} */ redirectsApplied$ = applyRedirects(_this.injector, _this.configLoader, _this.urlSerializer, url, _this.config);\n                    urlAndSnapshot$ = rxjs_operator_mergeMap.mergeMap.call(redirectsApplied$, function (appliedUrl) {\n                        return rxjs_operator_map.map.call(recognize(_this.rootComponentType, _this.config, appliedUrl, _this.serializeUrl(appliedUrl)), function (snapshot) {\n                            _this.routerEvents.next(new RoutesRecognized(id, _this.serializeUrl(url), _this.serializeUrl(appliedUrl), snapshot));\n                            return { appliedUrl: appliedUrl, snapshot: snapshot };\n                        });\n                    });\n                }\n                else {\n                    urlAndSnapshot$ = rxjs_observable_of.of({ appliedUrl: url, snapshot: precreatedState });\n                }\n                var /** @type {?} */ beforePreactivationDone$ = rxjs_operator_mergeMap.mergeMap.call(urlAndSnapshot$, function (p) {\n                    return rxjs_operator_map.map.call(_this.hooks.beforePreactivation(p.snapshot), function () { return p; });\n                });\n                // run preactivation: guards and data resolvers\n                var /** @type {?} */ preActivation;\n                var /** @type {?} */ preactivationTraverse$ = rxjs_operator_map.map.call(beforePreactivationDone$, function (_a) {\n                    var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot;\n                    preActivation =\n                        new PreActivation(snapshot, _this.currentRouterState.snapshot, _this.injector);\n                    preActivation.traverse(_this.outletMap);\n                    return { appliedUrl: appliedUrl, snapshot: snapshot };\n                });\n                var /** @type {?} */ preactivationCheckGuards$ = rxjs_operator_mergeMap.mergeMap.call(preactivationTraverse$, function (_a) {\n                    var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot;\n                    if (_this.navigationId !== id)\n                        return rxjs_observable_of.of(false);\n                    return rxjs_operator_map.map.call(preActivation.checkGuards(), function (shouldActivate) {\n                        return { appliedUrl: appliedUrl, snapshot: snapshot, shouldActivate: shouldActivate };\n                    });\n                });\n                var /** @type {?} */ preactivationResolveData$ = rxjs_operator_mergeMap.mergeMap.call(preactivationCheckGuards$, function (p) {\n                    if (_this.navigationId !== id)\n                        return rxjs_observable_of.of(false);\n                    if (p.shouldActivate) {\n                        return rxjs_operator_map.map.call(preActivation.resolveData(), function () { return p; });\n                    }\n                    else {\n                        return rxjs_observable_of.of(p);\n                    }\n                });\n                var /** @type {?} */ preactivationDone$ = rxjs_operator_mergeMap.mergeMap.call(preactivationResolveData$, function (p) {\n                    return rxjs_operator_map.map.call(_this.hooks.afterPreactivation(p.snapshot), function () { return p; });\n                });\n                // create router state\n                // this operation has side effects => route state is being affected\n                var /** @type {?} */ routerState$ = rxjs_operator_map.map.call(preactivationDone$, function (_a) {\n                    var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot, shouldActivate = _a.shouldActivate;\n                    if (shouldActivate) {\n                        var /** @type {?} */ state = createRouterState(_this.routeReuseStrategy, snapshot, _this.currentRouterState);\n                        return { appliedUrl: appliedUrl, state: state, shouldActivate: shouldActivate };\n                    }\n                    else {\n                        return { appliedUrl: appliedUrl, state: null, shouldActivate: shouldActivate };\n                    }\n                });\n                // applied the new router state\n                // this operation has side effects\n                var /** @type {?} */ navigationIsSuccessful;\n                var /** @type {?} */ storedState = _this.currentRouterState;\n                var /** @type {?} */ storedUrl = _this.currentUrlTree;\n                routerState$\n                    .forEach(function (_a) {\n                    var appliedUrl = _a.appliedUrl, state = _a.state, shouldActivate = _a.shouldActivate;\n                    if (!shouldActivate || id !== _this.navigationId) {\n                        navigationIsSuccessful = false;\n                        return;\n                    }\n                    _this.currentUrlTree = appliedUrl;\n                    _this.rawUrlTree = _this.urlHandlingStrategy.merge(_this.currentUrlTree, rawUrl);\n                    _this.currentRouterState = state;\n                    if (!shouldPreventPushState) {\n                        var /** @type {?} */ path = _this.urlSerializer.serialize(_this.rawUrlTree);\n                        if (_this.location.isCurrentPathEqualTo(path) || shouldReplaceUrl) {\n                            _this.location.replaceState(path);\n                        }\n                        else {\n                            _this.location.go(path);\n                        }\n                    }\n                    new ActivateRoutes(_this.routeReuseStrategy, state, storedState)\n                        .activate(_this.outletMap);\n                    navigationIsSuccessful = true;\n                })\n                    .then(function () {\n                    if (navigationIsSuccessful) {\n                        _this.navigated = true;\n                        _this.routerEvents.next(new NavigationEnd(id, _this.serializeUrl(url), _this.serializeUrl(_this.currentUrlTree)));\n                        resolvePromise(true);\n                    }\n                    else {\n                        _this.resetUrlToCurrentUrlTree();\n                        _this.routerEvents.next(new NavigationCancel(id, _this.serializeUrl(url), ''));\n                        resolvePromise(false);\n                    }\n                }, function (e) {\n                    if (e instanceof NavigationCancelingError) {\n                        _this.resetUrlToCurrentUrlTree();\n                        _this.navigated = true;\n                        _this.routerEvents.next(new NavigationCancel(id, _this.serializeUrl(url), e.message));\n                        resolvePromise(false);\n                    }\n                    else {\n                        _this.routerEvents.next(new NavigationError(id, _this.serializeUrl(url), e));\n                        try {\n                            resolvePromise(_this.errorHandler(e));\n                        }\n                        catch (ee) {\n                            rejectPromise(ee);\n                        }\n                    }\n                    _this.currentRouterState = storedState;\n                    _this.currentUrlTree = storedUrl;\n                    _this.rawUrlTree = _this.urlHandlingStrategy.merge(_this.currentUrlTree, rawUrl);\n                    _this.location.replaceState(_this.serializeUrl(_this.rawUrlTree));\n                });\n            });\n        };\n        /**\n         * @return {?}\n         */\n        Router.prototype.resetUrlToCurrentUrlTree = function () {\n            var /** @type {?} */ path = this.urlSerializer.serialize(this.rawUrlTree);\n            this.location.replaceState(path);\n        };\n        return Router;\n    }());\n    var CanActivate = (function () {\n        /**\n         * @param {?} path\n         */\n        function CanActivate(path) {\n            this.path = path;\n        }\n        Object.defineProperty(CanActivate.prototype, \"route\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.path[this.path.length - 1]; },\n            enumerable: true,\n            configurable: true\n        });\n        return CanActivate;\n    }());\n    var CanDeactivate = (function () {\n        /**\n         * @param {?} component\n         * @param {?} route\n         */\n        function CanDeactivate(component, route) {\n            this.component = component;\n            this.route = route;\n        }\n        return CanDeactivate;\n    }());\n    var PreActivation = (function () {\n        /**\n         * @param {?} future\n         * @param {?} curr\n         * @param {?} injector\n         */\n        function PreActivation(future, curr, injector) {\n            this.future = future;\n            this.curr = curr;\n            this.injector = injector;\n            this.checks = [];\n        }\n        /**\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        PreActivation.prototype.traverse = function (parentOutletMap) {\n            var /** @type {?} */ futureRoot = this.future._root;\n            var /** @type {?} */ currRoot = this.curr ? this.curr._root : null;\n            this.traverseChildRoutes(futureRoot, currRoot, parentOutletMap, [futureRoot.value]);\n        };\n        /**\n         * @return {?}\n         */\n        PreActivation.prototype.checkGuards = function () {\n            var _this = this;\n            if (this.checks.length === 0)\n                return rxjs_observable_of.of(true);\n            var /** @type {?} */ checks$ = rxjs_observable_from.from(this.checks);\n            var /** @type {?} */ runningChecks$ = rxjs_operator_mergeMap.mergeMap.call(checks$, function (s) {\n                if (s instanceof CanActivate) {\n                    return andObservables(rxjs_observable_from.from([_this.runCanActivateChild(s.path), _this.runCanActivate(s.route)]));\n                }\n                else if (s instanceof CanDeactivate) {\n                    // workaround https://github.com/Microsoft/TypeScript/issues/7271\n                    var /** @type {?} */ s2 = (s);\n                    return _this.runCanDeactivate(s2.component, s2.route);\n                }\n                else {\n                    throw new Error('Cannot be reached');\n                }\n            });\n            return rxjs_operator_every.every.call(runningChecks$, function (result) { return result === true; });\n        };\n        /**\n         * @return {?}\n         */\n        PreActivation.prototype.resolveData = function () {\n            var _this = this;\n            if (this.checks.length === 0)\n                return rxjs_observable_of.of(null);\n            var /** @type {?} */ checks$ = rxjs_observable_from.from(this.checks);\n            var /** @type {?} */ runningChecks$ = rxjs_operator_concatMap.concatMap.call(checks$, function (s) {\n                if (s instanceof CanActivate) {\n                    return _this.runResolve(s.route);\n                }\n                else {\n                    return rxjs_observable_of.of(null);\n                }\n            });\n            return rxjs_operator_reduce.reduce.call(runningChecks$, function (_, __) { return _; });\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} outletMap\n         * @param {?} futurePath\n         * @return {?}\n         */\n        PreActivation.prototype.traverseChildRoutes = function (futureNode, currNode, outletMap, futurePath) {\n            var _this = this;\n            var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n            futureNode.children.forEach(function (c) {\n                _this.traverseRoutes(c, prevChildren[c.value.outlet], outletMap, futurePath.concat([c.value]));\n                delete prevChildren[c.value.outlet];\n            });\n            forEach(prevChildren, function (v, k) { return _this.deactiveRouteAndItsChildren(v, outletMap._outlets[k]); });\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} parentOutletMap\n         * @param {?} futurePath\n         * @return {?}\n         */\n        PreActivation.prototype.traverseRoutes = function (futureNode, currNode, parentOutletMap, futurePath) {\n            var /** @type {?} */ future = futureNode.value;\n            var /** @type {?} */ curr = currNode ? currNode.value : null;\n            var /** @type {?} */ outlet = parentOutletMap ? parentOutletMap._outlets[futureNode.value.outlet] : null;\n            // reusing the node\n            if (curr && future._routeConfig === curr._routeConfig) {\n                if (!equalParamsAndUrlSegments(future, curr)) {\n                    this.checks.push(new CanDeactivate(outlet.component, curr), new CanActivate(futurePath));\n                }\n                else {\n                    // we need to set the data\n                    future.data = curr.data;\n                    future._resolvedData = curr._resolvedData;\n                }\n                // If we have a component, we need to go through an outlet.\n                if (future.component) {\n                    this.traverseChildRoutes(futureNode, currNode, outlet ? outlet.outletMap : null, futurePath);\n                }\n                else {\n                    this.traverseChildRoutes(futureNode, currNode, parentOutletMap, futurePath);\n                }\n            }\n            else {\n                if (curr) {\n                    this.deactiveRouteAndItsChildren(currNode, outlet);\n                }\n                this.checks.push(new CanActivate(futurePath));\n                // If we have a component, we need to go through an outlet.\n                if (future.component) {\n                    this.traverseChildRoutes(futureNode, null, outlet ? outlet.outletMap : null, futurePath);\n                }\n                else {\n                    this.traverseChildRoutes(futureNode, null, parentOutletMap, futurePath);\n                }\n            }\n        };\n        /**\n         * @param {?} route\n         * @param {?} outlet\n         * @return {?}\n         */\n        PreActivation.prototype.deactiveRouteAndItsChildren = function (route, outlet) {\n            var _this = this;\n            var /** @type {?} */ prevChildren = nodeChildrenAsMap(route);\n            var /** @type {?} */ r = route.value;\n            forEach(prevChildren, function (v, k) {\n                if (!r.component) {\n                    _this.deactiveRouteAndItsChildren(v, outlet);\n                }\n                else if (!!outlet) {\n                    _this.deactiveRouteAndItsChildren(v, outlet.outletMap._outlets[k]);\n                }\n                else {\n                    _this.deactiveRouteAndItsChildren(v, null);\n                }\n            });\n            if (!r.component) {\n                this.checks.push(new CanDeactivate(null, r));\n            }\n            else if (outlet && outlet.isActivated) {\n                this.checks.push(new CanDeactivate(outlet.component, r));\n            }\n            else {\n                this.checks.push(new CanDeactivate(null, r));\n            }\n        };\n        /**\n         * @param {?} future\n         * @return {?}\n         */\n        PreActivation.prototype.runCanActivate = function (future) {\n            var _this = this;\n            var /** @type {?} */ canActivate = future._routeConfig ? future._routeConfig.canActivate : null;\n            if (!canActivate || canActivate.length === 0)\n                return rxjs_observable_of.of(true);\n            var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(canActivate), function (c) {\n                var /** @type {?} */ guard = _this.getToken(c, future);\n                var /** @type {?} */ observable;\n                if (guard.canActivate) {\n                    observable = wrapIntoObservable(guard.canActivate(future, _this.future));\n                }\n                else {\n                    observable = wrapIntoObservable(guard(future, _this.future));\n                }\n                return rxjs_operator_first.first.call(observable);\n            });\n            return andObservables(obs);\n        };\n        /**\n         * @param {?} path\n         * @return {?}\n         */\n        PreActivation.prototype.runCanActivateChild = function (path) {\n            var _this = this;\n            var /** @type {?} */ future = path[path.length - 1];\n            var /** @type {?} */ canActivateChildGuards = path.slice(0, path.length - 1)\n                .reverse()\n                .map(function (p) { return _this.extractCanActivateChild(p); })\n                .filter(function (_) { return _ !== null; });\n            return andObservables(rxjs_operator_map.map.call(rxjs_observable_from.from(canActivateChildGuards), function (d) {\n                var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(d.guards), function (c) {\n                    var /** @type {?} */ guard = _this.getToken(c, d.node);\n                    var /** @type {?} */ observable;\n                    if (guard.canActivateChild) {\n                        observable = wrapIntoObservable(guard.canActivateChild(future, _this.future));\n                    }\n                    else {\n                        observable = wrapIntoObservable(guard(future, _this.future));\n                    }\n                    return rxjs_operator_first.first.call(observable);\n                });\n                return andObservables(obs);\n            }));\n        };\n        /**\n         * @param {?} p\n         * @return {?}\n         */\n        PreActivation.prototype.extractCanActivateChild = function (p) {\n            var /** @type {?} */ canActivateChild = p._routeConfig ? p._routeConfig.canActivateChild : null;\n            if (!canActivateChild || canActivateChild.length === 0)\n                return null;\n            return { node: p, guards: canActivateChild };\n        };\n        /**\n         * @param {?} component\n         * @param {?} curr\n         * @return {?}\n         */\n        PreActivation.prototype.runCanDeactivate = function (component, curr) {\n            var _this = this;\n            var /** @type {?} */ canDeactivate = curr && curr._routeConfig ? curr._routeConfig.canDeactivate : null;\n            if (!canDeactivate || canDeactivate.length === 0)\n                return rxjs_observable_of.of(true);\n            var /** @type {?} */ canDeactivate$ = rxjs_operator_mergeMap.mergeMap.call(rxjs_observable_from.from(canDeactivate), function (c) {\n                var /** @type {?} */ guard = _this.getToken(c, curr);\n                var /** @type {?} */ observable;\n                if (guard.canDeactivate) {\n                    observable = wrapIntoObservable(guard.canDeactivate(component, curr, _this.curr));\n                }\n                else {\n                    observable = wrapIntoObservable(guard(component, curr, _this.curr));\n                }\n                return rxjs_operator_first.first.call(observable);\n            });\n            return rxjs_operator_every.every.call(canDeactivate$, function (result) { return result === true; });\n        };\n        /**\n         * @param {?} future\n         * @return {?}\n         */\n        PreActivation.prototype.runResolve = function (future) {\n            var /** @type {?} */ resolve = future._resolve;\n            return rxjs_operator_map.map.call(this.resolveNode(resolve, future), function (resolvedData) {\n                future._resolvedData = resolvedData;\n                future.data = merge(future.data, inheritedParamsDataResolve(future).resolve);\n                return null;\n            });\n        };\n        /**\n         * @param {?} resolve\n         * @param {?} future\n         * @return {?}\n         */\n        PreActivation.prototype.resolveNode = function (resolve, future) {\n            var _this = this;\n            return waitForMap(resolve, function (k, v) {\n                var /** @type {?} */ resolver = _this.getToken(v, future);\n                return resolver.resolve ? wrapIntoObservable(resolver.resolve(future, _this.future)) :\n                    wrapIntoObservable(resolver(future, _this.future));\n            });\n        };\n        /**\n         * @param {?} token\n         * @param {?} snapshot\n         * @return {?}\n         */\n        PreActivation.prototype.getToken = function (token, snapshot) {\n            var /** @type {?} */ config = closestLoadedConfig(snapshot);\n            var /** @type {?} */ injector = config ? config.injector : this.injector;\n            return injector.get(token);\n        };\n        return PreActivation;\n    }());\n    var ActivateRoutes = (function () {\n        /**\n         * @param {?} routeReuseStrategy\n         * @param {?} futureState\n         * @param {?} currState\n         */\n        function ActivateRoutes(routeReuseStrategy, futureState, currState) {\n            this.routeReuseStrategy = routeReuseStrategy;\n            this.futureState = futureState;\n            this.currState = currState;\n        }\n        /**\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.activate = function (parentOutletMap) {\n            var /** @type {?} */ futureRoot = this.futureState._root;\n            var /** @type {?} */ currRoot = this.currState ? this.currState._root : null;\n            this.deactivateChildRoutes(futureRoot, currRoot, parentOutletMap);\n            advanceActivatedRoute(this.futureState.root);\n            this.activateChildRoutes(futureRoot, currRoot, parentOutletMap);\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} outletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.deactivateChildRoutes = function (futureNode, currNode, outletMap) {\n            var _this = this;\n            var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n            futureNode.children.forEach(function (c) {\n                _this.deactivateRoutes(c, prevChildren[c.value.outlet], outletMap);\n                delete prevChildren[c.value.outlet];\n            });\n            forEach(prevChildren, function (v, k) { return _this.deactiveRouteAndItsChildren(v, outletMap); });\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} outletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.activateChildRoutes = function (futureNode, currNode, outletMap) {\n            var _this = this;\n            var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n            futureNode.children.forEach(function (c) { _this.activateRoutes(c, prevChildren[c.value.outlet], outletMap); });\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.deactivateRoutes = function (futureNode, currNode, parentOutletMap) {\n            var /** @type {?} */ future = futureNode.value;\n            var /** @type {?} */ curr = currNode ? currNode.value : null;\n            // reusing the node\n            if (future === curr) {\n                // If we have a normal route, we need to go through an outlet.\n                if (future.component) {\n                    var /** @type {?} */ outlet = getOutlet(parentOutletMap, future);\n                    this.deactivateChildRoutes(futureNode, currNode, outlet.outletMap);\n                }\n                else {\n                    this.deactivateChildRoutes(futureNode, currNode, parentOutletMap);\n                }\n            }\n            else {\n                if (curr) {\n                    this.deactiveRouteAndItsChildren(currNode, parentOutletMap);\n                }\n            }\n        };\n        /**\n         * @param {?} futureNode\n         * @param {?} currNode\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.activateRoutes = function (futureNode, currNode, parentOutletMap) {\n            var /** @type {?} */ future = futureNode.value;\n            var /** @type {?} */ curr = currNode ? currNode.value : null;\n            // reusing the node\n            if (future === curr) {\n                // advance the route to push the parameters\n                advanceActivatedRoute(future);\n                // If we have a normal route, we need to go through an outlet.\n                if (future.component) {\n                    var /** @type {?} */ outlet = getOutlet(parentOutletMap, future);\n                    this.activateChildRoutes(futureNode, currNode, outlet.outletMap);\n                }\n                else {\n                    this.activateChildRoutes(futureNode, currNode, parentOutletMap);\n                }\n            }\n            else {\n                // if we have a normal route, we need to advance the route\n                // and place the component into the outlet. After that recurse.\n                if (future.component) {\n                    advanceActivatedRoute(future);\n                    var /** @type {?} */ outlet = getOutlet(parentOutletMap, futureNode.value);\n                    if (this.routeReuseStrategy.shouldAttach(future.snapshot)) {\n                        var /** @type {?} */ stored = ((this.routeReuseStrategy.retrieve(future.snapshot)));\n                        this.routeReuseStrategy.store(future.snapshot, null);\n                        outlet.attach(stored.componentRef, stored.route.value);\n                        advanceActivatedRouteNodeAndItsChildren(stored.route);\n                    }\n                    else {\n                        var /** @type {?} */ outletMap = new RouterOutletMap();\n                        this.placeComponentIntoOutlet(outletMap, future, outlet);\n                        this.activateChildRoutes(futureNode, null, outletMap);\n                    }\n                }\n                else {\n                    advanceActivatedRoute(future);\n                    this.activateChildRoutes(futureNode, null, parentOutletMap);\n                }\n            }\n        };\n        /**\n         * @param {?} outletMap\n         * @param {?} future\n         * @param {?} outlet\n         * @return {?}\n         */\n        ActivateRoutes.prototype.placeComponentIntoOutlet = function (outletMap, future, outlet) {\n            var /** @type {?} */ resolved = ([{ provide: ActivatedRoute, useValue: future }, {\n                    provide: RouterOutletMap,\n                    useValue: outletMap\n                }]);\n            var /** @type {?} */ config = parentLoadedConfig(future.snapshot);\n            var /** @type {?} */ resolver = null;\n            var /** @type {?} */ injector = null;\n            if (config) {\n                injector = config.injectorFactory(outlet.locationInjector);\n                resolver = config.factoryResolver;\n                resolved.push({ provide: _angular_core.ComponentFactoryResolver, useValue: resolver });\n            }\n            else {\n                injector = outlet.locationInjector;\n                resolver = outlet.locationFactoryResolver;\n            }\n            outlet.activate(future, resolver, injector, _angular_core.ReflectiveInjector.resolve(resolved), outletMap);\n        };\n        /**\n         * @param {?} route\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.deactiveRouteAndItsChildren = function (route, parentOutletMap) {\n            if (this.routeReuseStrategy.shouldDetach(route.value.snapshot)) {\n                this.detachAndStoreRouteSubtree(route, parentOutletMap);\n            }\n            else {\n                this.deactiveRouteAndOutlet(route, parentOutletMap);\n            }\n        };\n        /**\n         * @param {?} route\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.detachAndStoreRouteSubtree = function (route, parentOutletMap) {\n            var /** @type {?} */ outlet = getOutlet(parentOutletMap, route.value);\n            var /** @type {?} */ componentRef = outlet.detach();\n            this.routeReuseStrategy.store(route.value.snapshot, { componentRef: componentRef, route: route });\n        };\n        /**\n         * @param {?} route\n         * @param {?} parentOutletMap\n         * @return {?}\n         */\n        ActivateRoutes.prototype.deactiveRouteAndOutlet = function (route, parentOutletMap) {\n            var _this = this;\n            var /** @type {?} */ prevChildren = nodeChildrenAsMap(route);\n            var /** @type {?} */ outlet = null;\n            // getOutlet throws when cannot find the right outlet,\n            // which can happen if an outlet was in an NgIf and was removed\n            try {\n                outlet = getOutlet(parentOutletMap, route.value);\n            }\n            catch (e) {\n                return;\n            }\n            var /** @type {?} */ childOutletMap = outlet.outletMap;\n            forEach(prevChildren, function (v, k) {\n                if (route.value.component) {\n                    _this.deactiveRouteAndItsChildren(v, childOutletMap);\n                }\n                else {\n                    _this.deactiveRouteAndItsChildren(v, parentOutletMap);\n                }\n            });\n            if (outlet && outlet.isActivated) {\n                outlet.deactivate();\n            }\n        };\n        return ActivateRoutes;\n    }());\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function advanceActivatedRouteNodeAndItsChildren(node) {\n        advanceActivatedRoute(node.value);\n        node.children.forEach(advanceActivatedRouteNodeAndItsChildren);\n    }\n    /**\n     * @param {?} snapshot\n     * @return {?}\n     */\n    function parentLoadedConfig(snapshot) {\n        var /** @type {?} */ s = snapshot.parent;\n        while (s) {\n            var /** @type {?} */ c = s._routeConfig;\n            if (c && c._loadedConfig)\n                return c._loadedConfig;\n            if (c && c.component)\n                return null;\n            s = s.parent;\n        }\n        return null;\n    }\n    /**\n     * @param {?} snapshot\n     * @return {?}\n     */\n    function closestLoadedConfig(snapshot) {\n        if (!snapshot)\n            return null;\n        var /** @type {?} */ s = snapshot.parent;\n        while (s) {\n            var /** @type {?} */ c = s._routeConfig;\n            if (c && c._loadedConfig)\n                return c._loadedConfig;\n            s = s.parent;\n        }\n        return null;\n    }\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function nodeChildrenAsMap(node) {\n        return node ? node.children.reduce(function (m, c) {\n            m[c.value.outlet] = c;\n            return m;\n        }, {}) : {};\n    }\n    /**\n     * @param {?} outletMap\n     * @param {?} route\n     * @return {?}\n     */\n    function getOutlet(outletMap, route) {\n        var /** @type {?} */ outlet = outletMap._outlets[route.outlet];\n        if (!outlet) {\n            var /** @type {?} */ componentName = ((route.component)).name;\n            if (route.outlet === PRIMARY_OUTLET) {\n                throw new Error(\"Cannot find primary outlet to load '\" + componentName + \"'\");\n            }\n            else {\n                throw new Error(\"Cannot find the outlet \" + route.outlet + \" to load '\" + componentName + \"'\");\n            }\n        }\n        return outlet;\n    }\n    /**\n     * @param {?} commands\n     * @return {?}\n     */\n    function validateCommands(commands) {\n        for (var /** @type {?} */ i = 0; i < commands.length; i++) {\n            var /** @type {?} */ cmd = commands[i];\n            if (cmd == null) {\n                throw new Error(\"The requested path contains \" + cmd + \" segment at index \" + i);\n            }\n        }\n    }\n\n    /**\n     * \\@whatItDoes Lets you link to specific parts of your app.\n     *\n     * \\@howToUse\n     *\n     * Consider the following route configuration:\n     * `[{ path: 'user/:name', component: UserCmp }]`\n     *\n     * When linking to this `user/:name` route, you can write:\n     * `<a routerLink='/user/bob'>link to user component</a>`\n     *\n     * \\@description\n     *\n     * The RouterLink directives let you link to specific parts of your app.\n     *\n     * When the link is static, you can use the directive as follows:\n     * `<a routerLink=\"/user/bob\">link to user component</a>`\n     *\n     * If you use dynamic values to generate the link, you can pass an array of path\n     * segments, followed by the params for each segment.\n     *\n     * For instance `['/team', teamId, 'user', userName, {details: true}]`\n     * means that we want to generate a link to `/team/11/user/bob;details=true`.\n     *\n     * Multiple static segments can be merged into one\n     * (e.g., `['/team/11/user', userName, {details: true}]`).\n     *\n     * The first segment name can be prepended with `/`, `./`, or `../`:\n     * * If the first segment begins with `/`, the router will look up the route from the root of the\n     *   app.\n     * * If the first segment begins with `./`, or doesn't begin with a slash, the router will\n     *   instead look in the children of the current activated route.\n     * * And if the first segment begins with `../`, the router will go up one level.\n     *\n     * You can set query params and fragment as follows:\n     *\n     * ```\n     * <a [routerLink]=\"['/user/bob']\" [queryParams]=\"{debug: true}\" fragment=\"education\">\n     *   link to user component\n     * </a>\n     * ```\n     * RouterLink will use these to generate this link: `/user/bob#education?debug=true`.\n     *\n     * You can also tell the directive to preserve the current query params and fragment:\n     *\n     * ```\n     * <a [routerLink]=\"['/user/bob']\" preserveQueryParams preserveFragment>\n     *   link to user component\n     * </a>\n     * ```\n     *\n     * The router link directive always treats the provided input as a delta to the current url.\n     *\n     * For instance, if the current url is `/user/(box//aux:team)`.\n     *\n     * Then the following link `<a [routerLink]=\"['/user/jim']\">Jim</a>` will generate the link\n     * `/user/(jim//aux:team)`.\n     *\n     * \\@ngModule RouterModule\n     *\n     * See {\\@link Router.createUrlTree} for more information.\n     *\n     * \\@stable\n     */\n    var RouterLink = (function () {\n        /**\n         * @param {?} router\n         * @param {?} route\n         */\n        function RouterLink(router, route) {\n            this.router = router;\n            this.route = route;\n            this.commands = [];\n        }\n        Object.defineProperty(RouterLink.prototype, \"routerLink\", {\n            /**\n             * @param {?} commands\n             * @return {?}\n             */\n            set: function (commands) {\n                if (commands != null) {\n                    this.commands = Array.isArray(commands) ? commands : [commands];\n                }\n                else {\n                    this.commands = [];\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        RouterLink.prototype.onClick = function () {\n            var /** @type {?} */ extras = {\n                skipLocationChange: attrBoolValue(this.skipLocationChange),\n                replaceUrl: attrBoolValue(this.replaceUrl),\n            };\n            this.router.navigateByUrl(this.urlTree, extras);\n            return true;\n        };\n        Object.defineProperty(RouterLink.prototype, \"urlTree\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this.router.createUrlTree(this.commands, {\n                    relativeTo: this.route,\n                    queryParams: this.queryParams,\n                    fragment: this.fragment,\n                    preserveQueryParams: attrBoolValue(this.preserveQueryParams),\n                    preserveFragment: attrBoolValue(this.preserveFragment),\n                });\n            },\n            enumerable: true,\n            configurable: true\n        });\n        RouterLink.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: ':not(a)[routerLink]' },] },\n        ];\n        /** @nocollapse */\n        RouterLink.ctorParameters = function () { return [\n            { type: Router, },\n            { type: ActivatedRoute, },\n        ]; };\n        RouterLink.propDecorators = {\n            'queryParams': [{ type: _angular_core.Input },],\n            'fragment': [{ type: _angular_core.Input },],\n            'preserveQueryParams': [{ type: _angular_core.Input },],\n            'preserveFragment': [{ type: _angular_core.Input },],\n            'skipLocationChange': [{ type: _angular_core.Input },],\n            'replaceUrl': [{ type: _angular_core.Input },],\n            'routerLink': [{ type: _angular_core.Input },],\n            'onClick': [{ type: _angular_core.HostListener, args: ['click',] },],\n        };\n        return RouterLink;\n    }());\n    /**\n     * \\@whatItDoes Lets you link to specific parts of your app.\n     *\n     * See {\\@link RouterLink} for more information.\n     *\n     * \\@ngModule RouterModule\n     *\n     * \\@stable\n     */\n    var RouterLinkWithHref = (function () {\n        /**\n         * @param {?} router\n         * @param {?} route\n         * @param {?} locationStrategy\n         */\n        function RouterLinkWithHref(router, route, locationStrategy) {\n            var _this = this;\n            this.router = router;\n            this.route = route;\n            this.locationStrategy = locationStrategy;\n            this.commands = [];\n            this.subscription = router.events.subscribe(function (s) {\n                if (s instanceof NavigationEnd) {\n                    _this.updateTargetUrlAndHref();\n                }\n            });\n        }\n        Object.defineProperty(RouterLinkWithHref.prototype, \"routerLink\", {\n            /**\n             * @param {?} commands\n             * @return {?}\n             */\n            set: function (commands) {\n                if (commands != null) {\n                    this.commands = Array.isArray(commands) ? commands : [commands];\n                }\n                else {\n                    this.commands = [];\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        RouterLinkWithHref.prototype.ngOnChanges = function (changes) { this.updateTargetUrlAndHref(); };\n        /**\n         * @return {?}\n         */\n        RouterLinkWithHref.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n        /**\n         * @param {?} button\n         * @param {?} ctrlKey\n         * @param {?} metaKey\n         * @return {?}\n         */\n        RouterLinkWithHref.prototype.onClick = function (button, ctrlKey, metaKey) {\n            if (button !== 0 || ctrlKey || metaKey) {\n                return true;\n            }\n            if (typeof this.target === 'string' && this.target != '_self') {\n                return true;\n            }\n            var /** @type {?} */ extras = {\n                skipLocationChange: attrBoolValue(this.skipLocationChange),\n                replaceUrl: attrBoolValue(this.replaceUrl),\n            };\n            this.router.navigateByUrl(this.urlTree, extras);\n            return false;\n        };\n        /**\n         * @return {?}\n         */\n        RouterLinkWithHref.prototype.updateTargetUrlAndHref = function () {\n            this.href = this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.urlTree));\n        };\n        Object.defineProperty(RouterLinkWithHref.prototype, \"urlTree\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this.router.createUrlTree(this.commands, {\n                    relativeTo: this.route,\n                    queryParams: this.queryParams,\n                    fragment: this.fragment,\n                    preserveQueryParams: attrBoolValue(this.preserveQueryParams),\n                    preserveFragment: attrBoolValue(this.preserveFragment),\n                });\n            },\n            enumerable: true,\n            configurable: true\n        });\n        RouterLinkWithHref.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: 'a[routerLink]' },] },\n        ];\n        /** @nocollapse */\n        RouterLinkWithHref.ctorParameters = function () { return [\n            { type: Router, },\n            { type: ActivatedRoute, },\n            { type: _angular_common.LocationStrategy, },\n        ]; };\n        RouterLinkWithHref.propDecorators = {\n            'target': [{ type: _angular_core.HostBinding, args: ['attr.target',] }, { type: _angular_core.Input },],\n            'queryParams': [{ type: _angular_core.Input },],\n            'fragment': [{ type: _angular_core.Input },],\n            'preserveQueryParams': [{ type: _angular_core.Input },],\n            'preserveFragment': [{ type: _angular_core.Input },],\n            'skipLocationChange': [{ type: _angular_core.Input },],\n            'replaceUrl': [{ type: _angular_core.Input },],\n            'href': [{ type: _angular_core.HostBinding },],\n            'routerLink': [{ type: _angular_core.Input },],\n            'onClick': [{ type: _angular_core.HostListener, args: ['click', ['$event.button', '$event.ctrlKey', '$event.metaKey'],] },],\n        };\n        return RouterLinkWithHref;\n    }());\n    /**\n     * @param {?} s\n     * @return {?}\n     */\n    function attrBoolValue(s) {\n        return s === '' || !!s;\n    }\n\n    /**\n     * \\@whatItDoes Lets you add a CSS class to an element when the link's route becomes active.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\">Bob</a>\n     * ```\n     *\n     * \\@description\n     *\n     * The RouterLinkActive directive lets you add a CSS class to an element when the link's route\n     * becomes active.\n     *\n     * Consider the following example:\n     *\n     * ```\n     * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\">Bob</a>\n     * ```\n     *\n     * When the url is either '/user' or '/user/bob', the active-link class will\n     * be added to the `a` tag. If the url changes, the class will be removed.\n     *\n     * You can set more than one class, as follows:\n     *\n     * ```\n     * <a routerLink=\"/user/bob\" routerLinkActive=\"class1 class2\">Bob</a>\n     * <a routerLink=\"/user/bob\" [routerLinkActive]=\"['class1', 'class2']\">Bob</a>\n     * ```\n     *\n     * You can configure RouterLinkActive by passing `exact: true`. This will add the classes\n     * only when the url matches the link exactly.\n     *\n     * ```\n     * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\" [routerLinkActiveOptions]=\"{exact:\n     * true}\">Bob</a>\n     * ```\n     *\n     * You can assign the RouterLinkActive instance to a template variable and directly check\n     * the `isActive` status.\n     * ```\n     * <a routerLink=\"/user/bob\" routerLinkActive #rla=\"routerLinkActive\">\n     *   Bob {{ rla.isActive ? '(already open)' : ''}}\n     * </a>\n     * ```\n     *\n     * Finally, you can apply the RouterLinkActive directive to an ancestor of a RouterLink.\n     *\n     * ```\n     * <div routerLinkActive=\"active-link\" [routerLinkActiveOptions]=\"{exact: true}\">\n     *   <a routerLink=\"/user/jim\">Jim</a>\n     *   <a routerLink=\"/user/bob\">Bob</a>\n     * </div>\n     * ```\n     *\n     * This will set the active-link class on the div tag if the url is either '/user/jim' or\n     * '/user/bob'.\n     *\n     * \\@ngModule RouterModule\n     *\n     * \\@stable\n     */\n    var RouterLinkActive = (function () {\n        /**\n         * @param {?} router\n         * @param {?} element\n         * @param {?} renderer\n         * @param {?} cdr\n         */\n        function RouterLinkActive(router, element, renderer, cdr) {\n            var _this = this;\n            this.router = router;\n            this.element = element;\n            this.renderer = renderer;\n            this.cdr = cdr;\n            this.classes = [];\n            this.active = false;\n            this.routerLinkActiveOptions = { exact: false };\n            this.subscription = router.events.subscribe(function (s) {\n                if (s instanceof NavigationEnd) {\n                    _this.update();\n                }\n            });\n        }\n        Object.defineProperty(RouterLinkActive.prototype, \"isActive\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.active; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        RouterLinkActive.prototype.ngAfterContentInit = function () {\n            var _this = this;\n            this.links.changes.subscribe(function (_) { return _this.update(); });\n            this.linksWithHrefs.changes.subscribe(function (_) { return _this.update(); });\n            this.update();\n        };\n        Object.defineProperty(RouterLinkActive.prototype, \"routerLinkActive\", {\n            /**\n             * @param {?} data\n             * @return {?}\n             */\n            set: function (data) {\n                var /** @type {?} */ classes = Array.isArray(data) ? data : data.split(' ');\n                this.classes = classes.filter(function (c) { return !!c; });\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        RouterLinkActive.prototype.ngOnChanges = function (changes) { this.update(); };\n        /**\n         * @return {?}\n         */\n        RouterLinkActive.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n        /**\n         * @return {?}\n         */\n        RouterLinkActive.prototype.update = function () {\n            var _this = this;\n            if (!this.links || !this.linksWithHrefs || !this.router.navigated)\n                return;\n            var /** @type {?} */ hasActiveLinks = this.hasActiveLinks();\n            // react only when status has changed to prevent unnecessary dom updates\n            if (this.active !== hasActiveLinks) {\n                this.active = hasActiveLinks;\n                this.classes.forEach(function (c) { return _this.renderer.setElementClass(_this.element.nativeElement, c, hasActiveLinks); });\n                this.cdr.detectChanges();\n            }\n        };\n        /**\n         * @param {?} router\n         * @return {?}\n         */\n        RouterLinkActive.prototype.isLinkActive = function (router) {\n            var _this = this;\n            return function (link) {\n                return router.isActive(link.urlTree, _this.routerLinkActiveOptions.exact);\n            };\n        };\n        /**\n         * @return {?}\n         */\n        RouterLinkActive.prototype.hasActiveLinks = function () {\n            return this.links.some(this.isLinkActive(this.router)) ||\n                this.linksWithHrefs.some(this.isLinkActive(this.router));\n        };\n        RouterLinkActive.decorators = [\n            { type: _angular_core.Directive, args: [{\n                        selector: '[routerLinkActive]',\n                        exportAs: 'routerLinkActive',\n                    },] },\n        ];\n        /** @nocollapse */\n        RouterLinkActive.ctorParameters = function () { return [\n            { type: Router, },\n            { type: _angular_core.ElementRef, },\n            { type: _angular_core.Renderer, },\n            { type: _angular_core.ChangeDetectorRef, },\n        ]; };\n        RouterLinkActive.propDecorators = {\n            'links': [{ type: _angular_core.ContentChildren, args: [RouterLink, { descendants: true },] },],\n            'linksWithHrefs': [{ type: _angular_core.ContentChildren, args: [RouterLinkWithHref, { descendants: true },] },],\n            'routerLinkActiveOptions': [{ type: _angular_core.Input },],\n            'routerLinkActive': [{ type: _angular_core.Input },],\n        };\n        return RouterLinkActive;\n    }());\n\n    /**\n     * \\@whatItDoes Acts as a placeholder that Angular dynamically fills based on the current router\n     * state.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * <router-outlet></router-outlet>\n     * <router-outlet name='left'></router-outlet>\n     * <router-outlet name='right'></router-outlet>\n     * ```\n     *\n     * A router outlet will emit an activate event any time a new component is being instantiated,\n     * and a deactivate event when it is being destroyed.\n     *\n     * ```\n     * <router-outlet\n     *   (activate)='onActivate($event)'\n     *   (deactivate)='onDeactivate($event)'></router-outlet>\n     * ```\n     * \\@ngModule RouterModule\n     *\n     * \\@stable\n     */\n    var RouterOutlet = (function () {\n        /**\n         * @param {?} parentOutletMap\n         * @param {?} location\n         * @param {?} resolver\n         * @param {?} name\n         */\n        function RouterOutlet(parentOutletMap, location, resolver, name) {\n            this.parentOutletMap = parentOutletMap;\n            this.location = location;\n            this.resolver = resolver;\n            this.name = name;\n            this.activateEvents = new _angular_core.EventEmitter();\n            this.deactivateEvents = new _angular_core.EventEmitter();\n            parentOutletMap.registerOutlet(name ? name : PRIMARY_OUTLET, this);\n        }\n        /**\n         * @return {?}\n         */\n        RouterOutlet.prototype.ngOnDestroy = function () { this.parentOutletMap.removeOutlet(this.name ? this.name : PRIMARY_OUTLET); };\n        Object.defineProperty(RouterOutlet.prototype, \"locationInjector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.location.injector; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(RouterOutlet.prototype, \"locationFactoryResolver\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.resolver; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(RouterOutlet.prototype, \"isActivated\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return !!this.activated; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(RouterOutlet.prototype, \"component\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                if (!this.activated)\n                    throw new Error('Outlet is not activated');\n                return this.activated.instance;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(RouterOutlet.prototype, \"activatedRoute\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                if (!this.activated)\n                    throw new Error('Outlet is not activated');\n                return this._activatedRoute;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        RouterOutlet.prototype.detach = function () {\n            if (!this.activated)\n                throw new Error('Outlet is not activated');\n            this.location.detach();\n            var /** @type {?} */ r = this.activated;\n            this.activated = null;\n            this._activatedRoute = null;\n            return r;\n        };\n        /**\n         * @param {?} ref\n         * @param {?} activatedRoute\n         * @return {?}\n         */\n        RouterOutlet.prototype.attach = function (ref, activatedRoute) {\n            this.activated = ref;\n            this._activatedRoute = activatedRoute;\n            this.location.insert(ref.hostView);\n        };\n        /**\n         * @return {?}\n         */\n        RouterOutlet.prototype.deactivate = function () {\n            if (this.activated) {\n                var /** @type {?} */ c = this.component;\n                this.activated.destroy();\n                this.activated = null;\n                this._activatedRoute = null;\n                this.deactivateEvents.emit(c);\n            }\n        };\n        /**\n         * @param {?} activatedRoute\n         * @param {?} resolver\n         * @param {?} injector\n         * @param {?} providers\n         * @param {?} outletMap\n         * @return {?}\n         */\n        RouterOutlet.prototype.activate = function (activatedRoute, resolver, injector, providers, outletMap) {\n            if (this.isActivated) {\n                throw new Error('Cannot activate an already activated outlet');\n            }\n            this.outletMap = outletMap;\n            this._activatedRoute = activatedRoute;\n            var /** @type {?} */ snapshot = activatedRoute._futureSnapshot;\n            var /** @type {?} */ component = (snapshot._routeConfig.component);\n            var /** @type {?} */ factory = resolver.resolveComponentFactory(component);\n            var /** @type {?} */ inj = _angular_core.ReflectiveInjector.fromResolvedProviders(providers, injector);\n            this.activated = this.location.createComponent(factory, this.location.length, inj, []);\n            this.activated.changeDetectorRef.detectChanges();\n            this.activateEvents.emit(this.activated.instance);\n        };\n        RouterOutlet.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: 'router-outlet' },] },\n        ];\n        /** @nocollapse */\n        RouterOutlet.ctorParameters = function () { return [\n            { type: RouterOutletMap, },\n            { type: _angular_core.ViewContainerRef, },\n            { type: _angular_core.ComponentFactoryResolver, },\n            { type: undefined, decorators: [{ type: _angular_core.Attribute, args: ['name',] },] },\n        ]; };\n        RouterOutlet.propDecorators = {\n            'activateEvents': [{ type: _angular_core.Output, args: ['activate',] },],\n            'deactivateEvents': [{ type: _angular_core.Output, args: ['deactivate',] },],\n        };\n        return RouterOutlet;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * \\@whatItDoes Provides a way to customize when activated routes get reused.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var RouteReuseStrategy = (function () {\n        function RouteReuseStrategy() {\n        }\n        /**\n         * Determines if this route (and its subtree) should be detached to be reused later\n         * @abstract\n         * @param {?} route\n         * @return {?}\n         */\n        RouteReuseStrategy.prototype.shouldDetach = function (route) { };\n        /**\n         * Stores the detached route\n         * @abstract\n         * @param {?} route\n         * @param {?} handle\n         * @return {?}\n         */\n        RouteReuseStrategy.prototype.store = function (route, handle) { };\n        /**\n         * Determines if this route (and its subtree) should be reattached\n         * @abstract\n         * @param {?} route\n         * @return {?}\n         */\n        RouteReuseStrategy.prototype.shouldAttach = function (route) { };\n        /**\n         * Retrieves the previously stored route\n         * @abstract\n         * @param {?} route\n         * @return {?}\n         */\n        RouteReuseStrategy.prototype.retrieve = function (route) { };\n        /**\n         * Determines if a route should be reused\n         * @abstract\n         * @param {?} future\n         * @param {?} curr\n         * @return {?}\n         */\n        RouteReuseStrategy.prototype.shouldReuseRoute = function (future, curr) { };\n        return RouteReuseStrategy;\n    }());\n\n    var /** @type {?} */ getDOM = _angular_platformBrowser.__platform_browser_private__.getDOM;\n\n    /**\n     * \\@whatItDoes Provides a preloading strategy.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var PreloadingStrategy = (function () {\n        function PreloadingStrategy() {\n        }\n        /**\n         * @abstract\n         * @param {?} route\n         * @param {?} fn\n         * @return {?}\n         */\n        PreloadingStrategy.prototype.preload = function (route, fn) { };\n        return PreloadingStrategy;\n    }());\n    /**\n     * \\@whatItDoes Provides a preloading strategy that preloads all modules as quicky as possible.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * RouteModule.forRoot(ROUTES, {preloadingStrategy: PreloadAllModules})\n     * ```\n     *\n     * \\@experimental\n     */\n    var PreloadAllModules = (function () {\n        function PreloadAllModules() {\n        }\n        /**\n         * @param {?} route\n         * @param {?} fn\n         * @return {?}\n         */\n        PreloadAllModules.prototype.preload = function (route, fn) {\n            return rxjs_operator_catch._catch.call(fn(), function () { return rxjs_observable_of.of(null); });\n        };\n        return PreloadAllModules;\n    }());\n    /**\n     * \\@whatItDoes Provides a preloading strategy that does not preload any modules.\n     *\n     * \\@description\n     *\n     * This strategy is enabled by default.\n     *\n     * \\@experimental\n     */\n    var NoPreloading = (function () {\n        function NoPreloading() {\n        }\n        /**\n         * @param {?} route\n         * @param {?} fn\n         * @return {?}\n         */\n        NoPreloading.prototype.preload = function (route, fn) { return rxjs_observable_of.of(null); };\n        return NoPreloading;\n    }());\n    /**\n     * The preloader optimistically loads all router configurations to\n     * make navigations into lazily-loaded sections of the application faster.\n     *\n     * The preloader runs in the background. When the router bootstraps, the preloader\n     * starts listening to all navigation events. After every such event, the preloader\n     * will check if any configurations can be loaded lazily.\n     *\n     * If a route is protected by `canLoad` guards, the preloaded will not load it.\n     *\n     * \\@stable\n     */\n    var RouterPreloader = (function () {\n        /**\n         * @param {?} router\n         * @param {?} moduleLoader\n         * @param {?} compiler\n         * @param {?} injector\n         * @param {?} preloadingStrategy\n         */\n        function RouterPreloader(router, moduleLoader, compiler, injector, preloadingStrategy) {\n            this.router = router;\n            this.injector = injector;\n            this.preloadingStrategy = preloadingStrategy;\n            this.loader = new RouterConfigLoader(moduleLoader, compiler);\n        }\n        ;\n        /**\n         * @return {?}\n         */\n        RouterPreloader.prototype.setUpPreloading = function () {\n            var _this = this;\n            var /** @type {?} */ navigations = rxjs_operator_filter.filter.call(this.router.events, function (e) { return e instanceof NavigationEnd; });\n            this.subscription = rxjs_operator_concatMap.concatMap.call(navigations, function () { return _this.preload(); }).subscribe(function (v) { });\n        };\n        /**\n         * @return {?}\n         */\n        RouterPreloader.prototype.preload = function () { return this.processRoutes(this.injector, this.router.config); };\n        /**\n         * @return {?}\n         */\n        RouterPreloader.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n        /**\n         * @param {?} injector\n         * @param {?} routes\n         * @return {?}\n         */\n        RouterPreloader.prototype.processRoutes = function (injector, routes) {\n            var /** @type {?} */ res = [];\n            for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n                var c = routes_1[_i];\n                // we already have the config loaded, just recurse\n                if (c.loadChildren && !c.canLoad && ((c))._loadedConfig) {\n                    var /** @type {?} */ childConfig = ((c))._loadedConfig;\n                    res.push(this.processRoutes(childConfig.injector, childConfig.routes));\n                }\n                else if (c.loadChildren && !c.canLoad) {\n                    res.push(this.preloadConfig(injector, c));\n                }\n                else if (c.children) {\n                    res.push(this.processRoutes(injector, c.children));\n                }\n            }\n            return rxjs_operator_mergeAll.mergeAll.call(rxjs_observable_from.from(res));\n        };\n        /**\n         * @param {?} injector\n         * @param {?} route\n         * @return {?}\n         */\n        RouterPreloader.prototype.preloadConfig = function (injector, route) {\n            var _this = this;\n            return this.preloadingStrategy.preload(route, function () {\n                var /** @type {?} */ loaded = _this.loader.load(injector, route.loadChildren);\n                return rxjs_operator_mergeMap.mergeMap.call(loaded, function (config) {\n                    var /** @type {?} */ c = route;\n                    c._loadedConfig = config;\n                    return _this.processRoutes(config.injector, config.routes);\n                });\n            });\n        };\n        RouterPreloader.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        RouterPreloader.ctorParameters = function () { return [\n            { type: Router, },\n            { type: _angular_core.NgModuleFactoryLoader, },\n            { type: _angular_core.Compiler, },\n            { type: _angular_core.Injector, },\n            { type: PreloadingStrategy, },\n        ]; };\n        return RouterPreloader;\n    }());\n\n    /**\n     * @whatItDoes Contains a list of directives\n     * @stable\n     */\n    var /** @type {?} */ ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, RouterLinkActive];\n    /**\n     * @whatItDoes Is used in DI to configure the router.\n     * @stable\n     */\n    var /** @type {?} */ ROUTER_CONFIGURATION = new _angular_core.OpaqueToken('ROUTER_CONFIGURATION');\n    /**\n     * @docsNotRequired\n     */\n    var /** @type {?} */ ROUTER_FORROOT_GUARD = new _angular_core.OpaqueToken('ROUTER_FORROOT_GUARD');\n    var /** @type {?} */ ROUTER_PROVIDERS = [\n        _angular_common.Location,\n        { provide: UrlSerializer, useClass: DefaultUrlSerializer },\n        {\n            provide: Router,\n            useFactory: setupRouter,\n            deps: [\n                _angular_core.ApplicationRef, UrlSerializer, RouterOutletMap, _angular_common.Location, _angular_core.Injector, _angular_core.NgModuleFactoryLoader,\n                _angular_core.Compiler, ROUTES, ROUTER_CONFIGURATION, [UrlHandlingStrategy, new _angular_core.Optional()],\n                [RouteReuseStrategy, new _angular_core.Optional()]\n            ]\n        },\n        RouterOutletMap,\n        { provide: ActivatedRoute, useFactory: rootRoute, deps: [Router] },\n        { provide: _angular_core.NgModuleFactoryLoader, useClass: _angular_core.SystemJsNgModuleLoader },\n        RouterPreloader,\n        NoPreloading,\n        PreloadAllModules,\n        { provide: ROUTER_CONFIGURATION, useValue: { enableTracing: false } },\n    ];\n    /**\n     * @return {?}\n     */\n    function routerNgProbeToken() {\n        return new _angular_core.NgProbeToken('Router', Router);\n    }\n    /**\n     * \\@whatItDoes Adds router directives and providers.\n     *\n     * \\@howToUse\n     *\n     * RouterModule can be imported multiple times: once per lazily-loaded bundle.\n     * Since the router deals with a global shared resource--location, we cannot have\n     * more than one router service active.\n     *\n     * That is why there are two ways to create the module: `RouterModule.forRoot` and\n     * `RouterModule.forChild`.\n     *\n     * * `forRoot` creates a module that contains all the directives, the given routes, and the router\n     *   service itself.\n     * * `forChild` creates a module that contains all the directives and the given routes, but does not\n     *   include the router service.\n     *\n     * When registered at the root, the module should be used as follows\n     *\n     * ```\n     * \\@NgModule({\n     *   imports: [RouterModule.forRoot(ROUTES)]\n     * })\n     * class MyNgModule {}\n     * ```\n     *\n     * For submodules and lazy loaded submodules the module should be used as follows:\n     *\n     * ```\n     * \\@NgModule({\n     *   imports: [RouterModule.forChild(ROUTES)]\n     * })\n     * class MyNgModule {}\n     * ```\n     *\n     * \\@description\n     *\n     * Managing state transitions is one of the hardest parts of building applications. This is\n     * especially true on the web, where you also need to ensure that the state is reflected in the URL.\n     * In addition, we often want to split applications into multiple bundles and load them on demand.\n     * Doing this transparently is not trivial.\n     *\n     * The Angular router solves these problems. Using the router, you can declaratively specify\n     * application states, manage state transitions while taking care of the URL, and load bundles on\n     * demand.\n     *\n     * [Read this developer guide](https://angular.io/docs/ts/latest/guide/router.html) to get an\n     * overview of how the router should be used.\n     *\n     * \\@stable\n     */\n    var RouterModule = (function () {\n        /**\n         * @param {?} guard\n         */\n        function RouterModule(guard) {\n        }\n        /**\n         * Creates a module with all the router providers and directives. It also optionally sets up an\n         * application listener to perform an initial navigation.\n         *\n         * Options:\n         * * `enableTracing` makes the router log all its internal events to the console.\n         * * `useHash` enables the location strategy that uses the URL fragment instead of the history\n         * API.\n         * * `initialNavigation` disables the initial navigation.\n         * * `errorHandler` provides a custom error handler.\n         * @param {?} routes\n         * @param {?=} config\n         * @return {?}\n         */\n        RouterModule.forRoot = function (routes, config) {\n            return {\n                ngModule: RouterModule,\n                providers: [\n                    ROUTER_PROVIDERS,\n                    provideRoutes(routes),\n                    {\n                        provide: ROUTER_FORROOT_GUARD,\n                        useFactory: provideForRootGuard,\n                        deps: [[Router, new _angular_core.Optional(), new _angular_core.SkipSelf()]]\n                    },\n                    { provide: ROUTER_CONFIGURATION, useValue: config ? config : {} },\n                    {\n                        provide: _angular_common.LocationStrategy,\n                        useFactory: provideLocationStrategy,\n                        deps: [\n                            _angular_common.PlatformLocation, [new _angular_core.Inject(_angular_common.APP_BASE_HREF), new _angular_core.Optional()], ROUTER_CONFIGURATION\n                        ]\n                    },\n                    {\n                        provide: PreloadingStrategy,\n                        useExisting: config && config.preloadingStrategy ? config.preloadingStrategy :\n                            NoPreloading\n                    },\n                    { provide: _angular_core.NgProbeToken, multi: true, useFactory: routerNgProbeToken },\n                    provideRouterInitializer(),\n                ],\n            };\n        };\n        /**\n         * Creates a module with all the router directives and a provider registering routes.\n         * @param {?} routes\n         * @return {?}\n         */\n        RouterModule.forChild = function (routes) {\n            return { ngModule: RouterModule, providers: [provideRoutes(routes)] };\n        };\n        RouterModule.decorators = [\n            { type: _angular_core.NgModule, args: [{ declarations: ROUTER_DIRECTIVES, exports: ROUTER_DIRECTIVES },] },\n        ];\n        /** @nocollapse */\n        RouterModule.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [ROUTER_FORROOT_GUARD,] },] },\n        ]; };\n        return RouterModule;\n    }());\n    /**\n     * @param {?} platformLocationStrategy\n     * @param {?} baseHref\n     * @param {?=} options\n     * @return {?}\n     */\n    function provideLocationStrategy(platformLocationStrategy, baseHref, options) {\n        if (options === void 0) { options = {}; }\n        return options.useHash ? new _angular_common.HashLocationStrategy(platformLocationStrategy, baseHref) :\n            new _angular_common.PathLocationStrategy(platformLocationStrategy, baseHref);\n    }\n    /**\n     * @param {?} router\n     * @return {?}\n     */\n    function provideForRootGuard(router) {\n        if (router) {\n            throw new Error(\"RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.\");\n        }\n        return 'guarded';\n    }\n    /**\n     * \\@whatItDoes Registers routes.\n     *\n     * \\@howToUse\n     *\n     * ```\n     * \\@NgModule({\n     *   imports: [RouterModule.forChild(ROUTES)],\n     *   providers: [provideRoutes(EXTRA_ROUTES)]\n     * })\n     * class MyNgModule {}\n     * ```\n     *\n     * \\@stable\n     * @param {?} routes\n     * @return {?}\n     */\n    function provideRoutes(routes) {\n        return [\n            { provide: _angular_core.ANALYZE_FOR_ENTRY_COMPONENTS, multi: true, useValue: routes },\n            { provide: ROUTES, multi: true, useValue: routes },\n        ];\n    }\n    /**\n     * @param {?} ref\n     * @param {?} urlSerializer\n     * @param {?} outletMap\n     * @param {?} location\n     * @param {?} injector\n     * @param {?} loader\n     * @param {?} compiler\n     * @param {?} config\n     * @param {?=} opts\n     * @param {?=} urlHandlingStrategy\n     * @param {?=} routeReuseStrategy\n     * @return {?}\n     */\n    function setupRouter(ref, urlSerializer, outletMap, location, injector, loader, compiler, config, opts, urlHandlingStrategy, routeReuseStrategy) {\n        if (opts === void 0) { opts = {}; }\n        var /** @type {?} */ router = new Router(null, urlSerializer, outletMap, location, injector, loader, compiler, flatten(config));\n        if (urlHandlingStrategy) {\n            router.urlHandlingStrategy = urlHandlingStrategy;\n        }\n        if (routeReuseStrategy) {\n            router.routeReuseStrategy = routeReuseStrategy;\n        }\n        if (opts.errorHandler) {\n            router.errorHandler = opts.errorHandler;\n        }\n        if (opts.enableTracing) {\n            var /** @type {?} */ dom_1 = getDOM();\n            router.events.subscribe(function (e) {\n                dom_1.logGroup(\"Router Event: \" + ((e.constructor)).name);\n                dom_1.log(e.toString());\n                dom_1.log(e);\n                dom_1.logGroupEnd();\n            });\n        }\n        return router;\n    }\n    /**\n     * @param {?} router\n     * @return {?}\n     */\n    function rootRoute(router) {\n        return router.routerState.root;\n    }\n    /**\n     * To initialize the router properly we need to do in two steps:\n     *\n     * We need to start the navigation in a APP_INITIALIZER to block the bootstrap if\n     * a resolver or a guards executes asynchronously. Second, we need to actually run\n     * activation in a BOOTSTRAP_LISTENER. We utilize the afterPreactivation\n     * hook provided by the router to do that.\n     *\n     * The router navigation starts, reaches the point when preactivation is done, and then\n     * pauses. It waits for the hook to be resolved. We then resolve it only in a bootstrap listener.\n     */\n    var RouterInitializer = (function () {\n        /**\n         * @param {?} injector\n         */\n        function RouterInitializer(injector) {\n            this.injector = injector;\n            this.resultOfPreactivationDone = new rxjs_Subject.Subject();\n        }\n        /**\n         * @return {?}\n         */\n        RouterInitializer.prototype.appInitializer = function () {\n            var _this = this;\n            var /** @type {?} */ p = this.injector.get(_angular_common.LOCATION_INITIALIZED, Promise.resolve(null));\n            return p.then(function () {\n                var /** @type {?} */ resolve = null;\n                var /** @type {?} */ res = new Promise(function (r) { return resolve = r; });\n                var /** @type {?} */ router = _this.injector.get(Router);\n                var /** @type {?} */ opts = _this.injector.get(ROUTER_CONFIGURATION);\n                if (opts.initialNavigation === false) {\n                    router.setUpLocationChangeListener();\n                }\n                else {\n                    router.hooks.afterPreactivation = function () {\n                        // only the initial navigation should be delayed\n                        if (!_this.initNavigation) {\n                            _this.initNavigation = true;\n                            resolve(true);\n                            return _this.resultOfPreactivationDone;\n                        }\n                        else {\n                            return rxjs_observable_of.of(null);\n                        }\n                    };\n                    router.initialNavigation();\n                }\n                return res;\n            });\n        };\n        /**\n         * @param {?} bootstrappedComponentRef\n         * @return {?}\n         */\n        RouterInitializer.prototype.bootstrapListener = function (bootstrappedComponentRef) {\n            var /** @type {?} */ ref = this.injector.get(_angular_core.ApplicationRef);\n            if (bootstrappedComponentRef !== ref.components[0]) {\n                return;\n            }\n            var /** @type {?} */ preloader = this.injector.get(RouterPreloader);\n            preloader.setUpPreloading();\n            var /** @type {?} */ router = this.injector.get(Router);\n            router.resetRootComponentType(ref.componentTypes[0]);\n            this.resultOfPreactivationDone.next(null);\n            this.resultOfPreactivationDone.complete();\n        };\n        RouterInitializer.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        RouterInitializer.ctorParameters = function () { return [\n            { type: _angular_core.Injector, },\n        ]; };\n        return RouterInitializer;\n    }());\n    /**\n     * @param {?} r\n     * @return {?}\n     */\n    function getAppInitializer(r) {\n        return r.appInitializer.bind(r);\n    }\n    /**\n     * @param {?} r\n     * @return {?}\n     */\n    function getBootstrapListener(r) {\n        return r.bootstrapListener.bind(r);\n    }\n    /**\n     * A token for the router initializer that will be called after the app is bootstrapped.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ ROUTER_INITIALIZER = new _angular_core.OpaqueToken('Router Initializer');\n    /**\n     * @return {?}\n     */\n    function provideRouterInitializer() {\n        return [\n            RouterInitializer,\n            {\n                provide: _angular_core.APP_INITIALIZER,\n                multi: true,\n                useFactory: getAppInitializer,\n                deps: [RouterInitializer]\n            },\n            { provide: ROUTER_INITIALIZER, useFactory: getBootstrapListener, deps: [RouterInitializer] },\n            { provide: _angular_core.APP_BOOTSTRAP_LISTENER, multi: true, useExisting: ROUTER_INITIALIZER },\n        ];\n    }\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new _angular_core.Version('3.4.8');\n\n    var /** @type {?} */ __router_private__ = {\n        ROUTER_PROVIDERS: ROUTER_PROVIDERS,\n        ROUTES: ROUTES,\n        flatten: flatten,\n    };\n\n    exports.RouterLink = RouterLink;\n    exports.RouterLinkWithHref = RouterLinkWithHref;\n    exports.RouterLinkActive = RouterLinkActive;\n    exports.RouterOutlet = RouterOutlet;\n    exports.RouteReuseStrategy = RouteReuseStrategy;\n    exports.NavigationCancel = NavigationCancel;\n    exports.NavigationEnd = NavigationEnd;\n    exports.NavigationError = NavigationError;\n    exports.NavigationStart = NavigationStart;\n    exports.Router = Router;\n    exports.RoutesRecognized = RoutesRecognized;\n    exports.ROUTER_CONFIGURATION = ROUTER_CONFIGURATION;\n    exports.ROUTER_INITIALIZER = ROUTER_INITIALIZER;\n    exports.RouterModule = RouterModule;\n    exports.provideRoutes = provideRoutes;\n    exports.RouterOutletMap = RouterOutletMap;\n    exports.NoPreloading = NoPreloading;\n    exports.PreloadAllModules = PreloadAllModules;\n    exports.PreloadingStrategy = PreloadingStrategy;\n    exports.RouterPreloader = RouterPreloader;\n    exports.ActivatedRoute = ActivatedRoute;\n    exports.ActivatedRouteSnapshot = ActivatedRouteSnapshot;\n    exports.RouterState = RouterState;\n    exports.RouterStateSnapshot = RouterStateSnapshot;\n    exports.PRIMARY_OUTLET = PRIMARY_OUTLET;\n    exports.UrlHandlingStrategy = UrlHandlingStrategy;\n    exports.DefaultUrlSerializer = DefaultUrlSerializer;\n    exports.UrlSegment = UrlSegment;\n    exports.UrlSegmentGroup = UrlSegmentGroup;\n    exports.UrlSerializer = UrlSerializer;\n    exports.UrlTree = UrlTree;\n    exports.VERSION = VERSION;\n    exports.__router_private__ = __router_private__;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/router/bundles/router.umd.js\n// module id = 7\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isFunction_1 = require('./util/isFunction');\nvar Subscription_1 = require('./Subscription');\nvar Observer_1 = require('./Observer');\nvar rxSubscriber_1 = require('./symbol/rxSubscriber');\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber<T>\n */\nvar Subscriber = (function (_super) {\n    __extends(Subscriber, _super);\n    /**\n     * @param {Observer|function(value: T): void} [destinationOrNext] A partially\n     * defined Observer or a `next` callback function.\n     * @param {function(e: ?any): void} [error] The `error` callback of an\n     * Observer.\n     * @param {function(): void} [complete] The `complete` callback of an\n     * Observer.\n     */\n    function Subscriber(destinationOrNext, error, complete) {\n        _super.call(this);\n        this.syncErrorValue = null;\n        this.syncErrorThrown = false;\n        this.syncErrorThrowable = false;\n        this.isStopped = false;\n        switch (arguments.length) {\n            case 0:\n                this.destination = Observer_1.empty;\n                break;\n            case 1:\n                if (!destinationOrNext) {\n                    this.destination = Observer_1.empty;\n                    break;\n                }\n                if (typeof destinationOrNext === 'object') {\n                    if (destinationOrNext instanceof Subscriber) {\n                        this.destination = destinationOrNext;\n                        this.destination.add(this);\n                    }\n                    else {\n                        this.syncErrorThrowable = true;\n                        this.destination = new SafeSubscriber(this, destinationOrNext);\n                    }\n                    break;\n                }\n            default:\n                this.syncErrorThrowable = true;\n                this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);\n                break;\n        }\n    }\n    Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; };\n    /**\n     * A static factory for a Subscriber, given a (potentially partial) definition\n     * of an Observer.\n     * @param {function(x: ?T): void} [next] The `next` callback of an Observer.\n     * @param {function(e: ?any): void} [error] The `error` callback of an\n     * Observer.\n     * @param {function(): void} [complete] The `complete` callback of an\n     * Observer.\n     * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)\n     * Observer represented by the given arguments.\n     */\n    Subscriber.create = function (next, error, complete) {\n        var subscriber = new Subscriber(next, error, complete);\n        subscriber.syncErrorThrowable = false;\n        return subscriber;\n    };\n    /**\n     * The {@link Observer} callback to receive notifications of type `next` from\n     * the Observable, with a value. The Observable may call this method 0 or more\n     * times.\n     * @param {T} [value] The `next` value.\n     * @return {void}\n     */\n    Subscriber.prototype.next = function (value) {\n        if (!this.isStopped) {\n            this._next(value);\n        }\n    };\n    /**\n     * The {@link Observer} callback to receive notifications of type `error` from\n     * the Observable, with an attached {@link Error}. Notifies the Observer that\n     * the Observable has experienced an error condition.\n     * @param {any} [err] The `error` exception.\n     * @return {void}\n     */\n    Subscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._error(err);\n        }\n    };\n    /**\n     * The {@link Observer} callback to receive a valueless notification of type\n     * `complete` from the Observable. Notifies the Observer that the Observable\n     * has finished sending push-based notifications.\n     * @return {void}\n     */\n    Subscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._complete();\n        }\n    };\n    Subscriber.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.isStopped = true;\n        _super.prototype.unsubscribe.call(this);\n    };\n    Subscriber.prototype._next = function (value) {\n        this.destination.next(value);\n    };\n    Subscriber.prototype._error = function (err) {\n        this.destination.error(err);\n        this.unsubscribe();\n    };\n    Subscriber.prototype._complete = function () {\n        this.destination.complete();\n        this.unsubscribe();\n    };\n    return Subscriber;\n}(Subscription_1.Subscription));\nexports.Subscriber = Subscriber;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SafeSubscriber = (function (_super) {\n    __extends(SafeSubscriber, _super);\n    function SafeSubscriber(_parent, observerOrNext, error, complete) {\n        _super.call(this);\n        this._parent = _parent;\n        var next;\n        var context = this;\n        if (isFunction_1.isFunction(observerOrNext)) {\n            next = observerOrNext;\n        }\n        else if (observerOrNext) {\n            context = observerOrNext;\n            next = observerOrNext.next;\n            error = observerOrNext.error;\n            complete = observerOrNext.complete;\n            if (isFunction_1.isFunction(context.unsubscribe)) {\n                this.add(context.unsubscribe.bind(context));\n            }\n            context.unsubscribe = this.unsubscribe.bind(this);\n        }\n        this._context = context;\n        this._next = next;\n        this._error = error;\n        this._complete = complete;\n    }\n    SafeSubscriber.prototype.next = function (value) {\n        if (!this.isStopped && this._next) {\n            var _parent = this._parent;\n            if (!_parent.syncErrorThrowable) {\n                this.__tryOrUnsub(this._next, value);\n            }\n            else if (this.__tryOrSetError(_parent, this._next, value)) {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _parent = this._parent;\n            if (this._error) {\n                if (!_parent.syncErrorThrowable) {\n                    this.__tryOrUnsub(this._error, err);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parent, this._error, err);\n                    this.unsubscribe();\n                }\n            }\n            else if (!_parent.syncErrorThrowable) {\n                this.unsubscribe();\n                throw err;\n            }\n            else {\n                _parent.syncErrorValue = err;\n                _parent.syncErrorThrown = true;\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            var _parent = this._parent;\n            if (this._complete) {\n                if (!_parent.syncErrorThrowable) {\n                    this.__tryOrUnsub(this._complete);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parent, this._complete);\n                    this.unsubscribe();\n                }\n            }\n            else {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            this.unsubscribe();\n            throw err;\n        }\n    };\n    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            parent.syncErrorValue = err;\n            parent.syncErrorThrown = true;\n            return true;\n        }\n        return false;\n    };\n    SafeSubscriber.prototype._unsubscribe = function () {\n        var _parent = this._parent;\n        this._context = null;\n        this._parent = null;\n        _parent.unsubscribe();\n    };\n    return SafeSubscriber;\n}(Subscriber));\n//# sourceMappingURL=Subscriber.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Subscriber.js\n// module id = 10\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('./Subscriber');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar OuterSubscriber = (function (_super) {\n    __extends(OuterSubscriber, _super);\n    function OuterSubscriber() {\n        _super.apply(this, arguments);\n    }\n    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    OuterSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.destination.error(error);\n    };\n    OuterSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.destination.complete();\n    };\n    return OuterSubscriber;\n}(Subscriber_1.Subscriber));\nexports.OuterSubscriber = OuterSubscriber;\n//# sourceMappingURL=OuterSubscriber.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/OuterSubscriber.js\n// module id = 15\n// module chunks = 2","\"use strict\";\nvar root_1 = require('./root');\nvar isArray_1 = require('./isArray');\nvar isPromise_1 = require('./isPromise');\nvar isObject_1 = require('./isObject');\nvar Observable_1 = require('../Observable');\nvar iterator_1 = require('../symbol/iterator');\nvar InnerSubscriber_1 = require('../InnerSubscriber');\nvar observable_1 = require('../symbol/observable');\nfunction subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {\n    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);\n    if (destination.closed) {\n        return null;\n    }\n    if (result instanceof Observable_1.Observable) {\n        if (result._isScalar) {\n            destination.next(result.value);\n            destination.complete();\n            return null;\n        }\n        else {\n            return result.subscribe(destination);\n        }\n    }\n    else if (isArray_1.isArray(result)) {\n        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {\n            destination.next(result[i]);\n        }\n        if (!destination.closed) {\n            destination.complete();\n        }\n    }\n    else if (isPromise_1.isPromise(result)) {\n        result.then(function (value) {\n            if (!destination.closed) {\n                destination.next(value);\n                destination.complete();\n            }\n        }, function (err) { return destination.error(err); })\n            .then(null, function (err) {\n            // Escaping the Promise trap: globally throw unhandled errors\n            root_1.root.setTimeout(function () { throw err; });\n        });\n        return destination;\n    }\n    else if (result && typeof result[iterator_1.$$iterator] === 'function') {\n        var iterator = result[iterator_1.$$iterator]();\n        do {\n            var item = iterator.next();\n            if (item.done) {\n                destination.complete();\n                break;\n            }\n            destination.next(item.value);\n            if (destination.closed) {\n                break;\n            }\n        } while (true);\n    }\n    else if (result && typeof result[observable_1.$$observable] === 'function') {\n        var obs = result[observable_1.$$observable]();\n        if (typeof obs.subscribe !== 'function') {\n            destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));\n        }\n        else {\n            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));\n        }\n    }\n    else {\n        var value = isObject_1.isObject(result) ? 'an invalid object' : \"'\" + result + \"'\";\n        var msg = (\"You provided \" + value + \" where a stream was expected.\")\n            + ' You can provide an Observable, Promise, Array, or Iterable.';\n        destination.error(new TypeError(msg));\n    }\n    return null;\n}\nexports.subscribeToResult = subscribeToResult;\n//# sourceMappingURL=subscribeToResult.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/subscribeToResult.js\n// module id = 16\n// module chunks = 2","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs/BehaviorSubject'), require('@angular/core'), require('@ngrx/core'), require('rxjs/Observable'), require('rxjs/operator/withLatestFrom'), require('rxjs/operator/scan'), require('rxjs/operator/observeOn'), require('rxjs/scheduler/queue')) :\n    typeof define === 'function' && define.amd ? define(['exports', 'rxjs/BehaviorSubject', '@angular/core', '@ngrx/core', 'rxjs/Observable', 'rxjs/operator/withLatestFrom', 'rxjs/operator/scan', 'rxjs/operator/observeOn', 'rxjs/scheduler/queue'], factory) :\n    (factory((global.ngrx = global.ngrx || {}, global.ngrx.store = global.ngrx.store || {}),global.Rx,global.ng.core,global.ngrx.core,global.Rx,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Scheduler));\n}(this, (function (exports,rxjs_BehaviorSubject,_angular_core,_ngrx_core,rxjs_Observable,rxjs_operator_withLatestFrom,rxjs_operator_scan,rxjs_operator_observeOn,rxjs_scheduler_queue) { 'use strict';\n\nvar __extends = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Dispatcher = (function (_super) {\n    __extends(Dispatcher, _super);\n    function Dispatcher() {\n        _super.call(this, { type: Dispatcher.INIT });\n    }\n    Dispatcher.prototype.dispatch = function (action) {\n        this.next(action);\n    };\n    Dispatcher.prototype.complete = function () {\n        // noop\n    };\n    Dispatcher.INIT = '@ngrx/store/init';\n    return Dispatcher;\n}(rxjs_BehaviorSubject.BehaviorSubject));\n\nvar __extends$1 = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Reducer = (function (_super) {\n    __extends$1(Reducer, _super);\n    function Reducer(_dispatcher, initialReducer) {\n        _super.call(this, initialReducer);\n        this._dispatcher = _dispatcher;\n    }\n    Reducer.prototype.replaceReducer = function (reducer) {\n        this.next(reducer);\n    };\n    Reducer.prototype.next = function (reducer) {\n        _super.prototype.next.call(this, reducer);\n        this._dispatcher.dispatch({ type: Reducer.REPLACE });\n    };\n    Reducer.REPLACE = '@ngrx/store/replace-reducer';\n    return Reducer;\n}(rxjs_BehaviorSubject.BehaviorSubject));\n\nvar __extends$2 = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Store = (function (_super) {\n    __extends$2(Store, _super);\n    function Store(_dispatcher, _reducer, state$) {\n        _super.call(this);\n        this._dispatcher = _dispatcher;\n        this._reducer = _reducer;\n        this.select = _ngrx_core.select.bind(this);\n        this.source = state$;\n    }\n    Store.prototype.lift = function (operator) {\n        var store = new Store(this._dispatcher, this._reducer, this);\n        store.operator = operator;\n        return store;\n    };\n    Store.prototype.replaceReducer = function (reducer) {\n        this._reducer.next(reducer);\n    };\n    Store.prototype.dispatch = function (action) {\n        this._dispatcher.next(action);\n    };\n    Store.prototype.next = function (action) {\n        this._dispatcher.next(action);\n    };\n    Store.prototype.error = function (err) {\n        this._dispatcher.error(err);\n    };\n    Store.prototype.complete = function () {\n        // noop\n    };\n    return Store;\n}(rxjs_Observable.Observable));\n\nvar __extends$3 = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar State = (function (_super) {\n    __extends$3(State, _super);\n    function State(_initialState, action$, reducer$) {\n        var _this = this;\n        _super.call(this, _initialState);\n        var actionInQueue$ = rxjs_operator_observeOn.observeOn.call(action$, rxjs_scheduler_queue.queue);\n        var actionAndReducer$ = rxjs_operator_withLatestFrom.withLatestFrom.call(actionInQueue$, reducer$);\n        var state$ = rxjs_operator_scan.scan.call(actionAndReducer$, function (state, _a) {\n            var action = _a[0], reducer = _a[1];\n            return reducer(state, action);\n        }, _initialState);\n        state$.subscribe(function (value) { return _this.next(value); });\n    }\n    return State;\n}(rxjs_BehaviorSubject.BehaviorSubject));\n\nfunction combineReducers(reducers) {\n    var reducerKeys = Object.keys(reducers);\n    var finalReducers = {};\n    for (var i = 0; i < reducerKeys.length; i++) {\n        var key = reducerKeys[i];\n        if (typeof reducers[key] === 'function') {\n            finalReducers[key] = reducers[key];\n        }\n    }\n    var finalReducerKeys = Object.keys(finalReducers);\n    return function combination(state, action) {\n        if (state === void 0) { state = {}; }\n        var hasChanged = false;\n        var nextState = {};\n        for (var i = 0; i < finalReducerKeys.length; i++) {\n            var key = finalReducerKeys[i];\n            var reducer = finalReducers[key];\n            var previousStateForKey = state[key];\n            var nextStateForKey = reducer(previousStateForKey, action);\n            nextState[key] = nextStateForKey;\n            hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n        }\n        return hasChanged ? nextState : state;\n    };\n}\n\nvar INITIAL_REDUCER = new _angular_core.OpaqueToken('Token ngrx/store/reducer');\nvar INITIAL_STATE = new _angular_core.OpaqueToken('Token ngrx/store/initial-state');\nvar _INITIAL_REDUCER = new _angular_core.OpaqueToken('Token _ngrx/store/reducer');\nvar _INITIAL_STATE = new _angular_core.OpaqueToken('Token _ngrx/store/initial-state');\nfunction _initialReducerFactory(reducer) {\n    if (typeof reducer === 'function') {\n        return reducer;\n    }\n    return combineReducers(reducer);\n}\nfunction _initialStateFactory(initialState, reducer) {\n    if (!initialState) {\n        return reducer(undefined, { type: Dispatcher.INIT });\n    }\n    return initialState;\n}\nfunction _storeFactory(dispatcher, reducer, state$) {\n    return new Store(dispatcher, reducer, state$);\n}\nfunction _stateFactory(initialState, dispatcher, reducer) {\n    return new State(initialState, dispatcher, reducer);\n}\nfunction _reducerFactory(dispatcher, reducer) {\n    return new Reducer(dispatcher, reducer);\n}\n;\n/**\n * @deprecated, use StoreModule.provideStore instead!\n */\nfunction provideStore(_reducer, _initialState) {\n    return [\n        Dispatcher,\n        { provide: Store, useFactory: _storeFactory, deps: [Dispatcher, Reducer, State] },\n        { provide: Reducer, useFactory: _reducerFactory, deps: [Dispatcher, INITIAL_REDUCER] },\n        { provide: State, useFactory: _stateFactory, deps: [INITIAL_STATE, Dispatcher, Reducer] },\n        { provide: INITIAL_REDUCER, useFactory: _initialReducerFactory, deps: [_INITIAL_REDUCER] },\n        { provide: INITIAL_STATE, useFactory: _initialStateFactory, deps: [_INITIAL_STATE, INITIAL_REDUCER] },\n        { provide: _INITIAL_STATE, useValue: _initialState },\n        { provide: _INITIAL_REDUCER, useValue: _reducer }\n    ];\n}\nvar StoreModule = (function () {\n    function StoreModule() {\n    }\n    StoreModule.provideStore = function (_reducer, _initialState) {\n        return {\n            ngModule: StoreModule,\n            providers: provideStore(_reducer, _initialState)\n        };\n    };\n    StoreModule.decorators = [\n        { type: _angular_core.NgModule, args: [{},] },\n    ];\n    /** @nocollapse */\n    StoreModule.ctorParameters = [];\n    return StoreModule;\n}());\n\nexports.Dispatcher = Dispatcher;\nexports.INITIAL_REDUCER = INITIAL_REDUCER;\nexports.INITIAL_STATE = INITIAL_STATE;\nexports._INITIAL_REDUCER = _INITIAL_REDUCER;\nexports._INITIAL_STATE = _INITIAL_STATE;\nexports._initialReducerFactory = _initialReducerFactory;\nexports._initialStateFactory = _initialStateFactory;\nexports._storeFactory = _storeFactory;\nexports._stateFactory = _stateFactory;\nexports._reducerFactory = _reducerFactory;\nexports.provideStore = provideStore;\nexports.StoreModule = StoreModule;\nexports.Reducer = Reducer;\nexports.State = State;\nexports.Store = Store;\nexports.combineReducers = combineReducers;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@ngrx/store/bundles/store.umd.js\n// module id = 17\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('./Observable');\nvar Subscriber_1 = require('./Subscriber');\nvar Subscription_1 = require('./Subscription');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\nvar SubjectSubscription_1 = require('./SubjectSubscription');\nvar rxSubscriber_1 = require('./symbol/rxSubscriber');\n/**\n * @class SubjectSubscriber<T>\n */\nvar SubjectSubscriber = (function (_super) {\n    __extends(SubjectSubscriber, _super);\n    function SubjectSubscriber(destination) {\n        _super.call(this, destination);\n        this.destination = destination;\n    }\n    return SubjectSubscriber;\n}(Subscriber_1.Subscriber));\nexports.SubjectSubscriber = SubjectSubscriber;\n/**\n * @class Subject<T>\n */\nvar Subject = (function (_super) {\n    __extends(Subject, _super);\n    function Subject() {\n        _super.call(this);\n        this.observers = [];\n        this.closed = false;\n        this.isStopped = false;\n        this.hasError = false;\n        this.thrownError = null;\n    }\n    Subject.prototype[rxSubscriber_1.$$rxSubscriber] = function () {\n        return new SubjectSubscriber(this);\n    };\n    Subject.prototype.lift = function (operator) {\n        var subject = new AnonymousSubject(this, this);\n        subject.operator = operator;\n        return subject;\n    };\n    Subject.prototype.next = function (value) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        if (!this.isStopped) {\n            var observers = this.observers;\n            var len = observers.length;\n            var copy = observers.slice();\n            for (var i = 0; i < len; i++) {\n                copy[i].next(value);\n            }\n        }\n    };\n    Subject.prototype.error = function (err) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        this.hasError = true;\n        this.thrownError = err;\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].error(err);\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.complete = function () {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].complete();\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.unsubscribe = function () {\n        this.isStopped = true;\n        this.closed = true;\n        this.observers = null;\n    };\n    Subject.prototype._subscribe = function (subscriber) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return Subscription_1.Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n            return Subscription_1.Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n        }\n    };\n    Subject.prototype.asObservable = function () {\n        var observable = new Observable_1.Observable();\n        observable.source = this;\n        return observable;\n    };\n    Subject.create = function (destination, source) {\n        return new AnonymousSubject(destination, source);\n    };\n    return Subject;\n}(Observable_1.Observable));\nexports.Subject = Subject;\n/**\n * @class AnonymousSubject<T>\n */\nvar AnonymousSubject = (function (_super) {\n    __extends(AnonymousSubject, _super);\n    function AnonymousSubject(destination, source) {\n        _super.call(this);\n        this.destination = destination;\n        this.source = source;\n    }\n    AnonymousSubject.prototype.next = function (value) {\n        var destination = this.destination;\n        if (destination && destination.next) {\n            destination.next(value);\n        }\n    };\n    AnonymousSubject.prototype.error = function (err) {\n        var destination = this.destination;\n        if (destination && destination.error) {\n            this.destination.error(err);\n        }\n    };\n    AnonymousSubject.prototype.complete = function () {\n        var destination = this.destination;\n        if (destination && destination.complete) {\n            this.destination.complete();\n        }\n    };\n    AnonymousSubject.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        if (source) {\n            return this.source.subscribe(subscriber);\n        }\n        else {\n            return Subscription_1.Subscription.EMPTY;\n        }\n    };\n    return AnonymousSubject;\n}(Subject));\nexports.AnonymousSubject = AnonymousSubject;\n//# sourceMappingURL=Subject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Subject.js\n// module id = 27\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('./Subject');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\n/**\n * @class BehaviorSubject<T>\n */\nvar BehaviorSubject = (function (_super) {\n    __extends(BehaviorSubject, _super);\n    function BehaviorSubject(_value) {\n        _super.call(this);\n        this._value = _value;\n    }\n    Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n        get: function () {\n            return this.getValue();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BehaviorSubject.prototype._subscribe = function (subscriber) {\n        var subscription = _super.prototype._subscribe.call(this, subscriber);\n        if (subscription && !subscription.closed) {\n            subscriber.next(this._value);\n        }\n        return subscription;\n    };\n    BehaviorSubject.prototype.getValue = function () {\n        if (this.hasError) {\n            throw this.thrownError;\n        }\n        else if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else {\n            return this._value;\n        }\n    };\n    BehaviorSubject.prototype.next = function (value) {\n        _super.prototype.next.call(this, this._value = value);\n    };\n    return BehaviorSubject;\n}(Subject_1.Subject));\nexports.BehaviorSubject = BehaviorSubject;\n//# sourceMappingURL=BehaviorSubject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/BehaviorSubject.js\n// module id = 29\n// module chunks = 2","\"use strict\";\nvar isArray_1 = require('./util/isArray');\nvar isObject_1 = require('./util/isObject');\nvar isFunction_1 = require('./util/isFunction');\nvar tryCatch_1 = require('./util/tryCatch');\nvar errorObject_1 = require('./util/errorObject');\nvar UnsubscriptionError_1 = require('./util/UnsubscriptionError');\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nvar Subscription = (function () {\n    /**\n     * @param {function(): void} [unsubscribe] A function describing how to\n     * perform the disposal of resources when the `unsubscribe` method is called.\n     */\n    function Subscription(unsubscribe) {\n        /**\n         * A flag to indicate whether this Subscription has already been unsubscribed.\n         * @type {boolean}\n         */\n        this.closed = false;\n        if (unsubscribe) {\n            this._unsubscribe = unsubscribe;\n        }\n    }\n    /**\n     * Disposes the resources held by the subscription. May, for instance, cancel\n     * an ongoing Observable execution or cancel any other type of work that\n     * started when the Subscription was created.\n     * @return {void}\n     */\n    Subscription.prototype.unsubscribe = function () {\n        var hasErrors = false;\n        var errors;\n        if (this.closed) {\n            return;\n        }\n        this.closed = true;\n        var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;\n        this._subscriptions = null;\n        if (isFunction_1.isFunction(_unsubscribe)) {\n            var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);\n            if (trial === errorObject_1.errorObject) {\n                hasErrors = true;\n                (errors = errors || []).push(errorObject_1.errorObject.e);\n            }\n        }\n        if (isArray_1.isArray(_subscriptions)) {\n            var index = -1;\n            var len = _subscriptions.length;\n            while (++index < len) {\n                var sub = _subscriptions[index];\n                if (isObject_1.isObject(sub)) {\n                    var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);\n                    if (trial === errorObject_1.errorObject) {\n                        hasErrors = true;\n                        errors = errors || [];\n                        var err = errorObject_1.errorObject.e;\n                        if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {\n                            errors = errors.concat(err.errors);\n                        }\n                        else {\n                            errors.push(err);\n                        }\n                    }\n                }\n            }\n        }\n        if (hasErrors) {\n            throw new UnsubscriptionError_1.UnsubscriptionError(errors);\n        }\n    };\n    /**\n     * Adds a tear down to be called during the unsubscribe() of this\n     * Subscription.\n     *\n     * If the tear down being added is a subscription that is already\n     * unsubscribed, is the same reference `add` is being called on, or is\n     * `Subscription.EMPTY`, it will not be added.\n     *\n     * If this subscription is already in an `closed` state, the passed\n     * tear down logic will be executed immediately.\n     *\n     * @param {TeardownLogic} teardown The additional logic to execute on\n     * teardown.\n     * @return {Subscription} Returns the Subscription used or created to be\n     * added to the inner subscriptions list. This Subscription can be used with\n     * `remove()` to remove the passed teardown logic from the inner subscriptions\n     * list.\n     */\n    Subscription.prototype.add = function (teardown) {\n        if (!teardown || (teardown === Subscription.EMPTY)) {\n            return Subscription.EMPTY;\n        }\n        if (teardown === this) {\n            return this;\n        }\n        var sub = teardown;\n        switch (typeof teardown) {\n            case 'function':\n                sub = new Subscription(teardown);\n            case 'object':\n                if (sub.closed || typeof sub.unsubscribe !== 'function') {\n                    break;\n                }\n                else if (this.closed) {\n                    sub.unsubscribe();\n                }\n                else {\n                    (this._subscriptions || (this._subscriptions = [])).push(sub);\n                }\n                break;\n            default:\n                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n        }\n        return sub;\n    };\n    /**\n     * Removes a Subscription from the internal list of subscriptions that will\n     * unsubscribe during the unsubscribe process of this Subscription.\n     * @param {Subscription} subscription The subscription to remove.\n     * @return {void}\n     */\n    Subscription.prototype.remove = function (subscription) {\n        // HACK: This might be redundant because of the logic in `add()`\n        if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) {\n            return;\n        }\n        var subscriptions = this._subscriptions;\n        if (subscriptions) {\n            var subscriptionIndex = subscriptions.indexOf(subscription);\n            if (subscriptionIndex !== -1) {\n                subscriptions.splice(subscriptionIndex, 1);\n            }\n        }\n    };\n    Subscription.EMPTY = (function (empty) {\n        empty.closed = true;\n        return empty;\n    }(new Subscription()));\n    return Subscription;\n}());\nexports.Subscription = Subscription;\n//# sourceMappingURL=Subscription.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Subscription.js\n// module id = 30\n// module chunks = 2","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.common = global.ng.common || {}),global.ng.core));\n}(this, function (exports,_angular_core) { 'use strict';\n\n    /**\n     * This class should not be used directly by an application developer. Instead, use\n     * {\\@link Location}.\n     *\n     * `PlatformLocation` encapsulates all calls to DOM apis, which allows the Router to be platform\n     * agnostic.\n     * This means that we can have different implementation of `PlatformLocation` for the different\n     * platforms\n     * that angular supports. For example, the default `PlatformLocation` is {\\@link\n     * BrowserPlatformLocation},\n     * however when you run your app in a WebWorker you use {\\@link WebWorkerPlatformLocation}.\n     *\n     * The `PlatformLocation` class is used directly by all implementations of {\\@link LocationStrategy}\n     * when\n     * they need to interact with the DOM apis like pushState, popState, etc...\n     *\n     * {\\@link LocationStrategy} in turn is used by the {\\@link Location} service which is used directly\n     * by\n     * the {\\@link Router} in order to navigate between routes. Since all interactions between {\\@link\n     * Router} /\n     * {\\@link Location} / {\\@link LocationStrategy} and DOM apis flow through the `PlatformLocation`\n     * class\n     * they are all platform independent.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var PlatformLocation = (function () {\n        function PlatformLocation() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        PlatformLocation.prototype.getBaseHrefFromDOM = function () { };\n        /**\n         * @abstract\n         * @param {?} fn\n         * @return {?}\n         */\n        PlatformLocation.prototype.onPopState = function (fn) { };\n        /**\n         * @abstract\n         * @param {?} fn\n         * @return {?}\n         */\n        PlatformLocation.prototype.onHashChange = function (fn) { };\n        Object.defineProperty(PlatformLocation.prototype, \"pathname\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(PlatformLocation.prototype, \"search\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return null; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(PlatformLocation.prototype, \"hash\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return null; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @abstract\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @return {?}\n         */\n        PlatformLocation.prototype.replaceState = function (state, title, url) { };\n        /**\n         * @abstract\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @return {?}\n         */\n        PlatformLocation.prototype.pushState = function (state, title, url) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        PlatformLocation.prototype.forward = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        PlatformLocation.prototype.back = function () { };\n        return PlatformLocation;\n    }());\n    /**\n     * @whatItDoes indicates when a location is initialized\n     * @experimental\n     */\n    var /** @type {?} */ LOCATION_INITIALIZED = new _angular_core.OpaqueToken('Location Initialized');\n\n    /**\n     * `LocationStrategy` is responsible for representing and reading route state\n     * from the browser's URL. Angular provides two strategies:\n     * {\\@link HashLocationStrategy} and {\\@link PathLocationStrategy}.\n     *\n     * This is used under the hood of the {\\@link Location} service.\n     *\n     * Applications should use the {\\@link Router} or {\\@link Location} services to\n     * interact with application route state.\n     *\n     * For instance, {\\@link HashLocationStrategy} produces URLs like\n     * `http://example.com#/foo`, and {\\@link PathLocationStrategy} produces\n     * `http://example.com/foo` as an equivalent URL.\n     *\n     * See these two classes for more.\n     *\n     * \\@stable\n     * @abstract\n     */\n    var LocationStrategy = (function () {\n        function LocationStrategy() {\n        }\n        /**\n         * @abstract\n         * @param {?=} includeHash\n         * @return {?}\n         */\n        LocationStrategy.prototype.path = function (includeHash) { };\n        /**\n         * @abstract\n         * @param {?} internal\n         * @return {?}\n         */\n        LocationStrategy.prototype.prepareExternalUrl = function (internal) { };\n        /**\n         * @abstract\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @param {?} queryParams\n         * @return {?}\n         */\n        LocationStrategy.prototype.pushState = function (state, title, url, queryParams) { };\n        /**\n         * @abstract\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @param {?} queryParams\n         * @return {?}\n         */\n        LocationStrategy.prototype.replaceState = function (state, title, url, queryParams) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        LocationStrategy.prototype.forward = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        LocationStrategy.prototype.back = function () { };\n        /**\n         * @abstract\n         * @param {?} fn\n         * @return {?}\n         */\n        LocationStrategy.prototype.onPopState = function (fn) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        LocationStrategy.prototype.getBaseHref = function () { };\n        return LocationStrategy;\n    }());\n    /**\n     * The `APP_BASE_HREF` token represents the base href to be used with the\n     * {@link PathLocationStrategy}.\n     *\n     * If you're using {@link PathLocationStrategy}, you must provide a provider to a string\n     * representing the URL prefix that should be preserved when generating and recognizing\n     * URLs.\n     *\n     * ### Example\n     *\n     * ```typescript\n     * import {Component, NgModule} from '@angular/core';\n     * import {APP_BASE_HREF} from '@angular/common';\n     *\n     * @NgModule({\n     *   providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]\n     * })\n     * class AppModule {}\n     * ```\n     *\n     * @stable\n     */\n    var /** @type {?} */ APP_BASE_HREF = new _angular_core.OpaqueToken('appBaseHref');\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ globalScope;\n    if (typeof window === 'undefined') {\n        if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n            // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n            globalScope = (self);\n        }\n        else {\n            globalScope = (global);\n        }\n    }\n    else {\n        globalScope = (window);\n    }\n    // Need to declare a new variable for global here since TypeScript\n    // exports the original value of the symbol.\n    var /** @type {?} */ _global = globalScope;\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function getTypeNameForDebugging(type) {\n        return type['name'] || typeof type;\n    }\n    // TODO: remove calls to assert in production environment\n    // Note: Can't just export this and import in in other files\n    // as `assert` is a reserved keyword in Dart\n    _global.assert = function assert(condition) {\n        // TODO: to be fixed properly via #2830, noop for now\n    };\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPresent(obj) {\n        return obj != null;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isBlank(obj) {\n        return obj == null;\n    }\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function stringify(token) {\n        if (typeof token === 'string') {\n            return token;\n        }\n        if (token == null) {\n            return '' + token;\n        }\n        if (token.overriddenName) {\n            return \"\" + token.overriddenName;\n        }\n        if (token.name) {\n            return \"\" + token.name;\n        }\n        var /** @type {?} */ res = token.toString();\n        var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n        return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n    }\n    var NumberWrapper = (function () {\n        function NumberWrapper() {\n        }\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        NumberWrapper.parseIntAutoRadix = function (text) {\n            var /** @type {?} */ result = parseInt(text);\n            if (isNaN(result)) {\n                throw new Error('Invalid integer literal when parsing ' + text);\n            }\n            return result;\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        NumberWrapper.isNumeric = function (value) { return !isNaN(value - parseFloat(value)); };\n        return NumberWrapper;\n    }());\n    /**\n     * @param {?} o\n     * @return {?}\n     */\n    function isJsObject(o) {\n        return o !== null && (typeof o === 'function' || typeof o === 'object');\n    }\n    var /** @type {?} */ _symbolIterator = null;\n    /**\n     * @return {?}\n     */\n    function getSymbolIterator() {\n        if (!_symbolIterator) {\n            if (((globalScope)).Symbol && Symbol.iterator) {\n                _symbolIterator = Symbol.iterator;\n            }\n            else {\n                // es6-shim specific logic\n                var /** @type {?} */ keys = Object.getOwnPropertyNames(Map.prototype);\n                for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n                    var /** @type {?} */ key = keys[i];\n                    if (key !== 'entries' && key !== 'size' &&\n                        ((Map)).prototype[key] === Map.prototype['entries']) {\n                        _symbolIterator = key;\n                    }\n                }\n            }\n        }\n        return _symbolIterator;\n    }\n\n    /**\n     * \\@whatItDoes `Location` is a service that applications can use to interact with a browser's URL.\n     * \\@description\n     * Depending on which {\\@link LocationStrategy} is used, `Location` will either persist\n     * to the URL's path or the URL's hash segment.\n     *\n     * Note: it's better to use {\\@link Router#navigate} service to trigger route changes. Use\n     * `Location` only if you need to interact with or create normalized URLs outside of\n     * routing.\n     *\n     * `Location` is responsible for normalizing the URL against the application's base href.\n     * A normalized URL is absolute from the URL host, includes the application's base href, and has no\n     * trailing slash:\n     * - `/my/app/user/123` is normalized\n     * - `my/app/user/123` **is not** normalized\n     * - `/my/app/user/123/` **is not** normalized\n     *\n     * ### Example\n     * {\\@example common/location/ts/path_location_component.ts region='LocationComponent'}\n     * \\@stable\n     */\n    var Location = (function () {\n        /**\n         * @param {?} platformStrategy\n         */\n        function Location(platformStrategy) {\n            var _this = this;\n            /** @internal */\n            this._subject = new _angular_core.EventEmitter();\n            this._platformStrategy = platformStrategy;\n            var browserBaseHref = this._platformStrategy.getBaseHref();\n            this._baseHref = Location.stripTrailingSlash(_stripIndexHtml(browserBaseHref));\n            this._platformStrategy.onPopState(function (ev) {\n                _this._subject.emit({\n                    'url': _this.path(true),\n                    'pop': true,\n                    'type': ev.type,\n                });\n            });\n        }\n        /**\n         * @param {?=} includeHash\n         * @return {?}\n         */\n        Location.prototype.path = function (includeHash) {\n            if (includeHash === void 0) { includeHash = false; }\n            return this.normalize(this._platformStrategy.path(includeHash));\n        };\n        /**\n         * Normalizes the given path and compares to the current normalized path.\n         * @param {?} path\n         * @param {?=} query\n         * @return {?}\n         */\n        Location.prototype.isCurrentPathEqualTo = function (path, query) {\n            if (query === void 0) { query = ''; }\n            return this.path() == this.normalize(path + Location.normalizeQueryParams(query));\n        };\n        /**\n         * Given a string representing a URL, returns the normalized URL path without leading or\n         * trailing slashes.\n         * @param {?} url\n         * @return {?}\n         */\n        Location.prototype.normalize = function (url) {\n            return Location.stripTrailingSlash(_stripBaseHref(this._baseHref, _stripIndexHtml(url)));\n        };\n        /**\n         * Given a string representing a URL, returns the platform-specific external URL path.\n         * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one\n         * before normalizing. This method will also add a hash if `HashLocationStrategy` is\n         * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n         * @param {?} url\n         * @return {?}\n         */\n        Location.prototype.prepareExternalUrl = function (url) {\n            if (url && url[0] !== '/') {\n                url = '/' + url;\n            }\n            return this._platformStrategy.prepareExternalUrl(url);\n        };\n        /**\n         * Changes the browsers URL to the normalized version of the given URL, and pushes a\n         * new item onto the platform's history.\n         * @param {?} path\n         * @param {?=} query\n         * @return {?}\n         */\n        Location.prototype.go = function (path, query) {\n            if (query === void 0) { query = ''; }\n            this._platformStrategy.pushState(null, '', path, query);\n        };\n        /**\n         * Changes the browsers URL to the normalized version of the given URL, and replaces\n         * the top item on the platform's history stack.\n         * @param {?} path\n         * @param {?=} query\n         * @return {?}\n         */\n        Location.prototype.replaceState = function (path, query) {\n            if (query === void 0) { query = ''; }\n            this._platformStrategy.replaceState(null, '', path, query);\n        };\n        /**\n         * Navigates forward in the platform's history.\n         * @return {?}\n         */\n        Location.prototype.forward = function () { this._platformStrategy.forward(); };\n        /**\n         * Navigates back in the platform's history.\n         * @return {?}\n         */\n        Location.prototype.back = function () { this._platformStrategy.back(); };\n        /**\n         * Subscribe to the platform's `popState` events.\n         * @param {?} onNext\n         * @param {?=} onThrow\n         * @param {?=} onReturn\n         * @return {?}\n         */\n        Location.prototype.subscribe = function (onNext, onThrow, onReturn) {\n            if (onThrow === void 0) { onThrow = null; }\n            if (onReturn === void 0) { onReturn = null; }\n            return this._subject.subscribe({ next: onNext, error: onThrow, complete: onReturn });\n        };\n        /**\n         * Given a string of url parameters, prepend with '?' if needed, otherwise return parameters as\n         * is.\n         * @param {?} params\n         * @return {?}\n         */\n        Location.normalizeQueryParams = function (params) {\n            return params && params[0] !== '?' ? '?' + params : params;\n        };\n        /**\n         * Given 2 parts of a url, join them with a slash if needed.\n         * @param {?} start\n         * @param {?} end\n         * @return {?}\n         */\n        Location.joinWithSlash = function (start, end) {\n            if (start.length == 0) {\n                return end;\n            }\n            if (end.length == 0) {\n                return start;\n            }\n            var /** @type {?} */ slashes = 0;\n            if (start.endsWith('/')) {\n                slashes++;\n            }\n            if (end.startsWith('/')) {\n                slashes++;\n            }\n            if (slashes == 2) {\n                return start + end.substring(1);\n            }\n            if (slashes == 1) {\n                return start + end;\n            }\n            return start + '/' + end;\n        };\n        /**\n         * If url has a trailing slash, remove it, otherwise return url as is.\n         * @param {?} url\n         * @return {?}\n         */\n        Location.stripTrailingSlash = function (url) { return url.replace(/\\/$/, ''); };\n        Location.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        Location.ctorParameters = function () { return [\n            { type: LocationStrategy, },\n        ]; };\n        return Location;\n    }());\n    /**\n     * @param {?} baseHref\n     * @param {?} url\n     * @return {?}\n     */\n    function _stripBaseHref(baseHref, url) {\n        return baseHref && url.startsWith(baseHref) ? url.substring(baseHref.length) : url;\n    }\n    /**\n     * @param {?} url\n     * @return {?}\n     */\n    function _stripIndexHtml(url) {\n        return url.replace(/\\/index.html$/, '');\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@whatItDoes Use URL hash for storing application location data.\n     * \\@description\n     * `HashLocationStrategy` is a {\\@link LocationStrategy} used to configure the\n     * {\\@link Location} service to represent its state in the\n     * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)\n     * of the browser's URL.\n     *\n     * For instance, if you call `location.go('/foo')`, the browser's URL will become\n     * `example.com#/foo`.\n     *\n     * ### Example\n     *\n     * {\\@example common/location/ts/hash_location_component.ts region='LocationComponent'}\n     *\n     * \\@stable\n     */\n    var HashLocationStrategy = (function (_super) {\n        __extends(HashLocationStrategy, _super);\n        /**\n         * @param {?} _platformLocation\n         * @param {?=} _baseHref\n         */\n        function HashLocationStrategy(_platformLocation, _baseHref) {\n            _super.call(this);\n            this._platformLocation = _platformLocation;\n            this._baseHref = '';\n            if (isPresent(_baseHref)) {\n                this._baseHref = _baseHref;\n            }\n        }\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.onPopState = function (fn) {\n            this._platformLocation.onPopState(fn);\n            this._platformLocation.onHashChange(fn);\n        };\n        /**\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };\n        /**\n         * @param {?=} includeHash\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.path = function (includeHash) {\n            if (includeHash === void 0) { includeHash = false; }\n            // the hash value is always prefixed with a `#`\n            // and if it is empty then it will stay empty\n            var /** @type {?} */ path = this._platformLocation.hash;\n            if (!isPresent(path))\n                path = '#';\n            return path.length > 0 ? path.substring(1) : path;\n        };\n        /**\n         * @param {?} internal\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.prepareExternalUrl = function (internal) {\n            var /** @type {?} */ url = Location.joinWithSlash(this._baseHref, internal);\n            return url.length > 0 ? ('#' + url) : url;\n        };\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} path\n         * @param {?} queryParams\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.pushState = function (state, title, path, queryParams) {\n            var /** @type {?} */ url = this.prepareExternalUrl(path + Location.normalizeQueryParams(queryParams));\n            if (url.length == 0) {\n                url = this._platformLocation.pathname;\n            }\n            this._platformLocation.pushState(state, title, url);\n        };\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} path\n         * @param {?} queryParams\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.replaceState = function (state, title, path, queryParams) {\n            var /** @type {?} */ url = this.prepareExternalUrl(path + Location.normalizeQueryParams(queryParams));\n            if (url.length == 0) {\n                url = this._platformLocation.pathname;\n            }\n            this._platformLocation.replaceState(state, title, url);\n        };\n        /**\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };\n        /**\n         * @return {?}\n         */\n        HashLocationStrategy.prototype.back = function () { this._platformLocation.back(); };\n        HashLocationStrategy.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        HashLocationStrategy.ctorParameters = function () { return [\n            { type: PlatformLocation, },\n            { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [APP_BASE_HREF,] },] },\n        ]; };\n        return HashLocationStrategy;\n    }(LocationStrategy));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@whatItDoes Use URL for storing application location data.\n     * \\@description\n     * `PathLocationStrategy` is a {\\@link LocationStrategy} used to configure the\n     * {\\@link Location} service to represent its state in the\n     * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the\n     * browser's URL.\n     *\n     * If you're using `PathLocationStrategy`, you must provide a {\\@link APP_BASE_HREF}\n     * or add a base element to the document. This URL prefix that will be preserved\n     * when generating and recognizing URLs.\n     *\n     * For instance, if you provide an `APP_BASE_HREF` of `'/my/app'` and call\n     * `location.go('/foo')`, the browser's URL will become\n     * `example.com/my/app/foo`.\n     *\n     * Similarly, if you add `<base href='/my/app'/>` to the document and call\n     * `location.go('/foo')`, the browser's URL will become\n     * `example.com/my/app/foo`.\n     *\n     * ### Example\n     *\n     * {\\@example common/location/ts/path_location_component.ts region='LocationComponent'}\n     *\n     * \\@stable\n     */\n    var PathLocationStrategy = (function (_super) {\n        __extends$1(PathLocationStrategy, _super);\n        /**\n         * @param {?} _platformLocation\n         * @param {?=} href\n         */\n        function PathLocationStrategy(_platformLocation, href) {\n            _super.call(this);\n            this._platformLocation = _platformLocation;\n            if (isBlank(href)) {\n                href = this._platformLocation.getBaseHrefFromDOM();\n            }\n            if (isBlank(href)) {\n                throw new Error(\"No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.\");\n            }\n            this._baseHref = href;\n        }\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.onPopState = function (fn) {\n            this._platformLocation.onPopState(fn);\n            this._platformLocation.onHashChange(fn);\n        };\n        /**\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };\n        /**\n         * @param {?} internal\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.prepareExternalUrl = function (internal) {\n            return Location.joinWithSlash(this._baseHref, internal);\n        };\n        /**\n         * @param {?=} includeHash\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.path = function (includeHash) {\n            if (includeHash === void 0) { includeHash = false; }\n            var /** @type {?} */ pathname = this._platformLocation.pathname +\n                Location.normalizeQueryParams(this._platformLocation.search);\n            var /** @type {?} */ hash = this._platformLocation.hash;\n            return hash && includeHash ? \"\" + pathname + hash : pathname;\n        };\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @param {?} queryParams\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.pushState = function (state, title, url, queryParams) {\n            var /** @type {?} */ externalUrl = this.prepareExternalUrl(url + Location.normalizeQueryParams(queryParams));\n            this._platformLocation.pushState(state, title, externalUrl);\n        };\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @param {?} queryParams\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.replaceState = function (state, title, url, queryParams) {\n            var /** @type {?} */ externalUrl = this.prepareExternalUrl(url + Location.normalizeQueryParams(queryParams));\n            this._platformLocation.replaceState(state, title, externalUrl);\n        };\n        /**\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };\n        /**\n         * @return {?}\n         */\n        PathLocationStrategy.prototype.back = function () { this._platformLocation.back(); };\n        PathLocationStrategy.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        PathLocationStrategy.ctorParameters = function () { return [\n            { type: PlatformLocation, },\n            { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [APP_BASE_HREF,] },] },\n        ]; };\n        return PathLocationStrategy;\n    }(LocationStrategy));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$2 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@experimental\n     * @abstract\n     */\n    var NgLocalization = (function () {\n        function NgLocalization() {\n        }\n        /**\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        NgLocalization.prototype.getPluralCategory = function (value) { };\n        return NgLocalization;\n    }());\n    /**\n     * Returns the plural category for a given value.\n     * - \"=value\" when the case exists,\n     * - the plural category otherwise\n     *\n     * \\@internal\n     * @param {?} value\n     * @param {?} cases\n     * @param {?} ngLocalization\n     * @return {?}\n     */\n    function getPluralCategory(value, cases, ngLocalization) {\n        var /** @type {?} */ key = \"=\" + value;\n        if (cases.indexOf(key) > -1) {\n            return key;\n        }\n        key = ngLocalization.getPluralCategory(value);\n        if (cases.indexOf(key) > -1) {\n            return key;\n        }\n        if (cases.indexOf('other') > -1) {\n            return 'other';\n        }\n        throw new Error(\"No plural message found for value \\\"\" + value + \"\\\"\");\n    }\n    /**\n     * Returns the plural case based on the locale\n     *\n     * \\@experimental\n     */\n    var NgLocaleLocalization = (function (_super) {\n        __extends$2(NgLocaleLocalization, _super);\n        /**\n         * @param {?} _locale\n         */\n        function NgLocaleLocalization(_locale) {\n            _super.call(this);\n            this._locale = _locale;\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        NgLocaleLocalization.prototype.getPluralCategory = function (value) {\n            var /** @type {?} */ plural = getPluralCase(this._locale, value);\n            switch (plural) {\n                case Plural.Zero:\n                    return 'zero';\n                case Plural.One:\n                    return 'one';\n                case Plural.Two:\n                    return 'two';\n                case Plural.Few:\n                    return 'few';\n                case Plural.Many:\n                    return 'many';\n                default:\n                    return 'other';\n            }\n        };\n        NgLocaleLocalization.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        NgLocaleLocalization.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n        ]; };\n        return NgLocaleLocalization;\n    }(NgLocalization));\n    var Plural = {};\n    Plural.Zero = 0;\n    Plural.One = 1;\n    Plural.Two = 2;\n    Plural.Few = 3;\n    Plural.Many = 4;\n    Plural.Other = 5;\n    Plural[Plural.Zero] = \"Zero\";\n    Plural[Plural.One] = \"One\";\n    Plural[Plural.Two] = \"Two\";\n    Plural[Plural.Few] = \"Few\";\n    Plural[Plural.Many] = \"Many\";\n    Plural[Plural.Other] = \"Other\";\n    /**\n     * Returns the plural case based on the locale\n     *\n     * \\@experimental\n     * @param {?} locale\n     * @param {?} nLike\n     * @return {?}\n     */\n    function getPluralCase(locale, nLike) {\n        // TODO(vicb): lazy compute\n        if (typeof nLike === 'string') {\n            nLike = parseInt(/** @type {?} */ (nLike), 10);\n        }\n        var /** @type {?} */ n = (nLike);\n        var /** @type {?} */ nDecimal = n.toString().replace(/^[^.]*\\.?/, '');\n        var /** @type {?} */ i = Math.floor(Math.abs(n));\n        var /** @type {?} */ v = nDecimal.length;\n        var /** @type {?} */ f = parseInt(nDecimal, 10);\n        var /** @type {?} */ t = parseInt(n.toString().replace(/^[^.]*\\.?|0+$/g, ''), 10) || 0;\n        var /** @type {?} */ lang = locale.split('-')[0].toLowerCase();\n        switch (lang) {\n            case 'af':\n            case 'asa':\n            case 'az':\n            case 'bem':\n            case 'bez':\n            case 'bg':\n            case 'brx':\n            case 'ce':\n            case 'cgg':\n            case 'chr':\n            case 'ckb':\n            case 'ee':\n            case 'el':\n            case 'eo':\n            case 'es':\n            case 'eu':\n            case 'fo':\n            case 'fur':\n            case 'gsw':\n            case 'ha':\n            case 'haw':\n            case 'hu':\n            case 'jgo':\n            case 'jmc':\n            case 'ka':\n            case 'kk':\n            case 'kkj':\n            case 'kl':\n            case 'ks':\n            case 'ksb':\n            case 'ky':\n            case 'lb':\n            case 'lg':\n            case 'mas':\n            case 'mgo':\n            case 'ml':\n            case 'mn':\n            case 'nb':\n            case 'nd':\n            case 'ne':\n            case 'nn':\n            case 'nnh':\n            case 'nyn':\n            case 'om':\n            case 'or':\n            case 'os':\n            case 'ps':\n            case 'rm':\n            case 'rof':\n            case 'rwk':\n            case 'saq':\n            case 'seh':\n            case 'sn':\n            case 'so':\n            case 'sq':\n            case 'ta':\n            case 'te':\n            case 'teo':\n            case 'tk':\n            case 'tr':\n            case 'ug':\n            case 'uz':\n            case 'vo':\n            case 'vun':\n            case 'wae':\n            case 'xog':\n                if (n === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'agq':\n            case 'bas':\n            case 'cu':\n            case 'dav':\n            case 'dje':\n            case 'dua':\n            case 'dyo':\n            case 'ebu':\n            case 'ewo':\n            case 'guz':\n            case 'kam':\n            case 'khq':\n            case 'ki':\n            case 'kln':\n            case 'kok':\n            case 'ksf':\n            case 'lrc':\n            case 'lu':\n            case 'luo':\n            case 'luy':\n            case 'mer':\n            case 'mfe':\n            case 'mgh':\n            case 'mua':\n            case 'mzn':\n            case 'nmg':\n            case 'nus':\n            case 'qu':\n            case 'rn':\n            case 'rw':\n            case 'sbp':\n            case 'twq':\n            case 'vai':\n            case 'yav':\n            case 'yue':\n            case 'zgh':\n            case 'ak':\n            case 'ln':\n            case 'mg':\n            case 'pa':\n            case 'ti':\n                if (n === Math.floor(n) && n >= 0 && n <= 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'am':\n            case 'as':\n            case 'bn':\n            case 'fa':\n            case 'gu':\n            case 'hi':\n            case 'kn':\n            case 'mr':\n            case 'zu':\n                if (i === 0 || n === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'ar':\n                if (n === 0)\n                    return Plural.Zero;\n                if (n === 1)\n                    return Plural.One;\n                if (n === 2)\n                    return Plural.Two;\n                if (n % 100 === Math.floor(n % 100) && n % 100 >= 3 && n % 100 <= 10)\n                    return Plural.Few;\n                if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 99)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'ast':\n            case 'ca':\n            case 'de':\n            case 'en':\n            case 'et':\n            case 'fi':\n            case 'fy':\n            case 'gl':\n            case 'it':\n            case 'nl':\n            case 'sv':\n            case 'sw':\n            case 'ur':\n            case 'yi':\n                if (i === 1 && v === 0)\n                    return Plural.One;\n                return Plural.Other;\n            case 'be':\n                if (n % 10 === 1 && !(n % 100 === 11))\n                    return Plural.One;\n                if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 &&\n                    !(n % 100 >= 12 && n % 100 <= 14))\n                    return Plural.Few;\n                if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 ||\n                    n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'br':\n                if (n % 10 === 1 && !(n % 100 === 11 || n % 100 === 71 || n % 100 === 91))\n                    return Plural.One;\n                if (n % 10 === 2 && !(n % 100 === 12 || n % 100 === 72 || n % 100 === 92))\n                    return Plural.Two;\n                if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) &&\n                    !(n % 100 >= 10 && n % 100 <= 19 || n % 100 >= 70 && n % 100 <= 79 ||\n                        n % 100 >= 90 && n % 100 <= 99))\n                    return Plural.Few;\n                if (!(n === 0) && n % 1e6 === 0)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'bs':\n            case 'hr':\n            case 'sr':\n                if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11))\n                    return Plural.One;\n                if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n                    !(i % 100 >= 12 && i % 100 <= 14) ||\n                    f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 &&\n                        !(f % 100 >= 12 && f % 100 <= 14))\n                    return Plural.Few;\n                return Plural.Other;\n            case 'cs':\n            case 'sk':\n                if (i === 1 && v === 0)\n                    return Plural.One;\n                if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0)\n                    return Plural.Few;\n                if (!(v === 0))\n                    return Plural.Many;\n                return Plural.Other;\n            case 'cy':\n                if (n === 0)\n                    return Plural.Zero;\n                if (n === 1)\n                    return Plural.One;\n                if (n === 2)\n                    return Plural.Two;\n                if (n === 3)\n                    return Plural.Few;\n                if (n === 6)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'da':\n                if (n === 1 || !(t === 0) && (i === 0 || i === 1))\n                    return Plural.One;\n                return Plural.Other;\n            case 'dsb':\n            case 'hsb':\n                if (v === 0 && i % 100 === 1 || f % 100 === 1)\n                    return Plural.One;\n                if (v === 0 && i % 100 === 2 || f % 100 === 2)\n                    return Plural.Two;\n                if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 ||\n                    f % 100 === Math.floor(f % 100) && f % 100 >= 3 && f % 100 <= 4)\n                    return Plural.Few;\n                return Plural.Other;\n            case 'ff':\n            case 'fr':\n            case 'hy':\n            case 'kab':\n                if (i === 0 || i === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'fil':\n                if (v === 0 && (i === 1 || i === 2 || i === 3) ||\n                    v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) ||\n                    !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9))\n                    return Plural.One;\n                return Plural.Other;\n            case 'ga':\n                if (n === 1)\n                    return Plural.One;\n                if (n === 2)\n                    return Plural.Two;\n                if (n === Math.floor(n) && n >= 3 && n <= 6)\n                    return Plural.Few;\n                if (n === Math.floor(n) && n >= 7 && n <= 10)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'gd':\n                if (n === 1 || n === 11)\n                    return Plural.One;\n                if (n === 2 || n === 12)\n                    return Plural.Two;\n                if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19))\n                    return Plural.Few;\n                return Plural.Other;\n            case 'gv':\n                if (v === 0 && i % 10 === 1)\n                    return Plural.One;\n                if (v === 0 && i % 10 === 2)\n                    return Plural.Two;\n                if (v === 0 &&\n                    (i % 100 === 0 || i % 100 === 20 || i % 100 === 40 || i % 100 === 60 || i % 100 === 80))\n                    return Plural.Few;\n                if (!(v === 0))\n                    return Plural.Many;\n                return Plural.Other;\n            case 'he':\n                if (i === 1 && v === 0)\n                    return Plural.One;\n                if (i === 2 && v === 0)\n                    return Plural.Two;\n                if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'is':\n                if (t === 0 && i % 10 === 1 && !(i % 100 === 11) || !(t === 0))\n                    return Plural.One;\n                return Plural.Other;\n            case 'ksh':\n                if (n === 0)\n                    return Plural.Zero;\n                if (n === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'kw':\n            case 'naq':\n            case 'se':\n            case 'smn':\n                if (n === 1)\n                    return Plural.One;\n                if (n === 2)\n                    return Plural.Two;\n                return Plural.Other;\n            case 'lag':\n                if (n === 0)\n                    return Plural.Zero;\n                if ((i === 0 || i === 1) && !(n === 0))\n                    return Plural.One;\n                return Plural.Other;\n            case 'lt':\n                if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19))\n                    return Plural.One;\n                if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 9 &&\n                    !(n % 100 >= 11 && n % 100 <= 19))\n                    return Plural.Few;\n                if (!(f === 0))\n                    return Plural.Many;\n                return Plural.Other;\n            case 'lv':\n            case 'prg':\n                if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 ||\n                    v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19)\n                    return Plural.Zero;\n                if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) ||\n                    !(v === 2) && f % 10 === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'mk':\n                if (v === 0 && i % 10 === 1 || f % 10 === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'mt':\n                if (n === 1)\n                    return Plural.One;\n                if (n === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 2 && n % 100 <= 10)\n                    return Plural.Few;\n                if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'pl':\n                if (i === 1 && v === 0)\n                    return Plural.One;\n                if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n                    !(i % 100 >= 12 && i % 100 <= 14))\n                    return Plural.Few;\n                if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 ||\n                    v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n                    v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'pt':\n                if (n === Math.floor(n) && n >= 0 && n <= 2 && !(n === 2))\n                    return Plural.One;\n                return Plural.Other;\n            case 'ro':\n                if (i === 1 && v === 0)\n                    return Plural.One;\n                if (!(v === 0) || n === 0 ||\n                    !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19)\n                    return Plural.Few;\n                return Plural.Other;\n            case 'ru':\n            case 'uk':\n                if (v === 0 && i % 10 === 1 && !(i % 100 === 11))\n                    return Plural.One;\n                if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n                    !(i % 100 >= 12 && i % 100 <= 14))\n                    return Plural.Few;\n                if (v === 0 && i % 10 === 0 ||\n                    v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n                    v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14)\n                    return Plural.Many;\n                return Plural.Other;\n            case 'shi':\n                if (i === 0 || n === 1)\n                    return Plural.One;\n                if (n === Math.floor(n) && n >= 2 && n <= 10)\n                    return Plural.Few;\n                return Plural.Other;\n            case 'si':\n                if (n === 0 || n === 1 || i === 0 && f === 1)\n                    return Plural.One;\n                return Plural.Other;\n            case 'sl':\n                if (v === 0 && i % 100 === 1)\n                    return Plural.One;\n                if (v === 0 && i % 100 === 2)\n                    return Plural.Two;\n                if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || !(v === 0))\n                    return Plural.Few;\n                return Plural.Other;\n            case 'tzm':\n                if (n === Math.floor(n) && n >= 0 && n <= 1 || n === Math.floor(n) && n >= 11 && n <= 99)\n                    return Plural.One;\n                return Plural.Other;\n            default:\n                return Plural.Other;\n        }\n    }\n\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isListLikeIterable(obj) {\n        if (!isJsObject(obj))\n            return false;\n        return Array.isArray(obj) ||\n            (!(obj instanceof Map) &&\n                getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop\n    }\n\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Adds and removes CSS classes on an HTML element.\n     *\n     * \\@howToUse\n     * ```\n     *     <some-element [ngClass]=\"'first second'\">...</some-element>\n     *\n     *     <some-element [ngClass]=\"['first', 'second']\">...</some-element>\n     *\n     *     <some-element [ngClass]=\"{'first': true, 'second': true, 'third': false}\">...</some-element>\n     *\n     *     <some-element [ngClass]=\"stringExp|arrayExp|objExp\">...</some-element>\n     *\n     *     <some-element [ngClass]=\"{'class1 class2 class3' : true}\">...</some-element>\n     * ```\n     *\n     * \\@description\n     *\n     * The CSS classes are updated as follows, depending on the type of the expression evaluation:\n     * - `string` - the CSS classes listed in the string (space delimited) are added,\n     * - `Array` - the CSS classes declared as Array elements are added,\n     * - `Object` - keys are CSS classes that get added when the expression given in the value\n     *              evaluates to a truthy value, otherwise they are removed.\n     *\n     * \\@stable\n     */\n    var NgClass = (function () {\n        /**\n         * @param {?} _iterableDiffers\n         * @param {?} _keyValueDiffers\n         * @param {?} _ngEl\n         * @param {?} _renderer\n         */\n        function NgClass(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {\n            this._iterableDiffers = _iterableDiffers;\n            this._keyValueDiffers = _keyValueDiffers;\n            this._ngEl = _ngEl;\n            this._renderer = _renderer;\n            this._initialClasses = [];\n        }\n        Object.defineProperty(NgClass.prototype, \"klass\", {\n            /**\n             * @param {?} v\n             * @return {?}\n             */\n            set: function (v) {\n                this._applyInitialClasses(true);\n                this._initialClasses = typeof v === 'string' ? v.split(/\\s+/) : [];\n                this._applyInitialClasses(false);\n                this._applyClasses(this._rawClass, false);\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgClass.prototype, \"ngClass\", {\n            /**\n             * @param {?} v\n             * @return {?}\n             */\n            set: function (v) {\n                this._cleanupClasses(this._rawClass);\n                this._iterableDiffer = null;\n                this._keyValueDiffer = null;\n                this._rawClass = typeof v === 'string' ? v.split(/\\s+/) : v;\n                if (this._rawClass) {\n                    if (isListLikeIterable(this._rawClass)) {\n                        this._iterableDiffer = this._iterableDiffers.find(this._rawClass).create(null);\n                    }\n                    else {\n                        this._keyValueDiffer = this._keyValueDiffers.find(this._rawClass).create(null);\n                    }\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        NgClass.prototype.ngDoCheck = function () {\n            if (this._iterableDiffer) {\n                var /** @type {?} */ changes = this._iterableDiffer.diff(this._rawClass);\n                if (changes) {\n                    this._applyIterableChanges(changes);\n                }\n            }\n            else if (this._keyValueDiffer) {\n                var /** @type {?} */ changes = this._keyValueDiffer.diff(this._rawClass);\n                if (changes) {\n                    this._applyKeyValueChanges(changes);\n                }\n            }\n        };\n        /**\n         * @param {?} rawClassVal\n         * @return {?}\n         */\n        NgClass.prototype._cleanupClasses = function (rawClassVal) {\n            this._applyClasses(rawClassVal, true);\n            this._applyInitialClasses(false);\n        };\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgClass.prototype._applyKeyValueChanges = function (changes) {\n            var _this = this;\n            changes.forEachAddedItem(function (record) { return _this._toggleClass(record.key, record.currentValue); });\n            changes.forEachChangedItem(function (record) { return _this._toggleClass(record.key, record.currentValue); });\n            changes.forEachRemovedItem(function (record) {\n                if (record.previousValue) {\n                    _this._toggleClass(record.key, false);\n                }\n            });\n        };\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgClass.prototype._applyIterableChanges = function (changes) {\n            var _this = this;\n            changes.forEachAddedItem(function (record) {\n                if (typeof record.item === 'string') {\n                    _this._toggleClass(record.item, true);\n                }\n                else {\n                    throw new Error(\"NgClass can only toggle CSS classes expressed as strings, got \" + stringify(record.item));\n                }\n            });\n            changes.forEachRemovedItem(function (record) { return _this._toggleClass(record.item, false); });\n        };\n        /**\n         * @param {?} isCleanup\n         * @return {?}\n         */\n        NgClass.prototype._applyInitialClasses = function (isCleanup) {\n            var _this = this;\n            this._initialClasses.forEach(function (klass) { return _this._toggleClass(klass, !isCleanup); });\n        };\n        /**\n         * @param {?} rawClassVal\n         * @param {?} isCleanup\n         * @return {?}\n         */\n        NgClass.prototype._applyClasses = function (rawClassVal, isCleanup) {\n            var _this = this;\n            if (rawClassVal) {\n                if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {\n                    ((rawClassVal)).forEach(function (klass) { return _this._toggleClass(klass, !isCleanup); });\n                }\n                else {\n                    Object.keys(rawClassVal).forEach(function (klass) {\n                        if (rawClassVal[klass] != null)\n                            _this._toggleClass(klass, !isCleanup);\n                    });\n                }\n            }\n        };\n        /**\n         * @param {?} klass\n         * @param {?} enabled\n         * @return {?}\n         */\n        NgClass.prototype._toggleClass = function (klass, enabled) {\n            var _this = this;\n            klass = klass.trim();\n            if (klass) {\n                klass.split(/\\s+/g).forEach(function (klass) { _this._renderer.setElementClass(_this._ngEl.nativeElement, klass, enabled); });\n            }\n        };\n        NgClass.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngClass]' },] },\n        ];\n        /** @nocollapse */\n        NgClass.ctorParameters = function () { return [\n            { type: _angular_core.IterableDiffers, },\n            { type: _angular_core.KeyValueDiffers, },\n            { type: _angular_core.ElementRef, },\n            { type: _angular_core.Renderer, },\n        ]; };\n        NgClass.propDecorators = {\n            'klass': [{ type: _angular_core.Input, args: ['class',] },],\n            'ngClass': [{ type: _angular_core.Input },],\n        };\n        return NgClass;\n    }());\n\n    var NgForRow = (function () {\n        /**\n         * @param {?} $implicit\n         * @param {?} index\n         * @param {?} count\n         */\n        function NgForRow($implicit, index, count) {\n            this.$implicit = $implicit;\n            this.index = index;\n            this.count = count;\n        }\n        Object.defineProperty(NgForRow.prototype, \"first\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.index === 0; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgForRow.prototype, \"last\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.index === this.count - 1; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgForRow.prototype, \"even\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.index % 2 === 0; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgForRow.prototype, \"odd\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return !this.even; },\n            enumerable: true,\n            configurable: true\n        });\n        return NgForRow;\n    }());\n    /**\n     * The `NgFor` directive instantiates a template once per item from an iterable. The context for\n     * each instantiated template inherits from the outer context with the given loop variable set\n     * to the current item from the iterable.\n     *\n     * ### Local Variables\n     *\n     * `NgFor` provides several exported values that can be aliased to local variables:\n     *\n     * * `index` will be set to the current loop iteration for each template context.\n     * * `first` will be set to a boolean value indicating whether the item is the first one in the\n     *   iteration.\n     * * `last` will be set to a boolean value indicating whether the item is the last one in the\n     *   iteration.\n     * * `even` will be set to a boolean value indicating whether this item has an even index.\n     * * `odd` will be set to a boolean value indicating whether this item has an odd index.\n     *\n     * ### Change Propagation\n     *\n     * When the contents of the iterator changes, `NgFor` makes the corresponding changes to the DOM:\n     *\n     * * When an item is added, a new instance of the template is added to the DOM.\n     * * When an item is removed, its template instance is removed from the DOM.\n     * * When items are reordered, their respective templates are reordered in the DOM.\n     * * Otherwise, the DOM element for that item will remain the same.\n     *\n     * Angular uses object identity to track insertions and deletions within the iterator and reproduce\n     * those changes in the DOM. This has important implications for animations and any stateful\n     * controls\n     * (such as `<input>` elements which accept user input) that are present. Inserted rows can be\n     * animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state such\n     * as user input.\n     *\n     * It is possible for the identities of elements in the iterator to change while the data does not.\n     * This can happen, for example, if the iterator produced from an RPC to the server, and that\n     * RPC is re-run. Even if the data hasn't changed, the second response will produce objects with\n     * different identities, and Angular will tear down the entire DOM and rebuild it (as if all old\n     * elements were deleted and all new elements inserted). This is an expensive operation and should\n     * be avoided if possible.\n     *\n     * To customize the default tracking algorithm, `NgFor` supports `trackBy` option.\n     * `trackBy` takes a function which has two arguments: `index` and `item`.\n     * If `trackBy` is given, Angular tracks changes by the return value of the function.\n     *\n     * ### Syntax\n     *\n     * - `<li *ngFor=\"let item of items; let i = index; trackBy: trackByFn\">...</li>`\n     * - `<li template=\"ngFor let item of items; let i = index; trackBy: trackByFn\">...</li>`\n     *\n     * With `<template>` element:\n     *\n     * ```\n     * <template ngFor let-item [ngForOf]=\"items\" let-i=\"index\" [ngForTrackBy]=\"trackByFn\">\n     *   <li>...</li>\n     * </template>\n     * ```\n     *\n     * ### Example\n     *\n     * See a [live demo](http://plnkr.co/edit/KVuXxDp0qinGDyo307QW?p=preview) for a more detailed\n     * example.\n     *\n     * \\@stable\n     */\n    var NgFor = (function () {\n        /**\n         * @param {?} _viewContainer\n         * @param {?} _template\n         * @param {?} _differs\n         * @param {?} _cdr\n         */\n        function NgFor(_viewContainer, _template, _differs, _cdr) {\n            this._viewContainer = _viewContainer;\n            this._template = _template;\n            this._differs = _differs;\n            this._cdr = _cdr;\n            this._differ = null;\n        }\n        Object.defineProperty(NgFor.prototype, \"ngForTrackBy\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._trackByFn; },\n            /**\n             * @param {?} fn\n             * @return {?}\n             */\n            set: function (fn) {\n                if (_angular_core.isDevMode() && fn != null && typeof fn !== 'function') {\n                    // TODO(vicb): use a log service once there is a public one available\n                    if ((console) && (console.warn)) {\n                        console.warn((\"trackBy must be a function, but received \" + JSON.stringify(fn) + \". \") +\n                            \"See https://angular.io/docs/ts/latest/api/common/index/NgFor-directive.html#!#change-propagation for more information.\");\n                    }\n                }\n                this._trackByFn = fn;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgFor.prototype, \"ngForTemplate\", {\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) {\n                if (value) {\n                    this._template = value;\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgFor.prototype.ngOnChanges = function (changes) {\n            if ('ngForOf' in changes) {\n                // React on ngForOf changes only once all inputs have been initialized\n                var /** @type {?} */ value = changes['ngForOf'].currentValue;\n                if (!this._differ && value) {\n                    try {\n                        this._differ = this._differs.find(value).create(this._cdr, this.ngForTrackBy);\n                    }\n                    catch (e) {\n                        throw new Error(\"Cannot find a differ supporting object '\" + value + \"' of type '\" + getTypeNameForDebugging(value) + \"'. NgFor only supports binding to Iterables such as Arrays.\");\n                    }\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        NgFor.prototype.ngDoCheck = function () {\n            if (this._differ) {\n                var /** @type {?} */ changes = this._differ.diff(this.ngForOf);\n                if (changes)\n                    this._applyChanges(changes);\n            }\n        };\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgFor.prototype._applyChanges = function (changes) {\n            var _this = this;\n            var /** @type {?} */ insertTuples = [];\n            changes.forEachOperation(function (item, adjustedPreviousIndex, currentIndex) {\n                if (item.previousIndex == null) {\n                    var /** @type {?} */ view = _this._viewContainer.createEmbeddedView(_this._template, new NgForRow(null, null, null), currentIndex);\n                    var /** @type {?} */ tuple = new RecordViewTuple(item, view);\n                    insertTuples.push(tuple);\n                }\n                else if (currentIndex == null) {\n                    _this._viewContainer.remove(adjustedPreviousIndex);\n                }\n                else {\n                    var /** @type {?} */ view = _this._viewContainer.get(adjustedPreviousIndex);\n                    _this._viewContainer.move(view, currentIndex);\n                    var /** @type {?} */ tuple = new RecordViewTuple(item, /** @type {?} */ (view));\n                    insertTuples.push(tuple);\n                }\n            });\n            for (var /** @type {?} */ i = 0; i < insertTuples.length; i++) {\n                this._perViewChange(insertTuples[i].view, insertTuples[i].record);\n            }\n            for (var /** @type {?} */ i = 0, /** @type {?} */ ilen = this._viewContainer.length; i < ilen; i++) {\n                var /** @type {?} */ viewRef = (this._viewContainer.get(i));\n                viewRef.context.index = i;\n                viewRef.context.count = ilen;\n            }\n            changes.forEachIdentityChange(function (record) {\n                var /** @type {?} */ viewRef = (_this._viewContainer.get(record.currentIndex));\n                viewRef.context.$implicit = record.item;\n            });\n        };\n        /**\n         * @param {?} view\n         * @param {?} record\n         * @return {?}\n         */\n        NgFor.prototype._perViewChange = function (view, record) {\n            view.context.$implicit = record.item;\n        };\n        NgFor.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngFor][ngForOf]' },] },\n        ];\n        /** @nocollapse */\n        NgFor.ctorParameters = function () { return [\n            { type: _angular_core.ViewContainerRef, },\n            { type: _angular_core.TemplateRef, },\n            { type: _angular_core.IterableDiffers, },\n            { type: _angular_core.ChangeDetectorRef, },\n        ]; };\n        NgFor.propDecorators = {\n            'ngForOf': [{ type: _angular_core.Input },],\n            'ngForTrackBy': [{ type: _angular_core.Input },],\n            'ngForTemplate': [{ type: _angular_core.Input },],\n        };\n        return NgFor;\n    }());\n    var RecordViewTuple = (function () {\n        /**\n         * @param {?} record\n         * @param {?} view\n         */\n        function RecordViewTuple(record, view) {\n            this.record = record;\n            this.view = view;\n        }\n        return RecordViewTuple;\n    }());\n\n    /**\n     * Removes or recreates a portion of the DOM tree based on an {expression}.\n     *\n     * If the expression assigned to `ngIf` evaluates to a falsy value then the element\n     * is removed from the DOM, otherwise a clone of the element is reinserted into the DOM.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/fe0kgemFBtmQOY31b4tw?p=preview)):\n     *\n     * ```\n     * <div *ngIf=\"errorCount > 0\" class=\"error\">\n     *   <!-- Error message displayed when the errorCount property in the current context is greater\n     * than 0. -->\n     *   {{errorCount}} errors detected\n     * </div>\n     * ```\n     *\n     * ### Syntax\n     *\n     * - `<div *ngIf=\"condition\">...</div>`\n     * - `<div template=\"ngIf condition\">...</div>`\n     * - `<template [ngIf]=\"condition\"><div>...</div></template>`\n     *\n     * \\@stable\n     */\n    var NgIf = (function () {\n        /**\n         * @param {?} _viewContainer\n         * @param {?} _template\n         */\n        function NgIf(_viewContainer, _template) {\n            this._viewContainer = _viewContainer;\n            this._template = _template;\n            this._hasView = false;\n        }\n        Object.defineProperty(NgIf.prototype, \"ngIf\", {\n            /**\n             * @param {?} condition\n             * @return {?}\n             */\n            set: function (condition) {\n                if (condition && !this._hasView) {\n                    this._hasView = true;\n                    this._viewContainer.createEmbeddedView(this._template);\n                }\n                else if (!condition && this._hasView) {\n                    this._hasView = false;\n                    this._viewContainer.clear();\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        NgIf.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngIf]' },] },\n        ];\n        /** @nocollapse */\n        NgIf.ctorParameters = function () { return [\n            { type: _angular_core.ViewContainerRef, },\n            { type: _angular_core.TemplateRef, },\n        ]; };\n        NgIf.propDecorators = {\n            'ngIf': [{ type: _angular_core.Input },],\n        };\n        return NgIf;\n    }());\n\n    var SwitchView = (function () {\n        /**\n         * @param {?} _viewContainerRef\n         * @param {?} _templateRef\n         */\n        function SwitchView(_viewContainerRef, _templateRef) {\n            this._viewContainerRef = _viewContainerRef;\n            this._templateRef = _templateRef;\n            this._created = false;\n        }\n        /**\n         * @return {?}\n         */\n        SwitchView.prototype.create = function () {\n            this._created = true;\n            this._viewContainerRef.createEmbeddedView(this._templateRef);\n        };\n        /**\n         * @return {?}\n         */\n        SwitchView.prototype.destroy = function () {\n            this._created = false;\n            this._viewContainerRef.clear();\n        };\n        /**\n         * @param {?} created\n         * @return {?}\n         */\n        SwitchView.prototype.enforceState = function (created) {\n            if (created && !this._created) {\n                this.create();\n            }\n            else if (!created && this._created) {\n                this.destroy();\n            }\n        };\n        return SwitchView;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Adds / removes DOM sub-trees when the nest match expressions matches the switch\n     *             expression.\n     *\n     * \\@howToUse\n     * ```\n     *     <container-element [ngSwitch]=\"switch_expression\">\n     *       <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n     *       <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n     *       <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n     *       <ng-container *ngSwitchCase=\"match_expression_3\">\n     *         <!-- use a ng-container to group multiple root nodes -->\n     *         <inner-element></inner-element>\n     *         <inner-other-element></inner-other-element>\n     *       </ng-container>\n     *       <some-element *ngSwitchDefault>...</some-element>\n     *     </container-element>\n     * ```\n     * \\@description\n     *\n     * `NgSwitch` stamps out nested views when their match expression value matches the value of the\n     * switch expression.\n     *\n     * In other words:\n     * - you define a container element (where you place the directive with a switch expression on the\n     * `[ngSwitch]=\"...\"` attribute)\n     * - you define inner views inside the `NgSwitch` and place a `*ngSwitchCase` attribute on the view\n     * root elements.\n     *\n     * Elements within `NgSwitch` but outside of a `NgSwitchCase` or `NgSwitchDefault` directives will\n     * be preserved at the location.\n     *\n     * The `ngSwitchCase` directive informs the parent `NgSwitch` of which view to display when the\n     * expression is evaluated.\n     * When no matching expression is found on a `ngSwitchCase` view, the `ngSwitchDefault` view is\n     * stamped out.\n     *\n     * \\@stable\n     */\n    var NgSwitch = (function () {\n        function NgSwitch() {\n            this._defaultUsed = false;\n            this._caseCount = 0;\n            this._lastCaseCheckIndex = 0;\n            this._lastCasesMatched = false;\n        }\n        Object.defineProperty(NgSwitch.prototype, \"ngSwitch\", {\n            /**\n             * @param {?} newValue\n             * @return {?}\n             */\n            set: function (newValue) {\n                this._ngSwitch = newValue;\n                if (this._caseCount === 0) {\n                    this._updateDefaultCases(true);\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        NgSwitch.prototype._addCase = function () { return this._caseCount++; };\n        /**\n         * \\@internal\n         * @param {?} view\n         * @return {?}\n         */\n        NgSwitch.prototype._addDefault = function (view) {\n            if (!this._defaultViews) {\n                this._defaultViews = [];\n            }\n            this._defaultViews.push(view);\n        };\n        /**\n         * \\@internal\n         * @param {?} value\n         * @return {?}\n         */\n        NgSwitch.prototype._matchCase = function (value) {\n            var /** @type {?} */ matched = value == this._ngSwitch;\n            this._lastCasesMatched = this._lastCasesMatched || matched;\n            this._lastCaseCheckIndex++;\n            if (this._lastCaseCheckIndex === this._caseCount) {\n                this._updateDefaultCases(!this._lastCasesMatched);\n                this._lastCaseCheckIndex = 0;\n                this._lastCasesMatched = false;\n            }\n            return matched;\n        };\n        /**\n         * @param {?} useDefault\n         * @return {?}\n         */\n        NgSwitch.prototype._updateDefaultCases = function (useDefault) {\n            if (this._defaultViews && useDefault !== this._defaultUsed) {\n                this._defaultUsed = useDefault;\n                for (var /** @type {?} */ i = 0; i < this._defaultViews.length; i++) {\n                    var /** @type {?} */ defaultView = this._defaultViews[i];\n                    defaultView.enforceState(useDefault);\n                }\n            }\n        };\n        NgSwitch.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngSwitch]' },] },\n        ];\n        /** @nocollapse */\n        NgSwitch.ctorParameters = function () { return []; };\n        NgSwitch.propDecorators = {\n            'ngSwitch': [{ type: _angular_core.Input },],\n        };\n        return NgSwitch;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Creates a view that will be added/removed from the parent {\\@link NgSwitch} when the\n     *             given expression evaluate to respectively the same/different value as the switch\n     *             expression.\n     *\n     * \\@howToUse\n     * ```\n     * <container-element [ngSwitch]=\"switch_expression\">\n     *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n     * </container-element>\n     * ```\n     * \\@description\n     *\n     * Insert the sub-tree when the expression evaluates to the same value as the enclosing switch\n     * expression.\n     *\n     * If multiple match expressions match the switch expression value, all of them are displayed.\n     *\n     * See {\\@link NgSwitch} for more details and example.\n     *\n     * \\@stable\n     */\n    var NgSwitchCase = (function () {\n        /**\n         * @param {?} viewContainer\n         * @param {?} templateRef\n         * @param {?} ngSwitch\n         */\n        function NgSwitchCase(viewContainer, templateRef, ngSwitch) {\n            this.ngSwitch = ngSwitch;\n            ngSwitch._addCase();\n            this._view = new SwitchView(viewContainer, templateRef);\n        }\n        /**\n         * @return {?}\n         */\n        NgSwitchCase.prototype.ngDoCheck = function () { this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase)); };\n        NgSwitchCase.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngSwitchCase]' },] },\n        ];\n        /** @nocollapse */\n        NgSwitchCase.ctorParameters = function () { return [\n            { type: _angular_core.ViewContainerRef, },\n            { type: _angular_core.TemplateRef, },\n            { type: NgSwitch, decorators: [{ type: _angular_core.Host },] },\n        ]; };\n        NgSwitchCase.propDecorators = {\n            'ngSwitchCase': [{ type: _angular_core.Input },],\n        };\n        return NgSwitchCase;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Creates a view that is added to the parent {\\@link NgSwitch} when no case expressions\n     * match the\n     *             switch expression.\n     *\n     * \\@howToUse\n     * ```\n     * <container-element [ngSwitch]=\"switch_expression\">\n     *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n     *   <some-other-element *ngSwitchDefault>...</some-other-element>\n     * </container-element>\n     * ```\n     *\n     * \\@description\n     *\n     * Insert the sub-tree when no case expressions evaluate to the same value as the enclosing switch\n     * expression.\n     *\n     * See {\\@link NgSwitch} for more details and example.\n     *\n     * \\@stable\n     */\n    var NgSwitchDefault = (function () {\n        /**\n         * @param {?} viewContainer\n         * @param {?} templateRef\n         * @param {?} ngSwitch\n         */\n        function NgSwitchDefault(viewContainer, templateRef, ngSwitch) {\n            ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));\n        }\n        NgSwitchDefault.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngSwitchDefault]' },] },\n        ];\n        /** @nocollapse */\n        NgSwitchDefault.ctorParameters = function () { return [\n            { type: _angular_core.ViewContainerRef, },\n            { type: _angular_core.TemplateRef, },\n            { type: NgSwitch, decorators: [{ type: _angular_core.Host },] },\n        ]; };\n        return NgSwitchDefault;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.\n     *\n     * \\@howToUse\n     * ```\n     * <some-element [ngPlural]=\"value\">\n     *   <template ngPluralCase=\"=0\">there is nothing</template>\n     *   <template ngPluralCase=\"=1\">there is one</template>\n     *   <template ngPluralCase=\"few\">there are a few</template>\n     * </some-element>\n     * ```\n     *\n     * \\@description\n     *\n     * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees\n     * that match the switch expression's pluralization category.\n     *\n     * To use this directive you must provide a container element that sets the `[ngPlural]` attribute\n     * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their\n     * expression:\n     * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value\n     *   matches the switch expression exactly,\n     * - otherwise, the view will be treated as a \"category match\", and will only display if exact\n     *   value matches aren't found and the value maps to its category for the defined locale.\n     *\n     * See http://cldr.unicode.org/index/cldr-spec/plural-rules\n     *\n     * \\@experimental\n     */\n    var NgPlural = (function () {\n        /**\n         * @param {?} _localization\n         */\n        function NgPlural(_localization) {\n            this._localization = _localization;\n            this._caseViews = {};\n        }\n        Object.defineProperty(NgPlural.prototype, \"ngPlural\", {\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) {\n                this._switchValue = value;\n                this._updateView();\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} value\n         * @param {?} switchView\n         * @return {?}\n         */\n        NgPlural.prototype.addCase = function (value, switchView) { this._caseViews[value] = switchView; };\n        /**\n         * @return {?}\n         */\n        NgPlural.prototype._updateView = function () {\n            this._clearViews();\n            var /** @type {?} */ cases = Object.keys(this._caseViews);\n            var /** @type {?} */ key = getPluralCategory(this._switchValue, cases, this._localization);\n            this._activateView(this._caseViews[key]);\n        };\n        /**\n         * @return {?}\n         */\n        NgPlural.prototype._clearViews = function () {\n            if (this._activeView)\n                this._activeView.destroy();\n        };\n        /**\n         * @param {?} view\n         * @return {?}\n         */\n        NgPlural.prototype._activateView = function (view) {\n            if (view) {\n                this._activeView = view;\n                this._activeView.create();\n            }\n        };\n        NgPlural.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngPlural]' },] },\n        ];\n        /** @nocollapse */\n        NgPlural.ctorParameters = function () { return [\n            { type: NgLocalization, },\n        ]; };\n        NgPlural.propDecorators = {\n            'ngPlural': [{ type: _angular_core.Input },],\n        };\n        return NgPlural;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Creates a view that will be added/removed from the parent {\\@link NgPlural} when the\n     *             given expression matches the plural expression according to CLDR rules.\n     *\n     * \\@howToUse\n     * ```\n     * <some-element [ngPlural]=\"value\">\n     *   <template ngPluralCase=\"=0\">...</template>\n     *   <template ngPluralCase=\"other\">...</template>\n     * </some-element>\n     * ```\n     *\n     * See {\\@link NgPlural} for more details and example.\n     *\n     * \\@experimental\n     */\n    var NgPluralCase = (function () {\n        /**\n         * @param {?} value\n         * @param {?} template\n         * @param {?} viewContainer\n         * @param {?} ngPlural\n         */\n        function NgPluralCase(value, template, viewContainer, ngPlural) {\n            this.value = value;\n            var isANumber = !isNaN(Number(value));\n            ngPlural.addCase(isANumber ? \"=\" + value : value, new SwitchView(viewContainer, template));\n        }\n        NgPluralCase.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngPluralCase]' },] },\n        ];\n        /** @nocollapse */\n        NgPluralCase.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Attribute, args: ['ngPluralCase',] },] },\n            { type: _angular_core.TemplateRef, },\n            { type: _angular_core.ViewContainerRef, },\n            { type: NgPlural, decorators: [{ type: _angular_core.Host },] },\n        ]; };\n        return NgPluralCase;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Update an HTML element styles.\n     *\n     * \\@howToUse\n     * ```\n     * <some-element [ngStyle]=\"{'font-style': styleExp}\">...</some-element>\n     *\n     * <some-element [ngStyle]=\"{'max-width.px': widthExp}\">...</some-element>\n     *\n     * <some-element [ngStyle]=\"objExp\">...</some-element>\n     * ```\n     *\n     * \\@description\n     *\n     * The styles are updated according to the value of the expression evaluation:\n     * - keys are style names with an optional `.<unit>` suffix (ie 'top.px', 'font-style.em'),\n     * - values are the values assigned to those properties (expressed in the given unit).\n     *\n     * \\@stable\n     */\n    var NgStyle = (function () {\n        /**\n         * @param {?} _differs\n         * @param {?} _ngEl\n         * @param {?} _renderer\n         */\n        function NgStyle(_differs, _ngEl, _renderer) {\n            this._differs = _differs;\n            this._ngEl = _ngEl;\n            this._renderer = _renderer;\n        }\n        Object.defineProperty(NgStyle.prototype, \"ngStyle\", {\n            /**\n             * @param {?} v\n             * @return {?}\n             */\n            set: function (v) {\n                this._ngStyle = v;\n                if (!this._differ && v) {\n                    this._differ = this._differs.find(v).create(null);\n                }\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        NgStyle.prototype.ngDoCheck = function () {\n            if (this._differ) {\n                var /** @type {?} */ changes = this._differ.diff(this._ngStyle);\n                if (changes) {\n                    this._applyChanges(changes);\n                }\n            }\n        };\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgStyle.prototype._applyChanges = function (changes) {\n            var _this = this;\n            changes.forEachRemovedItem(function (record) { return _this._setStyle(record.key, null); });\n            changes.forEachAddedItem(function (record) { return _this._setStyle(record.key, record.currentValue); });\n            changes.forEachChangedItem(function (record) { return _this._setStyle(record.key, record.currentValue); });\n        };\n        /**\n         * @param {?} nameAndUnit\n         * @param {?} value\n         * @return {?}\n         */\n        NgStyle.prototype._setStyle = function (nameAndUnit, value) {\n            var _a = nameAndUnit.split('.'), name = _a[0], unit = _a[1];\n            value = value && unit ? \"\" + value + unit : value;\n            this._renderer.setElementStyle(this._ngEl.nativeElement, name, value);\n        };\n        NgStyle.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngStyle]' },] },\n        ];\n        /** @nocollapse */\n        NgStyle.ctorParameters = function () { return [\n            { type: _angular_core.KeyValueDiffers, },\n            { type: _angular_core.ElementRef, },\n            { type: _angular_core.Renderer, },\n        ]; };\n        NgStyle.propDecorators = {\n            'ngStyle': [{ type: _angular_core.Input },],\n        };\n        return NgStyle;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     *\n     * \\@whatItDoes Inserts an embedded view from a prepared `TemplateRef`\n     *\n     * \\@howToUse\n     * ```\n     * <template [ngTemplateOutlet]=\"templateRefExpression\"\n     *           [ngOutletContext]=\"objectExpression\">\n     * </template>\n     * ```\n     *\n     * \\@description\n     *\n     * You can attach a context object to the `EmbeddedViewRef` by setting `[ngOutletContext]`.\n     * `[ngOutletContext]` should be an object, the object's keys will be the local template variables\n     * available within the `TemplateRef`.\n     *\n     * Note: using the key `$implicit` in the context object will set it's value as default.\n     *\n     * \\@experimental\n     */\n    var NgTemplateOutlet = (function () {\n        /**\n         * @param {?} _viewContainerRef\n         */\n        function NgTemplateOutlet(_viewContainerRef) {\n            this._viewContainerRef = _viewContainerRef;\n        }\n        Object.defineProperty(NgTemplateOutlet.prototype, \"ngOutletContext\", {\n            /**\n             * @param {?} context\n             * @return {?}\n             */\n            set: function (context) { this._context = context; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(NgTemplateOutlet.prototype, \"ngTemplateOutlet\", {\n            /**\n             * @param {?} templateRef\n             * @return {?}\n             */\n            set: function (templateRef) { this._templateRef = templateRef; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} changes\n         * @return {?}\n         */\n        NgTemplateOutlet.prototype.ngOnChanges = function (changes) {\n            if (this._viewRef) {\n                this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef));\n            }\n            if (this._templateRef) {\n                this._viewRef = this._viewContainerRef.createEmbeddedView(this._templateRef, this._context);\n            }\n        };\n        NgTemplateOutlet.decorators = [\n            { type: _angular_core.Directive, args: [{ selector: '[ngTemplateOutlet]' },] },\n        ];\n        /** @nocollapse */\n        NgTemplateOutlet.ctorParameters = function () { return [\n            { type: _angular_core.ViewContainerRef, },\n        ]; };\n        NgTemplateOutlet.propDecorators = {\n            'ngOutletContext': [{ type: _angular_core.Input },],\n            'ngTemplateOutlet': [{ type: _angular_core.Input },],\n        };\n        return NgTemplateOutlet;\n    }());\n\n    /**\n     * A collection of Angular directives that are likely to be used in each and every Angular\n     * application.\n     */\n    var /** @type {?} */ COMMON_DIRECTIVES = [\n        NgClass,\n        NgFor,\n        NgIf,\n        NgTemplateOutlet,\n        NgStyle,\n        NgSwitch,\n        NgSwitchCase,\n        NgSwitchDefault,\n        NgPlural,\n        NgPluralCase,\n    ];\n\n    var /** @type {?} */ isPromise = _angular_core.__core_private__.isPromise;\n    var /** @type {?} */ isObservable = _angular_core.__core_private__.isObservable;\n\n    var __extends$4 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@stable\n     */\n    var BaseError = (function (_super) {\n        __extends$4(BaseError, _super);\n        /**\n         * @param {?} message\n         */\n        function BaseError(message) {\n            _super.call(this, message);\n            // Errors don't use current this, instead they create a new instance.\n            // We have to do forward all of our api to the nativeInstance.\n            // TODO(bradfordcsmith): Remove this hack when\n            //     google/closure-compiler/issues/2102 is fixed.\n            var nativeError = new Error(message);\n            this._nativeError = nativeError;\n        }\n        Object.defineProperty(BaseError.prototype, \"message\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.message; },\n            /**\n             * @param {?} message\n             * @return {?}\n             */\n            set: function (message) { this._nativeError.message = message; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"name\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.name; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return ((this._nativeError)).stack; },\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) { ((this._nativeError)).stack = value; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n        return BaseError;\n    }(Error));\n    /**\n     * \\@stable\n     */\n    var WrappedError = (function (_super) {\n        __extends$4(WrappedError, _super);\n        /**\n         * @param {?} message\n         * @param {?} error\n         */\n        function WrappedError(message, error) {\n            _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n            this.originalError = error;\n        }\n        Object.defineProperty(WrappedError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n                    .stack;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return WrappedError;\n    }(BaseError));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$3 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var InvalidPipeArgumentError = (function (_super) {\n        __extends$3(InvalidPipeArgumentError, _super);\n        /**\n         * @param {?} type\n         * @param {?} value\n         */\n        function InvalidPipeArgumentError(type, value) {\n            _super.call(this, \"Invalid argument '\" + value + \"' for pipe '\" + stringify(type) + \"'\");\n        }\n        return InvalidPipeArgumentError;\n    }(BaseError));\n\n    var ObservableStrategy = (function () {\n        function ObservableStrategy() {\n        }\n        /**\n         * @param {?} async\n         * @param {?} updateLatestValue\n         * @return {?}\n         */\n        ObservableStrategy.prototype.createSubscription = function (async, updateLatestValue) {\n            return async.subscribe({ next: updateLatestValue, error: function (e) { throw e; } });\n        };\n        /**\n         * @param {?} subscription\n         * @return {?}\n         */\n        ObservableStrategy.prototype.dispose = function (subscription) { subscription.unsubscribe(); };\n        /**\n         * @param {?} subscription\n         * @return {?}\n         */\n        ObservableStrategy.prototype.onDestroy = function (subscription) { subscription.unsubscribe(); };\n        return ObservableStrategy;\n    }());\n    var PromiseStrategy = (function () {\n        function PromiseStrategy() {\n        }\n        /**\n         * @param {?} async\n         * @param {?} updateLatestValue\n         * @return {?}\n         */\n        PromiseStrategy.prototype.createSubscription = function (async, updateLatestValue) {\n            return async.then(updateLatestValue, function (e) { throw e; });\n        };\n        /**\n         * @param {?} subscription\n         * @return {?}\n         */\n        PromiseStrategy.prototype.dispose = function (subscription) { };\n        /**\n         * @param {?} subscription\n         * @return {?}\n         */\n        PromiseStrategy.prototype.onDestroy = function (subscription) { };\n        return PromiseStrategy;\n    }());\n    var /** @type {?} */ _promiseStrategy = new PromiseStrategy();\n    var /** @type {?} */ _observableStrategy = new ObservableStrategy();\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Unwraps a value from an asynchronous primitive.\n     * \\@howToUse `observable_or_promise_expression | async`\n     * \\@description\n     * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has\n     * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for\n     * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid\n     * potential memory leaks.\n     *\n     *\n     * ## Examples\n     *\n     * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the\n     * promise.\n     *\n     * {\\@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}\n     *\n     * It's also possible to use `async` with Observables. The example below binds the `time` Observable\n     * to the view. The Observable continuously updates the view with the current time.\n     *\n     * {\\@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}\n     *\n     * \\@stable\n     */\n    var AsyncPipe = (function () {\n        /**\n         * @param {?} _ref\n         */\n        function AsyncPipe(_ref) {\n            this._ref = _ref;\n            this._latestValue = null;\n            this._latestReturnedValue = null;\n            this._subscription = null;\n            this._obj = null;\n            this._strategy = null;\n        }\n        /**\n         * @return {?}\n         */\n        AsyncPipe.prototype.ngOnDestroy = function () {\n            if (this._subscription) {\n                this._dispose();\n            }\n        };\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        AsyncPipe.prototype.transform = function (obj) {\n            if (!this._obj) {\n                if (obj) {\n                    this._subscribe(obj);\n                }\n                this._latestReturnedValue = this._latestValue;\n                return this._latestValue;\n            }\n            if (obj !== this._obj) {\n                this._dispose();\n                return this.transform(obj);\n            }\n            if (this._latestValue === this._latestReturnedValue) {\n                return this._latestReturnedValue;\n            }\n            this._latestReturnedValue = this._latestValue;\n            return _angular_core.WrappedValue.wrap(this._latestValue);\n        };\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        AsyncPipe.prototype._subscribe = function (obj) {\n            var _this = this;\n            this._obj = obj;\n            this._strategy = this._selectStrategy(obj);\n            this._subscription = this._strategy.createSubscription(obj, function (value) { return _this._updateLatestValue(obj, value); });\n        };\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        AsyncPipe.prototype._selectStrategy = function (obj) {\n            if (isPromise(obj)) {\n                return _promiseStrategy;\n            }\n            if (isObservable(obj)) {\n                return _observableStrategy;\n            }\n            throw new InvalidPipeArgumentError(AsyncPipe, obj);\n        };\n        /**\n         * @return {?}\n         */\n        AsyncPipe.prototype._dispose = function () {\n            this._strategy.dispose(this._subscription);\n            this._latestValue = null;\n            this._latestReturnedValue = null;\n            this._subscription = null;\n            this._obj = null;\n        };\n        /**\n         * @param {?} async\n         * @param {?} value\n         * @return {?}\n         */\n        AsyncPipe.prototype._updateLatestValue = function (async, value) {\n            if (async === this._obj) {\n                this._latestValue = value;\n                this._ref.markForCheck();\n            }\n        };\n        AsyncPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'async', pure: false },] },\n        ];\n        /** @nocollapse */\n        AsyncPipe.ctorParameters = function () { return [\n            { type: _angular_core.ChangeDetectorRef, },\n        ]; };\n        return AsyncPipe;\n    }());\n\n    var NumberFormatStyle = {};\n    NumberFormatStyle.Decimal = 0;\n    NumberFormatStyle.Percent = 1;\n    NumberFormatStyle.Currency = 2;\n    NumberFormatStyle[NumberFormatStyle.Decimal] = \"Decimal\";\n    NumberFormatStyle[NumberFormatStyle.Percent] = \"Percent\";\n    NumberFormatStyle[NumberFormatStyle.Currency] = \"Currency\";\n    var NumberFormatter = (function () {\n        function NumberFormatter() {\n        }\n        /**\n         * @param {?} num\n         * @param {?} locale\n         * @param {?} style\n         * @param {?=} __3\n         * @return {?}\n         */\n        NumberFormatter.format = function (num, locale, style, _a) {\n            var _b = _a === void 0 ? {} : _a, minimumIntegerDigits = _b.minimumIntegerDigits, minimumFractionDigits = _b.minimumFractionDigits, maximumFractionDigits = _b.maximumFractionDigits, currency = _b.currency, _c = _b.currencyAsSymbol, currencyAsSymbol = _c === void 0 ? false : _c;\n            var /** @type {?} */ options = {\n                minimumIntegerDigits: minimumIntegerDigits,\n                minimumFractionDigits: minimumFractionDigits,\n                maximumFractionDigits: maximumFractionDigits,\n                style: NumberFormatStyle[style].toLowerCase()\n            };\n            if (style == NumberFormatStyle.Currency) {\n                options.currency = currency;\n                options.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';\n            }\n            return new Intl.NumberFormat(locale, options).format(num);\n        };\n        return NumberFormatter;\n    }());\n    var /** @type {?} */ DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsazZEwGjJ']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|J+|j+|m+|s+|a|z|Z|G+|w+))(.*)/;\n    var /** @type {?} */ PATTERN_ALIASES = {\n        // Keys are quoted so they do not get renamed during closure compilation.\n        'yMMMdjms': datePartGetterFactory(combine([\n            digitCondition('year', 1),\n            nameCondition('month', 3),\n            digitCondition('day', 1),\n            digitCondition('hour', 1),\n            digitCondition('minute', 1),\n            digitCondition('second', 1),\n        ])),\n        'yMdjm': datePartGetterFactory(combine([\n            digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1),\n            digitCondition('hour', 1), digitCondition('minute', 1)\n        ])),\n        'yMMMMEEEEd': datePartGetterFactory(combine([\n            digitCondition('year', 1), nameCondition('month', 4), nameCondition('weekday', 4),\n            digitCondition('day', 1)\n        ])),\n        'yMMMMd': datePartGetterFactory(combine([digitCondition('year', 1), nameCondition('month', 4), digitCondition('day', 1)])),\n        'yMMMd': datePartGetterFactory(combine([digitCondition('year', 1), nameCondition('month', 3), digitCondition('day', 1)])),\n        'yMd': datePartGetterFactory(combine([digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1)])),\n        'jms': datePartGetterFactory(combine([digitCondition('hour', 1), digitCondition('second', 1), digitCondition('minute', 1)])),\n        'jm': datePartGetterFactory(combine([digitCondition('hour', 1), digitCondition('minute', 1)]))\n    };\n    var /** @type {?} */ DATE_FORMATS = {\n        // Keys are quoted so they do not get renamed.\n        'yyyy': datePartGetterFactory(digitCondition('year', 4)),\n        'yy': datePartGetterFactory(digitCondition('year', 2)),\n        'y': datePartGetterFactory(digitCondition('year', 1)),\n        'MMMM': datePartGetterFactory(nameCondition('month', 4)),\n        'MMM': datePartGetterFactory(nameCondition('month', 3)),\n        'MM': datePartGetterFactory(digitCondition('month', 2)),\n        'M': datePartGetterFactory(digitCondition('month', 1)),\n        'LLLL': datePartGetterFactory(nameCondition('month', 4)),\n        'L': datePartGetterFactory(nameCondition('month', 1)),\n        'dd': datePartGetterFactory(digitCondition('day', 2)),\n        'd': datePartGetterFactory(digitCondition('day', 1)),\n        'HH': digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), false)))),\n        'H': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), false))),\n        'hh': digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), true)))),\n        'h': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n        'jj': datePartGetterFactory(digitCondition('hour', 2)),\n        'j': datePartGetterFactory(digitCondition('hour', 1)),\n        'mm': digitModifier(datePartGetterFactory(digitCondition('minute', 2))),\n        'm': datePartGetterFactory(digitCondition('minute', 1)),\n        'ss': digitModifier(datePartGetterFactory(digitCondition('second', 2))),\n        's': datePartGetterFactory(digitCondition('second', 1)),\n        // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n        // we can be just safely rely on using `sss` since we currently don't support single or two digit\n        // fractions\n        'sss': datePartGetterFactory(digitCondition('second', 3)),\n        'EEEE': datePartGetterFactory(nameCondition('weekday', 4)),\n        'EEE': datePartGetterFactory(nameCondition('weekday', 3)),\n        'EE': datePartGetterFactory(nameCondition('weekday', 2)),\n        'E': datePartGetterFactory(nameCondition('weekday', 1)),\n        'a': hourClockExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n        'Z': timeZoneGetter('short'),\n        'z': timeZoneGetter('long'),\n        'ww': datePartGetterFactory({}),\n        // first Thursday of the year. not support ?\n        'w': datePartGetterFactory({}),\n        // of the year not support ?\n        'G': datePartGetterFactory(nameCondition('era', 1)),\n        'GG': datePartGetterFactory(nameCondition('era', 2)),\n        'GGG': datePartGetterFactory(nameCondition('era', 3)),\n        'GGGG': datePartGetterFactory(nameCondition('era', 4))\n    };\n    /**\n     * @param {?} inner\n     * @return {?}\n     */\n    function digitModifier(inner) {\n        return function (date, locale) {\n            var /** @type {?} */ result = inner(date, locale);\n            return result.length == 1 ? '0' + result : result;\n        };\n    }\n    /**\n     * @param {?} inner\n     * @return {?}\n     */\n    function hourClockExtractor(inner) {\n        return function (date, locale) { return inner(date, locale).split(' ')[1]; };\n    }\n    /**\n     * @param {?} inner\n     * @return {?}\n     */\n    function hourExtractor(inner) {\n        return function (date, locale) { return inner(date, locale).split(' ')[0]; };\n    }\n    /**\n     * @param {?} date\n     * @param {?} locale\n     * @param {?} options\n     * @return {?}\n     */\n    function intlDateFormat(date, locale, options) {\n        return new Intl.DateTimeFormat(locale, options).format(date).replace(/[\\u200e\\u200f]/g, '');\n    }\n    /**\n     * @param {?} timezone\n     * @return {?}\n     */\n    function timeZoneGetter(timezone) {\n        // To workaround `Intl` API restriction for single timezone let format with 24 hours\n        var /** @type {?} */ options = { hour: '2-digit', hour12: false, timeZoneName: timezone };\n        return function (date, locale) {\n            var /** @type {?} */ result = intlDateFormat(date, locale, options);\n            // Then extract first 3 letters that related to hours\n            return result ? result.substring(3) : '';\n        };\n    }\n    /**\n     * @param {?} options\n     * @param {?} value\n     * @return {?}\n     */\n    function hour12Modify(options, value) {\n        options.hour12 = value;\n        return options;\n    }\n    /**\n     * @param {?} prop\n     * @param {?} len\n     * @return {?}\n     */\n    function digitCondition(prop, len) {\n        var /** @type {?} */ result = {};\n        result[prop] = len === 2 ? '2-digit' : 'numeric';\n        return result;\n    }\n    /**\n     * @param {?} prop\n     * @param {?} len\n     * @return {?}\n     */\n    function nameCondition(prop, len) {\n        var /** @type {?} */ result = {};\n        if (len < 4) {\n            result[prop] = len > 1 ? 'short' : 'narrow';\n        }\n        else {\n            result[prop] = 'long';\n        }\n        return result;\n    }\n    /**\n     * @param {?} options\n     * @return {?}\n     */\n    function combine(options) {\n        return (_a = ((Object))).assign.apply(_a, [{}].concat(options));\n        var _a;\n    }\n    /**\n     * @param {?} ret\n     * @return {?}\n     */\n    function datePartGetterFactory(ret) {\n        return function (date, locale) { return intlDateFormat(date, locale, ret); };\n    }\n    var /** @type {?} */ DATE_FORMATTER_CACHE = new Map();\n    /**\n     * @param {?} format\n     * @param {?} date\n     * @param {?} locale\n     * @return {?}\n     */\n    function dateFormatter(format, date, locale) {\n        var /** @type {?} */ fn = PATTERN_ALIASES[format];\n        if (fn)\n            return fn(date, locale);\n        var /** @type {?} */ cacheKey = format;\n        var /** @type {?} */ parts = DATE_FORMATTER_CACHE.get(cacheKey);\n        if (!parts) {\n            parts = [];\n            var /** @type {?} */ match = void 0;\n            DATE_FORMATS_SPLIT.exec(format);\n            while (format) {\n                match = DATE_FORMATS_SPLIT.exec(format);\n                if (match) {\n                    parts = parts.concat(match.slice(1));\n                    format = parts.pop();\n                }\n                else {\n                    parts.push(format);\n                    format = null;\n                }\n            }\n            DATE_FORMATTER_CACHE.set(cacheKey, parts);\n        }\n        return parts.reduce(function (text, part) {\n            var /** @type {?} */ fn = DATE_FORMATS[part];\n            return text + (fn ? fn(date, locale) : partToTime(part));\n        }, '');\n    }\n    /**\n     * @param {?} part\n     * @return {?}\n     */\n    function partToTime(part) {\n        return part === '\\'\\'' ? '\\'' : part.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n    }\n    var DateFormatter = (function () {\n        function DateFormatter() {\n        }\n        /**\n         * @param {?} date\n         * @param {?} locale\n         * @param {?} pattern\n         * @return {?}\n         */\n        DateFormatter.format = function (date, locale, pattern) {\n            return dateFormatter(pattern, date, locale);\n        };\n        return DateFormatter;\n    }());\n\n    var /** @type {?} */ ISO8601_DATE_REGEX = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Formats a date according to locale rules.\n     * \\@howToUse `date_expression | date[:format]`\n     * \\@description\n     *\n     * Where:\n     * - `expression` is a date object or a number (milliseconds since UTC epoch) or an ISO string\n     * (https://www.w3.org/TR/NOTE-datetime).\n     * - `format` indicates which date/time components to include. The format can be predefined as\n     *   shown below or custom as shown in the table.\n     *   - `'medium'`: equivalent to `'yMMMdjms'` (e.g. `Sep 3, 2010, 12:05:08 PM` for `en-US`)\n     *   - `'short'`: equivalent to `'yMdjm'` (e.g. `9/3/2010, 12:05 PM` for `en-US`)\n     *   - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. `Friday, September 3, 2010` for `en-US`)\n     *   - `'longDate'`: equivalent to `'yMMMMd'` (e.g. `September 3, 2010` for `en-US`)\n     *   - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. `Sep 3, 2010` for `en-US`)\n     *   - `'shortDate'`: equivalent to `'yMd'` (e.g. `9/3/2010` for `en-US`)\n     *   - `'mediumTime'`: equivalent to `'jms'` (e.g. `12:05:08 PM` for `en-US`)\n     *   - `'shortTime'`: equivalent to `'jm'` (e.g. `12:05 PM` for `en-US`)\n     *\n     *\n     *  | Component | Symbol | Narrow | Short Form   | Long Form         | Numeric   | 2-digit   |\n     *  |-----------|:------:|--------|--------------|-------------------|-----------|-----------|\n     *  | era       |   G    | G (A)  | GGG (AD)     | GGGG (Anno Domini)| -         | -         |\n     *  | year      |   y    | -      | -            | -                 | y (2015)  | yy (15)   |\n     *  | month     |   M    | L (S)  | MMM (Sep)    | MMMM (September)  | M (9)     | MM (09)   |\n     *  | day       |   d    | -      | -            | -                 | d (3)     | dd (03)   |\n     *  | weekday   |   E    | E (S)  | EEE (Sun)    | EEEE (Sunday)     | -         | -         |\n     *  | hour      |   j    | -      | -            | -                 | j (13)    | jj (13)   |\n     *  | hour12    |   h    | -      | -            | -                 | h (1 PM)  | hh (01 PM)|\n     *  | hour24    |   H    | -      | -            | -                 | H (13)    | HH (13)   |\n     *  | minute    |   m    | -      | -            | -                 | m (5)     | mm (05)   |\n     *  | second    |   s    | -      | -            | -                 | s (9)     | ss (09)   |\n     *  | timezone  |   z    | -      | -            | z (Pacific Standard Time)| -  | -         |\n     *  | timezone  |   Z    | -      | Z (GMT-8:00) | -                 | -         | -         |\n     *  | timezone  |   a    | -      | a (PM)       | -                 | -         | -         |\n     *\n     * In javascript, only the components specified will be respected (not the ordering,\n     * punctuations, ...) and details of the formatting will be dependent on the locale.\n     *\n     * Timezone of the formatted text will be the local system timezone of the end-user's machine.\n     *\n     * When the expression is a ISO string without time (e.g. 2016-09-19) the time zone offset is not\n     * applied and the formatted text will have the same day, month and year of the expression.\n     *\n     * WARNINGS:\n     * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.\n     *   Instead users should treat the date as an immutable object and change the reference when the\n     *   pipe needs to re-run (this is to avoid reformatting the date on every change detection run\n     *   which would be an expensive operation).\n     * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera\n     *   browsers.\n     *\n     * ### Examples\n     *\n     * Assuming `dateObj` is (year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11)\n     * in the _local_ time and locale is 'en-US':\n     *\n     * ```\n     *     {{ dateObj | date }}               // output is 'Jun 15, 2015'\n     *     {{ dateObj | date:'medium' }}      // output is 'Jun 15, 2015, 9:43:11 PM'\n     *     {{ dateObj | date:'shortTime' }}   // output is '9:43 PM'\n     *     {{ dateObj | date:'mmss' }}        // output is '43:11'\n     * ```\n     *\n     * {\\@example common/pipes/ts/date_pipe.ts region='DatePipe'}\n     *\n     * \\@stable\n     */\n    var DatePipe = (function () {\n        /**\n         * @param {?} _locale\n         */\n        function DatePipe(_locale) {\n            this._locale = _locale;\n        }\n        /**\n         * @param {?} value\n         * @param {?=} pattern\n         * @return {?}\n         */\n        DatePipe.prototype.transform = function (value, pattern) {\n            if (pattern === void 0) { pattern = 'mediumDate'; }\n            var /** @type {?} */ date;\n            if (isBlank$1(value) || value !== value)\n                return null;\n            if (typeof value === 'string') {\n                value = value.trim();\n            }\n            if (isDate(value)) {\n                date = value;\n            }\n            else if (NumberWrapper.isNumeric(value)) {\n                date = new Date(parseFloat(value));\n            }\n            else if (typeof value === 'string' && /^(\\d{4}-\\d{1,2}-\\d{1,2})$/.test(value)) {\n                /**\n                * For ISO Strings without time the day, month and year must be extracted from the ISO String\n                * before Date creation to avoid time offset and errors in the new Date.\n                * If we only replace '-' with ',' in the ISO String (\"2015,01,01\"), and try to create a new\n                * date, some browsers (e.g. IE 9) will throw an invalid Date error\n                * If we leave the '-' (\"2015-01-01\") and try to create a new Date(\"2015-01-01\") the timeoffset\n                * is applied\n                * Note: ISO months are 0 for January, 1 for February, ...\n                */\n                var _a = value.split('-').map(function (val) { return parseInt(val, 10); }), y = _a[0], m = _a[1], d = _a[2];\n                date = new Date(y, m - 1, d);\n            }\n            else {\n                date = new Date(value);\n            }\n            if (!isDate(date)) {\n                var /** @type {?} */ match = void 0;\n                if ((typeof value === 'string') && (match = value.match(ISO8601_DATE_REGEX))) {\n                    date = isoStringToDate(match);\n                }\n                else {\n                    throw new InvalidPipeArgumentError(DatePipe, value);\n                }\n            }\n            return DateFormatter.format(date, this._locale, DatePipe._ALIASES[pattern] || pattern);\n        };\n        /** @internal */\n        DatePipe._ALIASES = {\n            'medium': 'yMMMdjms',\n            'short': 'yMdjm',\n            'fullDate': 'yMMMMEEEEd',\n            'longDate': 'yMMMMd',\n            'mediumDate': 'yMMMd',\n            'shortDate': 'yMd',\n            'mediumTime': 'jms',\n            'shortTime': 'jm'\n        };\n        DatePipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'date', pure: true },] },\n        ];\n        /** @nocollapse */\n        DatePipe.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n        ]; };\n        return DatePipe;\n    }());\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isBlank$1(obj) {\n        return obj == null || obj === '';\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isDate(obj) {\n        return obj instanceof Date && !isNaN(obj.valueOf());\n    }\n    /**\n     * @param {?} match\n     * @return {?}\n     */\n    function isoStringToDate(match) {\n        var /** @type {?} */ date = new Date(0);\n        var /** @type {?} */ tzHour = 0;\n        var /** @type {?} */ tzMin = 0;\n        var /** @type {?} */ dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;\n        var /** @type {?} */ timeSetter = match[8] ? date.setUTCHours : date.setHours;\n        if (match[9]) {\n            tzHour = toInt(match[9] + match[10]);\n            tzMin = toInt(match[9] + match[11]);\n        }\n        dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));\n        var /** @type {?} */ h = toInt(match[4] || '0') - tzHour;\n        var /** @type {?} */ m = toInt(match[5] || '0') - tzMin;\n        var /** @type {?} */ s = toInt(match[6] || '0');\n        var /** @type {?} */ ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\n        timeSetter.call(date, h, m, s, ms);\n        return date;\n    }\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function toInt(str) {\n        return parseInt(str, 10);\n    }\n\n    var /** @type {?} */ _INTERPOLATION_REGEXP = /#/g;\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Maps a value to a string that pluralizes the value according to locale rules.\n     * \\@howToUse `expression | i18nPlural:mapping`\n     * \\@description\n     *\n     *  Where:\n     *  - `expression` is a number.\n     *  - `mapping` is an object that mimics the ICU format, see\n     *    http://userguide.icu-project.org/formatparse/messages\n     *\n     *  ## Example\n     *\n     * {\\@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}\n     *\n     * \\@experimental\n     */\n    var I18nPluralPipe = (function () {\n        /**\n         * @param {?} _localization\n         */\n        function I18nPluralPipe(_localization) {\n            this._localization = _localization;\n        }\n        /**\n         * @param {?} value\n         * @param {?} pluralMap\n         * @return {?}\n         */\n        I18nPluralPipe.prototype.transform = function (value, pluralMap) {\n            if (value == null)\n                return '';\n            if (typeof pluralMap !== 'object' || pluralMap === null) {\n                throw new InvalidPipeArgumentError(I18nPluralPipe, pluralMap);\n            }\n            var /** @type {?} */ key = getPluralCategory(value, Object.keys(pluralMap), this._localization);\n            return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());\n        };\n        I18nPluralPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'i18nPlural', pure: true },] },\n        ];\n        /** @nocollapse */\n        I18nPluralPipe.ctorParameters = function () { return [\n            { type: NgLocalization, },\n        ]; };\n        return I18nPluralPipe;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Generic selector that displays the string that matches the current value.\n     * \\@howToUse `expression | i18nSelect:mapping`\n     * \\@description\n     *\n     *  Where `mapping` is an object that indicates the text that should be displayed\n     *  for different values of the provided `expression`.\n     *  If none of the keys of the mapping match the value of the `expression`, then the content\n     *  of the `other` key is returned when present, otherwise an empty string is returned.\n     *\n     *  ## Example\n     *\n     * {\\@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}\n     *\n     *  \\@experimental\n     */\n    var I18nSelectPipe = (function () {\n        function I18nSelectPipe() {\n        }\n        /**\n         * @param {?} value\n         * @param {?} mapping\n         * @return {?}\n         */\n        I18nSelectPipe.prototype.transform = function (value, mapping) {\n            if (value == null)\n                return '';\n            if (typeof mapping !== 'object' || typeof value !== 'string') {\n                throw new InvalidPipeArgumentError(I18nSelectPipe, mapping);\n            }\n            if (mapping.hasOwnProperty(value)) {\n                return mapping[value];\n            }\n            if (mapping.hasOwnProperty('other')) {\n                return mapping['other'];\n            }\n            return '';\n        };\n        I18nSelectPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'i18nSelect', pure: true },] },\n        ];\n        /** @nocollapse */\n        I18nSelectPipe.ctorParameters = function () { return []; };\n        return I18nSelectPipe;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Converts value into JSON string.\n     * \\@howToUse `expression | json`\n     * \\@description\n     *\n     * Converts value into string using `JSON.stringify`. Useful for debugging.\n     *\n     * ### Example\n     * {\\@example common/pipes/ts/json_pipe.ts region='JsonPipe'}\n     *\n     * \\@stable\n     */\n    var JsonPipe = (function () {\n        function JsonPipe() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        JsonPipe.prototype.transform = function (value) { return JSON.stringify(value, null, 2); };\n        JsonPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'json', pure: false },] },\n        ];\n        /** @nocollapse */\n        JsonPipe.ctorParameters = function () { return []; };\n        return JsonPipe;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Transforms string to lowercase.\n     * \\@howToUse `expression | lowercase`\n     * \\@description\n     *\n     * Converts value into a lowercase string using `String.prototype.toLowerCase()`.\n     *\n     * ### Example\n     *\n     * {\\@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}\n     *\n     * \\@stable\n     */\n    var LowerCasePipe = (function () {\n        function LowerCasePipe() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        LowerCasePipe.prototype.transform = function (value) {\n            if (isBlank(value))\n                return value;\n            if (typeof value !== 'string') {\n                throw new InvalidPipeArgumentError(LowerCasePipe, value);\n            }\n            return value.toLowerCase();\n        };\n        LowerCasePipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'lowercase' },] },\n        ];\n        /** @nocollapse */\n        LowerCasePipe.ctorParameters = function () { return []; };\n        return LowerCasePipe;\n    }());\n\n    var /** @type {?} */ _NUMBER_FORMAT_REGEXP = /^(\\d+)?\\.((\\d+)(-(\\d+))?)?$/;\n    /**\n     * @param {?} pipe\n     * @param {?} locale\n     * @param {?} value\n     * @param {?} style\n     * @param {?} digits\n     * @param {?=} currency\n     * @param {?=} currencyAsSymbol\n     * @return {?}\n     */\n    function formatNumber(pipe, locale, value, style, digits, currency, currencyAsSymbol) {\n        if (currency === void 0) { currency = null; }\n        if (currencyAsSymbol === void 0) { currencyAsSymbol = false; }\n        if (value == null)\n            return null;\n        // Convert strings to numbers\n        value = typeof value === 'string' && NumberWrapper.isNumeric(value) ? +value : value;\n        if (typeof value !== 'number') {\n            throw new InvalidPipeArgumentError(pipe, value);\n        }\n        var /** @type {?} */ minInt;\n        var /** @type {?} */ minFraction;\n        var /** @type {?} */ maxFraction;\n        if (style !== NumberFormatStyle.Currency) {\n            // rely on Intl default for currency\n            minInt = 1;\n            minFraction = 0;\n            maxFraction = 3;\n        }\n        if (digits) {\n            var /** @type {?} */ parts = digits.match(_NUMBER_FORMAT_REGEXP);\n            if (parts === null) {\n                throw new Error(digits + \" is not a valid digit info for number pipes\");\n            }\n            if (parts[1] != null) {\n                minInt = NumberWrapper.parseIntAutoRadix(parts[1]);\n            }\n            if (parts[3] != null) {\n                minFraction = NumberWrapper.parseIntAutoRadix(parts[3]);\n            }\n            if (parts[5] != null) {\n                maxFraction = NumberWrapper.parseIntAutoRadix(parts[5]);\n            }\n        }\n        return NumberFormatter.format(/** @type {?} */ (value), locale, style, {\n            minimumIntegerDigits: minInt,\n            minimumFractionDigits: minFraction,\n            maximumFractionDigits: maxFraction,\n            currency: currency,\n            currencyAsSymbol: currencyAsSymbol,\n        });\n    }\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Formats a number according to locale rules.\n     * \\@howToUse `number_expression | number[:digitInfo]`\n     *\n     * Formats a number as text. Group sizing and separator and other locale-specific\n     * configurations are based on the active locale.\n     *\n     * where `expression` is a number:\n     *  - `digitInfo` is a `string` which has a following format: <br>\n     *     <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>\n     *   - `minIntegerDigits` is the minimum number of integer digits to use. Defaults to `1`.\n     *   - `minFractionDigits` is the minimum number of digits after fraction. Defaults to `0`.\n     *   - `maxFractionDigits` is the maximum number of digits after fraction. Defaults to `3`.\n     *\n     * For more information on the acceptable range for each of these numbers and other\n     * details see your native internationalization library.\n     *\n     * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n     * and may require a polyfill. See {\\@linkDocs guide/browser-support} for details.\n     *\n     * ### Example\n     *\n     * {\\@example common/pipes/ts/number_pipe.ts region='NumberPipe'}\n     *\n     * \\@stable\n     */\n    var DecimalPipe = (function () {\n        /**\n         * @param {?} _locale\n         */\n        function DecimalPipe(_locale) {\n            this._locale = _locale;\n        }\n        /**\n         * @param {?} value\n         * @param {?=} digits\n         * @return {?}\n         */\n        DecimalPipe.prototype.transform = function (value, digits) {\n            if (digits === void 0) { digits = null; }\n            return formatNumber(DecimalPipe, this._locale, value, NumberFormatStyle.Decimal, digits);\n        };\n        DecimalPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'number' },] },\n        ];\n        /** @nocollapse */\n        DecimalPipe.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n        ]; };\n        return DecimalPipe;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Formats a number as a percentage according to locale rules.\n     * \\@howToUse `number_expression | percent[:digitInfo]`\n     *\n     * \\@description\n     *\n     * Formats a number as percentage.\n     *\n     * - `digitInfo` See {\\@link DecimalPipe} for detailed description.\n     *\n     * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n     * and may require a polyfill. See {\\@linkDocs guide/browser-support} for details.\n     *\n     * ### Example\n     *\n     * {\\@example common/pipes/ts/number_pipe.ts region='PercentPipe'}\n     *\n     * \\@stable\n     */\n    var PercentPipe = (function () {\n        /**\n         * @param {?} _locale\n         */\n        function PercentPipe(_locale) {\n            this._locale = _locale;\n        }\n        /**\n         * @param {?} value\n         * @param {?=} digits\n         * @return {?}\n         */\n        PercentPipe.prototype.transform = function (value, digits) {\n            if (digits === void 0) { digits = null; }\n            return formatNumber(PercentPipe, this._locale, value, NumberFormatStyle.Percent, digits);\n        };\n        PercentPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'percent' },] },\n        ];\n        /** @nocollapse */\n        PercentPipe.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n        ]; };\n        return PercentPipe;\n    }());\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Formats a number as currency using locale rules.\n     * \\@howToUse `number_expression | currency[:currencyCode[:symbolDisplay[:digitInfo]]]`\n     * \\@description\n     *\n     * Use `currency` to format a number as currency.\n     *\n     * - `currencyCode` is the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such\n     *    as `USD` for the US dollar and `EUR` for the euro.\n     * - `symbolDisplay` is a boolean indicating whether to use the currency symbol or code.\n     *   - `true`: use symbol (e.g. `$`).\n     *   - `false`(default): use code (e.g. `USD`).\n     * - `digitInfo` See {\\@link DecimalPipe} for detailed description.\n     *\n     * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n     * and may require a polyfill. See {\\@linkDocs guide/browser-support} for details.\n     *\n     * ### Example\n     *\n     * {\\@example common/pipes/ts/number_pipe.ts region='CurrencyPipe'}\n     *\n     * \\@stable\n     */\n    var CurrencyPipe = (function () {\n        /**\n         * @param {?} _locale\n         */\n        function CurrencyPipe(_locale) {\n            this._locale = _locale;\n        }\n        /**\n         * @param {?} value\n         * @param {?=} currencyCode\n         * @param {?=} symbolDisplay\n         * @param {?=} digits\n         * @return {?}\n         */\n        CurrencyPipe.prototype.transform = function (value, currencyCode, symbolDisplay, digits) {\n            if (currencyCode === void 0) { currencyCode = 'USD'; }\n            if (symbolDisplay === void 0) { symbolDisplay = false; }\n            if (digits === void 0) { digits = null; }\n            return formatNumber(CurrencyPipe, this._locale, value, NumberFormatStyle.Currency, digits, currencyCode, symbolDisplay);\n        };\n        CurrencyPipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'currency' },] },\n        ];\n        /** @nocollapse */\n        CurrencyPipe.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n        ]; };\n        return CurrencyPipe;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Creates a new List or String containing a subset (slice) of the elements.\n     * \\@howToUse `array_or_string_expression | slice:start[:end]`\n     * \\@description\n     *\n     * Where the input expression is a `List` or `String`, and:\n     * - `start`: The starting index of the subset to return.\n     *   - **a positive integer**: return the item at `start` index and all items after\n     *     in the list or string expression.\n     *   - **a negative integer**: return the item at `start` index from the end and all items after\n     *     in the list or string expression.\n     *   - **if positive and greater than the size of the expression**: return an empty list or string.\n     *   - **if negative and greater than the size of the expression**: return entire list or string.\n     * - `end`: The ending index of the subset to return.\n     *   - **omitted**: return all items until the end.\n     *   - **if positive**: return all items before `end` index of the list or string.\n     *   - **if negative**: return all items before `end` index from the end of the list or string.\n     *\n     * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`\n     * and `String.prototype.slice()`.\n     *\n     * When operating on a [List], the returned list is always a copy even when all\n     * the elements are being returned.\n     *\n     * When operating on a blank value, the pipe returns the blank value.\n     *\n     * ## List Example\n     *\n     * This `ngFor` example:\n     *\n     * {\\@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}\n     *\n     * produces the following:\n     *\n     *     <li>b</li>\n     *     <li>c</li>\n     *\n     * ## String Examples\n     *\n     * {\\@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}\n     *\n     * \\@stable\n     */\n    var SlicePipe = (function () {\n        function SlicePipe() {\n        }\n        /**\n         * @param {?} value\n         * @param {?} start\n         * @param {?=} end\n         * @return {?}\n         */\n        SlicePipe.prototype.transform = function (value, start, end) {\n            if (value == null)\n                return value;\n            if (!this.supports(value)) {\n                throw new InvalidPipeArgumentError(SlicePipe, value);\n            }\n            return value.slice(start, end);\n        };\n        /**\n         * @param {?} obj\n         * @return {?}\n         */\n        SlicePipe.prototype.supports = function (obj) { return typeof obj === 'string' || Array.isArray(obj); };\n        SlicePipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'slice', pure: false },] },\n        ];\n        /** @nocollapse */\n        SlicePipe.ctorParameters = function () { return []; };\n        return SlicePipe;\n    }());\n\n    /**\n     * \\@ngModule CommonModule\n     * \\@whatItDoes Transforms string to uppercase.\n     * \\@howToUse `expression | uppercase`\n     * \\@description\n     *\n     * Converts value into an uppercase string using `String.prototype.toUpperCase()`.\n     *\n     * ### Example\n     *\n     * {\\@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}\n     *\n     * \\@stable\n     */\n    var UpperCasePipe = (function () {\n        function UpperCasePipe() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        UpperCasePipe.prototype.transform = function (value) {\n            if (isBlank(value))\n                return value;\n            if (typeof value !== 'string') {\n                throw new InvalidPipeArgumentError(UpperCasePipe, value);\n            }\n            return value.toUpperCase();\n        };\n        UpperCasePipe.decorators = [\n            { type: _angular_core.Pipe, args: [{ name: 'uppercase' },] },\n        ];\n        /** @nocollapse */\n        UpperCasePipe.ctorParameters = function () { return []; };\n        return UpperCasePipe;\n    }());\n\n    /**\n     * A collection of Angular pipes that are likely to be used in each and every application.\n     */\n    var /** @type {?} */ COMMON_PIPES = [\n        AsyncPipe,\n        UpperCasePipe,\n        LowerCasePipe,\n        JsonPipe,\n        SlicePipe,\n        DecimalPipe,\n        PercentPipe,\n        CurrencyPipe,\n        DatePipe,\n        I18nPluralPipe,\n        I18nSelectPipe,\n    ];\n\n    /**\n     * The module that includes all the basic Angular directives like {\\@link NgIf}, {\\@link NgFor}, ...\n     *\n     * \\@stable\n     */\n    var CommonModule = (function () {\n        function CommonModule() {\n        }\n        CommonModule.decorators = [\n            { type: _angular_core.NgModule, args: [{\n                        declarations: [COMMON_DIRECTIVES, COMMON_PIPES],\n                        exports: [COMMON_DIRECTIVES, COMMON_PIPES],\n                        providers: [\n                            { provide: NgLocalization, useClass: NgLocaleLocalization },\n                        ],\n                    },] },\n        ];\n        /** @nocollapse */\n        CommonModule.ctorParameters = function () { return []; };\n        return CommonModule;\n    }());\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new _angular_core.Version('2.4.8');\n\n    exports.NgLocalization = NgLocalization;\n    exports.CommonModule = CommonModule;\n    exports.NgClass = NgClass;\n    exports.NgFor = NgFor;\n    exports.NgIf = NgIf;\n    exports.NgPlural = NgPlural;\n    exports.NgPluralCase = NgPluralCase;\n    exports.NgStyle = NgStyle;\n    exports.NgSwitch = NgSwitch;\n    exports.NgSwitchCase = NgSwitchCase;\n    exports.NgSwitchDefault = NgSwitchDefault;\n    exports.NgTemplateOutlet = NgTemplateOutlet;\n    exports.AsyncPipe = AsyncPipe;\n    exports.DatePipe = DatePipe;\n    exports.I18nPluralPipe = I18nPluralPipe;\n    exports.I18nSelectPipe = I18nSelectPipe;\n    exports.JsonPipe = JsonPipe;\n    exports.LowerCasePipe = LowerCasePipe;\n    exports.CurrencyPipe = CurrencyPipe;\n    exports.DecimalPipe = DecimalPipe;\n    exports.PercentPipe = PercentPipe;\n    exports.SlicePipe = SlicePipe;\n    exports.UpperCasePipe = UpperCasePipe;\n    exports.VERSION = VERSION;\n    exports.Version = _angular_core.Version;\n    exports.PlatformLocation = PlatformLocation;\n    exports.LOCATION_INITIALIZED = LOCATION_INITIALIZED;\n    exports.LocationStrategy = LocationStrategy;\n    exports.APP_BASE_HREF = APP_BASE_HREF;\n    exports.HashLocationStrategy = HashLocationStrategy;\n    exports.PathLocationStrategy = PathLocationStrategy;\n    exports.Location = Location;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/common/bundles/common.umd.js\n// module id = 32\n// module chunks = 2","\"use strict\";\n// typeof any so that it we don't have to cast when comparing a result to the error object\nexports.errorObject = { e: {} };\n//# sourceMappingURL=errorObject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/errorObject.js\n// module id = 34\n// module chunks = 2","\"use strict\";\n/**\n * window: browser in DOM main thread\n * self: browser in WebWorker\n * global: Node.js/other\n */\nexports.root = (typeof window == 'object' && window.window === window && window\n    || typeof self == 'object' && self.self === self && self\n    || typeof global == 'object' && global.global === global && global);\nif (!exports.root) {\n    throw new Error('RxJS could not find any global context (window, self, global)');\n}\n//# sourceMappingURL=root.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/root.js\n// module id = 35\n// module chunks = 2","\"use strict\";\nvar errorObject_1 = require('./errorObject');\nvar tryCatchTarget;\nfunction tryCatcher() {\n    try {\n        return tryCatchTarget.apply(this, arguments);\n    }\n    catch (e) {\n        errorObject_1.errorObject.e = e;\n        return errorObject_1.errorObject;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n;\n//# sourceMappingURL=tryCatch.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/tryCatch.js\n// module id = 36\n// module chunks = 2","\"use strict\";\nvar AsyncAction_1 = require('./AsyncAction');\nvar AsyncScheduler_1 = require('./AsyncScheduler');\nexports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);\n//# sourceMappingURL=async.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/async.js\n// module id = 41\n// module chunks = 2","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/common', '@angular/core'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.platformBrowser = global.ng.platformBrowser || {}),global.ng.common,global.ng.core));\n}(this, function (exports,_angular_common,core) { 'use strict';\n\n    var /** @type {?} */ DebugDomRootRenderer = core.__core_private__.DebugDomRootRenderer;\n    var /** @type {?} */ NoOpAnimationPlayer = core.__core_private__.NoOpAnimationPlayer;\n\n    /**\n     * \\@experimental\n     */\n    var NoOpAnimationDriver = (function () {\n        function NoOpAnimationDriver() {\n        }\n        /**\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        NoOpAnimationDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            return new NoOpAnimationPlayer();\n        };\n        return NoOpAnimationDriver;\n    }());\n    /**\n     * \\@experimental\n     * @abstract\n     */\n    var AnimationDriver = (function () {\n        function AnimationDriver() {\n        }\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        AnimationDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) { };\n        AnimationDriver.NOOP = new NoOpAnimationDriver();\n        return AnimationDriver;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ globalScope;\n    if (typeof window === 'undefined') {\n        if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n            // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n            globalScope = (self);\n        }\n        else {\n            globalScope = (global);\n        }\n    }\n    else {\n        globalScope = (window);\n    }\n    // Need to declare a new variable for global here since TypeScript\n    // exports the original value of the symbol.\n    var /** @type {?} */ global$1 = globalScope;\n    // TODO: remove calls to assert in production environment\n    // Note: Can't just export this and import in in other files\n    // as `assert` is a reserved keyword in Dart\n    global$1.assert = function assert(condition) {\n        // TODO: to be fixed properly via #2830, noop for now\n    };\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPresent(obj) {\n        return obj != null;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isBlank(obj) {\n        return obj == null;\n    }\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function stringify(token) {\n        if (typeof token === 'string') {\n            return token;\n        }\n        if (token == null) {\n            return '' + token;\n        }\n        if (token.overriddenName) {\n            return \"\" + token.overriddenName;\n        }\n        if (token.name) {\n            return \"\" + token.name;\n        }\n        var /** @type {?} */ res = token.toString();\n        var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n        return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n    }\n    /**\n     * @param {?} global\n     * @param {?} path\n     * @param {?} value\n     * @return {?}\n     */\n    function setValueOnPath(global, path, value) {\n        var /** @type {?} */ parts = path.split('.');\n        var /** @type {?} */ obj = global;\n        while (parts.length > 1) {\n            var /** @type {?} */ name_1 = parts.shift();\n            if (obj.hasOwnProperty(name_1) && obj[name_1] != null) {\n                obj = obj[name_1];\n            }\n            else {\n                obj = obj[name_1] = {};\n            }\n        }\n        if (obj === undefined || obj === null) {\n            obj = {};\n        }\n        obj[parts.shift()] = value;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ _DOM = null;\n    /**\n     * @return {?}\n     */\n    function getDOM() {\n        return _DOM;\n    }\n    /**\n     * @param {?} adapter\n     * @return {?}\n     */\n    function setRootDomAdapter(adapter) {\n        if (!_DOM) {\n            _DOM = adapter;\n        }\n    }\n    /**\n     * Provides DOM operations in an environment-agnostic way.\n     *\n     * \\@security Tread carefully! Interacting with the DOM directly is dangerous and\n     * can introduce XSS risks.\n     * @abstract\n     */\n    var DomAdapter = (function () {\n        function DomAdapter() {\n            this.resourceLoaderType = null;\n        }\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.hasProperty = function (element /** TODO #9100 */, name) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setProperty = function (el, name, value) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.getProperty = function (el, name) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} methodName\n         * @param {?} args\n         * @return {?}\n         */\n        DomAdapter.prototype.invoke = function (el, methodName, args) { };\n        /**\n         * @abstract\n         * @param {?} error\n         * @return {?}\n         */\n        DomAdapter.prototype.logError = function (error) { };\n        /**\n         * @abstract\n         * @param {?} error\n         * @return {?}\n         */\n        DomAdapter.prototype.log = function (error) { };\n        /**\n         * @abstract\n         * @param {?} error\n         * @return {?}\n         */\n        DomAdapter.prototype.logGroup = function (error) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.logGroupEnd = function () { };\n        Object.defineProperty(DomAdapter.prototype, \"attrToPropMap\", {\n            /**\n             * Maps attribute names to their corresponding property names for cases\n             * where attribute name doesn't match property name.\n             * @return {?}\n             */\n            get: function () { return this._attrToPropMap; },\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) { this._attrToPropMap = value; },\n            enumerable: true,\n            configurable: true\n        });\n        ;\n        ;\n        /**\n         * @abstract\n         * @param {?} templateHtml\n         * @return {?}\n         */\n        DomAdapter.prototype.parse = function (templateHtml) { };\n        /**\n         * @abstract\n         * @param {?} selector\n         * @return {?}\n         */\n        DomAdapter.prototype.query = function (selector) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} selector\n         * @return {?}\n         */\n        DomAdapter.prototype.querySelector = function (el /** TODO #9100 */, selector) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} selector\n         * @return {?}\n         */\n        DomAdapter.prototype.querySelectorAll = function (el /** TODO #9100 */, selector) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} evt\n         * @param {?} listener\n         * @return {?}\n         */\n        DomAdapter.prototype.on = function (el /** TODO #9100 */, evt /** TODO #9100 */, listener) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} evt\n         * @param {?} listener\n         * @return {?}\n         */\n        DomAdapter.prototype.onAndCancel = function (el /** TODO #9100 */, evt /** TODO #9100 */, listener) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} evt\n         * @return {?}\n         */\n        DomAdapter.prototype.dispatchEvent = function (el /** TODO #9100 */, evt) { };\n        /**\n         * @abstract\n         * @param {?} eventType\n         * @return {?}\n         */\n        DomAdapter.prototype.createMouseEvent = function (eventType) { };\n        /**\n         * @abstract\n         * @param {?} eventType\n         * @return {?}\n         */\n        DomAdapter.prototype.createEvent = function (eventType) { };\n        /**\n         * @abstract\n         * @param {?} evt\n         * @return {?}\n         */\n        DomAdapter.prototype.preventDefault = function (evt) { };\n        /**\n         * @abstract\n         * @param {?} evt\n         * @return {?}\n         */\n        DomAdapter.prototype.isPrevented = function (evt) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getInnerHTML = function (el) { };\n        /**\n         * Returns content if el is a <template> element, null otherwise.\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getTemplateContent = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getOuterHTML = function (el) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.nodeName = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.nodeValue = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.type = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.content = function (node) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.firstChild = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.nextSibling = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.parentElement = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.childNodes = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.childNodesAsList = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.clearNodes = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.appendChild = function (el /** TODO #9100 */, node) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.removeChild = function (el /** TODO #9100 */, node) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} newNode\n         * @param {?} oldNode\n         * @return {?}\n         */\n        DomAdapter.prototype.replaceChild = function (el /** TODO #9100 */, newNode /** TODO #9100 */, oldNode) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.remove = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.insertBefore = function (el /** TODO #9100 */, node) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} nodes\n         * @return {?}\n         */\n        DomAdapter.prototype.insertAllBefore = function (el /** TODO #9100 */, nodes) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.insertAfter = function (el /** TODO #9100 */, node) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setInnerHTML = function (el /** TODO #9100 */, value) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getText = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setText = function (el /** TODO #9100 */, value) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getValue = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setValue = function (el /** TODO #9100 */, value) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getChecked = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setChecked = function (el /** TODO #9100 */, value) { };\n        /**\n         * @abstract\n         * @param {?} text\n         * @return {?}\n         */\n        DomAdapter.prototype.createComment = function (text) { };\n        /**\n         * @abstract\n         * @param {?} html\n         * @return {?}\n         */\n        DomAdapter.prototype.createTemplate = function (html) { };\n        /**\n         * @abstract\n         * @param {?} tagName\n         * @param {?=} doc\n         * @return {?}\n         */\n        DomAdapter.prototype.createElement = function (tagName /** TODO #9100 */, doc) { };\n        /**\n         * @abstract\n         * @param {?} ns\n         * @param {?} tagName\n         * @param {?=} doc\n         * @return {?}\n         */\n        DomAdapter.prototype.createElementNS = function (ns, tagName, doc) { };\n        /**\n         * @abstract\n         * @param {?} text\n         * @param {?=} doc\n         * @return {?}\n         */\n        DomAdapter.prototype.createTextNode = function (text, doc) { };\n        /**\n         * @abstract\n         * @param {?} attrName\n         * @param {?} attrValue\n         * @param {?=} doc\n         * @return {?}\n         */\n        DomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) { };\n        /**\n         * @abstract\n         * @param {?} css\n         * @param {?=} doc\n         * @return {?}\n         */\n        DomAdapter.prototype.createStyleElement = function (css, doc) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.createShadowRoot = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getShadowRoot = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getHost = function (el) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getDistributedNodes = function (el) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.clone /*<T extends Node>*/ = function (node) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.getElementsByClassName = function (element /** TODO #9100 */, name) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.getElementsByTagName = function (element /** TODO #9100 */, name) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @return {?}\n         */\n        DomAdapter.prototype.classList = function (element) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        DomAdapter.prototype.addClass = function (element /** TODO #9100 */, className) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        DomAdapter.prototype.removeClass = function (element /** TODO #9100 */, className) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        DomAdapter.prototype.hasClass = function (element /** TODO #9100 */, className) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} styleName\n         * @param {?} styleValue\n         * @return {?}\n         */\n        DomAdapter.prototype.setStyle = function (element /** TODO #9100 */, styleName, styleValue) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} styleName\n         * @return {?}\n         */\n        DomAdapter.prototype.removeStyle = function (element /** TODO #9100 */, styleName) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} styleName\n         * @return {?}\n         */\n        DomAdapter.prototype.getStyle = function (element /** TODO #9100 */, styleName) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} styleName\n         * @param {?=} styleValue\n         * @return {?}\n         */\n        DomAdapter.prototype.hasStyle = function (element /** TODO #9100 */, styleName, styleValue) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @return {?}\n         */\n        DomAdapter.prototype.tagName = function (element) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @return {?}\n         */\n        DomAdapter.prototype.attributeMap = function (element) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.hasAttribute = function (element /** TODO #9100 */, attribute) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.hasAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.getAttribute = function (element /** TODO #9100 */, attribute) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.getAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setAttribute = function (element /** TODO #9100 */, name, value) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setAttributeNS = function (element /** TODO #9100 */, ns, name, value) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.removeAttribute = function (element /** TODO #9100 */, attribute) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} attribute\n         * @return {?}\n         */\n        DomAdapter.prototype.removeAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.templateAwareRoot = function (el) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.createHtmlDocument = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.defaultDoc = function () { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.getBoundingClientRect = function (el) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getTitle = function () { };\n        /**\n         * @abstract\n         * @param {?} newTitle\n         * @return {?}\n         */\n        DomAdapter.prototype.setTitle = function (newTitle) { };\n        /**\n         * @abstract\n         * @param {?} n\n         * @param {?} selector\n         * @return {?}\n         */\n        DomAdapter.prototype.elementMatches = function (n /** TODO #9100 */, selector) { };\n        /**\n         * @abstract\n         * @param {?} el\n         * @return {?}\n         */\n        DomAdapter.prototype.isTemplateElement = function (el) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.isTextNode = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.isCommentNode = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.isElementNode = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.hasShadowRoot = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.isShadowRoot = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.importIntoDoc /*<T extends Node>*/ = function (node) { };\n        /**\n         * @abstract\n         * @param {?} node\n         * @return {?}\n         */\n        DomAdapter.prototype.adoptNode /*<T extends Node>*/ = function (node) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @return {?}\n         */\n        DomAdapter.prototype.getHref = function (element) { };\n        /**\n         * @abstract\n         * @param {?} event\n         * @return {?}\n         */\n        DomAdapter.prototype.getEventKey = function (event) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} baseUrl\n         * @param {?} href\n         * @return {?}\n         */\n        DomAdapter.prototype.resolveAndSetHref = function (element /** TODO #9100 */, baseUrl, href) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.supportsDOMEvents = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.supportsNativeShadowDOM = function () { };\n        /**\n         * @abstract\n         * @param {?} target\n         * @return {?}\n         */\n        DomAdapter.prototype.getGlobalEventTarget = function (target) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getHistory = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getLocation = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getBaseHref = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.resetBaseElement = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getUserAgent = function () { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setData = function (element /** TODO #9100 */, name, value) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @return {?}\n         */\n        DomAdapter.prototype.getComputedStyle = function (element) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.getData = function (element /** TODO #9100 */, name) { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setGlobalVar = function (name, value) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.supportsWebAnimation = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.performanceNow = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getAnimationPrefix = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.getTransitionEnd = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.supportsAnimation = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        DomAdapter.prototype.supportsCookies = function () { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @return {?}\n         */\n        DomAdapter.prototype.getCookie = function (name) { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        DomAdapter.prototype.setCookie = function (name, value) { };\n        return DomAdapter;\n    }());\n\n    var WebAnimationsPlayer = (function () {\n        /**\n         * @param {?} element\n         * @param {?} keyframes\n         * @param {?} options\n         * @param {?=} previousPlayers\n         */\n        function WebAnimationsPlayer(element, keyframes, options, previousPlayers) {\n            var _this = this;\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            this.element = element;\n            this.keyframes = keyframes;\n            this.options = options;\n            this._onDoneFns = [];\n            this._onStartFns = [];\n            this._initialized = false;\n            this._finished = false;\n            this._started = false;\n            this._destroyed = false;\n            this.parentPlayer = null;\n            this._duration = options['duration'];\n            this.previousStyles = {};\n            previousPlayers.forEach(function (player) {\n                var styles = player._captureStyles();\n                Object.keys(styles).forEach(function (prop) { return _this.previousStyles[prop] = styles[prop]; });\n            });\n        }\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype._onFinish = function () {\n            if (!this._finished) {\n                this._finished = true;\n                this._onDoneFns.forEach(function (fn) { return fn(); });\n                this._onDoneFns = [];\n            }\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.init = function () {\n            var _this = this;\n            if (this._initialized)\n                return;\n            this._initialized = true;\n            var /** @type {?} */ keyframes = this.keyframes.map(function (styles) {\n                var /** @type {?} */ formattedKeyframe = {};\n                Object.keys(styles).forEach(function (prop, index) {\n                    var /** @type {?} */ value = styles[prop];\n                    if (value == core.AUTO_STYLE) {\n                        value = _computeStyle(_this.element, prop);\n                    }\n                    if (value != undefined) {\n                        formattedKeyframe[prop] = value;\n                    }\n                });\n                return formattedKeyframe;\n            });\n            var /** @type {?} */ previousStyleProps = Object.keys(this.previousStyles);\n            if (previousStyleProps.length) {\n                var /** @type {?} */ startingKeyframe_1 = keyframes[0];\n                var /** @type {?} */ missingStyleProps_1 = [];\n                previousStyleProps.forEach(function (prop) {\n                    if (!isPresent(startingKeyframe_1[prop])) {\n                        missingStyleProps_1.push(prop);\n                    }\n                    startingKeyframe_1[prop] = _this.previousStyles[prop];\n                });\n                if (missingStyleProps_1.length) {\n                    var _loop_1 = function(i) {\n                        var /** @type {?} */ kf = keyframes[i];\n                        missingStyleProps_1.forEach(function (prop) { kf[prop] = _computeStyle(_this.element, prop); });\n                    };\n                    for (var /** @type {?} */ i = 1; i < keyframes.length; i++) {\n                        _loop_1(i);\n                    }\n                }\n            }\n            this._player = this._triggerWebAnimation(this.element, keyframes, this.options);\n            this._finalKeyframe = _copyKeyframeStyles(keyframes[keyframes.length - 1]);\n            // this is required so that the player doesn't start to animate right away\n            this._resetDomPlayerState();\n            this._player.addEventListener('finish', function () { return _this._onFinish(); });\n        };\n        /**\n         * \\@internal\n         * @param {?} element\n         * @param {?} keyframes\n         * @param {?} options\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype._triggerWebAnimation = function (element, keyframes, options) {\n            // jscompiler doesn't seem to know animate is a native property because it's not fully\n            // supported yet across common browsers (we polyfill it for Edge/Safari) [CL #143630929]\n            return (element['animate'](keyframes, options));\n        };\n        Object.defineProperty(WebAnimationsPlayer.prototype, \"domPlayer\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._player; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.play = function () {\n            this.init();\n            if (!this.hasStarted()) {\n                this._onStartFns.forEach(function (fn) { return fn(); });\n                this._onStartFns = [];\n                this._started = true;\n            }\n            this._player.play();\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.pause = function () {\n            this.init();\n            this._player.pause();\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.finish = function () {\n            this.init();\n            this._onFinish();\n            this._player.finish();\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.reset = function () {\n            this._resetDomPlayerState();\n            this._destroyed = false;\n            this._finished = false;\n            this._started = false;\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype._resetDomPlayerState = function () {\n            if (this._player) {\n                this._player.cancel();\n            }\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.restart = function () {\n            this.reset();\n            this.play();\n        };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.hasStarted = function () { return this._started; };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.destroy = function () {\n            if (!this._destroyed) {\n                this._resetDomPlayerState();\n                this._onFinish();\n                this._destroyed = true;\n            }\n        };\n        Object.defineProperty(WebAnimationsPlayer.prototype, \"totalTime\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._duration; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} p\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.setPosition = function (p) { this._player.currentTime = p * this.totalTime; };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype.getPosition = function () { return this._player.currentTime / this.totalTime; };\n        /**\n         * @return {?}\n         */\n        WebAnimationsPlayer.prototype._captureStyles = function () {\n            var _this = this;\n            var /** @type {?} */ styles = {};\n            if (this.hasStarted()) {\n                Object.keys(this._finalKeyframe).forEach(function (prop) {\n                    if (prop != 'offset') {\n                        styles[prop] =\n                            _this._finished ? _this._finalKeyframe[prop] : _computeStyle(_this.element, prop);\n                    }\n                });\n            }\n            return styles;\n        };\n        return WebAnimationsPlayer;\n    }());\n    /**\n     * @param {?} element\n     * @param {?} prop\n     * @return {?}\n     */\n    function _computeStyle(element, prop) {\n        return getDOM().getComputedStyle(element)[prop];\n    }\n    /**\n     * @param {?} styles\n     * @return {?}\n     */\n    function _copyKeyframeStyles(styles) {\n        var /** @type {?} */ newStyles = {};\n        Object.keys(styles).forEach(function (prop) {\n            if (prop != 'offset') {\n                newStyles[prop] = styles[prop];\n            }\n        });\n        return newStyles;\n    }\n\n    var WebAnimationsDriver = (function () {\n        function WebAnimationsDriver() {\n        }\n        /**\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        WebAnimationsDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            var /** @type {?} */ formattedSteps = [];\n            var /** @type {?} */ startingStyleLookup = {};\n            if (isPresent(startingStyles)) {\n                startingStyleLookup = _populateStyles(startingStyles, {});\n            }\n            keyframes.forEach(function (keyframe) {\n                var /** @type {?} */ data = _populateStyles(keyframe.styles, startingStyleLookup);\n                data['offset'] = Math.max(0, Math.min(1, keyframe.offset));\n                formattedSteps.push(data);\n            });\n            // Styling passed into element.animate() must always be balanced.\n            // The special cases below can occur if only style() calls exist\n            // within an animation or when a style() calls are used prior\n            // to a group() animation being issued or if the renderer is\n            // invoked by the user directly.\n            if (formattedSteps.length == 0) {\n                formattedSteps = [startingStyleLookup, startingStyleLookup];\n            }\n            else if (formattedSteps.length == 1) {\n                var /** @type {?} */ start = startingStyleLookup;\n                var /** @type {?} */ end = formattedSteps[0];\n                end['offset'] = null;\n                formattedSteps = [start, end];\n            }\n            var /** @type {?} */ playerOptions = {\n                'duration': duration,\n                'delay': delay,\n                'fill': 'both' // we use `both` because it allows for styling at 0% to work with `delay`\n            };\n            // we check for this to avoid having a null|undefined value be present\n            // for the easing (which results in an error for certain browsers #9752)\n            if (easing) {\n                playerOptions['easing'] = easing;\n            }\n            // there may be a chance a NoOp player is returned depending\n            // on when the previous animation was cancelled\n            previousPlayers = previousPlayers.filter(filterWebAnimationPlayerFn);\n            return new WebAnimationsPlayer(element, formattedSteps, playerOptions, /** @type {?} */ (previousPlayers));\n        };\n        return WebAnimationsDriver;\n    }());\n    /**\n     * @param {?} styles\n     * @param {?} defaultStyles\n     * @return {?}\n     */\n    function _populateStyles(styles, defaultStyles) {\n        var /** @type {?} */ data = {};\n        styles.styles.forEach(function (entry) { Object.keys(entry).forEach(function (prop) { data[prop] = entry[prop]; }); });\n        Object.keys(defaultStyles).forEach(function (prop) {\n            if (!isPresent(data[prop])) {\n                data[prop] = defaultStyles[prop];\n            }\n        });\n        return data;\n    }\n    /**\n     * @param {?} player\n     * @return {?}\n     */\n    function filterWebAnimationPlayerFn(player) {\n        return player instanceof WebAnimationsPlayer;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Provides DOM operations in any browser environment.\n     *\n     * \\@security Tread carefully! Interacting with the DOM directly is dangerous and\n     * can introduce XSS risks.\n     * @abstract\n     */\n    var GenericBrowserDomAdapter = (function (_super) {\n        __extends$1(GenericBrowserDomAdapter, _super);\n        function GenericBrowserDomAdapter() {\n            var _this = this;\n            _super.call(this);\n            this._animationPrefix = null;\n            this._transitionEnd = null;\n            try {\n                var element_1 = this.createElement('div', this.defaultDoc());\n                if (isPresent(this.getStyle(element_1, 'animationName'))) {\n                    this._animationPrefix = '';\n                }\n                else {\n                    var domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];\n                    for (var i = 0; i < domPrefixes.length; i++) {\n                        if (isPresent(this.getStyle(element_1, domPrefixes[i] + 'AnimationName'))) {\n                            this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';\n                            break;\n                        }\n                    }\n                }\n                var transEndEventNames_1 = {\n                    WebkitTransition: 'webkitTransitionEnd',\n                    MozTransition: 'transitionend',\n                    OTransition: 'oTransitionEnd otransitionend',\n                    transition: 'transitionend'\n                };\n                Object.keys(transEndEventNames_1).forEach(function (key) {\n                    if (isPresent(_this.getStyle(element_1, key))) {\n                        _this._transitionEnd = transEndEventNames_1[key];\n                    }\n                });\n            }\n            catch (e) {\n                this._animationPrefix = null;\n                this._transitionEnd = null;\n            }\n        }\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.getDistributedNodes = function (el) { return ((el)).getDistributedNodes(); };\n        /**\n         * @param {?} el\n         * @param {?} baseUrl\n         * @param {?} href\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.resolveAndSetHref = function (el, baseUrl, href) {\n            el.href = href == null ? baseUrl : baseUrl + '/../' + href;\n        };\n        /**\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () { return true; };\n        /**\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM = function () {\n            return typeof ((this.defaultDoc().body)).createShadowRoot === 'function';\n        };\n        /**\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.getAnimationPrefix = function () { return this._animationPrefix ? this._animationPrefix : ''; };\n        /**\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.getTransitionEnd = function () { return this._transitionEnd ? this._transitionEnd : ''; };\n        /**\n         * @return {?}\n         */\n        GenericBrowserDomAdapter.prototype.supportsAnimation = function () {\n            return isPresent(this._animationPrefix) && isPresent(this._transitionEnd);\n        };\n        return GenericBrowserDomAdapter;\n    }(DomAdapter));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _attrToPropMap = {\n        'class': 'className',\n        'innerHtml': 'innerHTML',\n        'readonly': 'readOnly',\n        'tabindex': 'tabIndex',\n    };\n    var /** @type {?} */ DOM_KEY_LOCATION_NUMPAD = 3;\n    // Map to convert some key or keyIdentifier values to what will be returned by getEventKey\n    var /** @type {?} */ _keyMap = {\n        // The following values are here for cross-browser compatibility and to match the W3C standard\n        // cf http://www.w3.org/TR/DOM-Level-3-Events-key/\n        '\\b': 'Backspace',\n        '\\t': 'Tab',\n        '\\x7F': 'Delete',\n        '\\x1B': 'Escape',\n        'Del': 'Delete',\n        'Esc': 'Escape',\n        'Left': 'ArrowLeft',\n        'Right': 'ArrowRight',\n        'Up': 'ArrowUp',\n        'Down': 'ArrowDown',\n        'Menu': 'ContextMenu',\n        'Scroll': 'ScrollLock',\n        'Win': 'OS'\n    };\n    // There is a bug in Chrome for numeric keypad keys:\n    // https://code.google.com/p/chromium/issues/detail?id=155654\n    // 1, 2, 3 ... are reported as A, B, C ...\n    var /** @type {?} */ _chromeNumKeyPadMap = {\n        'A': '1',\n        'B': '2',\n        'C': '3',\n        'D': '4',\n        'E': '5',\n        'F': '6',\n        'G': '7',\n        'H': '8',\n        'I': '9',\n        'J': '*',\n        'K': '+',\n        'M': '-',\n        'N': '.',\n        'O': '/',\n        '\\x60': '0',\n        '\\x90': 'NumLock'\n    };\n    var BrowserDomAdapter = (function (_super) {\n        __extends(BrowserDomAdapter, _super);\n        function BrowserDomAdapter() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} templateHtml\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.parse = function (templateHtml) { throw new Error('parse not implemented'); };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.makeCurrent = function () { setRootDomAdapter(new BrowserDomAdapter()); };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasProperty = function (element, name) { return name in element; };\n        /**\n         * @param {?} el\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setProperty = function (el, name, value) { ((el))[name] = value; };\n        /**\n         * @param {?} el\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getProperty = function (el, name) { return ((el))[name]; };\n        /**\n         * @param {?} el\n         * @param {?} methodName\n         * @param {?} args\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.invoke = function (el, methodName, args) { (_a = ((el)))[methodName].apply(_a, args); var _a; };\n        /**\n         * @param {?} error\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.logError = function (error) {\n            if (window.console) {\n                if (console.error) {\n                    console.error(error);\n                }\n                else {\n                    console.log(error);\n                }\n            }\n        };\n        /**\n         * @param {?} error\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.log = function (error) {\n            if (window.console) {\n                window.console.log && window.console.log(error);\n            }\n        };\n        /**\n         * @param {?} error\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.logGroup = function (error) {\n            if (window.console) {\n                window.console.group && window.console.group(error);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.logGroupEnd = function () {\n            if (window.console) {\n                window.console.groupEnd && window.console.groupEnd();\n            }\n        };\n        Object.defineProperty(BrowserDomAdapter.prototype, \"attrToPropMap\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return _attrToPropMap; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} selector\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.query = function (selector) { return document.querySelector(selector); };\n        /**\n         * @param {?} el\n         * @param {?} selector\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.querySelector = function (el, selector) {\n            return (el.querySelector(selector));\n        };\n        /**\n         * @param {?} el\n         * @param {?} selector\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.querySelectorAll = function (el, selector) { return el.querySelectorAll(selector); };\n        /**\n         * @param {?} el\n         * @param {?} evt\n         * @param {?} listener\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.on = function (el, evt, listener) { el.addEventListener(evt, listener, false); };\n        /**\n         * @param {?} el\n         * @param {?} evt\n         * @param {?} listener\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.onAndCancel = function (el, evt, listener) {\n            el.addEventListener(evt, listener, false);\n            // Needed to follow Dart's subscription semantic, until fix of\n            // https://code.google.com/p/dart/issues/detail?id=17406\n            return function () { el.removeEventListener(evt, listener, false); };\n        };\n        /**\n         * @param {?} el\n         * @param {?} evt\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) { el.dispatchEvent(evt); };\n        /**\n         * @param {?} eventType\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createMouseEvent = function (eventType) {\n            var /** @type {?} */ evt = document.createEvent('MouseEvent');\n            evt.initEvent(eventType, true, true);\n            return evt;\n        };\n        /**\n         * @param {?} eventType\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createEvent = function (eventType) {\n            var /** @type {?} */ evt = document.createEvent('Event');\n            evt.initEvent(eventType, true, true);\n            return evt;\n        };\n        /**\n         * @param {?} evt\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.preventDefault = function (evt) {\n            evt.preventDefault();\n            evt.returnValue = false;\n        };\n        /**\n         * @param {?} evt\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isPrevented = function (evt) {\n            return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue;\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getInnerHTML = function (el) { return el.innerHTML; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getTemplateContent = function (el) {\n            return 'content' in el && el instanceof HTMLTemplateElement ? el.content : null;\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getOuterHTML = function (el) { return el.outerHTML; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.nodeName = function (node) { return node.nodeName; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.nodeValue = function (node) { return node.nodeValue; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.type = function (node) { return node.type; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.content = function (node) {\n            if (this.hasProperty(node, 'content')) {\n                return ((node)).content;\n            }\n            else {\n                return node;\n            }\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.firstChild = function (el) { return el.firstChild; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.nextSibling = function (el) { return el.nextSibling; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.parentElement = function (el) { return el.parentNode; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.childNodes = function (el) { return el.childNodes; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.childNodesAsList = function (el) {\n            var /** @type {?} */ childNodes = el.childNodes;\n            var /** @type {?} */ res = new Array(childNodes.length);\n            for (var /** @type {?} */ i = 0; i < childNodes.length; i++) {\n                res[i] = childNodes[i];\n            }\n            return res;\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.clearNodes = function (el) {\n            while (el.firstChild) {\n                el.removeChild(el.firstChild);\n            }\n        };\n        /**\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.appendChild = function (el, node) { el.appendChild(node); };\n        /**\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.removeChild = function (el, node) { el.removeChild(node); };\n        /**\n         * @param {?} el\n         * @param {?} newChild\n         * @param {?} oldChild\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.replaceChild = function (el, newChild, oldChild) { el.replaceChild(newChild, oldChild); };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.remove = function (node) {\n            if (node.parentNode) {\n                node.parentNode.removeChild(node);\n            }\n            return node;\n        };\n        /**\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.insertBefore = function (el, node) { el.parentNode.insertBefore(node, el); };\n        /**\n         * @param {?} el\n         * @param {?} nodes\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.insertAllBefore = function (el, nodes) {\n            nodes.forEach(function (n) { return el.parentNode.insertBefore(n, el); });\n        };\n        /**\n         * @param {?} el\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.insertAfter = function (el, node) { el.parentNode.insertBefore(node, el.nextSibling); };\n        /**\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setInnerHTML = function (el, value) { el.innerHTML = value; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getText = function (el) { return el.textContent; };\n        /**\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setText = function (el, value) { el.textContent = value; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getValue = function (el) { return el.value; };\n        /**\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setValue = function (el, value) { el.value = value; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getChecked = function (el) { return el.checked; };\n        /**\n         * @param {?} el\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setChecked = function (el, value) { el.checked = value; };\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createComment = function (text) { return document.createComment(text); };\n        /**\n         * @param {?} html\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createTemplate = function (html) {\n            var /** @type {?} */ t = document.createElement('template');\n            t.innerHTML = html;\n            return t;\n        };\n        /**\n         * @param {?} tagName\n         * @param {?=} doc\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createElement = function (tagName, doc) {\n            if (doc === void 0) { doc = document; }\n            return doc.createElement(tagName);\n        };\n        /**\n         * @param {?} ns\n         * @param {?} tagName\n         * @param {?=} doc\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createElementNS = function (ns, tagName, doc) {\n            if (doc === void 0) { doc = document; }\n            return doc.createElementNS(ns, tagName);\n        };\n        /**\n         * @param {?} text\n         * @param {?=} doc\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createTextNode = function (text, doc) {\n            if (doc === void 0) { doc = document; }\n            return doc.createTextNode(text);\n        };\n        /**\n         * @param {?} attrName\n         * @param {?} attrValue\n         * @param {?=} doc\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) {\n            if (doc === void 0) { doc = document; }\n            var /** @type {?} */ el = (doc.createElement('SCRIPT'));\n            el.setAttribute(attrName, attrValue);\n            return el;\n        };\n        /**\n         * @param {?} css\n         * @param {?=} doc\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createStyleElement = function (css, doc) {\n            if (doc === void 0) { doc = document; }\n            var /** @type {?} */ style = (doc.createElement('style'));\n            this.appendChild(style, this.createTextNode(css));\n            return style;\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createShadowRoot = function (el) { return ((el)).createShadowRoot(); };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getShadowRoot = function (el) { return ((el)).shadowRoot; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getHost = function (el) { return ((el)).host; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.clone = function (node) { return node.cloneNode(true); };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getElementsByClassName = function (element, name) {\n            return element.getElementsByClassName(name);\n        };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getElementsByTagName = function (element, name) {\n            return element.getElementsByTagName(name);\n        };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.classList = function (element) { return Array.prototype.slice.call(element.classList, 0); };\n        /**\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.addClass = function (element, className) { element.classList.add(className); };\n        /**\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.removeClass = function (element, className) { element.classList.remove(className); };\n        /**\n         * @param {?} element\n         * @param {?} className\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasClass = function (element, className) {\n            return element.classList.contains(className);\n        };\n        /**\n         * @param {?} element\n         * @param {?} styleName\n         * @param {?} styleValue\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setStyle = function (element, styleName, styleValue) {\n            element.style[styleName] = styleValue;\n        };\n        /**\n         * @param {?} element\n         * @param {?} stylename\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.removeStyle = function (element, stylename) {\n            // IE requires '' instead of null\n            // see https://github.com/angular/angular/issues/7916\n            element.style[stylename] = '';\n        };\n        /**\n         * @param {?} element\n         * @param {?} stylename\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getStyle = function (element, stylename) { return element.style[stylename]; };\n        /**\n         * @param {?} element\n         * @param {?} styleName\n         * @param {?=} styleValue\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasStyle = function (element, styleName, styleValue) {\n            if (styleValue === void 0) { styleValue = null; }\n            var /** @type {?} */ value = this.getStyle(element, styleName) || '';\n            return styleValue ? value == styleValue : value.length > 0;\n        };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.tagName = function (element) { return element.tagName; };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.attributeMap = function (element) {\n            var /** @type {?} */ res = new Map();\n            var /** @type {?} */ elAttrs = element.attributes;\n            for (var /** @type {?} */ i = 0; i < elAttrs.length; i++) {\n                var /** @type {?} */ attrib = elAttrs[i];\n                res.set(attrib.name, attrib.value);\n            }\n            return res;\n        };\n        /**\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasAttribute = function (element, attribute) {\n            return element.hasAttribute(attribute);\n        };\n        /**\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} attribute\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasAttributeNS = function (element, ns, attribute) {\n            return element.hasAttributeNS(ns, attribute);\n        };\n        /**\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getAttribute = function (element, attribute) {\n            return element.getAttribute(attribute);\n        };\n        /**\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getAttributeNS = function (element, ns, name) {\n            return element.getAttributeNS(ns, name);\n        };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setAttribute = function (element, name, value) { element.setAttribute(name, value); };\n        /**\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setAttributeNS = function (element, ns, name, value) {\n            element.setAttributeNS(ns, name, value);\n        };\n        /**\n         * @param {?} element\n         * @param {?} attribute\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.removeAttribute = function (element, attribute) { element.removeAttribute(attribute); };\n        /**\n         * @param {?} element\n         * @param {?} ns\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.removeAttributeNS = function (element, ns, name) {\n            element.removeAttributeNS(ns, name);\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.templateAwareRoot = function (el) { return this.isTemplateElement(el) ? this.content(el) : el; };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.createHtmlDocument = function () {\n            return document.implementation.createHTMLDocument('fakeTitle');\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.defaultDoc = function () { return document; };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getBoundingClientRect = function (el) {\n            try {\n                return el.getBoundingClientRect();\n            }\n            catch (e) {\n                return { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 };\n            }\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getTitle = function () { return document.title; };\n        /**\n         * @param {?} newTitle\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setTitle = function (newTitle) { document.title = newTitle || ''; };\n        /**\n         * @param {?} n\n         * @param {?} selector\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.elementMatches = function (n, selector) {\n            if (n instanceof HTMLElement) {\n                return n.matches && n.matches(selector) ||\n                    n.msMatchesSelector && n.msMatchesSelector(selector) ||\n                    n.webkitMatchesSelector && n.webkitMatchesSelector(selector);\n            }\n            return false;\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isTemplateElement = function (el) {\n            return el instanceof HTMLElement && el.nodeName == 'TEMPLATE';\n        };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isCommentNode = function (node) { return node.nodeType === Node.COMMENT_NODE; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.hasShadowRoot = function (node) {\n            return isPresent(node.shadowRoot) && node instanceof HTMLElement;\n        };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.isShadowRoot = function (node) { return node instanceof DocumentFragment; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.importIntoDoc = function (node) { return document.importNode(this.templateAwareRoot(node), true); };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.adoptNode = function (node) { return document.adoptNode(node); };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getHref = function (el) { return ((el)).href; };\n        /**\n         * @param {?} event\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getEventKey = function (event) {\n            var /** @type {?} */ key = event.key;\n            if (isBlank(key)) {\n                key = event.keyIdentifier;\n                // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and\n                // Safari cf\n                // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces\n                if (isBlank(key)) {\n                    return 'Unidentified';\n                }\n                if (key.startsWith('U+')) {\n                    key = String.fromCharCode(parseInt(key.substring(2), 16));\n                    if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) {\n                        // There is a bug in Chrome for numeric keypad keys:\n                        // https://code.google.com/p/chromium/issues/detail?id=155654\n                        // 1, 2, 3 ... are reported as A, B, C ...\n                        key = ((_chromeNumKeyPadMap))[key];\n                    }\n                }\n            }\n            return _keyMap[key] || key;\n        };\n        /**\n         * @param {?} target\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getGlobalEventTarget = function (target) {\n            if (target === 'window') {\n                return window;\n            }\n            if (target === 'document') {\n                return document;\n            }\n            if (target === 'body') {\n                return document.body;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getHistory = function () { return window.history; };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getLocation = function () { return window.location; };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getBaseHref = function () {\n            var /** @type {?} */ href = getBaseElementHref();\n            return isBlank(href) ? null : relativePath(href);\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.resetBaseElement = function () { baseElement = null; };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getUserAgent = function () { return window.navigator.userAgent; };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setData = function (element, name, value) {\n            this.setAttribute(element, 'data-' + name, value);\n        };\n        /**\n         * @param {?} element\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getData = function (element, name) {\n            return this.getAttribute(element, 'data-' + name);\n        };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getComputedStyle = function (element) { return getComputedStyle(element); };\n        /**\n         * @param {?} path\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setGlobalVar = function (path, value) { setValueOnPath(global$1, path, value); };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.supportsWebAnimation = function () {\n            return typeof ((Element)).prototype['animate'] === 'function';\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.performanceNow = function () {\n            // performance.now() is not available in all browsers, see\n            // http://caniuse.com/#search=performance.now\n            return window.performance && window.performance.now ? window.performance.now() :\n                new Date().getTime();\n        };\n        /**\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.supportsCookies = function () { return true; };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.getCookie = function (name) { return parseCookieValue(document.cookie, name); };\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        BrowserDomAdapter.prototype.setCookie = function (name, value) {\n            // document.cookie is magical, assigning into it assigns/overrides one cookie value, but does\n            // not clear other cookies.\n            document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n        };\n        return BrowserDomAdapter;\n    }(GenericBrowserDomAdapter));\n    var /** @type {?} */ baseElement = null;\n    /**\n     * @return {?}\n     */\n    function getBaseElementHref() {\n        if (!baseElement) {\n            baseElement = document.querySelector('base');\n            if (!baseElement) {\n                return null;\n            }\n        }\n        return baseElement.getAttribute('href');\n    }\n    // based on urlUtils.js in AngularJS 1\n    var /** @type {?} */ urlParsingNode;\n    /**\n     * @param {?} url\n     * @return {?}\n     */\n    function relativePath(url) {\n        if (!urlParsingNode) {\n            urlParsingNode = document.createElement('a');\n        }\n        urlParsingNode.setAttribute('href', url);\n        return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname :\n            '/' + urlParsingNode.pathname;\n    }\n    /**\n     * @param {?} cookieStr\n     * @param {?} name\n     * @return {?}\n     */\n    function parseCookieValue(cookieStr, name) {\n        name = encodeURIComponent(name);\n        for (var _i = 0, _a = cookieStr.split(';'); _i < _a.length; _i++) {\n            var cookie = _a[_i];\n            var /** @type {?} */ eqIndex = cookie.indexOf('=');\n            var _b = eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)], cookieName = _b[0], cookieValue = _b[1];\n            if (cookieName.trim() === name) {\n                return decodeURIComponent(cookieValue);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     * @return {?}\n     */\n    function supportsState() {\n        return !!window.history.pushState;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$2 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * `PlatformLocation` encapsulates all of the direct calls to platform APIs.\n     * This class should not be used directly by an application developer. Instead, use\n     * {\\@link Location}.\n     */\n    var BrowserPlatformLocation = (function (_super) {\n        __extends$2(BrowserPlatformLocation, _super);\n        function BrowserPlatformLocation() {\n            _super.call(this);\n            this._init();\n        }\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype._init = function () {\n            this._location = getDOM().getLocation();\n            this._history = getDOM().getHistory();\n        };\n        Object.defineProperty(BrowserPlatformLocation.prototype, \"location\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._location; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.getBaseHrefFromDOM = function () { return getDOM().getBaseHref(); };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.onPopState = function (fn) {\n            getDOM().getGlobalEventTarget('window').addEventListener('popstate', fn, false);\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.onHashChange = function (fn) {\n            getDOM().getGlobalEventTarget('window').addEventListener('hashchange', fn, false);\n        };\n        Object.defineProperty(BrowserPlatformLocation.prototype, \"pathname\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._location.pathname; },\n            /**\n             * @param {?} newPath\n             * @return {?}\n             */\n            set: function (newPath) { this._location.pathname = newPath; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BrowserPlatformLocation.prototype, \"search\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._location.search; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BrowserPlatformLocation.prototype, \"hash\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._location.hash; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.pushState = function (state, title, url) {\n            if (supportsState()) {\n                this._history.pushState(state, title, url);\n            }\n            else {\n                this._location.hash = url;\n            }\n        };\n        /**\n         * @param {?} state\n         * @param {?} title\n         * @param {?} url\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.replaceState = function (state, title, url) {\n            if (supportsState()) {\n                this._history.replaceState(state, title, url);\n            }\n            else {\n                this._location.hash = url;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.forward = function () { this._history.forward(); };\n        /**\n         * @return {?}\n         */\n        BrowserPlatformLocation.prototype.back = function () { this._history.back(); };\n        BrowserPlatformLocation.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        BrowserPlatformLocation.ctorParameters = function () { return []; };\n        return BrowserPlatformLocation;\n    }(_angular_common.PlatformLocation));\n\n    var BrowserGetTestability = (function () {\n        function BrowserGetTestability() {\n        }\n        /**\n         * @return {?}\n         */\n        BrowserGetTestability.init = function () { core.setTestabilityGetter(new BrowserGetTestability()); };\n        /**\n         * @param {?} registry\n         * @return {?}\n         */\n        BrowserGetTestability.prototype.addToWindow = function (registry) {\n            global$1.getAngularTestability = function (elem, findInAncestors) {\n                if (findInAncestors === void 0) { findInAncestors = true; }\n                var /** @type {?} */ testability = registry.findTestabilityInTree(elem, findInAncestors);\n                if (testability == null) {\n                    throw new Error('Could not find testability for element.');\n                }\n                return testability;\n            };\n            global$1.getAllAngularTestabilities = function () { return registry.getAllTestabilities(); };\n            global$1.getAllAngularRootElements = function () { return registry.getAllRootElements(); };\n            var /** @type {?} */ whenAllStable = function (callback /** TODO #9100 */) {\n                var /** @type {?} */ testabilities = global$1.getAllAngularTestabilities();\n                var /** @type {?} */ count = testabilities.length;\n                var /** @type {?} */ didWork = false;\n                var /** @type {?} */ decrement = function (didWork_ /** TODO #9100 */) {\n                    didWork = didWork || didWork_;\n                    count--;\n                    if (count == 0) {\n                        callback(didWork);\n                    }\n                };\n                testabilities.forEach(function (testability /** TODO #9100 */) {\n                    testability.whenStable(decrement);\n                });\n            };\n            if (!global$1['frameworkStabilizers']) {\n                global$1['frameworkStabilizers'] = [];\n            }\n            global$1['frameworkStabilizers'].push(whenAllStable);\n        };\n        /**\n         * @param {?} registry\n         * @param {?} elem\n         * @param {?} findInAncestors\n         * @return {?}\n         */\n        BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {\n            if (elem == null) {\n                return null;\n            }\n            var /** @type {?} */ t = registry.getTestability(elem);\n            if (isPresent(t)) {\n                return t;\n            }\n            else if (!findInAncestors) {\n                return null;\n            }\n            if (getDOM().isShadowRoot(elem)) {\n                return this.findTestabilityInTree(registry, getDOM().getHost(elem), true);\n            }\n            return this.findTestabilityInTree(registry, getDOM().parentElement(elem), true);\n        };\n        return BrowserGetTestability;\n    }());\n\n    /**\n     * A service that can be used to get and set the title of a current HTML document.\n     *\n     * Since an Angular 2 application can't be bootstrapped on the entire HTML document (`<html>` tag)\n     * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements\n     * (representing the `<title>` tag). Instead, this service can be used to set and get the current\n     * title value.\n     *\n     * \\@experimental\n     */\n    var Title = (function () {\n        function Title() {\n        }\n        /**\n         * Get the title of the current HTML document.\n         * @return {?}\n         */\n        Title.prototype.getTitle = function () { return getDOM().getTitle(); };\n        /**\n         * Set the title of the current HTML document.\n         * @param {?} newTitle\n         * @return {?}\n         */\n        Title.prototype.setTitle = function (newTitle) { getDOM().setTitle(newTitle); };\n        return Title;\n    }());\n\n    /**\n     * Wraps Javascript Objects\n     */\n    var StringMapWrapper = (function () {\n        function StringMapWrapper() {\n        }\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.merge = function (m1, m2) {\n            var /** @type {?} */ m = {};\n            for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n                var k = _a[_i];\n                m[k] = m1[k];\n            }\n            for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n                var k = _c[_b];\n                m[k] = m2[k];\n            }\n            return m;\n        };\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.equals = function (m1, m2) {\n            var /** @type {?} */ k1 = Object.keys(m1);\n            var /** @type {?} */ k2 = Object.keys(m2);\n            if (k1.length != k2.length) {\n                return false;\n            }\n            for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n                var /** @type {?} */ key = k1[i];\n                if (m1[key] !== m2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        return StringMapWrapper;\n    }());\n\n    /**\n     * A DI Token representing the main rendering context. In a browser this is the DOM Document.\n     *\n     * Note: Document might not be available in the Application Context when Application and Rendering\n     * Contexts are not the same (e.g. when running the application into a Web Worker).\n     *\n     * @stable\n     */\n    var /** @type {?} */ DOCUMENT = new core.OpaqueToken('DocumentToken');\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ EVENT_MANAGER_PLUGINS = new core.OpaqueToken('EventManagerPlugins');\n    /**\n     * \\@stable\n     */\n    var EventManager = (function () {\n        /**\n         * @param {?} plugins\n         * @param {?} _zone\n         */\n        function EventManager(plugins, _zone) {\n            var _this = this;\n            this._zone = _zone;\n            this._eventNameToPlugin = new Map();\n            plugins.forEach(function (p) { return p.manager = _this; });\n            this._plugins = plugins.slice().reverse();\n        }\n        /**\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        EventManager.prototype.addEventListener = function (element, eventName, handler) {\n            var /** @type {?} */ plugin = this._findPluginFor(eventName);\n            return plugin.addEventListener(element, eventName, handler);\n        };\n        /**\n         * @param {?} target\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {\n            var /** @type {?} */ plugin = this._findPluginFor(eventName);\n            return plugin.addGlobalEventListener(target, eventName, handler);\n        };\n        /**\n         * @return {?}\n         */\n        EventManager.prototype.getZone = function () { return this._zone; };\n        /**\n         * \\@internal\n         * @param {?} eventName\n         * @return {?}\n         */\n        EventManager.prototype._findPluginFor = function (eventName) {\n            var /** @type {?} */ plugin = this._eventNameToPlugin.get(eventName);\n            if (plugin) {\n                return plugin;\n            }\n            var /** @type {?} */ plugins = this._plugins;\n            for (var /** @type {?} */ i = 0; i < plugins.length; i++) {\n                var /** @type {?} */ plugin_1 = plugins[i];\n                if (plugin_1.supports(eventName)) {\n                    this._eventNameToPlugin.set(eventName, plugin_1);\n                    return plugin_1;\n                }\n            }\n            throw new Error(\"No event manager plugin found for event \" + eventName);\n        };\n        EventManager.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        EventManager.ctorParameters = function () { return [\n            { type: Array, decorators: [{ type: core.Inject, args: [EVENT_MANAGER_PLUGINS,] },] },\n            { type: core.NgZone, },\n        ]; };\n        return EventManager;\n    }());\n    /**\n     * @abstract\n     */\n    var EventManagerPlugin = (function () {\n        function EventManagerPlugin() {\n        }\n        /**\n         * @abstract\n         * @param {?} eventName\n         * @return {?}\n         */\n        EventManagerPlugin.prototype.supports = function (eventName) { };\n        /**\n         * @abstract\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        EventManagerPlugin.prototype.addEventListener = function (element, eventName, handler) { };\n        /**\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {\n            var /** @type {?} */ target = getDOM().getGlobalEventTarget(element);\n            if (!target) {\n                throw new Error(\"Unsupported event target \" + target + \" for event \" + eventName);\n            }\n            return this.addEventListener(target, eventName, handler);\n        };\n        ;\n        return EventManagerPlugin;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$4 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var SharedStylesHost = (function () {\n        function SharedStylesHost() {\n            /** @internal */\n            this._stylesSet = new Set();\n        }\n        /**\n         * @param {?} styles\n         * @return {?}\n         */\n        SharedStylesHost.prototype.addStyles = function (styles) {\n            var _this = this;\n            var /** @type {?} */ additions = new Set();\n            styles.forEach(function (style) {\n                if (!_this._stylesSet.has(style)) {\n                    _this._stylesSet.add(style);\n                    additions.add(style);\n                }\n            });\n            this.onStylesAdded(additions);\n        };\n        /**\n         * @param {?} additions\n         * @return {?}\n         */\n        SharedStylesHost.prototype.onStylesAdded = function (additions) { };\n        /**\n         * @return {?}\n         */\n        SharedStylesHost.prototype.getAllStyles = function () { return Array.from(this._stylesSet); };\n        SharedStylesHost.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        SharedStylesHost.ctorParameters = function () { return []; };\n        return SharedStylesHost;\n    }());\n    var DomSharedStylesHost = (function (_super) {\n        __extends$4(DomSharedStylesHost, _super);\n        /**\n         * @param {?} _doc\n         */\n        function DomSharedStylesHost(_doc) {\n            _super.call(this);\n            this._doc = _doc;\n            this._hostNodes = new Set();\n            this._styleNodes = new Set();\n            this._hostNodes.add(_doc.head);\n        }\n        /**\n         * @param {?} styles\n         * @param {?} host\n         * @return {?}\n         */\n        DomSharedStylesHost.prototype._addStylesToHost = function (styles, host) {\n            var _this = this;\n            styles.forEach(function (style) {\n                var /** @type {?} */ styleEl = _this._doc.createElement('style');\n                styleEl.textContent = style;\n                _this._styleNodes.add(host.appendChild(styleEl));\n            });\n        };\n        /**\n         * @param {?} hostNode\n         * @return {?}\n         */\n        DomSharedStylesHost.prototype.addHost = function (hostNode) {\n            this._addStylesToHost(this._stylesSet, hostNode);\n            this._hostNodes.add(hostNode);\n        };\n        /**\n         * @param {?} hostNode\n         * @return {?}\n         */\n        DomSharedStylesHost.prototype.removeHost = function (hostNode) { this._hostNodes.delete(hostNode); };\n        /**\n         * @param {?} additions\n         * @return {?}\n         */\n        DomSharedStylesHost.prototype.onStylesAdded = function (additions) {\n            var _this = this;\n            this._hostNodes.forEach(function (hostNode) { return _this._addStylesToHost(additions, hostNode); });\n        };\n        /**\n         * @return {?}\n         */\n        DomSharedStylesHost.prototype.ngOnDestroy = function () { this._styleNodes.forEach(function (styleNode) { return getDOM().remove(styleNode); }); };\n        DomSharedStylesHost.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        DomSharedStylesHost.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: core.Inject, args: [DOCUMENT,] },] },\n        ]; };\n        return DomSharedStylesHost;\n    }(SharedStylesHost));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$3 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ NAMESPACE_URIS = {\n        'xlink': 'http://www.w3.org/1999/xlink',\n        'svg': 'http://www.w3.org/2000/svg',\n        'xhtml': 'http://www.w3.org/1999/xhtml'\n    };\n    var /** @type {?} */ TEMPLATE_COMMENT_TEXT = 'template bindings={}';\n    var /** @type {?} */ TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/;\n    /**\n     * @abstract\n     */\n    var DomRootRenderer = (function () {\n        /**\n         * @param {?} document\n         * @param {?} eventManager\n         * @param {?} sharedStylesHost\n         * @param {?} animationDriver\n         * @param {?} appId\n         */\n        function DomRootRenderer(document, eventManager, sharedStylesHost, animationDriver, appId) {\n            this.document = document;\n            this.eventManager = eventManager;\n            this.sharedStylesHost = sharedStylesHost;\n            this.animationDriver = animationDriver;\n            this.appId = appId;\n            this.registeredComponents = new Map();\n        }\n        /**\n         * @param {?} componentProto\n         * @return {?}\n         */\n        DomRootRenderer.prototype.renderComponent = function (componentProto) {\n            var /** @type {?} */ renderer = this.registeredComponents.get(componentProto.id);\n            if (!renderer) {\n                renderer = new DomRenderer(this, componentProto, this.animationDriver, this.appId + \"-\" + componentProto.id);\n                this.registeredComponents.set(componentProto.id, renderer);\n            }\n            return renderer;\n        };\n        return DomRootRenderer;\n    }());\n    var DomRootRenderer_ = (function (_super) {\n        __extends$3(DomRootRenderer_, _super);\n        /**\n         * @param {?} _document\n         * @param {?} _eventManager\n         * @param {?} sharedStylesHost\n         * @param {?} animationDriver\n         * @param {?} appId\n         */\n        function DomRootRenderer_(_document, _eventManager, sharedStylesHost, animationDriver, appId) {\n            _super.call(this, _document, _eventManager, sharedStylesHost, animationDriver, appId);\n        }\n        DomRootRenderer_.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        DomRootRenderer_.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: core.Inject, args: [DOCUMENT,] },] },\n            { type: EventManager, },\n            { type: DomSharedStylesHost, },\n            { type: AnimationDriver, },\n            { type: undefined, decorators: [{ type: core.Inject, args: [core.APP_ID,] },] },\n        ]; };\n        return DomRootRenderer_;\n    }(DomRootRenderer));\n    var /** @type {?} */ DIRECT_DOM_RENDERER = {\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        remove: function (node) {\n            if (node.parentNode) {\n                node.parentNode.removeChild(node);\n            }\n        },\n        /**\n         * @param {?} node\n         * @param {?} parent\n         * @return {?}\n         */\n        appendChild: function (node, parent) { parent.appendChild(node); },\n        /**\n         * @param {?} node\n         * @param {?} refNode\n         * @return {?}\n         */\n        insertBefore: function (node, refNode) { refNode.parentNode.insertBefore(node, refNode); },\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        nextSibling: function (node) { return node.nextSibling; },\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        parentElement: function (node) { return (node.parentNode); }\n    };\n    var DomRenderer = (function () {\n        /**\n         * @param {?} _rootRenderer\n         * @param {?} componentProto\n         * @param {?} _animationDriver\n         * @param {?} styleShimId\n         */\n        function DomRenderer(_rootRenderer, componentProto, _animationDriver, styleShimId) {\n            this._rootRenderer = _rootRenderer;\n            this.componentProto = componentProto;\n            this._animationDriver = _animationDriver;\n            this.directRenderer = DIRECT_DOM_RENDERER;\n            this._styles = flattenStyles(styleShimId, componentProto.styles, []);\n            if (componentProto.encapsulation !== core.ViewEncapsulation.Native) {\n                this._rootRenderer.sharedStylesHost.addStyles(this._styles);\n            }\n            if (this.componentProto.encapsulation === core.ViewEncapsulation.Emulated) {\n                this._contentAttr = shimContentAttribute(styleShimId);\n                this._hostAttr = shimHostAttribute(styleShimId);\n            }\n            else {\n                this._contentAttr = null;\n                this._hostAttr = null;\n            }\n        }\n        /**\n         * @param {?} selectorOrNode\n         * @param {?} debugInfo\n         * @return {?}\n         */\n        DomRenderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) {\n            var /** @type {?} */ el;\n            if (typeof selectorOrNode === 'string') {\n                el = this._rootRenderer.document.querySelector(selectorOrNode);\n                if (!el) {\n                    throw new Error(\"The selector \\\"\" + selectorOrNode + \"\\\" did not match any elements\");\n                }\n            }\n            else {\n                el = selectorOrNode;\n            }\n            while (el.firstChild) {\n                el.removeChild(el.firstChild);\n            }\n            return el;\n        };\n        /**\n         * @param {?} parent\n         * @param {?} name\n         * @param {?} debugInfo\n         * @return {?}\n         */\n        DomRenderer.prototype.createElement = function (parent, name, debugInfo) {\n            var /** @type {?} */ el;\n            if (isNamespaced(name)) {\n                var /** @type {?} */ nsAndName = splitNamespace(name);\n                el = document.createElementNS((NAMESPACE_URIS)[nsAndName[0]], nsAndName[1]);\n            }\n            else {\n                el = document.createElement(name);\n            }\n            if (this._contentAttr) {\n                el.setAttribute(this._contentAttr, '');\n            }\n            if (parent) {\n                parent.appendChild(el);\n            }\n            return el;\n        };\n        /**\n         * @param {?} hostElement\n         * @return {?}\n         */\n        DomRenderer.prototype.createViewRoot = function (hostElement) {\n            var /** @type {?} */ nodesParent;\n            if (this.componentProto.encapsulation === core.ViewEncapsulation.Native) {\n                nodesParent = ((hostElement)).createShadowRoot();\n                for (var /** @type {?} */ i = 0; i < this._styles.length; i++) {\n                    var /** @type {?} */ styleEl = document.createElement('style');\n                    styleEl.textContent = this._styles[i];\n                    nodesParent.appendChild(styleEl);\n                }\n            }\n            else {\n                if (this._hostAttr) {\n                    hostElement.setAttribute(this._hostAttr, '');\n                }\n                nodesParent = hostElement;\n            }\n            return nodesParent;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} debugInfo\n         * @return {?}\n         */\n        DomRenderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) {\n            var /** @type {?} */ comment = document.createComment(TEMPLATE_COMMENT_TEXT);\n            if (parentElement) {\n                parentElement.appendChild(comment);\n            }\n            return comment;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} value\n         * @param {?} debugInfo\n         * @return {?}\n         */\n        DomRenderer.prototype.createText = function (parentElement, value, debugInfo) {\n            var /** @type {?} */ node = document.createTextNode(value);\n            if (parentElement) {\n                parentElement.appendChild(node);\n            }\n            return node;\n        };\n        /**\n         * @param {?} parentElement\n         * @param {?} nodes\n         * @return {?}\n         */\n        DomRenderer.prototype.projectNodes = function (parentElement, nodes) {\n            if (!parentElement)\n                return;\n            appendNodes(parentElement, nodes);\n        };\n        /**\n         * @param {?} node\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        DomRenderer.prototype.attachViewAfter = function (node, viewRootNodes) { moveNodesAfterSibling(node, viewRootNodes); };\n        /**\n         * @param {?} viewRootNodes\n         * @return {?}\n         */\n        DomRenderer.prototype.detachView = function (viewRootNodes) {\n            for (var /** @type {?} */ i = 0; i < viewRootNodes.length; i++) {\n                var /** @type {?} */ node = viewRootNodes[i];\n                if (node.parentNode) {\n                    node.parentNode.removeChild(node);\n                }\n            }\n        };\n        /**\n         * @param {?} hostElement\n         * @param {?} viewAllNodes\n         * @return {?}\n         */\n        DomRenderer.prototype.destroyView = function (hostElement, viewAllNodes) {\n            if (this.componentProto.encapsulation === core.ViewEncapsulation.Native && hostElement) {\n                this._rootRenderer.sharedStylesHost.removeHost(((hostElement)).shadowRoot);\n            }\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        DomRenderer.prototype.listen = function (renderElement, name, callback) {\n            return this._rootRenderer.eventManager.addEventListener(renderElement, name, decoratePreventDefault(callback));\n        };\n        /**\n         * @param {?} target\n         * @param {?} name\n         * @param {?} callback\n         * @return {?}\n         */\n        DomRenderer.prototype.listenGlobal = function (target, name, callback) {\n            return this._rootRenderer.eventManager.addGlobalEventListener(target, name, decoratePreventDefault(callback));\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        DomRenderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) {\n            ((renderElement))[propertyName] = propertyValue;\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} attributeName\n         * @param {?} attributeValue\n         * @return {?}\n         */\n        DomRenderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) {\n            var /** @type {?} */ attrNs;\n            var /** @type {?} */ attrNameWithoutNs = attributeName;\n            if (isNamespaced(attributeName)) {\n                var /** @type {?} */ nsAndName = splitNamespace(attributeName);\n                attrNameWithoutNs = nsAndName[1];\n                attributeName = nsAndName[0] + ':' + nsAndName[1];\n                attrNs = NAMESPACE_URIS[nsAndName[0]];\n            }\n            if (isPresent(attributeValue)) {\n                if (attrNs) {\n                    renderElement.setAttributeNS(attrNs, attributeName, attributeValue);\n                }\n                else {\n                    renderElement.setAttribute(attributeName, attributeValue);\n                }\n            }\n            else {\n                if (isPresent(attrNs)) {\n                    renderElement.removeAttributeNS(attrNs, attrNameWithoutNs);\n                }\n                else {\n                    renderElement.removeAttribute(attributeName);\n                }\n            }\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} propertyName\n         * @param {?} propertyValue\n         * @return {?}\n         */\n        DomRenderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) {\n            if (renderElement.nodeType === Node.COMMENT_NODE) {\n                var /** @type {?} */ existingBindings = renderElement.nodeValue.replace(/\\n/g, '').match(TEMPLATE_BINDINGS_EXP);\n                var /** @type {?} */ parsedBindings = JSON.parse(existingBindings[1]);\n                parsedBindings[propertyName] = propertyValue;\n                renderElement.nodeValue =\n                    TEMPLATE_COMMENT_TEXT.replace('{}', JSON.stringify(parsedBindings, null, 2));\n            }\n            else {\n                this.setElementAttribute(renderElement, propertyName, propertyValue);\n            }\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} className\n         * @param {?} isAdd\n         * @return {?}\n         */\n        DomRenderer.prototype.setElementClass = function (renderElement, className, isAdd) {\n            if (isAdd) {\n                renderElement.classList.add(className);\n            }\n            else {\n                renderElement.classList.remove(className);\n            }\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} styleName\n         * @param {?} styleValue\n         * @return {?}\n         */\n        DomRenderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) {\n            if (isPresent(styleValue)) {\n                ((renderElement.style))[styleName] = stringify(styleValue);\n            }\n            else {\n                // IE requires '' instead of null\n                // see https://github.com/angular/angular/issues/7916\n                ((renderElement.style))[styleName] = '';\n            }\n        };\n        /**\n         * @param {?} renderElement\n         * @param {?} methodName\n         * @param {?} args\n         * @return {?}\n         */\n        DomRenderer.prototype.invokeElementMethod = function (renderElement, methodName, args) {\n            ((renderElement))[methodName].apply(renderElement, args);\n        };\n        /**\n         * @param {?} renderNode\n         * @param {?} text\n         * @return {?}\n         */\n        DomRenderer.prototype.setText = function (renderNode, text) { renderNode.nodeValue = text; };\n        /**\n         * @param {?} element\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         * @param {?=} previousPlayers\n         * @return {?}\n         */\n        DomRenderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            if (this._rootRenderer.document.body.contains(element)) {\n                return this._animationDriver.animate(element, startingStyles, keyframes, duration, delay, easing, previousPlayers);\n            }\n            return new NoOpAnimationPlayer();\n        };\n        return DomRenderer;\n    }());\n    /**\n     * @param {?} sibling\n     * @param {?} nodes\n     * @return {?}\n     */\n    function moveNodesAfterSibling(sibling, nodes) {\n        var /** @type {?} */ parent = sibling.parentNode;\n        if (nodes.length > 0 && parent) {\n            var /** @type {?} */ nextSibling = sibling.nextSibling;\n            if (nextSibling) {\n                for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n                    parent.insertBefore(nodes[i], nextSibling);\n                }\n            }\n            else {\n                for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n                    parent.appendChild(nodes[i]);\n                }\n            }\n        }\n    }\n    /**\n     * @param {?} parent\n     * @param {?} nodes\n     * @return {?}\n     */\n    function appendNodes(parent, nodes) {\n        for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n            parent.appendChild(nodes[i]);\n        }\n    }\n    /**\n     * @param {?} eventHandler\n     * @return {?}\n     */\n    function decoratePreventDefault(eventHandler) {\n        return function (event) {\n            var /** @type {?} */ allowDefaultBehavior = eventHandler(event);\n            if (allowDefaultBehavior === false) {\n                // TODO(tbosch): move preventDefault into event plugins...\n                event.preventDefault();\n                event.returnValue = false;\n            }\n        };\n    }\n    var /** @type {?} */ COMPONENT_REGEX = /%COMP%/g;\n    var /** @type {?} */ COMPONENT_VARIABLE = '%COMP%';\n    var /** @type {?} */ HOST_ATTR = \"_nghost-\" + COMPONENT_VARIABLE;\n    var /** @type {?} */ CONTENT_ATTR = \"_ngcontent-\" + COMPONENT_VARIABLE;\n    /**\n     * @param {?} componentShortId\n     * @return {?}\n     */\n    function shimContentAttribute(componentShortId) {\n        return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);\n    }\n    /**\n     * @param {?} componentShortId\n     * @return {?}\n     */\n    function shimHostAttribute(componentShortId) {\n        return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);\n    }\n    /**\n     * @param {?} compId\n     * @param {?} styles\n     * @param {?} target\n     * @return {?}\n     */\n    function flattenStyles(compId, styles, target) {\n        for (var /** @type {?} */ i = 0; i < styles.length; i++) {\n            var /** @type {?} */ style = styles[i];\n            if (Array.isArray(style)) {\n                flattenStyles(compId, style, target);\n            }\n            else {\n                style = style.replace(COMPONENT_REGEX, compId);\n                target.push(style);\n            }\n        }\n        return target;\n    }\n    var /** @type {?} */ NS_PREFIX_RE = /^:([^:]+):(.+)$/;\n    /**\n     * @param {?} name\n     * @return {?}\n     */\n    function isNamespaced(name) {\n        return name[0] === ':';\n    }\n    /**\n     * @param {?} name\n     * @return {?}\n     */\n    function splitNamespace(name) {\n        var /** @type {?} */ match = name.match(NS_PREFIX_RE);\n        return [match[1], match[2]];\n    }\n\n    var /** @type {?} */ CORE_TOKENS = {\n        'ApplicationRef': core.ApplicationRef,\n        'NgZone': core.NgZone,\n    };\n    var /** @type {?} */ INSPECT_GLOBAL_NAME = 'ng.probe';\n    var /** @type {?} */ CORE_TOKENS_GLOBAL_NAME = 'ng.coreTokens';\n    /**\n     * Returns a {\\@link DebugElement} for the given native DOM element, or\n     * null if the given native element does not have an Angular view associated\n     * with it.\n     * @param {?} element\n     * @return {?}\n     */\n    function inspectNativeElement(element) {\n        return core.getDebugNode(element);\n    }\n    /**\n     * Deprecated. Use the one from '\\@angular/core'.\n     * @deprecated\n     */\n    var NgProbeToken = (function () {\n        /**\n         * @param {?} name\n         * @param {?} token\n         */\n        function NgProbeToken(name, token) {\n            this.name = name;\n            this.token = token;\n        }\n        return NgProbeToken;\n    }());\n    /**\n     * @param {?} rootRenderer\n     * @param {?} extraTokens\n     * @param {?} coreTokens\n     * @return {?}\n     */\n    function _createConditionalRootRenderer(rootRenderer, extraTokens, coreTokens) {\n        return core.isDevMode() ?\n            _createRootRenderer(rootRenderer, (extraTokens || []).concat(coreTokens || [])) :\n            rootRenderer;\n    }\n    /**\n     * @param {?} rootRenderer\n     * @param {?} extraTokens\n     * @return {?}\n     */\n    function _createRootRenderer(rootRenderer, extraTokens) {\n        getDOM().setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement);\n        getDOM().setGlobalVar(CORE_TOKENS_GLOBAL_NAME, StringMapWrapper.merge(CORE_TOKENS, _ngProbeTokensToMap(extraTokens || [])));\n        return new DebugDomRootRenderer(rootRenderer);\n    }\n    /**\n     * @param {?} tokens\n     * @return {?}\n     */\n    function _ngProbeTokensToMap(tokens) {\n        return tokens.reduce(function (prev, t) { return (prev[t.name] = t.token, prev); }, {});\n    }\n    /**\n     * Providers which support debugging Angular applications (e.g. via `ng.probe`).\n     */\n    var /** @type {?} */ ELEMENT_PROBE_PROVIDERS = [{\n            provide: core.RootRenderer,\n            useFactory: _createConditionalRootRenderer,\n            deps: [\n                DomRootRenderer, [NgProbeToken, new core.Optional()],\n                [core.NgProbeToken, new core.Optional()]\n            ]\n        }];\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$5 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var DomEventsPlugin = (function (_super) {\n        __extends$5(DomEventsPlugin, _super);\n        function DomEventsPlugin() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} eventName\n         * @return {?}\n         */\n        DomEventsPlugin.prototype.supports = function (eventName) { return true; };\n        /**\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            element.addEventListener(eventName, /** @type {?} */ (handler), false);\n            return function () { return element.removeEventListener(eventName, /** @type {?} */ (handler), false); };\n        };\n        DomEventsPlugin.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        DomEventsPlugin.ctorParameters = function () { return []; };\n        return DomEventsPlugin;\n    }(EventManagerPlugin));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$6 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ EVENT_NAMES = {\n        // pan\n        'pan': true,\n        'panstart': true,\n        'panmove': true,\n        'panend': true,\n        'pancancel': true,\n        'panleft': true,\n        'panright': true,\n        'panup': true,\n        'pandown': true,\n        // pinch\n        'pinch': true,\n        'pinchstart': true,\n        'pinchmove': true,\n        'pinchend': true,\n        'pinchcancel': true,\n        'pinchin': true,\n        'pinchout': true,\n        // press\n        'press': true,\n        'pressup': true,\n        // rotate\n        'rotate': true,\n        'rotatestart': true,\n        'rotatemove': true,\n        'rotateend': true,\n        'rotatecancel': true,\n        // swipe\n        'swipe': true,\n        'swipeleft': true,\n        'swiperight': true,\n        'swipeup': true,\n        'swipedown': true,\n        // tap\n        'tap': true,\n    };\n    /**\n     * A DI token that you can use to provide{@link HammerGestureConfig} to Angular. Use it to configure\n     * Hammer gestures.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ HAMMER_GESTURE_CONFIG = new core.OpaqueToken('HammerGestureConfig');\n    /**\n     * \\@experimental\n     */\n    var HammerGestureConfig = (function () {\n        function HammerGestureConfig() {\n            this.events = [];\n            this.overrides = {};\n        }\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        HammerGestureConfig.prototype.buildHammer = function (element) {\n            var /** @type {?} */ mc = new Hammer(element);\n            mc.get('pinch').set({ enable: true });\n            mc.get('rotate').set({ enable: true });\n            for (var eventName in this.overrides) {\n                mc.get(eventName).set(this.overrides[eventName]);\n            }\n            return mc;\n        };\n        HammerGestureConfig.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        HammerGestureConfig.ctorParameters = function () { return []; };\n        return HammerGestureConfig;\n    }());\n    var HammerGesturesPlugin = (function (_super) {\n        __extends$6(HammerGesturesPlugin, _super);\n        /**\n         * @param {?} _config\n         */\n        function HammerGesturesPlugin(_config) {\n            _super.call(this);\n            this._config = _config;\n        }\n        /**\n         * @param {?} eventName\n         * @return {?}\n         */\n        HammerGesturesPlugin.prototype.supports = function (eventName) {\n            if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {\n                return false;\n            }\n            if (!((window)).Hammer) {\n                throw new Error(\"Hammer.js is not loaded, can not bind \" + eventName + \" event\");\n            }\n            return true;\n        };\n        /**\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            var _this = this;\n            var /** @type {?} */ zone = this.manager.getZone();\n            eventName = eventName.toLowerCase();\n            return zone.runOutsideAngular(function () {\n                // Creating the manager bind events, must be done outside of angular\n                var /** @type {?} */ mc = _this._config.buildHammer(element);\n                var /** @type {?} */ callback = function (eventObj) {\n                    zone.runGuarded(function () { handler(eventObj); });\n                };\n                mc.on(eventName, callback);\n                return function () { return mc.off(eventName, callback); };\n            });\n        };\n        /**\n         * @param {?} eventName\n         * @return {?}\n         */\n        HammerGesturesPlugin.prototype.isCustomEvent = function (eventName) { return this._config.events.indexOf(eventName) > -1; };\n        HammerGesturesPlugin.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        HammerGesturesPlugin.ctorParameters = function () { return [\n            { type: HammerGestureConfig, decorators: [{ type: core.Inject, args: [HAMMER_GESTURE_CONFIG,] },] },\n        ]; };\n        return HammerGesturesPlugin;\n    }(EventManagerPlugin));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$7 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];\n    var /** @type {?} */ MODIFIER_KEY_GETTERS = {\n        'alt': function (event) { return event.altKey; },\n        'control': function (event) { return event.ctrlKey; },\n        'meta': function (event) { return event.metaKey; },\n        'shift': function (event) { return event.shiftKey; }\n    };\n    /**\n     * \\@experimental\n     */\n    var KeyEventsPlugin = (function (_super) {\n        __extends$7(KeyEventsPlugin, _super);\n        function KeyEventsPlugin() {\n            _super.call(this);\n        }\n        /**\n         * @param {?} eventName\n         * @return {?}\n         */\n        KeyEventsPlugin.prototype.supports = function (eventName) { return KeyEventsPlugin.parseEventName(eventName) != null; };\n        /**\n         * @param {?} element\n         * @param {?} eventName\n         * @param {?} handler\n         * @return {?}\n         */\n        KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            var /** @type {?} */ parsedEvent = KeyEventsPlugin.parseEventName(eventName);\n            var /** @type {?} */ outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());\n            return this.manager.getZone().runOutsideAngular(function () {\n                return getDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler);\n            });\n        };\n        /**\n         * @param {?} eventName\n         * @return {?}\n         */\n        KeyEventsPlugin.parseEventName = function (eventName) {\n            var /** @type {?} */ parts = eventName.toLowerCase().split('.');\n            var /** @type {?} */ domEventName = parts.shift();\n            if ((parts.length === 0) || !(domEventName === 'keydown' || domEventName === 'keyup')) {\n                return null;\n            }\n            var /** @type {?} */ key = KeyEventsPlugin._normalizeKey(parts.pop());\n            var /** @type {?} */ fullKey = '';\n            MODIFIER_KEYS.forEach(function (modifierName) {\n                var /** @type {?} */ index = parts.indexOf(modifierName);\n                if (index > -1) {\n                    parts.splice(index, 1);\n                    fullKey += modifierName + '.';\n                }\n            });\n            fullKey += key;\n            if (parts.length != 0 || key.length === 0) {\n                // returning null instead of throwing to let another plugin process the event\n                return null;\n            }\n            var /** @type {?} */ result = {};\n            result['domEventName'] = domEventName;\n            result['fullKey'] = fullKey;\n            return result;\n        };\n        /**\n         * @param {?} event\n         * @return {?}\n         */\n        KeyEventsPlugin.getEventFullKey = function (event) {\n            var /** @type {?} */ fullKey = '';\n            var /** @type {?} */ key = getDOM().getEventKey(event);\n            key = key.toLowerCase();\n            if (key === ' ') {\n                key = 'space'; // for readability\n            }\n            else if (key === '.') {\n                key = 'dot'; // because '.' is used as a separator in event names\n            }\n            MODIFIER_KEYS.forEach(function (modifierName) {\n                if (modifierName != key) {\n                    var /** @type {?} */ modifierGetter = MODIFIER_KEY_GETTERS[modifierName];\n                    if (modifierGetter(event)) {\n                        fullKey += modifierName + '.';\n                    }\n                }\n            });\n            fullKey += key;\n            return fullKey;\n        };\n        /**\n         * @param {?} fullKey\n         * @param {?} handler\n         * @param {?} zone\n         * @return {?}\n         */\n        KeyEventsPlugin.eventCallback = function (fullKey, handler, zone) {\n            return function (event /** TODO #9100 */) {\n                if (KeyEventsPlugin.getEventFullKey(event) === fullKey) {\n                    zone.runGuarded(function () { return handler(event); });\n                }\n            };\n        };\n        /**\n         * \\@internal\n         * @param {?} keyName\n         * @return {?}\n         */\n        KeyEventsPlugin._normalizeKey = function (keyName) {\n            // TODO: switch to a Map if the mapping grows too much\n            switch (keyName) {\n                case 'esc':\n                    return 'escape';\n                default:\n                    return keyName;\n            }\n        };\n        KeyEventsPlugin.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        KeyEventsPlugin.ctorParameters = function () { return []; };\n        return KeyEventsPlugin;\n    }(EventManagerPlugin));\n\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * This regular expression matches a subset of URLs that will not cause script\n     * execution if used in URL context within a HTML document. Specifically, this\n     * regular expression matches if (comment from here on and regex copied from\n     * Soy's EscapingConventions):\n     * (1) Either a protocol in a whitelist (http, https, mailto or ftp).\n     * (2) or no protocol.  A protocol must be followed by a colon. The below\n     *     allows that by allowing colons only after one of the characters [/?#].\n     *     A colon after a hash (#) must be in the fragment.\n     *     Otherwise, a colon after a (?) must be in a query.\n     *     Otherwise, a colon after a single solidus (/) must be in a path.\n     *     Otherwise, a colon after a double solidus (//) must be in the authority\n     *     (before port).\n     *\n     * The pattern disallows &, used in HTML entity declarations before\n     * one of the characters in [/?#]. This disallows HTML entities used in the\n     * protocol name, which should never happen, e.g. \"h&#116;tp\" for \"http\".\n     * It also disallows HTML entities in the first path part of a relative path,\n     * e.g. \"foo&lt;bar/baz\".  Our existing escaping functions should not produce\n     * that. More importantly, it disallows masking of a colon,\n     * e.g. \"javascript&#58;...\".\n     *\n     * This regular expression was taken from the Closure sanitization library.\n     */\n    var /** @type {?} */ SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n    /** A pattern that matches safe data URLs. Only matches image, video and audio types. */\n    var /** @type {?} */ DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\\/]+=*$/i;\n    /**\n     * @param {?} url\n     * @return {?}\n     */\n    function sanitizeUrl(url) {\n        url = String(url);\n        if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN))\n            return url;\n        if (core.isDevMode()) {\n            getDOM().log(\"WARNING: sanitizing unsafe URL value \" + url + \" (see http://g.co/ng/security#xss)\");\n        }\n        return 'unsafe:' + url;\n    }\n    /**\n     * @param {?} srcset\n     * @return {?}\n     */\n    function sanitizeSrcset(srcset) {\n        srcset = String(srcset);\n        return srcset.split(',').map(function (srcset) { return sanitizeUrl(srcset.trim()); }).join(', ');\n    }\n\n    /** A <body> element that can be safely used to parse untrusted HTML. Lazily initialized below. */\n    var /** @type {?} */ inertElement = null;\n    /** Lazily initialized to make sure the DOM adapter gets set before use. */\n    var /** @type {?} */ DOM = null;\n    /**\n     * Returns an HTML element that is guaranteed to not execute code when creating elements in it.\n     * @return {?}\n     */\n    function getInertElement() {\n        if (inertElement)\n            return inertElement;\n        DOM = getDOM();\n        // Prefer using <template> element if supported.\n        var /** @type {?} */ templateEl = DOM.createElement('template');\n        if ('content' in templateEl)\n            return templateEl;\n        var /** @type {?} */ doc = DOM.createHtmlDocument();\n        inertElement = DOM.querySelector(doc, 'body');\n        if (inertElement == null) {\n            // usually there should be only one body element in the document, but IE doesn't have any, so we\n            // need to create one.\n            var /** @type {?} */ html = DOM.createElement('html', doc);\n            inertElement = DOM.createElement('body', doc);\n            DOM.appendChild(html, inertElement);\n            DOM.appendChild(doc, html);\n        }\n        return inertElement;\n    }\n    /**\n     * @param {?} tags\n     * @return {?}\n     */\n    function tagSet(tags) {\n        var /** @type {?} */ res = {};\n        for (var _i = 0, _a = tags.split(','); _i < _a.length; _i++) {\n            var t = _a[_i];\n            res[t] = true;\n        }\n        return res;\n    }\n    /**\n     * @param {...?} sets\n     * @return {?}\n     */\n    function merge() {\n        var sets = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            sets[_i - 0] = arguments[_i];\n        }\n        var /** @type {?} */ res = {};\n        for (var _a = 0, sets_1 = sets; _a < sets_1.length; _a++) {\n            var s = sets_1[_a];\n            for (var v in s) {\n                if (s.hasOwnProperty(v))\n                    res[v] = true;\n            }\n        }\n        return res;\n    }\n    // Good source of info about elements and attributes\n    // http://dev.w3.org/html5/spec/Overview.html#semantics\n    // http://simon.html5.org/html-elements\n    // Safe Void Elements - HTML5\n    // http://dev.w3.org/html5/spec/Overview.html#void-elements\n    var /** @type {?} */ VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');\n    // Elements that you can, intentionally, leave open (and which close themselves)\n    // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n    var /** @type {?} */ OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');\n    var /** @type {?} */ OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');\n    var /** @type {?} */ OPTIONAL_END_TAG_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);\n    // Safe Block Elements - HTML5\n    var /** @type {?} */ BLOCK_ELEMENTS = merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet('address,article,' +\n        'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n        'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul'));\n    // Inline Elements - HTML5\n    var /** @type {?} */ INLINE_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet('a,abbr,acronym,audio,b,' +\n        'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +\n        'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video'));\n    var /** @type {?} */ VALID_ELEMENTS = merge(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);\n    // Attributes that have href and hence need to be sanitized\n    var /** @type {?} */ URI_ATTRS = tagSet('background,cite,href,itemtype,longdesc,poster,src,xlink:href');\n    // Attributes that have special href set hence need to be sanitized\n    var /** @type {?} */ SRCSET_ATTRS = tagSet('srcset');\n    var /** @type {?} */ HTML_ATTRS = tagSet('abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +\n        'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +\n        'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +\n        'scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,' +\n        'valign,value,vspace,width');\n    // NB: This currently conciously doesn't support SVG. SVG sanitization has had several security\n    // issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via\n    // innerHTML is required, SVG attributes should be added here.\n    // NB: Sanitization does not allow <form> elements or other active elements (<button> etc). Those\n    // can be sanitized, but they increase security surface area without a legitimate use case, so they\n    // are left out here.\n    var /** @type {?} */ VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS);\n    /**\n     * SanitizingHtmlSerializer serializes a DOM fragment, stripping out any unsafe elements and unsafe\n     * attributes.\n     */\n    var SanitizingHtmlSerializer = (function () {\n        function SanitizingHtmlSerializer() {\n            this.sanitizedSomething = false;\n            this.buf = [];\n        }\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        SanitizingHtmlSerializer.prototype.sanitizeChildren = function (el) {\n            // This cannot use a TreeWalker, as it has to run on Angular's various DOM adapters.\n            // However this code never accesses properties off of `document` before deleting its contents\n            // again, so it shouldn't be vulnerable to DOM clobbering.\n            var /** @type {?} */ current = el.firstChild;\n            while (current) {\n                if (DOM.isElementNode(current)) {\n                    this.startElement(/** @type {?} */ (current));\n                }\n                else if (DOM.isTextNode(current)) {\n                    this.chars(DOM.nodeValue(current));\n                }\n                else {\n                    // Strip non-element, non-text nodes.\n                    this.sanitizedSomething = true;\n                }\n                if (DOM.firstChild(current)) {\n                    current = DOM.firstChild(current);\n                    continue;\n                }\n                while (current) {\n                    // Leaving the element. Walk up and to the right, closing tags as we go.\n                    if (DOM.isElementNode(current)) {\n                        this.endElement(/** @type {?} */ (current));\n                    }\n                    if (DOM.nextSibling(current)) {\n                        current = DOM.nextSibling(current);\n                        break;\n                    }\n                    current = DOM.parentElement(current);\n                }\n            }\n            return this.buf.join('');\n        };\n        /**\n         * @param {?} element\n         * @return {?}\n         */\n        SanitizingHtmlSerializer.prototype.startElement = function (element) {\n            var _this = this;\n            var /** @type {?} */ tagName = DOM.nodeName(element).toLowerCase();\n            if (!VALID_ELEMENTS.hasOwnProperty(tagName)) {\n                this.sanitizedSomething = true;\n                return;\n            }\n            this.buf.push('<');\n            this.buf.push(tagName);\n            DOM.attributeMap(element).forEach(function (value, attrName) {\n                var /** @type {?} */ lower = attrName.toLowerCase();\n                if (!VALID_ATTRS.hasOwnProperty(lower)) {\n                    _this.sanitizedSomething = true;\n                    return;\n                }\n                // TODO(martinprobst): Special case image URIs for data:image/...\n                if (URI_ATTRS[lower])\n                    value = sanitizeUrl(value);\n                if (SRCSET_ATTRS[lower])\n                    value = sanitizeSrcset(value);\n                _this.buf.push(' ');\n                _this.buf.push(attrName);\n                _this.buf.push('=\"');\n                _this.buf.push(encodeEntities(value));\n                _this.buf.push('\"');\n            });\n            this.buf.push('>');\n        };\n        /**\n         * @param {?} current\n         * @return {?}\n         */\n        SanitizingHtmlSerializer.prototype.endElement = function (current) {\n            var /** @type {?} */ tagName = DOM.nodeName(current).toLowerCase();\n            if (VALID_ELEMENTS.hasOwnProperty(tagName) && !VOID_ELEMENTS.hasOwnProperty(tagName)) {\n                this.buf.push('</');\n                this.buf.push(tagName);\n                this.buf.push('>');\n            }\n        };\n        /**\n         * @param {?} chars\n         * @return {?}\n         */\n        SanitizingHtmlSerializer.prototype.chars = function (chars /** TODO #9100 */) { this.buf.push(encodeEntities(chars)); };\n        return SanitizingHtmlSerializer;\n    }());\n    // Regular Expressions for parsing tags and attributes\n    var /** @type {?} */ SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    // ! to ~ is the ASCII range.\n    var /** @type {?} */ NON_ALPHANUMERIC_REGEXP = /([^\\#-~ |!])/g;\n    /**\n     * Escapes all potentially dangerous characters, so that the\n     * resulting string can be safely inserted into attribute or\n     * element text.\n     * @param {?} value\n     * @return {?}\n     */\n    function encodeEntities(value) {\n        return value.replace(/&/g, '&amp;')\n            .replace(SURROGATE_PAIR_REGEXP, function (match) {\n            var /** @type {?} */ hi = match.charCodeAt(0);\n            var /** @type {?} */ low = match.charCodeAt(1);\n            return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n        })\n            .replace(NON_ALPHANUMERIC_REGEXP, function (match) { return '&#' + match.charCodeAt(0) + ';'; })\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;');\n    }\n    /**\n     * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1'\n     * attribute to declare ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo').\n     *\n     * This is undesirable since we don't want to allow any of these custom attributes. This method\n     * strips them all.\n     * @param {?} el\n     * @return {?}\n     */\n    function stripCustomNsAttrs(el) {\n        DOM.attributeMap(el).forEach(function (_, attrName) {\n            if (attrName === 'xmlns:ns1' || attrName.indexOf('ns1:') === 0) {\n                DOM.removeAttribute(el, attrName);\n            }\n        });\n        for (var _i = 0, _a = DOM.childNodesAsList(el); _i < _a.length; _i++) {\n            var n = _a[_i];\n            if (DOM.isElementNode(n))\n                stripCustomNsAttrs(/** @type {?} */ (n));\n        }\n    }\n    /**\n     * Sanitizes the given unsafe, untrusted HTML fragment, and returns HTML text that is safe to add to\n     * the DOM in a browser environment.\n     * @param {?} unsafeHtmlInput\n     * @return {?}\n     */\n    function sanitizeHtml(unsafeHtmlInput) {\n        try {\n            var /** @type {?} */ containerEl = getInertElement();\n            // Make sure unsafeHtml is actually a string (TypeScript types are not enforced at runtime).\n            var /** @type {?} */ unsafeHtml = unsafeHtmlInput ? String(unsafeHtmlInput) : '';\n            // mXSS protection. Repeatedly parse the document to make sure it stabilizes, so that a browser\n            // trying to auto-correct incorrect HTML cannot cause formerly inert HTML to become dangerous.\n            var /** @type {?} */ mXSSAttempts = 5;\n            var /** @type {?} */ parsedHtml = unsafeHtml;\n            do {\n                if (mXSSAttempts === 0) {\n                    throw new Error('Failed to sanitize html because the input is unstable');\n                }\n                mXSSAttempts--;\n                unsafeHtml = parsedHtml;\n                DOM.setInnerHTML(containerEl, unsafeHtml);\n                if (((DOM.defaultDoc())).documentMode) {\n                    // strip custom-namespaced attributes on IE<=11\n                    stripCustomNsAttrs(containerEl);\n                }\n                parsedHtml = DOM.getInnerHTML(containerEl);\n            } while (unsafeHtml !== parsedHtml);\n            var /** @type {?} */ sanitizer = new SanitizingHtmlSerializer();\n            var /** @type {?} */ safeHtml = sanitizer.sanitizeChildren(DOM.getTemplateContent(containerEl) || containerEl);\n            // Clear out the body element.\n            var /** @type {?} */ parent_1 = DOM.getTemplateContent(containerEl) || containerEl;\n            for (var _i = 0, _a = DOM.childNodesAsList(parent_1); _i < _a.length; _i++) {\n                var child = _a[_i];\n                DOM.removeChild(parent_1, child);\n            }\n            if (core.isDevMode() && sanitizer.sanitizedSomething) {\n                DOM.log('WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss).');\n            }\n            return safeHtml;\n        }\n        catch (e) {\n            // In case anything goes wrong, clear out inertElement to reset the entire DOM structure.\n            inertElement = null;\n            throw e;\n        }\n    }\n\n    /**\n     * Regular expression for safe style values.\n     *\n     * Quotes (\" and ') are allowed, but a check must be done elsewhere to ensure they're balanced.\n     *\n     * ',' allows multiple values to be assigned to the same property (e.g. background-attachment or\n     * font-family) and hence could allow multiple values to get injected, but that should pose no risk\n     * of XSS.\n     *\n     * The function expression checks only for XSS safety, not for CSS validity.\n     *\n     * This regular expression was taken from the Closure sanitization library, and augmented for\n     * transformation values.\n     */\n    var /** @type {?} */ VALUES = '[-,.\"\\'%_!# a-zA-Z0-9]+';\n    var /** @type {?} */ TRANSFORMATION_FNS = '(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|3d)?';\n    var /** @type {?} */ COLOR_FNS = '(?:rgb|hsl)a?';\n    var /** @type {?} */ GRADIENTS = '(?:repeating-)?(?:linear|radial)-gradient';\n    var /** @type {?} */ CSS3_FNS = '(?:calc|attr)';\n    var /** @type {?} */ FN_ARGS = '\\\\([-0-9.%, #a-zA-Z]+\\\\)';\n    var /** @type {?} */ SAFE_STYLE_VALUE = new RegExp((\"^(\" + VALUES + \"|\") +\n        (\"(?:\" + TRANSFORMATION_FNS + \"|\" + COLOR_FNS + \"|\" + GRADIENTS + \"|\" + CSS3_FNS + \")\") +\n        (FN_ARGS + \")$\"), 'g');\n    /**\n     * Matches a `url(...)` value with an arbitrary argument as long as it does\n     * not contain parentheses.\n     *\n     * The URL value still needs to be sanitized separately.\n     *\n     * `url(...)` values are a very common use case, e.g. for `background-image`. With carefully crafted\n     * CSS style rules, it is possible to construct an information leak with `url` values in CSS, e.g.\n     * by observing whether scroll bars are displayed, or character ranges used by a font face\n     * definition.\n     *\n     * Angular only allows binding CSS values (as opposed to entire CSS rules), so it is unlikely that\n     * binding a URL value without further cooperation from the page will cause an information leak, and\n     * if so, it is just a leak, not a full blown XSS vulnerability.\n     *\n     * Given the common use case, low likelihood of attack vector, and low impact of an attack, this\n     * code is permissive and allows URLs that sanitize otherwise.\n     */\n    var /** @type {?} */ URL_RE = /^url\\(([^)]+)\\)$/;\n    /**\n     * Checks that quotes (\" and ') are properly balanced inside a string. Assumes\n     * that neither escape (\\) nor any other character that could result in\n     * breaking out of a string parsing context are allowed;\n     * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.\n     *\n     * This code was taken from the Closure sanitization library.\n     * @param {?} value\n     * @return {?}\n     */\n    function hasBalancedQuotes(value) {\n        var /** @type {?} */ outsideSingle = true;\n        var /** @type {?} */ outsideDouble = true;\n        for (var /** @type {?} */ i = 0; i < value.length; i++) {\n            var /** @type {?} */ c = value.charAt(i);\n            if (c === '\\'' && outsideDouble) {\n                outsideSingle = !outsideSingle;\n            }\n            else if (c === '\"' && outsideSingle) {\n                outsideDouble = !outsideDouble;\n            }\n        }\n        return outsideSingle && outsideDouble;\n    }\n    /**\n     * Sanitizes the given untrusted CSS style property value (i.e. not an entire object, just a single\n     * value) and returns a value that is safe to use in a browser environment.\n     * @param {?} value\n     * @return {?}\n     */\n    function sanitizeStyle(value) {\n        value = String(value).trim(); // Make sure it's actually a string.\n        if (!value)\n            return '';\n        // Single url(...) values are supported, but only for URLs that sanitize cleanly. See above for\n        // reasoning behind this.\n        var /** @type {?} */ urlMatch = value.match(URL_RE);\n        if ((urlMatch && sanitizeUrl(urlMatch[1]) === urlMatch[1]) ||\n            value.match(SAFE_STYLE_VALUE) && hasBalancedQuotes(value)) {\n            return value; // Safe style values.\n        }\n        if (core.isDevMode()) {\n            getDOM().log(\"WARNING: sanitizing unsafe style value \" + value + \" (see http://g.co/ng/security#xss).\");\n        }\n        return 'unsafe';\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$8 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * DomSanitizer helps preventing Cross Site Scripting Security bugs (XSS) by sanitizing\n     * values to be safe to use in the different DOM contexts.\n     *\n     * For example, when binding a URL in an `<a [href]=\"someValue\">` hyperlink, `someValue` will be\n     * sanitized so that an attacker cannot inject e.g. a `javascript:` URL that would execute code on\n     * the website.\n     *\n     * In specific situations, it might be necessary to disable sanitization, for example if the\n     * application genuinely needs to produce a `javascript:` style link with a dynamic value in it.\n     * Users can bypass security by constructing a value with one of the `bypassSecurityTrust...`\n     * methods, and then binding to that value from the template.\n     *\n     * These situations should be very rare, and extraordinary care must be taken to avoid creating a\n     * Cross Site Scripting (XSS) security bug!\n     *\n     * When using `bypassSecurityTrust...`, make sure to call the method as early as possible and as\n     * close as possible to the source of the value, to make it easy to verify no security bug is\n     * created by its use.\n     *\n     * It is not required (and not recommended) to bypass security if the value is safe, e.g. a URL that\n     * does not start with a suspicious protocol, or an HTML snippet that does not contain dangerous\n     * code. The sanitizer leaves safe values intact.\n     *\n     * \\@security Calling any of the `bypassSecurityTrust...` APIs disables Angular's built-in\n     * sanitization for the value passed in. Carefully check and audit all values and code paths going\n     * into this call. Make sure any user data is appropriately escaped for this security context.\n     * For more detail, see the [Security Guide](http://g.co/ng/security).\n     *\n     * \\@stable\n     * @abstract\n     */\n    var DomSanitizer = (function () {\n        function DomSanitizer() {\n        }\n        /**\n         * Sanitizes a value for use in the given SecurityContext.\n         *\n         * If value is trusted for the context, this method will unwrap the contained safe value and use\n         * it directly. Otherwise, value will be sanitized to be safe in the given context, for example\n         * by replacing URLs that have an unsafe protocol part (such as `javascript:`). The implementation\n         * is responsible to make sure that the value can definitely be safely used in the given context.\n         * @abstract\n         * @param {?} context\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.sanitize = function (context, value) { };\n        /**\n         * Bypass security and trust the given value to be safe HTML. Only use this when the bound HTML\n         * is unsafe (e.g. contains `<script>` tags) and the code should be executed. The sanitizer will\n         * leave safe HTML intact, so in most situations this method should not be used.\n         *\n         * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n         * security risks!\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.bypassSecurityTrustHtml = function (value) { };\n        /**\n         * Bypass security and trust the given value to be safe style value (CSS).\n         *\n         * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n         * security risks!\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.bypassSecurityTrustStyle = function (value) { };\n        /**\n         * Bypass security and trust the given value to be safe JavaScript.\n         *\n         * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n         * security risks!\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.bypassSecurityTrustScript = function (value) { };\n        /**\n         * Bypass security and trust the given value to be a safe style URL, i.e. a value that can be used\n         * in hyperlinks or `<img src>`.\n         *\n         * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n         * security risks!\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.bypassSecurityTrustUrl = function (value) { };\n        /**\n         * Bypass security and trust the given value to be a safe resource URL, i.e. a location that may\n         * be used to load executable code from, like `<script src>`, or `<iframe src>`.\n         *\n         * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n         * security risks!\n         * @abstract\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizer.prototype.bypassSecurityTrustResourceUrl = function (value) { };\n        return DomSanitizer;\n    }());\n    var DomSanitizerImpl = (function (_super) {\n        __extends$8(DomSanitizerImpl, _super);\n        function DomSanitizerImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} ctx\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.sanitize = function (ctx, value) {\n            if (value == null)\n                return null;\n            switch (ctx) {\n                case core.SecurityContext.NONE:\n                    return value;\n                case core.SecurityContext.HTML:\n                    if (value instanceof SafeHtmlImpl)\n                        return value.changingThisBreaksApplicationSecurity;\n                    this.checkNotSafeValue(value, 'HTML');\n                    return sanitizeHtml(String(value));\n                case core.SecurityContext.STYLE:\n                    if (value instanceof SafeStyleImpl)\n                        return value.changingThisBreaksApplicationSecurity;\n                    this.checkNotSafeValue(value, 'Style');\n                    return sanitizeStyle(value);\n                case core.SecurityContext.SCRIPT:\n                    if (value instanceof SafeScriptImpl)\n                        return value.changingThisBreaksApplicationSecurity;\n                    this.checkNotSafeValue(value, 'Script');\n                    throw new Error('unsafe value used in a script context');\n                case core.SecurityContext.URL:\n                    if (value instanceof SafeResourceUrlImpl || value instanceof SafeUrlImpl) {\n                        // Allow resource URLs in URL contexts, they are strictly more trusted.\n                        return value.changingThisBreaksApplicationSecurity;\n                    }\n                    this.checkNotSafeValue(value, 'URL');\n                    return sanitizeUrl(String(value));\n                case core.SecurityContext.RESOURCE_URL:\n                    if (value instanceof SafeResourceUrlImpl) {\n                        return value.changingThisBreaksApplicationSecurity;\n                    }\n                    this.checkNotSafeValue(value, 'ResourceURL');\n                    throw new Error('unsafe value used in a resource URL context (see http://g.co/ng/security#xss)');\n                default:\n                    throw new Error(\"Unexpected SecurityContext \" + ctx + \" (see http://g.co/ng/security#xss)\");\n            }\n        };\n        /**\n         * @param {?} value\n         * @param {?} expectedType\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.checkNotSafeValue = function (value, expectedType) {\n            if (value instanceof SafeValueImpl) {\n                throw new Error((\"Required a safe \" + expectedType + \", got a \" + value.getTypeName() + \" \") +\n                    \"(see http://g.co/ng/security#xss)\");\n            }\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.bypassSecurityTrustHtml = function (value) { return new SafeHtmlImpl(value); };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.bypassSecurityTrustStyle = function (value) { return new SafeStyleImpl(value); };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.bypassSecurityTrustScript = function (value) { return new SafeScriptImpl(value); };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.bypassSecurityTrustUrl = function (value) { return new SafeUrlImpl(value); };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        DomSanitizerImpl.prototype.bypassSecurityTrustResourceUrl = function (value) {\n            return new SafeResourceUrlImpl(value);\n        };\n        DomSanitizerImpl.decorators = [\n            { type: core.Injectable },\n        ];\n        /** @nocollapse */\n        DomSanitizerImpl.ctorParameters = function () { return []; };\n        return DomSanitizerImpl;\n    }(DomSanitizer));\n    /**\n     * @abstract\n     */\n    var SafeValueImpl = (function () {\n        /**\n         * @param {?} changingThisBreaksApplicationSecurity\n         */\n        function SafeValueImpl(changingThisBreaksApplicationSecurity) {\n            this.changingThisBreaksApplicationSecurity = changingThisBreaksApplicationSecurity;\n            // empty\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        SafeValueImpl.prototype.getTypeName = function () { };\n        /**\n         * @return {?}\n         */\n        SafeValueImpl.prototype.toString = function () {\n            return (\"SafeValue must use [property]=binding: \" + this.changingThisBreaksApplicationSecurity) +\n                \" (see http://g.co/ng/security#xss)\";\n        };\n        return SafeValueImpl;\n    }());\n    var SafeHtmlImpl = (function (_super) {\n        __extends$8(SafeHtmlImpl, _super);\n        function SafeHtmlImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @return {?}\n         */\n        SafeHtmlImpl.prototype.getTypeName = function () { return 'HTML'; };\n        return SafeHtmlImpl;\n    }(SafeValueImpl));\n    var SafeStyleImpl = (function (_super) {\n        __extends$8(SafeStyleImpl, _super);\n        function SafeStyleImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @return {?}\n         */\n        SafeStyleImpl.prototype.getTypeName = function () { return 'Style'; };\n        return SafeStyleImpl;\n    }(SafeValueImpl));\n    var SafeScriptImpl = (function (_super) {\n        __extends$8(SafeScriptImpl, _super);\n        function SafeScriptImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @return {?}\n         */\n        SafeScriptImpl.prototype.getTypeName = function () { return 'Script'; };\n        return SafeScriptImpl;\n    }(SafeValueImpl));\n    var SafeUrlImpl = (function (_super) {\n        __extends$8(SafeUrlImpl, _super);\n        function SafeUrlImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @return {?}\n         */\n        SafeUrlImpl.prototype.getTypeName = function () { return 'URL'; };\n        return SafeUrlImpl;\n    }(SafeValueImpl));\n    var SafeResourceUrlImpl = (function (_super) {\n        __extends$8(SafeResourceUrlImpl, _super);\n        function SafeResourceUrlImpl() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @return {?}\n         */\n        SafeResourceUrlImpl.prototype.getTypeName = function () { return 'ResourceURL'; };\n        return SafeResourceUrlImpl;\n    }(SafeValueImpl));\n\n    var /** @type {?} */ INTERNAL_BROWSER_PLATFORM_PROVIDERS = [\n        { provide: core.PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true },\n        { provide: _angular_common.PlatformLocation, useClass: BrowserPlatformLocation }\n    ];\n    /**\n     * @security Replacing built-in sanitization providers exposes the application to XSS risks.\n     * Attacker-controlled data introduced by an unsanitized provider could expose your\n     * application to XSS risks. For more detail, see the [Security Guide](http://g.co/ng/security).\n     * @experimental\n     */\n    var /** @type {?} */ BROWSER_SANITIZATION_PROVIDERS = [\n        { provide: core.Sanitizer, useExisting: DomSanitizer },\n        { provide: DomSanitizer, useClass: DomSanitizerImpl },\n    ];\n    /**\n     * @stable\n     */\n    var /** @type {?} */ platformBrowser = core.createPlatformFactory(core.platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);\n    /**\n     * @return {?}\n     */\n    function initDomAdapter() {\n        BrowserDomAdapter.makeCurrent();\n        BrowserGetTestability.init();\n    }\n    /**\n     * @return {?}\n     */\n    function errorHandler() {\n        return new core.ErrorHandler();\n    }\n    /**\n     * @return {?}\n     */\n    function _document() {\n        return getDOM().defaultDoc();\n    }\n    /**\n     * @return {?}\n     */\n    function _resolveDefaultAnimationDriver() {\n        if (getDOM().supportsWebAnimation()) {\n            return new WebAnimationsDriver();\n        }\n        return AnimationDriver.NOOP;\n    }\n    /**\n     * The ng module for the browser.\n     *\n     * \\@stable\n     */\n    var BrowserModule = (function () {\n        /**\n         * @param {?} parentModule\n         */\n        function BrowserModule(parentModule) {\n            if (parentModule) {\n                throw new Error(\"BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.\");\n            }\n        }\n        BrowserModule.decorators = [\n            { type: core.NgModule, args: [{\n                        providers: [\n                            BROWSER_SANITIZATION_PROVIDERS, { provide: core.ErrorHandler, useFactory: errorHandler, deps: [] },\n                            { provide: DOCUMENT, useFactory: _document, deps: [] },\n                            { provide: EVENT_MANAGER_PLUGINS, useClass: DomEventsPlugin, multi: true },\n                            { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true },\n                            { provide: EVENT_MANAGER_PLUGINS, useClass: HammerGesturesPlugin, multi: true },\n                            { provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig },\n                            { provide: DomRootRenderer, useClass: DomRootRenderer_ },\n                            { provide: core.RootRenderer, useExisting: DomRootRenderer },\n                            { provide: SharedStylesHost, useExisting: DomSharedStylesHost },\n                            { provide: AnimationDriver, useFactory: _resolveDefaultAnimationDriver }, DomSharedStylesHost,\n                            core.Testability, EventManager, ELEMENT_PROBE_PROVIDERS, Title\n                        ],\n                        exports: [_angular_common.CommonModule, core.ApplicationModule]\n                    },] },\n        ];\n        /** @nocollapse */\n        BrowserModule.ctorParameters = function () { return [\n            { type: BrowserModule, decorators: [{ type: core.Optional }, { type: core.SkipSelf },] },\n        ]; };\n        return BrowserModule;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * JS version of browser APIs. This library can only run in the browser.\n     */\n    var /** @type {?} */ win = typeof window !== 'undefined' && window || ({});\n\n    var ChangeDetectionPerfRecord = (function () {\n        /**\n         * @param {?} msPerTick\n         * @param {?} numTicks\n         */\n        function ChangeDetectionPerfRecord(msPerTick, numTicks) {\n            this.msPerTick = msPerTick;\n            this.numTicks = numTicks;\n        }\n        return ChangeDetectionPerfRecord;\n    }());\n    /**\n     * Entry point for all Angular debug tools. This object corresponds to the `ng`\n     * global variable accessible in the dev console.\n     */\n    var AngularTools = (function () {\n        /**\n         * @param {?} ref\n         */\n        function AngularTools(ref) {\n            this.profiler = new AngularProfiler(ref);\n        }\n        return AngularTools;\n    }());\n    /**\n     * Entry point for all Angular profiling-related debug tools. This object\n     * corresponds to the `ng.profiler` in the dev console.\n     */\n    var AngularProfiler = (function () {\n        /**\n         * @param {?} ref\n         */\n        function AngularProfiler(ref) {\n            this.appRef = ref.injector.get(core.ApplicationRef);\n        }\n        /**\n         * Exercises change detection in a loop and then prints the average amount of\n         * time in milliseconds how long a single round of change detection takes for\n         * the current state of the UI. It runs a minimum of 5 rounds for a minimum\n         * of 500 milliseconds.\n         *\n         * Optionally, a user may pass a `config` parameter containing a map of\n         * options. Supported options are:\n         *\n         * `record` (boolean) - causes the profiler to record a CPU profile while\n         * it exercises the change detector. Example:\n         *\n         * ```\n         * ng.profiler.timeChangeDetection({record: true})\n         * ```\n         * @param {?} config\n         * @return {?}\n         */\n        AngularProfiler.prototype.timeChangeDetection = function (config) {\n            var /** @type {?} */ record = config && config['record'];\n            var /** @type {?} */ profileName = 'Change Detection';\n            // Profiler is not available in Android browsers, nor in IE 9 without dev tools opened\n            var /** @type {?} */ isProfilerAvailable = isPresent(win.console.profile);\n            if (record && isProfilerAvailable) {\n                win.console.profile(profileName);\n            }\n            var /** @type {?} */ start = getDOM().performanceNow();\n            var /** @type {?} */ numTicks = 0;\n            while (numTicks < 5 || (getDOM().performanceNow() - start) < 500) {\n                this.appRef.tick();\n                numTicks++;\n            }\n            var /** @type {?} */ end = getDOM().performanceNow();\n            if (record && isProfilerAvailable) {\n                // need to cast to <any> because type checker thinks there's no argument\n                // while in fact there is:\n                //\n                // https://developer.mozilla.org/en-US/docs/Web/API/Console/profileEnd\n                ((win.console.profileEnd))(profileName);\n            }\n            var /** @type {?} */ msPerTick = (end - start) / numTicks;\n            win.console.log(\"ran \" + numTicks + \" change detection cycles\");\n            win.console.log(msPerTick.toFixed(2) + \" ms per check\");\n            return new ChangeDetectionPerfRecord(msPerTick, numTicks);\n        };\n        return AngularProfiler;\n    }());\n\n    var /** @type {?} */ context = (global$1);\n    /**\n     * Enabled Angular 2 debug tools that are accessible via your browser's\n     * developer console.\n     *\n     * Usage:\n     *\n     * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)\n     * 1. Type `ng.` (usually the console will show auto-complete suggestion)\n     * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`\n     *    then hit Enter.\n     *\n     * \\@experimental All debugging apis are currently experimental.\n     * @param {?} ref\n     * @return {?}\n     */\n    function enableDebugTools(ref) {\n        ((Object)).assign(context.ng, new AngularTools(ref));\n        return ref;\n    }\n    /**\n     * Disables Angular 2 tools.\n     *\n     * \\@experimental All debugging apis are currently experimental.\n     * @return {?}\n     */\n    function disableDebugTools() {\n        if (context.ng) {\n            delete context.ng.profiler;\n        }\n    }\n\n    /**\n     * Predicates for use with {\\@link DebugElement}'s query functions.\n     *\n     * \\@experimental All debugging apis are currently experimental.\n     */\n    var By = (function () {\n        function By() {\n        }\n        /**\n         * Match all elements.\n         *\n         * ## Example\n         *\n         * {\\@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}\n         * @return {?}\n         */\n        By.all = function () { return function (debugElement) { return true; }; };\n        /**\n         * Match elements by the given CSS selector.\n         *\n         * ## Example\n         *\n         * {\\@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}\n         * @param {?} selector\n         * @return {?}\n         */\n        By.css = function (selector) {\n            return function (debugElement) {\n                return isPresent(debugElement.nativeElement) ?\n                    getDOM().elementMatches(debugElement.nativeElement, selector) :\n                    false;\n            };\n        };\n        /**\n         * Match elements that have the given directive present.\n         *\n         * ## Example\n         *\n         * {\\@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}\n         * @param {?} type\n         * @return {?}\n         */\n        By.directive = function (type) {\n            return function (debugElement) { return debugElement.providerTokens.indexOf(type) !== -1; };\n        };\n        return By;\n    }());\n\n    var /** @type {?} */ __platform_browser_private__ = {\n        BrowserPlatformLocation: BrowserPlatformLocation,\n        DomAdapter: DomAdapter,\n        BrowserDomAdapter: BrowserDomAdapter,\n        BrowserGetTestability: BrowserGetTestability,\n        getDOM: getDOM,\n        setRootDomAdapter: setRootDomAdapter,\n        DomRootRenderer_: DomRootRenderer_,\n        DomRootRenderer: DomRootRenderer,\n        NAMESPACE_URIS: NAMESPACE_URIS,\n        shimContentAttribute: shimContentAttribute,\n        shimHostAttribute: shimHostAttribute,\n        flattenStyles: flattenStyles,\n        splitNamespace: splitNamespace,\n        isNamespaced: isNamespaced,\n        DomSharedStylesHost: DomSharedStylesHost,\n        SharedStylesHost: SharedStylesHost,\n        ELEMENT_PROBE_PROVIDERS: ELEMENT_PROBE_PROVIDERS,\n        DomEventsPlugin: DomEventsPlugin,\n        KeyEventsPlugin: KeyEventsPlugin,\n        HammerGesturesPlugin: HammerGesturesPlugin,\n        initDomAdapter: initDomAdapter,\n        INTERNAL_BROWSER_PLATFORM_PROVIDERS: INTERNAL_BROWSER_PLATFORM_PROVIDERS,\n        BROWSER_SANITIZATION_PROVIDERS: BROWSER_SANITIZATION_PROVIDERS,\n        WebAnimationsDriver: WebAnimationsDriver\n    };\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new core.Version('2.4.8');\n\n    exports.BrowserModule = BrowserModule;\n    exports.platformBrowser = platformBrowser;\n    exports.Title = Title;\n    exports.disableDebugTools = disableDebugTools;\n    exports.enableDebugTools = enableDebugTools;\n    exports.AnimationDriver = AnimationDriver;\n    exports.By = By;\n    exports.NgProbeToken = NgProbeToken;\n    exports.DOCUMENT = DOCUMENT;\n    exports.EVENT_MANAGER_PLUGINS = EVENT_MANAGER_PLUGINS;\n    exports.EventManager = EventManager;\n    exports.HAMMER_GESTURE_CONFIG = HAMMER_GESTURE_CONFIG;\n    exports.HammerGestureConfig = HammerGestureConfig;\n    exports.DomSanitizer = DomSanitizer;\n    exports.VERSION = VERSION;\n    exports.__platform_browser_private__ = __platform_browser_private__;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/platform-browser/bundles/platform-browser.umd.js\n// module id = 42\n// module chunks = 2","\"use strict\";\nexports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });\n//# sourceMappingURL=isArray.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isArray.js\n// module id = 58\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar ScalarObservable_1 = require('./ScalarObservable');\nvar EmptyObservable_1 = require('./EmptyObservable');\nvar isScheduler_1 = require('../util/isScheduler');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayObservable = (function (_super) {\n    __extends(ArrayObservable, _super);\n    function ArrayObservable(array, scheduler) {\n        _super.call(this);\n        this.array = array;\n        this.scheduler = scheduler;\n        if (!scheduler && array.length === 1) {\n            this._isScalar = true;\n            this.value = array[0];\n        }\n    }\n    ArrayObservable.create = function (array, scheduler) {\n        return new ArrayObservable(array, scheduler);\n    };\n    /**\n     * Creates an Observable that emits some values you specify as arguments,\n     * immediately one after the other, and then emits a complete notification.\n     *\n     * <span class=\"informal\">Emits the arguments you provide, then completes.\n     * </span>\n     *\n     * <img src=\"./img/of.png\" width=\"100%\">\n     *\n     * This static operator is useful for creating a simple Observable that only\n     * emits the arguments given, and the complete notification thereafter. It can\n     * be used for composing with other Observables, such as with {@link concat}.\n     * By default, it uses a `null` Scheduler, which means the `next`\n     * notifications are sent synchronously, although with a different Scheduler\n     * it is possible to determine when those notifications will be delivered.\n     *\n     * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>\n     * var numbers = Rx.Observable.of(10, 20, 30);\n     * var letters = Rx.Observable.of('a', 'b', 'c');\n     * var interval = Rx.Observable.interval(1000);\n     * var result = numbers.concat(letters).concat(interval);\n     * result.subscribe(x => console.log(x));\n     *\n     * @see {@link create}\n     * @see {@link empty}\n     * @see {@link never}\n     * @see {@link throw}\n     *\n     * @param {...T} values Arguments that represent `next` values to be emitted.\n     * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n     * the emissions of the `next` notifications.\n     * @return {Observable<T>} An Observable that emits each given input value.\n     * @static true\n     * @name of\n     * @owner Observable\n     */\n    ArrayObservable.of = function () {\n        var array = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            array[_i - 0] = arguments[_i];\n        }\n        var scheduler = array[array.length - 1];\n        if (isScheduler_1.isScheduler(scheduler)) {\n            array.pop();\n        }\n        else {\n            scheduler = null;\n        }\n        var len = array.length;\n        if (len > 1) {\n            return new ArrayObservable(array, scheduler);\n        }\n        else if (len === 1) {\n            return new ScalarObservable_1.ScalarObservable(array[0], scheduler);\n        }\n        else {\n            return new EmptyObservable_1.EmptyObservable(scheduler);\n        }\n    };\n    ArrayObservable.dispatch = function (state) {\n        var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;\n        if (index >= count) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(array[index]);\n        if (subscriber.closed) {\n            return;\n        }\n        state.index = index + 1;\n        this.schedule(state);\n    };\n    ArrayObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var array = this.array;\n        var count = array.length;\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(ArrayObservable.dispatch, 0, {\n                array: array, index: index, count: count, subscriber: subscriber\n            });\n        }\n        else {\n            for (var i = 0; i < count && !subscriber.closed; i++) {\n                subscriber.next(array[i]);\n            }\n            subscriber.complete();\n        }\n    };\n    return ArrayObservable;\n}(Observable_1.Observable));\nexports.ArrayObservable = ArrayObservable;\n//# sourceMappingURL=ArrayObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/ArrayObservable.js\n// module id = 64\n// module chunks = 2","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/Observable'), require('@angular/platform-browser')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core', 'rxjs/Observable', '@angular/platform-browser'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.http = global.ng.http || {}),global.ng.core,global.Rx,global.ng.platformBrowser));\n}(this, function (exports,_angular_core,rxjs_Observable,_angular_platformBrowser) { 'use strict';\n\n    /**\n     * A backend for http that uses the `XMLHttpRequest` browser API.\n     *\n     * Take care not to evaluate this in non-browser contexts.\n     *\n     * \\@experimental\n     */\n    var BrowserXhr = (function () {\n        function BrowserXhr() {\n        }\n        /**\n         * @return {?}\n         */\n        BrowserXhr.prototype.build = function () { return ((new XMLHttpRequest())); };\n        BrowserXhr.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        BrowserXhr.ctorParameters = function () { return []; };\n        return BrowserXhr;\n    }());\n\n    var RequestMethod = {};\n    RequestMethod.Get = 0;\n    RequestMethod.Post = 1;\n    RequestMethod.Put = 2;\n    RequestMethod.Delete = 3;\n    RequestMethod.Options = 4;\n    RequestMethod.Head = 5;\n    RequestMethod.Patch = 6;\n    RequestMethod[RequestMethod.Get] = \"Get\";\n    RequestMethod[RequestMethod.Post] = \"Post\";\n    RequestMethod[RequestMethod.Put] = \"Put\";\n    RequestMethod[RequestMethod.Delete] = \"Delete\";\n    RequestMethod[RequestMethod.Options] = \"Options\";\n    RequestMethod[RequestMethod.Head] = \"Head\";\n    RequestMethod[RequestMethod.Patch] = \"Patch\";\n    var ReadyState = {};\n    ReadyState.Unsent = 0;\n    ReadyState.Open = 1;\n    ReadyState.HeadersReceived = 2;\n    ReadyState.Loading = 3;\n    ReadyState.Done = 4;\n    ReadyState.Cancelled = 5;\n    ReadyState[ReadyState.Unsent] = \"Unsent\";\n    ReadyState[ReadyState.Open] = \"Open\";\n    ReadyState[ReadyState.HeadersReceived] = \"HeadersReceived\";\n    ReadyState[ReadyState.Loading] = \"Loading\";\n    ReadyState[ReadyState.Done] = \"Done\";\n    ReadyState[ReadyState.Cancelled] = \"Cancelled\";\n    var ResponseType = {};\n    ResponseType.Basic = 0;\n    ResponseType.Cors = 1;\n    ResponseType.Default = 2;\n    ResponseType.Error = 3;\n    ResponseType.Opaque = 4;\n    ResponseType[ResponseType.Basic] = \"Basic\";\n    ResponseType[ResponseType.Cors] = \"Cors\";\n    ResponseType[ResponseType.Default] = \"Default\";\n    ResponseType[ResponseType.Error] = \"Error\";\n    ResponseType[ResponseType.Opaque] = \"Opaque\";\n    var ContentType = {};\n    ContentType.NONE = 0;\n    ContentType.JSON = 1;\n    ContentType.FORM = 2;\n    ContentType.FORM_DATA = 3;\n    ContentType.TEXT = 4;\n    ContentType.BLOB = 5;\n    ContentType.ARRAY_BUFFER = 6;\n    ContentType[ContentType.NONE] = \"NONE\";\n    ContentType[ContentType.JSON] = \"JSON\";\n    ContentType[ContentType.FORM] = \"FORM\";\n    ContentType[ContentType.FORM_DATA] = \"FORM_DATA\";\n    ContentType[ContentType.TEXT] = \"TEXT\";\n    ContentType[ContentType.BLOB] = \"BLOB\";\n    ContentType[ContentType.ARRAY_BUFFER] = \"ARRAY_BUFFER\";\n    var ResponseContentType = {};\n    ResponseContentType.Text = 0;\n    ResponseContentType.Json = 1;\n    ResponseContentType.ArrayBuffer = 2;\n    ResponseContentType.Blob = 3;\n    ResponseContentType[ResponseContentType.Text] = \"Text\";\n    ResponseContentType[ResponseContentType.Json] = \"Json\";\n    ResponseContentType[ResponseContentType.ArrayBuffer] = \"ArrayBuffer\";\n    ResponseContentType[ResponseContentType.Blob] = \"Blob\";\n\n    /**\n     * Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as\n     * specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).\n     *\n     * The only known difference between this `Headers` implementation and the spec is the\n     * lack of an `entries` method.\n     *\n     * ### Example\n     *\n     * ```\n     * import {Headers} from '\\@angular/http';\n     *\n     * var firstHeaders = new Headers();\n     * firstHeaders.append('Content-Type', 'image/jpeg');\n     * console.log(firstHeaders.get('Content-Type')) //'image/jpeg'\n     *\n     * // Create headers from Plain Old JavaScript Object\n     * var secondHeaders = new Headers({\n     *   'X-My-Custom-Header': 'Angular'\n     * });\n     * console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'\n     *\n     * var thirdHeaders = new Headers(secondHeaders);\n     * console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'\n     * ```\n     *\n     * \\@experimental\n     */\n    var Headers = (function () {\n        /**\n         * @param {?=} headers\n         */\n        function Headers(headers) {\n            var _this = this;\n            /** @internal header names are lower case */\n            this._headers = new Map();\n            /** @internal map lower case names to actual names */\n            this._normalizedNames = new Map();\n            if (!headers) {\n                return;\n            }\n            if (headers instanceof Headers) {\n                headers.forEach(function (values, name) {\n                    values.forEach(function (value) { return _this.append(name, value); });\n                });\n                return;\n            }\n            Object.keys(headers).forEach(function (name) {\n                var values = Array.isArray(headers[name]) ? headers[name] : [headers[name]];\n                _this.delete(name);\n                values.forEach(function (value) { return _this.append(name, value); });\n            });\n        }\n        /**\n         * Returns a new Headers instance from the given DOMString of Response Headers\n         * @param {?} headersString\n         * @return {?}\n         */\n        Headers.fromResponseHeaderString = function (headersString) {\n            var /** @type {?} */ headers = new Headers();\n            headersString.split('\\n').forEach(function (line) {\n                var /** @type {?} */ index = line.indexOf(':');\n                if (index > 0) {\n                    var /** @type {?} */ name_1 = line.slice(0, index);\n                    var /** @type {?} */ value = line.slice(index + 1).trim();\n                    headers.set(name_1, value);\n                }\n            });\n            return headers;\n        };\n        /**\n         * Appends a header to existing list of header values for a given header name.\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        Headers.prototype.append = function (name, value) {\n            var /** @type {?} */ values = this.getAll(name);\n            if (values === null) {\n                this.set(name, value);\n            }\n            else {\n                values.push(value);\n            }\n        };\n        /**\n         * Deletes all header values for the given name.\n         * @param {?} name\n         * @return {?}\n         */\n        Headers.prototype.delete = function (name) {\n            var /** @type {?} */ lcName = name.toLowerCase();\n            this._normalizedNames.delete(lcName);\n            this._headers.delete(lcName);\n        };\n        /**\n         * @param {?} fn\n         * @return {?}\n         */\n        Headers.prototype.forEach = function (fn) {\n            var _this = this;\n            this._headers.forEach(function (values, lcName) { return fn(values, _this._normalizedNames.get(lcName), _this._headers); });\n        };\n        /**\n         * Returns first header that matches given name.\n         * @param {?} name\n         * @return {?}\n         */\n        Headers.prototype.get = function (name) {\n            var /** @type {?} */ values = this.getAll(name);\n            if (values === null) {\n                return null;\n            }\n            return values.length > 0 ? values[0] : null;\n        };\n        /**\n         * Checks for existence of header by given name.\n         * @param {?} name\n         * @return {?}\n         */\n        Headers.prototype.has = function (name) { return this._headers.has(name.toLowerCase()); };\n        /**\n         * Returns the names of the headers\n         * @return {?}\n         */\n        Headers.prototype.keys = function () { return Array.from(this._normalizedNames.values()); };\n        /**\n         * Sets or overrides header value for given name.\n         * @param {?} name\n         * @param {?} value\n         * @return {?}\n         */\n        Headers.prototype.set = function (name, value) {\n            if (Array.isArray(value)) {\n                if (value.length) {\n                    this._headers.set(name.toLowerCase(), [value.join(',')]);\n                }\n            }\n            else {\n                this._headers.set(name.toLowerCase(), [value]);\n            }\n            this.mayBeSetNormalizedName(name);\n        };\n        /**\n         * Returns values of all headers.\n         * @return {?}\n         */\n        Headers.prototype.values = function () { return Array.from(this._headers.values()); };\n        /**\n         * @return {?}\n         */\n        Headers.prototype.toJSON = function () {\n            var _this = this;\n            var /** @type {?} */ serialized = {};\n            this._headers.forEach(function (values, name) {\n                var /** @type {?} */ split = [];\n                values.forEach(function (v) { return split.push.apply(split, v.split(',')); });\n                serialized[_this._normalizedNames.get(name)] = split;\n            });\n            return serialized;\n        };\n        /**\n         * Returns list of header values for a given name.\n         * @param {?} name\n         * @return {?}\n         */\n        Headers.prototype.getAll = function (name) {\n            return this.has(name) ? this._headers.get(name.toLowerCase()) : null;\n        };\n        /**\n         * This method is not implemented.\n         * @return {?}\n         */\n        Headers.prototype.entries = function () { throw new Error('\"entries\" method is not implemented on Headers class'); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        Headers.prototype.mayBeSetNormalizedName = function (name) {\n            var /** @type {?} */ lcName = name.toLowerCase();\n            if (!this._normalizedNames.has(lcName)) {\n                this._normalizedNames.set(lcName, name);\n            }\n        };\n        return Headers;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Creates a response options object to be optionally provided when instantiating a\n     * {\\@link Response}.\n     *\n     * This class is based on the `ResponseInit` description in the [Fetch\n     * Spec](https://fetch.spec.whatwg.org/#responseinit).\n     *\n     * All values are null by default. Typical defaults can be found in the\n     * {\\@link BaseResponseOptions} class, which sub-classes `ResponseOptions`.\n     *\n     * This class may be used in tests to build {\\@link Response Responses} for\n     * mock responses (see {\\@link MockBackend}).\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/P9Jkk8e8cz6NVzbcxEsD?p=preview))\n     *\n     * ```typescript\n     * import {ResponseOptions, Response} from '\\@angular/http';\n     *\n     * var options = new ResponseOptions({\n     *   body: '{\"name\":\"Jeff\"}'\n     * });\n     * var res = new Response(options);\n     *\n     * console.log('res.json():', res.json()); // Object {name: \"Jeff\"}\n     * ```\n     *\n     * \\@experimental\n     */\n    var ResponseOptions = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function ResponseOptions(_a) {\n            var _b = _a === void 0 ? {} : _a, body = _b.body, status = _b.status, headers = _b.headers, statusText = _b.statusText, type = _b.type, url = _b.url;\n            this.body = body != null ? body : null;\n            this.status = status != null ? status : null;\n            this.headers = headers != null ? headers : null;\n            this.statusText = statusText != null ? statusText : null;\n            this.type = type != null ? type : null;\n            this.url = url != null ? url : null;\n        }\n        /**\n         * Creates a copy of the `ResponseOptions` instance, using the optional input as values to\n         * override\n         * existing values. This method will not change the values of the instance on which it is being\n         * called.\n         *\n         * This may be useful when sharing a base `ResponseOptions` object inside tests,\n         * where certain properties may change from test to test.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/1lXquqFfgduTFBWjNoRE?p=preview))\n         *\n         * ```typescript\n         * import {ResponseOptions, Response} from '\\@angular/http';\n         *\n         * var options = new ResponseOptions({\n         *   body: {name: 'Jeff'}\n         * });\n         * var res = new Response(options.merge({\n         *   url: 'https://google.com'\n         * }));\n         * console.log('options.url:', options.url); // null\n         * console.log('res.json():', res.json()); // Object {name: \"Jeff\"}\n         * console.log('res.url:', res.url); // https://google.com\n         * ```\n         * @param {?=} options\n         * @return {?}\n         */\n        ResponseOptions.prototype.merge = function (options) {\n            return new ResponseOptions({\n                body: options && options.body != null ? options.body : this.body,\n                status: options && options.status != null ? options.status : this.status,\n                headers: options && options.headers != null ? options.headers : this.headers,\n                statusText: options && options.statusText != null ? options.statusText : this.statusText,\n                type: options && options.type != null ? options.type : this.type,\n                url: options && options.url != null ? options.url : this.url,\n            });\n        };\n        return ResponseOptions;\n    }());\n    /**\n     * Subclass of {\\@link ResponseOptions}, with default values.\n     *\n     * Default values:\n     *  * status: 200\n     *  * headers: empty {\\@link Headers} object\n     *\n     * This class could be extended and bound to the {\\@link ResponseOptions} class\n     * when configuring an {\\@link Injector}, in order to override the default options\n     * used by {\\@link Http} to create {\\@link Response Responses}.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/qv8DLT?p=preview))\n     *\n     * ```typescript\n     * import {provide} from '\\@angular/core';\n     * import {bootstrap} from '\\@angular/platform-browser/browser';\n     * import {HTTP_PROVIDERS, Headers, Http, BaseResponseOptions, ResponseOptions} from\n     * '\\@angular/http';\n     * import {App} from './myapp';\n     *\n     * class MyOptions extends BaseResponseOptions {\n     *   headers:Headers = new Headers({network: 'github'});\n     * }\n     *\n     * bootstrap(App, [HTTP_PROVIDERS, {provide: ResponseOptions, useClass: MyOptions}]);\n     * ```\n     *\n     * The options could also be extended when manually creating a {\\@link Response}\n     * object.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/VngosOWiaExEtbstDoix?p=preview))\n     *\n     * ```\n     * import {BaseResponseOptions, Response} from '\\@angular/http';\n     *\n     * var options = new BaseResponseOptions();\n     * var res = new Response(options.merge({\n     *   body: 'Angular',\n     *   headers: new Headers({framework: 'angular'})\n     * }));\n     * console.log('res.headers.get(\"framework\"):', res.headers.get('framework')); // angular\n     * console.log('res.text():', res.text()); // Angular;\n     * ```\n     *\n     * \\@experimental\n     */\n    var BaseResponseOptions = (function (_super) {\n        __extends$1(BaseResponseOptions, _super);\n        function BaseResponseOptions() {\n            _super.call(this, { status: 200, statusText: 'Ok', type: ResponseType.Default, headers: new Headers() });\n        }\n        BaseResponseOptions.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        BaseResponseOptions.ctorParameters = function () { return []; };\n        return BaseResponseOptions;\n    }(ResponseOptions));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * Abstract class from which real backends are derived.\n     *\n     * The primary purpose of a `ConnectionBackend` is to create new connections to fulfill a given\n     * {\\@link Request}.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var ConnectionBackend = (function () {\n        function ConnectionBackend() {\n        }\n        /**\n         * @abstract\n         * @param {?} request\n         * @return {?}\n         */\n        ConnectionBackend.prototype.createConnection = function (request) { };\n        return ConnectionBackend;\n    }());\n    /**\n     * Abstract class from which real connections are derived.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var Connection = (function () {\n        function Connection() {\n        }\n        return Connection;\n    }());\n    /**\n     * An XSRFStrategy configures XSRF protection (e.g. via headers) on an HTTP request.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var XSRFStrategy = (function () {\n        function XSRFStrategy() {\n        }\n        /**\n         * @abstract\n         * @param {?} req\n         * @return {?}\n         */\n        XSRFStrategy.prototype.configureRequest = function (req) { };\n        return XSRFStrategy;\n    }());\n\n    /**\n     * @param {?} method\n     * @return {?}\n     */\n    function normalizeMethodName(method) {\n        if (typeof method !== 'string')\n            return method;\n        switch (method.toUpperCase()) {\n            case 'GET':\n                return RequestMethod.Get;\n            case 'POST':\n                return RequestMethod.Post;\n            case 'PUT':\n                return RequestMethod.Put;\n            case 'DELETE':\n                return RequestMethod.Delete;\n            case 'OPTIONS':\n                return RequestMethod.Options;\n            case 'HEAD':\n                return RequestMethod.Head;\n            case 'PATCH':\n                return RequestMethod.Patch;\n        }\n        throw new Error(\"Invalid request method. The method \\\"\" + method + \"\\\" is not supported.\");\n    }\n    var /** @type {?} */ isSuccess = function (status) { return (status >= 200 && status < 300); };\n    /**\n     * @param {?} xhr\n     * @return {?}\n     */\n    function getResponseURL(xhr) {\n        if ('responseURL' in xhr) {\n            return xhr.responseURL;\n        }\n        if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n            return xhr.getResponseHeader('X-Request-URL');\n        }\n        return;\n    }\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function stringToArrayBuffer(input) {\n        var /** @type {?} */ view = new Uint16Array(input.length);\n        for (var /** @type {?} */ i = 0, /** @type {?} */ strLen = input.length; i < strLen; i++) {\n            view[i] = input.charCodeAt(i);\n        }\n        return view.buffer;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     * @param {?=} rawParams\n     * @return {?}\n     */\n    function paramParser(rawParams) {\n        if (rawParams === void 0) { rawParams = ''; }\n        var /** @type {?} */ map = new Map();\n        if (rawParams.length > 0) {\n            var /** @type {?} */ params = rawParams.split('&');\n            params.forEach(function (param) {\n                var /** @type {?} */ eqIdx = param.indexOf('=');\n                var _a = eqIdx == -1 ? [param, ''] : [param.slice(0, eqIdx), param.slice(eqIdx + 1)], key = _a[0], val = _a[1];\n                var /** @type {?} */ list = map.get(key) || [];\n                list.push(val);\n                map.set(key, list);\n            });\n        }\n        return map;\n    }\n    /**\n     * \\@experimental\n     *\n     */\n    var QueryEncoder = (function () {\n        function QueryEncoder() {\n        }\n        /**\n         * @param {?} k\n         * @return {?}\n         */\n        QueryEncoder.prototype.encodeKey = function (k) { return standardEncoding(k); };\n        /**\n         * @param {?} v\n         * @return {?}\n         */\n        QueryEncoder.prototype.encodeValue = function (v) { return standardEncoding(v); };\n        return QueryEncoder;\n    }());\n    /**\n     * @param {?} v\n     * @return {?}\n     */\n    function standardEncoding(v) {\n        return encodeURIComponent(v)\n            .replace(/%40/gi, '@')\n            .replace(/%3A/gi, ':')\n            .replace(/%24/gi, '$')\n            .replace(/%2C/gi, ',')\n            .replace(/%3B/gi, ';')\n            .replace(/%2B/gi, '+')\n            .replace(/%3D/gi, '=')\n            .replace(/%3F/gi, '?')\n            .replace(/%2F/gi, '/');\n    }\n    /**\n     * Map-like representation of url search parameters, based on\n     * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,\n     * with several extensions for merging URLSearchParams objects:\n     *   - setAll()\n     *   - appendAll()\n     *   - replaceAll()\n     *\n     * This class accepts an optional second parameter of ${\\@link QueryEncoder},\n     * which is used to serialize parameters before making a request. By default,\n     * `QueryEncoder` encodes keys and values of parameters using `encodeURIComponent`,\n     * and then un-encodes certain characters that are allowed to be part of the query\n     * according to IETF RFC 3986: https://tools.ietf.org/html/rfc3986.\n     *\n     * These are the characters that are not encoded: `! $ \\' ( ) * + , ; A 9 - . _ ~ ? /`\n     *\n     * If the set of allowed query characters is not acceptable for a particular backend,\n     * `QueryEncoder` can be subclassed and provided as the 2nd argument to URLSearchParams.\n     *\n     * ```\n     * import {URLSearchParams, QueryEncoder} from '\\@angular/http';\n     * class MyQueryEncoder extends QueryEncoder {\n     *   encodeKey(k: string): string {\n     *     return myEncodingFunction(k);\n     *   }\n     *\n     *   encodeValue(v: string): string {\n     *     return myEncodingFunction(v);\n     *   }\n     * }\n     *\n     * let params = new URLSearchParams('', new MyQueryEncoder());\n     * ```\n     * \\@experimental\n     */\n    var URLSearchParams = (function () {\n        /**\n         * @param {?=} rawParams\n         * @param {?=} queryEncoder\n         */\n        function URLSearchParams(rawParams, queryEncoder) {\n            if (rawParams === void 0) { rawParams = ''; }\n            if (queryEncoder === void 0) { queryEncoder = new QueryEncoder(); }\n            this.rawParams = rawParams;\n            this.queryEncoder = queryEncoder;\n            this.paramsMap = paramParser(rawParams);\n        }\n        /**\n         * @return {?}\n         */\n        URLSearchParams.prototype.clone = function () {\n            var /** @type {?} */ clone = new URLSearchParams('', this.queryEncoder);\n            clone.appendAll(this);\n            return clone;\n        };\n        /**\n         * @param {?} param\n         * @return {?}\n         */\n        URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); };\n        /**\n         * @param {?} param\n         * @return {?}\n         */\n        URLSearchParams.prototype.get = function (param) {\n            var /** @type {?} */ storedParam = this.paramsMap.get(param);\n            return Array.isArray(storedParam) ? storedParam[0] : null;\n        };\n        /**\n         * @param {?} param\n         * @return {?}\n         */\n        URLSearchParams.prototype.getAll = function (param) { return this.paramsMap.get(param) || []; };\n        /**\n         * @param {?} param\n         * @param {?} val\n         * @return {?}\n         */\n        URLSearchParams.prototype.set = function (param, val) {\n            if (val === void 0 || val === null) {\n                this.delete(param);\n                return;\n            }\n            var /** @type {?} */ list = this.paramsMap.get(param) || [];\n            list.length = 0;\n            list.push(val);\n            this.paramsMap.set(param, list);\n        };\n        /**\n         * @param {?} searchParams\n         * @return {?}\n         */\n        URLSearchParams.prototype.setAll = function (searchParams) {\n            var _this = this;\n            searchParams.paramsMap.forEach(function (value, param) {\n                var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n                list.length = 0;\n                list.push(value[0]);\n                _this.paramsMap.set(param, list);\n            });\n        };\n        /**\n         * @param {?} param\n         * @param {?} val\n         * @return {?}\n         */\n        URLSearchParams.prototype.append = function (param, val) {\n            if (val === void 0 || val === null)\n                return;\n            var /** @type {?} */ list = this.paramsMap.get(param) || [];\n            list.push(val);\n            this.paramsMap.set(param, list);\n        };\n        /**\n         * @param {?} searchParams\n         * @return {?}\n         */\n        URLSearchParams.prototype.appendAll = function (searchParams) {\n            var _this = this;\n            searchParams.paramsMap.forEach(function (value, param) {\n                var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n                for (var /** @type {?} */ i = 0; i < value.length; ++i) {\n                    list.push(value[i]);\n                }\n                _this.paramsMap.set(param, list);\n            });\n        };\n        /**\n         * @param {?} searchParams\n         * @return {?}\n         */\n        URLSearchParams.prototype.replaceAll = function (searchParams) {\n            var _this = this;\n            searchParams.paramsMap.forEach(function (value, param) {\n                var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n                list.length = 0;\n                for (var /** @type {?} */ i = 0; i < value.length; ++i) {\n                    list.push(value[i]);\n                }\n                _this.paramsMap.set(param, list);\n            });\n        };\n        /**\n         * @return {?}\n         */\n        URLSearchParams.prototype.toString = function () {\n            var _this = this;\n            var /** @type {?} */ paramsList = [];\n            this.paramsMap.forEach(function (values, k) {\n                values.forEach(function (v) { return paramsList.push(_this.queryEncoder.encodeKey(k) + '=' + _this.queryEncoder.encodeValue(v)); });\n            });\n            return paramsList.join('&');\n        };\n        /**\n         * @param {?} param\n         * @return {?}\n         */\n        URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); };\n        return URLSearchParams;\n    }());\n\n    /**\n     * HTTP request body used by both {\\@link Request} and {\\@link Response}\n     * https://fetch.spec.whatwg.org/#body\n     * @abstract\n     */\n    var Body = (function () {\n        function Body() {\n        }\n        /**\n         * Attempts to return body as parsed `JSON` object, or raises an exception.\n         * @return {?}\n         */\n        Body.prototype.json = function () {\n            if (typeof this._body === 'string') {\n                return JSON.parse(/** @type {?} */ (this._body));\n            }\n            if (this._body instanceof ArrayBuffer) {\n                return JSON.parse(this.text());\n            }\n            return this._body;\n        };\n        /**\n         * Returns the body as a string, presuming `toString()` can be called on the response body.\n         * @return {?}\n         */\n        Body.prototype.text = function () {\n            if (this._body instanceof URLSearchParams) {\n                return this._body.toString();\n            }\n            if (this._body instanceof ArrayBuffer) {\n                return String.fromCharCode.apply(null, new Uint16Array(/** @type {?} */ (this._body)));\n            }\n            if (this._body == null) {\n                return '';\n            }\n            if (typeof this._body === 'object') {\n                return JSON.stringify(this._body, null, 2);\n            }\n            return this._body.toString();\n        };\n        /**\n         * Return the body as an ArrayBuffer\n         * @return {?}\n         */\n        Body.prototype.arrayBuffer = function () {\n            if (this._body instanceof ArrayBuffer) {\n                return (this._body);\n            }\n            return stringToArrayBuffer(this.text());\n        };\n        /**\n         * Returns the request's body as a Blob, assuming that body exists.\n         * @return {?}\n         */\n        Body.prototype.blob = function () {\n            if (this._body instanceof Blob) {\n                return (this._body);\n            }\n            if (this._body instanceof ArrayBuffer) {\n                return new Blob([this._body]);\n            }\n            throw new Error('The request body isn\\'t either a blob or an array buffer');\n        };\n        return Body;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$2 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Creates `Response` instances from provided values.\n     *\n     * Though this object isn't\n     * usually instantiated by end-users, it is the primary object interacted with when it comes time to\n     * add data to a view.\n     *\n     * ### Example\n     *\n     * ```\n     * http.request('my-friends.txt').subscribe(response => this.friends = response.text());\n     * ```\n     *\n     * The Response's interface is inspired by the Response constructor defined in the [Fetch\n     * Spec](https://fetch.spec.whatwg.org/#response-class), but is considered a static value whose body\n     * can be accessed many times. There are other differences in the implementation, but this is the\n     * most significant.\n     *\n     * \\@experimental\n     */\n    var Response = (function (_super) {\n        __extends$2(Response, _super);\n        /**\n         * @param {?} responseOptions\n         */\n        function Response(responseOptions) {\n            _super.call(this);\n            this._body = responseOptions.body;\n            this.status = responseOptions.status;\n            this.ok = (this.status >= 200 && this.status <= 299);\n            this.statusText = responseOptions.statusText;\n            this.headers = responseOptions.headers;\n            this.type = responseOptions.type;\n            this.url = responseOptions.url;\n        }\n        /**\n         * @return {?}\n         */\n        Response.prototype.toString = function () {\n            return \"Response with status: \" + this.status + \" \" + this.statusText + \" for URL: \" + this.url;\n        };\n        return Response;\n    }(Body));\n\n    var /** @type {?} */ _nextRequestId = 0;\n    var /** @type {?} */ JSONP_HOME = '__ng_jsonp__';\n    var /** @type {?} */ _jsonpConnections = null;\n    /**\n     * @return {?}\n     */\n    function _getJsonpConnections() {\n        var /** @type {?} */ w = typeof window == 'object' ? window : {};\n        if (_jsonpConnections === null) {\n            _jsonpConnections = w[JSONP_HOME] = {};\n        }\n        return _jsonpConnections;\n    }\n    var BrowserJsonp = (function () {\n        function BrowserJsonp() {\n        }\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        BrowserJsonp.prototype.build = function (url) {\n            var /** @type {?} */ node = document.createElement('script');\n            node.src = url;\n            return node;\n        };\n        /**\n         * @return {?}\n         */\n        BrowserJsonp.prototype.nextRequestID = function () { return \"__req\" + _nextRequestId++; };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        BrowserJsonp.prototype.requestCallback = function (id) { return JSONP_HOME + \".\" + id + \".finished\"; };\n        /**\n         * @param {?} id\n         * @param {?} connection\n         * @return {?}\n         */\n        BrowserJsonp.prototype.exposeConnection = function (id, connection) {\n            var /** @type {?} */ connections = _getJsonpConnections();\n            connections[id] = connection;\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        BrowserJsonp.prototype.removeConnection = function (id) {\n            var /** @type {?} */ connections = _getJsonpConnections();\n            connections[id] = null;\n        };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserJsonp.prototype.send = function (node) { document.body.appendChild(/** @type {?} */ ((node))); };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        BrowserJsonp.prototype.cleanup = function (node) {\n            if (node.parentNode) {\n                node.parentNode.removeChild(/** @type {?} */ ((node)));\n            }\n        };\n        BrowserJsonp.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        BrowserJsonp.ctorParameters = function () { return []; };\n        return BrowserJsonp;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n    var /** @type {?} */ JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';\n    /**\n     * Abstract base class for an in-flight JSONP request.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var JSONPConnection = (function () {\n        function JSONPConnection() {\n        }\n        /**\n         * Callback called when the JSONP request completes, to notify the application\n         * of the new data.\n         * @abstract\n         * @param {?=} data\n         * @return {?}\n         */\n        JSONPConnection.prototype.finished = function (data) { };\n        return JSONPConnection;\n    }());\n    var JSONPConnection_ = (function (_super) {\n        __extends(JSONPConnection_, _super);\n        /**\n         * @param {?} req\n         * @param {?} _dom\n         * @param {?=} baseResponseOptions\n         */\n        function JSONPConnection_(req, _dom, baseResponseOptions) {\n            var _this = this;\n            _super.call(this);\n            this._dom = _dom;\n            this.baseResponseOptions = baseResponseOptions;\n            this._finished = false;\n            if (req.method !== RequestMethod.Get) {\n                throw new TypeError(JSONP_ERR_WRONG_METHOD);\n            }\n            this.request = req;\n            this.response = new rxjs_Observable.Observable(function (responseObserver) {\n                _this.readyState = ReadyState.Loading;\n                var id = _this._id = _dom.nextRequestID();\n                _dom.exposeConnection(id, _this);\n                // Workaround Dart\n                // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);\n                var callback = _dom.requestCallback(_this._id);\n                var url = req.url;\n                if (url.indexOf('=JSONP_CALLBACK&') > -1) {\n                    url = url.replace('=JSONP_CALLBACK&', \"=\" + callback + \"&\");\n                }\n                else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {\n                    url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + (\"=\" + callback);\n                }\n                var script = _this._script = _dom.build(url);\n                var onLoad = function (event) {\n                    if (_this.readyState === ReadyState.Cancelled)\n                        return;\n                    _this.readyState = ReadyState.Done;\n                    _dom.cleanup(script);\n                    if (!_this._finished) {\n                        var responseOptions_1 = new ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: ResponseType.Error, url: url });\n                        if (baseResponseOptions) {\n                            responseOptions_1 = baseResponseOptions.merge(responseOptions_1);\n                        }\n                        responseObserver.error(new Response(responseOptions_1));\n                        return;\n                    }\n                    var responseOptions = new ResponseOptions({ body: _this._responseData, url: url });\n                    if (_this.baseResponseOptions) {\n                        responseOptions = _this.baseResponseOptions.merge(responseOptions);\n                    }\n                    responseObserver.next(new Response(responseOptions));\n                    responseObserver.complete();\n                };\n                var onError = function (error) {\n                    if (_this.readyState === ReadyState.Cancelled)\n                        return;\n                    _this.readyState = ReadyState.Done;\n                    _dom.cleanup(script);\n                    var responseOptions = new ResponseOptions({ body: error.message, type: ResponseType.Error });\n                    if (baseResponseOptions) {\n                        responseOptions = baseResponseOptions.merge(responseOptions);\n                    }\n                    responseObserver.error(new Response(responseOptions));\n                };\n                script.addEventListener('load', onLoad);\n                script.addEventListener('error', onError);\n                _dom.send(script);\n                return function () {\n                    _this.readyState = ReadyState.Cancelled;\n                    script.removeEventListener('load', onLoad);\n                    script.removeEventListener('error', onError);\n                    _this._dom.cleanup(script);\n                };\n            });\n        }\n        /**\n         * @param {?=} data\n         * @return {?}\n         */\n        JSONPConnection_.prototype.finished = function (data) {\n            // Don't leak connections\n            this._finished = true;\n            this._dom.removeConnection(this._id);\n            if (this.readyState === ReadyState.Cancelled)\n                return;\n            this._responseData = data;\n        };\n        return JSONPConnection_;\n    }(JSONPConnection));\n    /**\n     * A {\\@link ConnectionBackend} that uses the JSONP strategy of making requests.\n     *\n     * \\@experimental\n     * @abstract\n     */\n    var JSONPBackend = (function (_super) {\n        __extends(JSONPBackend, _super);\n        function JSONPBackend() {\n            _super.apply(this, arguments);\n        }\n        return JSONPBackend;\n    }(ConnectionBackend));\n    var JSONPBackend_ = (function (_super) {\n        __extends(JSONPBackend_, _super);\n        /**\n         * @param {?} _browserJSONP\n         * @param {?} _baseResponseOptions\n         */\n        function JSONPBackend_(_browserJSONP, _baseResponseOptions) {\n            _super.call(this);\n            this._browserJSONP = _browserJSONP;\n            this._baseResponseOptions = _baseResponseOptions;\n        }\n        /**\n         * @param {?} request\n         * @return {?}\n         */\n        JSONPBackend_.prototype.createConnection = function (request) {\n            return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions);\n        };\n        JSONPBackend_.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        JSONPBackend_.ctorParameters = function () { return [\n            { type: BrowserJsonp, },\n            { type: ResponseOptions, },\n        ]; };\n        return JSONPBackend_;\n    }(JSONPBackend));\n\n    var /** @type {?} */ XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n    /**\n     * Creates connections using `XMLHttpRequest`. Given a fully-qualified\n     * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the\n     * request.\n     *\n     * This class would typically not be created or interacted with directly inside applications, though\n     * the {\\@link MockConnection} may be interacted with in tests.\n     *\n     * \\@experimental\n     */\n    var XHRConnection = (function () {\n        /**\n         * @param {?} req\n         * @param {?} browserXHR\n         * @param {?=} baseResponseOptions\n         */\n        function XHRConnection(req, browserXHR, baseResponseOptions) {\n            var _this = this;\n            this.request = req;\n            this.response = new rxjs_Observable.Observable(function (responseObserver) {\n                var _xhr = browserXHR.build();\n                _xhr.open(RequestMethod[req.method].toUpperCase(), req.url);\n                if (req.withCredentials != null) {\n                    _xhr.withCredentials = req.withCredentials;\n                }\n                // load event handler\n                var onLoad = function () {\n                    // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n                    var status = _xhr.status === 1223 ? 204 : _xhr.status;\n                    var body = null;\n                    // HTTP 204 means no content\n                    if (status !== 204) {\n                        // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n                        // response/responseType properties were introduced in ResourceLoader Level2 spec\n                        // (supported by IE10)\n                        body = (typeof _xhr.response === 'undefined') ? _xhr.responseText : _xhr.response;\n                        // Implicitly strip a potential XSSI prefix.\n                        if (typeof body === 'string') {\n                            body = body.replace(XSSI_PREFIX, '');\n                        }\n                    }\n                    // fix status code when it is 0 (0 status is undocumented).\n                    // Occurs when accessing file resources or on Android 4.1 stock browser\n                    // while retrieving files from application cache.\n                    if (status === 0) {\n                        status = body ? 200 : 0;\n                    }\n                    var headers = Headers.fromResponseHeaderString(_xhr.getAllResponseHeaders());\n                    // IE 9 does not provide the way to get URL of response\n                    var url = getResponseURL(_xhr) || req.url;\n                    var statusText = _xhr.statusText || 'OK';\n                    var responseOptions = new ResponseOptions({ body: body, status: status, headers: headers, statusText: statusText, url: url });\n                    if (baseResponseOptions != null) {\n                        responseOptions = baseResponseOptions.merge(responseOptions);\n                    }\n                    var response = new Response(responseOptions);\n                    response.ok = isSuccess(status);\n                    if (response.ok) {\n                        responseObserver.next(response);\n                        // TODO(gdi2290): defer complete if array buffer until done\n                        responseObserver.complete();\n                        return;\n                    }\n                    responseObserver.error(response);\n                };\n                // error event handler\n                var onError = function (err) {\n                    var responseOptions = new ResponseOptions({\n                        body: err,\n                        type: ResponseType.Error,\n                        status: _xhr.status,\n                        statusText: _xhr.statusText,\n                    });\n                    if (baseResponseOptions != null) {\n                        responseOptions = baseResponseOptions.merge(responseOptions);\n                    }\n                    responseObserver.error(new Response(responseOptions));\n                };\n                _this.setDetectedContentType(req, _xhr);\n                if (req.headers == null) {\n                    req.headers = new Headers();\n                }\n                if (!req.headers.has('Accept')) {\n                    req.headers.append('Accept', 'application/json, text/plain, */*');\n                }\n                req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });\n                // Select the correct buffer type to store the response\n                if (req.responseType != null && _xhr.responseType != null) {\n                    switch (req.responseType) {\n                        case ResponseContentType.ArrayBuffer:\n                            _xhr.responseType = 'arraybuffer';\n                            break;\n                        case ResponseContentType.Json:\n                            _xhr.responseType = 'json';\n                            break;\n                        case ResponseContentType.Text:\n                            _xhr.responseType = 'text';\n                            break;\n                        case ResponseContentType.Blob:\n                            _xhr.responseType = 'blob';\n                            break;\n                        default:\n                            throw new Error('The selected responseType is not supported');\n                    }\n                }\n                _xhr.addEventListener('load', onLoad);\n                _xhr.addEventListener('error', onError);\n                _xhr.send(_this.request.getBody());\n                return function () {\n                    _xhr.removeEventListener('load', onLoad);\n                    _xhr.removeEventListener('error', onError);\n                    _xhr.abort();\n                };\n            });\n        }\n        /**\n         * @param {?} req\n         * @param {?} _xhr\n         * @return {?}\n         */\n        XHRConnection.prototype.setDetectedContentType = function (req /** TODO Request */, _xhr /** XMLHttpRequest */) {\n            // Skip if a custom Content-Type header is provided\n            if (req.headers != null && req.headers.get('Content-Type') != null) {\n                return;\n            }\n            // Set the detected content type\n            switch (req.contentType) {\n                case ContentType.NONE:\n                    break;\n                case ContentType.JSON:\n                    _xhr.setRequestHeader('content-type', 'application/json');\n                    break;\n                case ContentType.FORM:\n                    _xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n                    break;\n                case ContentType.TEXT:\n                    _xhr.setRequestHeader('content-type', 'text/plain');\n                    break;\n                case ContentType.BLOB:\n                    var /** @type {?} */ blob = req.blob();\n                    if (blob.type) {\n                        _xhr.setRequestHeader('content-type', blob.type);\n                    }\n                    break;\n            }\n        };\n        return XHRConnection;\n    }());\n    /**\n     * `XSRFConfiguration` sets up Cross Site Request Forgery (XSRF) protection for the application\n     * using a cookie. See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)\n     * for more information on XSRF.\n     *\n     * Applications can configure custom cookie and header names by binding an instance of this class\n     * with different `cookieName` and `headerName` values. See the main HTTP documentation for more\n     * details.\n     *\n     * \\@experimental\n     */\n    var CookieXSRFStrategy = (function () {\n        /**\n         * @param {?=} _cookieName\n         * @param {?=} _headerName\n         */\n        function CookieXSRFStrategy(_cookieName, _headerName) {\n            if (_cookieName === void 0) { _cookieName = 'XSRF-TOKEN'; }\n            if (_headerName === void 0) { _headerName = 'X-XSRF-TOKEN'; }\n            this._cookieName = _cookieName;\n            this._headerName = _headerName;\n        }\n        /**\n         * @param {?} req\n         * @return {?}\n         */\n        CookieXSRFStrategy.prototype.configureRequest = function (req) {\n            var /** @type {?} */ xsrfToken = _angular_platformBrowser.__platform_browser_private__.getDOM().getCookie(this._cookieName);\n            if (xsrfToken) {\n                req.headers.set(this._headerName, xsrfToken);\n            }\n        };\n        return CookieXSRFStrategy;\n    }());\n    /**\n     * Creates {\\@link XHRConnection} instances.\n     *\n     * This class would typically not be used by end users, but could be\n     * overridden if a different backend implementation should be used,\n     * such as in a node backend.\n     *\n     * ### Example\n     *\n     * ```\n     * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from '\\@angular/http';\n     * \\@Component({\n     *   viewProviders: [\n     *     HTTP_PROVIDERS,\n     *     {provide: Http, useFactory: (backend, options) => {\n     *       return new Http(backend, options);\n     *     }, deps: [MyNodeBackend, BaseRequestOptions]}]\n     * })\n     * class MyComponent {\n     *   constructor(http:Http) {\n     *     http.request('people.json').subscribe(res => this.people = res.json());\n     *   }\n     * }\n     * ```\n     * \\@experimental\n     */\n    var XHRBackend = (function () {\n        /**\n         * @param {?} _browserXHR\n         * @param {?} _baseResponseOptions\n         * @param {?} _xsrfStrategy\n         */\n        function XHRBackend(_browserXHR, _baseResponseOptions, _xsrfStrategy) {\n            this._browserXHR = _browserXHR;\n            this._baseResponseOptions = _baseResponseOptions;\n            this._xsrfStrategy = _xsrfStrategy;\n        }\n        /**\n         * @param {?} request\n         * @return {?}\n         */\n        XHRBackend.prototype.createConnection = function (request) {\n            this._xsrfStrategy.configureRequest(request);\n            return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);\n        };\n        XHRBackend.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        XHRBackend.ctorParameters = function () { return [\n            { type: BrowserXhr, },\n            { type: ResponseOptions, },\n            { type: XSRFStrategy, },\n        ]; };\n        return XHRBackend;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$3 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Creates a request options object to be optionally provided when instantiating a\n     * {\\@link Request}.\n     *\n     * This class is based on the `RequestInit` description in the [Fetch\n     * Spec](https://fetch.spec.whatwg.org/#requestinit).\n     *\n     * All values are null by default. Typical defaults can be found in the {\\@link BaseRequestOptions}\n     * class, which sub-classes `RequestOptions`.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/7Wvi3lfLq41aQPKlxB4O?p=preview))\n     *\n     * ```typescript\n     * import {RequestOptions, Request, RequestMethod} from '\\@angular/http';\n     *\n     * var options = new RequestOptions({\n     *   method: RequestMethod.Post,\n     *   url: 'https://google.com'\n     * });\n     * var req = new Request(options);\n     * console.log('req.method:', RequestMethod[req.method]); // Post\n     * console.log('options.url:', options.url); // https://google.com\n     * ```\n     *\n     * \\@experimental\n     */\n    var RequestOptions = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function RequestOptions(_a) {\n            var _b = _a === void 0 ? {} : _a, method = _b.method, headers = _b.headers, body = _b.body, url = _b.url, search = _b.search, withCredentials = _b.withCredentials, responseType = _b.responseType;\n            this.method = method != null ? normalizeMethodName(method) : null;\n            this.headers = headers != null ? headers : null;\n            this.body = body != null ? body : null;\n            this.url = url != null ? url : null;\n            this.search =\n                search != null ? (typeof search === 'string' ? new URLSearchParams(search) : search) : null;\n            this.withCredentials = withCredentials != null ? withCredentials : null;\n            this.responseType = responseType != null ? responseType : null;\n        }\n        /**\n         * Creates a copy of the `RequestOptions` instance, using the optional input as values to override\n         * existing values. This method will not change the values of the instance on which it is being\n         * called.\n         *\n         * Note that `headers` and `search` will override existing values completely if present in\n         * the `options` object. If these values should be merged, it should be done prior to calling\n         * `merge` on the `RequestOptions` instance.\n         *\n         * ### Example ([live demo](http://plnkr.co/edit/6w8XA8YTkDRcPYpdB9dk?p=preview))\n         *\n         * ```typescript\n         * import {RequestOptions, Request, RequestMethod} from '\\@angular/http';\n         *\n         * var options = new RequestOptions({\n         *   method: RequestMethod.Post\n         * });\n         * var req = new Request(options.merge({\n         *   url: 'https://google.com'\n         * }));\n         * console.log('req.method:', RequestMethod[req.method]); // Post\n         * console.log('options.url:', options.url); // null\n         * console.log('req.url:', req.url); // https://google.com\n         * ```\n         * @param {?=} options\n         * @return {?}\n         */\n        RequestOptions.prototype.merge = function (options) {\n            return new RequestOptions({\n                method: options && options.method != null ? options.method : this.method,\n                headers: options && options.headers != null ? options.headers : new Headers(this.headers),\n                body: options && options.body != null ? options.body : this.body,\n                url: options && options.url != null ? options.url : this.url,\n                search: options && options.search != null ?\n                    (typeof options.search === 'string' ? new URLSearchParams(options.search) :\n                        options.search.clone()) :\n                    this.search,\n                withCredentials: options && options.withCredentials != null ? options.withCredentials :\n                    this.withCredentials,\n                responseType: options && options.responseType != null ? options.responseType :\n                    this.responseType\n            });\n        };\n        return RequestOptions;\n    }());\n    /**\n     * Subclass of {\\@link RequestOptions}, with default values.\n     *\n     * Default values:\n     *  * method: {\\@link RequestMethod RequestMethod.Get}\n     *  * headers: empty {\\@link Headers} object\n     *\n     * This class could be extended and bound to the {\\@link RequestOptions} class\n     * when configuring an {\\@link Injector}, in order to override the default options\n     * used by {\\@link Http} to create and send {\\@link Request Requests}.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/LEKVSx?p=preview))\n     *\n     * ```typescript\n     * import {provide} from '\\@angular/core';\n     * import {bootstrap} from '\\@angular/platform-browser/browser';\n     * import {HTTP_PROVIDERS, Http, BaseRequestOptions, RequestOptions} from '\\@angular/http';\n     * import {App} from './myapp';\n     *\n     * class MyOptions extends BaseRequestOptions {\n     *   search: string = 'coreTeam=true';\n     * }\n     *\n     * bootstrap(App, [HTTP_PROVIDERS, {provide: RequestOptions, useClass: MyOptions}]);\n     * ```\n     *\n     * The options could also be extended when manually creating a {\\@link Request}\n     * object.\n     *\n     * ### Example ([live demo](http://plnkr.co/edit/oyBoEvNtDhOSfi9YxaVb?p=preview))\n     *\n     * ```\n     * import {BaseRequestOptions, Request, RequestMethod} from '\\@angular/http';\n     *\n     * var options = new BaseRequestOptions();\n     * var req = new Request(options.merge({\n     *   method: RequestMethod.Post,\n     *   url: 'https://google.com'\n     * }));\n     * console.log('req.method:', RequestMethod[req.method]); // Post\n     * console.log('options.url:', options.url); // null\n     * console.log('req.url:', req.url); // https://google.com\n     * ```\n     *\n     * \\@experimental\n     */\n    var BaseRequestOptions = (function (_super) {\n        __extends$3(BaseRequestOptions, _super);\n        function BaseRequestOptions() {\n            _super.call(this, { method: RequestMethod.Get, headers: new Headers() });\n        }\n        BaseRequestOptions.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        BaseRequestOptions.ctorParameters = function () { return []; };\n        return BaseRequestOptions;\n    }(RequestOptions));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$5 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * Creates `Request` instances from provided values.\n     *\n     * The Request's interface is inspired by the Request constructor defined in the [Fetch\n     * Spec](https://fetch.spec.whatwg.org/#request-class),\n     * but is considered a static value whose body can be accessed many times. There are other\n     * differences in the implementation, but this is the most significant.\n     *\n     * `Request` instances are typically created by higher-level classes, like {\\@link Http} and\n     * {\\@link Jsonp}, but it may occasionally be useful to explicitly create `Request` instances.\n     * One such example is when creating services that wrap higher-level services, like {\\@link Http},\n     * where it may be useful to generate a `Request` with arbitrary headers and search params.\n     *\n     * ```typescript\n     * import {Injectable, Injector} from '\\@angular/core';\n     * import {HTTP_PROVIDERS, Http, Request, RequestMethod} from '\\@angular/http';\n     *\n     * \\@Injectable()\n     * class AutoAuthenticator {\n     *   constructor(public http:Http) {}\n     *   request(url:string) {\n     *     return this.http.request(new Request({\n     *       method: RequestMethod.Get,\n     *       url: url,\n     *       search: 'password=123'\n     *     }));\n     *   }\n     * }\n     *\n     * var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AutoAuthenticator]);\n     * var authenticator = injector.get(AutoAuthenticator);\n     * authenticator.request('people.json').subscribe(res => {\n     *   //URL should have included '?password=123'\n     *   console.log('people', res.json());\n     * });\n     * ```\n     *\n     * \\@experimental\n     */\n    var Request = (function (_super) {\n        __extends$5(Request, _super);\n        /**\n         * @param {?} requestOptions\n         */\n        function Request(requestOptions) {\n            _super.call(this);\n            // TODO: assert that url is present\n            var url = requestOptions.url;\n            this.url = requestOptions.url;\n            if (requestOptions.search) {\n                var search = requestOptions.search.toString();\n                if (search.length > 0) {\n                    var prefix = '?';\n                    if (this.url.indexOf('?') != -1) {\n                        prefix = (this.url[this.url.length - 1] == '&') ? '' : '&';\n                    }\n                    // TODO: just delete search-query-looking string in url?\n                    this.url = url + prefix + search;\n                }\n            }\n            this._body = requestOptions.body;\n            this.method = normalizeMethodName(requestOptions.method);\n            // TODO(jeffbcross): implement behavior\n            // Defaults to 'omit', consistent with browser\n            this.headers = new Headers(requestOptions.headers);\n            this.contentType = this.detectContentType();\n            this.withCredentials = requestOptions.withCredentials;\n            this.responseType = requestOptions.responseType;\n        }\n        /**\n         * Returns the content type enum based on header options.\n         * @return {?}\n         */\n        Request.prototype.detectContentType = function () {\n            switch (this.headers.get('content-type')) {\n                case 'application/json':\n                    return ContentType.JSON;\n                case 'application/x-www-form-urlencoded':\n                    return ContentType.FORM;\n                case 'multipart/form-data':\n                    return ContentType.FORM_DATA;\n                case 'text/plain':\n                case 'text/html':\n                    return ContentType.TEXT;\n                case 'application/octet-stream':\n                    return this._body instanceof ArrayBuffer$1 ? ContentType.ARRAY_BUFFER : ContentType.BLOB;\n                default:\n                    return this.detectContentTypeFromBody();\n            }\n        };\n        /**\n         * Returns the content type of request's body based on its type.\n         * @return {?}\n         */\n        Request.prototype.detectContentTypeFromBody = function () {\n            if (this._body == null) {\n                return ContentType.NONE;\n            }\n            else if (this._body instanceof URLSearchParams) {\n                return ContentType.FORM;\n            }\n            else if (this._body instanceof FormData) {\n                return ContentType.FORM_DATA;\n            }\n            else if (this._body instanceof Blob$1) {\n                return ContentType.BLOB;\n            }\n            else if (this._body instanceof ArrayBuffer$1) {\n                return ContentType.ARRAY_BUFFER;\n            }\n            else if (this._body && typeof this._body === 'object') {\n                return ContentType.JSON;\n            }\n            else {\n                return ContentType.TEXT;\n            }\n        };\n        /**\n         * Returns the request's body according to its type. If body is undefined, return\n         * null.\n         * @return {?}\n         */\n        Request.prototype.getBody = function () {\n            switch (this.contentType) {\n                case ContentType.JSON:\n                    return this.text();\n                case ContentType.FORM:\n                    return this.text();\n                case ContentType.FORM_DATA:\n                    return this._body;\n                case ContentType.TEXT:\n                    return this.text();\n                case ContentType.BLOB:\n                    return this.blob();\n                case ContentType.ARRAY_BUFFER:\n                    return this.arrayBuffer();\n                default:\n                    return null;\n            }\n        };\n        return Request;\n    }(Body));\n    var /** @type {?} */ noop = function () { };\n    var /** @type {?} */ w = typeof window == 'object' ? window : noop;\n    var /** @type {?} */ FormData = ((w) /** TODO #9100 */)['FormData'] || noop;\n    var /** @type {?} */ Blob$1 = ((w) /** TODO #9100 */)['Blob'] || noop;\n    var /** @type {?} */ ArrayBuffer$1 = ((w) /** TODO #9100 */)['ArrayBuffer'] || noop;\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$4 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @param {?} backend\n     * @param {?} request\n     * @return {?}\n     */\n    function httpRequest(backend, request) {\n        return backend.createConnection(request).response;\n    }\n    /**\n     * @param {?} defaultOpts\n     * @param {?} providedOpts\n     * @param {?} method\n     * @param {?} url\n     * @return {?}\n     */\n    function mergeOptions(defaultOpts, providedOpts, method, url) {\n        var /** @type {?} */ newOptions = defaultOpts;\n        if (providedOpts) {\n            // Hack so Dart can used named parameters\n            return newOptions.merge(new RequestOptions({\n                method: providedOpts.method || method,\n                url: providedOpts.url || url,\n                search: providedOpts.search,\n                headers: providedOpts.headers,\n                body: providedOpts.body,\n                withCredentials: providedOpts.withCredentials,\n                responseType: providedOpts.responseType\n            }));\n        }\n        return newOptions.merge(new RequestOptions({ method: method, url: url }));\n    }\n    /**\n     * Performs http requests using `XMLHttpRequest` as the default backend.\n     *\n     * `Http` is available as an injectable class, with methods to perform http requests. Calling\n     * `request` returns an `Observable` which will emit a single {\\@link Response} when a\n     * response is received.\n     *\n     * ### Example\n     *\n     * ```typescript\n     * import {Http, HTTP_PROVIDERS} from '\\@angular/http';\n     * import 'rxjs/add/operator/map'\n     * \\@Component({\n     *   selector: 'http-app',\n     *   viewProviders: [HTTP_PROVIDERS],\n     *   templateUrl: 'people.html'\n     * })\n     * class PeopleComponent {\n     *   constructor(http: Http) {\n     *     http.get('people.json')\n     *       // Call map on the response observable to get the parsed people object\n     *       .map(res => res.json())\n     *       // Subscribe to the observable to get the parsed people object and attach it to the\n     *       // component\n     *       .subscribe(people => this.people = people);\n     *   }\n     * }\n     * ```\n     *\n     *\n     * ### Example\n     *\n     * ```\n     * http.get('people.json').subscribe((res:Response) => this.people = res.json());\n     * ```\n     *\n     * The default construct used to perform requests, `XMLHttpRequest`, is abstracted as a \"Backend\" (\n     * {\\@link XHRBackend} in this case), which could be mocked with dependency injection by replacing\n     * the {\\@link XHRBackend} provider, as in the following example:\n     *\n     * ### Example\n     *\n     * ```typescript\n     * import {BaseRequestOptions, Http} from '\\@angular/http';\n     * import {MockBackend} from '\\@angular/http/testing';\n     * var injector = Injector.resolveAndCreate([\n     *   BaseRequestOptions,\n     *   MockBackend,\n     *   {provide: Http, useFactory:\n     *       function(backend, defaultOptions) {\n     *         return new Http(backend, defaultOptions);\n     *       },\n     *       deps: [MockBackend, BaseRequestOptions]}\n     * ]);\n     * var http = injector.get(Http);\n     * http.get('request-from-mock-backend.json').subscribe((res:Response) => doSomething(res));\n     * ```\n     *\n     * \\@experimental\n     */\n    var Http = (function () {\n        /**\n         * @param {?} _backend\n         * @param {?} _defaultOptions\n         */\n        function Http(_backend, _defaultOptions) {\n            this._backend = _backend;\n            this._defaultOptions = _defaultOptions;\n        }\n        /**\n         * Performs any type of http request. First argument is required, and can either be a url or\n         * a {\\@link Request} instance. If the first argument is a url, an optional {\\@link RequestOptions}\n         * object can be provided as the 2nd argument. The options object will be merged with the values\n         * of {\\@link BaseRequestOptions} before performing the request.\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.request = function (url, options) {\n            var /** @type {?} */ responseObservable;\n            if (typeof url === 'string') {\n                responseObservable = httpRequest(this._backend, new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, /** @type {?} */ (url))));\n            }\n            else if (url instanceof Request) {\n                responseObservable = httpRequest(this._backend, url);\n            }\n            else {\n                throw new Error('First argument must be a url string or Request instance.');\n            }\n            return responseObservable;\n        };\n        /**\n         * Performs a request with `get` http method.\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.get = function (url, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, url)));\n        };\n        /**\n         * Performs a request with `post` http method.\n         * @param {?} url\n         * @param {?} body\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.post = function (url, body, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Post, url)));\n        };\n        /**\n         * Performs a request with `put` http method.\n         * @param {?} url\n         * @param {?} body\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.put = function (url, body, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Put, url)));\n        };\n        /**\n         * Performs a request with `delete` http method.\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.delete = function (url, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Delete, url)));\n        };\n        /**\n         * Performs a request with `patch` http method.\n         * @param {?} url\n         * @param {?} body\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.patch = function (url, body, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Patch, url)));\n        };\n        /**\n         * Performs a request with `head` http method.\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.head = function (url, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Head, url)));\n        };\n        /**\n         * Performs a request with `options` http method.\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Http.prototype.options = function (url, options) {\n            return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Options, url)));\n        };\n        Http.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        Http.ctorParameters = function () { return [\n            { type: ConnectionBackend, },\n            { type: RequestOptions, },\n        ]; };\n        return Http;\n    }());\n    /**\n     * \\@experimental\n     */\n    var Jsonp = (function (_super) {\n        __extends$4(Jsonp, _super);\n        /**\n         * @param {?} backend\n         * @param {?} defaultOptions\n         */\n        function Jsonp(backend, defaultOptions) {\n            _super.call(this, backend, defaultOptions);\n        }\n        /**\n         * Performs any type of http request. First argument is required, and can either be a url or\n         * a {\\@link Request} instance. If the first argument is a url, an optional {\\@link RequestOptions}\n         * object can be provided as the 2nd argument. The options object will be merged with the values\n         * of {\\@link BaseRequestOptions} before performing the request.\n         *\n         * \\@security Regular XHR is the safest alternative to JSONP for most applications, and is\n         * supported by all current browsers. Because JSONP creates a `<script>` element with\n         * contents retrieved from a remote source, attacker-controlled data introduced by an untrusted\n         * source could expose your application to XSS risks. Data exposed by JSONP may also be\n         * readable by malicious third-party websites. In addition, JSONP introduces potential risk for\n         * future security issues (e.g. content sniffing).  For more detail, see the\n         * [Security Guide](http://g.co/ng/security).\n         * @param {?} url\n         * @param {?=} options\n         * @return {?}\n         */\n        Jsonp.prototype.request = function (url, options) {\n            var /** @type {?} */ responseObservable;\n            if (typeof url === 'string') {\n                url =\n                    new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, /** @type {?} */ (url)));\n            }\n            if (url instanceof Request) {\n                if (url.method !== RequestMethod.Get) {\n                    throw new Error('JSONP requests must use GET request method.');\n                }\n                responseObservable = httpRequest(this._backend, url);\n            }\n            else {\n                throw new Error('First argument must be a url string or Request instance.');\n            }\n            return responseObservable;\n        };\n        Jsonp.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        Jsonp.ctorParameters = function () { return [\n            { type: ConnectionBackend, },\n            { type: RequestOptions, },\n        ]; };\n        return Jsonp;\n    }(Http));\n\n    /**\n     * @return {?}\n     */\n    function _createDefaultCookieXSRFStrategy() {\n        return new CookieXSRFStrategy();\n    }\n    /**\n     * @param {?} xhrBackend\n     * @param {?} requestOptions\n     * @return {?}\n     */\n    function httpFactory(xhrBackend, requestOptions) {\n        return new Http(xhrBackend, requestOptions);\n    }\n    /**\n     * @param {?} jsonpBackend\n     * @param {?} requestOptions\n     * @return {?}\n     */\n    function jsonpFactory(jsonpBackend, requestOptions) {\n        return new Jsonp(jsonpBackend, requestOptions);\n    }\n    /**\n     * The module that includes http's providers\n     *\n     * \\@experimental\n     */\n    var HttpModule = (function () {\n        function HttpModule() {\n        }\n        HttpModule.decorators = [\n            { type: _angular_core.NgModule, args: [{\n                        providers: [\n                            // TODO(pascal): use factory type annotations once supported in DI\n                            // issue: https://github.com/angular/angular/issues/3183\n                            { provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions] },\n                            BrowserXhr,\n                            { provide: RequestOptions, useClass: BaseRequestOptions },\n                            { provide: ResponseOptions, useClass: BaseResponseOptions },\n                            XHRBackend,\n                            { provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy },\n                        ],\n                    },] },\n        ];\n        /** @nocollapse */\n        HttpModule.ctorParameters = function () { return []; };\n        return HttpModule;\n    }());\n    /**\n     * The module that includes jsonp's providers\n     *\n     * \\@experimental\n     */\n    var JsonpModule = (function () {\n        function JsonpModule() {\n        }\n        JsonpModule.decorators = [\n            { type: _angular_core.NgModule, args: [{\n                        providers: [\n                            // TODO(pascal): use factory type annotations once supported in DI\n                            // issue: https://github.com/angular/angular/issues/3183\n                            { provide: Jsonp, useFactory: jsonpFactory, deps: [JSONPBackend, RequestOptions] },\n                            BrowserJsonp,\n                            { provide: RequestOptions, useClass: BaseRequestOptions },\n                            { provide: ResponseOptions, useClass: BaseResponseOptions },\n                            { provide: JSONPBackend, useClass: JSONPBackend_ },\n                        ],\n                    },] },\n        ];\n        /** @nocollapse */\n        JsonpModule.ctorParameters = function () { return []; };\n        return JsonpModule;\n    }());\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new _angular_core.Version('2.4.8');\n\n    exports.BrowserXhr = BrowserXhr;\n    exports.JSONPBackend = JSONPBackend;\n    exports.JSONPConnection = JSONPConnection;\n    exports.CookieXSRFStrategy = CookieXSRFStrategy;\n    exports.XHRBackend = XHRBackend;\n    exports.XHRConnection = XHRConnection;\n    exports.BaseRequestOptions = BaseRequestOptions;\n    exports.RequestOptions = RequestOptions;\n    exports.BaseResponseOptions = BaseResponseOptions;\n    exports.ResponseOptions = ResponseOptions;\n    exports.ReadyState = ReadyState;\n    exports.RequestMethod = RequestMethod;\n    exports.ResponseContentType = ResponseContentType;\n    exports.ResponseType = ResponseType;\n    exports.Headers = Headers;\n    exports.Http = Http;\n    exports.Jsonp = Jsonp;\n    exports.HttpModule = HttpModule;\n    exports.JsonpModule = JsonpModule;\n    exports.Connection = Connection;\n    exports.ConnectionBackend = ConnectionBackend;\n    exports.XSRFStrategy = XSRFStrategy;\n    exports.Request = Request;\n    exports.Response = Response;\n    exports.QueryEncoder = QueryEncoder;\n    exports.URLSearchParams = URLSearchParams;\n    exports.VERSION = VERSION;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/http/bundles/http.umd.js\n// module id = 65\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar EmptyObservable = (function (_super) {\n    __extends(EmptyObservable, _super);\n    function EmptyObservable(scheduler) {\n        _super.call(this);\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable that emits no items to the Observer and immediately\n     * emits a complete notification.\n     *\n     * <span class=\"informal\">Just emits 'complete', and nothing else.\n     * </span>\n     *\n     * <img src=\"./img/empty.png\" width=\"100%\">\n     *\n     * This static operator is useful for creating a simple Observable that only\n     * emits the complete notification. It can be used for composing with other\n     * Observables, such as in a {@link mergeMap}.\n     *\n     * @example <caption>Emit the number 7, then complete.</caption>\n     * var result = Rx.Observable.empty().startWith(7);\n     * result.subscribe(x => console.log(x));\n     *\n     * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>\n     * var interval = Rx.Observable.interval(1000);\n     * var result = interval.mergeMap(x =>\n     *   x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()\n     * );\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following to the console:\n     * // x is equal to the count on the interval eg(0,1,2,3,...)\n     * // x will occur every 1000ms\n     * // if x % 2 is equal to 1 print abc\n     * // if x % 2 is not equal to 1 nothing will be output\n     *\n     * @see {@link create}\n     * @see {@link never}\n     * @see {@link of}\n     * @see {@link throw}\n     *\n     * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n     * the emission of the complete notification.\n     * @return {Observable} An \"empty\" Observable: emits only the complete\n     * notification.\n     * @static true\n     * @name empty\n     * @owner Observable\n     */\n    EmptyObservable.create = function (scheduler) {\n        return new EmptyObservable(scheduler);\n    };\n    EmptyObservable.dispatch = function (arg) {\n        var subscriber = arg.subscriber;\n        subscriber.complete();\n    };\n    EmptyObservable.prototype._subscribe = function (subscriber) {\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });\n        }\n        else {\n            subscriber.complete();\n        }\n    };\n    return EmptyObservable;\n}(Observable_1.Observable));\nexports.EmptyObservable = EmptyObservable;\n//# sourceMappingURL=EmptyObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/EmptyObservable.js\n// module id = 75\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * <span class=\"informal\">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.</span>\n *\n * <img src=\"./img/map.png\" width=\"100%\">\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example <caption>Map every every click to the clientX position of that click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable<R>} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nfunction map(project, thisArg) {\n    if (typeof project !== 'function') {\n        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n    }\n    return this.lift(new MapOperator(project, thisArg));\n}\nexports.map = map;\nvar MapOperator = (function () {\n    function MapOperator(project, thisArg) {\n        this.project = project;\n        this.thisArg = thisArg;\n    }\n    MapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n    };\n    return MapOperator;\n}());\nexports.MapOperator = MapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MapSubscriber = (function (_super) {\n    __extends(MapSubscriber, _super);\n    function MapSubscriber(destination, project, thisArg) {\n        _super.call(this, destination);\n        this.project = project;\n        this.count = 0;\n        this.thisArg = thisArg || this;\n    }\n    // NOTE: This looks unoptimized, but it's actually purposefully NOT\n    // using try/catch optimizations.\n    MapSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.project.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return MapSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=map.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/map.js\n// module id = 76\n// module chunks = 2","\"use strict\";\nfunction isScheduler(value) {\n    return value && typeof value.schedule === 'function';\n}\nexports.isScheduler = isScheduler;\n//# sourceMappingURL=isScheduler.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isScheduler.js\n// module id = 77\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:disable:max-line-length */\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * <span class=\"informal\">Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.</span>\n *\n * <img src=\"./img/filter.png\" width=\"100%\">\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example <caption>Emit only click events whose target was a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nfunction filter(predicate, thisArg) {\n    return this.lift(new FilterOperator(predicate, thisArg));\n}\nexports.filter = filter;\nvar FilterOperator = (function () {\n    function FilterOperator(predicate, thisArg) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n    }\n    FilterOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n    };\n    return FilterOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FilterSubscriber = (function (_super) {\n    __extends(FilterSubscriber, _super);\n    function FilterSubscriber(destination, predicate, thisArg) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.count = 0;\n        this.predicate = predicate;\n    }\n    // the try catch block below is left specifically for\n    // optimization and perf reasons. a tryCatcher is not necessary here.\n    FilterSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.destination.next(value);\n        }\n    };\n    return FilterSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=filter.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/filter.js\n// module id = 102\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('./Observable');\n/**\n * Represents a push-based event or value that an {@link Observable} can emit.\n * This class is particularly useful for operators that manage notifications,\n * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and\n * others. Besides wrapping the actual delivered value, it also annotates it\n * with metadata of, for instance, what type of push message it is (`next`,\n * `error`, or `complete`).\n *\n * @see {@link materialize}\n * @see {@link dematerialize}\n * @see {@link observeOn}\n *\n * @class Notification<T>\n */\nvar Notification = (function () {\n    function Notification(kind, value, error) {\n        this.kind = kind;\n        this.value = value;\n        this.error = error;\n        this.hasValue = kind === 'N';\n    }\n    /**\n     * Delivers to the given `observer` the value wrapped by this Notification.\n     * @param {Observer} observer\n     * @return\n     */\n    Notification.prototype.observe = function (observer) {\n        switch (this.kind) {\n            case 'N':\n                return observer.next && observer.next(this.value);\n            case 'E':\n                return observer.error && observer.error(this.error);\n            case 'C':\n                return observer.complete && observer.complete();\n        }\n    };\n    /**\n     * Given some {@link Observer} callbacks, deliver the value represented by the\n     * current Notification to the correctly corresponding callback.\n     * @param {function(value: T): void} next An Observer `next` callback.\n     * @param {function(err: any): void} [error] An Observer `error` callback.\n     * @param {function(): void} [complete] An Observer `complete` callback.\n     * @return {any}\n     */\n    Notification.prototype.do = function (next, error, complete) {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return next && next(this.value);\n            case 'E':\n                return error && error(this.error);\n            case 'C':\n                return complete && complete();\n        }\n    };\n    /**\n     * Takes an Observer or its individual callback functions, and calls `observe`\n     * or `do` methods accordingly.\n     * @param {Observer|function(value: T): void} nextOrObserver An Observer or\n     * the `next` callback.\n     * @param {function(err: any): void} [error] An Observer `error` callback.\n     * @param {function(): void} [complete] An Observer `complete` callback.\n     * @return {any}\n     */\n    Notification.prototype.accept = function (nextOrObserver, error, complete) {\n        if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n            return this.observe(nextOrObserver);\n        }\n        else {\n            return this.do(nextOrObserver, error, complete);\n        }\n    };\n    /**\n     * Returns a simple Observable that just delivers the notification represented\n     * by this Notification instance.\n     * @return {any}\n     */\n    Notification.prototype.toObservable = function () {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return Observable_1.Observable.of(this.value);\n            case 'E':\n                return Observable_1.Observable.throw(this.error);\n            case 'C':\n                return Observable_1.Observable.empty();\n        }\n        throw new Error('unexpected notification kind value');\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `next` from a\n     * given value.\n     * @param {T} value The `next` value.\n     * @return {Notification<T>} The \"next\" Notification representing the\n     * argument.\n     */\n    Notification.createNext = function (value) {\n        if (typeof value !== 'undefined') {\n            return new Notification('N', value);\n        }\n        return this.undefinedValueNotification;\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `error` from a\n     * given error.\n     * @param {any} [err] The `error` error.\n     * @return {Notification<T>} The \"error\" Notification representing the\n     * argument.\n     */\n    Notification.createError = function (err) {\n        return new Notification('E', undefined, err);\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `complete`.\n     * @return {Notification<any>} The valueless \"complete\" Notification.\n     */\n    Notification.createComplete = function () {\n        return this.completeNotification;\n    };\n    Notification.completeNotification = new Notification('C');\n    Notification.undefinedValueNotification = new Notification('N', undefined);\n    return Notification;\n}());\nexports.Notification = Notification;\n//# sourceMappingURL=Notification.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Notification.js\n// module id = 118\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables.</span>\n *\n * <img src=\"./img/mergeAll.png\" width=\"100%\">\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var firstOrder = higherOrder.mergeAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));\n * var firstOrder = higherOrder.mergeAll(2);\n * firstOrder.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nfunction mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return this.lift(new MergeAllOperator(concurrent));\n}\nexports.mergeAll = mergeAll;\nvar MergeAllOperator = (function () {\n    function MergeAllOperator(concurrent) {\n        this.concurrent = concurrent;\n    }\n    MergeAllOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));\n    };\n    return MergeAllOperator;\n}());\nexports.MergeAllOperator = MergeAllOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeAllSubscriber = (function (_super) {\n    __extends(MergeAllSubscriber, _super);\n    function MergeAllSubscriber(destination, concurrent) {\n        _super.call(this, destination);\n        this.concurrent = concurrent;\n        this.hasCompleted = false;\n        this.buffer = [];\n        this.active = 0;\n    }\n    MergeAllSubscriber.prototype._next = function (observable) {\n        if (this.active < this.concurrent) {\n            this.active++;\n            this.add(subscribeToResult_1.subscribeToResult(this, observable));\n        }\n        else {\n            this.buffer.push(observable);\n        }\n    };\n    MergeAllSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n    };\n    MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeAllSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeAllSubscriber = MergeAllSubscriber;\n//# sourceMappingURL=mergeAll.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/mergeAll.js\n// module id = 119\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n * @see {@link Notification}\n *\n * @param scheduler\n * @param delay\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method observeOn\n * @owner Observable\n */\nfunction observeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return this.lift(new ObserveOnOperator(scheduler, delay));\n}\nexports.observeOn = observeOn;\nvar ObserveOnOperator = (function () {\n    function ObserveOnOperator(scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n    };\n    return ObserveOnOperator;\n}());\nexports.ObserveOnOperator = ObserveOnOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ObserveOnSubscriber = (function (_super) {\n    __extends(ObserveOnSubscriber, _super);\n    function ObserveOnSubscriber(destination, scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        _super.call(this, destination);\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnSubscriber.dispatch = function (arg) {\n        var notification = arg.notification, destination = arg.destination;\n        notification.observe(destination);\n    };\n    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n        this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n    };\n    ObserveOnSubscriber.prototype._next = function (value) {\n        this.scheduleMessage(Notification_1.Notification.createNext(value));\n    };\n    ObserveOnSubscriber.prototype._error = function (err) {\n        this.scheduleMessage(Notification_1.Notification.createError(err));\n    };\n    ObserveOnSubscriber.prototype._complete = function () {\n        this.scheduleMessage(Notification_1.Notification.createComplete());\n    };\n    return ObserveOnSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ObserveOnSubscriber = ObserveOnSubscriber;\nvar ObserveOnMessage = (function () {\n    function ObserveOnMessage(notification, destination) {\n        this.notification = notification;\n        this.destination = destination;\n    }\n    return ObserveOnMessage;\n}());\nexports.ObserveOnMessage = ObserveOnMessage;\n//# sourceMappingURL=observeOn.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/observeOn.js\n// module id = 120\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Action_1 = require('./Action');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AsyncAction = (function (_super) {\n    __extends(AsyncAction, _super);\n    function AsyncAction(scheduler, work) {\n        _super.call(this, scheduler, work);\n        this.scheduler = scheduler;\n        this.work = work;\n        this.pending = false;\n    }\n    AsyncAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (this.closed) {\n            return this;\n        }\n        // Always replace the current state with the new state.\n        this.state = state;\n        // Set the pending flag indicating that this action has been scheduled, or\n        // has recursively rescheduled itself.\n        this.pending = true;\n        var id = this.id;\n        var scheduler = this.scheduler;\n        //\n        // Important implementation note:\n        //\n        // Actions only execute once by default, unless rescheduled from within the\n        // scheduled callback. This allows us to implement single and repeat\n        // actions via the same code path, without adding API surface area, as well\n        // as mimic traditional recursion but across asynchronous boundaries.\n        //\n        // However, JS runtimes and timers distinguish between intervals achieved by\n        // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n        // serial `setTimeout` calls can be individually delayed, which delays\n        // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n        // guarantee the interval callback will be invoked more precisely to the\n        // interval period, regardless of load.\n        //\n        // Therefore, we use `setInterval` to schedule single and repeat actions.\n        // If the action reschedules itself with the same delay, the interval is not\n        // canceled. If the action doesn't reschedule, or reschedules with a\n        // different delay, the interval will be canceled after scheduled callback\n        // execution.\n        //\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, delay);\n        }\n        this.delay = delay;\n        // If this action has already an async Id, don't request a new one.\n        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n        return this;\n    };\n    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);\n    };\n    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        // If this action is rescheduled with the same delay time, don't clear the interval id.\n        if (delay !== null && this.delay === delay) {\n            return id;\n        }\n        // Otherwise, if the action's delay time is different from the current delay,\n        // clear the interval id\n        return root_1.root.clearInterval(id) && undefined || undefined;\n    };\n    /**\n     * Immediately executes this action and the `work` it contains.\n     * @return {any}\n     */\n    AsyncAction.prototype.execute = function (state, delay) {\n        if (this.closed) {\n            return new Error('executing a cancelled action');\n        }\n        this.pending = false;\n        var error = this._execute(state, delay);\n        if (error) {\n            return error;\n        }\n        else if (this.pending === false && this.id != null) {\n            // Dequeue if the action didn't reschedule itself. Don't call\n            // unsubscribe(), because the action could reschedule later.\n            // For example:\n            // ```\n            // scheduler.schedule(function doWork(counter) {\n            //   /* ... I'm a busy worker bee ... */\n            //   var originalAction = this;\n            //   /* wait 100ms before rescheduling the action */\n            //   setTimeout(function () {\n            //     originalAction.schedule(counter + 1);\n            //   }, 100);\n            // }, 1000);\n            // ```\n            this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n        }\n    };\n    AsyncAction.prototype._execute = function (state, delay) {\n        var errored = false;\n        var errorValue = undefined;\n        try {\n            this.work(state);\n        }\n        catch (e) {\n            errored = true;\n            errorValue = !!e && e || new Error(e);\n        }\n        if (errored) {\n            this.unsubscribe();\n            return errorValue;\n        }\n    };\n    AsyncAction.prototype._unsubscribe = function () {\n        var id = this.id;\n        var scheduler = this.scheduler;\n        var actions = scheduler.actions;\n        var index = actions.indexOf(this);\n        this.work = null;\n        this.delay = null;\n        this.state = null;\n        this.pending = false;\n        this.scheduler = null;\n        if (index !== -1) {\n            actions.splice(index, 1);\n        }\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, null);\n        }\n    };\n    return AsyncAction;\n}(Action_1.Action));\nexports.AsyncAction = AsyncAction;\n//# sourceMappingURL=AsyncAction.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/AsyncAction.js\n// module id = 121\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Scheduler_1 = require('../Scheduler');\nvar AsyncScheduler = (function (_super) {\n    __extends(AsyncScheduler, _super);\n    function AsyncScheduler() {\n        _super.apply(this, arguments);\n        this.actions = [];\n        /**\n         * A flag to indicate whether the Scheduler is currently executing a batch of\n         * queued actions.\n         * @type {boolean}\n         */\n        this.active = false;\n        /**\n         * An internal ID used to track the latest asynchronous task such as those\n         * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n         * others.\n         * @type {any}\n         */\n        this.scheduled = undefined;\n    }\n    AsyncScheduler.prototype.flush = function (action) {\n        var actions = this.actions;\n        if (this.active) {\n            actions.push(action);\n            return;\n        }\n        var error;\n        this.active = true;\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (action = actions.shift()); // exhaust the scheduler queue\n        this.active = false;\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsyncScheduler;\n}(Scheduler_1.Scheduler));\nexports.AsyncScheduler = AsyncScheduler;\n//# sourceMappingURL=AsyncScheduler.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/AsyncScheduler.js\n// module id = 122\n// module chunks = 2","\"use strict\";\nvar root_1 = require('../util/root');\nfunction symbolIteratorPonyfill(root) {\n    var Symbol = root.Symbol;\n    if (typeof Symbol === 'function') {\n        if (!Symbol.iterator) {\n            Symbol.iterator = Symbol('iterator polyfill');\n        }\n        return Symbol.iterator;\n    }\n    else {\n        // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC)\n        var Set_1 = root.Set;\n        if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') {\n            return '@@iterator';\n        }\n        var Map_1 = root.Map;\n        // required for compatability with es6-shim\n        if (Map_1) {\n            var keys = Object.getOwnPropertyNames(Map_1.prototype);\n            for (var i = 0; i < keys.length; ++i) {\n                var key = keys[i];\n                // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal.\n                if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) {\n                    return key;\n                }\n            }\n        }\n        return '@@iterator';\n    }\n}\nexports.symbolIteratorPonyfill = symbolIteratorPonyfill;\nexports.$$iterator = symbolIteratorPonyfill(root_1.root);\n//# sourceMappingURL=iterator.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/symbol/iterator.js\n// module id = 123\n// module chunks = 2","\"use strict\";\nvar root_1 = require('../util/root');\nfunction getSymbolObservable(context) {\n    var $$observable;\n    var Symbol = context.Symbol;\n    if (typeof Symbol === 'function') {\n        if (Symbol.observable) {\n            $$observable = Symbol.observable;\n        }\n        else {\n            $$observable = Symbol('observable');\n            Symbol.observable = $$observable;\n        }\n    }\n    else {\n        $$observable = '@@observable';\n    }\n    return $$observable;\n}\nexports.getSymbolObservable = getSymbolObservable;\nexports.$$observable = getSymbolObservable(root_1.root);\n//# sourceMappingURL=observable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/symbol/observable.js\n// module id = 124\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an Observable or a sequence was queried but has no\n * elements.\n *\n * @see {@link first}\n * @see {@link last}\n * @see {@link single}\n *\n * @class EmptyError\n */\nvar EmptyError = (function (_super) {\n    __extends(EmptyError, _super);\n    function EmptyError() {\n        var err = _super.call(this, 'no elements in sequence');\n        this.name = err.name = 'EmptyError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return EmptyError;\n}(Error));\nexports.EmptyError = EmptyError;\n//# sourceMappingURL=EmptyError.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/EmptyError.js\n// module id = 125\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n * If a comparator function is not provided, an equality check is used by default.\n * @param {function} [compare] optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} an Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nfunction distinctUntilChanged(compare, keySelector) {\n    return this.lift(new DistinctUntilChangedOperator(compare, keySelector));\n}\nexports.distinctUntilChanged = distinctUntilChanged;\nvar DistinctUntilChangedOperator = (function () {\n    function DistinctUntilChangedOperator(compare, keySelector) {\n        this.compare = compare;\n        this.keySelector = keySelector;\n    }\n    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n    };\n    return DistinctUntilChangedOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctUntilChangedSubscriber = (function (_super) {\n    __extends(DistinctUntilChangedSubscriber, _super);\n    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n        _super.call(this, destination);\n        this.keySelector = keySelector;\n        this.hasKey = false;\n        if (typeof compare === 'function') {\n            this.compare = compare;\n        }\n    }\n    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n        return x === y;\n    };\n    DistinctUntilChangedSubscriber.prototype._next = function (value) {\n        var keySelector = this.keySelector;\n        var key = value;\n        if (keySelector) {\n            key = tryCatch_1.tryCatch(this.keySelector)(value);\n            if (key === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        var result = false;\n        if (this.hasKey) {\n            result = tryCatch_1.tryCatch(this.compare)(this.key, key);\n            if (result === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        else {\n            this.hasKey = true;\n        }\n        if (Boolean(result) === false) {\n            this.key = key;\n            this.destination.next(value);\n        }\n    };\n    return DistinctUntilChangedSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=distinctUntilChanged.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/distinctUntilChanged.js\n// module id = 164\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:disable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns the\n * accumulated result when the source completes, given an optional seed value.\n *\n * <span class=\"informal\">Combines together all values emitted on the source,\n * using an accumulator function that knows how to join a new source value into\n * the accumulation from the past.</span>\n *\n * <img src=\"./img/reduce.png\" width=\"100%\">\n *\n * Like\n * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),\n * `reduce` applies an `accumulator` function against an accumulation and each\n * value of the source Observable (from the past) to reduce it to a single\n * value, emitted on the output Observable. Note that `reduce` will only emit\n * one value, only when the source Observable completes. It is equivalent to\n * applying operator {@link scan} followed by operator {@link last}.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events that happened in 5 seconds</caption>\n * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click')\n *   .takeUntil(Rx.Observable.interval(5000));\n * var ones = clicksInFiveSeconds.mapTo(1);\n * var seed = 0;\n * var count = ones.reduce((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link count}\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link scan}\n *\n * @param {function(acc: R, value: T): R} accumulator The accumulator function\n * called on each source value.\n * @param {R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @return {Observable<R>} An Observable that emits a single value that is the\n * result of accumulating the values emitted by the source Observable.\n * @method reduce\n * @owner Observable\n */\nfunction reduce(accumulator, seed) {\n    var hasSeed = false;\n    // providing a seed of `undefined` *should* be valid and trigger\n    // hasSeed! so don't use `seed !== undefined` checks!\n    // For this reason, we have to check it here at the original call site\n    // otherwise inside Operator/Subscriber we won't know if `undefined`\n    // means they didn't provide anything or if they literally provided `undefined`\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return this.lift(new ReduceOperator(accumulator, seed, hasSeed));\n}\nexports.reduce = reduce;\nvar ReduceOperator = (function () {\n    function ReduceOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) { hasSeed = false; }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ReduceOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ReduceSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ReduceOperator;\n}());\nexports.ReduceOperator = ReduceOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ReduceSubscriber = (function (_super) {\n    __extends(ReduceSubscriber, _super);\n    function ReduceSubscriber(destination, accumulator, seed, hasSeed) {\n        _super.call(this, destination);\n        this.accumulator = accumulator;\n        this.hasSeed = hasSeed;\n        this.hasValue = false;\n        this.acc = seed;\n    }\n    ReduceSubscriber.prototype._next = function (value) {\n        if (this.hasValue || (this.hasValue = this.hasSeed)) {\n            this._tryReduce(value);\n        }\n        else {\n            this.acc = value;\n            this.hasValue = true;\n        }\n    };\n    ReduceSubscriber.prototype._tryReduce = function (value) {\n        var result;\n        try {\n            result = this.accumulator(this.acc, value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.acc = result;\n    };\n    ReduceSubscriber.prototype._complete = function () {\n        if (this.hasValue || this.hasSeed) {\n            this.destination.next(this.acc);\n        }\n        this.destination.complete();\n    };\n    return ReduceSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ReduceSubscriber = ReduceSubscriber;\n//# sourceMappingURL=reduce.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/reduce.js\n// module id = 165\n// module chunks = 2","\"use strict\";\nvar QueueAction_1 = require('./QueueAction');\nvar QueueScheduler_1 = require('./QueueScheduler');\nexports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);\n//# sourceMappingURL=queue.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/queue.js\n// module id = 166\n// module chunks = 2","\"use strict\";\nvar root_1 = require('../util/root');\nvar Symbol = root_1.root.Symbol;\nexports.$$rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?\n    Symbol.for('rxSubscriber') : '@@rxSubscriber';\n//# sourceMappingURL=rxSubscriber.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/symbol/rxSubscriber.js\n// module id = 167\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an element was queried at a certain index of an\n * Observable, but no such index or position exists in that sequence.\n *\n * @see {@link elementAt}\n * @see {@link take}\n * @see {@link takeLast}\n *\n * @class ArgumentOutOfRangeError\n */\nvar ArgumentOutOfRangeError = (function (_super) {\n    __extends(ArgumentOutOfRangeError, _super);\n    function ArgumentOutOfRangeError() {\n        var err = _super.call(this, 'argument out of range');\n        this.name = err.name = 'ArgumentOutOfRangeError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return ArgumentOutOfRangeError;\n}(Error));\nexports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;\n//# sourceMappingURL=ArgumentOutOfRangeError.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/ArgumentOutOfRangeError.js\n// module id = 168\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nvar ObjectUnsubscribedError = (function (_super) {\n    __extends(ObjectUnsubscribedError, _super);\n    function ObjectUnsubscribedError() {\n        var err = _super.call(this, 'object unsubscribed');\n        this.name = err.name = 'ObjectUnsubscribedError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return ObjectUnsubscribedError;\n}(Error));\nexports.ObjectUnsubscribedError = ObjectUnsubscribedError;\n//# sourceMappingURL=ObjectUnsubscribedError.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/ObjectUnsubscribedError.js\n// module id = 169\n// module chunks = 2","\"use strict\";\nfunction isDate(value) {\n    return value instanceof Date && !isNaN(+value);\n}\nexports.isDate = isDate;\n//# sourceMappingURL=isDate.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isDate.js\n// module id = 170\n// module chunks = 2","/*!\n * jQuery JavaScript Library v2.1.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-04-28T16:01Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\n\nvar arr = [];\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"2.1.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\nvar data_priv = new Data();\n\nvar data_user = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\nvar strundefined = typeof undefined;\n\n\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/jquery/dist/jquery.js\n// module id = 221\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('./Subject');\nvar queue_1 = require('./scheduler/queue');\nvar Subscription_1 = require('./Subscription');\nvar observeOn_1 = require('./operator/observeOn');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\nvar SubjectSubscription_1 = require('./SubjectSubscription');\n/**\n * @class ReplaySubject<T>\n */\nvar ReplaySubject = (function (_super) {\n    __extends(ReplaySubject, _super);\n    function ReplaySubject(bufferSize, windowTime, scheduler) {\n        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n        _super.call(this);\n        this.scheduler = scheduler;\n        this._events = [];\n        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n        this._windowTime = windowTime < 1 ? 1 : windowTime;\n    }\n    ReplaySubject.prototype.next = function (value) {\n        var now = this._getNow();\n        this._events.push(new ReplayEvent(now, value));\n        this._trimBufferThenGetEvents();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        var _events = this._trimBufferThenGetEvents();\n        var scheduler = this.scheduler;\n        var subscription;\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n        }\n        if (scheduler) {\n            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));\n        }\n        var len = _events.length;\n        for (var i = 0; i < len && !subscriber.closed; i++) {\n            subscriber.next(_events[i].value);\n        }\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n        }\n        return subscription;\n    };\n    ReplaySubject.prototype._getNow = function () {\n        return (this.scheduler || queue_1.queue).now();\n    };\n    ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n        var now = this._getNow();\n        var _bufferSize = this._bufferSize;\n        var _windowTime = this._windowTime;\n        var _events = this._events;\n        var eventsCount = _events.length;\n        var spliceCount = 0;\n        // Trim events that fall out of the time window.\n        // Start at the front of the list. Break early once\n        // we encounter an event that falls within the window.\n        while (spliceCount < eventsCount) {\n            if ((now - _events[spliceCount].time) < _windowTime) {\n                break;\n            }\n            spliceCount++;\n        }\n        if (eventsCount > _bufferSize) {\n            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n        }\n        if (spliceCount > 0) {\n            _events.splice(0, spliceCount);\n        }\n        return _events;\n    };\n    return ReplaySubject;\n}(Subject_1.Subject));\nexports.ReplaySubject = ReplaySubject;\nvar ReplayEvent = (function () {\n    function ReplayEvent(time, value) {\n        this.time = time;\n        this.value = value;\n    }\n    return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/ReplaySubject.js\n// module id = 225\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar mergeMap_1 = require('../../operator/mergeMap');\nObservable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;\nObservable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;\n//# sourceMappingURL=mergeMap.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/mergeMap.js\n// module id = 226\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ScalarObservable = (function (_super) {\n    __extends(ScalarObservable, _super);\n    function ScalarObservable(value, scheduler) {\n        _super.call(this);\n        this.value = value;\n        this.scheduler = scheduler;\n        this._isScalar = true;\n        if (scheduler) {\n            this._isScalar = false;\n        }\n    }\n    ScalarObservable.create = function (value, scheduler) {\n        return new ScalarObservable(value, scheduler);\n    };\n    ScalarObservable.dispatch = function (state) {\n        var done = state.done, value = state.value, subscriber = state.subscriber;\n        if (done) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(value);\n        if (subscriber.closed) {\n            return;\n        }\n        state.done = true;\n        this.schedule(state);\n    };\n    ScalarObservable.prototype._subscribe = function (subscriber) {\n        var value = this.value;\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(ScalarObservable.dispatch, 0, {\n                done: false, value: value, subscriber: subscriber\n            });\n        }\n        else {\n            subscriber.next(value);\n            if (!subscriber.closed) {\n                subscriber.complete();\n            }\n        }\n    };\n    return ScalarObservable;\n}(Observable_1.Observable));\nexports.ScalarObservable = ScalarObservable;\n//# sourceMappingURL=ScalarObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/ScalarObservable.js\n// module id = 227\n// module chunks = 2","\"use strict\";\nvar PromiseObservable_1 = require('./PromiseObservable');\nexports.fromPromise = PromiseObservable_1.PromiseObservable.create;\n//# sourceMappingURL=fromPromise.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/fromPromise.js\n// module id = 228\n// module chunks = 2","\"use strict\";\nvar merge_1 = require('../operator/merge');\nexports.merge = merge_1.mergeStatic;\n//# sourceMappingURL=merge.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/merge.js\n// module id = 229\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar isArray_1 = require('../util/isArray');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar none = {};\n/* tslint:disable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {Observable} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0];\n    }\n    observables.unshift(this);\n    return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\nvar CombineLatestOperator = (function () {\n    function CombineLatestOperator(project) {\n        this.project = project;\n    }\n    CombineLatestOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));\n    };\n    return CombineLatestOperator;\n}());\nexports.CombineLatestOperator = CombineLatestOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CombineLatestSubscriber = (function (_super) {\n    __extends(CombineLatestSubscriber, _super);\n    function CombineLatestSubscriber(destination, project) {\n        _super.call(this, destination);\n        this.project = project;\n        this.active = 0;\n        this.values = [];\n        this.observables = [];\n    }\n    CombineLatestSubscriber.prototype._next = function (observable) {\n        this.values.push(none);\n        this.observables.push(observable);\n    };\n    CombineLatestSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            this.active = len;\n            this.toRespond = len;\n            for (var i = 0; i < len; i++) {\n                var observable = observables[i];\n                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n        if ((this.active -= 1) === 0) {\n            this.destination.complete();\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var values = this.values;\n        var oldVal = values[outerIndex];\n        var toRespond = !this.toRespond\n            ? 0\n            : oldVal === none ? --this.toRespond : this.toRespond;\n        values[outerIndex] = innerValue;\n        if (toRespond === 0) {\n            if (this.project) {\n                this._tryProject(values);\n            }\n            else {\n                this.destination.next(values.slice());\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype._tryProject = function (values) {\n        var result;\n        try {\n            result = this.project.apply(this, values);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return CombineLatestSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.CombineLatestSubscriber = CombineLatestSubscriber;\n//# sourceMappingURL=combineLatest.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/combineLatest.js\n// module id = 230\n// module chunks = 2","\"use strict\";\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar mergeAll_1 = require('./mergeAll');\nvar isScheduler_1 = require('../util/isScheduler');\n/* tslint:disable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (either the source or an\n * Observable given as argument), and simply forwards (without doing any\n * transformation) all the values from all the input Observables to the output\n * Observable. The output Observable only completes once all input Observables\n * have completed. Any error delivered by an input Observable will be immediately\n * emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = clicks.merge(timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = timer1.merge(timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {Observable} other An input Observable to merge with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @method merge\n * @owner Observable\n */\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));\n}\nexports.merge = merge;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = Rx.Observable.merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits it's max iteration, timer2 will\n * //   continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits it's max iteration it terminates, and\n * //   timer3 will continue to emit a value every 500ms until it is complete\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...Observable} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nfunction mergeStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var concurrent = Number.POSITIVE_INFINITY;\n    var scheduler = null;\n    var last = observables[observables.length - 1];\n    if (isScheduler_1.isScheduler(last)) {\n        scheduler = observables.pop();\n        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n            concurrent = observables.pop();\n        }\n    }\n    else if (typeof last === 'number') {\n        concurrent = observables.pop();\n    }\n    if (scheduler === null && observables.length === 1) {\n        return observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));\n}\nexports.mergeStatic = mergeStatic;\n//# sourceMappingURL=merge.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/merge.js\n// module id = 232\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.</span>\n *\n * <img src=\"./img/mergeMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n *   Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nfunction mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n        resultSelector = null;\n    }\n    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));\n}\nexports.mergeMap = mergeMap;\nvar MergeMapOperator = (function () {\n    function MergeMapOperator(project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n    }\n    MergeMapOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));\n    };\n    return MergeMapOperator;\n}());\nexports.MergeMapOperator = MergeMapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeMapSubscriber = (function (_super) {\n    __extends(MergeMapSubscriber, _super);\n    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        _super.call(this, destination);\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n        this.hasCompleted = false;\n        this.buffer = [];\n        this.active = 0;\n        this.index = 0;\n    }\n    MergeMapSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            this._tryNext(value);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeMapSubscriber.prototype._tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.active++;\n        this._innerSub(result, value, index);\n    };\n    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n    };\n    MergeMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n    };\n    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (this.resultSelector) {\n            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        else {\n            this.destination.next(innerValue);\n        }\n    };\n    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {\n        var result;\n        try {\n            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeMapSubscriber = MergeMapSubscriber;\n//# sourceMappingURL=mergeMap.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/mergeMap.js\n// module id = 233\n// module chunks = 2","\"use strict\";\nvar map_1 = require('./map');\n/**\n * Maps each source value (an object) to its specified nested property.\n *\n * <span class=\"informal\">Like {@link map}, but meant only for picking one of\n * the nested properties of every emitted object.</span>\n *\n * <img src=\"./img/pluck.png\" width=\"100%\">\n *\n * Given a list of strings describing a path to an object property, retrieves\n * the value of a specified nested property from all values in the source\n * Observable. If a property can't be resolved, it will return `undefined` for\n * that value.\n *\n * @example <caption>Map every every click to the tagName of the clicked target element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var tagNames = clicks.pluck('target', 'tagName');\n * tagNames.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {...string} properties The nested properties to pluck from each source\n * value (an object).\n * @return {Observable} Returns a new Observable of property values from the\n * source values.\n * @method pluck\n * @owner Observable\n */\nfunction pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i - 0] = arguments[_i];\n    }\n    var length = properties.length;\n    if (length === 0) {\n        throw new Error('list of properties cannot be empty.');\n    }\n    return map_1.map.call(this, plucker(properties, length));\n}\nexports.pluck = pluck;\nfunction plucker(props, length) {\n    var mapper = function (x) {\n        var currentProp = x;\n        for (var i = 0; i < length; i++) {\n            var p = currentProp[props[i]];\n            if (typeof p !== 'undefined') {\n                currentProp = p;\n            }\n            else {\n                return undefined;\n            }\n        }\n        return currentProp;\n    };\n    return mapper;\n}\n//# sourceMappingURL=pluck.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/pluck.js\n// module id = 234\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:disable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns each\n * intermediate result, with an optional seed value.\n *\n * <span class=\"informal\">It's like {@link reduce}, but emits the current\n * accumulation whenever the source emits a value.</span>\n *\n * <img src=\"./img/scan.png\" width=\"100%\">\n *\n * Combines together all values emitted on the source, using an accumulator\n * function that knows how to join a new source value into the accumulation from\n * the past. Is similar to {@link reduce}, but emits the intermediate\n * accumulations.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var ones = clicks.mapTo(1);\n * var seed = 0;\n * var count = ones.scan((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link reduce}\n *\n * @param {function(acc: R, value: T, index: number): R} accumulator\n * The accumulator function called on each source value.\n * @param {T|R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @method scan\n * @owner Observable\n */\nfunction scan(accumulator, seed) {\n    var hasSeed = false;\n    // providing a seed of `undefined` *should* be valid and trigger\n    // hasSeed! so don't use `seed !== undefined` checks!\n    // For this reason, we have to check it here at the original call site\n    // otherwise inside Operator/Subscriber we won't know if `undefined`\n    // means they didn't provide anything or if they literally provided `undefined`\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return this.lift(new ScanOperator(accumulator, seed, hasSeed));\n}\nexports.scan = scan;\nvar ScanOperator = (function () {\n    function ScanOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) { hasSeed = false; }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ScanOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ScanSubscriber = (function (_super) {\n    __extends(ScanSubscriber, _super);\n    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n        _super.call(this, destination);\n        this.accumulator = accumulator;\n        this._seed = _seed;\n        this.hasSeed = hasSeed;\n        this.index = 0;\n    }\n    Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n        get: function () {\n            return this._seed;\n        },\n        set: function (value) {\n            this.hasSeed = true;\n            this._seed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ScanSubscriber.prototype._next = function (value) {\n        if (!this.hasSeed) {\n            this.seed = value;\n            this.destination.next(value);\n        }\n        else {\n            return this._tryNext(value);\n        }\n    };\n    ScanSubscriber.prototype._tryNext = function (value) {\n        var index = this.index++;\n        var result;\n        try {\n            result = this.accumulator(this.seed, value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n        this.seed = result;\n        this.destination.next(result);\n    };\n    return ScanSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=scan.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/scan.js\n// module id = 235\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:disable:max-line-length */\n/**\n * Combines the source Observable with other Observables to create an Observable\n * whose values are calculated from the latest values of each, only when the\n * source emits.\n *\n * <span class=\"informal\">Whenever the source Observable emits a value, it\n * computes a formula using that value plus the latest values from other input\n * Observables, then emits the output of that formula.</span>\n *\n * <img src=\"./img/withLatestFrom.png\" width=\"100%\">\n *\n * `withLatestFrom` combines each value from the source Observable (the\n * instance) with the latest values from the other input Observables only when\n * the source emits a value, optionally using a `project` function to determine\n * the value to be emitted on the output Observable. All input Observables must\n * emit at least one value before the output Observable will emit a value.\n *\n * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var result = clicks.withLatestFrom(timer);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n *\n * @param {Observable} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Function} [project] Projection function for combining values\n * together. Receives all values in order of the Observables passed, where the\n * first parameter is a value from the source Observable. (e.g.\n * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not\n * passed, arrays will be emitted on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method withLatestFrom\n * @owner Observable\n */\nfunction withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i - 0] = arguments[_i];\n    }\n    var project;\n    if (typeof args[args.length - 1] === 'function') {\n        project = args.pop();\n    }\n    var observables = args;\n    return this.lift(new WithLatestFromOperator(observables, project));\n}\nexports.withLatestFrom = withLatestFrom;\nvar WithLatestFromOperator = (function () {\n    function WithLatestFromOperator(observables, project) {\n        this.observables = observables;\n        this.project = project;\n    }\n    WithLatestFromOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n    };\n    return WithLatestFromOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WithLatestFromSubscriber = (function (_super) {\n    __extends(WithLatestFromSubscriber, _super);\n    function WithLatestFromSubscriber(destination, observables, project) {\n        _super.call(this, destination);\n        this.observables = observables;\n        this.project = project;\n        this.toRespond = [];\n        var len = observables.length;\n        this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            this.toRespond.push(i);\n        }\n        for (var i = 0; i < len; i++) {\n            var observable = observables[i];\n            this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n        }\n    }\n    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        var toRespond = this.toRespond;\n        if (toRespond.length > 0) {\n            var found = toRespond.indexOf(outerIndex);\n            if (found !== -1) {\n                toRespond.splice(found, 1);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    WithLatestFromSubscriber.prototype._next = function (value) {\n        if (this.toRespond.length === 0) {\n            var args = [value].concat(this.values);\n            if (this.project) {\n                this._tryProject(args);\n            }\n            else {\n                this.destination.next(args);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return WithLatestFromSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=withLatestFrom.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/withLatestFrom.js\n// module id = 236\n// module chunks = 2","\"use strict\";\nfunction isFunction(x) {\n    return typeof x === 'function';\n}\nexports.isFunction = isFunction;\n//# sourceMappingURL=isFunction.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isFunction.js\n// module id = 238\n// module chunks = 2","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/compiler'), require('@angular/core'), require('@angular/platform-browser')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/compiler', '@angular/core', '@angular/platform-browser'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.platformBrowserDynamic = global.ng.platformBrowserDynamic || {}),global.ng.compiler,global.ng.core,global.ng.platformBrowser));\n}(this, function (exports,_angular_compiler,_angular_core,_angular_platformBrowser) { 'use strict';\n\n    var INTERNAL_BROWSER_PLATFORM_PROVIDERS = _angular_platformBrowser.__platform_browser_private__.INTERNAL_BROWSER_PLATFORM_PROVIDERS;\n\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var ResourceLoaderImpl = (function (_super) {\n        __extends(ResourceLoaderImpl, _super);\n        function ResourceLoaderImpl() {\n            _super.apply(this, arguments);\n        }\n        ResourceLoaderImpl.prototype.get = function (url) {\n            var resolve;\n            var reject;\n            var promise = new Promise(function (res, rej) {\n                resolve = res;\n                reject = rej;\n            });\n            var xhr = new XMLHttpRequest();\n            xhr.open('GET', url, true);\n            xhr.responseType = 'text';\n            xhr.onload = function () {\n                // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n                // response/responseType properties were introduced in ResourceLoader Level2 spec (supported\n                // by IE10)\n                var response = xhr.response || xhr.responseText;\n                // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n                var status = xhr.status === 1223 ? 204 : xhr.status;\n                // fix status code when it is 0 (0 status is undocumented).\n                // Occurs when accessing file resources or on Android 4.1 stock browser\n                // while retrieving files from application cache.\n                if (status === 0) {\n                    status = response ? 200 : 0;\n                }\n                if (200 <= status && status <= 300) {\n                    resolve(response);\n                }\n                else {\n                    reject(\"Failed to load \" + url);\n                }\n            };\n            xhr.onerror = function () { reject(\"Failed to load \" + url); };\n            xhr.send();\n            return promise;\n        };\n        ResourceLoaderImpl.decorators = [\n            { type: _angular_core.Injectable },\n        ];\n        /** @nocollapse */\n        ResourceLoaderImpl.ctorParameters = function () { return []; };\n        return ResourceLoaderImpl;\n    }(_angular_compiler.ResourceLoader));\n\n    var INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS = [\n        INTERNAL_BROWSER_PLATFORM_PROVIDERS,\n        {\n            provide: _angular_core.COMPILER_OPTIONS,\n            useValue: { providers: [{ provide: _angular_compiler.ResourceLoader, useClass: ResourceLoaderImpl }] },\n            multi: true\n        },\n    ];\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var globalScope;\n    if (typeof window === 'undefined') {\n        if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n            // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n            globalScope = self;\n        }\n        else {\n            globalScope = global;\n        }\n    }\n    else {\n        globalScope = window;\n    }\n    // Need to declare a new variable for global here since TypeScript\n    // exports the original value of the symbol.\n    var _global = globalScope;\n    // TODO: remove calls to assert in production environment\n    // Note: Can't just export this and import in in other files\n    // as `assert` is a reserved keyword in Dart\n    _global.assert = function assert(condition) {\n        // TODO: to be fixed properly via #2830, noop for now\n    };\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * An implementation of ResourceLoader that uses a template cache to avoid doing an actual\n     * ResourceLoader.\n     *\n     * The template cache needs to be built and loaded into window.$templateCache\n     * via a separate mechanism.\n     */\n    var CachedResourceLoader = (function (_super) {\n        __extends$1(CachedResourceLoader, _super);\n        function CachedResourceLoader() {\n            _super.call(this);\n            this._cache = _global.$templateCache;\n            if (this._cache == null) {\n                throw new Error('CachedResourceLoader: Template cache was not found in $templateCache.');\n            }\n        }\n        CachedResourceLoader.prototype.get = function (url) {\n            if (this._cache.hasOwnProperty(url)) {\n                return Promise.resolve(this._cache[url]);\n            }\n            else {\n                return Promise.reject('CachedResourceLoader: Did not find cached template for ' + url);\n            }\n        };\n        return CachedResourceLoader;\n    }(_angular_compiler.ResourceLoader));\n\n    var __platform_browser_dynamic_private__ = {\n        INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS: INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,\n        ResourceLoaderImpl: ResourceLoaderImpl\n    };\n\n    /**\n     * @stable\n     */\n    var VERSION = new _angular_core.Version('2.4.8');\n\n    /**\n     * @experimental\n     */\n    var RESOURCE_CACHE_PROVIDER = [{ provide: _angular_compiler.ResourceLoader, useClass: CachedResourceLoader }];\n    /**\n     * @stable\n     */\n    var platformBrowserDynamic = _angular_core.createPlatformFactory(_angular_compiler.platformCoreDynamic, 'browserDynamic', INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS);\n\n    exports.RESOURCE_CACHE_PROVIDER = RESOURCE_CACHE_PROVIDER;\n    exports.platformBrowserDynamic = platformBrowserDynamic;\n    exports.VERSION = VERSION;\n    exports.__platform_browser_dynamic_private__ = __platform_browser_dynamic_private__;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js\n// module id = 240\n// module chunks = 2","\"use strict\";\nexports.empty = {\n    closed: true,\n    next: function (value) { },\n    error: function (err) { throw err; },\n    complete: function () { }\n};\n//# sourceMappingURL=Observer.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Observer.js\n// module id = 528\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('./Subscription');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SubjectSubscription = (function (_super) {\n    __extends(SubjectSubscription, _super);\n    function SubjectSubscription(subject, subscriber) {\n        _super.call(this);\n        this.subject = subject;\n        this.subscriber = subscriber;\n        this.closed = false;\n    }\n    SubjectSubscription.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.closed = true;\n        var subject = this.subject;\n        var observers = subject.observers;\n        this.subject = null;\n        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n            return;\n        }\n        var subscriberIndex = observers.indexOf(this.subscriber);\n        if (subscriberIndex !== -1) {\n            observers.splice(subscriberIndex, 1);\n        }\n    };\n    return SubjectSubscription;\n}(Subscription_1.Subscription));\nexports.SubjectSubscription = SubjectSubscription;\n//# sourceMappingURL=SubjectSubscription.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/SubjectSubscription.js\n// module id = 529\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar combineLatest_1 = require('../../observable/combineLatest');\nObservable_1.Observable.combineLatest = combineLatest_1.combineLatest;\n//# sourceMappingURL=combineLatest.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/observable/combineLatest.js\n// module id = 530\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../../Observable');\nvar webSocket_1 = require('../../../observable/dom/webSocket');\nObservable_1.Observable.webSocket = webSocket_1.webSocket;\n//# sourceMappingURL=webSocket.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/observable/dom/webSocket.js\n// module id = 531\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar empty_1 = require('../../observable/empty');\nObservable_1.Observable.empty = empty_1.empty;\n//# sourceMappingURL=empty.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/observable/empty.js\n// module id = 532\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar merge_1 = require('../../observable/merge');\nObservable_1.Observable.merge = merge_1.merge;\n//# sourceMappingURL=merge.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/observable/merge.js\n// module id = 534\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar of_1 = require('../../observable/of');\nObservable_1.Observable.of = of_1.of;\n//# sourceMappingURL=of.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/observable/of.js\n// module id = 535\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar catch_1 = require('../../operator/catch');\nObservable_1.Observable.prototype.catch = catch_1._catch;\nObservable_1.Observable.prototype._catch = catch_1._catch;\n//# sourceMappingURL=catch.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/catch.js\n// module id = 536\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar combineLatest_1 = require('../../operator/combineLatest');\nObservable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;\n//# sourceMappingURL=combineLatest.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/combineLatest.js\n// module id = 537\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar delay_1 = require('../../operator/delay');\nObservable_1.Observable.prototype.delay = delay_1.delay;\n//# sourceMappingURL=delay.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/delay.js\n// module id = 538\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar filter_1 = require('../../operator/filter');\nObservable_1.Observable.prototype.filter = filter_1.filter;\n//# sourceMappingURL=filter.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/filter.js\n// module id = 539\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar find_1 = require('../../operator/find');\nObservable_1.Observable.prototype.find = find_1.find;\n//# sourceMappingURL=find.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/find.js\n// module id = 540\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar map_1 = require('../../operator/map');\nObservable_1.Observable.prototype.map = map_1.map;\n//# sourceMappingURL=map.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/map.js\n// module id = 541\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar pluck_1 = require('../../operator/pluck');\nObservable_1.Observable.prototype.pluck = pluck_1.pluck;\n//# sourceMappingURL=pluck.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/pluck.js\n// module id = 542\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar retryWhen_1 = require('../../operator/retryWhen');\nObservable_1.Observable.prototype.retryWhen = retryWhen_1.retryWhen;\n//# sourceMappingURL=retryWhen.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/retryWhen.js\n// module id = 543\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar take_1 = require('../../operator/take');\nObservable_1.Observable.prototype.take = take_1.take;\n//# sourceMappingURL=take.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/take.js\n// module id = 544\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar takeUntil_1 = require('../../operator/takeUntil');\nObservable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;\n//# sourceMappingURL=takeUntil.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/takeUntil.js\n// module id = 545\n// module chunks = 2","\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar withLatestFrom_1 = require('../../operator/withLatestFrom');\nObservable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;\n//# sourceMappingURL=withLatestFrom.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/add/operator/withLatestFrom.js\n// module id = 546\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isArray_1 = require('../util/isArray');\nvar isPromise_1 = require('../util/isPromise');\nvar PromiseObservable_1 = require('./PromiseObservable');\nvar IteratorObservable_1 = require('./IteratorObservable');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar ArrayLikeObservable_1 = require('./ArrayLikeObservable');\nvar iterator_1 = require('../symbol/iterator');\nvar Observable_1 = require('../Observable');\nvar observeOn_1 = require('../operator/observeOn');\nvar observable_1 = require('../symbol/observable');\nvar isArrayLike = (function (x) { return x && typeof x.length === 'number'; });\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromObservable = (function (_super) {\n    __extends(FromObservable, _super);\n    function FromObservable(ish, scheduler) {\n        _super.call(this, null);\n        this.ish = ish;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable from an Array, an array-like object, a Promise, an\n     * iterable object, or an Observable-like object.\n     *\n     * <span class=\"informal\">Converts almost anything to an Observable.</span>\n     *\n     * <img src=\"./img/from.png\" width=\"100%\">\n     *\n     * Convert various other objects and data types into Observables. `from`\n     * converts a Promise or an array-like or an\n     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)\n     * object into an Observable that emits the items in that promise or array or\n     * iterable. A String, in this context, is treated as an array of characters.\n     * Observable-like objects (contains a function named with the ES2015 Symbol\n     * for Observable) can also be converted through this operator.\n     *\n     * @example <caption>Converts an array to an Observable</caption>\n     * var array = [10, 20, 30];\n     * var result = Rx.Observable.from(array);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 10 20 30\n     *\n     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>\n     * function* generateDoubles(seed) {\n     *   var i = seed;\n     *   while (true) {\n     *     yield i;\n     *     i = 2 * i; // double it\n     *   }\n     * }\n     *\n     * var iterator = generateDoubles(3);\n     * var result = Rx.Observable.from(iterator).take(10);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 3 6 12 24 48 96 192 384 768 1536\n     *\n     * @see {@link create}\n     * @see {@link fromEvent}\n     * @see {@link fromEventPattern}\n     * @see {@link fromPromise}\n     *\n     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an\n     * Observable-like, an Array, an iterable or an array-like object to be\n     * converted.\n     * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n     * emissions of values.\n     * @return {Observable<T>} The Observable whose values are originally from the\n     * input object that was converted.\n     * @static true\n     * @name from\n     * @owner Observable\n     */\n    FromObservable.create = function (ish, scheduler) {\n        if (ish != null) {\n            if (typeof ish[observable_1.$$observable] === 'function') {\n                if (ish instanceof Observable_1.Observable && !scheduler) {\n                    return ish;\n                }\n                return new FromObservable(ish, scheduler);\n            }\n            else if (isArray_1.isArray(ish)) {\n                return new ArrayObservable_1.ArrayObservable(ish, scheduler);\n            }\n            else if (isPromise_1.isPromise(ish)) {\n                return new PromiseObservable_1.PromiseObservable(ish, scheduler);\n            }\n            else if (typeof ish[iterator_1.$$iterator] === 'function' || typeof ish === 'string') {\n                return new IteratorObservable_1.IteratorObservable(ish, scheduler);\n            }\n            else if (isArrayLike(ish)) {\n                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);\n            }\n        }\n        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');\n    };\n    FromObservable.prototype._subscribe = function (subscriber) {\n        var ish = this.ish;\n        var scheduler = this.scheduler;\n        if (scheduler == null) {\n            return ish[observable_1.$$observable]().subscribe(subscriber);\n        }\n        else {\n            return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));\n        }\n    };\n    return FromObservable;\n}(Observable_1.Observable));\nexports.FromObservable = FromObservable;\n//# sourceMappingURL=FromObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/FromObservable.js\n// module id = 548\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar PromiseObservable = (function (_super) {\n    __extends(PromiseObservable, _super);\n    function PromiseObservable(promise, scheduler) {\n        _super.call(this);\n        this.promise = promise;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Converts a Promise to an Observable.\n     *\n     * <span class=\"informal\">Returns an Observable that just emits the Promise's\n     * resolved value, then completes.</span>\n     *\n     * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an\n     * Observable. If the Promise resolves with a value, the output Observable\n     * emits that resolved value as a `next`, and then completes. If the Promise\n     * is rejected, then the output Observable emits the corresponding Error.\n     *\n     * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>\n     * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));\n     * result.subscribe(x => console.log(x), e => console.error(e));\n     *\n     * @see {@link bindCallback}\n     * @see {@link from}\n     *\n     * @param {Promise<T>} promise The promise to be converted.\n     * @param {Scheduler} [scheduler] An optional Scheduler to use for scheduling\n     * the delivery of the resolved value (or the rejection).\n     * @return {Observable<T>} An Observable which wraps the Promise.\n     * @static true\n     * @name fromPromise\n     * @owner Observable\n     */\n    PromiseObservable.create = function (promise, scheduler) {\n        return new PromiseObservable(promise, scheduler);\n    };\n    PromiseObservable.prototype._subscribe = function (subscriber) {\n        var _this = this;\n        var promise = this.promise;\n        var scheduler = this.scheduler;\n        if (scheduler == null) {\n            if (this._isScalar) {\n                if (!subscriber.closed) {\n                    subscriber.next(this.value);\n                    subscriber.complete();\n                }\n            }\n            else {\n                promise.then(function (value) {\n                    _this.value = value;\n                    _this._isScalar = true;\n                    if (!subscriber.closed) {\n                        subscriber.next(value);\n                        subscriber.complete();\n                    }\n                }, function (err) {\n                    if (!subscriber.closed) {\n                        subscriber.error(err);\n                    }\n                })\n                    .then(null, function (err) {\n                    // escape the promise trap, throw unhandled errors\n                    root_1.root.setTimeout(function () { throw err; });\n                });\n            }\n        }\n        else {\n            if (this._isScalar) {\n                if (!subscriber.closed) {\n                    return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });\n                }\n            }\n            else {\n                promise.then(function (value) {\n                    _this.value = value;\n                    _this._isScalar = true;\n                    if (!subscriber.closed) {\n                        subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));\n                    }\n                }, function (err) {\n                    if (!subscriber.closed) {\n                        subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));\n                    }\n                })\n                    .then(null, function (err) {\n                    // escape the promise trap, throw unhandled errors\n                    root_1.root.setTimeout(function () { throw err; });\n                });\n            }\n        }\n    };\n    return PromiseObservable;\n}(Observable_1.Observable));\nexports.PromiseObservable = PromiseObservable;\nfunction dispatchNext(arg) {\n    var value = arg.value, subscriber = arg.subscriber;\n    if (!subscriber.closed) {\n        subscriber.next(value);\n        subscriber.complete();\n    }\n}\nfunction dispatchError(arg) {\n    var err = arg.err, subscriber = arg.subscriber;\n    if (!subscriber.closed) {\n        subscriber.error(err);\n    }\n}\n//# sourceMappingURL=PromiseObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/PromiseObservable.js\n// module id = 549\n// module chunks = 2","\"use strict\";\nvar EmptyObservable_1 = require('./EmptyObservable');\nexports.empty = EmptyObservable_1.EmptyObservable.create;\n//# sourceMappingURL=empty.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/empty.js\n// module id = 551\n// module chunks = 2","\"use strict\";\nvar FromObservable_1 = require('./FromObservable');\nexports.from = FromObservable_1.FromObservable.create;\n//# sourceMappingURL=from.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/from.js\n// module id = 552\n// module chunks = 2","\"use strict\";\nvar ArrayObservable_1 = require('./ArrayObservable');\nexports.of = ArrayObservable_1.ArrayObservable.of;\n//# sourceMappingURL=of.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/of.js\n// module id = 553\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n *  is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n *  is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} an observable that originates from either the source or the observable returned by the\n *  catch `selector` function.\n * @method catch\n * @name catch\n * @owner Observable\n */\nfunction _catch(selector) {\n    var operator = new CatchOperator(selector);\n    var caught = this.lift(operator);\n    return (operator.caught = caught);\n}\nexports._catch = _catch;\nvar CatchOperator = (function () {\n    function CatchOperator(selector) {\n        this.selector = selector;\n    }\n    CatchOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n    };\n    return CatchOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CatchSubscriber = (function (_super) {\n    __extends(CatchSubscriber, _super);\n    function CatchSubscriber(destination, selector, caught) {\n        _super.call(this, destination);\n        this.selector = selector;\n        this.caught = caught;\n    }\n    // NOTE: overriding `error` instead of `_error` because we don't want\n    // to have this flag this subscriber as `isStopped`.\n    CatchSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var result = void 0;\n            try {\n                result = this.selector(err, this.caught);\n            }\n            catch (err) {\n                this.destination.error(err);\n                return;\n            }\n            this.unsubscribe();\n            this.destination.remove(this);\n            subscribeToResult_1.subscribeToResult(this, result);\n        }\n    };\n    return CatchSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=catch.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/catch.js\n// module id = 554\n// module chunks = 2","\"use strict\";\nvar mergeAll_1 = require('./mergeAll');\n/* tslint:disable:max-line-length */\n/**\n * Converts a higher-order Observable into a first-order Observable by\n * concatenating the inner Observables in order.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by putting one\n * inner Observable after the other.</span>\n *\n * <img src=\"./img/concatAll.png\" width=\"100%\">\n *\n * Joins every Observable emitted by the source (a higher-order Observable), in\n * a serial fashion. It subscribes to each inner Observable only after the\n * previous inner Observable has completed, and merges all of their values into\n * the returned observable.\n *\n * __Warning:__ If the source Observable emits Observables quickly and\n * endlessly, and the inner Observables it emits generally complete slower than\n * the source emits, you can run into memory issues as the incoming Observables\n * collect in an unbounded buffer.\n *\n * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set\n * to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4));\n * var firstOrder = higherOrder.concatAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link combineAll}\n * @see {@link concat}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n * @see {@link exhaust}\n * @see {@link mergeAll}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @return {Observable} An Observable emitting values from all the inner\n * Observables concatenated.\n * @method concatAll\n * @owner Observable\n */\nfunction concatAll() {\n    return this.lift(new mergeAll_1.MergeAllOperator(1));\n}\nexports.concatAll = concatAll;\n//# sourceMappingURL=concatAll.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/concatAll.js\n// module id = 555\n// module chunks = 2","\"use strict\";\nvar mergeMap_1 = require('./mergeMap');\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, in a serialized fashion waiting for each one to complete before\n * merging the next.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link concatAll}.</span>\n *\n * <img src=\"./img/concatMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each new inner Observable is\n * concatenated with the previous inner Observable.\n *\n * __Warning:__ if source values arrive endlessly and faster than their\n * corresponding inner Observables can complete, it will result in memory issues\n * as inner Observables amass in an unbounded buffer waiting for their turn to\n * be subscribed to.\n *\n * Note: `concatMap` is equivalent to `mergeMap` with concurrency parameter set\n * to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.concatMap(ev => Rx.Observable.interval(1000).take(4));\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link concat}\n * @see {@link concatAll}\n * @see {@link concatMapTo}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} an observable of values merged from the projected\n * Observables as they were subscribed to, one at a time. Optionally, these\n * values may have been projected from a passed `projectResult` argument.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking values from each projected inner\n * Observable sequentially.\n * @method concatMap\n * @owner Observable\n */\nfunction concatMap(project, resultSelector) {\n    return this.lift(new mergeMap_1.MergeMapOperator(project, resultSelector, 1));\n}\nexports.concatMap = concatMap;\n//# sourceMappingURL=concatMap.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/concatMap.js\n// module id = 556\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.\n * @param {function} predicate a function for determining if an item meets a specified condition.\n * @param {any} [thisArg] optional object to use for `this` in the callback\n * @return {Observable} an Observable of booleans that determines if all items of the source Observable meet the condition specified.\n * @method every\n * @owner Observable\n */\nfunction every(predicate, thisArg) {\n    return this.lift(new EveryOperator(predicate, thisArg, this));\n}\nexports.every = every;\nvar EveryOperator = (function () {\n    function EveryOperator(predicate, thisArg, source) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.source = source;\n    }\n    EveryOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));\n    };\n    return EveryOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar EverySubscriber = (function (_super) {\n    __extends(EverySubscriber, _super);\n    function EverySubscriber(destination, predicate, thisArg, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.source = source;\n        this.index = 0;\n        this.thisArg = thisArg || this;\n    }\n    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {\n        this.destination.next(everyValueMatch);\n        this.destination.complete();\n    };\n    EverySubscriber.prototype._next = function (value) {\n        var result = false;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.index++, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (!result) {\n            this.notifyComplete(false);\n        }\n    };\n    EverySubscriber.prototype._complete = function () {\n        this.notifyComplete(true);\n    };\n    return EverySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=every.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/every.js\n// module id = 557\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:disable:max-line-length */\n/**\n * Emits only the first value emitted by the source Observable that meets some\n * condition.\n *\n * <span class=\"informal\">Finds the first value that passes some test and emits\n * that.</span>\n *\n * <img src=\"./img/find.png\" width=\"100%\">\n *\n * `find` searches for the first item in the source Observable that matches the\n * specified condition embodied by the `predicate`, and returns the first\n * occurrence in the source. Unlike {@link first}, the `predicate` is required\n * in `find`, and does not emit an error if a valid value is not found.\n *\n * @example <caption>Find and emit the first click that happens on a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.find(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link first}\n * @see {@link findIndex}\n * @see {@link take}\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate\n * A function called with each item to test for condition matching.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable<T>} An Observable of the first item that matches the\n * condition.\n * @method find\n * @owner Observable\n */\nfunction find(predicate, thisArg) {\n    if (typeof predicate !== 'function') {\n        throw new TypeError('predicate is not a function');\n    }\n    return this.lift(new FindValueOperator(predicate, this, false, thisArg));\n}\nexports.find = find;\nvar FindValueOperator = (function () {\n    function FindValueOperator(predicate, source, yieldIndex, thisArg) {\n        this.predicate = predicate;\n        this.source = source;\n        this.yieldIndex = yieldIndex;\n        this.thisArg = thisArg;\n    }\n    FindValueOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));\n    };\n    return FindValueOperator;\n}());\nexports.FindValueOperator = FindValueOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FindValueSubscriber = (function (_super) {\n    __extends(FindValueSubscriber, _super);\n    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.source = source;\n        this.yieldIndex = yieldIndex;\n        this.thisArg = thisArg;\n        this.index = 0;\n    }\n    FindValueSubscriber.prototype.notifyComplete = function (value) {\n        var destination = this.destination;\n        destination.next(value);\n        destination.complete();\n    };\n    FindValueSubscriber.prototype._next = function (value) {\n        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;\n        var index = this.index++;\n        try {\n            var result = predicate.call(thisArg || this, value, index, this.source);\n            if (result) {\n                this.notifyComplete(this.yieldIndex ? index : value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    FindValueSubscriber.prototype._complete = function () {\n        this.notifyComplete(this.yieldIndex ? -1 : undefined);\n    };\n    return FindValueSubscriber;\n}(Subscriber_1.Subscriber));\nexports.FindValueSubscriber = FindValueSubscriber;\n//# sourceMappingURL=find.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/find.js\n// module id = 558\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/**\n * Emits only the first value (or the first value that meets some condition)\n * emitted by the source Observable.\n *\n * <span class=\"informal\">Emits only the first value. Or emits only the first\n * value that passes some test.</span>\n *\n * <img src=\"./img/first.png\" width=\"100%\">\n *\n * If called with no arguments, `first` emits the first value of the source\n * Observable, then completes. If called with a `predicate` function, `first`\n * emits the first value of the source that matches the specified condition. It\n * may also take a `resultSelector` function to produce the output value from\n * the input value, and a `defaultValue` to emit in case the source completes\n * before it is able to emit a valid value. Throws an error if `defaultValue`\n * was not provided and a matching element is not found.\n *\n * @example <caption>Emit only the first click that happens on the DOM</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Emits the first click that happens on a DIV</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link take}\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]\n * An optional function called with each item to test for condition matching.\n * @param {function(value: T, index: number): R} [resultSelector] A function to\n * produce the value on the output Observable based on the values\n * and the indices of the source Observable. The arguments passed to this\n * function are:\n * - `value`: the value that was emitted on the source.\n * - `index`: the \"index\" of the value from the source.\n * @param {R} [defaultValue] The default value emitted in case no valid value\n * was found on the source.\n * @return {Observable<T|R>} an Observable of the first item that matches the\n * condition.\n * @method first\n * @owner Observable\n */\nfunction first(predicate, resultSelector, defaultValue) {\n    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.first = first;\nvar FirstOperator = (function () {\n    function FirstOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    FirstOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return FirstOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FirstSubscriber = (function (_super) {\n    __extends(FirstSubscriber, _super);\n    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.index = 0;\n        this.hasCompleted = false;\n        this._emitted = false;\n    }\n    FirstSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._emit = function (value, index) {\n        if (this.resultSelector) {\n            this._tryResultSelector(value, index);\n            return;\n        }\n        this._emitFinal(value);\n    };\n    FirstSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this._emitFinal(result);\n    };\n    FirstSubscriber.prototype._emitFinal = function (value) {\n        var destination = this.destination;\n        if (!this._emitted) {\n            this._emitted = true;\n            destination.next(value);\n            destination.complete();\n            this.hasCompleted = true;\n        }\n    };\n    FirstSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {\n            destination.next(this.defaultValue);\n            destination.complete();\n        }\n        else if (!this.hasCompleted) {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return FirstSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=first.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/first.js\n// module id = 559\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits only the last item emitted by the source Observable.\n * It optionally takes a predicate function as a parameter, in which case, rather than emitting\n * the last item from the source Observable, the resulting Observable will emit the last item\n * from the source Observable that satisfies the predicate.\n *\n * <img src=\"./img/last.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {function} predicate - the condition any source emitted item has to satisfy.\n * @return {Observable} an Observable that emits only the last item satisfying the given condition\n * from the source, or an NoSuchElementException if no such items are emitted.\n * @throws - Throws if no items that match the predicate are emitted by the source Observable.\n * @method last\n * @owner Observable\n */\nfunction last(predicate, resultSelector, defaultValue) {\n    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.last = last;\nvar LastOperator = (function () {\n    function LastOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    LastOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return LastOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar LastSubscriber = (function (_super) {\n    __extends(LastSubscriber, _super);\n    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.hasValue = false;\n        this.index = 0;\n        if (typeof defaultValue !== 'undefined') {\n            this.lastValue = defaultValue;\n            this.hasValue = true;\n        }\n    }\n    LastSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.lastValue = result;\n        this.hasValue = true;\n    };\n    LastSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (this.hasValue) {\n            destination.next(this.lastValue);\n            destination.complete();\n        }\n        else {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return LastSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=last.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/last.js\n// module id = 561\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Emits the values emitted by the source Observable until a `notifier`\n * Observable emits a value.\n *\n * <span class=\"informal\">Lets values pass until a second Observable,\n * `notifier`, emits something. Then, it completes.</span>\n *\n * <img src=\"./img/takeUntil.png\" width=\"100%\">\n *\n * `takeUntil` subscribes and begins mirroring the source Observable. It also\n * monitors a second Observable, `notifier` that you provide. If the `notifier`\n * emits a value or a complete notification, the output Observable stops\n * mirroring the source Observable and completes.\n *\n * @example <caption>Tick every second until the first click happens</caption>\n * var interval = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = interval.takeUntil(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @param {Observable} notifier The Observable whose first emitted value will\n * cause the output Observable of `takeUntil` to stop emitting values from the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable until such time as `notifier` emits its first value.\n * @method takeUntil\n * @owner Observable\n */\nfunction takeUntil(notifier) {\n    return this.lift(new TakeUntilOperator(notifier));\n}\nexports.takeUntil = takeUntil;\nvar TakeUntilOperator = (function () {\n    function TakeUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    TakeUntilOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));\n    };\n    return TakeUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeUntilSubscriber = (function (_super) {\n    __extends(TakeUntilSubscriber, _super);\n    function TakeUntilSubscriber(destination, notifier) {\n        _super.call(this, destination);\n        this.notifier = notifier;\n        this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n    }\n    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.complete();\n    };\n    TakeUntilSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    return TakeUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=takeUntil.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/takeUntil.js\n// module id = 569\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nvar UnsubscriptionError = (function (_super) {\n    __extends(UnsubscriptionError, _super);\n    function UnsubscriptionError(errors) {\n        _super.call(this);\n        this.errors = errors;\n        var err = Error.call(this, errors ?\n            errors.length + \" errors occurred during unsubscription:\\n  \" + errors.map(function (err, i) { return ((i + 1) + \") \" + err.toString()); }).join('\\n  ') : '');\n        this.name = err.name = 'UnsubscriptionError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return UnsubscriptionError;\n}(Error));\nexports.UnsubscriptionError = UnsubscriptionError;\n//# sourceMappingURL=UnsubscriptionError.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/UnsubscriptionError.js\n// module id = 578\n// module chunks = 2","\"use strict\";\nfunction isObject(x) {\n    return x != null && typeof x === 'object';\n}\nexports.isObject = isObject;\n//# sourceMappingURL=isObject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isObject.js\n// module id = 580\n// module chunks = 2","\"use strict\";\nfunction isPromise(value) {\n    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';\n}\nexports.isPromise = isPromise;\n//# sourceMappingURL=isPromise.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/isPromise.js\n// module id = 581\n// module chunks = 2","/**\n * @license Angular v2.4.8\n * (c) 2010-2017 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :\n    typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :\n    (factory((global.ng = global.ng || {}, global.ng.compiler = global.ng.compiler || {}),global.ng.core));\n}(this, function (exports,_angular_core) { 'use strict';\n\n    /**\n     * @stable\n     */\n    var /** @type {?} */ VERSION = new _angular_core.Version('2.4.8');\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * A segment of text within the template.\n     */\n    var TextAst = (function () {\n        /**\n         * @param {?} value\n         * @param {?} ngContentIndex\n         * @param {?} sourceSpan\n         */\n        function TextAst(value, ngContentIndex, sourceSpan) {\n            this.value = value;\n            this.ngContentIndex = ngContentIndex;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n        return TextAst;\n    }());\n    /**\n     * A bound expression within the text of a template.\n     */\n    var BoundTextAst = (function () {\n        /**\n         * @param {?} value\n         * @param {?} ngContentIndex\n         * @param {?} sourceSpan\n         */\n        function BoundTextAst(value, ngContentIndex, sourceSpan) {\n            this.value = value;\n            this.ngContentIndex = ngContentIndex;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BoundTextAst.prototype.visit = function (visitor, context) {\n            return visitor.visitBoundText(this, context);\n        };\n        return BoundTextAst;\n    }());\n    /**\n     * A plain attribute on an element.\n     */\n    var AttrAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function AttrAst(name, value, sourceSpan) {\n            this.name = name;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };\n        return AttrAst;\n    }());\n    /**\n     * A binding for an element property (e.g. `[property]=\"expression\"`) or an animation trigger (e.g.\n     * `[\\@trigger]=\"stateExp\"`)\n     */\n    var BoundElementPropertyAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} type\n         * @param {?} securityContext\n         * @param {?} needsRuntimeSecurityContext\n         * @param {?} value\n         * @param {?} unit\n         * @param {?} sourceSpan\n         */\n        function BoundElementPropertyAst(name, type, securityContext, needsRuntimeSecurityContext, value, unit, sourceSpan) {\n            this.name = name;\n            this.type = type;\n            this.securityContext = securityContext;\n            this.needsRuntimeSecurityContext = needsRuntimeSecurityContext;\n            this.value = value;\n            this.unit = unit;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BoundElementPropertyAst.prototype.visit = function (visitor, context) {\n            return visitor.visitElementProperty(this, context);\n        };\n        Object.defineProperty(BoundElementPropertyAst.prototype, \"isAnimation\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.type === PropertyBindingType.Animation; },\n            enumerable: true,\n            configurable: true\n        });\n        return BoundElementPropertyAst;\n    }());\n    /**\n     * A binding for an element event (e.g. `(event)=\"handler()\"`) or an animation trigger event (e.g.\n     * `(\\@trigger.phase)=\"callback($event)\"`).\n     */\n    var BoundEventAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} target\n         * @param {?} phase\n         * @param {?} handler\n         * @param {?} sourceSpan\n         */\n        function BoundEventAst(name, target, phase, handler, sourceSpan) {\n            this.name = name;\n            this.target = target;\n            this.phase = phase;\n            this.handler = handler;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} name\n         * @param {?} target\n         * @param {?} phase\n         * @return {?}\n         */\n        BoundEventAst.calcFullName = function (name, target, phase) {\n            if (target) {\n                return target + \":\" + name;\n            }\n            else if (phase) {\n                return \"@\" + name + \".\" + phase;\n            }\n            else {\n                return name;\n            }\n        };\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BoundEventAst.prototype.visit = function (visitor, context) {\n            return visitor.visitEvent(this, context);\n        };\n        Object.defineProperty(BoundEventAst.prototype, \"fullName\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return BoundEventAst.calcFullName(this.name, this.target, this.phase); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BoundEventAst.prototype, \"isAnimation\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return !!this.phase; },\n            enumerable: true,\n            configurable: true\n        });\n        return BoundEventAst;\n    }());\n    /**\n     * A reference declaration on an element (e.g. `let someName=\"expression\"`).\n     */\n    var ReferenceAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function ReferenceAst(name, value, sourceSpan) {\n            this.name = name;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ReferenceAst.prototype.visit = function (visitor, context) {\n            return visitor.visitReference(this, context);\n        };\n        return ReferenceAst;\n    }());\n    /**\n     * A variable declaration on a <template> (e.g. `var-someName=\"someLocalName\"`).\n     */\n    var VariableAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function VariableAst(name, value, sourceSpan) {\n            this.name = name;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        VariableAst.prototype.visit = function (visitor, context) {\n            return visitor.visitVariable(this, context);\n        };\n        return VariableAst;\n    }());\n    /**\n     * An element declaration in a template.\n     */\n    var ElementAst = (function () {\n        /**\n         * @param {?} name\n         * @param {?} attrs\n         * @param {?} inputs\n         * @param {?} outputs\n         * @param {?} references\n         * @param {?} directives\n         * @param {?} providers\n         * @param {?} hasViewContainer\n         * @param {?} children\n         * @param {?} ngContentIndex\n         * @param {?} sourceSpan\n         * @param {?} endSourceSpan\n         */\n        function ElementAst(name, attrs, inputs, outputs, references, directives, providers, hasViewContainer, children, ngContentIndex, sourceSpan, endSourceSpan) {\n            this.name = name;\n            this.attrs = attrs;\n            this.inputs = inputs;\n            this.outputs = outputs;\n            this.references = references;\n            this.directives = directives;\n            this.providers = providers;\n            this.hasViewContainer = hasViewContainer;\n            this.children = children;\n            this.ngContentIndex = ngContentIndex;\n            this.sourceSpan = sourceSpan;\n            this.endSourceSpan = endSourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ElementAst.prototype.visit = function (visitor, context) {\n            return visitor.visitElement(this, context);\n        };\n        return ElementAst;\n    }());\n    /**\n     * A `<template>` element included in an Angular template.\n     */\n    var EmbeddedTemplateAst = (function () {\n        /**\n         * @param {?} attrs\n         * @param {?} outputs\n         * @param {?} references\n         * @param {?} variables\n         * @param {?} directives\n         * @param {?} providers\n         * @param {?} hasViewContainer\n         * @param {?} children\n         * @param {?} ngContentIndex\n         * @param {?} sourceSpan\n         */\n        function EmbeddedTemplateAst(attrs, outputs, references, variables, directives, providers, hasViewContainer, children, ngContentIndex, sourceSpan) {\n            this.attrs = attrs;\n            this.outputs = outputs;\n            this.references = references;\n            this.variables = variables;\n            this.directives = directives;\n            this.providers = providers;\n            this.hasViewContainer = hasViewContainer;\n            this.children = children;\n            this.ngContentIndex = ngContentIndex;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        EmbeddedTemplateAst.prototype.visit = function (visitor, context) {\n            return visitor.visitEmbeddedTemplate(this, context);\n        };\n        return EmbeddedTemplateAst;\n    }());\n    /**\n     * A directive property with a bound value (e.g. `*ngIf=\"condition\").\n     */\n    var BoundDirectivePropertyAst = (function () {\n        /**\n         * @param {?} directiveName\n         * @param {?} templateName\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {\n            this.directiveName = directiveName;\n            this.templateName = templateName;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {\n            return visitor.visitDirectiveProperty(this, context);\n        };\n        return BoundDirectivePropertyAst;\n    }());\n    /**\n     * A directive declared on an element.\n     */\n    var DirectiveAst = (function () {\n        /**\n         * @param {?} directive\n         * @param {?} inputs\n         * @param {?} hostProperties\n         * @param {?} hostEvents\n         * @param {?} sourceSpan\n         */\n        function DirectiveAst(directive, inputs, hostProperties, hostEvents, sourceSpan) {\n            this.directive = directive;\n            this.inputs = inputs;\n            this.hostProperties = hostProperties;\n            this.hostEvents = hostEvents;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        DirectiveAst.prototype.visit = function (visitor, context) {\n            return visitor.visitDirective(this, context);\n        };\n        return DirectiveAst;\n    }());\n    /**\n     * A provider declared on an element\n     */\n    var ProviderAst = (function () {\n        /**\n         * @param {?} token\n         * @param {?} multiProvider\n         * @param {?} eager\n         * @param {?} providers\n         * @param {?} providerType\n         * @param {?} lifecycleHooks\n         * @param {?} sourceSpan\n         */\n        function ProviderAst(token, multiProvider, eager, providers, providerType, lifecycleHooks, sourceSpan) {\n            this.token = token;\n            this.multiProvider = multiProvider;\n            this.eager = eager;\n            this.providers = providers;\n            this.providerType = providerType;\n            this.lifecycleHooks = lifecycleHooks;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ProviderAst.prototype.visit = function (visitor, context) {\n            // No visit method in the visitor for now...\n            return null;\n        };\n        return ProviderAst;\n    }());\n    var ProviderAstType = {};\n    ProviderAstType.PublicService = 0;\n    ProviderAstType.PrivateService = 1;\n    ProviderAstType.Component = 2;\n    ProviderAstType.Directive = 3;\n    ProviderAstType.Builtin = 4;\n    ProviderAstType[ProviderAstType.PublicService] = \"PublicService\";\n    ProviderAstType[ProviderAstType.PrivateService] = \"PrivateService\";\n    ProviderAstType[ProviderAstType.Component] = \"Component\";\n    ProviderAstType[ProviderAstType.Directive] = \"Directive\";\n    ProviderAstType[ProviderAstType.Builtin] = \"Builtin\";\n    /**\n     * Position where content is to be projected (instance of `<ng-content>` in a template).\n     */\n    var NgContentAst = (function () {\n        /**\n         * @param {?} index\n         * @param {?} ngContentIndex\n         * @param {?} sourceSpan\n         */\n        function NgContentAst(index, ngContentIndex, sourceSpan) {\n            this.index = index;\n            this.ngContentIndex = ngContentIndex;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        NgContentAst.prototype.visit = function (visitor, context) {\n            return visitor.visitNgContent(this, context);\n        };\n        return NgContentAst;\n    }());\n    var PropertyBindingType = {};\n    PropertyBindingType.Property = 0;\n    PropertyBindingType.Attribute = 1;\n    PropertyBindingType.Class = 2;\n    PropertyBindingType.Style = 3;\n    PropertyBindingType.Animation = 4;\n    PropertyBindingType[PropertyBindingType.Property] = \"Property\";\n    PropertyBindingType[PropertyBindingType.Attribute] = \"Attribute\";\n    PropertyBindingType[PropertyBindingType.Class] = \"Class\";\n    PropertyBindingType[PropertyBindingType.Style] = \"Style\";\n    PropertyBindingType[PropertyBindingType.Animation] = \"Animation\";\n    /**\n     * Visit every node in a list of {\\@link TemplateAst}s with the given {\\@link TemplateAstVisitor}.\n     * @param {?} visitor\n     * @param {?} asts\n     * @param {?=} context\n     * @return {?}\n     */\n    function templateVisitAll(visitor, asts, context) {\n        if (context === void 0) { context = null; }\n        var /** @type {?} */ result = [];\n        var /** @type {?} */ visit = visitor.visit ?\n            function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :\n            function (ast) { return ast.visit(visitor, context); };\n        asts.forEach(function (ast) {\n            var /** @type {?} */ astResult = visit(ast);\n            if (astResult) {\n                result.push(astResult);\n            }\n        });\n        return result;\n    }\n\n    /**\n     * A token representing the a reference to a static type.\n     *\n     * This token is unique for a filePath and name and can be used as a hash table key.\n     */\n    var StaticSymbol = (function () {\n        /**\n         * @param {?} filePath\n         * @param {?} name\n         * @param {?=} members\n         */\n        function StaticSymbol(filePath, name, members) {\n            this.filePath = filePath;\n            this.name = name;\n            this.members = members;\n        }\n        return StaticSymbol;\n    }());\n    /**\n     * A cache of static symbol used by the StaticReflector to return the same symbol for the\n     * same symbol values.\n     */\n    var StaticSymbolCache = (function () {\n        function StaticSymbolCache() {\n            this.cache = new Map();\n        }\n        /**\n         * @param {?} declarationFile\n         * @param {?} name\n         * @param {?=} members\n         * @return {?}\n         */\n        StaticSymbolCache.prototype.get = function (declarationFile, name, members) {\n            members = members || [];\n            var /** @type {?} */ memberSuffix = members.length ? \".\" + members.join('.') : '';\n            var /** @type {?} */ key = \"\\\"\" + declarationFile + \"\\\".\" + name + memberSuffix;\n            var /** @type {?} */ result = this.cache.get(key);\n            if (!result) {\n                result = new StaticSymbol(declarationFile, name, members);\n                this.cache.set(key, result);\n            }\n            return result;\n        };\n        return StaticSymbolCache;\n    }());\n\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPresent(obj) {\n        return obj != null;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isBlank(obj) {\n        return obj == null;\n    }\n    var /** @type {?} */ STRING_MAP_PROTO = Object.getPrototypeOf({});\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isStrictStringMap(obj) {\n        return typeof obj === 'object' && obj !== null && Object.getPrototypeOf(obj) === STRING_MAP_PROTO;\n    }\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function stringify(token) {\n        if (typeof token === 'string') {\n            return token;\n        }\n        if (token == null) {\n            return '' + token;\n        }\n        if (token.overriddenName) {\n            return \"\" + token.overriddenName;\n        }\n        if (token.name) {\n            return \"\" + token.name;\n        }\n        var /** @type {?} */ res = token.toString();\n        var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n        return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n    }\n    var NumberWrapper = (function () {\n        function NumberWrapper() {\n        }\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        NumberWrapper.parseIntAutoRadix = function (text) {\n            var /** @type {?} */ result = parseInt(text);\n            if (isNaN(result)) {\n                throw new Error('Invalid integer literal when parsing ' + text);\n            }\n            return result;\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        NumberWrapper.isNumeric = function (value) { return !isNaN(value - parseFloat(value)); };\n        return NumberWrapper;\n    }());\n    /**\n     * @param {?} o\n     * @return {?}\n     */\n    function isJsObject(o) {\n        return o !== null && (typeof o === 'function' || typeof o === 'object');\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function isPrimitive(obj) {\n        return !isJsObject(obj);\n    }\n    /**\n     * @param {?} s\n     * @return {?}\n     */\n    function escapeRegExp(s) {\n        return s.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n    }\n\n    /**\n     * Wraps Javascript Objects\n     */\n    var StringMapWrapper = (function () {\n        function StringMapWrapper() {\n        }\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.merge = function (m1, m2) {\n            var /** @type {?} */ m = {};\n            for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n                var k = _a[_i];\n                m[k] = m1[k];\n            }\n            for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n                var k = _c[_b];\n                m[k] = m2[k];\n            }\n            return m;\n        };\n        /**\n         * @param {?} m1\n         * @param {?} m2\n         * @return {?}\n         */\n        StringMapWrapper.equals = function (m1, m2) {\n            var /** @type {?} */ k1 = Object.keys(m1);\n            var /** @type {?} */ k2 = Object.keys(m2);\n            if (k1.length != k2.length) {\n                return false;\n            }\n            for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n                var /** @type {?} */ key = k1[i];\n                if (m1[key] !== m2[key]) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        return StringMapWrapper;\n    }());\n    var ListWrapper = (function () {\n        function ListWrapper() {\n        }\n        /**\n         * @param {?} arr\n         * @param {?} condition\n         * @return {?}\n         */\n        ListWrapper.findLast = function (arr, condition) {\n            for (var /** @type {?} */ i = arr.length - 1; i >= 0; i--) {\n                if (condition(arr[i])) {\n                    return arr[i];\n                }\n            }\n            return null;\n        };\n        /**\n         * @param {?} list\n         * @param {?} items\n         * @return {?}\n         */\n        ListWrapper.removeAll = function (list, items) {\n            for (var /** @type {?} */ i = 0; i < items.length; ++i) {\n                var /** @type {?} */ index = list.indexOf(items[i]);\n                if (index > -1) {\n                    list.splice(index, 1);\n                }\n            }\n        };\n        /**\n         * @param {?} list\n         * @param {?} el\n         * @return {?}\n         */\n        ListWrapper.remove = function (list, el) {\n            var /** @type {?} */ index = list.indexOf(el);\n            if (index > -1) {\n                list.splice(index, 1);\n                return true;\n            }\n            return false;\n        };\n        /**\n         * @param {?} a\n         * @param {?} b\n         * @return {?}\n         */\n        ListWrapper.equals = function (a, b) {\n            if (a.length != b.length)\n                return false;\n            for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n                if (a[i] !== b[i])\n                    return false;\n            }\n            return true;\n        };\n        /**\n         * @param {?} list\n         * @return {?}\n         */\n        ListWrapper.flatten = function (list) {\n            return list.reduce(function (flat, item) {\n                var /** @type {?} */ flatItem = Array.isArray(item) ? ListWrapper.flatten(item) : item;\n                return ((flat)).concat(flatItem);\n            }, []);\n        };\n        return ListWrapper;\n    }());\n\n    var /** @type {?} */ isDefaultChangeDetectionStrategy = _angular_core.__core_private__.isDefaultChangeDetectionStrategy;\n    var /** @type {?} */ ChangeDetectorStatus = _angular_core.__core_private__.ChangeDetectorStatus;\n    var /** @type {?} */ LifecycleHooks = _angular_core.__core_private__.LifecycleHooks;\n    var /** @type {?} */ LIFECYCLE_HOOKS_VALUES = _angular_core.__core_private__.LIFECYCLE_HOOKS_VALUES;\n    var /** @type {?} */ ReflectorReader = _angular_core.__core_private__.ReflectorReader;\n    var /** @type {?} */ ViewContainer = _angular_core.__core_private__.ViewContainer;\n    var /** @type {?} */ CodegenComponentFactoryResolver = _angular_core.__core_private__.CodegenComponentFactoryResolver;\n    var /** @type {?} */ ComponentRef_ = _angular_core.__core_private__.ComponentRef_;\n    var /** @type {?} */ AppView = _angular_core.__core_private__.AppView;\n    var /** @type {?} */ DebugAppView = _angular_core.__core_private__.DebugAppView;\n    var /** @type {?} */ NgModuleInjector = _angular_core.__core_private__.NgModuleInjector;\n    var /** @type {?} */ registerModuleFactory = _angular_core.__core_private__.registerModuleFactory;\n    var /** @type {?} */ ViewType = _angular_core.__core_private__.ViewType;\n    var /** @type {?} */ view_utils = _angular_core.__core_private__.view_utils;\n    var /** @type {?} */ DebugContext = _angular_core.__core_private__.DebugContext;\n    var /** @type {?} */ StaticNodeDebugInfo = _angular_core.__core_private__.StaticNodeDebugInfo;\n    var /** @type {?} */ devModeEqual = _angular_core.__core_private__.devModeEqual;\n    var /** @type {?} */ UNINITIALIZED = _angular_core.__core_private__.UNINITIALIZED;\n    var /** @type {?} */ ValueUnwrapper = _angular_core.__core_private__.ValueUnwrapper;\n    var /** @type {?} */ TemplateRef_ = _angular_core.__core_private__.TemplateRef_;\n    var /** @type {?} */ Console = _angular_core.__core_private__.Console;\n    var /** @type {?} */ reflector = _angular_core.__core_private__.reflector;\n    var /** @type {?} */ Reflector = _angular_core.__core_private__.Reflector;\n    var /** @type {?} */ ReflectionCapabilities = _angular_core.__core_private__.ReflectionCapabilities;\n    var /** @type {?} */ NoOpAnimationPlayer = _angular_core.__core_private__.NoOpAnimationPlayer;\n    var /** @type {?} */ AnimationSequencePlayer = _angular_core.__core_private__.AnimationSequencePlayer;\n    var /** @type {?} */ AnimationGroupPlayer = _angular_core.__core_private__.AnimationGroupPlayer;\n    var /** @type {?} */ AnimationKeyframe = _angular_core.__core_private__.AnimationKeyframe;\n    var /** @type {?} */ AnimationStyles = _angular_core.__core_private__.AnimationStyles;\n    var /** @type {?} */ ANY_STATE = _angular_core.__core_private__.ANY_STATE;\n    var /** @type {?} */ DEFAULT_STATE = _angular_core.__core_private__.DEFAULT_STATE;\n    var /** @type {?} */ EMPTY_STATE = _angular_core.__core_private__.EMPTY_STATE;\n    var /** @type {?} */ FILL_STYLE_FLAG = _angular_core.__core_private__.FILL_STYLE_FLAG;\n    var /** @type {?} */ prepareFinalAnimationStyles = _angular_core.__core_private__.prepareFinalAnimationStyles;\n    var /** @type {?} */ balanceAnimationKeyframes = _angular_core.__core_private__.balanceAnimationKeyframes;\n    var /** @type {?} */ clearStyles = _angular_core.__core_private__.clearStyles;\n    var /** @type {?} */ collectAndResolveStyles = _angular_core.__core_private__.collectAndResolveStyles;\n    var /** @type {?} */ renderStyles = _angular_core.__core_private__.renderStyles;\n    var /** @type {?} */ ComponentStillLoadingError = _angular_core.__core_private__.ComponentStillLoadingError;\n    var /** @type {?} */ AnimationTransition = _angular_core.__core_private__.AnimationTransition;\n\n    var TagContentType = {};\n    TagContentType.RAW_TEXT = 0;\n    TagContentType.ESCAPABLE_RAW_TEXT = 1;\n    TagContentType.PARSABLE_DATA = 2;\n    TagContentType[TagContentType.RAW_TEXT] = \"RAW_TEXT\";\n    TagContentType[TagContentType.ESCAPABLE_RAW_TEXT] = \"ESCAPABLE_RAW_TEXT\";\n    TagContentType[TagContentType.PARSABLE_DATA] = \"PARSABLE_DATA\";\n    /**\n     * @param {?} elementName\n     * @return {?}\n     */\n    function splitNsName(elementName) {\n        if (elementName[0] != ':') {\n            return [null, elementName];\n        }\n        var /** @type {?} */ colonIndex = elementName.indexOf(':', 1);\n        if (colonIndex == -1) {\n            throw new Error(\"Unsupported format \\\"\" + elementName + \"\\\" expecting \\\":namespace:name\\\"\");\n        }\n        return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];\n    }\n    /**\n     * @param {?} fullName\n     * @return {?}\n     */\n    function getNsPrefix(fullName) {\n        return fullName === null ? null : splitNsName(fullName)[0];\n    }\n    /**\n     * @param {?} prefix\n     * @param {?} localName\n     * @return {?}\n     */\n    function mergeNsAndName(prefix, localName) {\n        return prefix ? \":\" + prefix + \":\" + localName : localName;\n    }\n    // see http://www.w3.org/TR/html51/syntax.html#named-character-references\n    // see https://html.spec.whatwg.org/multipage/entities.json\n    // This list is not exhaustive to keep the compiler footprint low.\n    // The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not exist.\n    var /** @type {?} */ NAMED_ENTITIES = {\n        'Aacute': '\\u00C1',\n        'aacute': '\\u00E1',\n        'Acirc': '\\u00C2',\n        'acirc': '\\u00E2',\n        'acute': '\\u00B4',\n        'AElig': '\\u00C6',\n        'aelig': '\\u00E6',\n        'Agrave': '\\u00C0',\n        'agrave': '\\u00E0',\n        'alefsym': '\\u2135',\n        'Alpha': '\\u0391',\n        'alpha': '\\u03B1',\n        'amp': '&',\n        'and': '\\u2227',\n        'ang': '\\u2220',\n        'apos': '\\u0027',\n        'Aring': '\\u00C5',\n        'aring': '\\u00E5',\n        'asymp': '\\u2248',\n        'Atilde': '\\u00C3',\n        'atilde': '\\u00E3',\n        'Auml': '\\u00C4',\n        'auml': '\\u00E4',\n        'bdquo': '\\u201E',\n        'Beta': '\\u0392',\n        'beta': '\\u03B2',\n        'brvbar': '\\u00A6',\n        'bull': '\\u2022',\n        'cap': '\\u2229',\n        'Ccedil': '\\u00C7',\n        'ccedil': '\\u00E7',\n        'cedil': '\\u00B8',\n        'cent': '\\u00A2',\n        'Chi': '\\u03A7',\n        'chi': '\\u03C7',\n        'circ': '\\u02C6',\n        'clubs': '\\u2663',\n        'cong': '\\u2245',\n        'copy': '\\u00A9',\n        'crarr': '\\u21B5',\n        'cup': '\\u222A',\n        'curren': '\\u00A4',\n        'dagger': '\\u2020',\n        'Dagger': '\\u2021',\n        'darr': '\\u2193',\n        'dArr': '\\u21D3',\n        'deg': '\\u00B0',\n        'Delta': '\\u0394',\n        'delta': '\\u03B4',\n        'diams': '\\u2666',\n        'divide': '\\u00F7',\n        'Eacute': '\\u00C9',\n        'eacute': '\\u00E9',\n        'Ecirc': '\\u00CA',\n        'ecirc': '\\u00EA',\n        'Egrave': '\\u00C8',\n        'egrave': '\\u00E8',\n        'empty': '\\u2205',\n        'emsp': '\\u2003',\n        'ensp': '\\u2002',\n        'Epsilon': '\\u0395',\n        'epsilon': '\\u03B5',\n        'equiv': '\\u2261',\n        'Eta': '\\u0397',\n        'eta': '\\u03B7',\n        'ETH': '\\u00D0',\n        'eth': '\\u00F0',\n        'Euml': '\\u00CB',\n        'euml': '\\u00EB',\n        'euro': '\\u20AC',\n        'exist': '\\u2203',\n        'fnof': '\\u0192',\n        'forall': '\\u2200',\n        'frac12': '\\u00BD',\n        'frac14': '\\u00BC',\n        'frac34': '\\u00BE',\n        'frasl': '\\u2044',\n        'Gamma': '\\u0393',\n        'gamma': '\\u03B3',\n        'ge': '\\u2265',\n        'gt': '>',\n        'harr': '\\u2194',\n        'hArr': '\\u21D4',\n        'hearts': '\\u2665',\n        'hellip': '\\u2026',\n        'Iacute': '\\u00CD',\n        'iacute': '\\u00ED',\n        'Icirc': '\\u00CE',\n        'icirc': '\\u00EE',\n        'iexcl': '\\u00A1',\n        'Igrave': '\\u00CC',\n        'igrave': '\\u00EC',\n        'image': '\\u2111',\n        'infin': '\\u221E',\n        'int': '\\u222B',\n        'Iota': '\\u0399',\n        'iota': '\\u03B9',\n        'iquest': '\\u00BF',\n        'isin': '\\u2208',\n        'Iuml': '\\u00CF',\n        'iuml': '\\u00EF',\n        'Kappa': '\\u039A',\n        'kappa': '\\u03BA',\n        'Lambda': '\\u039B',\n        'lambda': '\\u03BB',\n        'lang': '\\u27E8',\n        'laquo': '\\u00AB',\n        'larr': '\\u2190',\n        'lArr': '\\u21D0',\n        'lceil': '\\u2308',\n        'ldquo': '\\u201C',\n        'le': '\\u2264',\n        'lfloor': '\\u230A',\n        'lowast': '\\u2217',\n        'loz': '\\u25CA',\n        'lrm': '\\u200E',\n        'lsaquo': '\\u2039',\n        'lsquo': '\\u2018',\n        'lt': '<',\n        'macr': '\\u00AF',\n        'mdash': '\\u2014',\n        'micro': '\\u00B5',\n        'middot': '\\u00B7',\n        'minus': '\\u2212',\n        'Mu': '\\u039C',\n        'mu': '\\u03BC',\n        'nabla': '\\u2207',\n        'nbsp': '\\u00A0',\n        'ndash': '\\u2013',\n        'ne': '\\u2260',\n        'ni': '\\u220B',\n        'not': '\\u00AC',\n        'notin': '\\u2209',\n        'nsub': '\\u2284',\n        'Ntilde': '\\u00D1',\n        'ntilde': '\\u00F1',\n        'Nu': '\\u039D',\n        'nu': '\\u03BD',\n        'Oacute': '\\u00D3',\n        'oacute': '\\u00F3',\n        'Ocirc': '\\u00D4',\n        'ocirc': '\\u00F4',\n        'OElig': '\\u0152',\n        'oelig': '\\u0153',\n        'Ograve': '\\u00D2',\n        'ograve': '\\u00F2',\n        'oline': '\\u203E',\n        'Omega': '\\u03A9',\n        'omega': '\\u03C9',\n        'Omicron': '\\u039F',\n        'omicron': '\\u03BF',\n        'oplus': '\\u2295',\n        'or': '\\u2228',\n        'ordf': '\\u00AA',\n        'ordm': '\\u00BA',\n        'Oslash': '\\u00D8',\n        'oslash': '\\u00F8',\n        'Otilde': '\\u00D5',\n        'otilde': '\\u00F5',\n        'otimes': '\\u2297',\n        'Ouml': '\\u00D6',\n        'ouml': '\\u00F6',\n        'para': '\\u00B6',\n        'permil': '\\u2030',\n        'perp': '\\u22A5',\n        'Phi': '\\u03A6',\n        'phi': '\\u03C6',\n        'Pi': '\\u03A0',\n        'pi': '\\u03C0',\n        'piv': '\\u03D6',\n        'plusmn': '\\u00B1',\n        'pound': '\\u00A3',\n        'prime': '\\u2032',\n        'Prime': '\\u2033',\n        'prod': '\\u220F',\n        'prop': '\\u221D',\n        'Psi': '\\u03A8',\n        'psi': '\\u03C8',\n        'quot': '\\u0022',\n        'radic': '\\u221A',\n        'rang': '\\u27E9',\n        'raquo': '\\u00BB',\n        'rarr': '\\u2192',\n        'rArr': '\\u21D2',\n        'rceil': '\\u2309',\n        'rdquo': '\\u201D',\n        'real': '\\u211C',\n        'reg': '\\u00AE',\n        'rfloor': '\\u230B',\n        'Rho': '\\u03A1',\n        'rho': '\\u03C1',\n        'rlm': '\\u200F',\n        'rsaquo': '\\u203A',\n        'rsquo': '\\u2019',\n        'sbquo': '\\u201A',\n        'Scaron': '\\u0160',\n        'scaron': '\\u0161',\n        'sdot': '\\u22C5',\n        'sect': '\\u00A7',\n        'shy': '\\u00AD',\n        'Sigma': '\\u03A3',\n        'sigma': '\\u03C3',\n        'sigmaf': '\\u03C2',\n        'sim': '\\u223C',\n        'spades': '\\u2660',\n        'sub': '\\u2282',\n        'sube': '\\u2286',\n        'sum': '\\u2211',\n        'sup': '\\u2283',\n        'sup1': '\\u00B9',\n        'sup2': '\\u00B2',\n        'sup3': '\\u00B3',\n        'supe': '\\u2287',\n        'szlig': '\\u00DF',\n        'Tau': '\\u03A4',\n        'tau': '\\u03C4',\n        'there4': '\\u2234',\n        'Theta': '\\u0398',\n        'theta': '\\u03B8',\n        'thetasym': '\\u03D1',\n        'thinsp': '\\u2009',\n        'THORN': '\\u00DE',\n        'thorn': '\\u00FE',\n        'tilde': '\\u02DC',\n        'times': '\\u00D7',\n        'trade': '\\u2122',\n        'Uacute': '\\u00DA',\n        'uacute': '\\u00FA',\n        'uarr': '\\u2191',\n        'uArr': '\\u21D1',\n        'Ucirc': '\\u00DB',\n        'ucirc': '\\u00FB',\n        'Ugrave': '\\u00D9',\n        'ugrave': '\\u00F9',\n        'uml': '\\u00A8',\n        'upsih': '\\u03D2',\n        'Upsilon': '\\u03A5',\n        'upsilon': '\\u03C5',\n        'Uuml': '\\u00DC',\n        'uuml': '\\u00FC',\n        'weierp': '\\u2118',\n        'Xi': '\\u039E',\n        'xi': '\\u03BE',\n        'Yacute': '\\u00DD',\n        'yacute': '\\u00FD',\n        'yen': '\\u00A5',\n        'yuml': '\\u00FF',\n        'Yuml': '\\u0178',\n        'Zeta': '\\u0396',\n        'zeta': '\\u03B6',\n        'zwj': '\\u200D',\n        'zwnj': '\\u200C',\n    };\n\n    var HtmlTagDefinition = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function HtmlTagDefinition(_a) {\n            var _this = this;\n            var _b = _a === void 0 ? {} : _a, closedByChildren = _b.closedByChildren, requiredParents = _b.requiredParents, implicitNamespacePrefix = _b.implicitNamespacePrefix, _c = _b.contentType, contentType = _c === void 0 ? TagContentType.PARSABLE_DATA : _c, _d = _b.closedByParent, closedByParent = _d === void 0 ? false : _d, _e = _b.isVoid, isVoid = _e === void 0 ? false : _e, _f = _b.ignoreFirstLf, ignoreFirstLf = _f === void 0 ? false : _f;\n            this.closedByChildren = {};\n            this.closedByParent = false;\n            this.canSelfClose = false;\n            if (closedByChildren && closedByChildren.length > 0) {\n                closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });\n            }\n            this.isVoid = isVoid;\n            this.closedByParent = closedByParent || isVoid;\n            if (requiredParents && requiredParents.length > 0) {\n                this.requiredParents = {};\n                // The first parent is the list is automatically when none of the listed parents are present\n                this.parentToAdd = requiredParents[0];\n                requiredParents.forEach(function (tagName) { return _this.requiredParents[tagName] = true; });\n            }\n            this.implicitNamespacePrefix = implicitNamespacePrefix;\n            this.contentType = contentType;\n            this.ignoreFirstLf = ignoreFirstLf;\n        }\n        /**\n         * @param {?} currentParent\n         * @return {?}\n         */\n        HtmlTagDefinition.prototype.requireExtraParent = function (currentParent) {\n            if (!this.requiredParents) {\n                return false;\n            }\n            if (!currentParent) {\n                return true;\n            }\n            var /** @type {?} */ lcParent = currentParent.toLowerCase();\n            return this.requiredParents[lcParent] != true && lcParent != 'template';\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        HtmlTagDefinition.prototype.isClosedByChild = function (name) {\n            return this.isVoid || name.toLowerCase() in this.closedByChildren;\n        };\n        return HtmlTagDefinition;\n    }());\n    // see http://www.w3.org/TR/html51/syntax.html#optional-tags\n    // This implementation does not fully conform to the HTML5 spec.\n    var /** @type {?} */ TAG_DEFINITIONS = {\n        'base': new HtmlTagDefinition({ isVoid: true }),\n        'meta': new HtmlTagDefinition({ isVoid: true }),\n        'area': new HtmlTagDefinition({ isVoid: true }),\n        'embed': new HtmlTagDefinition({ isVoid: true }),\n        'link': new HtmlTagDefinition({ isVoid: true }),\n        'img': new HtmlTagDefinition({ isVoid: true }),\n        'input': new HtmlTagDefinition({ isVoid: true }),\n        'param': new HtmlTagDefinition({ isVoid: true }),\n        'hr': new HtmlTagDefinition({ isVoid: true }),\n        'br': new HtmlTagDefinition({ isVoid: true }),\n        'source': new HtmlTagDefinition({ isVoid: true }),\n        'track': new HtmlTagDefinition({ isVoid: true }),\n        'wbr': new HtmlTagDefinition({ isVoid: true }),\n        'p': new HtmlTagDefinition({\n            closedByChildren: [\n                'address', 'article', 'aside', 'blockquote', 'div', 'dl', 'fieldset', 'footer', 'form',\n                'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr',\n                'main', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'\n            ],\n            closedByParent: true\n        }),\n        'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),\n        'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),\n        'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),\n        'tr': new HtmlTagDefinition({\n            closedByChildren: ['tr'],\n            requiredParents: ['tbody', 'tfoot', 'thead'],\n            closedByParent: true\n        }),\n        'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),\n        'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),\n        'col': new HtmlTagDefinition({ requiredParents: ['colgroup'], isVoid: true }),\n        'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),\n        'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),\n        'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),\n        'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),\n        'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),\n        'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n        'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n        'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),\n        'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n        'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),\n        'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),\n        'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),\n        'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),\n        'style': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),\n        'script': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),\n        'title': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT }),\n        'textarea': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),\n    };\n    var /** @type {?} */ _DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();\n    /**\n     * @param {?} tagName\n     * @return {?}\n     */\n    function getHtmlTagDefinition(tagName) {\n        return TAG_DEFINITIONS[tagName.toLowerCase()] || _DEFAULT_TAG_DEFINITION;\n    }\n\n    var /** @type {?} */ _SELECTOR_REGEXP = new RegExp('(\\\\:not\\\\()|' +\n        '([-\\\\w]+)|' +\n        '(?:\\\\.([-\\\\w]+))|' +\n        // \"-\" should appear first in the regexp below as FF31 parses \"[.-\\w]\" as a range\n        '(?:\\\\[([-.\\\\w*]+)(?:=([^\\\\]]*))?\\\\])|' +\n        '(\\\\))|' +\n        '(\\\\s*,\\\\s*)', // \",\"\n    'g');\n    /**\n     * A css selector contains an element name,\n     * css classes and attribute/value pairs with the purpose\n     * of selecting subsets out of them.\n     */\n    var CssSelector = (function () {\n        function CssSelector() {\n            this.element = null;\n            this.classNames = [];\n            this.attrs = [];\n            this.notSelectors = [];\n        }\n        /**\n         * @param {?} selector\n         * @return {?}\n         */\n        CssSelector.parse = function (selector) {\n            var /** @type {?} */ results = [];\n            var /** @type {?} */ _addResult = function (res, cssSel) {\n                if (cssSel.notSelectors.length > 0 && !cssSel.element && cssSel.classNames.length == 0 &&\n                    cssSel.attrs.length == 0) {\n                    cssSel.element = '*';\n                }\n                res.push(cssSel);\n            };\n            var /** @type {?} */ cssSelector = new CssSelector();\n            var /** @type {?} */ match;\n            var /** @type {?} */ current = cssSelector;\n            var /** @type {?} */ inNot = false;\n            _SELECTOR_REGEXP.lastIndex = 0;\n            while (match = _SELECTOR_REGEXP.exec(selector)) {\n                if (match[1]) {\n                    if (inNot) {\n                        throw new Error('Nesting :not is not allowed in a selector');\n                    }\n                    inNot = true;\n                    current = new CssSelector();\n                    cssSelector.notSelectors.push(current);\n                }\n                if (match[2]) {\n                    current.setElement(match[2]);\n                }\n                if (match[3]) {\n                    current.addClassName(match[3]);\n                }\n                if (match[4]) {\n                    current.addAttribute(match[4], match[5]);\n                }\n                if (match[6]) {\n                    inNot = false;\n                    current = cssSelector;\n                }\n                if (match[7]) {\n                    if (inNot) {\n                        throw new Error('Multiple selectors in :not are not supported');\n                    }\n                    _addResult(results, cssSelector);\n                    cssSelector = current = new CssSelector();\n                }\n            }\n            _addResult(results, cssSelector);\n            return results;\n        };\n        /**\n         * @return {?}\n         */\n        CssSelector.prototype.isElementSelector = function () {\n            return this.hasElementSelector() && this.classNames.length == 0 && this.attrs.length == 0 &&\n                this.notSelectors.length === 0;\n        };\n        /**\n         * @return {?}\n         */\n        CssSelector.prototype.hasElementSelector = function () { return !!this.element; };\n        /**\n         * @param {?=} element\n         * @return {?}\n         */\n        CssSelector.prototype.setElement = function (element) {\n            if (element === void 0) { element = null; }\n            this.element = element;\n        };\n        /**\n         * Gets a template string for an element that matches the selector.\n         * @return {?}\n         */\n        CssSelector.prototype.getMatchingElementTemplate = function () {\n            var /** @type {?} */ tagName = this.element || 'div';\n            var /** @type {?} */ classAttr = this.classNames.length > 0 ? \" class=\\\"\" + this.classNames.join(' ') + \"\\\"\" : '';\n            var /** @type {?} */ attrs = '';\n            for (var /** @type {?} */ i = 0; i < this.attrs.length; i += 2) {\n                var /** @type {?} */ attrName = this.attrs[i];\n                var /** @type {?} */ attrValue = this.attrs[i + 1] !== '' ? \"=\\\"\" + this.attrs[i + 1] + \"\\\"\" : '';\n                attrs += \" \" + attrName + attrValue;\n            }\n            return getHtmlTagDefinition(tagName).isVoid ? \"<\" + tagName + classAttr + attrs + \"/>\" :\n                \"<\" + tagName + classAttr + attrs + \"></\" + tagName + \">\";\n        };\n        /**\n         * @param {?} name\n         * @param {?=} value\n         * @return {?}\n         */\n        CssSelector.prototype.addAttribute = function (name, value) {\n            if (value === void 0) { value = ''; }\n            this.attrs.push(name, value && value.toLowerCase() || '');\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };\n        /**\n         * @return {?}\n         */\n        CssSelector.prototype.toString = function () {\n            var /** @type {?} */ res = this.element || '';\n            if (this.classNames) {\n                this.classNames.forEach(function (klass) { return res += \".\" + klass; });\n            }\n            if (this.attrs) {\n                for (var /** @type {?} */ i = 0; i < this.attrs.length; i += 2) {\n                    var /** @type {?} */ name_1 = this.attrs[i];\n                    var /** @type {?} */ value = this.attrs[i + 1];\n                    res += \"[\" + name_1 + (value ? '=' + value : '') + \"]\";\n                }\n            }\n            this.notSelectors.forEach(function (notSelector) { return res += \":not(\" + notSelector + \")\"; });\n            return res;\n        };\n        return CssSelector;\n    }());\n    /**\n     * Reads a list of CssSelectors and allows to calculate which ones\n     * are contained in a given CssSelector.\n     */\n    var SelectorMatcher = (function () {\n        function SelectorMatcher() {\n            this._elementMap = new Map();\n            this._elementPartialMap = new Map();\n            this._classMap = new Map();\n            this._classPartialMap = new Map();\n            this._attrValueMap = new Map();\n            this._attrValuePartialMap = new Map();\n            this._listContexts = [];\n        }\n        /**\n         * @param {?} notSelectors\n         * @return {?}\n         */\n        SelectorMatcher.createNotMatcher = function (notSelectors) {\n            var /** @type {?} */ notMatcher = new SelectorMatcher();\n            notMatcher.addSelectables(notSelectors, null);\n            return notMatcher;\n        };\n        /**\n         * @param {?} cssSelectors\n         * @param {?=} callbackCtxt\n         * @return {?}\n         */\n        SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {\n            var /** @type {?} */ listContext = null;\n            if (cssSelectors.length > 1) {\n                listContext = new SelectorListContext(cssSelectors);\n                this._listContexts.push(listContext);\n            }\n            for (var /** @type {?} */ i = 0; i < cssSelectors.length; i++) {\n                this._addSelectable(cssSelectors[i], callbackCtxt, listContext);\n            }\n        };\n        /**\n         * Add an object that can be found later on by calling `match`.\n         * @param {?} cssSelector A css selector\n         * @param {?} callbackCtxt An opaque object that will be given to the callback of the `match` function\n         * @param {?} listContext\n         * @return {?}\n         */\n        SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {\n            var /** @type {?} */ matcher = this;\n            var /** @type {?} */ element = cssSelector.element;\n            var /** @type {?} */ classNames = cssSelector.classNames;\n            var /** @type {?} */ attrs = cssSelector.attrs;\n            var /** @type {?} */ selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);\n            if (element) {\n                var /** @type {?} */ isTerminal = attrs.length === 0 && classNames.length === 0;\n                if (isTerminal) {\n                    this._addTerminal(matcher._elementMap, element, selectable);\n                }\n                else {\n                    matcher = this._addPartial(matcher._elementPartialMap, element);\n                }\n            }\n            if (classNames) {\n                for (var /** @type {?} */ i = 0; i < classNames.length; i++) {\n                    var /** @type {?} */ isTerminal = attrs.length === 0 && i === classNames.length - 1;\n                    var /** @type {?} */ className = classNames[i];\n                    if (isTerminal) {\n                        this._addTerminal(matcher._classMap, className, selectable);\n                    }\n                    else {\n                        matcher = this._addPartial(matcher._classPartialMap, className);\n                    }\n                }\n            }\n            if (attrs) {\n                for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n                    var /** @type {?} */ isTerminal = i === attrs.length - 2;\n                    var /** @type {?} */ name_2 = attrs[i];\n                    var /** @type {?} */ value = attrs[i + 1];\n                    if (isTerminal) {\n                        var /** @type {?} */ terminalMap = matcher._attrValueMap;\n                        var /** @type {?} */ terminalValuesMap = terminalMap.get(name_2);\n                        if (!terminalValuesMap) {\n                            terminalValuesMap = new Map();\n                            terminalMap.set(name_2, terminalValuesMap);\n                        }\n                        this._addTerminal(terminalValuesMap, value, selectable);\n                    }\n                    else {\n                        var /** @type {?} */ partialMap = matcher._attrValuePartialMap;\n                        var /** @type {?} */ partialValuesMap = partialMap.get(name_2);\n                        if (!partialValuesMap) {\n                            partialValuesMap = new Map();\n                            partialMap.set(name_2, partialValuesMap);\n                        }\n                        matcher = this._addPartial(partialValuesMap, value);\n                    }\n                }\n            }\n        };\n        /**\n         * @param {?} map\n         * @param {?} name\n         * @param {?} selectable\n         * @return {?}\n         */\n        SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {\n            var /** @type {?} */ terminalList = map.get(name);\n            if (!terminalList) {\n                terminalList = [];\n                map.set(name, terminalList);\n            }\n            terminalList.push(selectable);\n        };\n        /**\n         * @param {?} map\n         * @param {?} name\n         * @return {?}\n         */\n        SelectorMatcher.prototype._addPartial = function (map, name) {\n            var /** @type {?} */ matcher = map.get(name);\n            if (!matcher) {\n                matcher = new SelectorMatcher();\n                map.set(name, matcher);\n            }\n            return matcher;\n        };\n        /**\n         * Find the objects that have been added via `addSelectable`\n         * whose css selector is contained in the given css selector.\n         * @param {?} cssSelector A css selector\n         * @param {?} matchedCallback This callback will be called with the object handed into `addSelectable`\n         * @return {?} boolean true if a match was found\n         */\n        SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {\n            var /** @type {?} */ result = false;\n            var /** @type {?} */ element = cssSelector.element;\n            var /** @type {?} */ classNames = cssSelector.classNames;\n            var /** @type {?} */ attrs = cssSelector.attrs;\n            for (var /** @type {?} */ i = 0; i < this._listContexts.length; i++) {\n                this._listContexts[i].alreadyMatched = false;\n            }\n            result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;\n            result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||\n                result;\n            if (classNames) {\n                for (var /** @type {?} */ i = 0; i < classNames.length; i++) {\n                    var /** @type {?} */ className = classNames[i];\n                    result =\n                        this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;\n                    result =\n                        this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||\n                            result;\n                }\n            }\n            if (attrs) {\n                for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n                    var /** @type {?} */ name_3 = attrs[i];\n                    var /** @type {?} */ value = attrs[i + 1];\n                    var /** @type {?} */ terminalValuesMap = this._attrValueMap.get(name_3);\n                    if (value) {\n                        result =\n                            this._matchTerminal(terminalValuesMap, '', cssSelector, matchedCallback) || result;\n                    }\n                    result =\n                        this._matchTerminal(terminalValuesMap, value, cssSelector, matchedCallback) || result;\n                    var /** @type {?} */ partialValuesMap = this._attrValuePartialMap.get(name_3);\n                    if (value) {\n                        result = this._matchPartial(partialValuesMap, '', cssSelector, matchedCallback) || result;\n                    }\n                    result =\n                        this._matchPartial(partialValuesMap, value, cssSelector, matchedCallback) || result;\n                }\n            }\n            return result;\n        };\n        /**\n         * \\@internal\n         * @param {?} map\n         * @param {?} name\n         * @param {?} cssSelector\n         * @param {?} matchedCallback\n         * @return {?}\n         */\n        SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {\n            if (!map || typeof name !== 'string') {\n                return false;\n            }\n            var /** @type {?} */ selectables = map.get(name) || [];\n            var /** @type {?} */ starSelectables = map.get('*');\n            if (starSelectables) {\n                selectables = selectables.concat(starSelectables);\n            }\n            if (selectables.length === 0) {\n                return false;\n            }\n            var /** @type {?} */ selectable;\n            var /** @type {?} */ result = false;\n            for (var /** @type {?} */ i = 0; i < selectables.length; i++) {\n                selectable = selectables[i];\n                result = selectable.finalize(cssSelector, matchedCallback) || result;\n            }\n            return result;\n        };\n        /**\n         * \\@internal\n         * @param {?} map\n         * @param {?} name\n         * @param {?} cssSelector\n         * @param {?} matchedCallback\n         * @return {?}\n         */\n        SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback) {\n            if (!map || typeof name !== 'string') {\n                return false;\n            }\n            var /** @type {?} */ nestedSelector = map.get(name);\n            if (!nestedSelector) {\n                return false;\n            }\n            // TODO(perf): get rid of recursion and measure again\n            // TODO(perf): don't pass the whole selector into the recursion,\n            // but only the not processed parts\n            return nestedSelector.match(cssSelector, matchedCallback);\n        };\n        return SelectorMatcher;\n    }());\n    var SelectorListContext = (function () {\n        /**\n         * @param {?} selectors\n         */\n        function SelectorListContext(selectors) {\n            this.selectors = selectors;\n            this.alreadyMatched = false;\n        }\n        return SelectorListContext;\n    }());\n    var SelectorContext = (function () {\n        /**\n         * @param {?} selector\n         * @param {?} cbContext\n         * @param {?} listContext\n         */\n        function SelectorContext(selector, cbContext, listContext) {\n            this.selector = selector;\n            this.cbContext = cbContext;\n            this.listContext = listContext;\n            this.notSelectors = selector.notSelectors;\n        }\n        /**\n         * @param {?} cssSelector\n         * @param {?} callback\n         * @return {?}\n         */\n        SelectorContext.prototype.finalize = function (cssSelector, callback) {\n            var /** @type {?} */ result = true;\n            if (this.notSelectors.length > 0 && (!this.listContext || !this.listContext.alreadyMatched)) {\n                var /** @type {?} */ notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);\n                result = !notMatcher.match(cssSelector, null);\n            }\n            if (result && callback && (!this.listContext || !this.listContext.alreadyMatched)) {\n                if (this.listContext) {\n                    this.listContext.alreadyMatched = true;\n                }\n                callback(this.selector, this.cbContext);\n            }\n            return result;\n        };\n        return SelectorContext;\n    }());\n\n    var __extends$3 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * \\@stable\n     */\n    var BaseError = (function (_super) {\n        __extends$3(BaseError, _super);\n        /**\n         * @param {?} message\n         */\n        function BaseError(message) {\n            _super.call(this, message);\n            // Errors don't use current this, instead they create a new instance.\n            // We have to do forward all of our api to the nativeInstance.\n            // TODO(bradfordcsmith): Remove this hack when\n            //     google/closure-compiler/issues/2102 is fixed.\n            var nativeError = new Error(message);\n            this._nativeError = nativeError;\n        }\n        Object.defineProperty(BaseError.prototype, \"message\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.message; },\n            /**\n             * @param {?} message\n             * @return {?}\n             */\n            set: function (message) { this._nativeError.message = message; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"name\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._nativeError.name; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BaseError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return ((this._nativeError)).stack; },\n            /**\n             * @param {?} value\n             * @return {?}\n             */\n            set: function (value) { ((this._nativeError)).stack = value; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n        return BaseError;\n    }(Error));\n    /**\n     * \\@stable\n     */\n    var WrappedError = (function (_super) {\n        __extends$3(WrappedError, _super);\n        /**\n         * @param {?} message\n         * @param {?} error\n         */\n        function WrappedError(message, error) {\n            _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n            this.originalError = error;\n        }\n        Object.defineProperty(WrappedError.prototype, \"stack\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n                    .stack;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return WrappedError;\n    }(BaseError));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$2 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ MODULE_SUFFIX = '';\n    var /** @type {?} */ DASH_CASE_REGEXP = /-+([a-z0-9])/g;\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function dashCaseToCamelCase(input) {\n        return input.replace(DASH_CASE_REGEXP, function () {\n            var m = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                m[_i - 0] = arguments[_i];\n            }\n            return m[1].toUpperCase();\n        });\n    }\n    /**\n     * @param {?} input\n     * @param {?} defaultValues\n     * @return {?}\n     */\n    function splitAtColon(input, defaultValues) {\n        return _splitAt(input, ':', defaultValues);\n    }\n    /**\n     * @param {?} input\n     * @param {?} defaultValues\n     * @return {?}\n     */\n    function splitAtPeriod(input, defaultValues) {\n        return _splitAt(input, '.', defaultValues);\n    }\n    /**\n     * @param {?} input\n     * @param {?} character\n     * @param {?} defaultValues\n     * @return {?}\n     */\n    function _splitAt(input, character, defaultValues) {\n        var /** @type {?} */ characterIndex = input.indexOf(character);\n        if (characterIndex == -1)\n            return defaultValues;\n        return [input.slice(0, characterIndex).trim(), input.slice(characterIndex + 1).trim()];\n    }\n    /**\n     * @param {?} value\n     * @param {?} visitor\n     * @param {?} context\n     * @return {?}\n     */\n    function visitValue(value, visitor, context) {\n        if (Array.isArray(value)) {\n            return visitor.visitArray(/** @type {?} */ (value), context);\n        }\n        if (isStrictStringMap(value)) {\n            return visitor.visitStringMap(/** @type {?} */ (value), context);\n        }\n        if (value == null || isPrimitive(value)) {\n            return visitor.visitPrimitive(value, context);\n        }\n        return visitor.visitOther(value, context);\n    }\n    var ValueTransformer = (function () {\n        function ValueTransformer() {\n        }\n        /**\n         * @param {?} arr\n         * @param {?} context\n         * @return {?}\n         */\n        ValueTransformer.prototype.visitArray = function (arr, context) {\n            var _this = this;\n            return arr.map(function (value) { return visitValue(value, _this, context); });\n        };\n        /**\n         * @param {?} map\n         * @param {?} context\n         * @return {?}\n         */\n        ValueTransformer.prototype.visitStringMap = function (map, context) {\n            var _this = this;\n            var /** @type {?} */ result = {};\n            Object.keys(map).forEach(function (key) { result[key] = visitValue(map[key], _this, context); });\n            return result;\n        };\n        /**\n         * @param {?} value\n         * @param {?} context\n         * @return {?}\n         */\n        ValueTransformer.prototype.visitPrimitive = function (value, context) { return value; };\n        /**\n         * @param {?} value\n         * @param {?} context\n         * @return {?}\n         */\n        ValueTransformer.prototype.visitOther = function (value, context) { return value; };\n        return ValueTransformer;\n    }());\n    var SyncAsyncResult = (function () {\n        /**\n         * @param {?} syncResult\n         * @param {?=} asyncResult\n         */\n        function SyncAsyncResult(syncResult, asyncResult) {\n            if (asyncResult === void 0) { asyncResult = null; }\n            this.syncResult = syncResult;\n            this.asyncResult = asyncResult;\n            if (!asyncResult) {\n                this.asyncResult = Promise.resolve(syncResult);\n            }\n        }\n        return SyncAsyncResult;\n    }());\n    var SyntaxError = (function (_super) {\n        __extends$2(SyntaxError, _super);\n        function SyntaxError() {\n            _super.apply(this, arguments);\n        }\n        return SyntaxError;\n    }(BaseError));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$1 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    // group 0: \"[prop] or (event) or @trigger\"\n    // group 1: \"prop\" from \"[prop]\"\n    // group 2: \"event\" from \"(event)\"\n    // group 3: \"@trigger\" from \"@trigger\"\n    var /** @type {?} */ HOST_REG_EXP = /^(?:(?:\\[([^\\]]+)\\])|(?:\\(([^\\)]+)\\)))|(\\@[-\\w]+)$/;\n    var CompileAnimationEntryMetadata = (function () {\n        /**\n         * @param {?=} name\n         * @param {?=} definitions\n         */\n        function CompileAnimationEntryMetadata(name, definitions) {\n            if (name === void 0) { name = null; }\n            if (definitions === void 0) { definitions = null; }\n            this.name = name;\n            this.definitions = definitions;\n        }\n        return CompileAnimationEntryMetadata;\n    }());\n    /**\n     * @abstract\n     */\n    var CompileAnimationStateMetadata = (function () {\n        function CompileAnimationStateMetadata() {\n        }\n        return CompileAnimationStateMetadata;\n    }());\n    var CompileAnimationStateDeclarationMetadata = (function (_super) {\n        __extends$1(CompileAnimationStateDeclarationMetadata, _super);\n        /**\n         * @param {?} stateNameExpr\n         * @param {?} styles\n         */\n        function CompileAnimationStateDeclarationMetadata(stateNameExpr, styles) {\n            _super.call(this);\n            this.stateNameExpr = stateNameExpr;\n            this.styles = styles;\n        }\n        return CompileAnimationStateDeclarationMetadata;\n    }(CompileAnimationStateMetadata));\n    var CompileAnimationStateTransitionMetadata = (function (_super) {\n        __extends$1(CompileAnimationStateTransitionMetadata, _super);\n        /**\n         * @param {?} stateChangeExpr\n         * @param {?} steps\n         */\n        function CompileAnimationStateTransitionMetadata(stateChangeExpr, steps) {\n            _super.call(this);\n            this.stateChangeExpr = stateChangeExpr;\n            this.steps = steps;\n        }\n        return CompileAnimationStateTransitionMetadata;\n    }(CompileAnimationStateMetadata));\n    /**\n     * @abstract\n     */\n    var CompileAnimationMetadata = (function () {\n        function CompileAnimationMetadata() {\n        }\n        return CompileAnimationMetadata;\n    }());\n    var CompileAnimationKeyframesSequenceMetadata = (function (_super) {\n        __extends$1(CompileAnimationKeyframesSequenceMetadata, _super);\n        /**\n         * @param {?=} steps\n         */\n        function CompileAnimationKeyframesSequenceMetadata(steps) {\n            if (steps === void 0) { steps = []; }\n            _super.call(this);\n            this.steps = steps;\n        }\n        return CompileAnimationKeyframesSequenceMetadata;\n    }(CompileAnimationMetadata));\n    var CompileAnimationStyleMetadata = (function (_super) {\n        __extends$1(CompileAnimationStyleMetadata, _super);\n        /**\n         * @param {?} offset\n         * @param {?=} styles\n         */\n        function CompileAnimationStyleMetadata(offset, styles) {\n            if (styles === void 0) { styles = null; }\n            _super.call(this);\n            this.offset = offset;\n            this.styles = styles;\n        }\n        return CompileAnimationStyleMetadata;\n    }(CompileAnimationMetadata));\n    var CompileAnimationAnimateMetadata = (function (_super) {\n        __extends$1(CompileAnimationAnimateMetadata, _super);\n        /**\n         * @param {?=} timings\n         * @param {?=} styles\n         */\n        function CompileAnimationAnimateMetadata(timings, styles) {\n            if (timings === void 0) { timings = 0; }\n            if (styles === void 0) { styles = null; }\n            _super.call(this);\n            this.timings = timings;\n            this.styles = styles;\n        }\n        return CompileAnimationAnimateMetadata;\n    }(CompileAnimationMetadata));\n    /**\n     * @abstract\n     */\n    var CompileAnimationWithStepsMetadata = (function (_super) {\n        __extends$1(CompileAnimationWithStepsMetadata, _super);\n        /**\n         * @param {?=} steps\n         */\n        function CompileAnimationWithStepsMetadata(steps) {\n            if (steps === void 0) { steps = null; }\n            _super.call(this);\n            this.steps = steps;\n        }\n        return CompileAnimationWithStepsMetadata;\n    }(CompileAnimationMetadata));\n    var CompileAnimationSequenceMetadata = (function (_super) {\n        __extends$1(CompileAnimationSequenceMetadata, _super);\n        /**\n         * @param {?=} steps\n         */\n        function CompileAnimationSequenceMetadata(steps) {\n            if (steps === void 0) { steps = null; }\n            _super.call(this, steps);\n        }\n        return CompileAnimationSequenceMetadata;\n    }(CompileAnimationWithStepsMetadata));\n    var CompileAnimationGroupMetadata = (function (_super) {\n        __extends$1(CompileAnimationGroupMetadata, _super);\n        /**\n         * @param {?=} steps\n         */\n        function CompileAnimationGroupMetadata(steps) {\n            if (steps === void 0) { steps = null; }\n            _super.call(this, steps);\n        }\n        return CompileAnimationGroupMetadata;\n    }(CompileAnimationWithStepsMetadata));\n    /**\n     * @param {?} name\n     * @return {?}\n     */\n    function _sanitizeIdentifier(name) {\n        return name.replace(/\\W/g, '_');\n    }\n    var /** @type {?} */ _anonymousTypeIndex = 0;\n    /**\n     * @param {?} compileIdentifier\n     * @return {?}\n     */\n    function identifierName(compileIdentifier) {\n        if (!compileIdentifier || !compileIdentifier.reference) {\n            return null;\n        }\n        var /** @type {?} */ ref = compileIdentifier.reference;\n        if (ref instanceof StaticSymbol) {\n            return ref.name;\n        }\n        if (ref['__anonymousType']) {\n            return ref['__anonymousType'];\n        }\n        var /** @type {?} */ identifier = stringify(ref);\n        if (identifier.indexOf('(') >= 0) {\n            // case: anonymous functions!\n            identifier = \"anonymous_\" + _anonymousTypeIndex++;\n            ref['__anonymousType'] = identifier;\n        }\n        else {\n            identifier = _sanitizeIdentifier(identifier);\n        }\n        return identifier;\n    }\n    /**\n     * @param {?} compileIdentifier\n     * @return {?}\n     */\n    function identifierModuleUrl(compileIdentifier) {\n        var /** @type {?} */ ref = compileIdentifier.reference;\n        if (ref instanceof StaticSymbol) {\n            return ref.filePath;\n        }\n        return reflector.importUri(ref);\n    }\n    var CompileSummaryKind = {};\n    CompileSummaryKind.Pipe = 0;\n    CompileSummaryKind.Directive = 1;\n    CompileSummaryKind.NgModule = 2;\n    CompileSummaryKind.Injectable = 3;\n    CompileSummaryKind[CompileSummaryKind.Pipe] = \"Pipe\";\n    CompileSummaryKind[CompileSummaryKind.Directive] = \"Directive\";\n    CompileSummaryKind[CompileSummaryKind.NgModule] = \"NgModule\";\n    CompileSummaryKind[CompileSummaryKind.Injectable] = \"Injectable\";\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function tokenName(token) {\n        return isPresent(token.value) ? _sanitizeIdentifier(token.value) :\n            identifierName(token.identifier);\n    }\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function tokenReference(token) {\n        if (isPresent(token.identifier)) {\n            return token.identifier.reference;\n        }\n        else {\n            return token.value;\n        }\n    }\n    /**\n     * Metadata about a stylesheet\n     */\n    var CompileStylesheetMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompileStylesheetMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, moduleUrl = _b.moduleUrl, styles = _b.styles, styleUrls = _b.styleUrls;\n            this.moduleUrl = moduleUrl;\n            this.styles = _normalizeArray(styles);\n            this.styleUrls = _normalizeArray(styleUrls);\n        }\n        return CompileStylesheetMetadata;\n    }());\n    /**\n     * Metadata regarding compilation of a template.\n     */\n    var CompileTemplateMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompileTemplateMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, externalStylesheets = _b.externalStylesheets, animations = _b.animations, ngContentSelectors = _b.ngContentSelectors, interpolation = _b.interpolation;\n            this.encapsulation = encapsulation;\n            this.template = template;\n            this.templateUrl = templateUrl;\n            this.styles = _normalizeArray(styles);\n            this.styleUrls = _normalizeArray(styleUrls);\n            this.externalStylesheets = _normalizeArray(externalStylesheets);\n            this.animations = animations ? ListWrapper.flatten(animations) : [];\n            this.ngContentSelectors = ngContentSelectors || [];\n            if (interpolation && interpolation.length != 2) {\n                throw new Error(\"'interpolation' should have a start and an end symbol.\");\n            }\n            this.interpolation = interpolation;\n        }\n        /**\n         * @return {?}\n         */\n        CompileTemplateMetadata.prototype.toSummary = function () {\n            return {\n                animations: this.animations.map(function (anim) { return anim.name; }),\n                ngContentSelectors: this.ngContentSelectors,\n                encapsulation: this.encapsulation\n            };\n        };\n        return CompileTemplateMetadata;\n    }());\n    /**\n     * Metadata regarding compilation of a directive.\n     */\n    var CompileDirectiveMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompileDirectiveMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, isHost = _b.isHost, type = _b.type, isComponent = _b.isComponent, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, hostListeners = _b.hostListeners, hostProperties = _b.hostProperties, hostAttributes = _b.hostAttributes, providers = _b.providers, viewProviders = _b.viewProviders, queries = _b.queries, viewQueries = _b.viewQueries, entryComponents = _b.entryComponents, template = _b.template;\n            this.isHost = !!isHost;\n            this.type = type;\n            this.isComponent = isComponent;\n            this.selector = selector;\n            this.exportAs = exportAs;\n            this.changeDetection = changeDetection;\n            this.inputs = inputs;\n            this.outputs = outputs;\n            this.hostListeners = hostListeners;\n            this.hostProperties = hostProperties;\n            this.hostAttributes = hostAttributes;\n            this.providers = _normalizeArray(providers);\n            this.viewProviders = _normalizeArray(viewProviders);\n            this.queries = _normalizeArray(queries);\n            this.viewQueries = _normalizeArray(viewQueries);\n            this.entryComponents = _normalizeArray(entryComponents);\n            this.template = template;\n        }\n        /**\n         * @param {?=} __0\n         * @return {?}\n         */\n        CompileDirectiveMetadata.create = function (_a) {\n            var _b = _a === void 0 ? {} : _a, isHost = _b.isHost, type = _b.type, isComponent = _b.isComponent, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, host = _b.host, providers = _b.providers, viewProviders = _b.viewProviders, queries = _b.queries, viewQueries = _b.viewQueries, entryComponents = _b.entryComponents, template = _b.template;\n            var /** @type {?} */ hostListeners = {};\n            var /** @type {?} */ hostProperties = {};\n            var /** @type {?} */ hostAttributes = {};\n            if (isPresent(host)) {\n                Object.keys(host).forEach(function (key) {\n                    var /** @type {?} */ value = host[key];\n                    var /** @type {?} */ matches = key.match(HOST_REG_EXP);\n                    if (matches === null) {\n                        hostAttributes[key] = value;\n                    }\n                    else if (isPresent(matches[1])) {\n                        hostProperties[matches[1]] = value;\n                    }\n                    else if (isPresent(matches[2])) {\n                        hostListeners[matches[2]] = value;\n                    }\n                });\n            }\n            var /** @type {?} */ inputsMap = {};\n            if (isPresent(inputs)) {\n                inputs.forEach(function (bindConfig) {\n                    // canonical syntax: `dirProp: elProp`\n                    // if there is no `:`, use dirProp = elProp\n                    var /** @type {?} */ parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);\n                    inputsMap[parts[0]] = parts[1];\n                });\n            }\n            var /** @type {?} */ outputsMap = {};\n            if (isPresent(outputs)) {\n                outputs.forEach(function (bindConfig) {\n                    // canonical syntax: `dirProp: elProp`\n                    // if there is no `:`, use dirProp = elProp\n                    var /** @type {?} */ parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);\n                    outputsMap[parts[0]] = parts[1];\n                });\n            }\n            return new CompileDirectiveMetadata({\n                isHost: isHost,\n                type: type,\n                isComponent: !!isComponent, selector: selector, exportAs: exportAs, changeDetection: changeDetection,\n                inputs: inputsMap,\n                outputs: outputsMap,\n                hostListeners: hostListeners,\n                hostProperties: hostProperties,\n                hostAttributes: hostAttributes,\n                providers: providers,\n                viewProviders: viewProviders,\n                queries: queries,\n                viewQueries: viewQueries,\n                entryComponents: entryComponents,\n                template: template,\n            });\n        };\n        /**\n         * @return {?}\n         */\n        CompileDirectiveMetadata.prototype.toSummary = function () {\n            return {\n                summaryKind: CompileSummaryKind.Directive,\n                type: this.type,\n                isComponent: this.isComponent,\n                selector: this.selector,\n                exportAs: this.exportAs,\n                inputs: this.inputs,\n                outputs: this.outputs,\n                hostListeners: this.hostListeners,\n                hostProperties: this.hostProperties,\n                hostAttributes: this.hostAttributes,\n                providers: this.providers,\n                viewProviders: this.viewProviders,\n                queries: this.queries,\n                entryComponents: this.entryComponents,\n                changeDetection: this.changeDetection,\n                template: this.template && this.template.toSummary()\n            };\n        };\n        return CompileDirectiveMetadata;\n    }());\n    /**\n     * Construct {\\@link CompileDirectiveMetadata} from {\\@link ComponentTypeMetadata} and a selector.\n     * @param {?} typeReference\n     * @param {?} compMeta\n     * @return {?}\n     */\n    function createHostComponentMeta(typeReference, compMeta) {\n        var /** @type {?} */ template = CssSelector.parse(compMeta.selector)[0].getMatchingElementTemplate();\n        return CompileDirectiveMetadata.create({\n            isHost: true,\n            type: { reference: typeReference, diDeps: [], lifecycleHooks: [] },\n            template: new CompileTemplateMetadata({\n                encapsulation: _angular_core.ViewEncapsulation.None,\n                template: template,\n                templateUrl: '',\n                styles: [],\n                styleUrls: [],\n                ngContentSelectors: [],\n                animations: []\n            }),\n            changeDetection: _angular_core.ChangeDetectionStrategy.Default,\n            inputs: [],\n            outputs: [],\n            host: {},\n            isComponent: true,\n            selector: '*',\n            providers: [],\n            viewProviders: [],\n            queries: [],\n            viewQueries: []\n        });\n    }\n    var CompilePipeMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompilePipeMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, type = _b.type, name = _b.name, pure = _b.pure;\n            this.type = type;\n            this.name = name;\n            this.pure = !!pure;\n        }\n        /**\n         * @return {?}\n         */\n        CompilePipeMetadata.prototype.toSummary = function () {\n            return {\n                summaryKind: CompileSummaryKind.Pipe,\n                type: this.type,\n                name: this.name,\n                pure: this.pure\n            };\n        };\n        return CompilePipeMetadata;\n    }());\n    /**\n     * Metadata regarding compilation of a module.\n     */\n    var CompileNgModuleMetadata = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompileNgModuleMetadata(_a) {\n            var _b = _a === void 0 ? {} : _a, type = _b.type, providers = _b.providers, declaredDirectives = _b.declaredDirectives, exportedDirectives = _b.exportedDirectives, declaredPipes = _b.declaredPipes, exportedPipes = _b.exportedPipes, entryComponents = _b.entryComponents, bootstrapComponents = _b.bootstrapComponents, importedModules = _b.importedModules, exportedModules = _b.exportedModules, schemas = _b.schemas, transitiveModule = _b.transitiveModule, id = _b.id;\n            this.type = type;\n            this.declaredDirectives = _normalizeArray(declaredDirectives);\n            this.exportedDirectives = _normalizeArray(exportedDirectives);\n            this.declaredPipes = _normalizeArray(declaredPipes);\n            this.exportedPipes = _normalizeArray(exportedPipes);\n            this.providers = _normalizeArray(providers);\n            this.entryComponents = _normalizeArray(entryComponents);\n            this.bootstrapComponents = _normalizeArray(bootstrapComponents);\n            this.importedModules = _normalizeArray(importedModules);\n            this.exportedModules = _normalizeArray(exportedModules);\n            this.schemas = _normalizeArray(schemas);\n            this.id = id;\n            this.transitiveModule = transitiveModule;\n        }\n        /**\n         * @return {?}\n         */\n        CompileNgModuleMetadata.prototype.toSummary = function () {\n            return {\n                summaryKind: CompileSummaryKind.NgModule,\n                type: this.type,\n                entryComponents: this.transitiveModule.entryComponents,\n                providers: this.transitiveModule.providers,\n                modules: this.transitiveModule.modules,\n                exportedDirectives: this.transitiveModule.exportedDirectives,\n                exportedPipes: this.transitiveModule.exportedPipes\n            };\n        };\n        return CompileNgModuleMetadata;\n    }());\n    var TransitiveCompileNgModuleMetadata = (function () {\n        function TransitiveCompileNgModuleMetadata() {\n            this.directivesSet = new Set();\n            this.directives = [];\n            this.exportedDirectivesSet = new Set();\n            this.exportedDirectives = [];\n            this.pipesSet = new Set();\n            this.pipes = [];\n            this.exportedPipesSet = new Set();\n            this.exportedPipes = [];\n            this.modulesSet = new Set();\n            this.modules = [];\n            this.entryComponentsSet = new Set();\n            this.entryComponents = [];\n            this.providers = [];\n        }\n        /**\n         * @param {?} provider\n         * @param {?} module\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addProvider = function (provider, module) {\n            this.providers.push({ provider: provider, module: module });\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addDirective = function (id) {\n            if (!this.directivesSet.has(id.reference)) {\n                this.directivesSet.add(id.reference);\n                this.directives.push(id);\n            }\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addExportedDirective = function (id) {\n            if (!this.exportedDirectivesSet.has(id.reference)) {\n                this.exportedDirectivesSet.add(id.reference);\n                this.exportedDirectives.push(id);\n            }\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addPipe = function (id) {\n            if (!this.pipesSet.has(id.reference)) {\n                this.pipesSet.add(id.reference);\n                this.pipes.push(id);\n            }\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addExportedPipe = function (id) {\n            if (!this.exportedPipesSet.has(id.reference)) {\n                this.exportedPipesSet.add(id.reference);\n                this.exportedPipes.push(id);\n            }\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addModule = function (id) {\n            if (!this.modulesSet.has(id.reference)) {\n                this.modulesSet.add(id.reference);\n                this.modules.push(id);\n            }\n        };\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        TransitiveCompileNgModuleMetadata.prototype.addEntryComponent = function (id) {\n            if (!this.entryComponentsSet.has(id.reference)) {\n                this.entryComponentsSet.add(id.reference);\n                this.entryComponents.push(id);\n            }\n        };\n        return TransitiveCompileNgModuleMetadata;\n    }());\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function _normalizeArray(obj) {\n        return obj || [];\n    }\n    var ProviderMeta = (function () {\n        /**\n         * @param {?} token\n         * @param {?} __1\n         */\n        function ProviderMeta(token, _a) {\n            var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;\n            this.token = token;\n            this.useClass = useClass;\n            this.useValue = useValue;\n            this.useExisting = useExisting;\n            this.useFactory = useFactory;\n            this.dependencies = deps;\n            this.multi = !!multi;\n        }\n        return ProviderMeta;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ $EOF = 0;\n    var /** @type {?} */ $TAB = 9;\n    var /** @type {?} */ $LF = 10;\n    var /** @type {?} */ $VTAB = 11;\n    var /** @type {?} */ $FF = 12;\n    var /** @type {?} */ $CR = 13;\n    var /** @type {?} */ $SPACE = 32;\n    var /** @type {?} */ $BANG = 33;\n    var /** @type {?} */ $DQ = 34;\n    var /** @type {?} */ $HASH = 35;\n    var /** @type {?} */ $$ = 36;\n    var /** @type {?} */ $PERCENT = 37;\n    var /** @type {?} */ $AMPERSAND = 38;\n    var /** @type {?} */ $SQ = 39;\n    var /** @type {?} */ $LPAREN = 40;\n    var /** @type {?} */ $RPAREN = 41;\n    var /** @type {?} */ $STAR = 42;\n    var /** @type {?} */ $PLUS = 43;\n    var /** @type {?} */ $COMMA = 44;\n    var /** @type {?} */ $MINUS = 45;\n    var /** @type {?} */ $PERIOD = 46;\n    var /** @type {?} */ $SLASH = 47;\n    var /** @type {?} */ $COLON = 58;\n    var /** @type {?} */ $SEMICOLON = 59;\n    var /** @type {?} */ $LT = 60;\n    var /** @type {?} */ $EQ = 61;\n    var /** @type {?} */ $GT = 62;\n    var /** @type {?} */ $QUESTION = 63;\n    var /** @type {?} */ $0 = 48;\n    var /** @type {?} */ $9 = 57;\n    var /** @type {?} */ $A = 65;\n    var /** @type {?} */ $E = 69;\n    var /** @type {?} */ $F = 70;\n    var /** @type {?} */ $X = 88;\n    var /** @type {?} */ $Z = 90;\n    var /** @type {?} */ $LBRACKET = 91;\n    var /** @type {?} */ $BACKSLASH = 92;\n    var /** @type {?} */ $RBRACKET = 93;\n    var /** @type {?} */ $CARET = 94;\n    var /** @type {?} */ $_ = 95;\n    var /** @type {?} */ $a = 97;\n    var /** @type {?} */ $e = 101;\n    var /** @type {?} */ $f = 102;\n    var /** @type {?} */ $n = 110;\n    var /** @type {?} */ $r = 114;\n    var /** @type {?} */ $t = 116;\n    var /** @type {?} */ $u = 117;\n    var /** @type {?} */ $v = 118;\n    var /** @type {?} */ $x = 120;\n    var /** @type {?} */ $z = 122;\n    var /** @type {?} */ $LBRACE = 123;\n    var /** @type {?} */ $BAR = 124;\n    var /** @type {?} */ $RBRACE = 125;\n    var /** @type {?} */ $NBSP = 160;\n    var /** @type {?} */ $BT = 96;\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isWhitespace(code) {\n        return (code >= $TAB && code <= $SPACE) || (code == $NBSP);\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isDigit(code) {\n        return $0 <= code && code <= $9;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isAsciiLetter(code) {\n        return code >= $a && code <= $z || code >= $A && code <= $Z;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isAsciiHexDigit(code) {\n        return code >= $a && code <= $f || code >= $A && code <= $F || isDigit(code);\n    }\n\n    /**\n     * A replacement for \\@Injectable to be used in the compiler, so that\n     * we don't try to evaluate the metadata in the compiler during AoT.\n     * This decorator is enough to make the compiler work with the ReflectiveInjector though.\n     * @return {?}\n     */\n    function CompilerInjectable() {\n        return function (x) { return x; };\n    }\n\n    /**\n     * @param {?} identifier\n     * @param {?} value\n     * @return {?}\n     */\n    function assertArrayOfStrings(identifier, value) {\n        if (!_angular_core.isDevMode() || isBlank(value)) {\n            return;\n        }\n        if (!Array.isArray(value)) {\n            throw new Error(\"Expected '\" + identifier + \"' to be an array of strings.\");\n        }\n        for (var /** @type {?} */ i = 0; i < value.length; i += 1) {\n            if (typeof value[i] !== 'string') {\n                throw new Error(\"Expected '\" + identifier + \"' to be an array of strings.\");\n            }\n        }\n    }\n    var /** @type {?} */ INTERPOLATION_BLACKLIST_REGEXPS = [\n        /^\\s*$/,\n        /[<>]/,\n        /^[{}]$/,\n        /&(#|[a-z])/i,\n        /^\\/\\//,\n    ];\n    /**\n     * @param {?} identifier\n     * @param {?} value\n     * @return {?}\n     */\n    function assertInterpolationSymbols(identifier, value) {\n        if (isPresent(value) && !(Array.isArray(value) && value.length == 2)) {\n            throw new Error(\"Expected '\" + identifier + \"' to be an array, [start, end].\");\n        }\n        else if (_angular_core.isDevMode() && !isBlank(value)) {\n            var /** @type {?} */ start_1 = (value[0]);\n            var /** @type {?} */ end_1 = (value[1]);\n            // black list checking\n            INTERPOLATION_BLACKLIST_REGEXPS.forEach(function (regexp) {\n                if (regexp.test(start_1) || regexp.test(end_1)) {\n                    throw new Error(\"['\" + start_1 + \"', '\" + end_1 + \"'] contains unusable interpolation symbol.\");\n                }\n            });\n        }\n    }\n\n    var InterpolationConfig = (function () {\n        /**\n         * @param {?} start\n         * @param {?} end\n         */\n        function InterpolationConfig(start, end) {\n            this.start = start;\n            this.end = end;\n        }\n        /**\n         * @param {?} markers\n         * @return {?}\n         */\n        InterpolationConfig.fromArray = function (markers) {\n            if (!markers) {\n                return DEFAULT_INTERPOLATION_CONFIG;\n            }\n            assertInterpolationSymbols('interpolation', markers);\n            return new InterpolationConfig(markers[0], markers[1]);\n        };\n        ;\n        return InterpolationConfig;\n    }());\n    var /** @type {?} */ DEFAULT_INTERPOLATION_CONFIG = new InterpolationConfig('{{', '}}');\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$4 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var ParserError = (function () {\n        /**\n         * @param {?} message\n         * @param {?} input\n         * @param {?} errLocation\n         * @param {?=} ctxLocation\n         */\n        function ParserError(message, input, errLocation, ctxLocation) {\n            this.input = input;\n            this.errLocation = errLocation;\n            this.ctxLocation = ctxLocation;\n            this.message = \"Parser Error: \" + message + \" \" + errLocation + \" [\" + input + \"] in \" + ctxLocation;\n        }\n        return ParserError;\n    }());\n    var ParseSpan = (function () {\n        /**\n         * @param {?} start\n         * @param {?} end\n         */\n        function ParseSpan(start, end) {\n            this.start = start;\n            this.end = end;\n        }\n        return ParseSpan;\n    }());\n    var AST = (function () {\n        /**\n         * @param {?} span\n         */\n        function AST(span) {\n            this.span = span;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        AST.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return null;\n        };\n        /**\n         * @return {?}\n         */\n        AST.prototype.toString = function () { return 'AST'; };\n        return AST;\n    }());\n    /**\n     * Represents a quoted expression of the form:\n     *\n     * quote = prefix `:` uninterpretedExpression\n     * prefix = identifier\n     * uninterpretedExpression = arbitrary string\n     *\n     * A quoted expression is meant to be pre-processed by an AST transformer that\n     * converts it into another AST that no longer contains quoted expressions.\n     * It is meant to allow third-party developers to extend Angular template\n     * expression language. The `uninterpretedExpression` part of the quote is\n     * therefore not interpreted by the Angular's own expression parser.\n     */\n    var Quote = (function (_super) {\n        __extends$4(Quote, _super);\n        /**\n         * @param {?} span\n         * @param {?} prefix\n         * @param {?} uninterpretedExpression\n         * @param {?} location\n         */\n        function Quote(span, prefix, uninterpretedExpression, location) {\n            _super.call(this, span);\n            this.prefix = prefix;\n            this.uninterpretedExpression = uninterpretedExpression;\n            this.location = location;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Quote.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitQuote(this, context);\n        };\n        /**\n         * @return {?}\n         */\n        Quote.prototype.toString = function () { return 'Quote'; };\n        return Quote;\n    }(AST));\n    var EmptyExpr = (function (_super) {\n        __extends$4(EmptyExpr, _super);\n        function EmptyExpr() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        EmptyExpr.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            // do nothing\n        };\n        return EmptyExpr;\n    }(AST));\n    var ImplicitReceiver = (function (_super) {\n        __extends$4(ImplicitReceiver, _super);\n        function ImplicitReceiver() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        ImplicitReceiver.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitImplicitReceiver(this, context);\n        };\n        return ImplicitReceiver;\n    }(AST));\n    /**\n     * Multiple expressions separated by a semicolon.\n     */\n    var Chain = (function (_super) {\n        __extends$4(Chain, _super);\n        /**\n         * @param {?} span\n         * @param {?} expressions\n         */\n        function Chain(span, expressions) {\n            _super.call(this, span);\n            this.expressions = expressions;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Chain.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitChain(this, context);\n        };\n        return Chain;\n    }(AST));\n    var Conditional = (function (_super) {\n        __extends$4(Conditional, _super);\n        /**\n         * @param {?} span\n         * @param {?} condition\n         * @param {?} trueExp\n         * @param {?} falseExp\n         */\n        function Conditional(span, condition, trueExp, falseExp) {\n            _super.call(this, span);\n            this.condition = condition;\n            this.trueExp = trueExp;\n            this.falseExp = falseExp;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Conditional.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitConditional(this, context);\n        };\n        return Conditional;\n    }(AST));\n    var PropertyRead = (function (_super) {\n        __extends$4(PropertyRead, _super);\n        /**\n         * @param {?} span\n         * @param {?} receiver\n         * @param {?} name\n         */\n        function PropertyRead(span, receiver, name) {\n            _super.call(this, span);\n            this.receiver = receiver;\n            this.name = name;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        PropertyRead.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitPropertyRead(this, context);\n        };\n        return PropertyRead;\n    }(AST));\n    var PropertyWrite = (function (_super) {\n        __extends$4(PropertyWrite, _super);\n        /**\n         * @param {?} span\n         * @param {?} receiver\n         * @param {?} name\n         * @param {?} value\n         */\n        function PropertyWrite(span, receiver, name, value) {\n            _super.call(this, span);\n            this.receiver = receiver;\n            this.name = name;\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        PropertyWrite.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitPropertyWrite(this, context);\n        };\n        return PropertyWrite;\n    }(AST));\n    var SafePropertyRead = (function (_super) {\n        __extends$4(SafePropertyRead, _super);\n        /**\n         * @param {?} span\n         * @param {?} receiver\n         * @param {?} name\n         */\n        function SafePropertyRead(span, receiver, name) {\n            _super.call(this, span);\n            this.receiver = receiver;\n            this.name = name;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        SafePropertyRead.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitSafePropertyRead(this, context);\n        };\n        return SafePropertyRead;\n    }(AST));\n    var KeyedRead = (function (_super) {\n        __extends$4(KeyedRead, _super);\n        /**\n         * @param {?} span\n         * @param {?} obj\n         * @param {?} key\n         */\n        function KeyedRead(span, obj, key) {\n            _super.call(this, span);\n            this.obj = obj;\n            this.key = key;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        KeyedRead.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitKeyedRead(this, context);\n        };\n        return KeyedRead;\n    }(AST));\n    var KeyedWrite = (function (_super) {\n        __extends$4(KeyedWrite, _super);\n        /**\n         * @param {?} span\n         * @param {?} obj\n         * @param {?} key\n         * @param {?} value\n         */\n        function KeyedWrite(span, obj, key, value) {\n            _super.call(this, span);\n            this.obj = obj;\n            this.key = key;\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        KeyedWrite.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitKeyedWrite(this, context);\n        };\n        return KeyedWrite;\n    }(AST));\n    var BindingPipe = (function (_super) {\n        __extends$4(BindingPipe, _super);\n        /**\n         * @param {?} span\n         * @param {?} exp\n         * @param {?} name\n         * @param {?} args\n         */\n        function BindingPipe(span, exp, name, args) {\n            _super.call(this, span);\n            this.exp = exp;\n            this.name = name;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        BindingPipe.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitPipe(this, context);\n        };\n        return BindingPipe;\n    }(AST));\n    var LiteralPrimitive = (function (_super) {\n        __extends$4(LiteralPrimitive, _super);\n        /**\n         * @param {?} span\n         * @param {?} value\n         */\n        function LiteralPrimitive(span, value) {\n            _super.call(this, span);\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        LiteralPrimitive.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitLiteralPrimitive(this, context);\n        };\n        return LiteralPrimitive;\n    }(AST));\n    var LiteralArray = (function (_super) {\n        __extends$4(LiteralArray, _super);\n        /**\n         * @param {?} span\n         * @param {?} expressions\n         */\n        function LiteralArray(span, expressions) {\n            _super.call(this, span);\n            this.expressions = expressions;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        LiteralArray.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitLiteralArray(this, context);\n        };\n        return LiteralArray;\n    }(AST));\n    var LiteralMap = (function (_super) {\n        __extends$4(LiteralMap, _super);\n        /**\n         * @param {?} span\n         * @param {?} keys\n         * @param {?} values\n         */\n        function LiteralMap(span, keys, values) {\n            _super.call(this, span);\n            this.keys = keys;\n            this.values = values;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        LiteralMap.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitLiteralMap(this, context);\n        };\n        return LiteralMap;\n    }(AST));\n    var Interpolation = (function (_super) {\n        __extends$4(Interpolation, _super);\n        /**\n         * @param {?} span\n         * @param {?} strings\n         * @param {?} expressions\n         */\n        function Interpolation(span, strings, expressions) {\n            _super.call(this, span);\n            this.strings = strings;\n            this.expressions = expressions;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Interpolation.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitInterpolation(this, context);\n        };\n        return Interpolation;\n    }(AST));\n    var Binary = (function (_super) {\n        __extends$4(Binary, _super);\n        /**\n         * @param {?} span\n         * @param {?} operation\n         * @param {?} left\n         * @param {?} right\n         */\n        function Binary(span, operation, left, right) {\n            _super.call(this, span);\n            this.operation = operation;\n            this.left = left;\n            this.right = right;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Binary.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitBinary(this, context);\n        };\n        return Binary;\n    }(AST));\n    var PrefixNot = (function (_super) {\n        __extends$4(PrefixNot, _super);\n        /**\n         * @param {?} span\n         * @param {?} expression\n         */\n        function PrefixNot(span, expression) {\n            _super.call(this, span);\n            this.expression = expression;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        PrefixNot.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitPrefixNot(this, context);\n        };\n        return PrefixNot;\n    }(AST));\n    var MethodCall = (function (_super) {\n        __extends$4(MethodCall, _super);\n        /**\n         * @param {?} span\n         * @param {?} receiver\n         * @param {?} name\n         * @param {?} args\n         */\n        function MethodCall(span, receiver, name, args) {\n            _super.call(this, span);\n            this.receiver = receiver;\n            this.name = name;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        MethodCall.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitMethodCall(this, context);\n        };\n        return MethodCall;\n    }(AST));\n    var SafeMethodCall = (function (_super) {\n        __extends$4(SafeMethodCall, _super);\n        /**\n         * @param {?} span\n         * @param {?} receiver\n         * @param {?} name\n         * @param {?} args\n         */\n        function SafeMethodCall(span, receiver, name, args) {\n            _super.call(this, span);\n            this.receiver = receiver;\n            this.name = name;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        SafeMethodCall.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitSafeMethodCall(this, context);\n        };\n        return SafeMethodCall;\n    }(AST));\n    var FunctionCall = (function (_super) {\n        __extends$4(FunctionCall, _super);\n        /**\n         * @param {?} span\n         * @param {?} target\n         * @param {?} args\n         */\n        function FunctionCall(span, target, args) {\n            _super.call(this, span);\n            this.target = target;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        FunctionCall.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return visitor.visitFunctionCall(this, context);\n        };\n        return FunctionCall;\n    }(AST));\n    var ASTWithSource = (function (_super) {\n        __extends$4(ASTWithSource, _super);\n        /**\n         * @param {?} ast\n         * @param {?} source\n         * @param {?} location\n         * @param {?} errors\n         */\n        function ASTWithSource(ast, source, location, errors) {\n            _super.call(this, new ParseSpan(0, isBlank(source) ? 0 : source.length));\n            this.ast = ast;\n            this.source = source;\n            this.location = location;\n            this.errors = errors;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        ASTWithSource.prototype.visit = function (visitor, context) {\n            if (context === void 0) { context = null; }\n            return this.ast.visit(visitor, context);\n        };\n        /**\n         * @return {?}\n         */\n        ASTWithSource.prototype.toString = function () { return this.source + \" in \" + this.location; };\n        return ASTWithSource;\n    }(AST));\n    var TemplateBinding = (function () {\n        /**\n         * @param {?} span\n         * @param {?} key\n         * @param {?} keyIsVar\n         * @param {?} name\n         * @param {?} expression\n         */\n        function TemplateBinding(span, key, keyIsVar, name, expression) {\n            this.span = span;\n            this.key = key;\n            this.keyIsVar = keyIsVar;\n            this.name = name;\n            this.expression = expression;\n        }\n        return TemplateBinding;\n    }());\n    var RecursiveAstVisitor = (function () {\n        function RecursiveAstVisitor() {\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitBinary = function (ast, context) {\n            ast.left.visit(this);\n            ast.right.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitChain = function (ast, context) { return this.visitAll(ast.expressions, context); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitConditional = function (ast, context) {\n            ast.condition.visit(this);\n            ast.trueExp.visit(this);\n            ast.falseExp.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitPipe = function (ast, context) {\n            ast.exp.visit(this);\n            this.visitAll(ast.args, context);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitFunctionCall = function (ast, context) {\n            ast.target.visit(this);\n            this.visitAll(ast.args, context);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitInterpolation = function (ast, context) {\n            return this.visitAll(ast.expressions, context);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitKeyedRead = function (ast, context) {\n            ast.obj.visit(this);\n            ast.key.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast, context) {\n            ast.obj.visit(this);\n            ast.key.visit(this);\n            ast.value.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitLiteralArray = function (ast, context) {\n            return this.visitAll(ast.expressions, context);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitLiteralMap = function (ast, context) { return this.visitAll(ast.values, context); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitMethodCall = function (ast, context) {\n            ast.receiver.visit(this);\n            return this.visitAll(ast.args, context);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitPrefixNot = function (ast, context) {\n            ast.expression.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitPropertyRead = function (ast, context) {\n            ast.receiver.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast, context) {\n            ast.receiver.visit(this);\n            ast.value.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast, context) {\n            ast.receiver.visit(this);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast, context) {\n            ast.receiver.visit(this);\n            return this.visitAll(ast.args, context);\n        };\n        /**\n         * @param {?} asts\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitAll = function (asts, context) {\n            var _this = this;\n            asts.forEach(function (ast) { return ast.visit(_this, context); });\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveAstVisitor.prototype.visitQuote = function (ast, context) { return null; };\n        return RecursiveAstVisitor;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$2 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$2 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var TokenType = {};\n    TokenType.Character = 0;\n    TokenType.Identifier = 1;\n    TokenType.Keyword = 2;\n    TokenType.String = 3;\n    TokenType.Operator = 4;\n    TokenType.Number = 5;\n    TokenType.Error = 6;\n    TokenType[TokenType.Character] = \"Character\";\n    TokenType[TokenType.Identifier] = \"Identifier\";\n    TokenType[TokenType.Keyword] = \"Keyword\";\n    TokenType[TokenType.String] = \"String\";\n    TokenType[TokenType.Operator] = \"Operator\";\n    TokenType[TokenType.Number] = \"Number\";\n    TokenType[TokenType.Error] = \"Error\";\n    var /** @type {?} */ KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];\n    var Lexer = (function () {\n        function Lexer() {\n        }\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        Lexer.prototype.tokenize = function (text) {\n            var /** @type {?} */ scanner = new _Scanner(text);\n            var /** @type {?} */ tokens = [];\n            var /** @type {?} */ token = scanner.scanToken();\n            while (token != null) {\n                tokens.push(token);\n                token = scanner.scanToken();\n            }\n            return tokens;\n        };\n        Lexer = __decorate$2([\n            CompilerInjectable(), \n            __metadata$2('design:paramtypes', [])\n        ], Lexer);\n        return Lexer;\n    }());\n    var Token = (function () {\n        /**\n         * @param {?} index\n         * @param {?} type\n         * @param {?} numValue\n         * @param {?} strValue\n         */\n        function Token(index, type, numValue, strValue) {\n            this.index = index;\n            this.type = type;\n            this.numValue = numValue;\n            this.strValue = strValue;\n        }\n        /**\n         * @param {?} code\n         * @return {?}\n         */\n        Token.prototype.isCharacter = function (code) {\n            return this.type == TokenType.Character && this.numValue == code;\n        };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isNumber = function () { return this.type == TokenType.Number; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isString = function () { return this.type == TokenType.String; };\n        /**\n         * @param {?} operater\n         * @return {?}\n         */\n        Token.prototype.isOperator = function (operater) {\n            return this.type == TokenType.Operator && this.strValue == operater;\n        };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isIdentifier = function () { return this.type == TokenType.Identifier; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeyword = function () { return this.type == TokenType.Keyword; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordLet = function () { return this.type == TokenType.Keyword && this.strValue == 'let'; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordNull = function () { return this.type == TokenType.Keyword && this.strValue == 'null'; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordUndefined = function () {\n            return this.type == TokenType.Keyword && this.strValue == 'undefined';\n        };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordTrue = function () { return this.type == TokenType.Keyword && this.strValue == 'true'; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordFalse = function () { return this.type == TokenType.Keyword && this.strValue == 'false'; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isKeywordThis = function () { return this.type == TokenType.Keyword && this.strValue == 'this'; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.isError = function () { return this.type == TokenType.Error; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.toNumber = function () { return this.type == TokenType.Number ? this.numValue : -1; };\n        /**\n         * @return {?}\n         */\n        Token.prototype.toString = function () {\n            switch (this.type) {\n                case TokenType.Character:\n                case TokenType.Identifier:\n                case TokenType.Keyword:\n                case TokenType.Operator:\n                case TokenType.String:\n                case TokenType.Error:\n                    return this.strValue;\n                case TokenType.Number:\n                    return this.numValue.toString();\n                default:\n                    return null;\n            }\n        };\n        return Token;\n    }());\n    /**\n     * @param {?} index\n     * @param {?} code\n     * @return {?}\n     */\n    function newCharacterToken(index, code) {\n        return new Token(index, TokenType.Character, code, String.fromCharCode(code));\n    }\n    /**\n     * @param {?} index\n     * @param {?} text\n     * @return {?}\n     */\n    function newIdentifierToken(index, text) {\n        return new Token(index, TokenType.Identifier, 0, text);\n    }\n    /**\n     * @param {?} index\n     * @param {?} text\n     * @return {?}\n     */\n    function newKeywordToken(index, text) {\n        return new Token(index, TokenType.Keyword, 0, text);\n    }\n    /**\n     * @param {?} index\n     * @param {?} text\n     * @return {?}\n     */\n    function newOperatorToken(index, text) {\n        return new Token(index, TokenType.Operator, 0, text);\n    }\n    /**\n     * @param {?} index\n     * @param {?} text\n     * @return {?}\n     */\n    function newStringToken(index, text) {\n        return new Token(index, TokenType.String, 0, text);\n    }\n    /**\n     * @param {?} index\n     * @param {?} n\n     * @return {?}\n     */\n    function newNumberToken(index, n) {\n        return new Token(index, TokenType.Number, n, '');\n    }\n    /**\n     * @param {?} index\n     * @param {?} message\n     * @return {?}\n     */\n    function newErrorToken(index, message) {\n        return new Token(index, TokenType.Error, 0, message);\n    }\n    var /** @type {?} */ EOF = new Token(-1, TokenType.Character, 0, '');\n    var _Scanner = (function () {\n        /**\n         * @param {?} input\n         */\n        function _Scanner(input) {\n            this.input = input;\n            this.peek = 0;\n            this.index = -1;\n            this.length = input.length;\n            this.advance();\n        }\n        /**\n         * @return {?}\n         */\n        _Scanner.prototype.advance = function () {\n            this.peek = ++this.index >= this.length ? $EOF : this.input.charCodeAt(this.index);\n        };\n        /**\n         * @return {?}\n         */\n        _Scanner.prototype.scanToken = function () {\n            var /** @type {?} */ input = this.input, /** @type {?} */ length = this.length;\n            var /** @type {?} */ peek = this.peek, /** @type {?} */ index = this.index;\n            // Skip whitespace.\n            while (peek <= $SPACE) {\n                if (++index >= length) {\n                    peek = $EOF;\n                    break;\n                }\n                else {\n                    peek = input.charCodeAt(index);\n                }\n            }\n            this.peek = peek;\n            this.index = index;\n            if (index >= length) {\n                return null;\n            }\n            // Handle identifiers and numbers.\n            if (isIdentifierStart(peek))\n                return this.scanIdentifier();\n            if (isDigit(peek))\n                return this.scanNumber(index);\n            var /** @type {?} */ start = index;\n            switch (peek) {\n                case $PERIOD:\n                    this.advance();\n                    return isDigit(this.peek) ? this.scanNumber(start) :\n                        newCharacterToken(start, $PERIOD);\n                case $LPAREN:\n                case $RPAREN:\n                case $LBRACE:\n                case $RBRACE:\n                case $LBRACKET:\n                case $RBRACKET:\n                case $COMMA:\n                case $COLON:\n                case $SEMICOLON:\n                    return this.scanCharacter(start, peek);\n                case $SQ:\n                case $DQ:\n                    return this.scanString();\n                case $HASH:\n                case $PLUS:\n                case $MINUS:\n                case $STAR:\n                case $SLASH:\n                case $PERCENT:\n                case $CARET:\n                    return this.scanOperator(start, String.fromCharCode(peek));\n                case $QUESTION:\n                    return this.scanComplexOperator(start, '?', $PERIOD, '.');\n                case $LT:\n                case $GT:\n                    return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=');\n                case $BANG:\n                case $EQ:\n                    return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=', $EQ, '=');\n                case $AMPERSAND:\n                    return this.scanComplexOperator(start, '&', $AMPERSAND, '&');\n                case $BAR:\n                    return this.scanComplexOperator(start, '|', $BAR, '|');\n                case $NBSP:\n                    while (isWhitespace(this.peek))\n                        this.advance();\n                    return this.scanToken();\n            }\n            this.advance();\n            return this.error(\"Unexpected character [\" + String.fromCharCode(peek) + \"]\", 0);\n        };\n        /**\n         * @param {?} start\n         * @param {?} code\n         * @return {?}\n         */\n        _Scanner.prototype.scanCharacter = function (start, code) {\n            this.advance();\n            return newCharacterToken(start, code);\n        };\n        /**\n         * @param {?} start\n         * @param {?} str\n         * @return {?}\n         */\n        _Scanner.prototype.scanOperator = function (start, str) {\n            this.advance();\n            return newOperatorToken(start, str);\n        };\n        /**\n         * Tokenize a 2/3 char long operator\n         *\n         * @param {?} start start index in the expression\n         * @param {?} one first symbol (always part of the operator)\n         * @param {?} twoCode code point for the second symbol\n         * @param {?} two second symbol (part of the operator when the second code point matches)\n         * @param {?=} threeCode code point for the third symbol\n         * @param {?=} three third symbol (part of the operator when provided and matches source expression)\n         * @return {?}\n         */\n        _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {\n            this.advance();\n            var /** @type {?} */ str = one;\n            if (this.peek == twoCode) {\n                this.advance();\n                str += two;\n            }\n            if (threeCode != null && this.peek == threeCode) {\n                this.advance();\n                str += three;\n            }\n            return newOperatorToken(start, str);\n        };\n        /**\n         * @return {?}\n         */\n        _Scanner.prototype.scanIdentifier = function () {\n            var /** @type {?} */ start = this.index;\n            this.advance();\n            while (isIdentifierPart(this.peek))\n                this.advance();\n            var /** @type {?} */ str = this.input.substring(start, this.index);\n            return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :\n                newIdentifierToken(start, str);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Scanner.prototype.scanNumber = function (start) {\n            var /** @type {?} */ simple = (this.index === start);\n            this.advance(); // Skip initial digit.\n            while (true) {\n                if (isDigit(this.peek)) {\n                }\n                else if (this.peek == $PERIOD) {\n                    simple = false;\n                }\n                else if (isExponentStart(this.peek)) {\n                    this.advance();\n                    if (isExponentSign(this.peek))\n                        this.advance();\n                    if (!isDigit(this.peek))\n                        return this.error('Invalid exponent', -1);\n                    simple = false;\n                }\n                else {\n                    break;\n                }\n                this.advance();\n            }\n            var /** @type {?} */ str = this.input.substring(start, this.index);\n            var /** @type {?} */ value = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);\n            return newNumberToken(start, value);\n        };\n        /**\n         * @return {?}\n         */\n        _Scanner.prototype.scanString = function () {\n            var /** @type {?} */ start = this.index;\n            var /** @type {?} */ quote = this.peek;\n            this.advance(); // Skip initial quote.\n            var /** @type {?} */ buffer = '';\n            var /** @type {?} */ marker = this.index;\n            var /** @type {?} */ input = this.input;\n            while (this.peek != quote) {\n                if (this.peek == $BACKSLASH) {\n                    buffer += input.substring(marker, this.index);\n                    this.advance();\n                    var /** @type {?} */ unescapedCode = void 0;\n                    if (this.peek == $u) {\n                        // 4 character hex code for unicode character.\n                        var /** @type {?} */ hex = input.substring(this.index + 1, this.index + 5);\n                        if (/^[0-9a-f]+$/i.test(hex)) {\n                            unescapedCode = parseInt(hex, 16);\n                        }\n                        else {\n                            return this.error(\"Invalid unicode escape [\\\\u\" + hex + \"]\", 0);\n                        }\n                        for (var /** @type {?} */ i = 0; i < 5; i++) {\n                            this.advance();\n                        }\n                    }\n                    else {\n                        unescapedCode = unescape(this.peek);\n                        this.advance();\n                    }\n                    buffer += String.fromCharCode(unescapedCode);\n                    marker = this.index;\n                }\n                else if (this.peek == $EOF) {\n                    return this.error('Unterminated quote', 0);\n                }\n                else {\n                    this.advance();\n                }\n            }\n            var /** @type {?} */ last = input.substring(marker, this.index);\n            this.advance(); // Skip terminating quote.\n            return newStringToken(start, buffer + last);\n        };\n        /**\n         * @param {?} message\n         * @param {?} offset\n         * @return {?}\n         */\n        _Scanner.prototype.error = function (message, offset) {\n            var /** @type {?} */ position = this.index + offset;\n            return newErrorToken(position, \"Lexer Error: \" + message + \" at column \" + position + \" in expression [\" + this.input + \"]\");\n        };\n        return _Scanner;\n    }());\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isIdentifierStart(code) {\n        return ($a <= code && code <= $z) || ($A <= code && code <= $Z) ||\n            (code == $_) || (code == $$);\n    }\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function isIdentifier(input) {\n        if (input.length == 0)\n            return false;\n        var /** @type {?} */ scanner = new _Scanner(input);\n        if (!isIdentifierStart(scanner.peek))\n            return false;\n        scanner.advance();\n        while (scanner.peek !== $EOF) {\n            if (!isIdentifierPart(scanner.peek))\n                return false;\n            scanner.advance();\n        }\n        return true;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isIdentifierPart(code) {\n        return isAsciiLetter(code) || isDigit(code) || (code == $_) ||\n            (code == $$);\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isExponentStart(code) {\n        return code == $e || code == $E;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isExponentSign(code) {\n        return code == $MINUS || code == $PLUS;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isQuote(code) {\n        return code === $SQ || code === $DQ || code === $BT;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function unescape(code) {\n        switch (code) {\n            case $n:\n                return $LF;\n            case $f:\n                return $FF;\n            case $r:\n                return $CR;\n            case $t:\n                return $TAB;\n            case $v:\n                return $VTAB;\n            default:\n                return code;\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$1 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$1 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var SplitInterpolation = (function () {\n        /**\n         * @param {?} strings\n         * @param {?} expressions\n         * @param {?} offsets\n         */\n        function SplitInterpolation(strings, expressions, offsets) {\n            this.strings = strings;\n            this.expressions = expressions;\n            this.offsets = offsets;\n        }\n        return SplitInterpolation;\n    }());\n    var TemplateBindingParseResult = (function () {\n        /**\n         * @param {?} templateBindings\n         * @param {?} warnings\n         * @param {?} errors\n         */\n        function TemplateBindingParseResult(templateBindings, warnings, errors) {\n            this.templateBindings = templateBindings;\n            this.warnings = warnings;\n            this.errors = errors;\n        }\n        return TemplateBindingParseResult;\n    }());\n    /**\n     * @param {?} config\n     * @return {?}\n     */\n    function _createInterpolateRegExp(config) {\n        var /** @type {?} */ pattern = escapeRegExp(config.start) + '([\\\\s\\\\S]*?)' + escapeRegExp(config.end);\n        return new RegExp(pattern, 'g');\n    }\n    var Parser = (function () {\n        /**\n         * @param {?} _lexer\n         */\n        function Parser(_lexer) {\n            this._lexer = _lexer;\n            this.errors = [];\n        }\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.parseAction = function (input, location, interpolationConfig) {\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            this._checkNoInterpolation(input, location, interpolationConfig);\n            var /** @type {?} */ sourceToLex = this._stripComments(input);\n            var /** @type {?} */ tokens = this._lexer.tokenize(this._stripComments(input));\n            var /** @type {?} */ ast = new _ParseAST(input, location, tokens, sourceToLex.length, true, this.errors, input.length - sourceToLex.length)\n                .parseChain();\n            return new ASTWithSource(ast, input, location, this.errors);\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.parseBinding = function (input, location, interpolationConfig) {\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ ast = this._parseBindingAst(input, location, interpolationConfig);\n            return new ASTWithSource(ast, input, location, this.errors);\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.parseSimpleBinding = function (input, location, interpolationConfig) {\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ ast = this._parseBindingAst(input, location, interpolationConfig);\n            var /** @type {?} */ errors = SimpleExpressionChecker.check(ast);\n            if (errors.length > 0) {\n                this._reportError(\"Host binding expression cannot contain \" + errors.join(' '), input, location);\n            }\n            return new ASTWithSource(ast, input, location, this.errors);\n        };\n        /**\n         * @param {?} message\n         * @param {?} input\n         * @param {?} errLocation\n         * @param {?=} ctxLocation\n         * @return {?}\n         */\n        Parser.prototype._reportError = function (message, input, errLocation, ctxLocation) {\n            this.errors.push(new ParserError(message, input, errLocation, ctxLocation));\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype._parseBindingAst = function (input, location, interpolationConfig) {\n            // Quotes expressions use 3rd-party expression language. We don't want to use\n            // our lexer or parser for that, so we check for that ahead of time.\n            var /** @type {?} */ quote = this._parseQuote(input, location);\n            if (isPresent(quote)) {\n                return quote;\n            }\n            this._checkNoInterpolation(input, location, interpolationConfig);\n            var /** @type {?} */ sourceToLex = this._stripComments(input);\n            var /** @type {?} */ tokens = this._lexer.tokenize(sourceToLex);\n            return new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, input.length - sourceToLex.length)\n                .parseChain();\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @return {?}\n         */\n        Parser.prototype._parseQuote = function (input, location) {\n            if (isBlank(input))\n                return null;\n            var /** @type {?} */ prefixSeparatorIndex = input.indexOf(':');\n            if (prefixSeparatorIndex == -1)\n                return null;\n            var /** @type {?} */ prefix = input.substring(0, prefixSeparatorIndex).trim();\n            if (!isIdentifier(prefix))\n                return null;\n            var /** @type {?} */ uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);\n            return new Quote(new ParseSpan(0, input.length), prefix, uninterpretedExpression, location);\n        };\n        /**\n         * @param {?} prefixToken\n         * @param {?} input\n         * @param {?} location\n         * @return {?}\n         */\n        Parser.prototype.parseTemplateBindings = function (prefixToken, input, location) {\n            var /** @type {?} */ tokens = this._lexer.tokenize(input);\n            if (prefixToken) {\n                // Prefix the tokens with the tokens from prefixToken but have them take no space (0 index).\n                var /** @type {?} */ prefixTokens = this._lexer.tokenize(prefixToken).map(function (t) {\n                    t.index = 0;\n                    return t;\n                });\n                tokens.unshift.apply(tokens, prefixTokens);\n            }\n            return new _ParseAST(input, location, tokens, input.length, false, this.errors, 0)\n                .parseTemplateBindings();\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.parseInterpolation = function (input, location, interpolationConfig) {\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ split = this.splitInterpolation(input, location, interpolationConfig);\n            if (split == null)\n                return null;\n            var /** @type {?} */ expressions = [];\n            for (var /** @type {?} */ i = 0; i < split.expressions.length; ++i) {\n                var /** @type {?} */ expressionText = split.expressions[i];\n                var /** @type {?} */ sourceToLex = this._stripComments(expressionText);\n                var /** @type {?} */ tokens = this._lexer.tokenize(this._stripComments(split.expressions[i]));\n                var /** @type {?} */ ast = new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, split.offsets[i] + (expressionText.length - sourceToLex.length))\n                    .parseChain();\n                expressions.push(ast);\n            }\n            return new ASTWithSource(new Interpolation(new ParseSpan(0, isBlank(input) ? 0 : input.length), split.strings, expressions), input, location, this.errors);\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.splitInterpolation = function (input, location, interpolationConfig) {\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ regexp = _createInterpolateRegExp(interpolationConfig);\n            var /** @type {?} */ parts = input.split(regexp);\n            if (parts.length <= 1) {\n                return null;\n            }\n            var /** @type {?} */ strings = [];\n            var /** @type {?} */ expressions = [];\n            var /** @type {?} */ offsets = [];\n            var /** @type {?} */ offset = 0;\n            for (var /** @type {?} */ i = 0; i < parts.length; i++) {\n                var /** @type {?} */ part = parts[i];\n                if (i % 2 === 0) {\n                    // fixed string\n                    strings.push(part);\n                    offset += part.length;\n                }\n                else if (part.trim().length > 0) {\n                    offset += interpolationConfig.start.length;\n                    expressions.push(part);\n                    offsets.push(offset);\n                    offset += part.length + interpolationConfig.end.length;\n                }\n                else {\n                    this._reportError('Blank expressions are not allowed in interpolated strings', input, \"at column \" + this._findInterpolationErrorColumn(parts, i, interpolationConfig) + \" in\", location);\n                    expressions.push('$implict');\n                    offsets.push(offset);\n                }\n            }\n            return new SplitInterpolation(strings, expressions, offsets);\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @return {?}\n         */\n        Parser.prototype.wrapLiteralPrimitive = function (input, location) {\n            return new ASTWithSource(new LiteralPrimitive(new ParseSpan(0, isBlank(input) ? 0 : input.length), input), input, location, this.errors);\n        };\n        /**\n         * @param {?} input\n         * @return {?}\n         */\n        Parser.prototype._stripComments = function (input) {\n            var /** @type {?} */ i = this._commentStart(input);\n            return isPresent(i) ? input.substring(0, i).trim() : input;\n        };\n        /**\n         * @param {?} input\n         * @return {?}\n         */\n        Parser.prototype._commentStart = function (input) {\n            var /** @type {?} */ outerQuote = null;\n            for (var /** @type {?} */ i = 0; i < input.length - 1; i++) {\n                var /** @type {?} */ char = input.charCodeAt(i);\n                var /** @type {?} */ nextChar = input.charCodeAt(i + 1);\n                if (char === $SLASH && nextChar == $SLASH && isBlank(outerQuote))\n                    return i;\n                if (outerQuote === char) {\n                    outerQuote = null;\n                }\n                else if (isBlank(outerQuote) && isQuote(char)) {\n                    outerQuote = char;\n                }\n            }\n            return null;\n        };\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype._checkNoInterpolation = function (input, location, interpolationConfig) {\n            var /** @type {?} */ regexp = _createInterpolateRegExp(interpolationConfig);\n            var /** @type {?} */ parts = input.split(regexp);\n            if (parts.length > 1) {\n                this._reportError(\"Got interpolation (\" + interpolationConfig.start + interpolationConfig.end + \") where expression was expected\", input, \"at column \" + this._findInterpolationErrorColumn(parts, 1, interpolationConfig) + \" in\", location);\n            }\n        };\n        /**\n         * @param {?} parts\n         * @param {?} partInErrIdx\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx, interpolationConfig) {\n            var /** @type {?} */ errLocation = '';\n            for (var /** @type {?} */ j = 0; j < partInErrIdx; j++) {\n                errLocation += j % 2 === 0 ?\n                    parts[j] :\n                    \"\" + interpolationConfig.start + parts[j] + interpolationConfig.end;\n            }\n            return errLocation.length;\n        };\n        Parser = __decorate$1([\n            CompilerInjectable(), \n            __metadata$1('design:paramtypes', [Lexer])\n        ], Parser);\n        return Parser;\n    }());\n    var _ParseAST = (function () {\n        /**\n         * @param {?} input\n         * @param {?} location\n         * @param {?} tokens\n         * @param {?} inputLength\n         * @param {?} parseAction\n         * @param {?} errors\n         * @param {?} offset\n         */\n        function _ParseAST(input, location, tokens, inputLength, parseAction, errors, offset) {\n            this.input = input;\n            this.location = location;\n            this.tokens = tokens;\n            this.inputLength = inputLength;\n            this.parseAction = parseAction;\n            this.errors = errors;\n            this.offset = offset;\n            this.rparensExpected = 0;\n            this.rbracketsExpected = 0;\n            this.rbracesExpected = 0;\n            this.index = 0;\n        }\n        /**\n         * @param {?} offset\n         * @return {?}\n         */\n        _ParseAST.prototype.peek = function (offset) {\n            var /** @type {?} */ i = this.index + offset;\n            return i < this.tokens.length ? this.tokens[i] : EOF;\n        };\n        Object.defineProperty(_ParseAST.prototype, \"next\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.peek(0); },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(_ParseAST.prototype, \"inputIndex\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return (this.index < this.tokens.length) ? this.next.index + this.offset :\n                    this.inputLength + this.offset;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _ParseAST.prototype.span = function (start) { return new ParseSpan(start, this.inputIndex); };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.advance = function () { this.index++; };\n        /**\n         * @param {?} code\n         * @return {?}\n         */\n        _ParseAST.prototype.optionalCharacter = function (code) {\n            if (this.next.isCharacter(code)) {\n                this.advance();\n                return true;\n            }\n            else {\n                return false;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.peekKeywordLet = function () { return this.next.isKeywordLet(); };\n        /**\n         * @param {?} code\n         * @return {?}\n         */\n        _ParseAST.prototype.expectCharacter = function (code) {\n            if (this.optionalCharacter(code))\n                return;\n            this.error(\"Missing expected \" + String.fromCharCode(code));\n        };\n        /**\n         * @param {?} op\n         * @return {?}\n         */\n        _ParseAST.prototype.optionalOperator = function (op) {\n            if (this.next.isOperator(op)) {\n                this.advance();\n                return true;\n            }\n            else {\n                return false;\n            }\n        };\n        /**\n         * @param {?} operator\n         * @return {?}\n         */\n        _ParseAST.prototype.expectOperator = function (operator) {\n            if (this.optionalOperator(operator))\n                return;\n            this.error(\"Missing expected operator \" + operator);\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.expectIdentifierOrKeyword = function () {\n            var /** @type {?} */ n = this.next;\n            if (!n.isIdentifier() && !n.isKeyword()) {\n                this.error(\"Unexpected token \" + n + \", expected identifier or keyword\");\n                return '';\n            }\n            this.advance();\n            return n.toString();\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {\n            var /** @type {?} */ n = this.next;\n            if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {\n                this.error(\"Unexpected token \" + n + \", expected identifier, keyword, or string\");\n                return '';\n            }\n            this.advance();\n            return n.toString();\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseChain = function () {\n            var /** @type {?} */ exprs = [];\n            var /** @type {?} */ start = this.inputIndex;\n            while (this.index < this.tokens.length) {\n                var /** @type {?} */ expr = this.parsePipe();\n                exprs.push(expr);\n                if (this.optionalCharacter($SEMICOLON)) {\n                    if (!this.parseAction) {\n                        this.error('Binding expression cannot contain chained expression');\n                    }\n                    while (this.optionalCharacter($SEMICOLON)) {\n                    } // read all semicolons\n                }\n                else if (this.index < this.tokens.length) {\n                    this.error(\"Unexpected token '\" + this.next + \"'\");\n                }\n            }\n            if (exprs.length == 0)\n                return new EmptyExpr(this.span(start));\n            if (exprs.length == 1)\n                return exprs[0];\n            return new Chain(this.span(start), exprs);\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parsePipe = function () {\n            var /** @type {?} */ result = this.parseExpression();\n            if (this.optionalOperator('|')) {\n                if (this.parseAction) {\n                    this.error('Cannot have a pipe in an action expression');\n                }\n                do {\n                    var /** @type {?} */ name_1 = this.expectIdentifierOrKeyword();\n                    var /** @type {?} */ args = [];\n                    while (this.optionalCharacter($COLON)) {\n                        args.push(this.parseExpression());\n                    }\n                    result = new BindingPipe(this.span(result.span.start), result, name_1, args);\n                } while (this.optionalOperator('|'));\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseConditional = function () {\n            var /** @type {?} */ start = this.inputIndex;\n            var /** @type {?} */ result = this.parseLogicalOr();\n            if (this.optionalOperator('?')) {\n                var /** @type {?} */ yes = this.parsePipe();\n                var /** @type {?} */ no = void 0;\n                if (!this.optionalCharacter($COLON)) {\n                    var /** @type {?} */ end = this.inputIndex;\n                    var /** @type {?} */ expression = this.input.substring(start, end);\n                    this.error(\"Conditional expression \" + expression + \" requires all 3 expressions\");\n                    no = new EmptyExpr(this.span(start));\n                }\n                else {\n                    no = this.parsePipe();\n                }\n                return new Conditional(this.span(start), result, yes, no);\n            }\n            else {\n                return result;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseLogicalOr = function () {\n            // '||'\n            var /** @type {?} */ result = this.parseLogicalAnd();\n            while (this.optionalOperator('||')) {\n                var /** @type {?} */ right = this.parseLogicalAnd();\n                result = new Binary(this.span(result.span.start), '||', result, right);\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseLogicalAnd = function () {\n            // '&&'\n            var /** @type {?} */ result = this.parseEquality();\n            while (this.optionalOperator('&&')) {\n                var /** @type {?} */ right = this.parseEquality();\n                result = new Binary(this.span(result.span.start), '&&', result, right);\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseEquality = function () {\n            // '==','!=','===','!=='\n            var /** @type {?} */ result = this.parseRelational();\n            while (this.next.type == TokenType.Operator) {\n                var /** @type {?} */ operator = this.next.strValue;\n                switch (operator) {\n                    case '==':\n                    case '===':\n                    case '!=':\n                    case '!==':\n                        this.advance();\n                        var /** @type {?} */ right = this.parseRelational();\n                        result = new Binary(this.span(result.span.start), operator, result, right);\n                        continue;\n                }\n                break;\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseRelational = function () {\n            // '<', '>', '<=', '>='\n            var /** @type {?} */ result = this.parseAdditive();\n            while (this.next.type == TokenType.Operator) {\n                var /** @type {?} */ operator = this.next.strValue;\n                switch (operator) {\n                    case '<':\n                    case '>':\n                    case '<=':\n                    case '>=':\n                        this.advance();\n                        var /** @type {?} */ right = this.parseAdditive();\n                        result = new Binary(this.span(result.span.start), operator, result, right);\n                        continue;\n                }\n                break;\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseAdditive = function () {\n            // '+', '-'\n            var /** @type {?} */ result = this.parseMultiplicative();\n            while (this.next.type == TokenType.Operator) {\n                var /** @type {?} */ operator = this.next.strValue;\n                switch (operator) {\n                    case '+':\n                    case '-':\n                        this.advance();\n                        var /** @type {?} */ right = this.parseMultiplicative();\n                        result = new Binary(this.span(result.span.start), operator, result, right);\n                        continue;\n                }\n                break;\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseMultiplicative = function () {\n            // '*', '%', '/'\n            var /** @type {?} */ result = this.parsePrefix();\n            while (this.next.type == TokenType.Operator) {\n                var /** @type {?} */ operator = this.next.strValue;\n                switch (operator) {\n                    case '*':\n                    case '%':\n                    case '/':\n                        this.advance();\n                        var /** @type {?} */ right = this.parsePrefix();\n                        result = new Binary(this.span(result.span.start), operator, result, right);\n                        continue;\n                }\n                break;\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parsePrefix = function () {\n            if (this.next.type == TokenType.Operator) {\n                var /** @type {?} */ start = this.inputIndex;\n                var /** @type {?} */ operator = this.next.strValue;\n                var /** @type {?} */ result = void 0;\n                switch (operator) {\n                    case '+':\n                        this.advance();\n                        return this.parsePrefix();\n                    case '-':\n                        this.advance();\n                        result = this.parsePrefix();\n                        return new Binary(this.span(start), operator, new LiteralPrimitive(new ParseSpan(start, start), 0), result);\n                    case '!':\n                        this.advance();\n                        result = this.parsePrefix();\n                        return new PrefixNot(this.span(start), result);\n                }\n            }\n            return this.parseCallChain();\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseCallChain = function () {\n            var /** @type {?} */ result = this.parsePrimary();\n            while (true) {\n                if (this.optionalCharacter($PERIOD)) {\n                    result = this.parseAccessMemberOrMethodCall(result, false);\n                }\n                else if (this.optionalOperator('?.')) {\n                    result = this.parseAccessMemberOrMethodCall(result, true);\n                }\n                else if (this.optionalCharacter($LBRACKET)) {\n                    this.rbracketsExpected++;\n                    var /** @type {?} */ key = this.parsePipe();\n                    this.rbracketsExpected--;\n                    this.expectCharacter($RBRACKET);\n                    if (this.optionalOperator('=')) {\n                        var /** @type {?} */ value = this.parseConditional();\n                        result = new KeyedWrite(this.span(result.span.start), result, key, value);\n                    }\n                    else {\n                        result = new KeyedRead(this.span(result.span.start), result, key);\n                    }\n                }\n                else if (this.optionalCharacter($LPAREN)) {\n                    this.rparensExpected++;\n                    var /** @type {?} */ args = this.parseCallArguments();\n                    this.rparensExpected--;\n                    this.expectCharacter($RPAREN);\n                    result = new FunctionCall(this.span(result.span.start), result, args);\n                }\n                else {\n                    return result;\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parsePrimary = function () {\n            var /** @type {?} */ start = this.inputIndex;\n            if (this.optionalCharacter($LPAREN)) {\n                this.rparensExpected++;\n                var /** @type {?} */ result = this.parsePipe();\n                this.rparensExpected--;\n                this.expectCharacter($RPAREN);\n                return result;\n            }\n            else if (this.next.isKeywordNull()) {\n                this.advance();\n                return new LiteralPrimitive(this.span(start), null);\n            }\n            else if (this.next.isKeywordUndefined()) {\n                this.advance();\n                return new LiteralPrimitive(this.span(start), void 0);\n            }\n            else if (this.next.isKeywordTrue()) {\n                this.advance();\n                return new LiteralPrimitive(this.span(start), true);\n            }\n            else if (this.next.isKeywordFalse()) {\n                this.advance();\n                return new LiteralPrimitive(this.span(start), false);\n            }\n            else if (this.next.isKeywordThis()) {\n                this.advance();\n                return new ImplicitReceiver(this.span(start));\n            }\n            else if (this.optionalCharacter($LBRACKET)) {\n                this.rbracketsExpected++;\n                var /** @type {?} */ elements = this.parseExpressionList($RBRACKET);\n                this.rbracketsExpected--;\n                this.expectCharacter($RBRACKET);\n                return new LiteralArray(this.span(start), elements);\n            }\n            else if (this.next.isCharacter($LBRACE)) {\n                return this.parseLiteralMap();\n            }\n            else if (this.next.isIdentifier()) {\n                return this.parseAccessMemberOrMethodCall(new ImplicitReceiver(this.span(start)), false);\n            }\n            else if (this.next.isNumber()) {\n                var /** @type {?} */ value = this.next.toNumber();\n                this.advance();\n                return new LiteralPrimitive(this.span(start), value);\n            }\n            else if (this.next.isString()) {\n                var /** @type {?} */ literalValue = this.next.toString();\n                this.advance();\n                return new LiteralPrimitive(this.span(start), literalValue);\n            }\n            else if (this.index >= this.tokens.length) {\n                this.error(\"Unexpected end of expression: \" + this.input);\n                return new EmptyExpr(this.span(start));\n            }\n            else {\n                this.error(\"Unexpected token \" + this.next);\n                return new EmptyExpr(this.span(start));\n            }\n        };\n        /**\n         * @param {?} terminator\n         * @return {?}\n         */\n        _ParseAST.prototype.parseExpressionList = function (terminator) {\n            var /** @type {?} */ result = [];\n            if (!this.next.isCharacter(terminator)) {\n                do {\n                    result.push(this.parsePipe());\n                } while (this.optionalCharacter($COMMA));\n            }\n            return result;\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseLiteralMap = function () {\n            var /** @type {?} */ keys = [];\n            var /** @type {?} */ values = [];\n            var /** @type {?} */ start = this.inputIndex;\n            this.expectCharacter($LBRACE);\n            if (!this.optionalCharacter($RBRACE)) {\n                this.rbracesExpected++;\n                do {\n                    var /** @type {?} */ key = this.expectIdentifierOrKeywordOrString();\n                    keys.push(key);\n                    this.expectCharacter($COLON);\n                    values.push(this.parsePipe());\n                } while (this.optionalCharacter($COMMA));\n                this.rbracesExpected--;\n                this.expectCharacter($RBRACE);\n            }\n            return new LiteralMap(this.span(start), keys, values);\n        };\n        /**\n         * @param {?} receiver\n         * @param {?=} isSafe\n         * @return {?}\n         */\n        _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {\n            if (isSafe === void 0) { isSafe = false; }\n            var /** @type {?} */ start = receiver.span.start;\n            var /** @type {?} */ id = this.expectIdentifierOrKeyword();\n            if (this.optionalCharacter($LPAREN)) {\n                this.rparensExpected++;\n                var /** @type {?} */ args = this.parseCallArguments();\n                this.expectCharacter($RPAREN);\n                this.rparensExpected--;\n                var /** @type {?} */ span = this.span(start);\n                return isSafe ? new SafeMethodCall(span, receiver, id, args) :\n                    new MethodCall(span, receiver, id, args);\n            }\n            else {\n                if (isSafe) {\n                    if (this.optionalOperator('=')) {\n                        this.error('The \\'?.\\' operator cannot be used in the assignment');\n                        return new EmptyExpr(this.span(start));\n                    }\n                    else {\n                        return new SafePropertyRead(this.span(start), receiver, id);\n                    }\n                }\n                else {\n                    if (this.optionalOperator('=')) {\n                        if (!this.parseAction) {\n                            this.error('Bindings cannot contain assignments');\n                            return new EmptyExpr(this.span(start));\n                        }\n                        var /** @type {?} */ value = this.parseConditional();\n                        return new PropertyWrite(this.span(start), receiver, id, value);\n                    }\n                    else {\n                        return new PropertyRead(this.span(start), receiver, id);\n                    }\n                }\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseCallArguments = function () {\n            if (this.next.isCharacter($RPAREN))\n                return [];\n            var /** @type {?} */ positionals = [];\n            do {\n                positionals.push(this.parsePipe());\n            } while (this.optionalCharacter($COMMA));\n            return (positionals);\n        };\n        /**\n         * An identifier, a keyword, a string with an optional `-` inbetween.\n         * @return {?}\n         */\n        _ParseAST.prototype.expectTemplateBindingKey = function () {\n            var /** @type {?} */ result = '';\n            var /** @type {?} */ operatorFound = false;\n            do {\n                result += this.expectIdentifierOrKeywordOrString();\n                operatorFound = this.optionalOperator('-');\n                if (operatorFound) {\n                    result += '-';\n                }\n            } while (operatorFound);\n            return result.toString();\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.parseTemplateBindings = function () {\n            var /** @type {?} */ bindings = [];\n            var /** @type {?} */ prefix = null;\n            var /** @type {?} */ warnings = [];\n            while (this.index < this.tokens.length) {\n                var /** @type {?} */ start = this.inputIndex;\n                var /** @type {?} */ keyIsVar = this.peekKeywordLet();\n                if (keyIsVar) {\n                    this.advance();\n                }\n                var /** @type {?} */ key = this.expectTemplateBindingKey();\n                if (!keyIsVar) {\n                    if (prefix == null) {\n                        prefix = key;\n                    }\n                    else {\n                        key = prefix + key[0].toUpperCase() + key.substring(1);\n                    }\n                }\n                this.optionalCharacter($COLON);\n                var /** @type {?} */ name_2 = null;\n                var /** @type {?} */ expression = null;\n                if (keyIsVar) {\n                    if (this.optionalOperator('=')) {\n                        name_2 = this.expectTemplateBindingKey();\n                    }\n                    else {\n                        name_2 = '\\$implicit';\n                    }\n                }\n                else if (this.next !== EOF && !this.peekKeywordLet()) {\n                    var /** @type {?} */ start_1 = this.inputIndex;\n                    var /** @type {?} */ ast = this.parsePipe();\n                    var /** @type {?} */ source = this.input.substring(start_1 - this.offset, this.inputIndex - this.offset);\n                    expression = new ASTWithSource(ast, source, this.location, this.errors);\n                }\n                bindings.push(new TemplateBinding(this.span(start), key, keyIsVar, name_2, expression));\n                if (!this.optionalCharacter($SEMICOLON)) {\n                    this.optionalCharacter($COMMA);\n                }\n            }\n            return new TemplateBindingParseResult(bindings, warnings, this.errors);\n        };\n        /**\n         * @param {?} message\n         * @param {?=} index\n         * @return {?}\n         */\n        _ParseAST.prototype.error = function (message, index) {\n            if (index === void 0) { index = null; }\n            this.errors.push(new ParserError(message, this.input, this.locationText(index), this.location));\n            this.skip();\n        };\n        /**\n         * @param {?=} index\n         * @return {?}\n         */\n        _ParseAST.prototype.locationText = function (index) {\n            if (index === void 0) { index = null; }\n            if (isBlank(index))\n                index = this.index;\n            return (index < this.tokens.length) ? \"at column \" + (this.tokens[index].index + 1) + \" in\" :\n                \"at the end of the expression\";\n        };\n        /**\n         * @return {?}\n         */\n        _ParseAST.prototype.skip = function () {\n            var /** @type {?} */ n = this.next;\n            while (this.index < this.tokens.length && !n.isCharacter($SEMICOLON) &&\n                (this.rparensExpected <= 0 || !n.isCharacter($RPAREN)) &&\n                (this.rbracesExpected <= 0 || !n.isCharacter($RBRACE)) &&\n                (this.rbracketsExpected <= 0 || !n.isCharacter($RBRACKET))) {\n                if (this.next.isError()) {\n                    this.errors.push(new ParserError(this.next.toString(), this.input, this.locationText(), this.location));\n                }\n                this.advance();\n                n = this.next;\n            }\n        };\n        return _ParseAST;\n    }());\n    var SimpleExpressionChecker = (function () {\n        function SimpleExpressionChecker() {\n            this.errors = [];\n        }\n        /**\n         * @param {?} ast\n         * @return {?}\n         */\n        SimpleExpressionChecker.check = function (ast) {\n            var /** @type {?} */ s = new SimpleExpressionChecker();\n            ast.visit(s);\n            return s.errors;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitInterpolation = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitPropertyRead = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitMethodCall = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitFunctionCall = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitLiteralArray = function (ast, context) { this.visitAll(ast.expressions); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitLiteralMap = function (ast, context) { this.visitAll(ast.values); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitBinary = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitPrefixNot = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitConditional = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitPipe = function (ast, context) { this.errors.push('pipes'); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitKeyedRead = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast, context) { };\n        /**\n         * @param {?} asts\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitAll = function (asts) {\n            var _this = this;\n            return asts.map(function (node) { return node.visit(_this); });\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitChain = function (ast, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        SimpleExpressionChecker.prototype.visitQuote = function (ast, context) { };\n        return SimpleExpressionChecker;\n    }());\n\n    var ParseLocation = (function () {\n        /**\n         * @param {?} file\n         * @param {?} offset\n         * @param {?} line\n         * @param {?} col\n         */\n        function ParseLocation(file, offset, line, col) {\n            this.file = file;\n            this.offset = offset;\n            this.line = line;\n            this.col = col;\n        }\n        /**\n         * @return {?}\n         */\n        ParseLocation.prototype.toString = function () {\n            return isPresent(this.offset) ? this.file.url + \"@\" + this.line + \":\" + this.col : this.file.url;\n        };\n        /**\n         * @param {?} delta\n         * @return {?}\n         */\n        ParseLocation.prototype.moveBy = function (delta) {\n            var /** @type {?} */ source = this.file.content;\n            var /** @type {?} */ len = source.length;\n            var /** @type {?} */ offset = this.offset;\n            var /** @type {?} */ line = this.line;\n            var /** @type {?} */ col = this.col;\n            while (offset > 0 && delta < 0) {\n                offset--;\n                delta++;\n                var /** @type {?} */ ch = source.charCodeAt(offset);\n                if (ch == $LF) {\n                    line--;\n                    var /** @type {?} */ priorLine = source.substr(0, offset - 1).lastIndexOf(String.fromCharCode($LF));\n                    col = priorLine > 0 ? offset - priorLine : offset;\n                }\n                else {\n                    col--;\n                }\n            }\n            while (offset < len && delta > 0) {\n                var /** @type {?} */ ch = source.charCodeAt(offset);\n                offset++;\n                delta--;\n                if (ch == $LF) {\n                    line++;\n                    col = 0;\n                }\n                else {\n                    col++;\n                }\n            }\n            return new ParseLocation(this.file, offset, line, col);\n        };\n        /**\n         * @param {?} maxChars\n         * @param {?} maxLines\n         * @return {?}\n         */\n        ParseLocation.prototype.getContext = function (maxChars, maxLines) {\n            var /** @type {?} */ content = this.file.content;\n            var /** @type {?} */ startOffset = this.offset;\n            if (isPresent(startOffset)) {\n                if (startOffset > content.length - 1) {\n                    startOffset = content.length - 1;\n                }\n                var /** @type {?} */ endOffset = startOffset;\n                var /** @type {?} */ ctxChars = 0;\n                var /** @type {?} */ ctxLines = 0;\n                while (ctxChars < maxChars && startOffset > 0) {\n                    startOffset--;\n                    ctxChars++;\n                    if (content[startOffset] == '\\n') {\n                        if (++ctxLines == maxLines) {\n                            break;\n                        }\n                    }\n                }\n                ctxChars = 0;\n                ctxLines = 0;\n                while (ctxChars < maxChars && endOffset < content.length - 1) {\n                    endOffset++;\n                    ctxChars++;\n                    if (content[endOffset] == '\\n') {\n                        if (++ctxLines == maxLines) {\n                            break;\n                        }\n                    }\n                }\n                return {\n                    before: content.substring(startOffset, this.offset),\n                    after: content.substring(this.offset, endOffset + 1),\n                };\n            }\n            return null;\n        };\n        return ParseLocation;\n    }());\n    var ParseSourceFile = (function () {\n        /**\n         * @param {?} content\n         * @param {?} url\n         */\n        function ParseSourceFile(content, url) {\n            this.content = content;\n            this.url = url;\n        }\n        return ParseSourceFile;\n    }());\n    var ParseSourceSpan = (function () {\n        /**\n         * @param {?} start\n         * @param {?} end\n         * @param {?=} details\n         */\n        function ParseSourceSpan(start, end, details) {\n            if (details === void 0) { details = null; }\n            this.start = start;\n            this.end = end;\n            this.details = details;\n        }\n        /**\n         * @return {?}\n         */\n        ParseSourceSpan.prototype.toString = function () {\n            return this.start.file.content.substring(this.start.offset, this.end.offset);\n        };\n        return ParseSourceSpan;\n    }());\n    var ParseErrorLevel = {};\n    ParseErrorLevel.WARNING = 0;\n    ParseErrorLevel.FATAL = 1;\n    ParseErrorLevel[ParseErrorLevel.WARNING] = \"WARNING\";\n    ParseErrorLevel[ParseErrorLevel.FATAL] = \"FATAL\";\n    var ParseError = (function () {\n        /**\n         * @param {?} span\n         * @param {?} msg\n         * @param {?=} level\n         */\n        function ParseError(span, msg, level) {\n            if (level === void 0) { level = ParseErrorLevel.FATAL; }\n            this.span = span;\n            this.msg = msg;\n            this.level = level;\n        }\n        /**\n         * @return {?}\n         */\n        ParseError.prototype.toString = function () {\n            var /** @type {?} */ ctx = this.span.start.getContext(100, 3);\n            var /** @type {?} */ contextStr = ctx ? \" (\\\"\" + ctx.before + \"[ERROR ->]\" + ctx.after + \"\\\")\" : '';\n            var /** @type {?} */ details = this.span.details ? \", \" + this.span.details : '';\n            return \"\" + this.msg + contextStr + \": \" + this.span.start + details;\n        };\n        return ParseError;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var Text = (function () {\n        /**\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function Text(value, sourceSpan) {\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n        return Text;\n    }());\n    var Expansion = (function () {\n        /**\n         * @param {?} switchValue\n         * @param {?} type\n         * @param {?} cases\n         * @param {?} sourceSpan\n         * @param {?} switchValueSourceSpan\n         */\n        function Expansion(switchValue, type, cases, sourceSpan, switchValueSourceSpan) {\n            this.switchValue = switchValue;\n            this.type = type;\n            this.cases = cases;\n            this.sourceSpan = sourceSpan;\n            this.switchValueSourceSpan = switchValueSourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Expansion.prototype.visit = function (visitor, context) { return visitor.visitExpansion(this, context); };\n        return Expansion;\n    }());\n    var ExpansionCase = (function () {\n        /**\n         * @param {?} value\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} valueSourceSpan\n         * @param {?} expSourceSpan\n         */\n        function ExpansionCase(value, expression, sourceSpan, valueSourceSpan, expSourceSpan) {\n            this.value = value;\n            this.expression = expression;\n            this.sourceSpan = sourceSpan;\n            this.valueSourceSpan = valueSourceSpan;\n            this.expSourceSpan = expSourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ExpansionCase.prototype.visit = function (visitor, context) { return visitor.visitExpansionCase(this, context); };\n        return ExpansionCase;\n    }());\n    var Attribute$1 = (function () {\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?=} valueSpan\n         */\n        function Attribute(name, value, sourceSpan, valueSpan) {\n            this.name = name;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n            this.valueSpan = valueSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Attribute.prototype.visit = function (visitor, context) { return visitor.visitAttribute(this, context); };\n        return Attribute;\n    }());\n    var Element = (function () {\n        /**\n         * @param {?} name\n         * @param {?} attrs\n         * @param {?} children\n         * @param {?} sourceSpan\n         * @param {?} startSourceSpan\n         * @param {?} endSourceSpan\n         */\n        function Element(name, attrs, children, sourceSpan, startSourceSpan, endSourceSpan) {\n            this.name = name;\n            this.attrs = attrs;\n            this.children = children;\n            this.sourceSpan = sourceSpan;\n            this.startSourceSpan = startSourceSpan;\n            this.endSourceSpan = endSourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Element.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };\n        return Element;\n    }());\n    var Comment = (function () {\n        /**\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function Comment(value, sourceSpan) {\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Comment.prototype.visit = function (visitor, context) { return visitor.visitComment(this, context); };\n        return Comment;\n    }());\n    /**\n     * @param {?} visitor\n     * @param {?} nodes\n     * @param {?=} context\n     * @return {?}\n     */\n    function visitAll(visitor, nodes, context) {\n        if (context === void 0) { context = null; }\n        var /** @type {?} */ result = [];\n        var /** @type {?} */ visit = visitor.visit ?\n            function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :\n            function (ast) { return ast.visit(visitor, context); };\n        nodes.forEach(function (ast) {\n            var /** @type {?} */ astResult = visit(ast);\n            if (astResult) {\n                result.push(astResult);\n            }\n        });\n        return result;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$6 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var TokenType$1 = {};\n    TokenType$1.TAG_OPEN_START = 0;\n    TokenType$1.TAG_OPEN_END = 1;\n    TokenType$1.TAG_OPEN_END_VOID = 2;\n    TokenType$1.TAG_CLOSE = 3;\n    TokenType$1.TEXT = 4;\n    TokenType$1.ESCAPABLE_RAW_TEXT = 5;\n    TokenType$1.RAW_TEXT = 6;\n    TokenType$1.COMMENT_START = 7;\n    TokenType$1.COMMENT_END = 8;\n    TokenType$1.CDATA_START = 9;\n    TokenType$1.CDATA_END = 10;\n    TokenType$1.ATTR_NAME = 11;\n    TokenType$1.ATTR_VALUE = 12;\n    TokenType$1.DOC_TYPE = 13;\n    TokenType$1.EXPANSION_FORM_START = 14;\n    TokenType$1.EXPANSION_CASE_VALUE = 15;\n    TokenType$1.EXPANSION_CASE_EXP_START = 16;\n    TokenType$1.EXPANSION_CASE_EXP_END = 17;\n    TokenType$1.EXPANSION_FORM_END = 18;\n    TokenType$1.EOF = 19;\n    TokenType$1[TokenType$1.TAG_OPEN_START] = \"TAG_OPEN_START\";\n    TokenType$1[TokenType$1.TAG_OPEN_END] = \"TAG_OPEN_END\";\n    TokenType$1[TokenType$1.TAG_OPEN_END_VOID] = \"TAG_OPEN_END_VOID\";\n    TokenType$1[TokenType$1.TAG_CLOSE] = \"TAG_CLOSE\";\n    TokenType$1[TokenType$1.TEXT] = \"TEXT\";\n    TokenType$1[TokenType$1.ESCAPABLE_RAW_TEXT] = \"ESCAPABLE_RAW_TEXT\";\n    TokenType$1[TokenType$1.RAW_TEXT] = \"RAW_TEXT\";\n    TokenType$1[TokenType$1.COMMENT_START] = \"COMMENT_START\";\n    TokenType$1[TokenType$1.COMMENT_END] = \"COMMENT_END\";\n    TokenType$1[TokenType$1.CDATA_START] = \"CDATA_START\";\n    TokenType$1[TokenType$1.CDATA_END] = \"CDATA_END\";\n    TokenType$1[TokenType$1.ATTR_NAME] = \"ATTR_NAME\";\n    TokenType$1[TokenType$1.ATTR_VALUE] = \"ATTR_VALUE\";\n    TokenType$1[TokenType$1.DOC_TYPE] = \"DOC_TYPE\";\n    TokenType$1[TokenType$1.EXPANSION_FORM_START] = \"EXPANSION_FORM_START\";\n    TokenType$1[TokenType$1.EXPANSION_CASE_VALUE] = \"EXPANSION_CASE_VALUE\";\n    TokenType$1[TokenType$1.EXPANSION_CASE_EXP_START] = \"EXPANSION_CASE_EXP_START\";\n    TokenType$1[TokenType$1.EXPANSION_CASE_EXP_END] = \"EXPANSION_CASE_EXP_END\";\n    TokenType$1[TokenType$1.EXPANSION_FORM_END] = \"EXPANSION_FORM_END\";\n    TokenType$1[TokenType$1.EOF] = \"EOF\";\n    var Token$1 = (function () {\n        /**\n         * @param {?} type\n         * @param {?} parts\n         * @param {?} sourceSpan\n         */\n        function Token(type, parts, sourceSpan) {\n            this.type = type;\n            this.parts = parts;\n            this.sourceSpan = sourceSpan;\n        }\n        return Token;\n    }());\n    var TokenError = (function (_super) {\n        __extends$6(TokenError, _super);\n        /**\n         * @param {?} errorMsg\n         * @param {?} tokenType\n         * @param {?} span\n         */\n        function TokenError(errorMsg, tokenType, span) {\n            _super.call(this, span, errorMsg);\n            this.tokenType = tokenType;\n        }\n        return TokenError;\n    }(ParseError));\n    var TokenizeResult = (function () {\n        /**\n         * @param {?} tokens\n         * @param {?} errors\n         */\n        function TokenizeResult(tokens, errors) {\n            this.tokens = tokens;\n            this.errors = errors;\n        }\n        return TokenizeResult;\n    }());\n    /**\n     * @param {?} source\n     * @param {?} url\n     * @param {?} getTagDefinition\n     * @param {?=} tokenizeExpansionForms\n     * @param {?=} interpolationConfig\n     * @return {?}\n     */\n    function tokenize(source, url, getTagDefinition, tokenizeExpansionForms, interpolationConfig) {\n        if (tokenizeExpansionForms === void 0) { tokenizeExpansionForms = false; }\n        if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n        return new _Tokenizer(new ParseSourceFile(source, url), getTagDefinition, tokenizeExpansionForms, interpolationConfig)\n            .tokenize();\n    }\n    var /** @type {?} */ _CR_OR_CRLF_REGEXP = /\\r\\n?/g;\n    /**\n     * @param {?} charCode\n     * @return {?}\n     */\n    function _unexpectedCharacterErrorMsg(charCode) {\n        var /** @type {?} */ char = charCode === $EOF ? 'EOF' : String.fromCharCode(charCode);\n        return \"Unexpected character \\\"\" + char + \"\\\"\";\n    }\n    /**\n     * @param {?} entitySrc\n     * @return {?}\n     */\n    function _unknownEntityErrorMsg(entitySrc) {\n        return \"Unknown entity \\\"\" + entitySrc + \"\\\" - use the \\\"&#<decimal>;\\\" or  \\\"&#x<hex>;\\\" syntax\";\n    }\n    var _ControlFlowError = (function () {\n        /**\n         * @param {?} error\n         */\n        function _ControlFlowError(error) {\n            this.error = error;\n        }\n        return _ControlFlowError;\n    }());\n    var _Tokenizer = (function () {\n        /**\n         * @param {?} _file The html source\n         * @param {?} _getTagDefinition\n         * @param {?} _tokenizeIcu Whether to tokenize ICU messages (considered as text nodes when false)\n         * @param {?=} _interpolationConfig\n         */\n        function _Tokenizer(_file, _getTagDefinition, _tokenizeIcu, _interpolationConfig) {\n            if (_interpolationConfig === void 0) { _interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            this._file = _file;\n            this._getTagDefinition = _getTagDefinition;\n            this._tokenizeIcu = _tokenizeIcu;\n            this._interpolationConfig = _interpolationConfig;\n            this._peek = -1;\n            this._nextPeek = -1;\n            this._index = -1;\n            this._line = 0;\n            this._column = -1;\n            this._expansionCaseStack = [];\n            this._inInterpolation = false;\n            this.tokens = [];\n            this.errors = [];\n            this._input = _file.content;\n            this._length = _file.content.length;\n            this._advance();\n        }\n        /**\n         * @param {?} content\n         * @return {?}\n         */\n        _Tokenizer.prototype._processCarriageReturns = function (content) {\n            // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream\n            // In order to keep the original position in the source, we can not\n            // pre-process it.\n            // Instead CRs are processed right before instantiating the tokens.\n            return content.replace(_CR_OR_CRLF_REGEXP, '\\n');\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype.tokenize = function () {\n            while (this._peek !== $EOF) {\n                var /** @type {?} */ start = this._getLocation();\n                try {\n                    if (this._attemptCharCode($LT)) {\n                        if (this._attemptCharCode($BANG)) {\n                            if (this._attemptCharCode($LBRACKET)) {\n                                this._consumeCdata(start);\n                            }\n                            else if (this._attemptCharCode($MINUS)) {\n                                this._consumeComment(start);\n                            }\n                            else {\n                                this._consumeDocType(start);\n                            }\n                        }\n                        else if (this._attemptCharCode($SLASH)) {\n                            this._consumeTagClose(start);\n                        }\n                        else {\n                            this._consumeTagOpen(start);\n                        }\n                    }\n                    else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) {\n                        this._consumeText();\n                    }\n                }\n                catch (e) {\n                    if (e instanceof _ControlFlowError) {\n                        this.errors.push(e.error);\n                    }\n                    else {\n                        throw e;\n                    }\n                }\n            }\n            this._beginToken(TokenType$1.EOF);\n            this._endToken([]);\n            return new TokenizeResult(mergeTextTokens(this.tokens), this.errors);\n        };\n        /**\n         * \\@internal\n         * @return {?}\n         */\n        _Tokenizer.prototype._tokenizeExpansionForm = function () {\n            if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) {\n                this._consumeExpansionFormStart();\n                return true;\n            }\n            if (isExpansionCaseStart(this._peek) && this._isInExpansionForm()) {\n                this._consumeExpansionCaseStart();\n                return true;\n            }\n            if (this._peek === $RBRACE) {\n                if (this._isInExpansionCase()) {\n                    this._consumeExpansionCaseEnd();\n                    return true;\n                }\n                if (this._isInExpansionForm()) {\n                    this._consumeExpansionFormEnd();\n                    return true;\n                }\n            }\n            return false;\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._getLocation = function () {\n            return new ParseLocation(this._file, this._index, this._line, this._column);\n        };\n        /**\n         * @param {?=} start\n         * @param {?=} end\n         * @return {?}\n         */\n        _Tokenizer.prototype._getSpan = function (start, end) {\n            if (start === void 0) { start = this._getLocation(); }\n            if (end === void 0) { end = this._getLocation(); }\n            return new ParseSourceSpan(start, end);\n        };\n        /**\n         * @param {?} type\n         * @param {?=} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._beginToken = function (type, start) {\n            if (start === void 0) { start = this._getLocation(); }\n            this._currentTokenStart = start;\n            this._currentTokenType = type;\n        };\n        /**\n         * @param {?} parts\n         * @param {?=} end\n         * @return {?}\n         */\n        _Tokenizer.prototype._endToken = function (parts, end) {\n            if (end === void 0) { end = this._getLocation(); }\n            var /** @type {?} */ token = new Token$1(this._currentTokenType, parts, new ParseSourceSpan(this._currentTokenStart, end));\n            this.tokens.push(token);\n            this._currentTokenStart = null;\n            this._currentTokenType = null;\n            return token;\n        };\n        /**\n         * @param {?} msg\n         * @param {?} span\n         * @return {?}\n         */\n        _Tokenizer.prototype._createError = function (msg, span) {\n            if (this._isInExpansionForm()) {\n                msg += \" (Do you have an unescaped \\\"{\\\" in your template? Use \\\"{{ '{' }}\\\") to escape it.)\";\n            }\n            var /** @type {?} */ error = new TokenError(msg, this._currentTokenType, span);\n            this._currentTokenStart = null;\n            this._currentTokenType = null;\n            return new _ControlFlowError(error);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._advance = function () {\n            if (this._index >= this._length) {\n                throw this._createError(_unexpectedCharacterErrorMsg($EOF), this._getSpan());\n            }\n            if (this._peek === $LF) {\n                this._line++;\n                this._column = 0;\n            }\n            else if (this._peek !== $LF && this._peek !== $CR) {\n                this._column++;\n            }\n            this._index++;\n            this._peek = this._index >= this._length ? $EOF : this._input.charCodeAt(this._index);\n            this._nextPeek =\n                this._index + 1 >= this._length ? $EOF : this._input.charCodeAt(this._index + 1);\n        };\n        /**\n         * @param {?} charCode\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptCharCode = function (charCode) {\n            if (this._peek === charCode) {\n                this._advance();\n                return true;\n            }\n            return false;\n        };\n        /**\n         * @param {?} charCode\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptCharCodeCaseInsensitive = function (charCode) {\n            if (compareCharCodeCaseInsensitive(this._peek, charCode)) {\n                this._advance();\n                return true;\n            }\n            return false;\n        };\n        /**\n         * @param {?} charCode\n         * @return {?}\n         */\n        _Tokenizer.prototype._requireCharCode = function (charCode) {\n            var /** @type {?} */ location = this._getLocation();\n            if (!this._attemptCharCode(charCode)) {\n                throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(location, location));\n            }\n        };\n        /**\n         * @param {?} chars\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptStr = function (chars) {\n            var /** @type {?} */ len = chars.length;\n            if (this._index + len > this._length) {\n                return false;\n            }\n            var /** @type {?} */ initialPosition = this._savePosition();\n            for (var /** @type {?} */ i = 0; i < len; i++) {\n                if (!this._attemptCharCode(chars.charCodeAt(i))) {\n                    // If attempting to parse the string fails, we want to reset the parser\n                    // to where it was before the attempt\n                    this._restorePosition(initialPosition);\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n         * @param {?} chars\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptStrCaseInsensitive = function (chars) {\n            for (var /** @type {?} */ i = 0; i < chars.length; i++) {\n                if (!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i))) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n         * @param {?} chars\n         * @return {?}\n         */\n        _Tokenizer.prototype._requireStr = function (chars) {\n            var /** @type {?} */ location = this._getLocation();\n            if (!this._attemptStr(chars)) {\n                throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(location));\n            }\n        };\n        /**\n         * @param {?} predicate\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptCharCodeUntilFn = function (predicate) {\n            while (!predicate(this._peek)) {\n                this._advance();\n            }\n        };\n        /**\n         * @param {?} predicate\n         * @param {?} len\n         * @return {?}\n         */\n        _Tokenizer.prototype._requireCharCodeUntilFn = function (predicate, len) {\n            var /** @type {?} */ start = this._getLocation();\n            this._attemptCharCodeUntilFn(predicate);\n            if (this._index - start.offset < len) {\n                throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(start, start));\n            }\n        };\n        /**\n         * @param {?} char\n         * @return {?}\n         */\n        _Tokenizer.prototype._attemptUntilChar = function (char) {\n            while (this._peek !== char) {\n                this._advance();\n            }\n        };\n        /**\n         * @param {?} decodeEntities\n         * @return {?}\n         */\n        _Tokenizer.prototype._readChar = function (decodeEntities) {\n            if (decodeEntities && this._peek === $AMPERSAND) {\n                return this._decodeEntity();\n            }\n            else {\n                var /** @type {?} */ index = this._index;\n                this._advance();\n                return this._input[index];\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._decodeEntity = function () {\n            var /** @type {?} */ start = this._getLocation();\n            this._advance();\n            if (this._attemptCharCode($HASH)) {\n                var /** @type {?} */ isHex = this._attemptCharCode($x) || this._attemptCharCode($X);\n                var /** @type {?} */ numberStart = this._getLocation().offset;\n                this._attemptCharCodeUntilFn(isDigitEntityEnd);\n                if (this._peek != $SEMICOLON) {\n                    throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan());\n                }\n                this._advance();\n                var /** @type {?} */ strNum = this._input.substring(numberStart, this._index - 1);\n                try {\n                    var /** @type {?} */ charCode = parseInt(strNum, isHex ? 16 : 10);\n                    return String.fromCharCode(charCode);\n                }\n                catch (e) {\n                    var /** @type {?} */ entity = this._input.substring(start.offset + 1, this._index - 1);\n                    throw this._createError(_unknownEntityErrorMsg(entity), this._getSpan(start));\n                }\n            }\n            else {\n                var /** @type {?} */ startPosition = this._savePosition();\n                this._attemptCharCodeUntilFn(isNamedEntityEnd);\n                if (this._peek != $SEMICOLON) {\n                    this._restorePosition(startPosition);\n                    return '&';\n                }\n                this._advance();\n                var /** @type {?} */ name_1 = this._input.substring(start.offset + 1, this._index - 1);\n                var /** @type {?} */ char = NAMED_ENTITIES[name_1];\n                if (!char) {\n                    throw this._createError(_unknownEntityErrorMsg(name_1), this._getSpan(start));\n                }\n                return char;\n            }\n        };\n        /**\n         * @param {?} decodeEntities\n         * @param {?} firstCharOfEnd\n         * @param {?} attemptEndRest\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeRawText = function (decodeEntities, firstCharOfEnd, attemptEndRest) {\n            var /** @type {?} */ tagCloseStart;\n            var /** @type {?} */ textStart = this._getLocation();\n            this._beginToken(decodeEntities ? TokenType$1.ESCAPABLE_RAW_TEXT : TokenType$1.RAW_TEXT, textStart);\n            var /** @type {?} */ parts = [];\n            while (true) {\n                tagCloseStart = this._getLocation();\n                if (this._attemptCharCode(firstCharOfEnd) && attemptEndRest()) {\n                    break;\n                }\n                if (this._index > tagCloseStart.offset) {\n                    // add the characters consumed by the previous if statement to the output\n                    parts.push(this._input.substring(tagCloseStart.offset, this._index));\n                }\n                while (this._peek !== firstCharOfEnd) {\n                    parts.push(this._readChar(decodeEntities));\n                }\n            }\n            return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeComment = function (start) {\n            var _this = this;\n            this._beginToken(TokenType$1.COMMENT_START, start);\n            this._requireCharCode($MINUS);\n            this._endToken([]);\n            var /** @type {?} */ textToken = this._consumeRawText(false, $MINUS, function () { return _this._attemptStr('->'); });\n            this._beginToken(TokenType$1.COMMENT_END, textToken.sourceSpan.end);\n            this._endToken([]);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeCdata = function (start) {\n            var _this = this;\n            this._beginToken(TokenType$1.CDATA_START, start);\n            this._requireStr('CDATA[');\n            this._endToken([]);\n            var /** @type {?} */ textToken = this._consumeRawText(false, $RBRACKET, function () { return _this._attemptStr(']>'); });\n            this._beginToken(TokenType$1.CDATA_END, textToken.sourceSpan.end);\n            this._endToken([]);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeDocType = function (start) {\n            this._beginToken(TokenType$1.DOC_TYPE, start);\n            this._attemptUntilChar($GT);\n            this._advance();\n            this._endToken([this._input.substring(start.offset + 2, this._index - 1)]);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumePrefixAndName = function () {\n            var /** @type {?} */ nameOrPrefixStart = this._index;\n            var /** @type {?} */ prefix = null;\n            while (this._peek !== $COLON && !isPrefixEnd(this._peek)) {\n                this._advance();\n            }\n            var /** @type {?} */ nameStart;\n            if (this._peek === $COLON) {\n                this._advance();\n                prefix = this._input.substring(nameOrPrefixStart, this._index - 1);\n                nameStart = this._index;\n            }\n            else {\n                nameStart = nameOrPrefixStart;\n            }\n            this._requireCharCodeUntilFn(isNameEnd, this._index === nameStart ? 1 : 0);\n            var /** @type {?} */ name = this._input.substring(nameStart, this._index);\n            return [prefix, name];\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeTagOpen = function (start) {\n            var /** @type {?} */ savedPos = this._savePosition();\n            var /** @type {?} */ tagName;\n            var /** @type {?} */ lowercaseTagName;\n            try {\n                if (!isAsciiLetter(this._peek)) {\n                    throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan());\n                }\n                var /** @type {?} */ nameStart = this._index;\n                this._consumeTagOpenStart(start);\n                tagName = this._input.substring(nameStart, this._index);\n                lowercaseTagName = tagName.toLowerCase();\n                this._attemptCharCodeUntilFn(isNotWhitespace);\n                while (this._peek !== $SLASH && this._peek !== $GT) {\n                    this._consumeAttributeName();\n                    this._attemptCharCodeUntilFn(isNotWhitespace);\n                    if (this._attemptCharCode($EQ)) {\n                        this._attemptCharCodeUntilFn(isNotWhitespace);\n                        this._consumeAttributeValue();\n                    }\n                    this._attemptCharCodeUntilFn(isNotWhitespace);\n                }\n                this._consumeTagOpenEnd();\n            }\n            catch (e) {\n                if (e instanceof _ControlFlowError) {\n                    // When the start tag is invalid, assume we want a \"<\"\n                    this._restorePosition(savedPos);\n                    // Back to back text tokens are merged at the end\n                    this._beginToken(TokenType$1.TEXT, start);\n                    this._endToken(['<']);\n                    return;\n                }\n                throw e;\n            }\n            var /** @type {?} */ contentTokenType = this._getTagDefinition(tagName).contentType;\n            if (contentTokenType === TagContentType.RAW_TEXT) {\n                this._consumeRawTextWithTagClose(lowercaseTagName, false);\n            }\n            else if (contentTokenType === TagContentType.ESCAPABLE_RAW_TEXT) {\n                this._consumeRawTextWithTagClose(lowercaseTagName, true);\n            }\n        };\n        /**\n         * @param {?} lowercaseTagName\n         * @param {?} decodeEntities\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeRawTextWithTagClose = function (lowercaseTagName, decodeEntities) {\n            var _this = this;\n            var /** @type {?} */ textToken = this._consumeRawText(decodeEntities, $LT, function () {\n                if (!_this._attemptCharCode($SLASH))\n                    return false;\n                _this._attemptCharCodeUntilFn(isNotWhitespace);\n                if (!_this._attemptStrCaseInsensitive(lowercaseTagName))\n                    return false;\n                _this._attemptCharCodeUntilFn(isNotWhitespace);\n                return _this._attemptCharCode($GT);\n            });\n            this._beginToken(TokenType$1.TAG_CLOSE, textToken.sourceSpan.end);\n            this._endToken([null, lowercaseTagName]);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeTagOpenStart = function (start) {\n            this._beginToken(TokenType$1.TAG_OPEN_START, start);\n            var /** @type {?} */ parts = this._consumePrefixAndName();\n            this._endToken(parts);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeAttributeName = function () {\n            this._beginToken(TokenType$1.ATTR_NAME);\n            var /** @type {?} */ prefixAndName = this._consumePrefixAndName();\n            this._endToken(prefixAndName);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeAttributeValue = function () {\n            this._beginToken(TokenType$1.ATTR_VALUE);\n            var /** @type {?} */ value;\n            if (this._peek === $SQ || this._peek === $DQ) {\n                var /** @type {?} */ quoteChar = this._peek;\n                this._advance();\n                var /** @type {?} */ parts = [];\n                while (this._peek !== quoteChar) {\n                    parts.push(this._readChar(true));\n                }\n                value = parts.join('');\n                this._advance();\n            }\n            else {\n                var /** @type {?} */ valueStart = this._index;\n                this._requireCharCodeUntilFn(isNameEnd, 1);\n                value = this._input.substring(valueStart, this._index);\n            }\n            this._endToken([this._processCarriageReturns(value)]);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeTagOpenEnd = function () {\n            var /** @type {?} */ tokenType = this._attemptCharCode($SLASH) ? TokenType$1.TAG_OPEN_END_VOID : TokenType$1.TAG_OPEN_END;\n            this._beginToken(tokenType);\n            this._requireCharCode($GT);\n            this._endToken([]);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeTagClose = function (start) {\n            this._beginToken(TokenType$1.TAG_CLOSE, start);\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            var /** @type {?} */ prefixAndName = this._consumePrefixAndName();\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            this._requireCharCode($GT);\n            this._endToken(prefixAndName);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeExpansionFormStart = function () {\n            this._beginToken(TokenType$1.EXPANSION_FORM_START, this._getLocation());\n            this._requireCharCode($LBRACE);\n            this._endToken([]);\n            this._expansionCaseStack.push(TokenType$1.EXPANSION_FORM_START);\n            this._beginToken(TokenType$1.RAW_TEXT, this._getLocation());\n            var /** @type {?} */ condition = this._readUntil($COMMA);\n            this._endToken([condition], this._getLocation());\n            this._requireCharCode($COMMA);\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            this._beginToken(TokenType$1.RAW_TEXT, this._getLocation());\n            var /** @type {?} */ type = this._readUntil($COMMA);\n            this._endToken([type], this._getLocation());\n            this._requireCharCode($COMMA);\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeExpansionCaseStart = function () {\n            this._beginToken(TokenType$1.EXPANSION_CASE_VALUE, this._getLocation());\n            var /** @type {?} */ value = this._readUntil($LBRACE).trim();\n            this._endToken([value], this._getLocation());\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            this._beginToken(TokenType$1.EXPANSION_CASE_EXP_START, this._getLocation());\n            this._requireCharCode($LBRACE);\n            this._endToken([], this._getLocation());\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            this._expansionCaseStack.push(TokenType$1.EXPANSION_CASE_EXP_START);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeExpansionCaseEnd = function () {\n            this._beginToken(TokenType$1.EXPANSION_CASE_EXP_END, this._getLocation());\n            this._requireCharCode($RBRACE);\n            this._endToken([], this._getLocation());\n            this._attemptCharCodeUntilFn(isNotWhitespace);\n            this._expansionCaseStack.pop();\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeExpansionFormEnd = function () {\n            this._beginToken(TokenType$1.EXPANSION_FORM_END, this._getLocation());\n            this._requireCharCode($RBRACE);\n            this._endToken([]);\n            this._expansionCaseStack.pop();\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._consumeText = function () {\n            var /** @type {?} */ start = this._getLocation();\n            this._beginToken(TokenType$1.TEXT, start);\n            var /** @type {?} */ parts = [];\n            do {\n                if (this._interpolationConfig && this._attemptStr(this._interpolationConfig.start)) {\n                    parts.push(this._interpolationConfig.start);\n                    this._inInterpolation = true;\n                }\n                else if (this._interpolationConfig && this._inInterpolation &&\n                    this._attemptStr(this._interpolationConfig.end)) {\n                    parts.push(this._interpolationConfig.end);\n                    this._inInterpolation = false;\n                }\n                else {\n                    parts.push(this._readChar(true));\n                }\n            } while (!this._isTextEnd());\n            this._endToken([this._processCarriageReturns(parts.join(''))]);\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._isTextEnd = function () {\n            if (this._peek === $LT || this._peek === $EOF) {\n                return true;\n            }\n            if (this._tokenizeIcu && !this._inInterpolation) {\n                if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) {\n                    // start of an expansion form\n                    return true;\n                }\n                if (this._peek === $RBRACE && this._isInExpansionCase()) {\n                    // end of and expansion case\n                    return true;\n                }\n            }\n            return false;\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._savePosition = function () {\n            return [this._peek, this._index, this._column, this._line, this.tokens.length];\n        };\n        /**\n         * @param {?} char\n         * @return {?}\n         */\n        _Tokenizer.prototype._readUntil = function (char) {\n            var /** @type {?} */ start = this._index;\n            this._attemptUntilChar(char);\n            return this._input.substring(start, this._index);\n        };\n        /**\n         * @param {?} position\n         * @return {?}\n         */\n        _Tokenizer.prototype._restorePosition = function (position) {\n            this._peek = position[0];\n            this._index = position[1];\n            this._column = position[2];\n            this._line = position[3];\n            var /** @type {?} */ nbTokens = position[4];\n            if (nbTokens < this.tokens.length) {\n                // remove any extra tokens\n                this.tokens = this.tokens.slice(0, nbTokens);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._isInExpansionCase = function () {\n            return this._expansionCaseStack.length > 0 &&\n                this._expansionCaseStack[this._expansionCaseStack.length - 1] ===\n                    TokenType$1.EXPANSION_CASE_EXP_START;\n        };\n        /**\n         * @return {?}\n         */\n        _Tokenizer.prototype._isInExpansionForm = function () {\n            return this._expansionCaseStack.length > 0 &&\n                this._expansionCaseStack[this._expansionCaseStack.length - 1] ===\n                    TokenType$1.EXPANSION_FORM_START;\n        };\n        return _Tokenizer;\n    }());\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isNotWhitespace(code) {\n        return !isWhitespace(code) || code === $EOF;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isNameEnd(code) {\n        return isWhitespace(code) || code === $GT || code === $SLASH ||\n            code === $SQ || code === $DQ || code === $EQ;\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isPrefixEnd(code) {\n        return (code < $a || $z < code) && (code < $A || $Z < code) &&\n            (code < $0 || code > $9);\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isDigitEntityEnd(code) {\n        return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function isNamedEntityEnd(code) {\n        return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);\n    }\n    /**\n     * @param {?} input\n     * @param {?} offset\n     * @param {?} interpolationConfig\n     * @return {?}\n     */\n    function isExpansionFormStart(input, offset, interpolationConfig) {\n        var /** @type {?} */ isInterpolationStart = interpolationConfig ? input.indexOf(interpolationConfig.start, offset) == offset : false;\n        return input.charCodeAt(offset) == $LBRACE && !isInterpolationStart;\n    }\n    /**\n     * @param {?} peek\n     * @return {?}\n     */\n    function isExpansionCaseStart(peek) {\n        return peek === $EQ || isAsciiLetter(peek);\n    }\n    /**\n     * @param {?} code1\n     * @param {?} code2\n     * @return {?}\n     */\n    function compareCharCodeCaseInsensitive(code1, code2) {\n        return toUpperCaseCharCode(code1) == toUpperCaseCharCode(code2);\n    }\n    /**\n     * @param {?} code\n     * @return {?}\n     */\n    function toUpperCaseCharCode(code) {\n        return code >= $a && code <= $z ? code - $a + $A : code;\n    }\n    /**\n     * @param {?} srcTokens\n     * @return {?}\n     */\n    function mergeTextTokens(srcTokens) {\n        var /** @type {?} */ dstTokens = [];\n        var /** @type {?} */ lastDstToken;\n        for (var /** @type {?} */ i = 0; i < srcTokens.length; i++) {\n            var /** @type {?} */ token = srcTokens[i];\n            if (lastDstToken && lastDstToken.type == TokenType$1.TEXT && token.type == TokenType$1.TEXT) {\n                lastDstToken.parts[0] += token.parts[0];\n                lastDstToken.sourceSpan.end = token.sourceSpan.end;\n            }\n            else {\n                lastDstToken = token;\n                dstTokens.push(lastDstToken);\n            }\n        }\n        return dstTokens;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$5 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var TreeError = (function (_super) {\n        __extends$5(TreeError, _super);\n        /**\n         * @param {?} elementName\n         * @param {?} span\n         * @param {?} msg\n         */\n        function TreeError(elementName, span, msg) {\n            _super.call(this, span, msg);\n            this.elementName = elementName;\n        }\n        /**\n         * @param {?} elementName\n         * @param {?} span\n         * @param {?} msg\n         * @return {?}\n         */\n        TreeError.create = function (elementName, span, msg) {\n            return new TreeError(elementName, span, msg);\n        };\n        return TreeError;\n    }(ParseError));\n    var ParseTreeResult = (function () {\n        /**\n         * @param {?} rootNodes\n         * @param {?} errors\n         */\n        function ParseTreeResult(rootNodes, errors) {\n            this.rootNodes = rootNodes;\n            this.errors = errors;\n        }\n        return ParseTreeResult;\n    }());\n    var Parser$1 = (function () {\n        /**\n         * @param {?} getTagDefinition\n         */\n        function Parser(getTagDefinition) {\n            this.getTagDefinition = getTagDefinition;\n        }\n        /**\n         * @param {?} source\n         * @param {?} url\n         * @param {?=} parseExpansionForms\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        Parser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n            if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ tokensAndErrors = tokenize(source, url, this.getTagDefinition, parseExpansionForms, interpolationConfig);\n            var /** @type {?} */ treeAndErrors = new _TreeBuilder(tokensAndErrors.tokens, this.getTagDefinition).build();\n            return new ParseTreeResult(treeAndErrors.rootNodes, ((tokensAndErrors.errors)).concat(treeAndErrors.errors));\n        };\n        return Parser;\n    }());\n    var _TreeBuilder = (function () {\n        /**\n         * @param {?} tokens\n         * @param {?} getTagDefinition\n         */\n        function _TreeBuilder(tokens, getTagDefinition) {\n            this.tokens = tokens;\n            this.getTagDefinition = getTagDefinition;\n            this._index = -1;\n            this._rootNodes = [];\n            this._errors = [];\n            this._elementStack = [];\n            this._advance();\n        }\n        /**\n         * @return {?}\n         */\n        _TreeBuilder.prototype.build = function () {\n            while (this._peek.type !== TokenType$1.EOF) {\n                if (this._peek.type === TokenType$1.TAG_OPEN_START) {\n                    this._consumeStartTag(this._advance());\n                }\n                else if (this._peek.type === TokenType$1.TAG_CLOSE) {\n                    this._consumeEndTag(this._advance());\n                }\n                else if (this._peek.type === TokenType$1.CDATA_START) {\n                    this._closeVoidElement();\n                    this._consumeCdata(this._advance());\n                }\n                else if (this._peek.type === TokenType$1.COMMENT_START) {\n                    this._closeVoidElement();\n                    this._consumeComment(this._advance());\n                }\n                else if (this._peek.type === TokenType$1.TEXT || this._peek.type === TokenType$1.RAW_TEXT ||\n                    this._peek.type === TokenType$1.ESCAPABLE_RAW_TEXT) {\n                    this._closeVoidElement();\n                    this._consumeText(this._advance());\n                }\n                else if (this._peek.type === TokenType$1.EXPANSION_FORM_START) {\n                    this._consumeExpansion(this._advance());\n                }\n                else {\n                    // Skip all other tokens...\n                    this._advance();\n                }\n            }\n            return new ParseTreeResult(this._rootNodes, this._errors);\n        };\n        /**\n         * @return {?}\n         */\n        _TreeBuilder.prototype._advance = function () {\n            var /** @type {?} */ prev = this._peek;\n            if (this._index < this.tokens.length - 1) {\n                // Note: there is always an EOF token at the end\n                this._index++;\n            }\n            this._peek = this.tokens[this._index];\n            return prev;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        _TreeBuilder.prototype._advanceIf = function (type) {\n            if (this._peek.type === type) {\n                return this._advance();\n            }\n            return null;\n        };\n        /**\n         * @param {?} startToken\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeCdata = function (startToken) {\n            this._consumeText(this._advance());\n            this._advanceIf(TokenType$1.CDATA_END);\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeComment = function (token) {\n            var /** @type {?} */ text = this._advanceIf(TokenType$1.RAW_TEXT);\n            this._advanceIf(TokenType$1.COMMENT_END);\n            var /** @type {?} */ value = isPresent(text) ? text.parts[0].trim() : null;\n            this._addToParent(new Comment(value, token.sourceSpan));\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeExpansion = function (token) {\n            var /** @type {?} */ switchValue = this._advance();\n            var /** @type {?} */ type = this._advance();\n            var /** @type {?} */ cases = [];\n            // read =\n            while (this._peek.type === TokenType$1.EXPANSION_CASE_VALUE) {\n                var /** @type {?} */ expCase = this._parseExpansionCase();\n                if (!expCase)\n                    return; // error\n                cases.push(expCase);\n            }\n            // read the final }\n            if (this._peek.type !== TokenType$1.EXPANSION_FORM_END) {\n                this._errors.push(TreeError.create(null, this._peek.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n                return;\n            }\n            var /** @type {?} */ sourceSpan = new ParseSourceSpan(token.sourceSpan.start, this._peek.sourceSpan.end);\n            this._addToParent(new Expansion(switchValue.parts[0], type.parts[0], cases, sourceSpan, switchValue.sourceSpan));\n            this._advance();\n        };\n        /**\n         * @return {?}\n         */\n        _TreeBuilder.prototype._parseExpansionCase = function () {\n            var /** @type {?} */ value = this._advance();\n            // read {\n            if (this._peek.type !== TokenType$1.EXPANSION_CASE_EXP_START) {\n                this._errors.push(TreeError.create(null, this._peek.sourceSpan, \"Invalid ICU message. Missing '{'.\"));\n                return null;\n            }\n            // read until }\n            var /** @type {?} */ start = this._advance();\n            var /** @type {?} */ exp = this._collectExpansionExpTokens(start);\n            if (!exp)\n                return null;\n            var /** @type {?} */ end = this._advance();\n            exp.push(new Token$1(TokenType$1.EOF, [], end.sourceSpan));\n            // parse everything in between { and }\n            var /** @type {?} */ parsedExp = new _TreeBuilder(exp, this.getTagDefinition).build();\n            if (parsedExp.errors.length > 0) {\n                this._errors = this._errors.concat(/** @type {?} */ (parsedExp.errors));\n                return null;\n            }\n            var /** @type {?} */ sourceSpan = new ParseSourceSpan(value.sourceSpan.start, end.sourceSpan.end);\n            var /** @type {?} */ expSourceSpan = new ParseSourceSpan(start.sourceSpan.start, end.sourceSpan.end);\n            return new ExpansionCase(value.parts[0], parsedExp.rootNodes, sourceSpan, value.sourceSpan, expSourceSpan);\n        };\n        /**\n         * @param {?} start\n         * @return {?}\n         */\n        _TreeBuilder.prototype._collectExpansionExpTokens = function (start) {\n            var /** @type {?} */ exp = [];\n            var /** @type {?} */ expansionFormStack = [TokenType$1.EXPANSION_CASE_EXP_START];\n            while (true) {\n                if (this._peek.type === TokenType$1.EXPANSION_FORM_START ||\n                    this._peek.type === TokenType$1.EXPANSION_CASE_EXP_START) {\n                    expansionFormStack.push(this._peek.type);\n                }\n                if (this._peek.type === TokenType$1.EXPANSION_CASE_EXP_END) {\n                    if (lastOnStack(expansionFormStack, TokenType$1.EXPANSION_CASE_EXP_START)) {\n                        expansionFormStack.pop();\n                        if (expansionFormStack.length == 0)\n                            return exp;\n                    }\n                    else {\n                        this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n                        return null;\n                    }\n                }\n                if (this._peek.type === TokenType$1.EXPANSION_FORM_END) {\n                    if (lastOnStack(expansionFormStack, TokenType$1.EXPANSION_FORM_START)) {\n                        expansionFormStack.pop();\n                    }\n                    else {\n                        this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n                        return null;\n                    }\n                }\n                if (this._peek.type === TokenType$1.EOF) {\n                    this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n                    return null;\n                }\n                exp.push(this._advance());\n            }\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeText = function (token) {\n            var /** @type {?} */ text = token.parts[0];\n            if (text.length > 0 && text[0] == '\\n') {\n                var /** @type {?} */ parent_1 = this._getParentElement();\n                if (isPresent(parent_1) && parent_1.children.length == 0 &&\n                    this.getTagDefinition(parent_1.name).ignoreFirstLf) {\n                    text = text.substring(1);\n                }\n            }\n            if (text.length > 0) {\n                this._addToParent(new Text(text, token.sourceSpan));\n            }\n        };\n        /**\n         * @return {?}\n         */\n        _TreeBuilder.prototype._closeVoidElement = function () {\n            if (this._elementStack.length > 0) {\n                var /** @type {?} */ el = this._elementStack[this._elementStack.length - 1];\n                if (this.getTagDefinition(el.name).isVoid) {\n                    this._elementStack.pop();\n                }\n            }\n        };\n        /**\n         * @param {?} startTagToken\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeStartTag = function (startTagToken) {\n            var /** @type {?} */ prefix = startTagToken.parts[0];\n            var /** @type {?} */ name = startTagToken.parts[1];\n            var /** @type {?} */ attrs = [];\n            while (this._peek.type === TokenType$1.ATTR_NAME) {\n                attrs.push(this._consumeAttr(this._advance()));\n            }\n            var /** @type {?} */ fullName = this._getElementFullName(prefix, name, this._getParentElement());\n            var /** @type {?} */ selfClosing = false;\n            // Note: There could have been a tokenizer error\n            // so that we don't get a token for the end tag...\n            if (this._peek.type === TokenType$1.TAG_OPEN_END_VOID) {\n                this._advance();\n                selfClosing = true;\n                var /** @type {?} */ tagDef = this.getTagDefinition(fullName);\n                if (!(tagDef.canSelfClose || getNsPrefix(fullName) !== null || tagDef.isVoid)) {\n                    this._errors.push(TreeError.create(fullName, startTagToken.sourceSpan, \"Only void and foreign elements can be self closed \\\"\" + startTagToken.parts[1] + \"\\\"\"));\n                }\n            }\n            else if (this._peek.type === TokenType$1.TAG_OPEN_END) {\n                this._advance();\n                selfClosing = false;\n            }\n            var /** @type {?} */ end = this._peek.sourceSpan.start;\n            var /** @type {?} */ span = new ParseSourceSpan(startTagToken.sourceSpan.start, end);\n            var /** @type {?} */ el = new Element(fullName, attrs, [], span, span, null);\n            this._pushElement(el);\n            if (selfClosing) {\n                this._popElement(fullName);\n                el.endSourceSpan = span;\n            }\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        _TreeBuilder.prototype._pushElement = function (el) {\n            if (this._elementStack.length > 0) {\n                var /** @type {?} */ parentEl = this._elementStack[this._elementStack.length - 1];\n                if (this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) {\n                    this._elementStack.pop();\n                }\n            }\n            var /** @type {?} */ tagDef = this.getTagDefinition(el.name);\n            var _a = this._getParentElementSkippingContainers(), parent = _a.parent, container = _a.container;\n            if (parent && tagDef.requireExtraParent(parent.name)) {\n                var /** @type {?} */ newParent = new Element(tagDef.parentToAdd, [], [], el.sourceSpan, el.startSourceSpan, el.endSourceSpan);\n                this._insertBeforeContainer(parent, container, newParent);\n            }\n            this._addToParent(el);\n            this._elementStack.push(el);\n        };\n        /**\n         * @param {?} endTagToken\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeEndTag = function (endTagToken) {\n            var /** @type {?} */ fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());\n            if (this._getParentElement()) {\n                this._getParentElement().endSourceSpan = endTagToken.sourceSpan;\n            }\n            if (this.getTagDefinition(fullName).isVoid) {\n                this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, \"Void elements do not have end tags \\\"\" + endTagToken.parts[1] + \"\\\"\"));\n            }\n            else if (!this._popElement(fullName)) {\n                this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, \"Unexpected closing tag \\\"\" + endTagToken.parts[1] + \"\\\"\"));\n            }\n        };\n        /**\n         * @param {?} fullName\n         * @return {?}\n         */\n        _TreeBuilder.prototype._popElement = function (fullName) {\n            for (var /** @type {?} */ stackIndex = this._elementStack.length - 1; stackIndex >= 0; stackIndex--) {\n                var /** @type {?} */ el = this._elementStack[stackIndex];\n                if (el.name == fullName) {\n                    this._elementStack.splice(stackIndex, this._elementStack.length - stackIndex);\n                    return true;\n                }\n                if (!this.getTagDefinition(el.name).closedByParent) {\n                    return false;\n                }\n            }\n            return false;\n        };\n        /**\n         * @param {?} attrName\n         * @return {?}\n         */\n        _TreeBuilder.prototype._consumeAttr = function (attrName) {\n            var /** @type {?} */ fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);\n            var /** @type {?} */ end = attrName.sourceSpan.end;\n            var /** @type {?} */ value = '';\n            var /** @type {?} */ valueSpan;\n            if (this._peek.type === TokenType$1.ATTR_VALUE) {\n                var /** @type {?} */ valueToken = this._advance();\n                value = valueToken.parts[0];\n                end = valueToken.sourceSpan.end;\n                valueSpan = valueToken.sourceSpan;\n            }\n            return new Attribute$1(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, end), valueSpan);\n        };\n        /**\n         * @return {?}\n         */\n        _TreeBuilder.prototype._getParentElement = function () {\n            return this._elementStack.length > 0 ? this._elementStack[this._elementStack.length - 1] : null;\n        };\n        /**\n         * Returns the parent in the DOM and the container.\n         *\n         * `<ng-container>` elements are skipped as they are not rendered as DOM element.\n         * @return {?}\n         */\n        _TreeBuilder.prototype._getParentElementSkippingContainers = function () {\n            var /** @type {?} */ container = null;\n            for (var /** @type {?} */ i = this._elementStack.length - 1; i >= 0; i--) {\n                if (this._elementStack[i].name !== 'ng-container') {\n                    return { parent: this._elementStack[i], container: container };\n                }\n                container = this._elementStack[i];\n            }\n            return { parent: this._elementStack[this._elementStack.length - 1], container: container };\n        };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        _TreeBuilder.prototype._addToParent = function (node) {\n            var /** @type {?} */ parent = this._getParentElement();\n            if (isPresent(parent)) {\n                parent.children.push(node);\n            }\n            else {\n                this._rootNodes.push(node);\n            }\n        };\n        /**\n         * Insert a node between the parent and the container.\n         * When no container is given, the node is appended as a child of the parent.\n         * Also updates the element stack accordingly.\n         *\n         * \\@internal\n         * @param {?} parent\n         * @param {?} container\n         * @param {?} node\n         * @return {?}\n         */\n        _TreeBuilder.prototype._insertBeforeContainer = function (parent, container, node) {\n            if (!container) {\n                this._addToParent(node);\n                this._elementStack.push(node);\n            }\n            else {\n                if (parent) {\n                    // replace the container with the new node in the children\n                    var /** @type {?} */ index = parent.children.indexOf(container);\n                    parent.children[index] = node;\n                }\n                else {\n                    this._rootNodes.push(node);\n                }\n                node.children.push(container);\n                this._elementStack.splice(this._elementStack.indexOf(container), 0, node);\n            }\n        };\n        /**\n         * @param {?} prefix\n         * @param {?} localName\n         * @param {?} parentElement\n         * @return {?}\n         */\n        _TreeBuilder.prototype._getElementFullName = function (prefix, localName, parentElement) {\n            if (isBlank(prefix)) {\n                prefix = this.getTagDefinition(localName).implicitNamespacePrefix;\n                if (isBlank(prefix) && isPresent(parentElement)) {\n                    prefix = getNsPrefix(parentElement.name);\n                }\n            }\n            return mergeNsAndName(prefix, localName);\n        };\n        return _TreeBuilder;\n    }());\n    /**\n     * @param {?} stack\n     * @param {?} element\n     * @return {?}\n     */\n    function lastOnStack(stack, element) {\n        return stack.length > 0 && stack[stack.length - 1] === element;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var Message = (function () {\n        /**\n         * @param {?} nodes message AST\n         * @param {?} placeholders maps placeholder names to static content\n         * @param {?} placeholderToMessage maps placeholder names to messages (used for nested ICU messages)\n         * @param {?} meaning\n         * @param {?} description\n         */\n        function Message(nodes, placeholders, placeholderToMessage, meaning, description) {\n            this.nodes = nodes;\n            this.placeholders = placeholders;\n            this.placeholderToMessage = placeholderToMessage;\n            this.meaning = meaning;\n            this.description = description;\n        }\n        return Message;\n    }());\n    var Text$1 = (function () {\n        /**\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function Text(value, sourceSpan) {\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n        return Text;\n    }());\n    var Container = (function () {\n        /**\n         * @param {?} children\n         * @param {?} sourceSpan\n         */\n        function Container(children, sourceSpan) {\n            this.children = children;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Container.prototype.visit = function (visitor, context) { return visitor.visitContainer(this, context); };\n        return Container;\n    }());\n    var Icu = (function () {\n        /**\n         * @param {?} expression\n         * @param {?} type\n         * @param {?} cases\n         * @param {?} sourceSpan\n         */\n        function Icu(expression, type, cases, sourceSpan) {\n            this.expression = expression;\n            this.type = type;\n            this.cases = cases;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Icu.prototype.visit = function (visitor, context) { return visitor.visitIcu(this, context); };\n        return Icu;\n    }());\n    var TagPlaceholder = (function () {\n        /**\n         * @param {?} tag\n         * @param {?} attrs\n         * @param {?} startName\n         * @param {?} closeName\n         * @param {?} children\n         * @param {?} isVoid\n         * @param {?} sourceSpan\n         */\n        function TagPlaceholder(tag, attrs, startName, closeName, children, isVoid, sourceSpan) {\n            this.tag = tag;\n            this.attrs = attrs;\n            this.startName = startName;\n            this.closeName = closeName;\n            this.children = children;\n            this.isVoid = isVoid;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        TagPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitTagPlaceholder(this, context); };\n        return TagPlaceholder;\n    }());\n    var Placeholder = (function () {\n        /**\n         * @param {?} value\n         * @param {?} name\n         * @param {?} sourceSpan\n         */\n        function Placeholder(value, name, sourceSpan) {\n            this.value = value;\n            this.name = name;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        Placeholder.prototype.visit = function (visitor, context) { return visitor.visitPlaceholder(this, context); };\n        return Placeholder;\n    }());\n    var IcuPlaceholder = (function () {\n        /**\n         * @param {?} value\n         * @param {?} name\n         * @param {?} sourceSpan\n         */\n        function IcuPlaceholder(value, name, sourceSpan) {\n            this.value = value;\n            this.name = name;\n            this.sourceSpan = sourceSpan;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?=} context\n         * @return {?}\n         */\n        IcuPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitIcuPlaceholder(this, context); };\n        return IcuPlaceholder;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var /** @type {?} */ TAG_TO_PLACEHOLDER_NAMES = {\n        'A': 'LINK',\n        'B': 'BOLD_TEXT',\n        'BR': 'LINE_BREAK',\n        'EM': 'EMPHASISED_TEXT',\n        'H1': 'HEADING_LEVEL1',\n        'H2': 'HEADING_LEVEL2',\n        'H3': 'HEADING_LEVEL3',\n        'H4': 'HEADING_LEVEL4',\n        'H5': 'HEADING_LEVEL5',\n        'H6': 'HEADING_LEVEL6',\n        'HR': 'HORIZONTAL_RULE',\n        'I': 'ITALIC_TEXT',\n        'LI': 'LIST_ITEM',\n        'LINK': 'MEDIA_LINK',\n        'OL': 'ORDERED_LIST',\n        'P': 'PARAGRAPH',\n        'Q': 'QUOTATION',\n        'S': 'STRIKETHROUGH_TEXT',\n        'SMALL': 'SMALL_TEXT',\n        'SUB': 'SUBSTRIPT',\n        'SUP': 'SUPERSCRIPT',\n        'TBODY': 'TABLE_BODY',\n        'TD': 'TABLE_CELL',\n        'TFOOT': 'TABLE_FOOTER',\n        'TH': 'TABLE_HEADER_CELL',\n        'THEAD': 'TABLE_HEADER',\n        'TR': 'TABLE_ROW',\n        'TT': 'MONOSPACED_TEXT',\n        'U': 'UNDERLINED_TEXT',\n        'UL': 'UNORDERED_LIST',\n    };\n    /**\n     * Creates unique names for placeholder with different content.\n     *\n     * Returns the same placeholder name when the content is identical.\n     *\n     * \\@internal\n     */\n    var PlaceholderRegistry = (function () {\n        function PlaceholderRegistry() {\n            this._placeHolderNameCounts = {};\n            this._signatureToName = {};\n        }\n        /**\n         * @param {?} tag\n         * @param {?} attrs\n         * @param {?} isVoid\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype.getStartTagPlaceholderName = function (tag, attrs, isVoid) {\n            var /** @type {?} */ signature = this._hashTag(tag, attrs, isVoid);\n            if (this._signatureToName[signature]) {\n                return this._signatureToName[signature];\n            }\n            var /** @type {?} */ upperTag = tag.toUpperCase();\n            var /** @type {?} */ baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || \"TAG_\" + upperTag;\n            var /** @type {?} */ name = this._generateUniqueName(isVoid ? baseName : \"START_\" + baseName);\n            this._signatureToName[signature] = name;\n            return name;\n        };\n        /**\n         * @param {?} tag\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype.getCloseTagPlaceholderName = function (tag) {\n            var /** @type {?} */ signature = this._hashClosingTag(tag);\n            if (this._signatureToName[signature]) {\n                return this._signatureToName[signature];\n            }\n            var /** @type {?} */ upperTag = tag.toUpperCase();\n            var /** @type {?} */ baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || \"TAG_\" + upperTag;\n            var /** @type {?} */ name = this._generateUniqueName(\"CLOSE_\" + baseName);\n            this._signatureToName[signature] = name;\n            return name;\n        };\n        /**\n         * @param {?} name\n         * @param {?} content\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype.getPlaceholderName = function (name, content) {\n            var /** @type {?} */ upperName = name.toUpperCase();\n            var /** @type {?} */ signature = \"PH: \" + upperName + \"=\" + content;\n            if (this._signatureToName[signature]) {\n                return this._signatureToName[signature];\n            }\n            var /** @type {?} */ uniqueName = this._generateUniqueName(upperName);\n            this._signatureToName[signature] = uniqueName;\n            return uniqueName;\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype.getUniquePlaceholder = function (name) {\n            return this._generateUniqueName(name.toUpperCase());\n        };\n        /**\n         * @param {?} tag\n         * @param {?} attrs\n         * @param {?} isVoid\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype._hashTag = function (tag, attrs, isVoid) {\n            var /** @type {?} */ start = \"<\" + tag;\n            var /** @type {?} */ strAttrs = Object.keys(attrs).sort().map(function (name) { return (\" \" + name + \"=\" + attrs[name]); }).join('');\n            var /** @type {?} */ end = isVoid ? '/>' : \"></\" + tag + \">\";\n            return start + strAttrs + end;\n        };\n        /**\n         * @param {?} tag\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype._hashClosingTag = function (tag) { return this._hashTag(\"/\" + tag, {}, false); };\n        /**\n         * @param {?} base\n         * @return {?}\n         */\n        PlaceholderRegistry.prototype._generateUniqueName = function (base) {\n            var /** @type {?} */ seen = this._placeHolderNameCounts.hasOwnProperty(base);\n            if (!seen) {\n                this._placeHolderNameCounts[base] = 1;\n                return base;\n            }\n            var /** @type {?} */ id = this._placeHolderNameCounts[base];\n            this._placeHolderNameCounts[base] = id + 1;\n            return base + \"_\" + id;\n        };\n        return PlaceholderRegistry;\n    }());\n\n    var /** @type {?} */ _expParser = new Parser(new Lexer());\n    /**\n     * Returns a function converting html nodes to an i18n Message given an interpolationConfig\n     * @param {?} interpolationConfig\n     * @return {?}\n     */\n    function createI18nMessageFactory(interpolationConfig) {\n        var /** @type {?} */ visitor = new _I18nVisitor(_expParser, interpolationConfig);\n        return function (nodes, meaning, description) {\n            return visitor.toI18nMessage(nodes, meaning, description);\n        };\n    }\n    var _I18nVisitor = (function () {\n        /**\n         * @param {?} _expressionParser\n         * @param {?} _interpolationConfig\n         */\n        function _I18nVisitor(_expressionParser, _interpolationConfig) {\n            this._expressionParser = _expressionParser;\n            this._interpolationConfig = _interpolationConfig;\n        }\n        /**\n         * @param {?} nodes\n         * @param {?} meaning\n         * @param {?} description\n         * @return {?}\n         */\n        _I18nVisitor.prototype.toI18nMessage = function (nodes, meaning, description) {\n            this._isIcu = nodes.length == 1 && nodes[0] instanceof Expansion;\n            this._icuDepth = 0;\n            this._placeholderRegistry = new PlaceholderRegistry();\n            this._placeholderToContent = {};\n            this._placeholderToMessage = {};\n            var /** @type {?} */ i18nodes = visitAll(this, nodes, {});\n            return new Message(i18nodes, this._placeholderToContent, this._placeholderToMessage, meaning, description);\n        };\n        /**\n         * @param {?} el\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitElement = function (el, context) {\n            var /** @type {?} */ children = visitAll(this, el.children);\n            var /** @type {?} */ attrs = {};\n            el.attrs.forEach(function (attr) {\n                // Do not visit the attributes, translatable ones are top-level ASTs\n                attrs[attr.name] = attr.value;\n            });\n            var /** @type {?} */ isVoid = getHtmlTagDefinition(el.name).isVoid;\n            var /** @type {?} */ startPhName = this._placeholderRegistry.getStartTagPlaceholderName(el.name, attrs, isVoid);\n            this._placeholderToContent[startPhName] = el.sourceSpan.toString();\n            var /** @type {?} */ closePhName = '';\n            if (!isVoid) {\n                closePhName = this._placeholderRegistry.getCloseTagPlaceholderName(el.name);\n                this._placeholderToContent[closePhName] = \"</\" + el.name + \">\";\n            }\n            return new TagPlaceholder(el.name, attrs, startPhName, closePhName, children, isVoid, el.sourceSpan);\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitAttribute = function (attribute, context) {\n            return this._visitTextWithInterpolation(attribute.value, attribute.sourceSpan);\n        };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitText = function (text, context) {\n            return this._visitTextWithInterpolation(text.value, text.sourceSpan);\n        };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitComment = function (comment, context) { return null; };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitExpansion = function (icu, context) {\n            var _this = this;\n            this._icuDepth++;\n            var /** @type {?} */ i18nIcuCases = {};\n            var /** @type {?} */ i18nIcu = new Icu(icu.switchValue, icu.type, i18nIcuCases, icu.sourceSpan);\n            icu.cases.forEach(function (caze) {\n                i18nIcuCases[caze.value] = new Container(caze.expression.map(function (node) { return node.visit(_this, {}); }), caze.expSourceSpan);\n            });\n            this._icuDepth--;\n            if (this._isIcu || this._icuDepth > 0) {\n                // Returns an ICU node when:\n                // - the message (vs a part of the message) is an ICU message, or\n                // - the ICU message is nested.\n                var /** @type {?} */ expPh = this._placeholderRegistry.getUniquePlaceholder(\"VAR_\" + icu.type);\n                i18nIcu.expressionPlaceholder = expPh;\n                this._placeholderToContent[expPh] = icu.switchValue;\n                return i18nIcu;\n            }\n            // Else returns a placeholder\n            // ICU placeholders should not be replaced with their original content but with the their\n            // translations. We need to create a new visitor (they are not re-entrant) to compute the\n            // message id.\n            // TODO(vicb): add a html.Node -> i18n.Message cache to avoid having to re-create the msg\n            var /** @type {?} */ phName = this._placeholderRegistry.getPlaceholderName('ICU', icu.sourceSpan.toString());\n            var /** @type {?} */ visitor = new _I18nVisitor(this._expressionParser, this._interpolationConfig);\n            this._placeholderToMessage[phName] = visitor.toI18nMessage([icu], '', '');\n            return new IcuPlaceholder(i18nIcu, phName, icu.sourceSpan);\n        };\n        /**\n         * @param {?} icuCase\n         * @param {?} context\n         * @return {?}\n         */\n        _I18nVisitor.prototype.visitExpansionCase = function (icuCase, context) {\n            throw new Error('Unreachable code');\n        };\n        /**\n         * @param {?} text\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        _I18nVisitor.prototype._visitTextWithInterpolation = function (text, sourceSpan) {\n            var /** @type {?} */ splitInterpolation = this._expressionParser.splitInterpolation(text, sourceSpan.start.toString(), this._interpolationConfig);\n            if (!splitInterpolation) {\n                // No expression, return a single text\n                return new Text$1(text, sourceSpan);\n            }\n            // Return a group of text + expressions\n            var /** @type {?} */ nodes = [];\n            var /** @type {?} */ container = new Container(nodes, sourceSpan);\n            var _a = this._interpolationConfig, sDelimiter = _a.start, eDelimiter = _a.end;\n            for (var /** @type {?} */ i = 0; i < splitInterpolation.strings.length - 1; i++) {\n                var /** @type {?} */ expression = splitInterpolation.expressions[i];\n                var /** @type {?} */ baseName = _extractPlaceholderName(expression) || 'INTERPOLATION';\n                var /** @type {?} */ phName = this._placeholderRegistry.getPlaceholderName(baseName, expression);\n                if (splitInterpolation.strings[i].length) {\n                    // No need to add empty strings\n                    nodes.push(new Text$1(splitInterpolation.strings[i], sourceSpan));\n                }\n                nodes.push(new Placeholder(expression, phName, sourceSpan));\n                this._placeholderToContent[phName] = sDelimiter + expression + eDelimiter;\n            }\n            // The last index contains no expression\n            var /** @type {?} */ lastStringIdx = splitInterpolation.strings.length - 1;\n            if (splitInterpolation.strings[lastStringIdx].length) {\n                nodes.push(new Text$1(splitInterpolation.strings[lastStringIdx], sourceSpan));\n            }\n            return container;\n        };\n        return _I18nVisitor;\n    }());\n    var /** @type {?} */ _CUSTOM_PH_EXP = /\\/\\/[\\s\\S]*i18n[\\s\\S]*\\([\\s\\S]*ph[\\s\\S]*=[\\s\\S]*\"([\\s\\S]*?)\"[\\s\\S]*\\)/g;\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function _extractPlaceholderName(input) {\n        return input.split(_CUSTOM_PH_EXP)[1];\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$7 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * An i18n error.\n     */\n    var I18nError = (function (_super) {\n        __extends$7(I18nError, _super);\n        /**\n         * @param {?} span\n         * @param {?} msg\n         */\n        function I18nError(span, msg) {\n            _super.call(this, span, msg);\n        }\n        return I18nError;\n    }(ParseError));\n\n    var /** @type {?} */ _I18N_ATTR = 'i18n';\n    var /** @type {?} */ _I18N_ATTR_PREFIX = 'i18n-';\n    var /** @type {?} */ _I18N_COMMENT_PREFIX_REGEXP = /^i18n:?/;\n    /**\n     * Extract translatable messages from an html AST\n     * @param {?} nodes\n     * @param {?} interpolationConfig\n     * @param {?} implicitTags\n     * @param {?} implicitAttrs\n     * @return {?}\n     */\n    function extractMessages(nodes, interpolationConfig, implicitTags, implicitAttrs) {\n        var /** @type {?} */ visitor = new _Visitor(implicitTags, implicitAttrs);\n        return visitor.extract(nodes, interpolationConfig);\n    }\n    /**\n     * @param {?} nodes\n     * @param {?} translations\n     * @param {?} interpolationConfig\n     * @param {?} implicitTags\n     * @param {?} implicitAttrs\n     * @return {?}\n     */\n    function mergeTranslations(nodes, translations, interpolationConfig, implicitTags, implicitAttrs) {\n        var /** @type {?} */ visitor = new _Visitor(implicitTags, implicitAttrs);\n        return visitor.merge(nodes, translations, interpolationConfig);\n    }\n    var ExtractionResult = (function () {\n        /**\n         * @param {?} messages\n         * @param {?} errors\n         */\n        function ExtractionResult(messages, errors) {\n            this.messages = messages;\n            this.errors = errors;\n        }\n        return ExtractionResult;\n    }());\n    var _VisitorMode = {};\n    _VisitorMode.Extract = 0;\n    _VisitorMode.Merge = 1;\n    _VisitorMode[_VisitorMode.Extract] = \"Extract\";\n    _VisitorMode[_VisitorMode.Merge] = \"Merge\";\n    /**\n     * This Visitor is used:\n     * 1. to extract all the translatable strings from an html AST (see `extract()`),\n     * 2. to replace the translatable strings with the actual translations (see `merge()`)\n     *\n     * \\@internal\n     */\n    var _Visitor = (function () {\n        /**\n         * @param {?} _implicitTags\n         * @param {?} _implicitAttrs\n         */\n        function _Visitor(_implicitTags, _implicitAttrs) {\n            this._implicitTags = _implicitTags;\n            this._implicitAttrs = _implicitAttrs;\n        }\n        /**\n         * Extracts the messages from the tree\n         * @param {?} nodes\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        _Visitor.prototype.extract = function (nodes, interpolationConfig) {\n            var _this = this;\n            this._init(_VisitorMode.Extract, interpolationConfig);\n            nodes.forEach(function (node) { return node.visit(_this, null); });\n            if (this._inI18nBlock) {\n                this._reportError(nodes[nodes.length - 1], 'Unclosed block');\n            }\n            return new ExtractionResult(this._messages, this._errors);\n        };\n        /**\n         * Returns a tree where all translatable nodes are translated\n         * @param {?} nodes\n         * @param {?} translations\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        _Visitor.prototype.merge = function (nodes, translations, interpolationConfig) {\n            this._init(_VisitorMode.Merge, interpolationConfig);\n            this._translations = translations;\n            // Construct a single fake root element\n            var /** @type {?} */ wrapper = new Element('wrapper', [], nodes, null, null, null);\n            var /** @type {?} */ translatedNode = wrapper.visit(this, null);\n            if (this._inI18nBlock) {\n                this._reportError(nodes[nodes.length - 1], 'Unclosed block');\n            }\n            return new ParseTreeResult(translatedNode.children, this._errors);\n        };\n        /**\n         * @param {?} icuCase\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitExpansionCase = function (icuCase, context) {\n            // Parse cases for translatable html attributes\n            var /** @type {?} */ expression = visitAll(this, icuCase.expression, context);\n            if (this._mode === _VisitorMode.Merge) {\n                return new ExpansionCase(icuCase.value, expression, icuCase.sourceSpan, icuCase.valueSourceSpan, icuCase.expSourceSpan);\n            }\n        };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitExpansion = function (icu, context) {\n            this._mayBeAddBlockChildren(icu);\n            var /** @type {?} */ wasInIcu = this._inIcu;\n            if (!this._inIcu) {\n                // nested ICU messages should not be extracted but top-level translated as a whole\n                if (this._isInTranslatableSection) {\n                    this._addMessage([icu]);\n                }\n                this._inIcu = true;\n            }\n            var /** @type {?} */ cases = visitAll(this, icu.cases, context);\n            if (this._mode === _VisitorMode.Merge) {\n                icu = new Expansion(icu.switchValue, icu.type, cases, icu.sourceSpan, icu.switchValueSourceSpan);\n            }\n            this._inIcu = wasInIcu;\n            return icu;\n        };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitComment = function (comment, context) {\n            var /** @type {?} */ isOpening = _isOpeningComment(comment);\n            if (isOpening && this._isInTranslatableSection) {\n                this._reportError(comment, 'Could not start a block inside a translatable section');\n                return;\n            }\n            var /** @type {?} */ isClosing = _isClosingComment(comment);\n            if (isClosing && !this._inI18nBlock) {\n                this._reportError(comment, 'Trying to close an unopened block');\n                return;\n            }\n            if (!this._inI18nNode && !this._inIcu) {\n                if (!this._inI18nBlock) {\n                    if (isOpening) {\n                        this._inI18nBlock = true;\n                        this._blockStartDepth = this._depth;\n                        this._blockChildren = [];\n                        this._blockMeaningAndDesc = comment.value.replace(_I18N_COMMENT_PREFIX_REGEXP, '').trim();\n                        this._openTranslatableSection(comment);\n                    }\n                }\n                else {\n                    if (isClosing) {\n                        if (this._depth == this._blockStartDepth) {\n                            this._closeTranslatableSection(comment, this._blockChildren);\n                            this._inI18nBlock = false;\n                            var /** @type {?} */ message = this._addMessage(this._blockChildren, this._blockMeaningAndDesc);\n                            // merge attributes in sections\n                            var /** @type {?} */ nodes = this._translateMessage(comment, message);\n                            return visitAll(this, nodes);\n                        }\n                        else {\n                            this._reportError(comment, 'I18N blocks should not cross element boundaries');\n                            return;\n                        }\n                    }\n                }\n            }\n        };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitText = function (text, context) {\n            if (this._isInTranslatableSection) {\n                this._mayBeAddBlockChildren(text);\n            }\n            return text;\n        };\n        /**\n         * @param {?} el\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitElement = function (el, context) {\n            var _this = this;\n            this._mayBeAddBlockChildren(el);\n            this._depth++;\n            var /** @type {?} */ wasInI18nNode = this._inI18nNode;\n            var /** @type {?} */ wasInImplicitNode = this._inImplicitNode;\n            var /** @type {?} */ childNodes = [];\n            var /** @type {?} */ translatedChildNodes;\n            // Extract:\n            // - top level nodes with the (implicit) \"i18n\" attribute if not already in a section\n            // - ICU messages\n            var /** @type {?} */ i18nAttr = _getI18nAttr(el);\n            var /** @type {?} */ i18nMeta = i18nAttr ? i18nAttr.value : '';\n            var /** @type {?} */ isImplicit = this._implicitTags.some(function (tag) { return el.name === tag; }) && !this._inIcu &&\n                !this._isInTranslatableSection;\n            var /** @type {?} */ isTopLevelImplicit = !wasInImplicitNode && isImplicit;\n            this._inImplicitNode = wasInImplicitNode || isImplicit;\n            if (!this._isInTranslatableSection && !this._inIcu) {\n                if (i18nAttr || isTopLevelImplicit) {\n                    this._inI18nNode = true;\n                    var /** @type {?} */ message = this._addMessage(el.children, i18nMeta);\n                    translatedChildNodes = this._translateMessage(el, message);\n                }\n                if (this._mode == _VisitorMode.Extract) {\n                    var /** @type {?} */ isTranslatable = i18nAttr || isTopLevelImplicit;\n                    if (isTranslatable)\n                        this._openTranslatableSection(el);\n                    visitAll(this, el.children);\n                    if (isTranslatable)\n                        this._closeTranslatableSection(el, el.children);\n                }\n            }\n            else {\n                if (i18nAttr || isTopLevelImplicit) {\n                    this._reportError(el, 'Could not mark an element as translatable inside a translatable section');\n                }\n                if (this._mode == _VisitorMode.Extract) {\n                    // Descend into child nodes for extraction\n                    visitAll(this, el.children);\n                }\n            }\n            if (this._mode === _VisitorMode.Merge) {\n                var /** @type {?} */ visitNodes = translatedChildNodes || el.children;\n                visitNodes.forEach(function (child) {\n                    var /** @type {?} */ visited = child.visit(_this, context);\n                    if (visited && !_this._isInTranslatableSection) {\n                        // Do not add the children from translatable sections (= i18n blocks here)\n                        // They will be added later in this loop when the block closes (i.e. on `<!-- /i18n -->`)\n                        childNodes = childNodes.concat(visited);\n                    }\n                });\n            }\n            this._visitAttributesOf(el);\n            this._depth--;\n            this._inI18nNode = wasInI18nNode;\n            this._inImplicitNode = wasInImplicitNode;\n            if (this._mode === _VisitorMode.Merge) {\n                var /** @type {?} */ translatedAttrs = this._translateAttributes(el);\n                return new Element(el.name, translatedAttrs, childNodes, el.sourceSpan, el.startSourceSpan, el.endSourceSpan);\n            }\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        _Visitor.prototype.visitAttribute = function (attribute, context) {\n            throw new Error('unreachable code');\n        };\n        /**\n         * @param {?} mode\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        _Visitor.prototype._init = function (mode, interpolationConfig) {\n            this._mode = mode;\n            this._inI18nBlock = false;\n            this._inI18nNode = false;\n            this._depth = 0;\n            this._inIcu = false;\n            this._msgCountAtSectionStart = void 0;\n            this._errors = [];\n            this._messages = [];\n            this._inImplicitNode = false;\n            this._createI18nMessage = createI18nMessageFactory(interpolationConfig);\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        _Visitor.prototype._visitAttributesOf = function (el) {\n            var _this = this;\n            var /** @type {?} */ explicitAttrNameToValue = {};\n            var /** @type {?} */ implicitAttrNames = this._implicitAttrs[el.name] || [];\n            el.attrs.filter(function (attr) { return attr.name.startsWith(_I18N_ATTR_PREFIX); })\n                .forEach(function (attr) { return explicitAttrNameToValue[attr.name.slice(_I18N_ATTR_PREFIX.length)] =\n                attr.value; });\n            el.attrs.forEach(function (attr) {\n                if (attr.name in explicitAttrNameToValue) {\n                    _this._addMessage([attr], explicitAttrNameToValue[attr.name]);\n                }\n                else if (implicitAttrNames.some(function (name) { return attr.name === name; })) {\n                    _this._addMessage([attr]);\n                }\n            });\n        };\n        /**\n         * @param {?} ast\n         * @param {?=} meaningAndDesc\n         * @return {?}\n         */\n        _Visitor.prototype._addMessage = function (ast, meaningAndDesc) {\n            if (ast.length == 0 ||\n                ast.length == 1 && ast[0] instanceof Attribute$1 && !((ast[0])).value) {\n                // Do not create empty messages\n                return;\n            }\n            var _a = _splitMeaningAndDesc(meaningAndDesc), meaning = _a[0], description = _a[1];\n            var /** @type {?} */ message = this._createI18nMessage(ast, meaning, description);\n            this._messages.push(message);\n            return message;\n        };\n        /**\n         * @param {?} el\n         * @param {?} message\n         * @return {?}\n         */\n        _Visitor.prototype._translateMessage = function (el, message) {\n            if (message && this._mode === _VisitorMode.Merge) {\n                var /** @type {?} */ nodes = this._translations.get(message);\n                if (nodes) {\n                    return nodes;\n                }\n                this._reportError(el, \"Translation unavailable for message id=\\\"\" + this._translations.digest(message) + \"\\\"\");\n            }\n            return [];\n        };\n        /**\n         * @param {?} el\n         * @return {?}\n         */\n        _Visitor.prototype._translateAttributes = function (el) {\n            var _this = this;\n            var /** @type {?} */ attributes = el.attrs;\n            var /** @type {?} */ i18nAttributeMeanings = {};\n            attributes.forEach(function (attr) {\n                if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {\n                    i18nAttributeMeanings[attr.name.slice(_I18N_ATTR_PREFIX.length)] =\n                        _splitMeaningAndDesc(attr.value)[0];\n                }\n            });\n            var /** @type {?} */ translatedAttributes = [];\n            attributes.forEach(function (attr) {\n                if (attr.name === _I18N_ATTR || attr.name.startsWith(_I18N_ATTR_PREFIX)) {\n                    // strip i18n specific attributes\n                    return;\n                }\n                if (attr.value && attr.value != '' && i18nAttributeMeanings.hasOwnProperty(attr.name)) {\n                    var /** @type {?} */ meaning = i18nAttributeMeanings[attr.name];\n                    var /** @type {?} */ message = _this._createI18nMessage([attr], meaning, '');\n                    var /** @type {?} */ nodes = _this._translations.get(message);\n                    if (nodes) {\n                        if (nodes.length == 0) {\n                            translatedAttributes.push(new Attribute$1(attr.name, '', attr.sourceSpan));\n                        }\n                        else if (nodes[0] instanceof Text) {\n                            var /** @type {?} */ value = ((nodes[0])).value;\n                            translatedAttributes.push(new Attribute$1(attr.name, value, attr.sourceSpan));\n                        }\n                        else {\n                            _this._reportError(el, \"Unexpected translation for attribute \\\"\" + attr.name + \"\\\" (id=\\\"\" + _this._translations.digest(message) + \"\\\")\");\n                        }\n                    }\n                    else {\n                        _this._reportError(el, \"Translation unavailable for attribute \\\"\" + attr.name + \"\\\" (id=\\\"\" + _this._translations.digest(message) + \"\\\")\");\n                    }\n                }\n                else {\n                    translatedAttributes.push(attr);\n                }\n            });\n            return translatedAttributes;\n        };\n        /**\n         * Add the node as a child of the block when:\n         * - we are in a block,\n         * - we are not inside a ICU message (those are handled separately),\n         * - the node is a \"direct child\" of the block\n         * @param {?} node\n         * @return {?}\n         */\n        _Visitor.prototype._mayBeAddBlockChildren = function (node) {\n            if (this._inI18nBlock && !this._inIcu && this._depth == this._blockStartDepth) {\n                this._blockChildren.push(node);\n            }\n        };\n        /**\n         * Marks the start of a section, see `_closeTranslatableSection`\n         * @param {?} node\n         * @return {?}\n         */\n        _Visitor.prototype._openTranslatableSection = function (node) {\n            if (this._isInTranslatableSection) {\n                this._reportError(node, 'Unexpected section start');\n            }\n            else {\n                this._msgCountAtSectionStart = this._messages.length;\n            }\n        };\n        Object.defineProperty(_Visitor.prototype, \"_isInTranslatableSection\", {\n            /**\n             * A translatable section could be:\n             * - the content of translatable element,\n             * - nodes between `<!-- i18n -->` and `<!-- /i18n -->` comments\n             * @return {?}\n             */\n            get: function () {\n                return this._msgCountAtSectionStart !== void 0;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * Terminates a section.\n         *\n         * If a section has only one significant children (comments not significant) then we should not\n         * keep the message from this children:\n         *\n         * `<p i18n=\"meaning|description\">{ICU message}</p>` would produce two messages:\n         * - one for the <p> content with meaning and description,\n         * - another one for the ICU message.\n         *\n         * In this case the last message is discarded as it contains less information (the AST is\n         * otherwise identical).\n         *\n         * Note that we should still keep messages extracted from attributes inside the section (ie in the\n         * ICU message here)\n         * @param {?} node\n         * @param {?} directChildren\n         * @return {?}\n         */\n        _Visitor.prototype._closeTranslatableSection = function (node, directChildren) {\n            if (!this._isInTranslatableSection) {\n                this._reportError(node, 'Unexpected section end');\n                return;\n            }\n            var /** @type {?} */ startIndex = this._msgCountAtSectionStart;\n            var /** @type {?} */ significantChildren = directChildren.reduce(function (count, node) { return count + (node instanceof Comment ? 0 : 1); }, 0);\n            if (significantChildren == 1) {\n                for (var /** @type {?} */ i = this._messages.length - 1; i >= startIndex; i--) {\n                    var /** @type {?} */ ast = this._messages[i].nodes;\n                    if (!(ast.length == 1 && ast[0] instanceof Text$1)) {\n                        this._messages.splice(i, 1);\n                        break;\n                    }\n                }\n            }\n            this._msgCountAtSectionStart = void 0;\n        };\n        /**\n         * @param {?} node\n         * @param {?} msg\n         * @return {?}\n         */\n        _Visitor.prototype._reportError = function (node, msg) {\n            this._errors.push(new I18nError(node.sourceSpan, msg));\n        };\n        return _Visitor;\n    }());\n    /**\n     * @param {?} n\n     * @return {?}\n     */\n    function _isOpeningComment(n) {\n        return n instanceof Comment && n.value && n.value.startsWith('i18n');\n    }\n    /**\n     * @param {?} n\n     * @return {?}\n     */\n    function _isClosingComment(n) {\n        return n instanceof Comment && n.value && n.value === '/i18n';\n    }\n    /**\n     * @param {?} p\n     * @return {?}\n     */\n    function _getI18nAttr(p) {\n        return p.attrs.find(function (attr) { return attr.name === _I18N_ATTR; }) || null;\n    }\n    /**\n     * @param {?} i18n\n     * @return {?}\n     */\n    function _splitMeaningAndDesc(i18n) {\n        if (!i18n)\n            return ['', ''];\n        var /** @type {?} */ pipeIndex = i18n.indexOf('|');\n        return pipeIndex == -1 ? ['', i18n] : [i18n.slice(0, pipeIndex), i18n.slice(pipeIndex + 1)];\n    }\n\n    var XmlTagDefinition = (function () {\n        function XmlTagDefinition() {\n            this.closedByParent = false;\n            this.contentType = TagContentType.PARSABLE_DATA;\n            this.isVoid = false;\n            this.ignoreFirstLf = false;\n            this.canSelfClose = true;\n        }\n        /**\n         * @param {?} currentParent\n         * @return {?}\n         */\n        XmlTagDefinition.prototype.requireExtraParent = function (currentParent) { return false; };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        XmlTagDefinition.prototype.isClosedByChild = function (name) { return false; };\n        return XmlTagDefinition;\n    }());\n    var /** @type {?} */ _TAG_DEFINITION = new XmlTagDefinition();\n    /**\n     * @param {?} tagName\n     * @return {?}\n     */\n    function getXmlTagDefinition(tagName) {\n        return _TAG_DEFINITION;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$9 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var XmlParser = (function (_super) {\n        __extends$9(XmlParser, _super);\n        function XmlParser() {\n            _super.call(this, getXmlTagDefinition);\n        }\n        /**\n         * @param {?} source\n         * @param {?} url\n         * @param {?=} parseExpansionForms\n         * @return {?}\n         */\n        XmlParser.prototype.parse = function (source, url, parseExpansionForms) {\n            if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n            return _super.prototype.parse.call(this, source, url, parseExpansionForms, null);\n        };\n        return XmlParser;\n    }(Parser$1));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$10 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @param {?} message\n     * @return {?}\n     */\n    function digest(message) {\n        return sha1(serializeNodes(message.nodes).join('') + (\"[\" + message.meaning + \"]\"));\n    }\n    /**\n     * @param {?} message\n     * @return {?}\n     */\n    function decimalDigest(message) {\n        var /** @type {?} */ visitor = new _SerializerIgnoreIcuExpVisitor();\n        var /** @type {?} */ parts = message.nodes.map(function (a) { return a.visit(visitor, null); });\n        return computeMsgId(parts.join(''), message.meaning);\n    }\n    /**\n     * Serialize the i18n ast to something xml-like in order to generate an UID.\n     *\n     * The visitor is also used in the i18n parser tests\n     *\n     * \\@internal\n     */\n    var _SerializerVisitor = (function () {\n        function _SerializerVisitor() {\n        }\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitText = function (text, context) { return text.value; };\n        /**\n         * @param {?} container\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitContainer = function (container, context) {\n            var _this = this;\n            return \"[\" + container.children.map(function (child) { return child.visit(_this); }).join(', ') + \"]\";\n        };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitIcu = function (icu, context) {\n            var _this = this;\n            var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n            return \"{\" + icu.expression + \", \" + icu.type + \", \" + strCases.join(', ') + \"}\";\n        };\n        /**\n         * @param {?} ph\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitTagPlaceholder = function (ph, context) {\n            var _this = this;\n            return ph.isVoid ?\n                \"<ph tag name=\\\"\" + ph.startName + \"\\\"/>\" :\n                \"<ph tag name=\\\"\" + ph.startName + \"\\\">\" + ph.children.map(function (child) { return child.visit(_this); }).join(', ') + \"</ph name=\\\"\" + ph.closeName + \"\\\">\";\n        };\n        /**\n         * @param {?} ph\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitPlaceholder = function (ph, context) {\n            return ph.value ? \"<ph name=\\\"\" + ph.name + \"\\\">\" + ph.value + \"</ph>\" : \"<ph name=\\\"\" + ph.name + \"\\\"/>\";\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        _SerializerVisitor.prototype.visitIcuPlaceholder = function (ph, context) {\n            return \"<ph icu name=\\\"\" + ph.name + \"\\\">\" + ph.value.visit(this) + \"</ph>\";\n        };\n        return _SerializerVisitor;\n    }());\n    var /** @type {?} */ serializerVisitor = new _SerializerVisitor();\n    /**\n     * @param {?} nodes\n     * @return {?}\n     */\n    function serializeNodes(nodes) {\n        return nodes.map(function (a) { return a.visit(serializerVisitor, null); });\n    }\n    /**\n     * Serialize the i18n ast to something xml-like in order to generate an UID.\n     *\n     * Ignore the ICU expressions so that message IDs stays identical if only the expression changes.\n     *\n     * \\@internal\n     */\n    var _SerializerIgnoreIcuExpVisitor = (function (_super) {\n        __extends$10(_SerializerIgnoreIcuExpVisitor, _super);\n        function _SerializerIgnoreIcuExpVisitor() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        _SerializerIgnoreIcuExpVisitor.prototype.visitIcu = function (icu, context) {\n            var _this = this;\n            var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n            // Do not take the expression into account\n            return \"{\" + icu.type + \", \" + strCases.join(', ') + \"}\";\n        };\n        return _SerializerIgnoreIcuExpVisitor;\n    }(_SerializerVisitor));\n    /**\n     * Compute the SHA1 of the given string\n     *\n     * see http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n     *\n     * WARNING: this function has not been designed not tested with security in mind.\n     *          DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.\n     * @param {?} str\n     * @return {?}\n     */\n    function sha1(str) {\n        var /** @type {?} */ utf8 = utf8Encode(str);\n        var /** @type {?} */ words32 = stringToWords32(utf8, Endian.Big);\n        var /** @type {?} */ len = utf8.length * 8;\n        var /** @type {?} */ w = new Array(80);\n        var _a = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], a = _a[0], b = _a[1], c = _a[2], d = _a[3], e = _a[4];\n        words32[len >> 5] |= 0x80 << (24 - len % 32);\n        words32[((len + 64 >> 9) << 4) + 15] = len;\n        for (var /** @type {?} */ i = 0; i < words32.length; i += 16) {\n            var _b = [a, b, c, d, e], h0 = _b[0], h1 = _b[1], h2 = _b[2], h3 = _b[3], h4 = _b[4];\n            for (var /** @type {?} */ j = 0; j < 80; j++) {\n                if (j < 16) {\n                    w[j] = words32[i + j];\n                }\n                else {\n                    w[j] = rol32(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);\n                }\n                var _c = fk(j, b, c, d), f = _c[0], k = _c[1];\n                var /** @type {?} */ temp = [rol32(a, 5), f, e, k, w[j]].reduce(add32);\n                _d = [d, c, rol32(b, 30), a, temp], e = _d[0], d = _d[1], c = _d[2], b = _d[3], a = _d[4];\n            }\n            _e = [add32(a, h0), add32(b, h1), add32(c, h2), add32(d, h3), add32(e, h4)], a = _e[0], b = _e[1], c = _e[2], d = _e[3], e = _e[4];\n        }\n        return byteStringToHexString(words32ToByteString([a, b, c, d, e]));\n        var _d, _e;\n    }\n    /**\n     * @param {?} index\n     * @param {?} b\n     * @param {?} c\n     * @param {?} d\n     * @return {?}\n     */\n    function fk(index, b, c, d) {\n        if (index < 20) {\n            return [(b & c) | (~b & d), 0x5a827999];\n        }\n        if (index < 40) {\n            return [b ^ c ^ d, 0x6ed9eba1];\n        }\n        if (index < 60) {\n            return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];\n        }\n        return [b ^ c ^ d, 0xca62c1d6];\n    }\n    /**\n     * Compute the fingerprint of the given string\n     *\n     * The output is 64 bit number encoded as a decimal string\n     *\n     * based on:\n     * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java\n     * @param {?} str\n     * @return {?}\n     */\n    function fingerprint(str) {\n        var /** @type {?} */ utf8 = utf8Encode(str);\n        var _a = [hash32(utf8, 0), hash32(utf8, 102072)], hi = _a[0], lo = _a[1];\n        if (hi == 0 && (lo == 0 || lo == 1)) {\n            hi = hi ^ 0x130f9bef;\n            lo = lo ^ -0x6b5f56d8;\n        }\n        return [hi, lo];\n    }\n    /**\n     * @param {?} msg\n     * @param {?} meaning\n     * @return {?}\n     */\n    function computeMsgId(msg, meaning) {\n        var _a = fingerprint(msg), hi = _a[0], lo = _a[1];\n        if (meaning) {\n            var _b = fingerprint(meaning), him = _b[0], lom = _b[1];\n            _c = add64(rol64([hi, lo], 1), [him, lom]), hi = _c[0], lo = _c[1];\n        }\n        return byteStringToDecString(words32ToByteString([hi & 0x7fffffff, lo]));\n        var _c;\n    }\n    /**\n     * @param {?} str\n     * @param {?} c\n     * @return {?}\n     */\n    function hash32(str, c) {\n        var _a = [0x9e3779b9, 0x9e3779b9], a = _a[0], b = _a[1];\n        var /** @type {?} */ i;\n        var /** @type {?} */ len = str.length;\n        for (i = 0; i + 12 <= len; i += 12) {\n            a = add32(a, wordAt(str, i, Endian.Little));\n            b = add32(b, wordAt(str, i + 4, Endian.Little));\n            c = add32(c, wordAt(str, i + 8, Endian.Little));\n            _b = mix([a, b, c]), a = _b[0], b = _b[1], c = _b[2];\n        }\n        a = add32(a, wordAt(str, i, Endian.Little));\n        b = add32(b, wordAt(str, i + 4, Endian.Little));\n        // the first byte of c is reserved for the length\n        c = add32(c, len);\n        c = add32(c, wordAt(str, i + 8, Endian.Little) << 8);\n        return mix([a, b, c])[2];\n        var _b;\n    }\n    /**\n     * @param {?} __0\n     * @return {?}\n     */\n    function mix(_a) {\n        var a = _a[0], b = _a[1], c = _a[2];\n        a = sub32(a, b);\n        a = sub32(a, c);\n        a ^= c >>> 13;\n        b = sub32(b, c);\n        b = sub32(b, a);\n        b ^= a << 8;\n        c = sub32(c, a);\n        c = sub32(c, b);\n        c ^= b >>> 13;\n        a = sub32(a, b);\n        a = sub32(a, c);\n        a ^= c >>> 12;\n        b = sub32(b, c);\n        b = sub32(b, a);\n        b ^= a << 16;\n        c = sub32(c, a);\n        c = sub32(c, b);\n        c ^= b >>> 5;\n        a = sub32(a, b);\n        a = sub32(a, c);\n        a ^= c >>> 3;\n        b = sub32(b, c);\n        b = sub32(b, a);\n        b ^= a << 10;\n        c = sub32(c, a);\n        c = sub32(c, b);\n        c ^= b >>> 15;\n        return [a, b, c];\n    }\n    var Endian = {};\n    Endian.Little = 0;\n    Endian.Big = 1;\n    Endian[Endian.Little] = \"Little\";\n    Endian[Endian.Big] = \"Big\";\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function utf8Encode(str) {\n        var /** @type {?} */ encoded = '';\n        for (var /** @type {?} */ index = 0; index < str.length; index++) {\n            var /** @type {?} */ codePoint = decodeSurrogatePairs(str, index);\n            if (codePoint <= 0x7f) {\n                encoded += String.fromCharCode(codePoint);\n            }\n            else if (codePoint <= 0x7ff) {\n                encoded += String.fromCharCode(0xc0 | codePoint >>> 6, 0x80 | codePoint & 0x3f);\n            }\n            else if (codePoint <= 0xffff) {\n                encoded += String.fromCharCode(0xe0 | codePoint >>> 12, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);\n            }\n            else if (codePoint <= 0x1fffff) {\n                encoded += String.fromCharCode(0xf0 | codePoint >>> 18, 0x80 | codePoint >>> 12 & 0x3f, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);\n            }\n        }\n        return encoded;\n    }\n    /**\n     * @param {?} str\n     * @param {?} index\n     * @return {?}\n     */\n    function decodeSurrogatePairs(str, index) {\n        if (index < 0 || index >= str.length) {\n            throw new Error(\"index=\" + index + \" is out of range in \\\"\" + str + \"\\\"\");\n        }\n        var /** @type {?} */ high = str.charCodeAt(index);\n        if (high >= 0xd800 && high <= 0xdfff && str.length > index + 1) {\n            var /** @type {?} */ low = byteAt(str, index + 1);\n            if (low >= 0xdc00 && low <= 0xdfff) {\n                return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;\n            }\n        }\n        return high;\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function add32(a, b) {\n        return add32to64(a, b)[1];\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function add32to64(a, b) {\n        var /** @type {?} */ low = (a & 0xffff) + (b & 0xffff);\n        var /** @type {?} */ high = (a >>> 16) + (b >>> 16) + (low >>> 16);\n        return [high >>> 16, (high << 16) | (low & 0xffff)];\n    }\n    /**\n     * @param {?} __0\n     * @param {?} __1\n     * @return {?}\n     */\n    function add64(_a, _b) {\n        var ah = _a[0], al = _a[1];\n        var bh = _b[0], bl = _b[1];\n        var _c = add32to64(al, bl), carry = _c[0], l = _c[1];\n        var /** @type {?} */ h = add32(add32(ah, bh), carry);\n        return [h, l];\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function sub32(a, b) {\n        var /** @type {?} */ low = (a & 0xffff) - (b & 0xffff);\n        var /** @type {?} */ high = (a >> 16) - (b >> 16) + (low >> 16);\n        return (high << 16) | (low & 0xffff);\n    }\n    /**\n     * @param {?} a\n     * @param {?} count\n     * @return {?}\n     */\n    function rol32(a, count) {\n        return (a << count) | (a >>> (32 - count));\n    }\n    /**\n     * @param {?} __0\n     * @param {?} count\n     * @return {?}\n     */\n    function rol64(_a, count) {\n        var hi = _a[0], lo = _a[1];\n        var /** @type {?} */ h = (hi << count) | (lo >>> (32 - count));\n        var /** @type {?} */ l = (lo << count) | (hi >>> (32 - count));\n        return [h, l];\n    }\n    /**\n     * @param {?} str\n     * @param {?} endian\n     * @return {?}\n     */\n    function stringToWords32(str, endian) {\n        var /** @type {?} */ words32 = Array((str.length + 3) >>> 2);\n        for (var /** @type {?} */ i = 0; i < words32.length; i++) {\n            words32[i] = wordAt(str, i * 4, endian);\n        }\n        return words32;\n    }\n    /**\n     * @param {?} str\n     * @param {?} index\n     * @return {?}\n     */\n    function byteAt(str, index) {\n        return index >= str.length ? 0 : str.charCodeAt(index) & 0xff;\n    }\n    /**\n     * @param {?} str\n     * @param {?} index\n     * @param {?} endian\n     * @return {?}\n     */\n    function wordAt(str, index, endian) {\n        var /** @type {?} */ word = 0;\n        if (endian === Endian.Big) {\n            for (var /** @type {?} */ i = 0; i < 4; i++) {\n                word += byteAt(str, index + i) << (24 - 8 * i);\n            }\n        }\n        else {\n            for (var /** @type {?} */ i = 0; i < 4; i++) {\n                word += byteAt(str, index + i) << 8 * i;\n            }\n        }\n        return word;\n    }\n    /**\n     * @param {?} words32\n     * @return {?}\n     */\n    function words32ToByteString(words32) {\n        return words32.reduce(function (str, word) { return str + word32ToByteString(word); }, '');\n    }\n    /**\n     * @param {?} word\n     * @return {?}\n     */\n    function word32ToByteString(word) {\n        var /** @type {?} */ str = '';\n        for (var /** @type {?} */ i = 0; i < 4; i++) {\n            str += String.fromCharCode((word >>> 8 * (3 - i)) & 0xff);\n        }\n        return str;\n    }\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function byteStringToHexString(str) {\n        var /** @type {?} */ hex = '';\n        for (var /** @type {?} */ i = 0; i < str.length; i++) {\n            var /** @type {?} */ b = byteAt(str, i);\n            hex += (b >>> 4).toString(16) + (b & 0x0f).toString(16);\n        }\n        return hex.toLowerCase();\n    }\n    /**\n     * @param {?} str\n     * @return {?}\n     */\n    function byteStringToDecString(str) {\n        var /** @type {?} */ decimal = '';\n        var /** @type {?} */ toThePower = '1';\n        for (var /** @type {?} */ i = str.length - 1; i >= 0; i--) {\n            decimal = addBigInt(decimal, numberTimesBigInt(byteAt(str, i), toThePower));\n            toThePower = numberTimesBigInt(256, toThePower);\n        }\n        return decimal.split('').reverse().join('');\n    }\n    /**\n     * @param {?} x\n     * @param {?} y\n     * @return {?}\n     */\n    function addBigInt(x, y) {\n        var /** @type {?} */ sum = '';\n        var /** @type {?} */ len = Math.max(x.length, y.length);\n        for (var /** @type {?} */ i = 0, /** @type {?} */ carry = 0; i < len || carry; i++) {\n            var /** @type {?} */ tmpSum = carry + +(x[i] || 0) + +(y[i] || 0);\n            if (tmpSum >= 10) {\n                carry = 1;\n                sum += tmpSum - 10;\n            }\n            else {\n                carry = 0;\n                sum += tmpSum;\n            }\n        }\n        return sum;\n    }\n    /**\n     * @param {?} num\n     * @param {?} b\n     * @return {?}\n     */\n    function numberTimesBigInt(num, b) {\n        var /** @type {?} */ product = '';\n        var /** @type {?} */ bToThePower = b;\n        for (; num !== 0; num = num >>> 1) {\n            if (num & 1)\n                product = addBigInt(product, bToThePower);\n            bToThePower = addBigInt(bToThePower, bToThePower);\n        }\n        return product;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * @abstract\n     */\n    var Serializer = (function () {\n        function Serializer() {\n        }\n        /**\n         * @abstract\n         * @param {?} messages\n         * @return {?}\n         */\n        Serializer.prototype.write = function (messages) { };\n        /**\n         * @abstract\n         * @param {?} content\n         * @param {?} url\n         * @return {?}\n         */\n        Serializer.prototype.load = function (content, url) { };\n        /**\n         * @abstract\n         * @param {?} message\n         * @return {?}\n         */\n        Serializer.prototype.digest = function (message) { };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Serializer.prototype.createNameMapper = function (message) { return null; };\n        return Serializer;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$11 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var _Visitor$1 = (function () {\n        function _Visitor() {\n        }\n        /**\n         * @param {?} tag\n         * @return {?}\n         */\n        _Visitor.prototype.visitTag = function (tag) {\n            var _this = this;\n            var /** @type {?} */ strAttrs = this._serializeAttributes(tag.attrs);\n            if (tag.children.length == 0) {\n                return \"<\" + tag.name + strAttrs + \"/>\";\n            }\n            var /** @type {?} */ strChildren = tag.children.map(function (node) { return node.visit(_this); });\n            return \"<\" + tag.name + strAttrs + \">\" + strChildren.join('') + \"</\" + tag.name + \">\";\n        };\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        _Visitor.prototype.visitText = function (text) { return text.value; };\n        /**\n         * @param {?} decl\n         * @return {?}\n         */\n        _Visitor.prototype.visitDeclaration = function (decl) {\n            return \"<?xml\" + this._serializeAttributes(decl.attrs) + \" ?>\";\n        };\n        /**\n         * @param {?} attrs\n         * @return {?}\n         */\n        _Visitor.prototype._serializeAttributes = function (attrs) {\n            var /** @type {?} */ strAttrs = Object.keys(attrs).map(function (name) { return (name + \"=\\\"\" + attrs[name] + \"\\\"\"); }).join(' ');\n            return strAttrs.length > 0 ? ' ' + strAttrs : '';\n        };\n        /**\n         * @param {?} doctype\n         * @return {?}\n         */\n        _Visitor.prototype.visitDoctype = function (doctype) {\n            return \"<!DOCTYPE \" + doctype.rootTag + \" [\\n\" + doctype.dtd + \"\\n]>\";\n        };\n        return _Visitor;\n    }());\n    var /** @type {?} */ _visitor = new _Visitor$1();\n    /**\n     * @param {?} nodes\n     * @return {?}\n     */\n    function serialize(nodes) {\n        return nodes.map(function (node) { return node.visit(_visitor); }).join('');\n    }\n    var Declaration = (function () {\n        /**\n         * @param {?} unescapedAttrs\n         */\n        function Declaration(unescapedAttrs) {\n            var _this = this;\n            this.attrs = {};\n            Object.keys(unescapedAttrs).forEach(function (k) {\n                _this.attrs[k] = _escapeXml(unescapedAttrs[k]);\n            });\n        }\n        /**\n         * @param {?} visitor\n         * @return {?}\n         */\n        Declaration.prototype.visit = function (visitor) { return visitor.visitDeclaration(this); };\n        return Declaration;\n    }());\n    var Doctype = (function () {\n        /**\n         * @param {?} rootTag\n         * @param {?} dtd\n         */\n        function Doctype(rootTag, dtd) {\n            this.rootTag = rootTag;\n            this.dtd = dtd;\n        }\n        ;\n        /**\n         * @param {?} visitor\n         * @return {?}\n         */\n        Doctype.prototype.visit = function (visitor) { return visitor.visitDoctype(this); };\n        return Doctype;\n    }());\n    var Tag = (function () {\n        /**\n         * @param {?} name\n         * @param {?=} unescapedAttrs\n         * @param {?=} children\n         */\n        function Tag(name, unescapedAttrs, children) {\n            var _this = this;\n            if (unescapedAttrs === void 0) { unescapedAttrs = {}; }\n            if (children === void 0) { children = []; }\n            this.name = name;\n            this.children = children;\n            this.attrs = {};\n            Object.keys(unescapedAttrs).forEach(function (k) {\n                _this.attrs[k] = _escapeXml(unescapedAttrs[k]);\n            });\n        }\n        /**\n         * @param {?} visitor\n         * @return {?}\n         */\n        Tag.prototype.visit = function (visitor) { return visitor.visitTag(this); };\n        return Tag;\n    }());\n    var Text$2 = (function () {\n        /**\n         * @param {?} unescapedValue\n         */\n        function Text(unescapedValue) {\n            this.value = _escapeXml(unescapedValue);\n        }\n        ;\n        /**\n         * @param {?} visitor\n         * @return {?}\n         */\n        Text.prototype.visit = function (visitor) { return visitor.visitText(this); };\n        return Text;\n    }());\n    var CR = (function (_super) {\n        __extends$11(CR, _super);\n        /**\n         * @param {?=} ws\n         */\n        function CR(ws) {\n            if (ws === void 0) { ws = 0; }\n            _super.call(this, \"\\n\" + new Array(ws + 1).join(' '));\n        }\n        return CR;\n    }(Text$2));\n    var /** @type {?} */ _ESCAPED_CHARS = [\n        [/&/g, '&amp;'],\n        [/\"/g, '&quot;'],\n        [/'/g, '&apos;'],\n        [/</g, '&lt;'],\n        [/>/g, '&gt;'],\n    ];\n    /**\n     * @param {?} text\n     * @return {?}\n     */\n    function _escapeXml(text) {\n        return _ESCAPED_CHARS.reduce(function (text, entry) { return text.replace(entry[0], entry[1]); }, text);\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$8 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _VERSION = '1.2';\n    var /** @type {?} */ _XMLNS = 'urn:oasis:names:tc:xliff:document:1.2';\n    // TODO(vicb): make this a param (s/_/-/)\n    var /** @type {?} */ _SOURCE_LANG = 'en';\n    var /** @type {?} */ _PLACEHOLDER_TAG = 'x';\n    var /** @type {?} */ _SOURCE_TAG = 'source';\n    var /** @type {?} */ _TARGET_TAG = 'target';\n    var /** @type {?} */ _UNIT_TAG = 'trans-unit';\n    var Xliff = (function (_super) {\n        __extends$8(Xliff, _super);\n        function Xliff() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} messages\n         * @return {?}\n         */\n        Xliff.prototype.write = function (messages) {\n            var _this = this;\n            var /** @type {?} */ visitor = new _WriteVisitor();\n            var /** @type {?} */ visited = {};\n            var /** @type {?} */ transUnits = [];\n            messages.forEach(function (message) {\n                var /** @type {?} */ id = _this.digest(message);\n                // deduplicate messages\n                if (visited[id])\n                    return;\n                visited[id] = true;\n                var /** @type {?} */ transUnit = new Tag(_UNIT_TAG, { id: id, datatype: 'html' });\n                transUnit.children.push(new CR(8), new Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)), new CR(8), new Tag(_TARGET_TAG));\n                if (message.description) {\n                    transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'description' }, [new Text$2(message.description)]));\n                }\n                if (message.meaning) {\n                    transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'meaning' }, [new Text$2(message.meaning)]));\n                }\n                transUnit.children.push(new CR(6));\n                transUnits.push(new CR(6), transUnit);\n            });\n            var /** @type {?} */ body = new Tag('body', {}, transUnits.concat([new CR(4)]));\n            var /** @type {?} */ file = new Tag('file', { 'source-language': _SOURCE_LANG, datatype: 'plaintext', original: 'ng2.template' }, [new CR(4), body, new CR(2)]);\n            var /** @type {?} */ xliff = new Tag('xliff', { version: _VERSION, xmlns: _XMLNS }, [new CR(2), file, new CR()]);\n            return serialize([\n                new Declaration({ version: '1.0', encoding: 'UTF-8' }), new CR(), xliff, new CR()\n            ]);\n        };\n        /**\n         * @param {?} content\n         * @param {?} url\n         * @return {?}\n         */\n        Xliff.prototype.load = function (content, url) {\n            // xliff to xml nodes\n            var /** @type {?} */ xliffParser = new XliffParser();\n            var _a = xliffParser.parse(content, url), mlNodesByMsgId = _a.mlNodesByMsgId, errors = _a.errors;\n            // xml nodes to i18n nodes\n            var /** @type {?} */ i18nNodesByMsgId = {};\n            var /** @type {?} */ converter = new XmlToI18n();\n            Object.keys(mlNodesByMsgId).forEach(function (msgId) {\n                var _a = converter.convert(mlNodesByMsgId[msgId]), i18nNodes = _a.i18nNodes, e = _a.errors;\n                errors.push.apply(errors, e);\n                i18nNodesByMsgId[msgId] = i18nNodes;\n            });\n            if (errors.length) {\n                throw new Error(\"xliff parse errors:\\n\" + errors.join('\\n'));\n            }\n            return i18nNodesByMsgId;\n        };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Xliff.prototype.digest = function (message) { return digest(message); };\n        return Xliff;\n    }(Serializer));\n    var _WriteVisitor = (function () {\n        function _WriteVisitor() {\n        }\n        /**\n         * @param {?} text\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };\n        /**\n         * @param {?} container\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitContainer = function (container, context) {\n            var _this = this;\n            var /** @type {?} */ nodes = [];\n            container.children.forEach(function (node) { return nodes.push.apply(nodes, node.visit(_this)); });\n            return nodes;\n        };\n        /**\n         * @param {?} icu\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitIcu = function (icu, context) {\n            if (this._isInIcu) {\n                // nested ICU is not supported\n                throw new Error('xliff does not support nested ICU messages');\n            }\n            this._isInIcu = true;\n            // TODO(vicb): support ICU messages\n            // https://lists.oasis-open.org/archives/xliff/201201/msg00028.html\n            // http://docs.oasis-open.org/xliff/v1.2/xliff-profile-po/xliff-profile-po-1.2-cd02.html\n            var /** @type {?} */ nodes = [];\n            this._isInIcu = false;\n            return nodes;\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitTagPlaceholder = function (ph, context) {\n            var /** @type {?} */ ctype = getCtypeForTag(ph.tag);\n            var /** @type {?} */ startTagPh = new Tag(_PLACEHOLDER_TAG, { id: ph.startName, ctype: ctype });\n            if (ph.isVoid) {\n                // void tags have no children nor closing tags\n                return [startTagPh];\n            }\n            var /** @type {?} */ closeTagPh = new Tag(_PLACEHOLDER_TAG, { id: ph.closeName, ctype: ctype });\n            return [startTagPh].concat(this.serialize(ph.children), [closeTagPh]);\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitPlaceholder = function (ph, context) {\n            return [new Tag(_PLACEHOLDER_TAG, { id: ph.name })];\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        _WriteVisitor.prototype.visitIcuPlaceholder = function (ph, context) {\n            return [new Tag(_PLACEHOLDER_TAG, { id: ph.name })];\n        };\n        /**\n         * @param {?} nodes\n         * @return {?}\n         */\n        _WriteVisitor.prototype.serialize = function (nodes) {\n            var _this = this;\n            this._isInIcu = false;\n            return (_a = []).concat.apply(_a, nodes.map(function (node) { return node.visit(_this); }));\n            var _a;\n        };\n        return _WriteVisitor;\n    }());\n    var XliffParser = (function () {\n        function XliffParser() {\n        }\n        /**\n         * @param {?} xliff\n         * @param {?} url\n         * @return {?}\n         */\n        XliffParser.prototype.parse = function (xliff, url) {\n            this._unitMlNodes = [];\n            this._mlNodesByMsgId = {};\n            var /** @type {?} */ xml = new XmlParser().parse(xliff, url, false);\n            this._errors = xml.errors;\n            visitAll(this, xml.rootNodes, null);\n            return {\n                mlNodesByMsgId: this._mlNodesByMsgId,\n                errors: this._errors,\n            };\n        };\n        /**\n         * @param {?} element\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitElement = function (element, context) {\n            switch (element.name) {\n                case _UNIT_TAG:\n                    this._unitMlNodes = null;\n                    var /** @type {?} */ idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });\n                    if (!idAttr) {\n                        this._addError(element, \"<\" + _UNIT_TAG + \"> misses the \\\"id\\\" attribute\");\n                    }\n                    else {\n                        var /** @type {?} */ id = idAttr.value;\n                        if (this._mlNodesByMsgId.hasOwnProperty(id)) {\n                            this._addError(element, \"Duplicated translations for msg \" + id);\n                        }\n                        else {\n                            visitAll(this, element.children, null);\n                            if (this._unitMlNodes) {\n                                this._mlNodesByMsgId[id] = this._unitMlNodes;\n                            }\n                            else {\n                                this._addError(element, \"Message \" + id + \" misses a translation\");\n                            }\n                        }\n                    }\n                    break;\n                case _SOURCE_TAG:\n                    // ignore source message\n                    break;\n                case _TARGET_TAG:\n                    this._unitMlNodes = element.children;\n                    break;\n                default:\n                    // TODO(vicb): assert file structure, xliff version\n                    // For now only recurse on unhandled nodes\n                    visitAll(this, element.children, null);\n            }\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitAttribute = function (attribute, context) { };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitText = function (text, context) { };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitComment = function (comment, context) { };\n        /**\n         * @param {?} expansion\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitExpansion = function (expansion, context) { };\n        /**\n         * @param {?} expansionCase\n         * @param {?} context\n         * @return {?}\n         */\n        XliffParser.prototype.visitExpansionCase = function (expansionCase, context) { };\n        /**\n         * @param {?} node\n         * @param {?} message\n         * @return {?}\n         */\n        XliffParser.prototype._addError = function (node, message) {\n            this._errors.push(new I18nError(node.sourceSpan, message));\n        };\n        return XliffParser;\n    }());\n    var XmlToI18n = (function () {\n        function XmlToI18n() {\n        }\n        /**\n         * @param {?} nodes\n         * @return {?}\n         */\n        XmlToI18n.prototype.convert = function (nodes) {\n            this._errors = [];\n            return {\n                i18nNodes: visitAll(this, nodes),\n                errors: this._errors,\n            };\n        };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };\n        /**\n         * @param {?} el\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitElement = function (el, context) {\n            if (el.name === _PLACEHOLDER_TAG) {\n                var /** @type {?} */ nameAttr = el.attrs.find(function (attr) { return attr.name === 'id'; });\n                if (nameAttr) {\n                    return new Placeholder('', nameAttr.value, el.sourceSpan);\n                }\n                this._addError(el, \"<\" + _PLACEHOLDER_TAG + \"> misses the \\\"id\\\" attribute\");\n            }\n            else {\n                this._addError(el, \"Unexpected tag\");\n            }\n        };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitExpansion = function (icu, context) { };\n        /**\n         * @param {?} icuCase\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) { };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitComment = function (comment, context) { };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitAttribute = function (attribute, context) { };\n        /**\n         * @param {?} node\n         * @param {?} message\n         * @return {?}\n         */\n        XmlToI18n.prototype._addError = function (node, message) {\n            this._errors.push(new I18nError(node.sourceSpan, message));\n        };\n        return XmlToI18n;\n    }());\n    /**\n     * @param {?} tag\n     * @return {?}\n     */\n    function getCtypeForTag(tag) {\n        switch (tag.toLowerCase()) {\n            case 'br':\n                return 'lb';\n            case 'img':\n                return 'image';\n            default:\n                return \"x-\" + tag;\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$12 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _MESSAGES_TAG = 'messagebundle';\n    var /** @type {?} */ _MESSAGE_TAG = 'msg';\n    var /** @type {?} */ _PLACEHOLDER_TAG$1 = 'ph';\n    var /** @type {?} */ _EXEMPLE_TAG = 'ex';\n    var /** @type {?} */ _DOCTYPE = \"<!ELEMENT messagebundle (msg)*>\\n<!ATTLIST messagebundle class CDATA #IMPLIED>\\n\\n<!ELEMENT msg (#PCDATA|ph|source)*>\\n<!ATTLIST msg id CDATA #IMPLIED>\\n<!ATTLIST msg seq CDATA #IMPLIED>\\n<!ATTLIST msg name CDATA #IMPLIED>\\n<!ATTLIST msg desc CDATA #IMPLIED>\\n<!ATTLIST msg meaning CDATA #IMPLIED>\\n<!ATTLIST msg obsolete (obsolete) #IMPLIED>\\n<!ATTLIST msg xml:space (default|preserve) \\\"default\\\">\\n<!ATTLIST msg is_hidden CDATA #IMPLIED>\\n\\n<!ELEMENT source (#PCDATA)>\\n\\n<!ELEMENT ph (#PCDATA|ex)*>\\n<!ATTLIST ph name CDATA #REQUIRED>\\n\\n<!ELEMENT ex (#PCDATA)>\";\n    var Xmb = (function (_super) {\n        __extends$12(Xmb, _super);\n        function Xmb() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} messages\n         * @return {?}\n         */\n        Xmb.prototype.write = function (messages) {\n            var _this = this;\n            var /** @type {?} */ exampleVisitor = new ExampleVisitor();\n            var /** @type {?} */ visitor = new _Visitor$2();\n            var /** @type {?} */ visited = {};\n            var /** @type {?} */ rootNode = new Tag(_MESSAGES_TAG);\n            messages.forEach(function (message) {\n                var /** @type {?} */ id = _this.digest(message);\n                // deduplicate messages\n                if (visited[id])\n                    return;\n                visited[id] = true;\n                var /** @type {?} */ mapper = _this.createNameMapper(message);\n                var /** @type {?} */ attrs = { id: id };\n                if (message.description) {\n                    attrs['desc'] = message.description;\n                }\n                if (message.meaning) {\n                    attrs['meaning'] = message.meaning;\n                }\n                rootNode.children.push(new CR(2), new Tag(_MESSAGE_TAG, attrs, visitor.serialize(message.nodes, { mapper: mapper })));\n            });\n            rootNode.children.push(new CR());\n            return serialize([\n                new Declaration({ version: '1.0', encoding: 'UTF-8' }),\n                new CR(),\n                new Doctype(_MESSAGES_TAG, _DOCTYPE),\n                new CR(),\n                exampleVisitor.addDefaultExamples(rootNode),\n                new CR(),\n            ]);\n        };\n        /**\n         * @param {?} content\n         * @param {?} url\n         * @return {?}\n         */\n        Xmb.prototype.load = function (content, url) {\n            throw new Error('Unsupported');\n        };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Xmb.prototype.digest = function (message) { return digest$1(message); };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Xmb.prototype.createNameMapper = function (message) {\n            return new XmbPlaceholderMapper(message);\n        };\n        return Xmb;\n    }(Serializer));\n    var _Visitor$2 = (function () {\n        function _Visitor() {\n        }\n        /**\n         * @param {?} text\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitText = function (text, ctx) {\n            return [new Text$2(text.value)];\n        };\n        /**\n         * @param {?} container\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitContainer = function (container, ctx) {\n            var _this = this;\n            var /** @type {?} */ nodes = [];\n            container.children.forEach(function (node) { return nodes.push.apply(nodes, node.visit(_this, ctx)); });\n            return nodes;\n        };\n        /**\n         * @param {?} icu\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitIcu = function (icu, ctx) {\n            var _this = this;\n            var /** @type {?} */ nodes = [new Text$2(\"{\" + icu.expressionPlaceholder + \", \" + icu.type + \", \")];\n            Object.keys(icu.cases).forEach(function (c) {\n                nodes.push.apply(nodes, [new Text$2(c + \" {\")].concat(icu.cases[c].visit(_this, ctx), [new Text$2(\"} \")]));\n            });\n            nodes.push(new Text$2(\"}\"));\n            return nodes;\n        };\n        /**\n         * @param {?} ph\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitTagPlaceholder = function (ph, ctx) {\n            var /** @type {?} */ startEx = new Tag(_EXEMPLE_TAG, {}, [new Text$2(\"<\" + ph.tag + \">\")]);\n            var /** @type {?} */ name = ctx.mapper.toPublicName(ph.startName);\n            var /** @type {?} */ startTagPh = new Tag(_PLACEHOLDER_TAG$1, { name: name }, [startEx]);\n            if (ph.isVoid) {\n                // void tags have no children nor closing tags\n                return [startTagPh];\n            }\n            var /** @type {?} */ closeEx = new Tag(_EXEMPLE_TAG, {}, [new Text$2(\"</\" + ph.tag + \">\")]);\n            name = ctx.mapper.toPublicName(ph.closeName);\n            var /** @type {?} */ closeTagPh = new Tag(_PLACEHOLDER_TAG$1, { name: name }, [closeEx]);\n            return [startTagPh].concat(this.serialize(ph.children, ctx), [closeTagPh]);\n        };\n        /**\n         * @param {?} ph\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitPlaceholder = function (ph, ctx) {\n            var /** @type {?} */ name = ctx.mapper.toPublicName(ph.name);\n            return [new Tag(_PLACEHOLDER_TAG$1, { name: name })];\n        };\n        /**\n         * @param {?} ph\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.visitIcuPlaceholder = function (ph, ctx) {\n            var /** @type {?} */ name = ctx.mapper.toPublicName(ph.name);\n            return [new Tag(_PLACEHOLDER_TAG$1, { name: name })];\n        };\n        /**\n         * @param {?} nodes\n         * @param {?} ctx\n         * @return {?}\n         */\n        _Visitor.prototype.serialize = function (nodes, ctx) {\n            var _this = this;\n            return (_a = []).concat.apply(_a, nodes.map(function (node) { return node.visit(_this, ctx); }));\n            var _a;\n        };\n        return _Visitor;\n    }());\n    /**\n     * @param {?} message\n     * @return {?}\n     */\n    function digest$1(message) {\n        return decimalDigest(message);\n    }\n    var ExampleVisitor = (function () {\n        function ExampleVisitor() {\n        }\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        ExampleVisitor.prototype.addDefaultExamples = function (node) {\n            node.visit(this);\n            return node;\n        };\n        /**\n         * @param {?} tag\n         * @return {?}\n         */\n        ExampleVisitor.prototype.visitTag = function (tag) {\n            var _this = this;\n            if (tag.name === _PLACEHOLDER_TAG$1) {\n                if (!tag.children || tag.children.length == 0) {\n                    var /** @type {?} */ exText = new Text$2(tag.attrs['name'] || '...');\n                    tag.children = [new Tag(_EXEMPLE_TAG, {}, [exText])];\n                }\n            }\n            else if (tag.children) {\n                tag.children.forEach(function (node) { return node.visit(_this); });\n            }\n        };\n        /**\n         * @param {?} text\n         * @return {?}\n         */\n        ExampleVisitor.prototype.visitText = function (text) { };\n        /**\n         * @param {?} decl\n         * @return {?}\n         */\n        ExampleVisitor.prototype.visitDeclaration = function (decl) { };\n        /**\n         * @param {?} doctype\n         * @return {?}\n         */\n        ExampleVisitor.prototype.visitDoctype = function (doctype) { };\n        return ExampleVisitor;\n    }());\n    /**\n     * XMB/XTB placeholders can only contain A-Z, 0-9 and _\n     *\n     * Because such restrictions do not exist on placeholder names generated locally, the\n     * `PlaceholderMapper` is used to convert internal names to XMB names when the XMB file is\n     * serialized and back from XTB to internal names when an XTB is loaded.\n     */\n    var XmbPlaceholderMapper = (function () {\n        /**\n         * @param {?} message\n         */\n        function XmbPlaceholderMapper(message) {\n            var _this = this;\n            this.internalToXmb = {};\n            this.xmbToNextId = {};\n            this.xmbToInternal = {};\n            message.nodes.forEach(function (node) { return node.visit(_this); });\n        }\n        /**\n         * @param {?} internalName\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.toPublicName = function (internalName) {\n            return this.internalToXmb.hasOwnProperty(internalName) ? this.internalToXmb[internalName] :\n                null;\n        };\n        /**\n         * @param {?} publicName\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.toInternalName = function (publicName) {\n            return this.xmbToInternal.hasOwnProperty(publicName) ? this.xmbToInternal[publicName] : null;\n        };\n        /**\n         * @param {?} text\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitText = function (text, ctx) { return null; };\n        /**\n         * @param {?} container\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitContainer = function (container, ctx) {\n            var _this = this;\n            container.children.forEach(function (child) { return child.visit(_this); });\n        };\n        /**\n         * @param {?} icu\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitIcu = function (icu, ctx) {\n            var _this = this;\n            Object.keys(icu.cases).forEach(function (k) { icu.cases[k].visit(_this); });\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitTagPlaceholder = function (ph, ctx) {\n            var _this = this;\n            this.addPlaceholder(ph.startName);\n            ph.children.forEach(function (child) { return child.visit(_this); });\n            this.addPlaceholder(ph.closeName);\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitPlaceholder = function (ph, ctx) { this.addPlaceholder(ph.name); };\n        /**\n         * @param {?} ph\n         * @param {?=} ctx\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.visitIcuPlaceholder = function (ph, ctx) { this.addPlaceholder(ph.name); };\n        /**\n         * @param {?} internalName\n         * @return {?}\n         */\n        XmbPlaceholderMapper.prototype.addPlaceholder = function (internalName) {\n            if (!internalName || this.internalToXmb.hasOwnProperty(internalName)) {\n                return;\n            }\n            var /** @type {?} */ xmbName = internalName.toUpperCase().replace(/[^A-Z0-9_]/g, '_');\n            if (this.xmbToInternal.hasOwnProperty(xmbName)) {\n                // Create a new XMB when it has already been used\n                var /** @type {?} */ nextId = this.xmbToNextId[xmbName];\n                this.xmbToNextId[xmbName] = nextId + 1;\n                xmbName = xmbName + \"_\" + nextId;\n            }\n            else {\n                this.xmbToNextId[xmbName] = 1;\n            }\n            this.internalToXmb[internalName] = xmbName;\n            this.xmbToInternal[xmbName] = internalName;\n        };\n        return XmbPlaceholderMapper;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$13 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _TRANSLATIONS_TAG = 'translationbundle';\n    var /** @type {?} */ _TRANSLATION_TAG = 'translation';\n    var /** @type {?} */ _PLACEHOLDER_TAG$2 = 'ph';\n    var Xtb = (function (_super) {\n        __extends$13(Xtb, _super);\n        function Xtb() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} messages\n         * @return {?}\n         */\n        Xtb.prototype.write = function (messages) { throw new Error('Unsupported'); };\n        /**\n         * @param {?} content\n         * @param {?} url\n         * @return {?}\n         */\n        Xtb.prototype.load = function (content, url) {\n            // xtb to xml nodes\n            var /** @type {?} */ xtbParser = new XtbParser();\n            var _a = xtbParser.parse(content, url), mlNodesByMsgId = _a.mlNodesByMsgId, errors = _a.errors;\n            // xml nodes to i18n nodes\n            var /** @type {?} */ i18nNodesByMsgId = {};\n            var /** @type {?} */ converter = new XmlToI18n$1();\n            Object.keys(mlNodesByMsgId).forEach(function (msgId) {\n                var _a = converter.convert(mlNodesByMsgId[msgId]), i18nNodes = _a.i18nNodes, e = _a.errors;\n                errors.push.apply(errors, e);\n                i18nNodesByMsgId[msgId] = i18nNodes;\n            });\n            if (errors.length) {\n                throw new Error(\"xtb parse errors:\\n\" + errors.join('\\n'));\n            }\n            return i18nNodesByMsgId;\n        };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Xtb.prototype.digest = function (message) { return digest$1(message); };\n        /**\n         * @param {?} message\n         * @return {?}\n         */\n        Xtb.prototype.createNameMapper = function (message) {\n            return new XmbPlaceholderMapper(message);\n        };\n        return Xtb;\n    }(Serializer));\n    var XtbParser = (function () {\n        function XtbParser() {\n        }\n        /**\n         * @param {?} xtb\n         * @param {?} url\n         * @return {?}\n         */\n        XtbParser.prototype.parse = function (xtb, url) {\n            this._bundleDepth = 0;\n            this._mlNodesByMsgId = {};\n            var /** @type {?} */ xml = new XmlParser().parse(xtb, url, true);\n            this._errors = xml.errors;\n            visitAll(this, xml.rootNodes);\n            return {\n                mlNodesByMsgId: this._mlNodesByMsgId,\n                errors: this._errors,\n            };\n        };\n        /**\n         * @param {?} element\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitElement = function (element, context) {\n            switch (element.name) {\n                case _TRANSLATIONS_TAG:\n                    this._bundleDepth++;\n                    if (this._bundleDepth > 1) {\n                        this._addError(element, \"<\" + _TRANSLATIONS_TAG + \"> elements can not be nested\");\n                    }\n                    visitAll(this, element.children, null);\n                    this._bundleDepth--;\n                    break;\n                case _TRANSLATION_TAG:\n                    var /** @type {?} */ idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });\n                    if (!idAttr) {\n                        this._addError(element, \"<\" + _TRANSLATION_TAG + \"> misses the \\\"id\\\" attribute\");\n                    }\n                    else {\n                        var /** @type {?} */ id = idAttr.value;\n                        if (this._mlNodesByMsgId.hasOwnProperty(id)) {\n                            this._addError(element, \"Duplicated translations for msg \" + id);\n                        }\n                        else {\n                            this._mlNodesByMsgId[id] = element.children;\n                        }\n                    }\n                    break;\n                default:\n                    this._addError(element, 'Unexpected tag');\n            }\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitAttribute = function (attribute, context) { };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitText = function (text, context) { };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitComment = function (comment, context) { };\n        /**\n         * @param {?} expansion\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitExpansion = function (expansion, context) { };\n        /**\n         * @param {?} expansionCase\n         * @param {?} context\n         * @return {?}\n         */\n        XtbParser.prototype.visitExpansionCase = function (expansionCase, context) { };\n        /**\n         * @param {?} node\n         * @param {?} message\n         * @return {?}\n         */\n        XtbParser.prototype._addError = function (node, message) {\n            this._errors.push(new I18nError(node.sourceSpan, message));\n        };\n        return XtbParser;\n    }());\n    var XmlToI18n$1 = (function () {\n        function XmlToI18n() {\n        }\n        /**\n         * @param {?} nodes\n         * @return {?}\n         */\n        XmlToI18n.prototype.convert = function (nodes) {\n            this._errors = [];\n            return {\n                i18nNodes: visitAll(this, nodes),\n                errors: this._errors,\n            };\n        };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitExpansion = function (icu, context) {\n            var /** @type {?} */ caseMap = {};\n            visitAll(this, icu.cases).forEach(function (c) {\n                caseMap[c.value] = new Container(c.nodes, icu.sourceSpan);\n            });\n            return new Icu(icu.switchValue, icu.type, caseMap, icu.sourceSpan);\n        };\n        /**\n         * @param {?} icuCase\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) {\n            return {\n                value: icuCase.value,\n                nodes: visitAll(this, icuCase.expression),\n            };\n        };\n        /**\n         * @param {?} el\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitElement = function (el, context) {\n            if (el.name === _PLACEHOLDER_TAG$2) {\n                var /** @type {?} */ nameAttr = el.attrs.find(function (attr) { return attr.name === 'name'; });\n                if (nameAttr) {\n                    return new Placeholder('', nameAttr.value, el.sourceSpan);\n                }\n                this._addError(el, \"<\" + _PLACEHOLDER_TAG$2 + \"> misses the \\\"name\\\" attribute\");\n            }\n            else {\n                this._addError(el, \"Unexpected tag\");\n            }\n        };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitComment = function (comment, context) { };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        XmlToI18n.prototype.visitAttribute = function (attribute, context) { };\n        /**\n         * @param {?} node\n         * @param {?} message\n         * @return {?}\n         */\n        XmlToI18n.prototype._addError = function (node, message) {\n            this._errors.push(new I18nError(node.sourceSpan, message));\n        };\n        return XmlToI18n;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$14 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var __decorate$3 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$3 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var HtmlParser = (function (_super) {\n        __extends$14(HtmlParser, _super);\n        function HtmlParser() {\n            _super.call(this, getHtmlTagDefinition);\n        }\n        /**\n         * @param {?} source\n         * @param {?} url\n         * @param {?=} parseExpansionForms\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        HtmlParser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n            if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            return _super.prototype.parse.call(this, source, url, parseExpansionForms, interpolationConfig);\n        };\n        HtmlParser = __decorate$3([\n            CompilerInjectable(), \n            __metadata$3('design:paramtypes', [])\n        ], HtmlParser);\n        return HtmlParser;\n    }(Parser$1));\n\n    /**\n     * A container for translated messages\n     */\n    var TranslationBundle = (function () {\n        /**\n         * @param {?=} _i18nNodesByMsgId\n         * @param {?} digest\n         * @param {?=} mapperFactory\n         */\n        function TranslationBundle(_i18nNodesByMsgId, digest, mapperFactory) {\n            if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }\n            this._i18nNodesByMsgId = _i18nNodesByMsgId;\n            this.digest = digest;\n            this.mapperFactory = mapperFactory;\n            this._i18nToHtml = new I18nToHtmlVisitor(_i18nNodesByMsgId, digest, mapperFactory);\n        }\n        /**\n         * @param {?} content\n         * @param {?} url\n         * @param {?} serializer\n         * @return {?}\n         */\n        TranslationBundle.load = function (content, url, serializer) {\n            var /** @type {?} */ i18nNodesByMsgId = serializer.load(content, url);\n            var /** @type {?} */ digestFn = function (m) { return serializer.digest(m); };\n            var /** @type {?} */ mapperFactory = function (m) { return serializer.createNameMapper(m); };\n            return new TranslationBundle(i18nNodesByMsgId, digestFn, mapperFactory);\n        };\n        /**\n         * @param {?} srcMsg\n         * @return {?}\n         */\n        TranslationBundle.prototype.get = function (srcMsg) {\n            var /** @type {?} */ html = this._i18nToHtml.convert(srcMsg);\n            if (html.errors.length) {\n                throw new Error(html.errors.join('\\n'));\n            }\n            return html.nodes;\n        };\n        /**\n         * @param {?} srcMsg\n         * @return {?}\n         */\n        TranslationBundle.prototype.has = function (srcMsg) { return this.digest(srcMsg) in this._i18nNodesByMsgId; };\n        return TranslationBundle;\n    }());\n    var I18nToHtmlVisitor = (function () {\n        /**\n         * @param {?=} _i18nNodesByMsgId\n         * @param {?} _digest\n         * @param {?} _mapperFactory\n         */\n        function I18nToHtmlVisitor(_i18nNodesByMsgId, _digest, _mapperFactory) {\n            if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }\n            this._i18nNodesByMsgId = _i18nNodesByMsgId;\n            this._digest = _digest;\n            this._mapperFactory = _mapperFactory;\n            this._contextStack = [];\n            this._errors = [];\n        }\n        /**\n         * @param {?} srcMsg\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.convert = function (srcMsg) {\n            this._contextStack.length = 0;\n            this._errors.length = 0;\n            // i18n to text\n            var /** @type {?} */ text = this._convertToText(srcMsg);\n            // text to html\n            var /** @type {?} */ url = srcMsg.nodes[0].sourceSpan.start.file.url;\n            var /** @type {?} */ html = new HtmlParser().parse(text, url, true);\n            return {\n                nodes: html.rootNodes,\n                errors: this._errors.concat(html.errors),\n            };\n        };\n        /**\n         * @param {?} text\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitText = function (text, context) { return text.value; };\n        /**\n         * @param {?} container\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitContainer = function (container, context) {\n            var _this = this;\n            return container.children.map(function (n) { return n.visit(_this); }).join('');\n        };\n        /**\n         * @param {?} icu\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitIcu = function (icu, context) {\n            var _this = this;\n            var /** @type {?} */ cases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n            // TODO(vicb): Once all format switch to using expression placeholders\n            // we should throw when the placeholder is not in the source message\n            var /** @type {?} */ exp = this._srcMsg.placeholders.hasOwnProperty(icu.expression) ?\n                this._srcMsg.placeholders[icu.expression] :\n                icu.expression;\n            return \"{\" + exp + \", \" + icu.type + \", \" + cases.join(' ') + \"}\";\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitPlaceholder = function (ph, context) {\n            var /** @type {?} */ phName = this._mapper(ph.name);\n            if (this._srcMsg.placeholders.hasOwnProperty(phName)) {\n                return this._srcMsg.placeholders[phName];\n            }\n            if (this._srcMsg.placeholderToMessage.hasOwnProperty(phName)) {\n                return this._convertToText(this._srcMsg.placeholderToMessage[phName]);\n            }\n            this._addError(ph, \"Unknown placeholder\");\n            return '';\n        };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitTagPlaceholder = function (ph, context) { throw 'unreachable code'; };\n        /**\n         * @param {?} ph\n         * @param {?=} context\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype.visitIcuPlaceholder = function (ph, context) { throw 'unreachable code'; };\n        /**\n         * Convert a source message to a translated text string:\n         * - text nodes are replaced with their translation,\n         * - placeholders are replaced with their content,\n         * - ICU nodes are converted to ICU expressions.\n         * @param {?} srcMsg\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype._convertToText = function (srcMsg) {\n            var _this = this;\n            var /** @type {?} */ digest = this._digest(srcMsg);\n            var /** @type {?} */ mapper = this._mapperFactory ? this._mapperFactory(srcMsg) : null;\n            if (this._i18nNodesByMsgId.hasOwnProperty(digest)) {\n                this._contextStack.push({ msg: this._srcMsg, mapper: this._mapper });\n                this._srcMsg = srcMsg;\n                this._mapper = function (name) { return mapper ? mapper.toInternalName(name) : name; };\n                var /** @type {?} */ nodes = this._i18nNodesByMsgId[digest];\n                var /** @type {?} */ text = nodes.map(function (node) { return node.visit(_this); }).join('');\n                var /** @type {?} */ context = this._contextStack.pop();\n                this._srcMsg = context.msg;\n                this._mapper = context.mapper;\n                return text;\n            }\n            this._addError(srcMsg.nodes[0], \"Missing translation for message \" + digest);\n            return '';\n        };\n        /**\n         * @param {?} el\n         * @param {?} msg\n         * @return {?}\n         */\n        I18nToHtmlVisitor.prototype._addError = function (el, msg) {\n            this._errors.push(new I18nError(el.sourceSpan, msg));\n        };\n        return I18nToHtmlVisitor;\n    }());\n\n    var I18NHtmlParser = (function () {\n        /**\n         * @param {?} _htmlParser\n         * @param {?=} _translations\n         * @param {?=} _translationsFormat\n         */\n        function I18NHtmlParser(_htmlParser, _translations, _translationsFormat) {\n            this._htmlParser = _htmlParser;\n            this._translations = _translations;\n            this._translationsFormat = _translationsFormat;\n        }\n        /**\n         * @param {?} source\n         * @param {?} url\n         * @param {?=} parseExpansionForms\n         * @param {?=} interpolationConfig\n         * @return {?}\n         */\n        I18NHtmlParser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n            if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n            if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n            var /** @type {?} */ parseResult = this._htmlParser.parse(source, url, parseExpansionForms, interpolationConfig);\n            if (!this._translations || this._translations === '') {\n                // Do not enable i18n when no translation bundle is provided\n                return parseResult;\n            }\n            // TODO(vicb): add support for implicit tags / attributes\n            if (parseResult.errors.length) {\n                return new ParseTreeResult(parseResult.rootNodes, parseResult.errors);\n            }\n            var /** @type {?} */ serializer = this._createSerializer();\n            var /** @type {?} */ translationBundle = TranslationBundle.load(this._translations, url, serializer);\n            return mergeTranslations(parseResult.rootNodes, translationBundle, interpolationConfig, [], {});\n        };\n        /**\n         * @return {?}\n         */\n        I18NHtmlParser.prototype._createSerializer = function () {\n            var /** @type {?} */ format = (this._translationsFormat || 'xlf').toLowerCase();\n            switch (format) {\n                case 'xmb':\n                    return new Xmb();\n                case 'xtb':\n                    return new Xtb();\n                case 'xliff':\n                case 'xlf':\n                default:\n                    return new Xliff();\n            }\n        };\n        return I18NHtmlParser;\n    }());\n\n    var /** @type {?} */ APP_VIEW_MODULE_URL = assetUrl('core', 'linker/view');\n    var /** @type {?} */ VIEW_UTILS_MODULE_URL = assetUrl('core', 'linker/view_utils');\n    var /** @type {?} */ CD_MODULE_URL = assetUrl('core', 'change_detection/change_detection');\n    var /** @type {?} */ ANIMATION_STYLE_UTIL_ASSET_URL = assetUrl('core', 'animation/animation_style_util');\n    var Identifiers = (function () {\n        function Identifiers() {\n        }\n        Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS = {\n            name: 'ANALYZE_FOR_ENTRY_COMPONENTS',\n            moduleUrl: assetUrl('core', 'metadata/di'),\n            runtime: _angular_core.ANALYZE_FOR_ENTRY_COMPONENTS\n        };\n        Identifiers.ViewUtils = {\n            name: 'ViewUtils',\n            moduleUrl: assetUrl('core', 'linker/view_utils'),\n            runtime: view_utils.ViewUtils\n        };\n        Identifiers.AppView = { name: 'AppView', moduleUrl: APP_VIEW_MODULE_URL, runtime: AppView };\n        Identifiers.DebugAppView = {\n            name: 'DebugAppView',\n            moduleUrl: APP_VIEW_MODULE_URL,\n            runtime: DebugAppView\n        };\n        Identifiers.ViewContainer = {\n            name: 'ViewContainer',\n            moduleUrl: assetUrl('core', 'linker/view_container'),\n            runtime: ViewContainer\n        };\n        Identifiers.ElementRef = {\n            name: 'ElementRef',\n            moduleUrl: assetUrl('core', 'linker/element_ref'),\n            runtime: _angular_core.ElementRef\n        };\n        Identifiers.ViewContainerRef = {\n            name: 'ViewContainerRef',\n            moduleUrl: assetUrl('core', 'linker/view_container_ref'),\n            runtime: _angular_core.ViewContainerRef\n        };\n        Identifiers.ChangeDetectorRef = {\n            name: 'ChangeDetectorRef',\n            moduleUrl: assetUrl('core', 'change_detection/change_detector_ref'),\n            runtime: _angular_core.ChangeDetectorRef\n        };\n        Identifiers.RenderComponentType = {\n            name: 'RenderComponentType',\n            moduleUrl: assetUrl('core', 'render/api'),\n            runtime: _angular_core.RenderComponentType\n        };\n        Identifiers.QueryList = {\n            name: 'QueryList',\n            moduleUrl: assetUrl('core', 'linker/query_list'),\n            runtime: _angular_core.QueryList\n        };\n        Identifiers.TemplateRef = {\n            name: 'TemplateRef',\n            moduleUrl: assetUrl('core', 'linker/template_ref'),\n            runtime: _angular_core.TemplateRef\n        };\n        Identifiers.TemplateRef_ = {\n            name: 'TemplateRef_',\n            moduleUrl: assetUrl('core', 'linker/template_ref'),\n            runtime: TemplateRef_\n        };\n        Identifiers.CodegenComponentFactoryResolver = {\n            name: 'CodegenComponentFactoryResolver',\n            moduleUrl: assetUrl('core', 'linker/component_factory_resolver'),\n            runtime: CodegenComponentFactoryResolver\n        };\n        Identifiers.ComponentFactoryResolver = {\n            name: 'ComponentFactoryResolver',\n            moduleUrl: assetUrl('core', 'linker/component_factory_resolver'),\n            runtime: _angular_core.ComponentFactoryResolver\n        };\n        Identifiers.ComponentFactory = {\n            name: 'ComponentFactory',\n            runtime: _angular_core.ComponentFactory,\n            moduleUrl: assetUrl('core', 'linker/component_factory')\n        };\n        Identifiers.ComponentRef_ = {\n            name: 'ComponentRef_',\n            runtime: ComponentRef_,\n            moduleUrl: assetUrl('core', 'linker/component_factory')\n        };\n        Identifiers.ComponentRef = {\n            name: 'ComponentRef',\n            runtime: _angular_core.ComponentRef,\n            moduleUrl: assetUrl('core', 'linker/component_factory')\n        };\n        Identifiers.NgModuleFactory = {\n            name: 'NgModuleFactory',\n            runtime: _angular_core.NgModuleFactory,\n            moduleUrl: assetUrl('core', 'linker/ng_module_factory')\n        };\n        Identifiers.NgModuleInjector = {\n            name: 'NgModuleInjector',\n            runtime: NgModuleInjector,\n            moduleUrl: assetUrl('core', 'linker/ng_module_factory')\n        };\n        Identifiers.RegisterModuleFactoryFn = {\n            name: 'registerModuleFactory',\n            runtime: registerModuleFactory,\n            moduleUrl: assetUrl('core', 'linker/ng_module_factory_loader')\n        };\n        Identifiers.ValueUnwrapper = { name: 'ValueUnwrapper', moduleUrl: CD_MODULE_URL, runtime: ValueUnwrapper };\n        Identifiers.Injector = {\n            name: 'Injector',\n            moduleUrl: assetUrl('core', 'di/injector'),\n            runtime: _angular_core.Injector\n        };\n        Identifiers.ViewEncapsulation = {\n            name: 'ViewEncapsulation',\n            moduleUrl: assetUrl('core', 'metadata/view'),\n            runtime: _angular_core.ViewEncapsulation\n        };\n        Identifiers.ViewType = {\n            name: 'ViewType',\n            moduleUrl: assetUrl('core', 'linker/view_type'),\n            runtime: ViewType\n        };\n        Identifiers.ChangeDetectionStrategy = {\n            name: 'ChangeDetectionStrategy',\n            moduleUrl: CD_MODULE_URL,\n            runtime: _angular_core.ChangeDetectionStrategy\n        };\n        Identifiers.StaticNodeDebugInfo = {\n            name: 'StaticNodeDebugInfo',\n            moduleUrl: assetUrl('core', 'linker/debug_context'),\n            runtime: StaticNodeDebugInfo\n        };\n        Identifiers.DebugContext = {\n            name: 'DebugContext',\n            moduleUrl: assetUrl('core', 'linker/debug_context'),\n            runtime: DebugContext\n        };\n        Identifiers.Renderer = {\n            name: 'Renderer',\n            moduleUrl: assetUrl('core', 'render/api'),\n            runtime: _angular_core.Renderer\n        };\n        Identifiers.SimpleChange = { name: 'SimpleChange', moduleUrl: CD_MODULE_URL, runtime: _angular_core.SimpleChange };\n        Identifiers.UNINITIALIZED = { name: 'UNINITIALIZED', moduleUrl: CD_MODULE_URL, runtime: UNINITIALIZED };\n        Identifiers.ChangeDetectorStatus = {\n            name: 'ChangeDetectorStatus',\n            moduleUrl: CD_MODULE_URL,\n            runtime: ChangeDetectorStatus\n        };\n        Identifiers.checkBinding = {\n            name: 'checkBinding',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.checkBinding\n        };\n        Identifiers.devModeEqual = { name: 'devModeEqual', moduleUrl: CD_MODULE_URL, runtime: devModeEqual };\n        Identifiers.inlineInterpolate = {\n            name: 'inlineInterpolate',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.inlineInterpolate\n        };\n        Identifiers.interpolate = {\n            name: 'interpolate',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.interpolate\n        };\n        Identifiers.castByValue = {\n            name: 'castByValue',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.castByValue\n        };\n        Identifiers.EMPTY_ARRAY = {\n            name: 'EMPTY_ARRAY',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.EMPTY_ARRAY\n        };\n        Identifiers.EMPTY_MAP = {\n            name: 'EMPTY_MAP',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.EMPTY_MAP\n        };\n        Identifiers.createRenderElement = {\n            name: 'createRenderElement',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.createRenderElement\n        };\n        Identifiers.selectOrCreateRenderHostElement = {\n            name: 'selectOrCreateRenderHostElement',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.selectOrCreateRenderHostElement\n        };\n        Identifiers.pureProxies = [\n            null,\n            { name: 'pureProxy1', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy1 },\n            { name: 'pureProxy2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy2 },\n            { name: 'pureProxy3', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy3 },\n            { name: 'pureProxy4', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy4 },\n            { name: 'pureProxy5', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy5 },\n            { name: 'pureProxy6', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy6 },\n            { name: 'pureProxy7', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy7 },\n            { name: 'pureProxy8', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy8 },\n            { name: 'pureProxy9', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy9 },\n            { name: 'pureProxy10', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy10 },\n        ];\n        Identifiers.SecurityContext = {\n            name: 'SecurityContext',\n            moduleUrl: assetUrl('core', 'security'),\n            runtime: _angular_core.SecurityContext,\n        };\n        Identifiers.AnimationKeyframe = {\n            name: 'AnimationKeyframe',\n            moduleUrl: assetUrl('core', 'animation/animation_keyframe'),\n            runtime: AnimationKeyframe\n        };\n        Identifiers.AnimationStyles = {\n            name: 'AnimationStyles',\n            moduleUrl: assetUrl('core', 'animation/animation_styles'),\n            runtime: AnimationStyles\n        };\n        Identifiers.NoOpAnimationPlayer = {\n            name: 'NoOpAnimationPlayer',\n            moduleUrl: assetUrl('core', 'animation/animation_player'),\n            runtime: NoOpAnimationPlayer\n        };\n        Identifiers.AnimationGroupPlayer = {\n            name: 'AnimationGroupPlayer',\n            moduleUrl: assetUrl('core', 'animation/animation_group_player'),\n            runtime: AnimationGroupPlayer\n        };\n        Identifiers.AnimationSequencePlayer = {\n            name: 'AnimationSequencePlayer',\n            moduleUrl: assetUrl('core', 'animation/animation_sequence_player'),\n            runtime: AnimationSequencePlayer\n        };\n        Identifiers.prepareFinalAnimationStyles = {\n            name: 'prepareFinalAnimationStyles',\n            moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n            runtime: prepareFinalAnimationStyles\n        };\n        Identifiers.balanceAnimationKeyframes = {\n            name: 'balanceAnimationKeyframes',\n            moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n            runtime: balanceAnimationKeyframes\n        };\n        Identifiers.clearStyles = {\n            name: 'clearStyles',\n            moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n            runtime: clearStyles\n        };\n        Identifiers.renderStyles = {\n            name: 'renderStyles',\n            moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n            runtime: renderStyles\n        };\n        Identifiers.collectAndResolveStyles = {\n            name: 'collectAndResolveStyles',\n            moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n            runtime: collectAndResolveStyles\n        };\n        Identifiers.LOCALE_ID = {\n            name: 'LOCALE_ID',\n            moduleUrl: assetUrl('core', 'i18n/tokens'),\n            runtime: _angular_core.LOCALE_ID\n        };\n        Identifiers.TRANSLATIONS_FORMAT = {\n            name: 'TRANSLATIONS_FORMAT',\n            moduleUrl: assetUrl('core', 'i18n/tokens'),\n            runtime: _angular_core.TRANSLATIONS_FORMAT\n        };\n        Identifiers.setBindingDebugInfo = {\n            name: 'setBindingDebugInfo',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.setBindingDebugInfo\n        };\n        Identifiers.setBindingDebugInfoForChanges = {\n            name: 'setBindingDebugInfoForChanges',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.setBindingDebugInfoForChanges\n        };\n        Identifiers.AnimationTransition = {\n            name: 'AnimationTransition',\n            moduleUrl: assetUrl('core', 'animation/animation_transition'),\n            runtime: AnimationTransition\n        };\n        // This is just the interface!\n        Identifiers.InlineArray = { name: 'InlineArray', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: null };\n        Identifiers.inlineArrays = [\n            { name: 'InlineArray2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray2 },\n            { name: 'InlineArray2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray2 },\n            { name: 'InlineArray4', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray4 },\n            { name: 'InlineArray8', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray8 },\n            { name: 'InlineArray16', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray16 },\n        ];\n        Identifiers.EMPTY_INLINE_ARRAY = {\n            name: 'EMPTY_INLINE_ARRAY',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.EMPTY_INLINE_ARRAY\n        };\n        Identifiers.InlineArrayDynamic = {\n            name: 'InlineArrayDynamic',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.InlineArrayDynamic\n        };\n        Identifiers.subscribeToRenderElement = {\n            name: 'subscribeToRenderElement',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.subscribeToRenderElement\n        };\n        Identifiers.createRenderComponentType = {\n            name: 'createRenderComponentType',\n            moduleUrl: VIEW_UTILS_MODULE_URL,\n            runtime: view_utils.createRenderComponentType\n        };\n        Identifiers.noop = { name: 'noop', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.noop };\n        return Identifiers;\n    }());\n    /**\n     * @param {?} pkg\n     * @param {?=} path\n     * @param {?=} type\n     * @return {?}\n     */\n    function assetUrl(pkg, path, type) {\n        if (path === void 0) { path = null; }\n        if (type === void 0) { type = 'src'; }\n        if (path == null) {\n            return \"@angular/\" + pkg + \"/index\";\n        }\n        else {\n            return \"@angular/\" + pkg + \"/\" + type + \"/\" + path;\n        }\n    }\n    /**\n     * @param {?} identifier\n     * @return {?}\n     */\n    function resolveIdentifier(identifier) {\n        return reflector.resolveIdentifier(identifier.name, identifier.moduleUrl, identifier.runtime);\n    }\n    /**\n     * @param {?} identifier\n     * @return {?}\n     */\n    function createIdentifier(identifier) {\n        var /** @type {?} */ reference = reflector.resolveIdentifier(identifier.name, identifier.moduleUrl, identifier.runtime);\n        return { reference: reference };\n    }\n    /**\n     * @param {?} identifier\n     * @return {?}\n     */\n    function identifierToken(identifier) {\n        return { identifier: identifier };\n    }\n    /**\n     * @param {?} identifier\n     * @return {?}\n     */\n    function createIdentifierToken(identifier) {\n        return identifierToken(createIdentifier(identifier));\n    }\n    /**\n     * @param {?} enumType\n     * @param {?} name\n     * @return {?}\n     */\n    function createEnumIdentifier(enumType, name) {\n        var /** @type {?} */ resolvedEnum = reflector.resolveEnum(resolveIdentifier(enumType), name);\n        return { reference: resolvedEnum };\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$15 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    // http://cldr.unicode.org/index/cldr-spec/plural-rules\n    var /** @type {?} */ PLURAL_CASES = ['zero', 'one', 'two', 'few', 'many', 'other'];\n    /**\n     * Expands special forms into elements.\n     *\n     * For example,\n     *\n     * ```\n     * { messages.length, plural,\n     *   =0 {zero}\n     *   =1 {one}\n     *   other {more than one}\n     * }\n     * ```\n     *\n     * will be expanded into\n     *\n     * ```\n     * <ng-container [ngPlural]=\"messages.length\">\n     *   <template ngPluralCase=\"=0\">zero</template>\n     *   <template ngPluralCase=\"=1\">one</template>\n     *   <template ngPluralCase=\"other\">more than one</template>\n     * </ng-container>\n     * ```\n     * @param {?} nodes\n     * @return {?}\n     */\n    function expandNodes(nodes) {\n        var /** @type {?} */ expander = new _Expander();\n        return new ExpansionResult(visitAll(expander, nodes), expander.isExpanded, expander.errors);\n    }\n    var ExpansionResult = (function () {\n        /**\n         * @param {?} nodes\n         * @param {?} expanded\n         * @param {?} errors\n         */\n        function ExpansionResult(nodes, expanded, errors) {\n            this.nodes = nodes;\n            this.expanded = expanded;\n            this.errors = errors;\n        }\n        return ExpansionResult;\n    }());\n    var ExpansionError = (function (_super) {\n        __extends$15(ExpansionError, _super);\n        /**\n         * @param {?} span\n         * @param {?} errorMsg\n         */\n        function ExpansionError(span, errorMsg) {\n            _super.call(this, span, errorMsg);\n        }\n        return ExpansionError;\n    }(ParseError));\n    /**\n     * Expand expansion forms (plural, select) to directives\n     *\n     * \\@internal\n     */\n    var _Expander = (function () {\n        function _Expander() {\n            this.isExpanded = false;\n            this.errors = [];\n        }\n        /**\n         * @param {?} element\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitElement = function (element, context) {\n            return new Element(element.name, element.attrs, visitAll(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan);\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitAttribute = function (attribute, context) { return attribute; };\n        /**\n         * @param {?} text\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitText = function (text, context) { return text; };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitComment = function (comment, context) { return comment; };\n        /**\n         * @param {?} icu\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitExpansion = function (icu, context) {\n            this.isExpanded = true;\n            return icu.type == 'plural' ? _expandPluralForm(icu, this.errors) :\n                _expandDefaultForm(icu, this.errors);\n        };\n        /**\n         * @param {?} icuCase\n         * @param {?} context\n         * @return {?}\n         */\n        _Expander.prototype.visitExpansionCase = function (icuCase, context) {\n            throw new Error('Should not be reached');\n        };\n        return _Expander;\n    }());\n    /**\n     * @param {?} ast\n     * @param {?} errors\n     * @return {?}\n     */\n    function _expandPluralForm(ast, errors) {\n        var /** @type {?} */ children = ast.cases.map(function (c) {\n            if (PLURAL_CASES.indexOf(c.value) == -1 && !c.value.match(/^=\\d+$/)) {\n                errors.push(new ExpansionError(c.valueSourceSpan, \"Plural cases should be \\\"=<number>\\\" or one of \" + PLURAL_CASES.join(\", \")));\n            }\n            var /** @type {?} */ expansionResult = expandNodes(c.expression);\n            errors.push.apply(errors, expansionResult.errors);\n            return new Element(\"template\", [new Attribute$1('ngPluralCase', \"\" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n        });\n        var /** @type {?} */ switchAttr = new Attribute$1('[ngPlural]', ast.switchValue, ast.switchValueSourceSpan);\n        return new Element('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);\n    }\n    /**\n     * @param {?} ast\n     * @param {?} errors\n     * @return {?}\n     */\n    function _expandDefaultForm(ast, errors) {\n        var /** @type {?} */ children = ast.cases.map(function (c) {\n            var /** @type {?} */ expansionResult = expandNodes(c.expression);\n            errors.push.apply(errors, expansionResult.errors);\n            if (c.value === 'other') {\n                // other is the default case when no values match\n                return new Element(\"template\", [new Attribute$1('ngSwitchDefault', '', c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n            }\n            return new Element(\"template\", [new Attribute$1('ngSwitchCase', \"\" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n        });\n        var /** @type {?} */ switchAttr = new Attribute$1('[ngSwitch]', ast.switchValue, ast.switchValueSourceSpan);\n        return new Element('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$16 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var ProviderError = (function (_super) {\n        __extends$16(ProviderError, _super);\n        /**\n         * @param {?} message\n         * @param {?} span\n         */\n        function ProviderError(message, span) {\n            _super.call(this, span, message);\n        }\n        return ProviderError;\n    }(ParseError));\n    var ProviderViewContext = (function () {\n        /**\n         * @param {?} component\n         * @param {?} sourceSpan\n         */\n        function ProviderViewContext(component, sourceSpan) {\n            var _this = this;\n            this.component = component;\n            this.sourceSpan = sourceSpan;\n            this.errors = [];\n            this.viewQueries = _getViewQueries(component);\n            this.viewProviders = new Map();\n            component.viewProviders.forEach(function (provider) {\n                if (isBlank(_this.viewProviders.get(tokenReference(provider.token)))) {\n                    _this.viewProviders.set(tokenReference(provider.token), true);\n                }\n            });\n        }\n        return ProviderViewContext;\n    }());\n    var ProviderElementContext = (function () {\n        /**\n         * @param {?} viewContext\n         * @param {?} _parent\n         * @param {?} _isViewRoot\n         * @param {?} _directiveAsts\n         * @param {?} attrs\n         * @param {?} refs\n         * @param {?} _sourceSpan\n         */\n        function ProviderElementContext(viewContext, _parent, _isViewRoot, _directiveAsts, attrs, refs, _sourceSpan) {\n            var _this = this;\n            this.viewContext = viewContext;\n            this._parent = _parent;\n            this._isViewRoot = _isViewRoot;\n            this._directiveAsts = _directiveAsts;\n            this._sourceSpan = _sourceSpan;\n            this._transformedProviders = new Map();\n            this._seenProviders = new Map();\n            this._hasViewContainer = false;\n            this._attrs = {};\n            attrs.forEach(function (attrAst) { return _this._attrs[attrAst.name] = attrAst.value; });\n            var directivesMeta = _directiveAsts.map(function (directiveAst) { return directiveAst.directive; });\n            this._allProviders =\n                _resolveProvidersFromDirectives(directivesMeta, _sourceSpan, viewContext.errors);\n            this._contentQueries = _getContentQueries(directivesMeta);\n            var queriedTokens = new Map();\n            Array.from(this._allProviders.values()).forEach(function (provider) {\n                _this._addQueryReadsTo(provider.token, queriedTokens);\n            });\n            refs.forEach(function (refAst) { _this._addQueryReadsTo({ value: refAst.name }, queriedTokens); });\n            if (isPresent(queriedTokens.get(resolveIdentifier(Identifiers.ViewContainerRef)))) {\n                this._hasViewContainer = true;\n            }\n            // create the providers that we know are eager first\n            Array.from(this._allProviders.values()).forEach(function (provider) {\n                var eager = provider.eager || isPresent(queriedTokens.get(tokenReference(provider.token)));\n                if (eager) {\n                    _this._getOrCreateLocalProvider(provider.providerType, provider.token, true);\n                }\n            });\n        }\n        /**\n         * @return {?}\n         */\n        ProviderElementContext.prototype.afterElement = function () {\n            var _this = this;\n            // collect lazy providers\n            Array.from(this._allProviders.values()).forEach(function (provider) {\n                _this._getOrCreateLocalProvider(provider.providerType, provider.token, false);\n            });\n        };\n        Object.defineProperty(ProviderElementContext.prototype, \"transformProviders\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return Array.from(this._transformedProviders.values());\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ProviderElementContext.prototype, \"transformedDirectiveAsts\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                var /** @type {?} */ sortedProviderTypes = this.transformProviders.map(function (provider) { return provider.token.identifier; });\n                var /** @type {?} */ sortedDirectives = this._directiveAsts.slice();\n                sortedDirectives.sort(function (dir1, dir2) { return sortedProviderTypes.indexOf(dir1.directive.type) -\n                    sortedProviderTypes.indexOf(dir2.directive.type); });\n                return sortedDirectives;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(ProviderElementContext.prototype, \"transformedHasViewContainer\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._hasViewContainer; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} token\n         * @param {?} queryReadTokens\n         * @return {?}\n         */\n        ProviderElementContext.prototype._addQueryReadsTo = function (token, queryReadTokens) {\n            this._getQueriesFor(token).forEach(function (query) {\n                var /** @type {?} */ queryReadToken = query.read || token;\n                if (isBlank(queryReadTokens.get(tokenReference(queryReadToken)))) {\n                    queryReadTokens.set(tokenReference(queryReadToken), true);\n                }\n            });\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        ProviderElementContext.prototype._getQueriesFor = function (token) {\n            var /** @type {?} */ result = [];\n            var /** @type {?} */ currentEl = this;\n            var /** @type {?} */ distance = 0;\n            var /** @type {?} */ queries;\n            while (currentEl !== null) {\n                queries = currentEl._contentQueries.get(tokenReference(token));\n                if (queries) {\n                    result.push.apply(result, queries.filter(function (query) { return query.descendants || distance <= 1; }));\n                }\n                if (currentEl._directiveAsts.length > 0) {\n                    distance++;\n                }\n                currentEl = currentEl._parent;\n            }\n            queries = this.viewContext.viewQueries.get(tokenReference(token));\n            if (queries) {\n                result.push.apply(result, queries);\n            }\n            return result;\n        };\n        /**\n         * @param {?} requestingProviderType\n         * @param {?} token\n         * @param {?} eager\n         * @return {?}\n         */\n        ProviderElementContext.prototype._getOrCreateLocalProvider = function (requestingProviderType, token, eager) {\n            var _this = this;\n            var /** @type {?} */ resolvedProvider = this._allProviders.get(tokenReference(token));\n            if (!resolvedProvider || ((requestingProviderType === ProviderAstType.Directive ||\n                requestingProviderType === ProviderAstType.PublicService) &&\n                resolvedProvider.providerType === ProviderAstType.PrivateService) ||\n                ((requestingProviderType === ProviderAstType.PrivateService ||\n                    requestingProviderType === ProviderAstType.PublicService) &&\n                    resolvedProvider.providerType === ProviderAstType.Builtin)) {\n                return null;\n            }\n            var /** @type {?} */ transformedProviderAst = this._transformedProviders.get(tokenReference(token));\n            if (transformedProviderAst) {\n                return transformedProviderAst;\n            }\n            if (isPresent(this._seenProviders.get(tokenReference(token)))) {\n                this.viewContext.errors.push(new ProviderError(\"Cannot instantiate cyclic dependency! \" + tokenName(token), this._sourceSpan));\n                return null;\n            }\n            this._seenProviders.set(tokenReference(token), true);\n            var /** @type {?} */ transformedProviders = resolvedProvider.providers.map(function (provider) {\n                var /** @type {?} */ transformedUseValue = provider.useValue;\n                var /** @type {?} */ transformedUseExisting = provider.useExisting;\n                var /** @type {?} */ transformedDeps;\n                if (isPresent(provider.useExisting)) {\n                    var /** @type {?} */ existingDiDep = _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting }, eager);\n                    if (isPresent(existingDiDep.token)) {\n                        transformedUseExisting = existingDiDep.token;\n                    }\n                    else {\n                        transformedUseExisting = null;\n                        transformedUseValue = existingDiDep.value;\n                    }\n                }\n                else if (provider.useFactory) {\n                    var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n                    transformedDeps =\n                        deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });\n                }\n                else if (provider.useClass) {\n                    var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n                    transformedDeps =\n                        deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });\n                }\n                return _transformProvider(provider, {\n                    useExisting: transformedUseExisting,\n                    useValue: transformedUseValue,\n                    deps: transformedDeps\n                });\n            });\n            transformedProviderAst =\n                _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders });\n            this._transformedProviders.set(tokenReference(token), transformedProviderAst);\n            return transformedProviderAst;\n        };\n        /**\n         * @param {?} requestingProviderType\n         * @param {?} dep\n         * @param {?=} eager\n         * @return {?}\n         */\n        ProviderElementContext.prototype._getLocalDependency = function (requestingProviderType, dep, eager) {\n            if (eager === void 0) { eager = null; }\n            if (dep.isAttribute) {\n                var /** @type {?} */ attrValue = this._attrs[dep.token.value];\n                return { isValue: true, value: attrValue == null ? null : attrValue };\n            }\n            if (isPresent(dep.token)) {\n                // access builtints\n                if ((requestingProviderType === ProviderAstType.Directive ||\n                    requestingProviderType === ProviderAstType.Component)) {\n                    if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Renderer) ||\n                        tokenReference(dep.token) === resolveIdentifier(Identifiers.ElementRef) ||\n                        tokenReference(dep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef) ||\n                        tokenReference(dep.token) === resolveIdentifier(Identifiers.TemplateRef)) {\n                        return dep;\n                    }\n                    if (tokenReference(dep.token) === resolveIdentifier(Identifiers.ViewContainerRef)) {\n                        this._hasViewContainer = true;\n                    }\n                }\n                // access the injector\n                if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector)) {\n                    return dep;\n                }\n                // access providers\n                if (isPresent(this._getOrCreateLocalProvider(requestingProviderType, dep.token, eager))) {\n                    return dep;\n                }\n            }\n            return null;\n        };\n        /**\n         * @param {?} requestingProviderType\n         * @param {?} dep\n         * @param {?=} eager\n         * @return {?}\n         */\n        ProviderElementContext.prototype._getDependency = function (requestingProviderType, dep, eager) {\n            if (eager === void 0) { eager = null; }\n            var /** @type {?} */ currElement = this;\n            var /** @type {?} */ currEager = eager;\n            var /** @type {?} */ result = null;\n            if (!dep.isSkipSelf) {\n                result = this._getLocalDependency(requestingProviderType, dep, eager);\n            }\n            if (dep.isSelf) {\n                if (!result && dep.isOptional) {\n                    result = { isValue: true, value: null };\n                }\n            }\n            else {\n                // check parent elements\n                while (!result && currElement._parent) {\n                    var /** @type {?} */ prevElement = currElement;\n                    currElement = currElement._parent;\n                    if (prevElement._isViewRoot) {\n                        currEager = false;\n                    }\n                    result = currElement._getLocalDependency(ProviderAstType.PublicService, dep, currEager);\n                }\n                // check @Host restriction\n                if (!result) {\n                    if (!dep.isHost || this.viewContext.component.isHost ||\n                        this.viewContext.component.type.reference === tokenReference(dep.token) ||\n                        isPresent(this.viewContext.viewProviders.get(tokenReference(dep.token)))) {\n                        result = dep;\n                    }\n                    else {\n                        result = dep.isOptional ? result = { isValue: true, value: null } : null;\n                    }\n                }\n            }\n            if (!result) {\n                this.viewContext.errors.push(new ProviderError(\"No provider for \" + tokenName(dep.token), this._sourceSpan));\n            }\n            return result;\n        };\n        return ProviderElementContext;\n    }());\n    var NgModuleProviderAnalyzer = (function () {\n        /**\n         * @param {?} ngModule\n         * @param {?} extraProviders\n         * @param {?} sourceSpan\n         */\n        function NgModuleProviderAnalyzer(ngModule, extraProviders, sourceSpan) {\n            var _this = this;\n            this._transformedProviders = new Map();\n            this._seenProviders = new Map();\n            this._errors = [];\n            this._allProviders = new Map();\n            ngModule.transitiveModule.modules.forEach(function (ngModuleType) {\n                var ngModuleProvider = { token: { identifier: ngModuleType }, useClass: ngModuleType };\n                _resolveProviders([ngModuleProvider], ProviderAstType.PublicService, true, sourceSpan, _this._errors, _this._allProviders);\n            });\n            _resolveProviders(ngModule.transitiveModule.providers.map(function (entry) { return entry.provider; }).concat(extraProviders), ProviderAstType.PublicService, false, sourceSpan, this._errors, this._allProviders);\n        }\n        /**\n         * @return {?}\n         */\n        NgModuleProviderAnalyzer.prototype.parse = function () {\n            var _this = this;\n            Array.from(this._allProviders.values()).forEach(function (provider) {\n                _this._getOrCreateLocalProvider(provider.token, provider.eager);\n            });\n            if (this._errors.length > 0) {\n                var /** @type {?} */ errorString = this._errors.join('\\n');\n                throw new Error(\"Provider parse errors:\\n\" + errorString);\n            }\n            return Array.from(this._transformedProviders.values());\n        };\n        /**\n         * @param {?} token\n         * @param {?} eager\n         * @return {?}\n         */\n        NgModuleProviderAnalyzer.prototype._getOrCreateLocalProvider = function (token, eager) {\n            var _this = this;\n            var /** @type {?} */ resolvedProvider = this._allProviders.get(tokenReference(token));\n            if (!resolvedProvider) {\n                return null;\n            }\n            var /** @type {?} */ transformedProviderAst = this._transformedProviders.get(tokenReference(token));\n            if (transformedProviderAst) {\n                return transformedProviderAst;\n            }\n            if (isPresent(this._seenProviders.get(tokenReference(token)))) {\n                this._errors.push(new ProviderError(\"Cannot instantiate cyclic dependency! \" + tokenName(token), resolvedProvider.sourceSpan));\n                return null;\n            }\n            this._seenProviders.set(tokenReference(token), true);\n            var /** @type {?} */ transformedProviders = resolvedProvider.providers.map(function (provider) {\n                var /** @type {?} */ transformedUseValue = provider.useValue;\n                var /** @type {?} */ transformedUseExisting = provider.useExisting;\n                var /** @type {?} */ transformedDeps;\n                if (isPresent(provider.useExisting)) {\n                    var /** @type {?} */ existingDiDep = _this._getDependency({ token: provider.useExisting }, eager, resolvedProvider.sourceSpan);\n                    if (isPresent(existingDiDep.token)) {\n                        transformedUseExisting = existingDiDep.token;\n                    }\n                    else {\n                        transformedUseExisting = null;\n                        transformedUseValue = existingDiDep.value;\n                    }\n                }\n                else if (provider.useFactory) {\n                    var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n                    transformedDeps =\n                        deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); });\n                }\n                else if (provider.useClass) {\n                    var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n                    transformedDeps =\n                        deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); });\n                }\n                return _transformProvider(provider, {\n                    useExisting: transformedUseExisting,\n                    useValue: transformedUseValue,\n                    deps: transformedDeps\n                });\n            });\n            transformedProviderAst =\n                _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders });\n            this._transformedProviders.set(tokenReference(token), transformedProviderAst);\n            return transformedProviderAst;\n        };\n        /**\n         * @param {?} dep\n         * @param {?=} eager\n         * @param {?} requestorSourceSpan\n         * @return {?}\n         */\n        NgModuleProviderAnalyzer.prototype._getDependency = function (dep, eager, requestorSourceSpan) {\n            if (eager === void 0) { eager = null; }\n            var /** @type {?} */ foundLocal = false;\n            if (!dep.isSkipSelf && isPresent(dep.token)) {\n                // access the injector\n                if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector) ||\n                    tokenReference(dep.token) === resolveIdentifier(Identifiers.ComponentFactoryResolver)) {\n                    foundLocal = true;\n                }\n                else if (isPresent(this._getOrCreateLocalProvider(dep.token, eager))) {\n                    foundLocal = true;\n                }\n            }\n            var /** @type {?} */ result = dep;\n            if (dep.isSelf && !foundLocal) {\n                if (dep.isOptional) {\n                    result = { isValue: true, value: null };\n                }\n                else {\n                    this._errors.push(new ProviderError(\"No provider for \" + tokenName(dep.token), requestorSourceSpan));\n                }\n            }\n            return result;\n        };\n        return NgModuleProviderAnalyzer;\n    }());\n    /**\n     * @param {?} provider\n     * @param {?} __1\n     * @return {?}\n     */\n    function _transformProvider(provider, _a) {\n        var useExisting = _a.useExisting, useValue = _a.useValue, deps = _a.deps;\n        return {\n            token: provider.token,\n            useClass: provider.useClass,\n            useExisting: useExisting,\n            useFactory: provider.useFactory,\n            useValue: useValue,\n            deps: deps,\n            multi: provider.multi\n        };\n    }\n    /**\n     * @param {?} provider\n     * @param {?} __1\n     * @return {?}\n     */\n    function _transformProviderAst(provider, _a) {\n        var eager = _a.eager, providers = _a.providers;\n        return new ProviderAst(provider.token, provider.multiProvider, provider.eager || eager, providers, provider.providerType, provider.lifecycleHooks, provider.sourceSpan);\n    }\n    /**\n     * @param {?} directives\n     * @param {?} sourceSpan\n     * @param {?} targetErrors\n     * @return {?}\n     */\n    function _resolveProvidersFromDirectives(directives, sourceSpan, targetErrors) {\n        var /** @type {?} */ providersByToken = new Map();\n        directives.forEach(function (directive) {\n            var /** @type {?} */ dirProvider = { token: { identifier: directive.type }, useClass: directive.type };\n            _resolveProviders([dirProvider], directive.isComponent ? ProviderAstType.Component : ProviderAstType.Directive, true, sourceSpan, targetErrors, providersByToken);\n        });\n        // Note: directives need to be able to overwrite providers of a component!\n        var /** @type {?} */ directivesWithComponentFirst = directives.filter(function (dir) { return dir.isComponent; }).concat(directives.filter(function (dir) { return !dir.isComponent; }));\n        directivesWithComponentFirst.forEach(function (directive) {\n            _resolveProviders(directive.providers, ProviderAstType.PublicService, false, sourceSpan, targetErrors, providersByToken);\n            _resolveProviders(directive.viewProviders, ProviderAstType.PrivateService, false, sourceSpan, targetErrors, providersByToken);\n        });\n        return providersByToken;\n    }\n    /**\n     * @param {?} providers\n     * @param {?} providerType\n     * @param {?} eager\n     * @param {?} sourceSpan\n     * @param {?} targetErrors\n     * @param {?} targetProvidersByToken\n     * @return {?}\n     */\n    function _resolveProviders(providers, providerType, eager, sourceSpan, targetErrors, targetProvidersByToken) {\n        providers.forEach(function (provider) {\n            var /** @type {?} */ resolvedProvider = targetProvidersByToken.get(tokenReference(provider.token));\n            if (isPresent(resolvedProvider) && !!resolvedProvider.multiProvider !== !!provider.multi) {\n                targetErrors.push(new ProviderError(\"Mixing multi and non multi provider is not possible for token \" + tokenName(resolvedProvider.token), sourceSpan));\n            }\n            if (!resolvedProvider) {\n                var /** @type {?} */ lifecycleHooks = provider.token.identifier &&\n                    ((provider.token.identifier)).lifecycleHooks ?\n                    ((provider.token.identifier)).lifecycleHooks :\n                    [];\n                resolvedProvider = new ProviderAst(provider.token, provider.multi, eager || lifecycleHooks.length > 0, [provider], providerType, lifecycleHooks, sourceSpan);\n                targetProvidersByToken.set(tokenReference(provider.token), resolvedProvider);\n            }\n            else {\n                if (!provider.multi) {\n                    resolvedProvider.providers.length = 0;\n                }\n                resolvedProvider.providers.push(provider);\n            }\n        });\n    }\n    /**\n     * @param {?} component\n     * @return {?}\n     */\n    function _getViewQueries(component) {\n        var /** @type {?} */ viewQueries = new Map();\n        if (component.viewQueries) {\n            component.viewQueries.forEach(function (query) { return _addQueryToTokenMap(viewQueries, query); });\n        }\n        return viewQueries;\n    }\n    /**\n     * @param {?} directives\n     * @return {?}\n     */\n    function _getContentQueries(directives) {\n        var /** @type {?} */ contentQueries = new Map();\n        directives.forEach(function (directive) {\n            if (directive.queries) {\n                directive.queries.forEach(function (query) { return _addQueryToTokenMap(contentQueries, query); });\n            }\n        });\n        return contentQueries;\n    }\n    /**\n     * @param {?} map\n     * @param {?} query\n     * @return {?}\n     */\n    function _addQueryToTokenMap(map, query) {\n        query.selectors.forEach(function (token) {\n            var /** @type {?} */ entry = map.get(tokenReference(token));\n            if (!entry) {\n                entry = [];\n                map.set(tokenReference(token), entry);\n            }\n            entry.push(query);\n        });\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * @abstract\n     */\n    var ElementSchemaRegistry = (function () {\n        function ElementSchemaRegistry() {\n        }\n        /**\n         * @abstract\n         * @param {?} tagName\n         * @param {?} propName\n         * @param {?} schemaMetas\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.hasProperty = function (tagName, propName, schemaMetas) { };\n        /**\n         * @abstract\n         * @param {?} tagName\n         * @param {?} schemaMetas\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.hasElement = function (tagName, schemaMetas) { };\n        /**\n         * @abstract\n         * @param {?} elementName\n         * @param {?} propName\n         * @param {?} isAttribute\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.securityContext = function (elementName, propName, isAttribute) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.allKnownElementNames = function () { };\n        /**\n         * @abstract\n         * @param {?} propName\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.getMappedPropName = function (propName) { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.getDefaultComponentElementName = function () { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.validateProperty = function (name) { };\n        /**\n         * @abstract\n         * @param {?} name\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.validateAttribute = function (name) { };\n        /**\n         * @abstract\n         * @param {?} propName\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.normalizeAnimationStyleProperty = function (propName) { };\n        /**\n         * @abstract\n         * @param {?} camelCaseProp\n         * @param {?} userProvidedProp\n         * @param {?} val\n         * @return {?}\n         */\n        ElementSchemaRegistry.prototype.normalizeAnimationStyleValue = function (camelCaseProp, userProvidedProp, val) { };\n        return ElementSchemaRegistry;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var StyleWithImports = (function () {\n        /**\n         * @param {?} style\n         * @param {?} styleUrls\n         */\n        function StyleWithImports(style, styleUrls) {\n            this.style = style;\n            this.styleUrls = styleUrls;\n        }\n        return StyleWithImports;\n    }());\n    /**\n     * @param {?} url\n     * @return {?}\n     */\n    function isStyleUrlResolvable(url) {\n        if (url == null || url.length === 0 || url[0] == '/')\n            return false;\n        var /** @type {?} */ schemeMatch = url.match(URL_WITH_SCHEMA_REGEXP);\n        return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';\n    }\n    /**\n     * Rewrites stylesheets by resolving and removing the \\@import urls that\n     * are either relative or don't have a `package:` scheme\n     * @param {?} resolver\n     * @param {?} baseUrl\n     * @param {?} cssText\n     * @return {?}\n     */\n    function extractStyleUrls(resolver, baseUrl, cssText) {\n        var /** @type {?} */ foundUrls = [];\n        var /** @type {?} */ modifiedCssText = cssText.replace(CSS_COMMENT_REGEXP, '').replace(CSS_IMPORT_REGEXP, function () {\n            var m = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                m[_i - 0] = arguments[_i];\n            }\n            var /** @type {?} */ url = m[1] || m[2];\n            if (!isStyleUrlResolvable(url)) {\n                // Do not attempt to resolve non-package absolute URLs with URI scheme\n                return m[0];\n            }\n            foundUrls.push(resolver.resolve(baseUrl, url));\n            return '';\n        });\n        return new StyleWithImports(modifiedCssText, foundUrls);\n    }\n    var /** @type {?} */ CSS_IMPORT_REGEXP = /@import\\s+(?:url\\()?\\s*(?:(?:['\"]([^'\"]*))|([^;\\)\\s]*))[^;]*;?/g;\n    var /** @type {?} */ CSS_COMMENT_REGEXP = /\\/\\*.+?\\*\\//g;\n    var /** @type {?} */ URL_WITH_SCHEMA_REGEXP = /^([^:/?#]+):/;\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$17 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ PROPERTY_PARTS_SEPARATOR = '.';\n    var /** @type {?} */ ATTRIBUTE_PREFIX = 'attr';\n    var /** @type {?} */ CLASS_PREFIX = 'class';\n    var /** @type {?} */ STYLE_PREFIX = 'style';\n    var /** @type {?} */ ANIMATE_PROP_PREFIX = 'animate-';\n    var BoundPropertyType = {};\n    BoundPropertyType.DEFAULT = 0;\n    BoundPropertyType.LITERAL_ATTR = 1;\n    BoundPropertyType.ANIMATION = 2;\n    BoundPropertyType[BoundPropertyType.DEFAULT] = \"DEFAULT\";\n    BoundPropertyType[BoundPropertyType.LITERAL_ATTR] = \"LITERAL_ATTR\";\n    BoundPropertyType[BoundPropertyType.ANIMATION] = \"ANIMATION\";\n    /**\n     * Represents a parsed property.\n     */\n    var BoundProperty = (function () {\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} type\n         * @param {?} sourceSpan\n         */\n        function BoundProperty(name, expression, type, sourceSpan) {\n            this.name = name;\n            this.expression = expression;\n            this.type = type;\n            this.sourceSpan = sourceSpan;\n        }\n        Object.defineProperty(BoundProperty.prototype, \"isLiteral\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.type === BoundPropertyType.LITERAL_ATTR; },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BoundProperty.prototype, \"isAnimation\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.type === BoundPropertyType.ANIMATION; },\n            enumerable: true,\n            configurable: true\n        });\n        return BoundProperty;\n    }());\n    /**\n     * Parses bindings in templates and in the directive host area.\n     */\n    var BindingParser = (function () {\n        /**\n         * @param {?} _exprParser\n         * @param {?} _interpolationConfig\n         * @param {?} _schemaRegistry\n         * @param {?} pipes\n         * @param {?} _targetErrors\n         */\n        function BindingParser(_exprParser, _interpolationConfig, _schemaRegistry, pipes, _targetErrors) {\n            var _this = this;\n            this._exprParser = _exprParser;\n            this._interpolationConfig = _interpolationConfig;\n            this._schemaRegistry = _schemaRegistry;\n            this._targetErrors = _targetErrors;\n            this.pipesByName = new Map();\n            pipes.forEach(function (pipe) { return _this.pipesByName.set(pipe.name, pipe); });\n        }\n        /**\n         * @param {?} dirMeta\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype.createDirectiveHostPropertyAsts = function (dirMeta, sourceSpan) {\n            var _this = this;\n            if (dirMeta.hostProperties) {\n                var /** @type {?} */ boundProps_1 = [];\n                Object.keys(dirMeta.hostProperties).forEach(function (propName) {\n                    var /** @type {?} */ expression = dirMeta.hostProperties[propName];\n                    if (typeof expression === 'string') {\n                        _this.parsePropertyBinding(propName, expression, true, sourceSpan, [], boundProps_1);\n                    }\n                    else {\n                        _this._reportError(\"Value of the host property binding \\\"\" + propName + \"\\\" needs to be a string representing an expression but got \\\"\" + expression + \"\\\" (\" + typeof expression + \")\", sourceSpan);\n                    }\n                });\n                return boundProps_1.map(function (prop) { return _this.createElementPropertyAst(dirMeta.selector, prop); });\n            }\n        };\n        /**\n         * @param {?} dirMeta\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype.createDirectiveHostEventAsts = function (dirMeta, sourceSpan) {\n            var _this = this;\n            if (dirMeta.hostListeners) {\n                var /** @type {?} */ targetEventAsts_1 = [];\n                Object.keys(dirMeta.hostListeners).forEach(function (propName) {\n                    var /** @type {?} */ expression = dirMeta.hostListeners[propName];\n                    if (typeof expression === 'string') {\n                        _this.parseEvent(propName, expression, sourceSpan, [], targetEventAsts_1);\n                    }\n                    else {\n                        _this._reportError(\"Value of the host listener \\\"\" + propName + \"\\\" needs to be a string representing an expression but got \\\"\" + expression + \"\\\" (\" + typeof expression + \")\", sourceSpan);\n                    }\n                });\n                return targetEventAsts_1;\n            }\n        };\n        /**\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype.parseInterpolation = function (value, sourceSpan) {\n            var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n            try {\n                var /** @type {?} */ ast = this._exprParser.parseInterpolation(value, sourceInfo, this._interpolationConfig);\n                if (ast)\n                    this._reportExpressionParserErrors(ast.errors, sourceSpan);\n                this._checkPipes(ast, sourceSpan);\n                return ast;\n            }\n            catch (e) {\n                this._reportError(\"\" + e, sourceSpan);\n                return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n            }\n        };\n        /**\n         * @param {?} prefixToken\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @param {?} targetVars\n         * @return {?}\n         */\n        BindingParser.prototype.parseInlineTemplateBinding = function (prefixToken, value, sourceSpan, targetMatchableAttrs, targetProps, targetVars) {\n            var /** @type {?} */ bindings = this._parseTemplateBindings(prefixToken, value, sourceSpan);\n            for (var /** @type {?} */ i = 0; i < bindings.length; i++) {\n                var /** @type {?} */ binding = bindings[i];\n                if (binding.keyIsVar) {\n                    targetVars.push(new VariableAst(binding.key, binding.name, sourceSpan));\n                }\n                else if (binding.expression) {\n                    this._parsePropertyAst(binding.key, binding.expression, sourceSpan, targetMatchableAttrs, targetProps);\n                }\n                else {\n                    targetMatchableAttrs.push([binding.key, '']);\n                    this.parseLiteralAttr(binding.key, null, sourceSpan, targetMatchableAttrs, targetProps);\n                }\n            }\n        };\n        /**\n         * @param {?} prefixToken\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype._parseTemplateBindings = function (prefixToken, value, sourceSpan) {\n            var _this = this;\n            var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n            try {\n                var /** @type {?} */ bindingsResult = this._exprParser.parseTemplateBindings(prefixToken, value, sourceInfo);\n                this._reportExpressionParserErrors(bindingsResult.errors, sourceSpan);\n                bindingsResult.templateBindings.forEach(function (binding) {\n                    if (binding.expression) {\n                        _this._checkPipes(binding.expression, sourceSpan);\n                    }\n                });\n                bindingsResult.warnings.forEach(function (warning) { _this._reportError(warning, sourceSpan, ParseErrorLevel.WARNING); });\n                return bindingsResult.templateBindings;\n            }\n            catch (e) {\n                this._reportError(\"\" + e, sourceSpan);\n                return [];\n            }\n        };\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @return {?}\n         */\n        BindingParser.prototype.parseLiteralAttr = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {\n            if (_isAnimationLabel(name)) {\n                name = name.substring(1);\n                if (value) {\n                    this._reportError(\"Assigning animation triggers via @prop=\\\"exp\\\" attributes with an expression is invalid.\" +\n                        \" Use property bindings (e.g. [@prop]=\\\"exp\\\") or use an attribute without a value (e.g. @prop) instead.\", sourceSpan, ParseErrorLevel.FATAL);\n                }\n                this._parseAnimation(name, value, sourceSpan, targetMatchableAttrs, targetProps);\n            }\n            else {\n                targetProps.push(new BoundProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), BoundPropertyType.LITERAL_ATTR, sourceSpan));\n            }\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} isHost\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @return {?}\n         */\n        BindingParser.prototype.parsePropertyBinding = function (name, expression, isHost, sourceSpan, targetMatchableAttrs, targetProps) {\n            var /** @type {?} */ isAnimationProp = false;\n            if (name.startsWith(ANIMATE_PROP_PREFIX)) {\n                isAnimationProp = true;\n                name = name.substring(ANIMATE_PROP_PREFIX.length);\n            }\n            else if (_isAnimationLabel(name)) {\n                isAnimationProp = true;\n                name = name.substring(1);\n            }\n            if (isAnimationProp) {\n                this._parseAnimation(name, expression, sourceSpan, targetMatchableAttrs, targetProps);\n            }\n            else {\n                this._parsePropertyAst(name, this._parseBinding(expression, isHost, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);\n            }\n        };\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @return {?}\n         */\n        BindingParser.prototype.parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {\n            var /** @type {?} */ expr = this.parseInterpolation(value, sourceSpan);\n            if (expr) {\n                this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);\n                return true;\n            }\n            return false;\n        };\n        /**\n         * @param {?} name\n         * @param {?} ast\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @return {?}\n         */\n        BindingParser.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {\n            targetMatchableAttrs.push([name, ast.source]);\n            targetProps.push(new BoundProperty(name, ast, BoundPropertyType.DEFAULT, sourceSpan));\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @return {?}\n         */\n        BindingParser.prototype._parseAnimation = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {\n            // This will occur when a @trigger is not paired with an expression.\n            // For animations it is valid to not have an expression since */void\n            // states will be applied by angular when the element is attached/detached\n            var /** @type {?} */ ast = this._parseBinding(expression || 'null', false, sourceSpan);\n            targetMatchableAttrs.push([name, ast.source]);\n            targetProps.push(new BoundProperty(name, ast, BoundPropertyType.ANIMATION, sourceSpan));\n        };\n        /**\n         * @param {?} value\n         * @param {?} isHostBinding\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype._parseBinding = function (value, isHostBinding, sourceSpan) {\n            var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n            try {\n                var /** @type {?} */ ast = isHostBinding ?\n                    this._exprParser.parseSimpleBinding(value, sourceInfo, this._interpolationConfig) :\n                    this._exprParser.parseBinding(value, sourceInfo, this._interpolationConfig);\n                if (ast)\n                    this._reportExpressionParserErrors(ast.errors, sourceSpan);\n                this._checkPipes(ast, sourceSpan);\n                return ast;\n            }\n            catch (e) {\n                this._reportError(\"\" + e, sourceSpan);\n                return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n            }\n        };\n        /**\n         * @param {?} elementSelector\n         * @param {?} boundProp\n         * @return {?}\n         */\n        BindingParser.prototype.createElementPropertyAst = function (elementSelector, boundProp) {\n            if (boundProp.isAnimation) {\n                return new BoundElementPropertyAst(boundProp.name, PropertyBindingType.Animation, _angular_core.SecurityContext.NONE, false, boundProp.expression, null, boundProp.sourceSpan);\n            }\n            var /** @type {?} */ unit = null;\n            var /** @type {?} */ bindingType;\n            var /** @type {?} */ boundPropertyName = null;\n            var /** @type {?} */ parts = boundProp.name.split(PROPERTY_PARTS_SEPARATOR);\n            var /** @type {?} */ securityContexts;\n            // Check check for special cases (prefix style, attr, class)\n            if (parts.length > 1) {\n                if (parts[0] == ATTRIBUTE_PREFIX) {\n                    boundPropertyName = parts[1];\n                    this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, true);\n                    securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, true);\n                    var /** @type {?} */ nsSeparatorIdx = boundPropertyName.indexOf(':');\n                    if (nsSeparatorIdx > -1) {\n                        var /** @type {?} */ ns = boundPropertyName.substring(0, nsSeparatorIdx);\n                        var /** @type {?} */ name_1 = boundPropertyName.substring(nsSeparatorIdx + 1);\n                        boundPropertyName = mergeNsAndName(ns, name_1);\n                    }\n                    bindingType = PropertyBindingType.Attribute;\n                }\n                else if (parts[0] == CLASS_PREFIX) {\n                    boundPropertyName = parts[1];\n                    bindingType = PropertyBindingType.Class;\n                    securityContexts = [_angular_core.SecurityContext.NONE];\n                }\n                else if (parts[0] == STYLE_PREFIX) {\n                    unit = parts.length > 2 ? parts[2] : null;\n                    boundPropertyName = parts[1];\n                    bindingType = PropertyBindingType.Style;\n                    securityContexts = [_angular_core.SecurityContext.STYLE];\n                }\n            }\n            // If not a special case, use the full property name\n            if (boundPropertyName === null) {\n                boundPropertyName = this._schemaRegistry.getMappedPropName(boundProp.name);\n                securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, false);\n                bindingType = PropertyBindingType.Property;\n                this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, false);\n            }\n            return new BoundElementPropertyAst(boundPropertyName, bindingType, securityContexts.length === 1 ? securityContexts[0] : null, securityContexts.length > 1, boundProp.expression, unit, boundProp.sourceSpan);\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetEvents\n         * @return {?}\n         */\n        BindingParser.prototype.parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n            if (_isAnimationLabel(name)) {\n                name = name.substr(1);\n                this._parseAnimationEvent(name, expression, sourceSpan, targetEvents);\n            }\n            else {\n                this._parseEvent(name, expression, sourceSpan, targetMatchableAttrs, targetEvents);\n            }\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} targetEvents\n         * @return {?}\n         */\n        BindingParser.prototype._parseAnimationEvent = function (name, expression, sourceSpan, targetEvents) {\n            var /** @type {?} */ matches = splitAtPeriod(name, [name, '']);\n            var /** @type {?} */ eventName = matches[0];\n            var /** @type {?} */ phase = matches[1].toLowerCase();\n            if (phase) {\n                switch (phase) {\n                    case 'start':\n                    case 'done':\n                        var /** @type {?} */ ast = this._parseAction(expression, sourceSpan);\n                        targetEvents.push(new BoundEventAst(eventName, null, phase, ast, sourceSpan));\n                        break;\n                    default:\n                        this._reportError(\"The provided animation output phase value \\\"\" + phase + \"\\\" for \\\"@\" + eventName + \"\\\" is not supported (use start or done)\", sourceSpan);\n                        break;\n                }\n            }\n            else {\n                this._reportError(\"The animation trigger output event (@\" + eventName + \") is missing its phase value name (start or done are currently supported)\", sourceSpan);\n            }\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetEvents\n         * @return {?}\n         */\n        BindingParser.prototype._parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n            // long format: 'target: eventName'\n            var _a = splitAtColon(name, [null, name]), target = _a[0], eventName = _a[1];\n            var /** @type {?} */ ast = this._parseAction(expression, sourceSpan);\n            targetMatchableAttrs.push([name, ast.source]);\n            targetEvents.push(new BoundEventAst(eventName, target, null, ast, sourceSpan));\n            // Don't detect directives for event names for now,\n            // so don't add the event name to the matchableAttrs\n        };\n        /**\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype._parseAction = function (value, sourceSpan) {\n            var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n            try {\n                var /** @type {?} */ ast = this._exprParser.parseAction(value, sourceInfo, this._interpolationConfig);\n                if (ast) {\n                    this._reportExpressionParserErrors(ast.errors, sourceSpan);\n                }\n                if (!ast || ast.ast instanceof EmptyExpr) {\n                    this._reportError(\"Empty expressions are not allowed\", sourceSpan);\n                    return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n                }\n                this._checkPipes(ast, sourceSpan);\n                return ast;\n            }\n            catch (e) {\n                this._reportError(\"\" + e, sourceSpan);\n                return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n            }\n        };\n        /**\n         * @param {?} message\n         * @param {?} sourceSpan\n         * @param {?=} level\n         * @return {?}\n         */\n        BindingParser.prototype._reportError = function (message, sourceSpan, level) {\n            if (level === void 0) { level = ParseErrorLevel.FATAL; }\n            this._targetErrors.push(new ParseError(sourceSpan, message, level));\n        };\n        /**\n         * @param {?} errors\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype._reportExpressionParserErrors = function (errors, sourceSpan) {\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                this._reportError(error.message, sourceSpan);\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        BindingParser.prototype._checkPipes = function (ast, sourceSpan) {\n            var _this = this;\n            if (ast) {\n                var /** @type {?} */ collector = new PipeCollector();\n                ast.visit(collector);\n                collector.pipes.forEach(function (ast, pipeName) {\n                    if (!_this.pipesByName.has(pipeName)) {\n                        _this._reportError(\"The pipe '\" + pipeName + \"' could not be found\", new ParseSourceSpan(sourceSpan.start.moveBy(ast.span.start), sourceSpan.start.moveBy(ast.span.end)));\n                    }\n                });\n            }\n        };\n        /**\n         * @param {?} propName the name of the property / attribute\n         * @param {?} sourceSpan\n         * @param {?} isAttr true when binding to an attribute\n         * @return {?}\n         */\n        BindingParser.prototype._validatePropertyOrAttributeName = function (propName, sourceSpan, isAttr) {\n            var /** @type {?} */ report = isAttr ? this._schemaRegistry.validateAttribute(propName) :\n                this._schemaRegistry.validateProperty(propName);\n            if (report.error) {\n                this._reportError(report.msg, sourceSpan, ParseErrorLevel.FATAL);\n            }\n        };\n        return BindingParser;\n    }());\n    var PipeCollector = (function (_super) {\n        __extends$17(PipeCollector, _super);\n        function PipeCollector() {\n            _super.apply(this, arguments);\n            this.pipes = new Map();\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        PipeCollector.prototype.visitPipe = function (ast, context) {\n            this.pipes.set(ast.name, ast);\n            ast.exp.visit(this);\n            this.visitAll(ast.args, context);\n            return null;\n        };\n        return PipeCollector;\n    }(RecursiveAstVisitor));\n    /**\n     * @param {?} name\n     * @return {?}\n     */\n    function _isAnimationLabel(name) {\n        return name[0] == '@';\n    }\n    /**\n     * @param {?} registry\n     * @param {?} selector\n     * @param {?} propName\n     * @param {?} isAttribute\n     * @return {?}\n     */\n    function calcPossibleSecurityContexts(registry, selector, propName, isAttribute) {\n        var /** @type {?} */ ctxs = [];\n        CssSelector.parse(selector).forEach(function (selector) {\n            var /** @type {?} */ elementNames = selector.element ? [selector.element] : registry.allKnownElementNames();\n            var /** @type {?} */ notElementNames = new Set(selector.notSelectors.filter(function (selector) { return selector.isElementSelector(); })\n                .map(function (selector) { return selector.element; }));\n            var /** @type {?} */ possibleElementNames = elementNames.filter(function (elementName) { return !notElementNames.has(elementName); });\n            ctxs.push.apply(ctxs, possibleElementNames.map(function (elementName) { return registry.securityContext(elementName, propName, isAttribute); }));\n        });\n        return ctxs.length === 0 ? [_angular_core.SecurityContext.NONE] : Array.from(new Set(ctxs)).sort();\n    }\n\n    var /** @type {?} */ NG_CONTENT_SELECT_ATTR = 'select';\n    var /** @type {?} */ NG_CONTENT_ELEMENT = 'ng-content';\n    var /** @type {?} */ LINK_ELEMENT = 'link';\n    var /** @type {?} */ LINK_STYLE_REL_ATTR = 'rel';\n    var /** @type {?} */ LINK_STYLE_HREF_ATTR = 'href';\n    var /** @type {?} */ LINK_STYLE_REL_VALUE = 'stylesheet';\n    var /** @type {?} */ STYLE_ELEMENT = 'style';\n    var /** @type {?} */ SCRIPT_ELEMENT = 'script';\n    var /** @type {?} */ NG_NON_BINDABLE_ATTR = 'ngNonBindable';\n    var /** @type {?} */ NG_PROJECT_AS = 'ngProjectAs';\n    /**\n     * @param {?} ast\n     * @return {?}\n     */\n    function preparseElement(ast) {\n        var /** @type {?} */ selectAttr = null;\n        var /** @type {?} */ hrefAttr = null;\n        var /** @type {?} */ relAttr = null;\n        var /** @type {?} */ nonBindable = false;\n        var /** @type {?} */ projectAs = null;\n        ast.attrs.forEach(function (attr) {\n            var /** @type {?} */ lcAttrName = attr.name.toLowerCase();\n            if (lcAttrName == NG_CONTENT_SELECT_ATTR) {\n                selectAttr = attr.value;\n            }\n            else if (lcAttrName == LINK_STYLE_HREF_ATTR) {\n                hrefAttr = attr.value;\n            }\n            else if (lcAttrName == LINK_STYLE_REL_ATTR) {\n                relAttr = attr.value;\n            }\n            else if (attr.name == NG_NON_BINDABLE_ATTR) {\n                nonBindable = true;\n            }\n            else if (attr.name == NG_PROJECT_AS) {\n                if (attr.value.length > 0) {\n                    projectAs = attr.value;\n                }\n            }\n        });\n        selectAttr = normalizeNgContentSelect(selectAttr);\n        var /** @type {?} */ nodeName = ast.name.toLowerCase();\n        var /** @type {?} */ type = PreparsedElementType.OTHER;\n        if (splitNsName(nodeName)[1] == NG_CONTENT_ELEMENT) {\n            type = PreparsedElementType.NG_CONTENT;\n        }\n        else if (nodeName == STYLE_ELEMENT) {\n            type = PreparsedElementType.STYLE;\n        }\n        else if (nodeName == SCRIPT_ELEMENT) {\n            type = PreparsedElementType.SCRIPT;\n        }\n        else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {\n            type = PreparsedElementType.STYLESHEET;\n        }\n        return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs);\n    }\n    var PreparsedElementType = {};\n    PreparsedElementType.NG_CONTENT = 0;\n    PreparsedElementType.STYLE = 1;\n    PreparsedElementType.STYLESHEET = 2;\n    PreparsedElementType.SCRIPT = 3;\n    PreparsedElementType.OTHER = 4;\n    PreparsedElementType[PreparsedElementType.NG_CONTENT] = \"NG_CONTENT\";\n    PreparsedElementType[PreparsedElementType.STYLE] = \"STYLE\";\n    PreparsedElementType[PreparsedElementType.STYLESHEET] = \"STYLESHEET\";\n    PreparsedElementType[PreparsedElementType.SCRIPT] = \"SCRIPT\";\n    PreparsedElementType[PreparsedElementType.OTHER] = \"OTHER\";\n    var PreparsedElement = (function () {\n        /**\n         * @param {?} type\n         * @param {?} selectAttr\n         * @param {?} hrefAttr\n         * @param {?} nonBindable\n         * @param {?} projectAs\n         */\n        function PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs) {\n            this.type = type;\n            this.selectAttr = selectAttr;\n            this.hrefAttr = hrefAttr;\n            this.nonBindable = nonBindable;\n            this.projectAs = projectAs;\n        }\n        return PreparsedElement;\n    }());\n    /**\n     * @param {?} selectAttr\n     * @return {?}\n     */\n    function normalizeNgContentSelect(selectAttr) {\n        if (selectAttr === null || selectAttr.length === 0) {\n            return '*';\n        }\n        return selectAttr;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    // Group 1 = \"bind-\"\n    // Group 2 = \"let-\"\n    // Group 3 = \"ref-/#\"\n    // Group 4 = \"on-\"\n    // Group 5 = \"bindon-\"\n    // Group 6 = \"@\"\n    // Group 7 = the identifier after \"bind-\", \"let-\", \"ref-/#\", \"on-\", \"bindon-\" or \"@\"\n    // Group 8 = identifier inside [()]\n    // Group 9 = identifier inside []\n    // Group 10 = identifier inside ()\n    var /** @type {?} */ BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\\[\\(([^\\)]+)\\)\\]|\\[([^\\]]+)\\]|\\(([^\\)]+)\\))$/;\n    var /** @type {?} */ KW_BIND_IDX = 1;\n    var /** @type {?} */ KW_LET_IDX = 2;\n    var /** @type {?} */ KW_REF_IDX = 3;\n    var /** @type {?} */ KW_ON_IDX = 4;\n    var /** @type {?} */ KW_BINDON_IDX = 5;\n    var /** @type {?} */ KW_AT_IDX = 6;\n    var /** @type {?} */ IDENT_KW_IDX = 7;\n    var /** @type {?} */ IDENT_BANANA_BOX_IDX = 8;\n    var /** @type {?} */ IDENT_PROPERTY_IDX = 9;\n    var /** @type {?} */ IDENT_EVENT_IDX = 10;\n    var /** @type {?} */ TEMPLATE_ELEMENT = 'template';\n    var /** @type {?} */ TEMPLATE_ATTR = 'template';\n    var /** @type {?} */ TEMPLATE_ATTR_PREFIX = '*';\n    var /** @type {?} */ CLASS_ATTR = 'class';\n    var /** @type {?} */ TEXT_CSS_SELECTOR = CssSelector.parse('*')[0];\n    /**\n     * Provides an array of {@link TemplateAstVisitor}s which will be used to transform\n     * parsed templates before compilation is invoked, allowing custom expression syntax\n     * and other advanced transformations.\n     *\n     * This is currently an internal-only feature and not meant for general use.\n     */\n    var /** @type {?} */ TEMPLATE_TRANSFORMS = new _angular_core.OpaqueToken('TemplateTransforms');\n    var TemplateParseError = (function (_super) {\n        __extends(TemplateParseError, _super);\n        /**\n         * @param {?} message\n         * @param {?} span\n         * @param {?} level\n         */\n        function TemplateParseError(message, span, level) {\n            _super.call(this, span, message, level);\n        }\n        return TemplateParseError;\n    }(ParseError));\n    var TemplateParseResult = (function () {\n        /**\n         * @param {?=} templateAst\n         * @param {?=} errors\n         */\n        function TemplateParseResult(templateAst, errors) {\n            this.templateAst = templateAst;\n            this.errors = errors;\n        }\n        return TemplateParseResult;\n    }());\n    var TemplateParser = (function () {\n        /**\n         * @param {?} _exprParser\n         * @param {?} _schemaRegistry\n         * @param {?} _htmlParser\n         * @param {?} _console\n         * @param {?} transforms\n         */\n        function TemplateParser(_exprParser, _schemaRegistry, _htmlParser, _console, transforms) {\n            this._exprParser = _exprParser;\n            this._schemaRegistry = _schemaRegistry;\n            this._htmlParser = _htmlParser;\n            this._console = _console;\n            this.transforms = transforms;\n        }\n        /**\n         * @param {?} component\n         * @param {?} template\n         * @param {?} directives\n         * @param {?} pipes\n         * @param {?} schemas\n         * @param {?} templateUrl\n         * @return {?}\n         */\n        TemplateParser.prototype.parse = function (component, template, directives, pipes, schemas, templateUrl) {\n            var /** @type {?} */ result = this.tryParse(component, template, directives, pipes, schemas, templateUrl);\n            var /** @type {?} */ warnings = result.errors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; });\n            var /** @type {?} */ errors = result.errors.filter(function (error) { return error.level === ParseErrorLevel.FATAL; });\n            if (warnings.length > 0) {\n                this._console.warn(\"Template parse warnings:\\n\" + warnings.join('\\n'));\n            }\n            if (errors.length > 0) {\n                var /** @type {?} */ errorString = errors.join('\\n');\n                throw new SyntaxError(\"Template parse errors:\\n\" + errorString);\n            }\n            return result.templateAst;\n        };\n        /**\n         * @param {?} component\n         * @param {?} template\n         * @param {?} directives\n         * @param {?} pipes\n         * @param {?} schemas\n         * @param {?} templateUrl\n         * @return {?}\n         */\n        TemplateParser.prototype.tryParse = function (component, template, directives, pipes, schemas, templateUrl) {\n            return this.tryParseHtml(this.expandHtml(this._htmlParser.parse(template, templateUrl, true, this.getInterpolationConfig(component))), component, template, directives, pipes, schemas, templateUrl);\n        };\n        /**\n         * @param {?} htmlAstWithErrors\n         * @param {?} component\n         * @param {?} template\n         * @param {?} directives\n         * @param {?} pipes\n         * @param {?} schemas\n         * @param {?} templateUrl\n         * @return {?}\n         */\n        TemplateParser.prototype.tryParseHtml = function (htmlAstWithErrors, component, template, directives, pipes, schemas, templateUrl) {\n            var /** @type {?} */ result;\n            var /** @type {?} */ errors = htmlAstWithErrors.errors;\n            if (htmlAstWithErrors.rootNodes.length > 0) {\n                var /** @type {?} */ uniqDirectives = removeSummaryDuplicates(directives);\n                var /** @type {?} */ uniqPipes = removeSummaryDuplicates(pipes);\n                var /** @type {?} */ providerViewContext = new ProviderViewContext(component, htmlAstWithErrors.rootNodes[0].sourceSpan);\n                var /** @type {?} */ interpolationConfig = void 0;\n                if (component.template && component.template.interpolation) {\n                    interpolationConfig = {\n                        start: component.template.interpolation[0],\n                        end: component.template.interpolation[1]\n                    };\n                }\n                var /** @type {?} */ bindingParser = new BindingParser(this._exprParser, interpolationConfig, this._schemaRegistry, uniqPipes, errors);\n                var /** @type {?} */ parseVisitor = new TemplateParseVisitor(providerViewContext, uniqDirectives, bindingParser, this._schemaRegistry, schemas, errors);\n                result = visitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_ELEMENT_CONTEXT);\n                errors.push.apply(errors, providerViewContext.errors);\n            }\n            else {\n                result = [];\n            }\n            this._assertNoReferenceDuplicationOnTemplate(result, errors);\n            if (errors.length > 0) {\n                return new TemplateParseResult(result, errors);\n            }\n            if (this.transforms) {\n                this.transforms.forEach(function (transform) { result = templateVisitAll(transform, result); });\n            }\n            return new TemplateParseResult(result, errors);\n        };\n        /**\n         * @param {?} htmlAstWithErrors\n         * @param {?=} forced\n         * @return {?}\n         */\n        TemplateParser.prototype.expandHtml = function (htmlAstWithErrors, forced) {\n            if (forced === void 0) { forced = false; }\n            var /** @type {?} */ errors = htmlAstWithErrors.errors;\n            if (errors.length == 0 || forced) {\n                // Transform ICU messages to angular directives\n                var /** @type {?} */ expandedHtmlAst = expandNodes(htmlAstWithErrors.rootNodes);\n                errors.push.apply(errors, expandedHtmlAst.errors);\n                htmlAstWithErrors = new ParseTreeResult(expandedHtmlAst.nodes, errors);\n            }\n            return htmlAstWithErrors;\n        };\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        TemplateParser.prototype.getInterpolationConfig = function (component) {\n            if (component.template) {\n                return InterpolationConfig.fromArray(component.template.interpolation);\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} result\n         * @param {?} errors\n         * @return {?}\n         */\n        TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate = function (result, errors) {\n            var /** @type {?} */ existingReferences = [];\n            result.filter(function (element) { return !!((element)).references; })\n                .forEach(function (element) { return ((element)).references.forEach(function (reference) {\n                var /** @type {?} */ name = reference.name;\n                if (existingReferences.indexOf(name) < 0) {\n                    existingReferences.push(name);\n                }\n                else {\n                    var /** @type {?} */ error = new TemplateParseError(\"Reference \\\"#\" + name + \"\\\" is defined several times\", reference.sourceSpan, ParseErrorLevel.FATAL);\n                    errors.push(error);\n                }\n            }); });\n        };\n        /** @nocollapse */\n        TemplateParser.ctorParameters = function () { return [\n            { type: Parser, },\n            { type: ElementSchemaRegistry, },\n            { type: I18NHtmlParser, },\n            { type: Console, },\n            { type: Array, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [TEMPLATE_TRANSFORMS,] },] },\n        ]; };\n        TemplateParser = __decorate([\n            CompilerInjectable(), \n            __metadata('design:paramtypes', [Parser, ElementSchemaRegistry, I18NHtmlParser, Console, Array])\n        ], TemplateParser);\n        return TemplateParser;\n    }());\n    var TemplateParseVisitor = (function () {\n        /**\n         * @param {?} providerViewContext\n         * @param {?} directives\n         * @param {?} _bindingParser\n         * @param {?} _schemaRegistry\n         * @param {?} _schemas\n         * @param {?} _targetErrors\n         */\n        function TemplateParseVisitor(providerViewContext, directives, _bindingParser, _schemaRegistry, _schemas, _targetErrors) {\n            var _this = this;\n            this.providerViewContext = providerViewContext;\n            this._bindingParser = _bindingParser;\n            this._schemaRegistry = _schemaRegistry;\n            this._schemas = _schemas;\n            this._targetErrors = _targetErrors;\n            this.selectorMatcher = new SelectorMatcher();\n            this.directivesIndex = new Map();\n            this.ngContentCount = 0;\n            directives.forEach(function (directive, index) {\n                var selector = CssSelector.parse(directive.selector);\n                _this.selectorMatcher.addSelectables(selector, directive);\n                _this.directivesIndex.set(directive, index);\n            });\n        }\n        /**\n         * @param {?} expansion\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitExpansion = function (expansion, context) { return null; };\n        /**\n         * @param {?} expansionCase\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return null; };\n        /**\n         * @param {?} text\n         * @param {?} parent\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitText = function (text, parent) {\n            var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR);\n            var /** @type {?} */ expr = this._bindingParser.parseInterpolation(text.value, text.sourceSpan);\n            if (expr) {\n                return new BoundTextAst(expr, ngContentIndex, text.sourceSpan);\n            }\n            else {\n                return new TextAst(text.value, ngContentIndex, text.sourceSpan);\n            }\n        };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitAttribute = function (attribute, context) {\n            return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);\n        };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitComment = function (comment, context) { return null; };\n        /**\n         * @param {?} element\n         * @param {?} parent\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype.visitElement = function (element, parent) {\n            var _this = this;\n            var /** @type {?} */ nodeName = element.name;\n            var /** @type {?} */ preparsedElement = preparseElement(element);\n            if (preparsedElement.type === PreparsedElementType.SCRIPT ||\n                preparsedElement.type === PreparsedElementType.STYLE) {\n                // Skipping <script> for security reasons\n                // Skipping <style> as we already processed them\n                // in the StyleCompiler\n                return null;\n            }\n            if (preparsedElement.type === PreparsedElementType.STYLESHEET &&\n                isStyleUrlResolvable(preparsedElement.hrefAttr)) {\n                // Skipping stylesheets with either relative urls or package scheme as we already processed\n                // them in the StyleCompiler\n                return null;\n            }\n            var /** @type {?} */ matchableAttrs = [];\n            var /** @type {?} */ elementOrDirectiveProps = [];\n            var /** @type {?} */ elementOrDirectiveRefs = [];\n            var /** @type {?} */ elementVars = [];\n            var /** @type {?} */ events = [];\n            var /** @type {?} */ templateElementOrDirectiveProps = [];\n            var /** @type {?} */ templateMatchableAttrs = [];\n            var /** @type {?} */ templateElementVars = [];\n            var /** @type {?} */ hasInlineTemplates = false;\n            var /** @type {?} */ attrs = [];\n            var /** @type {?} */ lcElName = splitNsName(nodeName.toLowerCase())[1];\n            var /** @type {?} */ isTemplateElement = lcElName == TEMPLATE_ELEMENT;\n            element.attrs.forEach(function (attr) {\n                var /** @type {?} */ hasBinding = _this._parseAttr(isTemplateElement, attr, matchableAttrs, elementOrDirectiveProps, events, elementOrDirectiveRefs, elementVars);\n                var /** @type {?} */ templateBindingsSource;\n                var /** @type {?} */ prefixToken;\n                var /** @type {?} */ normalizedName = _this._normalizeAttributeName(attr.name);\n                if (normalizedName == TEMPLATE_ATTR) {\n                    templateBindingsSource = attr.value;\n                }\n                else if (normalizedName.startsWith(TEMPLATE_ATTR_PREFIX)) {\n                    templateBindingsSource = attr.value;\n                    prefixToken = normalizedName.substring(TEMPLATE_ATTR_PREFIX.length) + ':';\n                }\n                var /** @type {?} */ hasTemplateBinding = isPresent(templateBindingsSource);\n                if (hasTemplateBinding) {\n                    if (hasInlineTemplates) {\n                        _this._reportError(\"Can't have multiple template bindings on one element. Use only one attribute named 'template' or prefixed with *\", attr.sourceSpan);\n                    }\n                    hasInlineTemplates = true;\n                    _this._bindingParser.parseInlineTemplateBinding(prefixToken, templateBindingsSource, attr.sourceSpan, templateMatchableAttrs, templateElementOrDirectiveProps, templateElementVars);\n                }\n                if (!hasBinding && !hasTemplateBinding) {\n                    // don't include the bindings as attributes as well in the AST\n                    attrs.push(_this.visitAttribute(attr, null));\n                    matchableAttrs.push([attr.name, attr.value]);\n                }\n            });\n            var /** @type {?} */ elementCssSelector = createElementCssSelector(nodeName, matchableAttrs);\n            var _a = this._parseDirectives(this.selectorMatcher, elementCssSelector), directiveMetas = _a.directives, matchElement = _a.matchElement;\n            var /** @type {?} */ references = [];\n            var /** @type {?} */ directiveAsts = this._createDirectiveAsts(isTemplateElement, element.name, directiveMetas, elementOrDirectiveProps, elementOrDirectiveRefs, element.sourceSpan, references);\n            var /** @type {?} */ elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, directiveAsts);\n            var /** @type {?} */ isViewRoot = parent.isTemplateElement || hasInlineTemplates;\n            var /** @type {?} */ providerContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, isViewRoot, directiveAsts, attrs, references, element.sourceSpan);\n            var /** @type {?} */ children = visitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, ElementContext.create(isTemplateElement, directiveAsts, isTemplateElement ? parent.providerContext : providerContext));\n            providerContext.afterElement();\n            // Override the actual selector when the `ngProjectAs` attribute is provided\n            var /** @type {?} */ projectionSelector = isPresent(preparsedElement.projectAs) ?\n                CssSelector.parse(preparsedElement.projectAs)[0] :\n                elementCssSelector;\n            var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(projectionSelector);\n            var /** @type {?} */ parsedElement;\n            if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {\n                if (element.children && !element.children.every(_isEmptyTextNode)) {\n                    this._reportError(\"<ng-content> element cannot have content.\", element.sourceSpan);\n                }\n                parsedElement = new NgContentAst(this.ngContentCount++, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);\n            }\n            else if (isTemplateElement) {\n                this._assertAllEventsPublishedByDirectives(directiveAsts, events);\n                this._assertNoComponentsNorElementBindingsOnTemplate(directiveAsts, elementProps, element.sourceSpan);\n                parsedElement = new EmbeddedTemplateAst(attrs, events, references, elementVars, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, children, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);\n            }\n            else {\n                this._assertElementExists(matchElement, element);\n                this._assertOnlyOneComponent(directiveAsts, element.sourceSpan);\n                var /** @type {?} */ ngContentIndex_1 = hasInlineTemplates ? null : parent.findNgContentIndex(projectionSelector);\n                parsedElement = new ElementAst(nodeName, attrs, elementProps, events, references, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, children, hasInlineTemplates ? null : ngContentIndex_1, element.sourceSpan, element.endSourceSpan);\n                this._findComponentDirectives(directiveAsts)\n                    .forEach(function (componentDirectiveAst) { return _this._validateElementAnimationInputOutputs(componentDirectiveAst.hostProperties, componentDirectiveAst.hostEvents, componentDirectiveAst.directive.template); });\n                var /** @type {?} */ componentTemplate = providerContext.viewContext.component.template;\n                this._validateElementAnimationInputOutputs(elementProps, events, componentTemplate.toSummary());\n            }\n            if (hasInlineTemplates) {\n                var /** @type {?} */ templateCssSelector = createElementCssSelector(TEMPLATE_ELEMENT, templateMatchableAttrs);\n                var templateDirectiveMetas = this._parseDirectives(this.selectorMatcher, templateCssSelector).directives;\n                var /** @type {?} */ templateDirectiveAsts = this._createDirectiveAsts(true, element.name, templateDirectiveMetas, templateElementOrDirectiveProps, [], element.sourceSpan, []);\n                var /** @type {?} */ templateElementProps = this._createElementPropertyAsts(element.name, templateElementOrDirectiveProps, templateDirectiveAsts);\n                this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectiveAsts, templateElementProps, element.sourceSpan);\n                var /** @type {?} */ templateProviderContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, parent.isTemplateElement, templateDirectiveAsts, [], [], element.sourceSpan);\n                templateProviderContext.afterElement();\n                parsedElement = new EmbeddedTemplateAst([], [], [], templateElementVars, templateProviderContext.transformedDirectiveAsts, templateProviderContext.transformProviders, templateProviderContext.transformedHasViewContainer, [parsedElement], ngContentIndex, element.sourceSpan);\n            }\n            return parsedElement;\n        };\n        /**\n         * @param {?} inputs\n         * @param {?} outputs\n         * @param {?} template\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._validateElementAnimationInputOutputs = function (inputs, outputs, template) {\n            var _this = this;\n            var /** @type {?} */ triggerLookup = new Set();\n            template.animations.forEach(function (entry) { triggerLookup.add(entry); });\n            var /** @type {?} */ animationInputs = inputs.filter(function (input) { return input.isAnimation; });\n            animationInputs.forEach(function (input) {\n                var /** @type {?} */ name = input.name;\n                if (!triggerLookup.has(name)) {\n                    _this._reportError(\"Couldn't find an animation entry for \\\"\" + name + \"\\\"\", input.sourceSpan);\n                }\n            });\n            outputs.forEach(function (output) {\n                if (output.isAnimation) {\n                    var /** @type {?} */ found = animationInputs.find(function (input) { return input.name == output.name; });\n                    if (!found) {\n                        _this._reportError(\"Unable to listen on (@\" + output.name + \".\" + output.phase + \") because the animation trigger [@\" + output.name + \"] isn't being used on the same element\", output.sourceSpan);\n                    }\n                }\n            });\n        };\n        /**\n         * @param {?} isTemplateElement\n         * @param {?} attr\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetProps\n         * @param {?} targetEvents\n         * @param {?} targetRefs\n         * @param {?} targetVars\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._parseAttr = function (isTemplateElement, attr, targetMatchableAttrs, targetProps, targetEvents, targetRefs, targetVars) {\n            var /** @type {?} */ name = this._normalizeAttributeName(attr.name);\n            var /** @type {?} */ value = attr.value;\n            var /** @type {?} */ srcSpan = attr.sourceSpan;\n            var /** @type {?} */ bindParts = name.match(BIND_NAME_REGEXP);\n            var /** @type {?} */ hasBinding = false;\n            if (bindParts !== null) {\n                hasBinding = true;\n                if (isPresent(bindParts[KW_BIND_IDX])) {\n                    this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n                }\n                else if (bindParts[KW_LET_IDX]) {\n                    if (isTemplateElement) {\n                        var /** @type {?} */ identifier = bindParts[IDENT_KW_IDX];\n                        this._parseVariable(identifier, value, srcSpan, targetVars);\n                    }\n                    else {\n                        this._reportError(\"\\\"let-\\\" is only supported on template elements.\", srcSpan);\n                    }\n                }\n                else if (bindParts[KW_REF_IDX]) {\n                    var /** @type {?} */ identifier = bindParts[IDENT_KW_IDX];\n                    this._parseReference(identifier, value, srcSpan, targetRefs);\n                }\n                else if (bindParts[KW_ON_IDX]) {\n                    this._bindingParser.parseEvent(bindParts[IDENT_KW_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n                }\n                else if (bindParts[KW_BINDON_IDX]) {\n                    this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n                    this._parseAssignmentEvent(bindParts[IDENT_KW_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n                }\n                else if (bindParts[KW_AT_IDX]) {\n                    this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);\n                }\n                else if (bindParts[IDENT_BANANA_BOX_IDX]) {\n                    this._bindingParser.parsePropertyBinding(bindParts[IDENT_BANANA_BOX_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n                    this._parseAssignmentEvent(bindParts[IDENT_BANANA_BOX_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n                }\n                else if (bindParts[IDENT_PROPERTY_IDX]) {\n                    this._bindingParser.parsePropertyBinding(bindParts[IDENT_PROPERTY_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n                }\n                else if (bindParts[IDENT_EVENT_IDX]) {\n                    this._bindingParser.parseEvent(bindParts[IDENT_EVENT_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n                }\n            }\n            else {\n                hasBinding = this._bindingParser.parsePropertyInterpolation(name, value, srcSpan, targetMatchableAttrs, targetProps);\n            }\n            if (!hasBinding) {\n                this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);\n            }\n            return hasBinding;\n        };\n        /**\n         * @param {?} attrName\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {\n            return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;\n        };\n        /**\n         * @param {?} identifier\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?} targetVars\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {\n            if (identifier.indexOf('-') > -1) {\n                this._reportError(\"\\\"-\\\" is not allowed in variable names\", sourceSpan);\n            }\n            targetVars.push(new VariableAst(identifier, value, sourceSpan));\n        };\n        /**\n         * @param {?} identifier\n         * @param {?} value\n         * @param {?} sourceSpan\n         * @param {?} targetRefs\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._parseReference = function (identifier, value, sourceSpan, targetRefs) {\n            if (identifier.indexOf('-') > -1) {\n                this._reportError(\"\\\"-\\\" is not allowed in reference names\", sourceSpan);\n            }\n            targetRefs.push(new ElementOrDirectiveRef(identifier, value, sourceSpan));\n        };\n        /**\n         * @param {?} name\n         * @param {?} expression\n         * @param {?} sourceSpan\n         * @param {?} targetMatchableAttrs\n         * @param {?} targetEvents\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n            this._bindingParser.parseEvent(name + \"Change\", expression + \"=$event\", sourceSpan, targetMatchableAttrs, targetEvents);\n        };\n        /**\n         * @param {?} selectorMatcher\n         * @param {?} elementCssSelector\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {\n            var _this = this;\n            // Need to sort the directives so that we get consistent results throughout,\n            // as selectorMatcher uses Maps inside.\n            // Also deduplicate directives as they might match more than one time!\n            var /** @type {?} */ directives = new Array(this.directivesIndex.size);\n            // Whether any directive selector matches on the element name\n            var /** @type {?} */ matchElement = false;\n            selectorMatcher.match(elementCssSelector, function (selector, directive) {\n                directives[_this.directivesIndex.get(directive)] = directive;\n                matchElement = matchElement || selector.hasElementSelector();\n            });\n            return {\n                directives: directives.filter(function (dir) { return !!dir; }),\n                matchElement: matchElement,\n            };\n        };\n        /**\n         * @param {?} isTemplateElement\n         * @param {?} elementName\n         * @param {?} directives\n         * @param {?} props\n         * @param {?} elementOrDirectiveRefs\n         * @param {?} elementSourceSpan\n         * @param {?} targetReferences\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._createDirectiveAsts = function (isTemplateElement, elementName, directives, props, elementOrDirectiveRefs, elementSourceSpan, targetReferences) {\n            var _this = this;\n            var /** @type {?} */ matchedReferences = new Set();\n            var /** @type {?} */ component = null;\n            var /** @type {?} */ directiveAsts = directives.map(function (directive) {\n                var /** @type {?} */ sourceSpan = new ParseSourceSpan(elementSourceSpan.start, elementSourceSpan.end, \"Directive \" + identifierName(directive.type));\n                if (directive.isComponent) {\n                    component = directive;\n                }\n                var /** @type {?} */ directiveProperties = [];\n                var /** @type {?} */ hostProperties = _this._bindingParser.createDirectiveHostPropertyAsts(directive, sourceSpan);\n                // Note: We need to check the host properties here as well,\n                // as we don't know the element name in the DirectiveWrapperCompiler yet.\n                _this._checkPropertiesInSchema(elementName, hostProperties);\n                var /** @type {?} */ hostEvents = _this._bindingParser.createDirectiveHostEventAsts(directive, sourceSpan);\n                _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties);\n                elementOrDirectiveRefs.forEach(function (elOrDirRef) {\n                    if ((elOrDirRef.value.length === 0 && directive.isComponent) ||\n                        (directive.exportAs == elOrDirRef.value)) {\n                        targetReferences.push(new ReferenceAst(elOrDirRef.name, identifierToken(directive.type), elOrDirRef.sourceSpan));\n                        matchedReferences.add(elOrDirRef.name);\n                    }\n                });\n                return new DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, sourceSpan);\n            });\n            elementOrDirectiveRefs.forEach(function (elOrDirRef) {\n                if (elOrDirRef.value.length > 0) {\n                    if (!matchedReferences.has(elOrDirRef.name)) {\n                        _this._reportError(\"There is no directive with \\\"exportAs\\\" set to \\\"\" + elOrDirRef.value + \"\\\"\", elOrDirRef.sourceSpan);\n                    }\n                }\n                else if (!component) {\n                    var /** @type {?} */ refToken = null;\n                    if (isTemplateElement) {\n                        refToken = createIdentifierToken(Identifiers.TemplateRef);\n                    }\n                    targetReferences.push(new ReferenceAst(elOrDirRef.name, refToken, elOrDirRef.sourceSpan));\n                }\n            });\n            return directiveAsts;\n        };\n        /**\n         * @param {?} directiveProperties\n         * @param {?} boundProps\n         * @param {?} targetBoundDirectiveProps\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps) {\n            if (directiveProperties) {\n                var /** @type {?} */ boundPropsByName_1 = new Map();\n                boundProps.forEach(function (boundProp) {\n                    var /** @type {?} */ prevValue = boundPropsByName_1.get(boundProp.name);\n                    if (!prevValue || prevValue.isLiteral) {\n                        // give [a]=\"b\" a higher precedence than a=\"b\" on the same element\n                        boundPropsByName_1.set(boundProp.name, boundProp);\n                    }\n                });\n                Object.keys(directiveProperties).forEach(function (dirProp) {\n                    var /** @type {?} */ elProp = directiveProperties[dirProp];\n                    var /** @type {?} */ boundProp = boundPropsByName_1.get(elProp);\n                    // Bindings are optional, so this binding only needs to be set up if an expression is given.\n                    if (boundProp) {\n                        targetBoundDirectiveProps.push(new BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));\n                    }\n                });\n            }\n        };\n        /**\n         * @param {?} elementName\n         * @param {?} props\n         * @param {?} directives\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, directives) {\n            var _this = this;\n            var /** @type {?} */ boundElementProps = [];\n            var /** @type {?} */ boundDirectivePropsIndex = new Map();\n            directives.forEach(function (directive) {\n                directive.inputs.forEach(function (prop) {\n                    boundDirectivePropsIndex.set(prop.templateName, prop);\n                });\n            });\n            props.forEach(function (prop) {\n                if (!prop.isLiteral && !boundDirectivePropsIndex.get(prop.name)) {\n                    boundElementProps.push(_this._bindingParser.createElementPropertyAst(elementName, prop));\n                }\n            });\n            this._checkPropertiesInSchema(elementName, boundElementProps);\n            return boundElementProps;\n        };\n        /**\n         * @param {?} directives\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._findComponentDirectives = function (directives) {\n            return directives.filter(function (directive) { return directive.directive.isComponent; });\n        };\n        /**\n         * @param {?} directives\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {\n            return this._findComponentDirectives(directives)\n                .map(function (directive) { return identifierName(directive.directive.type); });\n        };\n        /**\n         * @param {?} directives\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {\n            var /** @type {?} */ componentTypeNames = this._findComponentDirectiveNames(directives);\n            if (componentTypeNames.length > 1) {\n                this._reportError(\"More than one component matched on this element.\\n\" +\n                    \"Make sure that only one component's selector can match a given element.\\n\" +\n                    (\"Conflicting components: \" + componentTypeNames.join(',')), sourceSpan);\n            }\n        };\n        /**\n         * Make sure that non-angular tags conform to the schemas.\n         *\n         * Note: An element is considered an angular tag when at least one directive selector matches the\n         * tag name.\n         *\n         * @param {?} matchElement Whether any directive has matched on the tag name\n         * @param {?} element the html element\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._assertElementExists = function (matchElement, element) {\n            var /** @type {?} */ elName = element.name.replace(/^:xhtml:/, '');\n            if (!matchElement && !this._schemaRegistry.hasElement(elName, this._schemas)) {\n                var /** @type {?} */ errorMsg = (\"'\" + elName + \"' is not a known element:\\n\") +\n                    (\"1. If '\" + elName + \"' is an Angular component, then verify that it is part of this module.\\n\") +\n                    (\"2. If '\" + elName + \"' is a Web Component then add \\\"CUSTOM_ELEMENTS_SCHEMA\\\" to the '@NgModule.schemas' of this component to suppress this message.\");\n                this._reportError(errorMsg, element.sourceSpan);\n            }\n        };\n        /**\n         * @param {?} directives\n         * @param {?} elementProps\n         * @param {?} sourceSpan\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {\n            var _this = this;\n            var /** @type {?} */ componentTypeNames = this._findComponentDirectiveNames(directives);\n            if (componentTypeNames.length > 0) {\n                this._reportError(\"Components on an embedded template: \" + componentTypeNames.join(','), sourceSpan);\n            }\n            elementProps.forEach(function (prop) {\n                _this._reportError(\"Property binding \" + prop.name + \" not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the \\\"@NgModule.declarations\\\".\", sourceSpan);\n            });\n        };\n        /**\n         * @param {?} directives\n         * @param {?} events\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {\n            var _this = this;\n            var /** @type {?} */ allDirectiveEvents = new Set();\n            directives.forEach(function (directive) {\n                Object.keys(directive.directive.outputs).forEach(function (k) {\n                    var /** @type {?} */ eventName = directive.directive.outputs[k];\n                    allDirectiveEvents.add(eventName);\n                });\n            });\n            events.forEach(function (event) {\n                if (isPresent(event.target) || !allDirectiveEvents.has(event.name)) {\n                    _this._reportError(\"Event binding \" + event.fullName + \" not emitted by any directive on an embedded template. Make sure that the event name is spelled correctly and all directives are listed in the \\\"@NgModule.declarations\\\".\", event.sourceSpan);\n                }\n            });\n        };\n        /**\n         * @param {?} elementName\n         * @param {?} boundProps\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._checkPropertiesInSchema = function (elementName, boundProps) {\n            var _this = this;\n            boundProps.forEach(function (boundProp) {\n                if (boundProp.type === PropertyBindingType.Property &&\n                    !_this._schemaRegistry.hasProperty(elementName, boundProp.name, _this._schemas)) {\n                    var /** @type {?} */ errorMsg = \"Can't bind to '\" + boundProp.name + \"' since it isn't a known property of '\" + elementName + \"'.\";\n                    if (elementName.indexOf('-') > -1) {\n                        errorMsg +=\n                            (\"\\n1. If '\" + elementName + \"' is an Angular component and it has '\" + boundProp.name + \"' input, then verify that it is part of this module.\") +\n                                (\"\\n2. If '\" + elementName + \"' is a Web Component then add \\\"CUSTOM_ELEMENTS_SCHEMA\\\" to the '@NgModule.schemas' of this component to suppress this message.\\n\");\n                    }\n                    _this._reportError(errorMsg, boundProp.sourceSpan);\n                }\n            });\n        };\n        /**\n         * @param {?} message\n         * @param {?} sourceSpan\n         * @param {?=} level\n         * @return {?}\n         */\n        TemplateParseVisitor.prototype._reportError = function (message, sourceSpan, level) {\n            if (level === void 0) { level = ParseErrorLevel.FATAL; }\n            this._targetErrors.push(new ParseError(sourceSpan, message, level));\n        };\n        return TemplateParseVisitor;\n    }());\n    var NonBindableVisitor = (function () {\n        function NonBindableVisitor() {\n        }\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitElement = function (ast, parent) {\n            var /** @type {?} */ preparsedElement = preparseElement(ast);\n            if (preparsedElement.type === PreparsedElementType.SCRIPT ||\n                preparsedElement.type === PreparsedElementType.STYLE ||\n                preparsedElement.type === PreparsedElementType.STYLESHEET) {\n                // Skipping <script> for security reasons\n                // Skipping <style> and stylesheets as we already processed them\n                // in the StyleCompiler\n                return null;\n            }\n            var /** @type {?} */ attrNameAndValues = ast.attrs.map(function (attr) { return [attr.name, attr.value]; });\n            var /** @type {?} */ selector = createElementCssSelector(ast.name, attrNameAndValues);\n            var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(selector);\n            var /** @type {?} */ children = visitAll(this, ast.children, EMPTY_ELEMENT_CONTEXT);\n            return new ElementAst(ast.name, visitAll(this, ast.attrs), [], [], [], [], [], false, children, ngContentIndex, ast.sourceSpan, ast.endSourceSpan);\n        };\n        /**\n         * @param {?} comment\n         * @param {?} context\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitComment = function (comment, context) { return null; };\n        /**\n         * @param {?} attribute\n         * @param {?} context\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitAttribute = function (attribute, context) {\n            return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);\n        };\n        /**\n         * @param {?} text\n         * @param {?} parent\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitText = function (text, parent) {\n            var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR);\n            return new TextAst(text.value, ngContentIndex, text.sourceSpan);\n        };\n        /**\n         * @param {?} expansion\n         * @param {?} context\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitExpansion = function (expansion, context) { return expansion; };\n        /**\n         * @param {?} expansionCase\n         * @param {?} context\n         * @return {?}\n         */\n        NonBindableVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; };\n        return NonBindableVisitor;\n    }());\n    var ElementOrDirectiveRef = (function () {\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?} sourceSpan\n         */\n        function ElementOrDirectiveRef(name, value, sourceSpan) {\n            this.name = name;\n            this.value = value;\n            this.sourceSpan = sourceSpan;\n        }\n        return ElementOrDirectiveRef;\n    }());\n    /**\n     * @param {?} classAttrValue\n     * @return {?}\n     */\n    function splitClasses(classAttrValue) {\n        return classAttrValue.trim().split(/\\s+/g);\n    }\n    var ElementContext = (function () {\n        /**\n         * @param {?} isTemplateElement\n         * @param {?} _ngContentIndexMatcher\n         * @param {?} _wildcardNgContentIndex\n         * @param {?} providerContext\n         */\n        function ElementContext(isTemplateElement, _ngContentIndexMatcher, _wildcardNgContentIndex, providerContext) {\n            this.isTemplateElement = isTemplateElement;\n            this._ngContentIndexMatcher = _ngContentIndexMatcher;\n            this._wildcardNgContentIndex = _wildcardNgContentIndex;\n            this.providerContext = providerContext;\n        }\n        /**\n         * @param {?} isTemplateElement\n         * @param {?} directives\n         * @param {?} providerContext\n         * @return {?}\n         */\n        ElementContext.create = function (isTemplateElement, directives, providerContext) {\n            var /** @type {?} */ matcher = new SelectorMatcher();\n            var /** @type {?} */ wildcardNgContentIndex = null;\n            var /** @type {?} */ component = directives.find(function (directive) { return directive.directive.isComponent; });\n            if (component) {\n                var /** @type {?} */ ngContentSelectors = component.directive.template.ngContentSelectors;\n                for (var /** @type {?} */ i = 0; i < ngContentSelectors.length; i++) {\n                    var /** @type {?} */ selector = ngContentSelectors[i];\n                    if (selector === '*') {\n                        wildcardNgContentIndex = i;\n                    }\n                    else {\n                        matcher.addSelectables(CssSelector.parse(ngContentSelectors[i]), i);\n                    }\n                }\n            }\n            return new ElementContext(isTemplateElement, matcher, wildcardNgContentIndex, providerContext);\n        };\n        /**\n         * @param {?} selector\n         * @return {?}\n         */\n        ElementContext.prototype.findNgContentIndex = function (selector) {\n            var /** @type {?} */ ngContentIndices = [];\n            this._ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });\n            ngContentIndices.sort();\n            if (isPresent(this._wildcardNgContentIndex)) {\n                ngContentIndices.push(this._wildcardNgContentIndex);\n            }\n            return ngContentIndices.length > 0 ? ngContentIndices[0] : null;\n        };\n        return ElementContext;\n    }());\n    /**\n     * @param {?} elementName\n     * @param {?} attributes\n     * @return {?}\n     */\n    function createElementCssSelector(elementName, attributes) {\n        var /** @type {?} */ cssSelector = new CssSelector();\n        var /** @type {?} */ elNameNoNs = splitNsName(elementName)[1];\n        cssSelector.setElement(elNameNoNs);\n        for (var /** @type {?} */ i = 0; i < attributes.length; i++) {\n            var /** @type {?} */ attrName = attributes[i][0];\n            var /** @type {?} */ attrNameNoNs = splitNsName(attrName)[1];\n            var /** @type {?} */ attrValue = attributes[i][1];\n            cssSelector.addAttribute(attrNameNoNs, attrValue);\n            if (attrName.toLowerCase() == CLASS_ATTR) {\n                var /** @type {?} */ classes = splitClasses(attrValue);\n                classes.forEach(function (className) { return cssSelector.addClassName(className); });\n            }\n        }\n        return cssSelector;\n    }\n    var /** @type {?} */ EMPTY_ELEMENT_CONTEXT = new ElementContext(true, new SelectorMatcher(), null, null);\n    var /** @type {?} */ NON_BINDABLE_VISITOR = new NonBindableVisitor();\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function _isEmptyTextNode(node) {\n        return node instanceof Text && node.value.trim().length == 0;\n    }\n    /**\n     * @param {?} items\n     * @return {?}\n     */\n    function removeSummaryDuplicates(items) {\n        var /** @type {?} */ map = new Map();\n        items.forEach(function (item) {\n            if (!map.get(item.type.reference)) {\n                map.set(item.type.reference, item);\n            }\n        });\n        return Array.from(map.values());\n    }\n\n    var CompilerConfig = (function () {\n        /**\n         * @param {?=} __0\n         */\n        function CompilerConfig(_a) {\n            var _b = _a === void 0 ? {} : _a, _c = _b.renderTypes, renderTypes = _c === void 0 ? new DefaultRenderTypes() : _c, _d = _b.defaultEncapsulation, defaultEncapsulation = _d === void 0 ? _angular_core.ViewEncapsulation.Emulated : _d, genDebugInfo = _b.genDebugInfo, logBindingUpdate = _b.logBindingUpdate, _e = _b.useJit, useJit = _e === void 0 ? true : _e;\n            this.renderTypes = renderTypes;\n            this.defaultEncapsulation = defaultEncapsulation;\n            this._genDebugInfo = genDebugInfo;\n            this._logBindingUpdate = logBindingUpdate;\n            this.useJit = useJit;\n        }\n        Object.defineProperty(CompilerConfig.prototype, \"genDebugInfo\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._genDebugInfo === void 0 ? _angular_core.isDevMode() : this._genDebugInfo;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(CompilerConfig.prototype, \"logBindingUpdate\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._logBindingUpdate === void 0 ? _angular_core.isDevMode() : this._logBindingUpdate;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return CompilerConfig;\n    }());\n    /**\n     * Types used for the renderer.\n     * Can be replaced to specialize the generated output to a specific renderer\n     * to help tree shaking.\n     * @abstract\n     */\n    var RenderTypes = (function () {\n        function RenderTypes() {\n        }\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderer = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderText = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderElement = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderComment = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderNode = function () { };\n        /**\n         * @abstract\n         * @return {?}\n         */\n        RenderTypes.prototype.renderEvent = function () { };\n        return RenderTypes;\n    }());\n    var DefaultRenderTypes = (function () {\n        function DefaultRenderTypes() {\n            this.renderText = null;\n            this.renderElement = null;\n            this.renderComment = null;\n            this.renderNode = null;\n            this.renderEvent = null;\n        }\n        Object.defineProperty(DefaultRenderTypes.prototype, \"renderer\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return createIdentifier(Identifiers.Renderer); },\n            enumerable: true,\n            configurable: true\n        });\n        ;\n        return DefaultRenderTypes;\n    }());\n\n    var __extends$19 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     * @abstract\n     */\n    var AnimationAst = (function () {\n        function AnimationAst() {\n            this.startTime = 0;\n            this.playTime = 0;\n        }\n        /**\n         * @abstract\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationAst.prototype.visit = function (visitor, context) { };\n        return AnimationAst;\n    }());\n    /**\n     * @abstract\n     */\n    var AnimationStateAst = (function (_super) {\n        __extends$19(AnimationStateAst, _super);\n        function AnimationStateAst() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @abstract\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationStateAst.prototype.visit = function (visitor, context) { };\n        return AnimationStateAst;\n    }(AnimationAst));\n    var AnimationEntryAst = (function (_super) {\n        __extends$19(AnimationEntryAst, _super);\n        /**\n         * @param {?} name\n         * @param {?} stateDeclarations\n         * @param {?} stateTransitions\n         */\n        function AnimationEntryAst(name, stateDeclarations, stateTransitions) {\n            _super.call(this);\n            this.name = name;\n            this.stateDeclarations = stateDeclarations;\n            this.stateTransitions = stateTransitions;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationEntryAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationEntry(this, context);\n        };\n        return AnimationEntryAst;\n    }(AnimationAst));\n    var AnimationStateDeclarationAst = (function (_super) {\n        __extends$19(AnimationStateDeclarationAst, _super);\n        /**\n         * @param {?} stateName\n         * @param {?} styles\n         */\n        function AnimationStateDeclarationAst(stateName, styles) {\n            _super.call(this);\n            this.stateName = stateName;\n            this.styles = styles;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationStateDeclarationAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationStateDeclaration(this, context);\n        };\n        return AnimationStateDeclarationAst;\n    }(AnimationStateAst));\n    var AnimationStateTransitionExpression = (function () {\n        /**\n         * @param {?} fromState\n         * @param {?} toState\n         */\n        function AnimationStateTransitionExpression(fromState, toState) {\n            this.fromState = fromState;\n            this.toState = toState;\n        }\n        return AnimationStateTransitionExpression;\n    }());\n    var AnimationStateTransitionAst = (function (_super) {\n        __extends$19(AnimationStateTransitionAst, _super);\n        /**\n         * @param {?} stateChanges\n         * @param {?} animation\n         */\n        function AnimationStateTransitionAst(stateChanges, animation) {\n            _super.call(this);\n            this.stateChanges = stateChanges;\n            this.animation = animation;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationStateTransitionAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationStateTransition(this, context);\n        };\n        return AnimationStateTransitionAst;\n    }(AnimationStateAst));\n    var AnimationStepAst = (function (_super) {\n        __extends$19(AnimationStepAst, _super);\n        /**\n         * @param {?} startingStyles\n         * @param {?} keyframes\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         */\n        function AnimationStepAst(startingStyles, keyframes, duration, delay, easing) {\n            _super.call(this);\n            this.startingStyles = startingStyles;\n            this.keyframes = keyframes;\n            this.duration = duration;\n            this.delay = delay;\n            this.easing = easing;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationStepAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationStep(this, context);\n        };\n        return AnimationStepAst;\n    }(AnimationAst));\n    var AnimationStylesAst = (function (_super) {\n        __extends$19(AnimationStylesAst, _super);\n        /**\n         * @param {?} styles\n         */\n        function AnimationStylesAst(styles) {\n            _super.call(this);\n            this.styles = styles;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationStylesAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationStyles(this, context);\n        };\n        return AnimationStylesAst;\n    }(AnimationAst));\n    var AnimationKeyframeAst = (function (_super) {\n        __extends$19(AnimationKeyframeAst, _super);\n        /**\n         * @param {?} offset\n         * @param {?} styles\n         */\n        function AnimationKeyframeAst(offset, styles) {\n            _super.call(this);\n            this.offset = offset;\n            this.styles = styles;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationKeyframeAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationKeyframe(this, context);\n        };\n        return AnimationKeyframeAst;\n    }(AnimationAst));\n    /**\n     * @abstract\n     */\n    var AnimationWithStepsAst = (function (_super) {\n        __extends$19(AnimationWithStepsAst, _super);\n        /**\n         * @param {?} steps\n         */\n        function AnimationWithStepsAst(steps) {\n            _super.call(this);\n            this.steps = steps;\n        }\n        return AnimationWithStepsAst;\n    }(AnimationAst));\n    var AnimationGroupAst = (function (_super) {\n        __extends$19(AnimationGroupAst, _super);\n        /**\n         * @param {?} steps\n         */\n        function AnimationGroupAst(steps) {\n            _super.call(this, steps);\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationGroupAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationGroup(this, context);\n        };\n        return AnimationGroupAst;\n    }(AnimationWithStepsAst));\n    var AnimationSequenceAst = (function (_super) {\n        __extends$19(AnimationSequenceAst, _super);\n        /**\n         * @param {?} steps\n         */\n        function AnimationSequenceAst(steps) {\n            _super.call(this, steps);\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        AnimationSequenceAst.prototype.visit = function (visitor, context) {\n            return visitor.visitAnimationSequence(this, context);\n        };\n        return AnimationSequenceAst;\n    }(AnimationWithStepsAst));\n\n    var StylesCollectionEntry = (function () {\n        /**\n         * @param {?} time\n         * @param {?} value\n         */\n        function StylesCollectionEntry(time, value) {\n            this.time = time;\n            this.value = value;\n        }\n        /**\n         * @param {?} time\n         * @param {?} value\n         * @return {?}\n         */\n        StylesCollectionEntry.prototype.matches = function (time, value) {\n            return time == this.time && value == this.value;\n        };\n        return StylesCollectionEntry;\n    }());\n    var StylesCollection = (function () {\n        function StylesCollection() {\n            this.styles = {};\n        }\n        /**\n         * @param {?} property\n         * @param {?} time\n         * @param {?} value\n         * @return {?}\n         */\n        StylesCollection.prototype.insertAtTime = function (property, time, value) {\n            var /** @type {?} */ tuple = new StylesCollectionEntry(time, value);\n            var /** @type {?} */ entries = this.styles[property];\n            if (!isPresent(entries)) {\n                entries = this.styles[property] = [];\n            }\n            // insert this at the right stop in the array\n            // this way we can keep it sorted\n            var /** @type {?} */ insertionIndex = 0;\n            for (var /** @type {?} */ i = entries.length - 1; i >= 0; i--) {\n                if (entries[i].time <= time) {\n                    insertionIndex = i + 1;\n                    break;\n                }\n            }\n            entries.splice(insertionIndex, 0, tuple);\n        };\n        /**\n         * @param {?} property\n         * @param {?} index\n         * @return {?}\n         */\n        StylesCollection.prototype.getByIndex = function (property, index) {\n            var /** @type {?} */ items = this.styles[property];\n            if (isPresent(items)) {\n                return index >= items.length ? null : items[index];\n            }\n            return null;\n        };\n        /**\n         * @param {?} property\n         * @param {?} time\n         * @return {?}\n         */\n        StylesCollection.prototype.indexOfAtOrBeforeTime = function (property, time) {\n            var /** @type {?} */ entries = this.styles[property];\n            if (isPresent(entries)) {\n                for (var /** @type {?} */ i = entries.length - 1; i >= 0; i--) {\n                    if (entries[i].time <= time)\n                        return i;\n                }\n            }\n            return null;\n        };\n        return StylesCollection;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$18 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var __decorate$4 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$4 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var /** @type {?} */ _INITIAL_KEYFRAME = 0;\n    var /** @type {?} */ _TERMINAL_KEYFRAME = 1;\n    var /** @type {?} */ _ONE_SECOND = 1000;\n    var AnimationParseError = (function (_super) {\n        __extends$18(AnimationParseError, _super);\n        /**\n         * @param {?} message\n         */\n        function AnimationParseError(message) {\n            _super.call(this, null, message);\n        }\n        /**\n         * @return {?}\n         */\n        AnimationParseError.prototype.toString = function () { return \"\" + this.msg; };\n        return AnimationParseError;\n    }(ParseError));\n    var AnimationEntryParseResult = (function () {\n        /**\n         * @param {?} ast\n         * @param {?} errors\n         */\n        function AnimationEntryParseResult(ast, errors) {\n            this.ast = ast;\n            this.errors = errors;\n        }\n        return AnimationEntryParseResult;\n    }());\n    var AnimationParser = (function () {\n        /**\n         * @param {?} _schema\n         */\n        function AnimationParser(_schema) {\n            this._schema = _schema;\n        }\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        AnimationParser.prototype.parseComponent = function (component) {\n            var _this = this;\n            var /** @type {?} */ errors = [];\n            var /** @type {?} */ componentName = identifierName(component.type);\n            var /** @type {?} */ animationTriggerNames = new Set();\n            var /** @type {?} */ asts = component.template.animations.map(function (entry) {\n                var /** @type {?} */ result = _this.parseEntry(entry);\n                var /** @type {?} */ ast = result.ast;\n                var /** @type {?} */ triggerName = ast.name;\n                if (animationTriggerNames.has(triggerName)) {\n                    result.errors.push(new AnimationParseError(\"The animation trigger \\\"\" + triggerName + \"\\\" has already been registered for the \" + componentName + \" component\"));\n                }\n                else {\n                    animationTriggerNames.add(triggerName);\n                }\n                if (result.errors.length > 0) {\n                    var /** @type {?} */ errorMessage_1 = \"- Unable to parse the animation sequence for \\\"\" + triggerName + \"\\\" on the \" + componentName + \" component due to the following errors:\";\n                    result.errors.forEach(function (error) { errorMessage_1 += '\\n-- ' + error.msg; });\n                    errors.push(errorMessage_1);\n                }\n                return ast;\n            });\n            if (errors.length > 0) {\n                var /** @type {?} */ errorString = errors.join('\\n');\n                throw new Error(\"Animation parse errors:\\n\" + errorString);\n            }\n            return asts;\n        };\n        /**\n         * @param {?} entry\n         * @return {?}\n         */\n        AnimationParser.prototype.parseEntry = function (entry) {\n            var _this = this;\n            var /** @type {?} */ errors = [];\n            var /** @type {?} */ stateStyles = {};\n            var /** @type {?} */ transitions = [];\n            var /** @type {?} */ stateDeclarationAsts = [];\n            entry.definitions.forEach(function (def) {\n                if (def instanceof CompileAnimationStateDeclarationMetadata) {\n                    _parseAnimationDeclarationStates(def, _this._schema, errors).forEach(function (ast) {\n                        stateDeclarationAsts.push(ast);\n                        stateStyles[ast.stateName] = ast.styles;\n                    });\n                }\n                else {\n                    transitions.push(/** @type {?} */ (def));\n                }\n            });\n            var /** @type {?} */ stateTransitionAsts = transitions.map(function (transDef) { return _parseAnimationStateTransition(transDef, stateStyles, _this._schema, errors); });\n            var /** @type {?} */ ast = new AnimationEntryAst(entry.name, stateDeclarationAsts, stateTransitionAsts);\n            return new AnimationEntryParseResult(ast, errors);\n        };\n        AnimationParser = __decorate$4([\n            CompilerInjectable(), \n            __metadata$4('design:paramtypes', [ElementSchemaRegistry])\n        ], AnimationParser);\n        return AnimationParser;\n    }());\n    /**\n     * @param {?} stateMetadata\n     * @param {?} schema\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseAnimationDeclarationStates(stateMetadata, schema, errors) {\n        var /** @type {?} */ normalizedStyles = _normalizeStyleMetadata(stateMetadata.styles, {}, schema, errors, false);\n        var /** @type {?} */ defStyles = new AnimationStylesAst(normalizedStyles);\n        var /** @type {?} */ states = stateMetadata.stateNameExpr.split(/\\s*,\\s*/);\n        return states.map(function (state) { return new AnimationStateDeclarationAst(state, defStyles); });\n    }\n    /**\n     * @param {?} transitionStateMetadata\n     * @param {?} stateStyles\n     * @param {?} schema\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseAnimationStateTransition(transitionStateMetadata, stateStyles, schema, errors) {\n        var /** @type {?} */ styles = new StylesCollection();\n        var /** @type {?} */ transitionExprs = [];\n        var /** @type {?} */ transitionStates = transitionStateMetadata.stateChangeExpr.split(/\\s*,\\s*/);\n        transitionStates.forEach(function (expr) { transitionExprs.push.apply(transitionExprs, _parseAnimationTransitionExpr(expr, errors)); });\n        var /** @type {?} */ entry = _normalizeAnimationEntry(transitionStateMetadata.steps);\n        var /** @type {?} */ animation = _normalizeStyleSteps(entry, stateStyles, schema, errors);\n        var /** @type {?} */ animationAst = _parseTransitionAnimation(animation, 0, styles, stateStyles, errors);\n        if (errors.length == 0) {\n            _fillAnimationAstStartingKeyframes(animationAst, styles, errors);\n        }\n        var /** @type {?} */ stepsAst = (animationAst instanceof AnimationWithStepsAst) ?\n            animationAst :\n            new AnimationSequenceAst([animationAst]);\n        return new AnimationStateTransitionAst(transitionExprs, stepsAst);\n    }\n    /**\n     * @param {?} alias\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseAnimationAlias(alias, errors) {\n        switch (alias) {\n            case ':enter':\n                return 'void => *';\n            case ':leave':\n                return '* => void';\n            default:\n                errors.push(new AnimationParseError(\"the transition alias value \\\"\" + alias + \"\\\" is not supported\"));\n                return '* => *';\n        }\n    }\n    /**\n     * @param {?} eventStr\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseAnimationTransitionExpr(eventStr, errors) {\n        var /** @type {?} */ expressions = [];\n        if (eventStr[0] == ':') {\n            eventStr = _parseAnimationAlias(eventStr, errors);\n        }\n        var /** @type {?} */ match = eventStr.match(/^(\\*|[-\\w]+)\\s*(<?[=-]>)\\s*(\\*|[-\\w]+)$/);\n        if (!isPresent(match) || match.length < 4) {\n            errors.push(new AnimationParseError(\"the provided \" + eventStr + \" is not of a supported format\"));\n            return expressions;\n        }\n        var /** @type {?} */ fromState = match[1];\n        var /** @type {?} */ separator = match[2];\n        var /** @type {?} */ toState = match[3];\n        expressions.push(new AnimationStateTransitionExpression(fromState, toState));\n        var /** @type {?} */ isFullAnyStateExpr = fromState == ANY_STATE && toState == ANY_STATE;\n        if (separator[0] == '<' && !isFullAnyStateExpr) {\n            expressions.push(new AnimationStateTransitionExpression(toState, fromState));\n        }\n        return expressions;\n    }\n    /**\n     * @param {?} entry\n     * @return {?}\n     */\n    function _normalizeAnimationEntry(entry) {\n        return Array.isArray(entry) ? new CompileAnimationSequenceMetadata(entry) : entry;\n    }\n    /**\n     * @param {?} entry\n     * @param {?} stateStyles\n     * @param {?} schema\n     * @param {?} errors\n     * @param {?} permitStateReferences\n     * @return {?}\n     */\n    function _normalizeStyleMetadata(entry, stateStyles, schema, errors, permitStateReferences) {\n        var /** @type {?} */ offset = entry.offset;\n        if (offset > 1 || offset < 0) {\n            errors.push(new AnimationParseError(\"Offset values for animations must be between 0 and 1\"));\n        }\n        var /** @type {?} */ normalizedStyles = [];\n        entry.styles.forEach(function (styleEntry) {\n            if (typeof styleEntry === 'string') {\n                if (permitStateReferences) {\n                    normalizedStyles.push.apply(normalizedStyles, _resolveStylesFromState(/** @type {?} */ (styleEntry), stateStyles, errors));\n                }\n                else {\n                    errors.push(new AnimationParseError(\"State based animations cannot contain references to other states\"));\n                }\n            }\n            else {\n                var /** @type {?} */ stylesObj_1 = (styleEntry);\n                var /** @type {?} */ normalizedStylesObj_1 = {};\n                Object.keys(stylesObj_1).forEach(function (propName) {\n                    var /** @type {?} */ normalizedProp = schema.normalizeAnimationStyleProperty(propName);\n                    var /** @type {?} */ normalizedOutput = schema.normalizeAnimationStyleValue(normalizedProp, propName, stylesObj_1[propName]);\n                    var /** @type {?} */ normalizationError = normalizedOutput['error'];\n                    if (normalizationError) {\n                        errors.push(new AnimationParseError(normalizationError));\n                    }\n                    normalizedStylesObj_1[normalizedProp] = normalizedOutput['value'];\n                });\n                normalizedStyles.push(normalizedStylesObj_1);\n            }\n        });\n        return normalizedStyles;\n    }\n    /**\n     * @param {?} entry\n     * @param {?} stateStyles\n     * @param {?} schema\n     * @param {?} errors\n     * @return {?}\n     */\n    function _normalizeStyleSteps(entry, stateStyles, schema, errors) {\n        var /** @type {?} */ steps = _normalizeStyleStepEntry(entry, stateStyles, schema, errors);\n        return (entry instanceof CompileAnimationGroupMetadata) ?\n            new CompileAnimationGroupMetadata(steps) :\n            new CompileAnimationSequenceMetadata(steps);\n    }\n    /**\n     * @param {?} stylesList\n     * @param {?} newItem\n     * @return {?}\n     */\n    function _mergeAnimationStyles(stylesList, newItem) {\n        if (typeof newItem === 'object' && newItem !== null && stylesList.length > 0) {\n            var /** @type {?} */ lastIndex = stylesList.length - 1;\n            var /** @type {?} */ lastItem = stylesList[lastIndex];\n            if (typeof lastItem === 'object' && lastItem !== null) {\n                stylesList[lastIndex] = StringMapWrapper.merge(/** @type {?} */ (lastItem), /** @type {?} */ (newItem));\n                return;\n            }\n        }\n        stylesList.push(newItem);\n    }\n    /**\n     * @param {?} entry\n     * @param {?} stateStyles\n     * @param {?} schema\n     * @param {?} errors\n     * @return {?}\n     */\n    function _normalizeStyleStepEntry(entry, stateStyles, schema, errors) {\n        var /** @type {?} */ steps;\n        if (entry instanceof CompileAnimationWithStepsMetadata) {\n            steps = entry.steps;\n        }\n        else {\n            return [entry];\n        }\n        var /** @type {?} */ newSteps = [];\n        var /** @type {?} */ combinedStyles;\n        steps.forEach(function (step) {\n            if (step instanceof CompileAnimationStyleMetadata) {\n                // this occurs when a style step is followed by a previous style step\n                // or when the first style step is run. We want to concatenate all subsequent\n                // style steps together into a single style step such that we have the correct\n                // starting keyframe data to pass into the animation player.\n                if (!isPresent(combinedStyles)) {\n                    combinedStyles = [];\n                }\n                _normalizeStyleMetadata(/** @type {?} */ (step), stateStyles, schema, errors, true)\n                    .forEach(function (entry) { _mergeAnimationStyles(combinedStyles, entry); });\n            }\n            else {\n                // it is important that we create a metadata entry of the combined styles\n                // before we go on an process the animate, sequence or group metadata steps.\n                // This will ensure that the AST will have the previous styles painted on\n                // screen before any further animations that use the styles take place.\n                if (isPresent(combinedStyles)) {\n                    newSteps.push(new CompileAnimationStyleMetadata(0, combinedStyles));\n                    combinedStyles = null;\n                }\n                if (step instanceof CompileAnimationAnimateMetadata) {\n                    // we do not recurse into CompileAnimationAnimateMetadata since\n                    // those style steps are not going to be squashed\n                    var /** @type {?} */ animateStyleValue = ((step)).styles;\n                    if (animateStyleValue instanceof CompileAnimationStyleMetadata) {\n                        animateStyleValue.styles =\n                            _normalizeStyleMetadata(animateStyleValue, stateStyles, schema, errors, true);\n                    }\n                    else if (animateStyleValue instanceof CompileAnimationKeyframesSequenceMetadata) {\n                        animateStyleValue.steps.forEach(function (step) {\n                            step.styles = _normalizeStyleMetadata(step, stateStyles, schema, errors, true);\n                        });\n                    }\n                }\n                else if (step instanceof CompileAnimationWithStepsMetadata) {\n                    var /** @type {?} */ innerSteps = _normalizeStyleStepEntry(step, stateStyles, schema, errors);\n                    step = step instanceof CompileAnimationGroupMetadata ?\n                        new CompileAnimationGroupMetadata(innerSteps) :\n                        new CompileAnimationSequenceMetadata(innerSteps);\n                }\n                newSteps.push(step);\n            }\n        });\n        // this happens when only styles were animated within the sequence\n        if (isPresent(combinedStyles)) {\n            newSteps.push(new CompileAnimationStyleMetadata(0, combinedStyles));\n        }\n        return newSteps;\n    }\n    /**\n     * @param {?} stateName\n     * @param {?} stateStyles\n     * @param {?} errors\n     * @return {?}\n     */\n    function _resolveStylesFromState(stateName, stateStyles, errors) {\n        var /** @type {?} */ styles = [];\n        if (stateName[0] != ':') {\n            errors.push(new AnimationParseError(\"Animation states via styles must be prefixed with a \\\":\\\"\"));\n        }\n        else {\n            var /** @type {?} */ normalizedStateName = stateName.substring(1);\n            var /** @type {?} */ value = stateStyles[normalizedStateName];\n            if (!isPresent(value)) {\n                errors.push(new AnimationParseError(\"Unable to apply styles due to missing a state: \\\"\" + normalizedStateName + \"\\\"\"));\n            }\n            else {\n                value.styles.forEach(function (stylesEntry) {\n                    if (typeof stylesEntry === 'object' && stylesEntry !== null) {\n                        styles.push(/** @type {?} */ (stylesEntry));\n                    }\n                });\n            }\n        }\n        return styles;\n    }\n    var _AnimationTimings = (function () {\n        /**\n         * @param {?} duration\n         * @param {?} delay\n         * @param {?} easing\n         */\n        function _AnimationTimings(duration, delay, easing) {\n            this.duration = duration;\n            this.delay = delay;\n            this.easing = easing;\n        }\n        return _AnimationTimings;\n    }());\n    /**\n     * @param {?} keyframeSequence\n     * @param {?} currentTime\n     * @param {?} collectedStyles\n     * @param {?} stateStyles\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseAnimationKeyframes(keyframeSequence, currentTime, collectedStyles, stateStyles, errors) {\n        var /** @type {?} */ totalEntries = keyframeSequence.steps.length;\n        var /** @type {?} */ totalOffsets = 0;\n        keyframeSequence.steps.forEach(function (step) { return totalOffsets += (isPresent(step.offset) ? 1 : 0); });\n        if (totalOffsets > 0 && totalOffsets < totalEntries) {\n            errors.push(new AnimationParseError(\"Not all style() entries contain an offset for the provided keyframe()\"));\n            totalOffsets = totalEntries;\n        }\n        var /** @type {?} */ limit = totalEntries - 1;\n        var /** @type {?} */ margin = totalOffsets == 0 ? (1 / limit) : 0;\n        var /** @type {?} */ rawKeyframes = [];\n        var /** @type {?} */ index = 0;\n        var /** @type {?} */ doSortKeyframes = false;\n        var /** @type {?} */ lastOffset = 0;\n        keyframeSequence.steps.forEach(function (styleMetadata) {\n            var /** @type {?} */ offset = styleMetadata.offset;\n            var /** @type {?} */ keyframeStyles = {};\n            styleMetadata.styles.forEach(function (entry) {\n                Object.keys(entry).forEach(function (prop) {\n                    if (prop != 'offset') {\n                        keyframeStyles[prop] = ((entry))[prop];\n                    }\n                });\n            });\n            if (isPresent(offset)) {\n                doSortKeyframes = doSortKeyframes || (offset < lastOffset);\n            }\n            else {\n                offset = index == limit ? _TERMINAL_KEYFRAME : (margin * index);\n            }\n            rawKeyframes.push([offset, keyframeStyles]);\n            lastOffset = offset;\n            index++;\n        });\n        if (doSortKeyframes) {\n            rawKeyframes.sort(function (a, b) { return a[0] <= b[0] ? -1 : 1; });\n        }\n        var /** @type {?} */ firstKeyframe = rawKeyframes[0];\n        if (firstKeyframe[0] != _INITIAL_KEYFRAME) {\n            rawKeyframes.splice(0, 0, firstKeyframe = [_INITIAL_KEYFRAME, {}]);\n        }\n        var /** @type {?} */ firstKeyframeStyles = firstKeyframe[1];\n        limit = rawKeyframes.length - 1;\n        var /** @type {?} */ lastKeyframe = rawKeyframes[limit];\n        if (lastKeyframe[0] != _TERMINAL_KEYFRAME) {\n            rawKeyframes.push(lastKeyframe = [_TERMINAL_KEYFRAME, {}]);\n            limit++;\n        }\n        var /** @type {?} */ lastKeyframeStyles = lastKeyframe[1];\n        for (var /** @type {?} */ i = 1; i <= limit; i++) {\n            var /** @type {?} */ entry = rawKeyframes[i];\n            var /** @type {?} */ styles = entry[1];\n            Object.keys(styles).forEach(function (prop) {\n                if (!isPresent(firstKeyframeStyles[prop])) {\n                    firstKeyframeStyles[prop] = FILL_STYLE_FLAG;\n                }\n            });\n        }\n        var _loop_1 = function(i) {\n            var /** @type {?} */ entry = rawKeyframes[i];\n            var /** @type {?} */ styles = entry[1];\n            Object.keys(styles).forEach(function (prop) {\n                if (!isPresent(lastKeyframeStyles[prop])) {\n                    lastKeyframeStyles[prop] = styles[prop];\n                }\n            });\n        };\n        for (var /** @type {?} */ i = limit - 1; i >= 0; i--) {\n            _loop_1(i);\n        }\n        return rawKeyframes.map(function (entry) { return new AnimationKeyframeAst(entry[0], new AnimationStylesAst([entry[1]])); });\n    }\n    /**\n     * @param {?} entry\n     * @param {?} currentTime\n     * @param {?} collectedStyles\n     * @param {?} stateStyles\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseTransitionAnimation(entry, currentTime, collectedStyles, stateStyles, errors) {\n        var /** @type {?} */ ast;\n        var /** @type {?} */ playTime = 0;\n        var /** @type {?} */ startingTime = currentTime;\n        if (entry instanceof CompileAnimationWithStepsMetadata) {\n            var /** @type {?} */ maxDuration_1 = 0;\n            var /** @type {?} */ steps_1 = [];\n            var /** @type {?} */ isGroup_1 = entry instanceof CompileAnimationGroupMetadata;\n            var /** @type {?} */ previousStyles_1;\n            entry.steps.forEach(function (entry) {\n                // these will get picked up by the next step...\n                var /** @type {?} */ time = isGroup_1 ? startingTime : currentTime;\n                if (entry instanceof CompileAnimationStyleMetadata) {\n                    entry.styles.forEach(function (stylesEntry) {\n                        // by this point we know that we only have stringmap values\n                        var /** @type {?} */ map = (stylesEntry);\n                        Object.keys(map).forEach(function (prop) { collectedStyles.insertAtTime(prop, time, map[prop]); });\n                    });\n                    previousStyles_1 = entry.styles;\n                    return;\n                }\n                var /** @type {?} */ innerAst = _parseTransitionAnimation(entry, time, collectedStyles, stateStyles, errors);\n                if (isPresent(previousStyles_1)) {\n                    if (entry instanceof CompileAnimationWithStepsMetadata) {\n                        var /** @type {?} */ startingStyles = new AnimationStylesAst(previousStyles_1);\n                        steps_1.push(new AnimationStepAst(startingStyles, [], 0, 0, ''));\n                    }\n                    else {\n                        var /** @type {?} */ innerStep = (innerAst);\n                        (_a = innerStep.startingStyles.styles).push.apply(_a, previousStyles_1);\n                    }\n                    previousStyles_1 = null;\n                }\n                var /** @type {?} */ astDuration = innerAst.playTime;\n                currentTime += astDuration;\n                playTime += astDuration;\n                maxDuration_1 = Math.max(astDuration, maxDuration_1);\n                steps_1.push(innerAst);\n                var _a;\n            });\n            if (isPresent(previousStyles_1)) {\n                var /** @type {?} */ startingStyles = new AnimationStylesAst(previousStyles_1);\n                steps_1.push(new AnimationStepAst(startingStyles, [], 0, 0, ''));\n            }\n            if (isGroup_1) {\n                ast = new AnimationGroupAst(steps_1);\n                playTime = maxDuration_1;\n                currentTime = startingTime + playTime;\n            }\n            else {\n                ast = new AnimationSequenceAst(steps_1);\n            }\n        }\n        else if (entry instanceof CompileAnimationAnimateMetadata) {\n            var /** @type {?} */ timings = _parseTimeExpression(entry.timings, errors);\n            var /** @type {?} */ styles = entry.styles;\n            var /** @type {?} */ keyframes = void 0;\n            if (styles instanceof CompileAnimationKeyframesSequenceMetadata) {\n                keyframes =\n                    _parseAnimationKeyframes(styles, currentTime, collectedStyles, stateStyles, errors);\n            }\n            else {\n                var /** @type {?} */ styleData = (styles);\n                var /** @type {?} */ offset = _TERMINAL_KEYFRAME;\n                var /** @type {?} */ styleAst = new AnimationStylesAst(/** @type {?} */ (styleData.styles));\n                var /** @type {?} */ keyframe = new AnimationKeyframeAst(offset, styleAst);\n                keyframes = [keyframe];\n            }\n            ast = new AnimationStepAst(new AnimationStylesAst([]), keyframes, timings.duration, timings.delay, timings.easing);\n            playTime = timings.duration + timings.delay;\n            currentTime += playTime;\n            keyframes.forEach(function (keyframe /** TODO #9100 */) { return keyframe.styles.styles.forEach(function (entry /** TODO #9100 */) { return Object.keys(entry).forEach(function (prop) { collectedStyles.insertAtTime(prop, currentTime, entry[prop]); }); }); });\n        }\n        else {\n            // if the code reaches this stage then an error\n            // has already been populated within the _normalizeStyleSteps()\n            // operation...\n            ast = new AnimationStepAst(null, [], 0, 0, '');\n        }\n        ast.playTime = playTime;\n        ast.startTime = startingTime;\n        return ast;\n    }\n    /**\n     * @param {?} ast\n     * @param {?} collectedStyles\n     * @param {?} errors\n     * @return {?}\n     */\n    function _fillAnimationAstStartingKeyframes(ast, collectedStyles, errors) {\n        // steps that only contain style will not be filled\n        if ((ast instanceof AnimationStepAst) && ast.keyframes.length > 0) {\n            var /** @type {?} */ keyframes = ast.keyframes;\n            if (keyframes.length == 1) {\n                var /** @type {?} */ endKeyframe = keyframes[0];\n                var /** @type {?} */ startKeyframe = _createStartKeyframeFromEndKeyframe(endKeyframe, ast.startTime, ast.playTime, collectedStyles, errors);\n                ast.keyframes = [startKeyframe, endKeyframe];\n            }\n        }\n        else if (ast instanceof AnimationWithStepsAst) {\n            ast.steps.forEach(function (entry) { return _fillAnimationAstStartingKeyframes(entry, collectedStyles, errors); });\n        }\n    }\n    /**\n     * @param {?} exp\n     * @param {?} errors\n     * @return {?}\n     */\n    function _parseTimeExpression(exp, errors) {\n        var /** @type {?} */ regex = /^([\\.\\d]+)(m?s)(?:\\s+([\\.\\d]+)(m?s))?(?:\\s+([-a-z]+(?:\\(.+?\\))?))?/i;\n        var /** @type {?} */ duration;\n        var /** @type {?} */ delay = 0;\n        var /** @type {?} */ easing = null;\n        if (typeof exp === 'string') {\n            var /** @type {?} */ matches = exp.match(regex);\n            if (matches === null) {\n                errors.push(new AnimationParseError(\"The provided timing value \\\"\" + exp + \"\\\" is invalid.\"));\n                return new _AnimationTimings(0, 0, null);\n            }\n            var /** @type {?} */ durationMatch = parseFloat(matches[1]);\n            var /** @type {?} */ durationUnit = matches[2];\n            if (durationUnit == 's') {\n                durationMatch *= _ONE_SECOND;\n            }\n            duration = Math.floor(durationMatch);\n            var /** @type {?} */ delayMatch = matches[3];\n            var /** @type {?} */ delayUnit = matches[4];\n            if (isPresent(delayMatch)) {\n                var /** @type {?} */ delayVal = parseFloat(delayMatch);\n                if (isPresent(delayUnit) && delayUnit == 's') {\n                    delayVal *= _ONE_SECOND;\n                }\n                delay = Math.floor(delayVal);\n            }\n            var /** @type {?} */ easingVal = matches[5];\n            if (!isBlank(easingVal)) {\n                easing = easingVal;\n            }\n        }\n        else {\n            duration = (exp);\n        }\n        return new _AnimationTimings(duration, delay, easing);\n    }\n    /**\n     * @param {?} endKeyframe\n     * @param {?} startTime\n     * @param {?} duration\n     * @param {?} collectedStyles\n     * @param {?} errors\n     * @return {?}\n     */\n    function _createStartKeyframeFromEndKeyframe(endKeyframe, startTime, duration, collectedStyles, errors) {\n        var /** @type {?} */ values = {};\n        var /** @type {?} */ endTime = startTime + duration;\n        endKeyframe.styles.styles.forEach(function (styleData) {\n            Object.keys(styleData).forEach(function (prop) {\n                var /** @type {?} */ val = styleData[prop];\n                if (prop == 'offset')\n                    return;\n                var /** @type {?} */ resultIndex = collectedStyles.indexOfAtOrBeforeTime(prop, startTime);\n                var /** @type {?} */ resultEntry /** TODO #9100 */, /** @type {?} */ nextEntry /** TODO #9100 */, /** @type {?} */ value;\n                if (isPresent(resultIndex)) {\n                    resultEntry = collectedStyles.getByIndex(prop, resultIndex);\n                    value = resultEntry.value;\n                    nextEntry = collectedStyles.getByIndex(prop, resultIndex + 1);\n                }\n                else {\n                    // this is a flag that the runtime code uses to pass\n                    // in a value either from the state declaration styles\n                    // or using the AUTO_STYLE value (e.g. getComputedStyle)\n                    value = FILL_STYLE_FLAG;\n                }\n                if (isPresent(nextEntry) && !nextEntry.matches(endTime, val)) {\n                    errors.push(new AnimationParseError(\"The animated CSS property \\\"\" + prop + \"\\\" unexpectedly changes between steps \\\"\" + resultEntry.time + \"ms\\\" and \\\"\" + endTime + \"ms\\\" at \\\"\" + nextEntry.time + \"ms\\\"\"));\n                }\n                values[prop] = value;\n            });\n        });\n        return new AnimationKeyframeAst(_INITIAL_KEYFRAME, new AnimationStylesAst([values]));\n    }\n\n    /**\n     * An interface for retrieving documents by URL that the compiler uses\n     * to load templates.\n     */\n    var ResourceLoader = (function () {\n        function ResourceLoader() {\n        }\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        ResourceLoader.prototype.get = function (url) { return null; };\n        return ResourceLoader;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$6 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$6 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    /**\n     * Create a {\\@link UrlResolver} with no package prefix.\n     * @return {?}\n     */\n    function createUrlResolverWithoutPackagePrefix() {\n        return new UrlResolver();\n    }\n    /**\n     * @return {?}\n     */\n    function createOfflineCompileUrlResolver() {\n        return new UrlResolver('.');\n    }\n    /**\n     * A default provider for {@link PACKAGE_ROOT_URL} that maps to '/'.\n     */\n    var /** @type {?} */ DEFAULT_PACKAGE_URL_PROVIDER = {\n        provide: _angular_core.PACKAGE_ROOT_URL,\n        useValue: '/'\n    };\n    /**\n     * Used by the {\\@link Compiler} when resolving HTML and CSS template URLs.\n     *\n     * This class can be overridden by the application developer to create custom behavior.\n     *\n     * See {\\@link Compiler}\n     *\n     * ## Example\n     *\n     * {\\@example compiler/ts/url_resolver/url_resolver.ts region='url_resolver'}\n     *\n     * \\@security When compiling templates at runtime, you must\n     * ensure that the entire template comes from a trusted source.\n     * Attacker-controlled data introduced by a template could expose your\n     * application to XSS risks. For more detail, see the [Security Guide](http://g.co/ng/security).\n     */\n    var UrlResolver = (function () {\n        /**\n         * @param {?=} _packagePrefix\n         */\n        function UrlResolver(_packagePrefix) {\n            if (_packagePrefix === void 0) { _packagePrefix = null; }\n            this._packagePrefix = _packagePrefix;\n        }\n        /**\n         * Resolves the `url` given the `baseUrl`:\n         * - when the `url` is null, the `baseUrl` is returned,\n         * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of\n         * `baseUrl` and `url`,\n         * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is\n         * returned as is (ignoring the `baseUrl`)\n         * @param {?} baseUrl\n         * @param {?} url\n         * @return {?}\n         */\n        UrlResolver.prototype.resolve = function (baseUrl, url) {\n            var /** @type {?} */ resolvedUrl = url;\n            if (isPresent(baseUrl) && baseUrl.length > 0) {\n                resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);\n            }\n            var /** @type {?} */ resolvedParts = _split(resolvedUrl);\n            var /** @type {?} */ prefix = this._packagePrefix;\n            if (isPresent(prefix) && isPresent(resolvedParts) &&\n                resolvedParts[_ComponentIndex.Scheme] == 'package') {\n                var /** @type {?} */ path = resolvedParts[_ComponentIndex.Path];\n                prefix = prefix.replace(/\\/+$/, '');\n                path = path.replace(/^\\/+/, '');\n                return prefix + \"/\" + path;\n            }\n            return resolvedUrl;\n        };\n        /** @nocollapse */\n        UrlResolver.ctorParameters = function () { return [\n            { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.PACKAGE_ROOT_URL,] },] },\n        ]; };\n        UrlResolver = __decorate$6([\n            CompilerInjectable(), \n            __metadata$6('design:paramtypes', [String])\n        ], UrlResolver);\n        return UrlResolver;\n    }());\n    /**\n     * Extract the scheme of a URL.\n     * @param {?} url\n     * @return {?}\n     */\n    function getUrlScheme(url) {\n        var /** @type {?} */ match = _split(url);\n        return (match && match[_ComponentIndex.Scheme]) || '';\n    }\n    /**\n     * Builds a URI string from already-encoded parts.\n     *\n     * No encoding is performed.  Any component may be omitted as either null or\n     * undefined.\n     *\n     * @param {?=} opt_scheme The scheme such as 'http'.\n     * @param {?=} opt_userInfo The user name before the '\\@'.\n     * @param {?=} opt_domain The domain such as 'www.google.com', already\n     *     URI-encoded.\n     * @param {?=} opt_port The port number.\n     * @param {?=} opt_path The path, already URI-encoded.  If it is not\n     *     empty, it must begin with a slash.\n     * @param {?=} opt_queryData The URI-encoded query data.\n     * @param {?=} opt_fragment The URI-encoded fragment identifier.\n     * @return {?} The fully combined URI.\n     */\n    function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {\n        var /** @type {?} */ out = [];\n        if (isPresent(opt_scheme)) {\n            out.push(opt_scheme + ':');\n        }\n        if (isPresent(opt_domain)) {\n            out.push('//');\n            if (isPresent(opt_userInfo)) {\n                out.push(opt_userInfo + '@');\n            }\n            out.push(opt_domain);\n            if (isPresent(opt_port)) {\n                out.push(':' + opt_port);\n            }\n        }\n        if (isPresent(opt_path)) {\n            out.push(opt_path);\n        }\n        if (isPresent(opt_queryData)) {\n            out.push('?' + opt_queryData);\n        }\n        if (isPresent(opt_fragment)) {\n            out.push('#' + opt_fragment);\n        }\n        return out.join('');\n    }\n    /**\n     * A regular expression for breaking a URI into its component parts.\n     *\n     * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says\n     * As the \"first-match-wins\" algorithm is identical to the \"greedy\"\n     * disambiguation method used by POSIX regular expressions, it is natural and\n     * commonplace to use a regular expression for parsing the potential five\n     * components of a URI reference.\n     *\n     * The following line is the regular expression for breaking-down a\n     * well-formed URI reference into its components.\n     *\n     * <pre>\n     * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n     *  12            3  4          5       6  7        8 9\n     * </pre>\n     *\n     * The numbers in the second line above are only to assist readability; they\n     * indicate the reference points for each subexpression (i.e., each paired\n     * parenthesis). We refer to the value matched for subexpression <n> as $<n>.\n     * For example, matching the above expression to\n     * <pre>\n     *     http://www.ics.uci.edu/pub/ietf/uri/#Related\n     * </pre>\n     * results in the following subexpression matches:\n     * <pre>\n     *    $1 = http:\n     *    $2 = http\n     *    $3 = //www.ics.uci.edu\n     *    $4 = www.ics.uci.edu\n     *    $5 = /pub/ietf/uri/\n     *    $6 = <undefined>\n     *    $7 = <undefined>\n     *    $8 = #Related\n     *    $9 = Related\n     * </pre>\n     * where <undefined> indicates that the component is not present, as is the\n     * case for the query component in the above example. Therefore, we can\n     * determine the value of the five components as\n     * <pre>\n     *    scheme    = $2\n     *    authority = $4\n     *    path      = $5\n     *    query     = $7\n     *    fragment  = $9\n     * </pre>\n     *\n     * The regular expression has been modified slightly to expose the\n     * userInfo, domain, and port separately from the authority.\n     * The modified version yields\n     * <pre>\n     *    $1 = http              scheme\n     *    $2 = <undefined>       userInfo -\\\n     *    $3 = www.ics.uci.edu   domain     | authority\n     *    $4 = <undefined>       port     -/\n     *    $5 = /pub/ietf/uri/    path\n     *    $6 = <undefined>       query without ?\n     *    $7 = Related           fragment without #\n     * </pre>\n     * @type {!RegExp}\n     * @internal\n     */\n    var /** @type {?} */ _splitRe = new RegExp('^' +\n        '(?:' +\n        '([^:/?#.]+)' +\n        // used by other URL parts such as :,\n        // ?, /, #, and .\n        ':)?' +\n        '(?://' +\n        '(?:([^/?#]*)@)?' +\n        '([\\\\w\\\\d\\\\-\\\\u0100-\\\\uffff.%]*)' +\n        // digits, dashes, dots, percent\n        // escapes, and unicode characters.\n        '(?::([0-9]+))?' +\n        ')?' +\n        '([^?#]+)?' +\n        '(?:\\\\?([^#]*))?' +\n        '(?:#(.*))?' +\n        '$');\n    var _ComponentIndex = {};\n    _ComponentIndex.Scheme = 1;\n    _ComponentIndex.UserInfo = 2;\n    _ComponentIndex.Domain = 3;\n    _ComponentIndex.Port = 4;\n    _ComponentIndex.Path = 5;\n    _ComponentIndex.QueryData = 6;\n    _ComponentIndex.Fragment = 7;\n    _ComponentIndex[_ComponentIndex.Scheme] = \"Scheme\";\n    _ComponentIndex[_ComponentIndex.UserInfo] = \"UserInfo\";\n    _ComponentIndex[_ComponentIndex.Domain] = \"Domain\";\n    _ComponentIndex[_ComponentIndex.Port] = \"Port\";\n    _ComponentIndex[_ComponentIndex.Path] = \"Path\";\n    _ComponentIndex[_ComponentIndex.QueryData] = \"QueryData\";\n    _ComponentIndex[_ComponentIndex.Fragment] = \"Fragment\";\n    /**\n     * Splits a URI into its component parts.\n     *\n     * Each component can be accessed via the component indices; for example:\n     * <pre>\n     * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];\n     * </pre>\n     *\n     * @param {?} uri The URI string to examine.\n     * @return {?} Each component still URI-encoded.\n     *     Each component that is present will contain the encoded value, whereas\n     *     components that are not present will be undefined or empty, depending\n     *     on the browser's regular expression implementation.  Never null, since\n     *     arbitrary strings may still look like path names.\n     */\n    function _split(uri) {\n        return uri.match(_splitRe);\n    }\n    /**\n     * Removes dot segments in given path component, as described in\n     * RFC 3986, section 5.2.4.\n     *\n     * @param {?} path A non-empty path component.\n     * @return {?} Path component with removed dot segments.\n     */\n    function _removeDotSegments(path) {\n        if (path == '/')\n            return '/';\n        var /** @type {?} */ leadingSlash = path[0] == '/' ? '/' : '';\n        var /** @type {?} */ trailingSlash = path[path.length - 1] === '/' ? '/' : '';\n        var /** @type {?} */ segments = path.split('/');\n        var /** @type {?} */ out = [];\n        var /** @type {?} */ up = 0;\n        for (var /** @type {?} */ pos = 0; pos < segments.length; pos++) {\n            var /** @type {?} */ segment = segments[pos];\n            switch (segment) {\n                case '':\n                case '.':\n                    break;\n                case '..':\n                    if (out.length > 0) {\n                        out.pop();\n                    }\n                    else {\n                        up++;\n                    }\n                    break;\n                default:\n                    out.push(segment);\n            }\n        }\n        if (leadingSlash == '') {\n            while (up-- > 0) {\n                out.unshift('..');\n            }\n            if (out.length === 0)\n                out.push('.');\n        }\n        return leadingSlash + out.join('/') + trailingSlash;\n    }\n    /**\n     * Takes an array of the parts from split and canonicalizes the path part\n     * and then joins all the parts.\n     * @param {?} parts\n     * @return {?}\n     */\n    function _joinAndCanonicalizePath(parts) {\n        var /** @type {?} */ path = parts[_ComponentIndex.Path];\n        path = isBlank(path) ? '' : _removeDotSegments(path);\n        parts[_ComponentIndex.Path] = path;\n        return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);\n    }\n    /**\n     * Resolves a URL.\n     * @param {?} base The URL acting as the base URL.\n     * @param {?} url\n     * @return {?}\n     */\n    function _resolveUrl(base, url) {\n        var /** @type {?} */ parts = _split(encodeURI(url));\n        var /** @type {?} */ baseParts = _split(base);\n        if (isPresent(parts[_ComponentIndex.Scheme])) {\n            return _joinAndCanonicalizePath(parts);\n        }\n        else {\n            parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];\n        }\n        for (var /** @type {?} */ i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {\n            if (isBlank(parts[i])) {\n                parts[i] = baseParts[i];\n            }\n        }\n        if (parts[_ComponentIndex.Path][0] == '/') {\n            return _joinAndCanonicalizePath(parts);\n        }\n        var /** @type {?} */ path = baseParts[_ComponentIndex.Path];\n        if (isBlank(path))\n            path = '/';\n        var /** @type {?} */ index = path.lastIndexOf('/');\n        path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];\n        parts[_ComponentIndex.Path] = path;\n        return _joinAndCanonicalizePath(parts);\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$5 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$5 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var DirectiveNormalizer = (function () {\n        /**\n         * @param {?} _resourceLoader\n         * @param {?} _urlResolver\n         * @param {?} _htmlParser\n         * @param {?} _config\n         */\n        function DirectiveNormalizer(_resourceLoader, _urlResolver, _htmlParser, _config) {\n            this._resourceLoader = _resourceLoader;\n            this._urlResolver = _urlResolver;\n            this._htmlParser = _htmlParser;\n            this._config = _config;\n            this._resourceLoaderCache = new Map();\n        }\n        /**\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.clearCache = function () { this._resourceLoaderCache.clear(); };\n        /**\n         * @param {?} normalizedDirective\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.clearCacheFor = function (normalizedDirective) {\n            var _this = this;\n            if (!normalizedDirective.isComponent) {\n                return;\n            }\n            this._resourceLoaderCache.delete(normalizedDirective.template.templateUrl);\n            normalizedDirective.template.externalStylesheets.forEach(function (stylesheet) { _this._resourceLoaderCache.delete(stylesheet.moduleUrl); });\n        };\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype._fetch = function (url) {\n            var /** @type {?} */ result = this._resourceLoaderCache.get(url);\n            if (!result) {\n                result = this._resourceLoader.get(url);\n                this._resourceLoaderCache.set(url, result);\n            }\n            return result;\n        };\n        /**\n         * @param {?} prenormData\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeTemplate = function (prenormData) {\n            var _this = this;\n            var /** @type {?} */ normalizedTemplateSync = null;\n            var /** @type {?} */ normalizedTemplateAsync;\n            if (isPresent(prenormData.template)) {\n                normalizedTemplateSync = this.normalizeTemplateSync(prenormData);\n                normalizedTemplateAsync = Promise.resolve(normalizedTemplateSync);\n            }\n            else if (prenormData.templateUrl) {\n                normalizedTemplateAsync = this.normalizeTemplateAsync(prenormData);\n            }\n            else {\n                throw new SyntaxError(\"No template specified for component \" + stringify(prenormData.componentType));\n            }\n            if (normalizedTemplateSync && normalizedTemplateSync.styleUrls.length === 0) {\n                // sync case\n                return new SyncAsyncResult(normalizedTemplateSync);\n            }\n            else {\n                // async case\n                return new SyncAsyncResult(null, normalizedTemplateAsync.then(function (normalizedTemplate) { return _this.normalizeExternalStylesheets(normalizedTemplate); }));\n            }\n        };\n        /**\n         * @param {?} prenomData\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeTemplateSync = function (prenomData) {\n            return this.normalizeLoadedTemplate(prenomData, prenomData.template, prenomData.moduleUrl);\n        };\n        /**\n         * @param {?} prenomData\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeTemplateAsync = function (prenomData) {\n            var _this = this;\n            var /** @type {?} */ templateUrl = this._urlResolver.resolve(prenomData.moduleUrl, prenomData.templateUrl);\n            return this._fetch(templateUrl)\n                .then(function (value) { return _this.normalizeLoadedTemplate(prenomData, value, templateUrl); });\n        };\n        /**\n         * @param {?} prenomData\n         * @param {?} template\n         * @param {?} templateAbsUrl\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeLoadedTemplate = function (prenomData, template, templateAbsUrl) {\n            var /** @type {?} */ interpolationConfig = InterpolationConfig.fromArray(prenomData.interpolation);\n            var /** @type {?} */ rootNodesAndErrors = this._htmlParser.parse(template, stringify(prenomData.componentType), true, interpolationConfig);\n            if (rootNodesAndErrors.errors.length > 0) {\n                var /** @type {?} */ errorString = rootNodesAndErrors.errors.join('\\n');\n                throw new SyntaxError(\"Template parse errors:\\n\" + errorString);\n            }\n            var /** @type {?} */ templateMetadataStyles = this.normalizeStylesheet(new CompileStylesheetMetadata({\n                styles: prenomData.styles,\n                styleUrls: prenomData.styleUrls,\n                moduleUrl: prenomData.moduleUrl\n            }));\n            var /** @type {?} */ visitor = new TemplatePreparseVisitor();\n            visitAll(visitor, rootNodesAndErrors.rootNodes);\n            var /** @type {?} */ templateStyles = this.normalizeStylesheet(new CompileStylesheetMetadata({ styles: visitor.styles, styleUrls: visitor.styleUrls, moduleUrl: templateAbsUrl }));\n            var /** @type {?} */ encapsulation = prenomData.encapsulation;\n            if (isBlank(encapsulation)) {\n                encapsulation = this._config.defaultEncapsulation;\n            }\n            var /** @type {?} */ styles = templateMetadataStyles.styles.concat(templateStyles.styles);\n            var /** @type {?} */ styleUrls = templateMetadataStyles.styleUrls.concat(templateStyles.styleUrls);\n            if (encapsulation === _angular_core.ViewEncapsulation.Emulated && styles.length === 0 &&\n                styleUrls.length === 0) {\n                encapsulation = _angular_core.ViewEncapsulation.None;\n            }\n            return new CompileTemplateMetadata({\n                encapsulation: encapsulation,\n                template: template,\n                templateUrl: templateAbsUrl, styles: styles, styleUrls: styleUrls,\n                ngContentSelectors: visitor.ngContentSelectors,\n                animations: prenomData.animations,\n                interpolation: prenomData.interpolation,\n            });\n        };\n        /**\n         * @param {?} templateMeta\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeExternalStylesheets = function (templateMeta) {\n            return this._loadMissingExternalStylesheets(templateMeta.styleUrls)\n                .then(function (externalStylesheets) { return new CompileTemplateMetadata({\n                encapsulation: templateMeta.encapsulation,\n                template: templateMeta.template,\n                templateUrl: templateMeta.templateUrl,\n                styles: templateMeta.styles,\n                styleUrls: templateMeta.styleUrls,\n                externalStylesheets: externalStylesheets,\n                ngContentSelectors: templateMeta.ngContentSelectors,\n                animations: templateMeta.animations,\n                interpolation: templateMeta.interpolation\n            }); });\n        };\n        /**\n         * @param {?} styleUrls\n         * @param {?=} loadedStylesheets\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype._loadMissingExternalStylesheets = function (styleUrls, loadedStylesheets) {\n            var _this = this;\n            if (loadedStylesheets === void 0) { loadedStylesheets = new Map(); }\n            return Promise\n                .all(styleUrls.filter(function (styleUrl) { return !loadedStylesheets.has(styleUrl); })\n                .map(function (styleUrl) { return _this._fetch(styleUrl).then(function (loadedStyle) {\n                var /** @type {?} */ stylesheet = _this.normalizeStylesheet(new CompileStylesheetMetadata({ styles: [loadedStyle], moduleUrl: styleUrl }));\n                loadedStylesheets.set(styleUrl, stylesheet);\n                return _this._loadMissingExternalStylesheets(stylesheet.styleUrls, loadedStylesheets);\n            }); }))\n                .then(function (_) { return Array.from(loadedStylesheets.values()); });\n        };\n        /**\n         * @param {?} stylesheet\n         * @return {?}\n         */\n        DirectiveNormalizer.prototype.normalizeStylesheet = function (stylesheet) {\n            var _this = this;\n            var /** @type {?} */ allStyleUrls = stylesheet.styleUrls.filter(isStyleUrlResolvable)\n                .map(function (url) { return _this._urlResolver.resolve(stylesheet.moduleUrl, url); });\n            var /** @type {?} */ allStyles = stylesheet.styles.map(function (style) {\n                var /** @type {?} */ styleWithImports = extractStyleUrls(_this._urlResolver, stylesheet.moduleUrl, style);\n                allStyleUrls.push.apply(allStyleUrls, styleWithImports.styleUrls);\n                return styleWithImports.style;\n            });\n            return new CompileStylesheetMetadata({ styles: allStyles, styleUrls: allStyleUrls, moduleUrl: stylesheet.moduleUrl });\n        };\n        DirectiveNormalizer = __decorate$5([\n            CompilerInjectable(), \n            __metadata$5('design:paramtypes', [ResourceLoader, UrlResolver, HtmlParser, CompilerConfig])\n        ], DirectiveNormalizer);\n        return DirectiveNormalizer;\n    }());\n    var TemplatePreparseVisitor = (function () {\n        function TemplatePreparseVisitor() {\n            this.ngContentSelectors = [];\n            this.styles = [];\n            this.styleUrls = [];\n            this.ngNonBindableStackCount = 0;\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {\n            var /** @type {?} */ preparsedElement = preparseElement(ast);\n            switch (preparsedElement.type) {\n                case PreparsedElementType.NG_CONTENT:\n                    if (this.ngNonBindableStackCount === 0) {\n                        this.ngContentSelectors.push(preparsedElement.selectAttr);\n                    }\n                    break;\n                case PreparsedElementType.STYLE:\n                    var /** @type {?} */ textContent_1 = '';\n                    ast.children.forEach(function (child) {\n                        if (child instanceof Text) {\n                            textContent_1 += child.value;\n                        }\n                    });\n                    this.styles.push(textContent_1);\n                    break;\n                case PreparsedElementType.STYLESHEET:\n                    this.styleUrls.push(preparsedElement.hrefAttr);\n                    break;\n                default:\n                    break;\n            }\n            if (preparsedElement.nonBindable) {\n                this.ngNonBindableStackCount++;\n            }\n            visitAll(this, ast.children);\n            if (preparsedElement.nonBindable) {\n                this.ngNonBindableStackCount--;\n            }\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitExpansion = function (ast, context) { visitAll(this, ast.cases); };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitExpansionCase = function (ast, context) {\n            visitAll(this, ast.expression);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitComment = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitAttribute = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };\n        return TemplatePreparseVisitor;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$7 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$7 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var DirectiveResolver = (function () {\n        /**\n         * @param {?=} _reflector\n         */\n        function DirectiveResolver(_reflector) {\n            if (_reflector === void 0) { _reflector = reflector; }\n            this._reflector = _reflector;\n        }\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        DirectiveResolver.prototype.isDirective = function (type) {\n            var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n            return typeMetadata && typeMetadata.some(isDirectiveMetadata);\n        };\n        /**\n         * Return {\\@link Directive} for a given `Type`.\n         * @param {?} type\n         * @param {?=} throwIfNotFound\n         * @return {?}\n         */\n        DirectiveResolver.prototype.resolve = function (type, throwIfNotFound) {\n            if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n            var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n            if (typeMetadata) {\n                var /** @type {?} */ metadata = ListWrapper.findLast(typeMetadata, isDirectiveMetadata);\n                if (metadata) {\n                    var /** @type {?} */ propertyMetadata = this._reflector.propMetadata(type);\n                    return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type);\n                }\n            }\n            if (throwIfNotFound) {\n                throw new Error(\"No Directive annotation found on \" + stringify(type));\n            }\n            return null;\n        };\n        /**\n         * @param {?} dm\n         * @param {?} propertyMetadata\n         * @param {?} directiveType\n         * @return {?}\n         */\n        DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata, directiveType) {\n            var /** @type {?} */ inputs = [];\n            var /** @type {?} */ outputs = [];\n            var /** @type {?} */ host = {};\n            var /** @type {?} */ queries = {};\n            Object.keys(propertyMetadata).forEach(function (propName) {\n                var /** @type {?} */ input = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Input; });\n                if (input) {\n                    if (input.bindingPropertyName) {\n                        inputs.push(propName + \": \" + input.bindingPropertyName);\n                    }\n                    else {\n                        inputs.push(propName);\n                    }\n                }\n                var /** @type {?} */ output = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Output; });\n                if (output) {\n                    if (output.bindingPropertyName) {\n                        outputs.push(propName + \": \" + output.bindingPropertyName);\n                    }\n                    else {\n                        outputs.push(propName);\n                    }\n                }\n                var /** @type {?} */ hostBindings = propertyMetadata[propName].filter(function (a) { return a && a instanceof _angular_core.HostBinding; });\n                hostBindings.forEach(function (hostBinding) {\n                    if (hostBinding.hostPropertyName) {\n                        var /** @type {?} */ startWith = hostBinding.hostPropertyName[0];\n                        if (startWith === '(') {\n                            throw new Error(\"@HostBinding can not bind to events. Use @HostListener instead.\");\n                        }\n                        else if (startWith === '[') {\n                            throw new Error(\"@HostBinding parameter should be a property name, 'class.<name>', or 'attr.<name>'.\");\n                        }\n                        host[(\"[\" + hostBinding.hostPropertyName + \"]\")] = propName;\n                    }\n                    else {\n                        host[(\"[\" + propName + \"]\")] = propName;\n                    }\n                });\n                var /** @type {?} */ hostListeners = propertyMetadata[propName].filter(function (a) { return a && a instanceof _angular_core.HostListener; });\n                hostListeners.forEach(function (hostListener) {\n                    var /** @type {?} */ args = hostListener.args || [];\n                    host[(\"(\" + hostListener.eventName + \")\")] = propName + \"(\" + args.join(',') + \")\";\n                });\n                var /** @type {?} */ query = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Query; });\n                if (query) {\n                    queries[propName] = query;\n                }\n            });\n            return this._merge(dm, inputs, outputs, host, queries, directiveType);\n        };\n        /**\n         * @param {?} def\n         * @return {?}\n         */\n        DirectiveResolver.prototype._extractPublicName = function (def) { return splitAtColon(def, [null, def])[1].trim(); };\n        /**\n         * @param {?} bindings\n         * @return {?}\n         */\n        DirectiveResolver.prototype._dedupeBindings = function (bindings) {\n            var /** @type {?} */ names = new Set();\n            var /** @type {?} */ reversedResult = [];\n            // go last to first to allow later entries to overwrite previous entries\n            for (var /** @type {?} */ i = bindings.length - 1; i >= 0; i--) {\n                var /** @type {?} */ binding = bindings[i];\n                var /** @type {?} */ name_1 = this._extractPublicName(binding);\n                if (!names.has(name_1)) {\n                    names.add(name_1);\n                    reversedResult.push(binding);\n                }\n            }\n            return reversedResult.reverse();\n        };\n        /**\n         * @param {?} directive\n         * @param {?} inputs\n         * @param {?} outputs\n         * @param {?} host\n         * @param {?} queries\n         * @param {?} directiveType\n         * @return {?}\n         */\n        DirectiveResolver.prototype._merge = function (directive, inputs, outputs, host, queries, directiveType) {\n            var /** @type {?} */ mergedInputs = this._dedupeBindings(directive.inputs ? directive.inputs.concat(inputs) : inputs);\n            var /** @type {?} */ mergedOutputs = this._dedupeBindings(directive.outputs ? directive.outputs.concat(outputs) : outputs);\n            var /** @type {?} */ mergedHost = directive.host ? StringMapWrapper.merge(directive.host, host) : host;\n            var /** @type {?} */ mergedQueries = directive.queries ? StringMapWrapper.merge(directive.queries, queries) : queries;\n            if (directive instanceof _angular_core.Component) {\n                return new _angular_core.Component({\n                    selector: directive.selector,\n                    inputs: mergedInputs,\n                    outputs: mergedOutputs,\n                    host: mergedHost,\n                    exportAs: directive.exportAs,\n                    moduleId: directive.moduleId,\n                    queries: mergedQueries,\n                    changeDetection: directive.changeDetection,\n                    providers: directive.providers,\n                    viewProviders: directive.viewProviders,\n                    entryComponents: directive.entryComponents,\n                    template: directive.template,\n                    templateUrl: directive.templateUrl,\n                    styles: directive.styles,\n                    styleUrls: directive.styleUrls,\n                    encapsulation: directive.encapsulation,\n                    animations: directive.animations,\n                    interpolation: directive.interpolation\n                });\n            }\n            else {\n                return new _angular_core.Directive({\n                    selector: directive.selector,\n                    inputs: mergedInputs,\n                    outputs: mergedOutputs,\n                    host: mergedHost,\n                    exportAs: directive.exportAs,\n                    queries: mergedQueries,\n                    providers: directive.providers\n                });\n            }\n        };\n        DirectiveResolver = __decorate$7([\n            CompilerInjectable(), \n            __metadata$7('design:paramtypes', [ReflectorReader])\n        ], DirectiveResolver);\n        return DirectiveResolver;\n    }());\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function isDirectiveMetadata(type) {\n        return type instanceof _angular_core.Directive;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$20 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var TypeModifier = {};\n    TypeModifier.Const = 0;\n    TypeModifier[TypeModifier.Const] = \"Const\";\n    /**\n     * @abstract\n     */\n    var Type$1 = (function () {\n        /**\n         * @param {?=} modifiers\n         */\n        function Type(modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            this.modifiers = modifiers;\n            if (!modifiers) {\n                this.modifiers = [];\n            }\n        }\n        /**\n         * @abstract\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Type.prototype.visitType = function (visitor, context) { };\n        /**\n         * @param {?} modifier\n         * @return {?}\n         */\n        Type.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n        return Type;\n    }());\n    var BuiltinTypeName = {};\n    BuiltinTypeName.Dynamic = 0;\n    BuiltinTypeName.Bool = 1;\n    BuiltinTypeName.String = 2;\n    BuiltinTypeName.Int = 3;\n    BuiltinTypeName.Number = 4;\n    BuiltinTypeName.Function = 5;\n    BuiltinTypeName.Null = 6;\n    BuiltinTypeName[BuiltinTypeName.Dynamic] = \"Dynamic\";\n    BuiltinTypeName[BuiltinTypeName.Bool] = \"Bool\";\n    BuiltinTypeName[BuiltinTypeName.String] = \"String\";\n    BuiltinTypeName[BuiltinTypeName.Int] = \"Int\";\n    BuiltinTypeName[BuiltinTypeName.Number] = \"Number\";\n    BuiltinTypeName[BuiltinTypeName.Function] = \"Function\";\n    BuiltinTypeName[BuiltinTypeName.Null] = \"Null\";\n    var BuiltinType = (function (_super) {\n        __extends$20(BuiltinType, _super);\n        /**\n         * @param {?} name\n         * @param {?=} modifiers\n         */\n        function BuiltinType(name, modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.name = name;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BuiltinType.prototype.visitType = function (visitor, context) {\n            return visitor.visitBuiltintType(this, context);\n        };\n        return BuiltinType;\n    }(Type$1));\n    var ExpressionType = (function (_super) {\n        __extends$20(ExpressionType, _super);\n        /**\n         * @param {?} value\n         * @param {?=} typeParams\n         * @param {?=} modifiers\n         */\n        function ExpressionType(value, typeParams, modifiers) {\n            if (typeParams === void 0) { typeParams = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.value = value;\n            this.typeParams = typeParams;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionType.prototype.visitType = function (visitor, context) {\n            return visitor.visitExpressionType(this, context);\n        };\n        return ExpressionType;\n    }(Type$1));\n    var ArrayType = (function (_super) {\n        __extends$20(ArrayType, _super);\n        /**\n         * @param {?} of\n         * @param {?=} modifiers\n         */\n        function ArrayType(of, modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.of = of;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ArrayType.prototype.visitType = function (visitor, context) {\n            return visitor.visitArrayType(this, context);\n        };\n        return ArrayType;\n    }(Type$1));\n    var MapType = (function (_super) {\n        __extends$20(MapType, _super);\n        /**\n         * @param {?} valueType\n         * @param {?=} modifiers\n         */\n        function MapType(valueType, modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.valueType = valueType;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        MapType.prototype.visitType = function (visitor, context) { return visitor.visitMapType(this, context); };\n        return MapType;\n    }(Type$1));\n    var /** @type {?} */ DYNAMIC_TYPE = new BuiltinType(BuiltinTypeName.Dynamic);\n    var /** @type {?} */ BOOL_TYPE = new BuiltinType(BuiltinTypeName.Bool);\n    var /** @type {?} */ INT_TYPE = new BuiltinType(BuiltinTypeName.Int);\n    var /** @type {?} */ NUMBER_TYPE = new BuiltinType(BuiltinTypeName.Number);\n    var /** @type {?} */ STRING_TYPE = new BuiltinType(BuiltinTypeName.String);\n    var /** @type {?} */ FUNCTION_TYPE = new BuiltinType(BuiltinTypeName.Function);\n    var /** @type {?} */ NULL_TYPE = new BuiltinType(BuiltinTypeName.Null);\n    var BinaryOperator = {};\n    BinaryOperator.Equals = 0;\n    BinaryOperator.NotEquals = 1;\n    BinaryOperator.Identical = 2;\n    BinaryOperator.NotIdentical = 3;\n    BinaryOperator.Minus = 4;\n    BinaryOperator.Plus = 5;\n    BinaryOperator.Divide = 6;\n    BinaryOperator.Multiply = 7;\n    BinaryOperator.Modulo = 8;\n    BinaryOperator.And = 9;\n    BinaryOperator.Or = 10;\n    BinaryOperator.Lower = 11;\n    BinaryOperator.LowerEquals = 12;\n    BinaryOperator.Bigger = 13;\n    BinaryOperator.BiggerEquals = 14;\n    BinaryOperator[BinaryOperator.Equals] = \"Equals\";\n    BinaryOperator[BinaryOperator.NotEquals] = \"NotEquals\";\n    BinaryOperator[BinaryOperator.Identical] = \"Identical\";\n    BinaryOperator[BinaryOperator.NotIdentical] = \"NotIdentical\";\n    BinaryOperator[BinaryOperator.Minus] = \"Minus\";\n    BinaryOperator[BinaryOperator.Plus] = \"Plus\";\n    BinaryOperator[BinaryOperator.Divide] = \"Divide\";\n    BinaryOperator[BinaryOperator.Multiply] = \"Multiply\";\n    BinaryOperator[BinaryOperator.Modulo] = \"Modulo\";\n    BinaryOperator[BinaryOperator.And] = \"And\";\n    BinaryOperator[BinaryOperator.Or] = \"Or\";\n    BinaryOperator[BinaryOperator.Lower] = \"Lower\";\n    BinaryOperator[BinaryOperator.LowerEquals] = \"LowerEquals\";\n    BinaryOperator[BinaryOperator.Bigger] = \"Bigger\";\n    BinaryOperator[BinaryOperator.BiggerEquals] = \"BiggerEquals\";\n    /**\n     * @abstract\n     */\n    var Expression = (function () {\n        /**\n         * @param {?} type\n         */\n        function Expression(type) {\n            this.type = type;\n        }\n        /**\n         * @abstract\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Expression.prototype.visitExpression = function (visitor, context) { };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        Expression.prototype.prop = function (name) { return new ReadPropExpr(this, name); };\n        /**\n         * @param {?} index\n         * @param {?=} type\n         * @return {?}\n         */\n        Expression.prototype.key = function (index, type) {\n            if (type === void 0) { type = null; }\n            return new ReadKeyExpr(this, index, type);\n        };\n        /**\n         * @param {?} name\n         * @param {?} params\n         * @return {?}\n         */\n        Expression.prototype.callMethod = function (name, params) {\n            return new InvokeMethodExpr(this, name, params);\n        };\n        /**\n         * @param {?} params\n         * @return {?}\n         */\n        Expression.prototype.callFn = function (params) { return new InvokeFunctionExpr(this, params); };\n        /**\n         * @param {?} params\n         * @param {?=} type\n         * @return {?}\n         */\n        Expression.prototype.instantiate = function (params, type) {\n            if (type === void 0) { type = null; }\n            return new InstantiateExpr(this, params, type);\n        };\n        /**\n         * @param {?} trueCase\n         * @param {?=} falseCase\n         * @return {?}\n         */\n        Expression.prototype.conditional = function (trueCase, falseCase) {\n            if (falseCase === void 0) { falseCase = null; }\n            return new ConditionalExpr(this, trueCase, falseCase);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.equals = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Equals, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.notEquals = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.NotEquals, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.identical = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Identical, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.notIdentical = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.NotIdentical, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.minus = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Minus, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.plus = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Plus, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.divide = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Divide, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.multiply = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Multiply, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.modulo = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Modulo, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.and = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.And, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.or = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Or, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.lower = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Lower, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.lowerEquals = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.LowerEquals, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.bigger = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.Bigger, this, rhs);\n        };\n        /**\n         * @param {?} rhs\n         * @return {?}\n         */\n        Expression.prototype.biggerEquals = function (rhs) {\n            return new BinaryOperatorExpr(BinaryOperator.BiggerEquals, this, rhs);\n        };\n        /**\n         * @return {?}\n         */\n        Expression.prototype.isBlank = function () {\n            // Note: We use equals by purpose here to compare to null and undefined in JS.\n            // We use the typed null to allow strictNullChecks to narrow types.\n            return this.equals(TYPED_NULL_EXPR);\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        Expression.prototype.cast = function (type) { return new CastExpr(this, type); };\n        /**\n         * @return {?}\n         */\n        Expression.prototype.toStmt = function () { return new ExpressionStatement(this); };\n        return Expression;\n    }());\n    var BuiltinVar = {};\n    BuiltinVar.This = 0;\n    BuiltinVar.Super = 1;\n    BuiltinVar.CatchError = 2;\n    BuiltinVar.CatchStack = 3;\n    BuiltinVar[BuiltinVar.This] = \"This\";\n    BuiltinVar[BuiltinVar.Super] = \"Super\";\n    BuiltinVar[BuiltinVar.CatchError] = \"CatchError\";\n    BuiltinVar[BuiltinVar.CatchStack] = \"CatchStack\";\n    var ReadVarExpr = (function (_super) {\n        __extends$20(ReadVarExpr, _super);\n        /**\n         * @param {?} name\n         * @param {?=} type\n         */\n        function ReadVarExpr(name, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            if (typeof name === 'string') {\n                this.name = name;\n                this.builtin = null;\n            }\n            else {\n                this.name = null;\n                this.builtin = name;\n            }\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ReadVarExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitReadVarExpr(this, context);\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ReadVarExpr.prototype.set = function (value) { return new WriteVarExpr(this.name, value); };\n        return ReadVarExpr;\n    }(Expression));\n    var WriteVarExpr = (function (_super) {\n        __extends$20(WriteVarExpr, _super);\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?=} type\n         */\n        function WriteVarExpr(name, value, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type || value.type);\n            this.name = name;\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        WriteVarExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitWriteVarExpr(this, context);\n        };\n        /**\n         * @param {?=} type\n         * @param {?=} modifiers\n         * @return {?}\n         */\n        WriteVarExpr.prototype.toDeclStmt = function (type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            return new DeclareVarStmt(this.name, this.value, type, modifiers);\n        };\n        return WriteVarExpr;\n    }(Expression));\n    var WriteKeyExpr = (function (_super) {\n        __extends$20(WriteKeyExpr, _super);\n        /**\n         * @param {?} receiver\n         * @param {?} index\n         * @param {?} value\n         * @param {?=} type\n         */\n        function WriteKeyExpr(receiver, index, value, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type || value.type);\n            this.receiver = receiver;\n            this.index = index;\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        WriteKeyExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitWriteKeyExpr(this, context);\n        };\n        return WriteKeyExpr;\n    }(Expression));\n    var WritePropExpr = (function (_super) {\n        __extends$20(WritePropExpr, _super);\n        /**\n         * @param {?} receiver\n         * @param {?} name\n         * @param {?} value\n         * @param {?=} type\n         */\n        function WritePropExpr(receiver, name, value, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type || value.type);\n            this.receiver = receiver;\n            this.name = name;\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        WritePropExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitWritePropExpr(this, context);\n        };\n        return WritePropExpr;\n    }(Expression));\n    var BuiltinMethod = {};\n    BuiltinMethod.ConcatArray = 0;\n    BuiltinMethod.SubscribeObservable = 1;\n    BuiltinMethod.Bind = 2;\n    BuiltinMethod[BuiltinMethod.ConcatArray] = \"ConcatArray\";\n    BuiltinMethod[BuiltinMethod.SubscribeObservable] = \"SubscribeObservable\";\n    BuiltinMethod[BuiltinMethod.Bind] = \"Bind\";\n    var InvokeMethodExpr = (function (_super) {\n        __extends$20(InvokeMethodExpr, _super);\n        /**\n         * @param {?} receiver\n         * @param {?} method\n         * @param {?} args\n         * @param {?=} type\n         */\n        function InvokeMethodExpr(receiver, method, args, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.receiver = receiver;\n            this.args = args;\n            if (typeof method === 'string') {\n                this.name = method;\n                this.builtin = null;\n            }\n            else {\n                this.name = null;\n                this.builtin = method;\n            }\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        InvokeMethodExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitInvokeMethodExpr(this, context);\n        };\n        return InvokeMethodExpr;\n    }(Expression));\n    var InvokeFunctionExpr = (function (_super) {\n        __extends$20(InvokeFunctionExpr, _super);\n        /**\n         * @param {?} fn\n         * @param {?} args\n         * @param {?=} type\n         */\n        function InvokeFunctionExpr(fn, args, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.fn = fn;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        InvokeFunctionExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitInvokeFunctionExpr(this, context);\n        };\n        return InvokeFunctionExpr;\n    }(Expression));\n    var InstantiateExpr = (function (_super) {\n        __extends$20(InstantiateExpr, _super);\n        /**\n         * @param {?} classExpr\n         * @param {?} args\n         * @param {?=} type\n         */\n        function InstantiateExpr(classExpr, args, type) {\n            _super.call(this, type);\n            this.classExpr = classExpr;\n            this.args = args;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        InstantiateExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitInstantiateExpr(this, context);\n        };\n        return InstantiateExpr;\n    }(Expression));\n    var LiteralExpr = (function (_super) {\n        __extends$20(LiteralExpr, _super);\n        /**\n         * @param {?} value\n         * @param {?=} type\n         */\n        function LiteralExpr(value, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        LiteralExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitLiteralExpr(this, context);\n        };\n        return LiteralExpr;\n    }(Expression));\n    var ExternalExpr = (function (_super) {\n        __extends$20(ExternalExpr, _super);\n        /**\n         * @param {?} value\n         * @param {?=} type\n         * @param {?=} typeParams\n         */\n        function ExternalExpr(value, type, typeParams) {\n            if (type === void 0) { type = null; }\n            if (typeParams === void 0) { typeParams = null; }\n            _super.call(this, type);\n            this.value = value;\n            this.typeParams = typeParams;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ExternalExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitExternalExpr(this, context);\n        };\n        return ExternalExpr;\n    }(Expression));\n    var ConditionalExpr = (function (_super) {\n        __extends$20(ConditionalExpr, _super);\n        /**\n         * @param {?} condition\n         * @param {?} trueCase\n         * @param {?=} falseCase\n         * @param {?=} type\n         */\n        function ConditionalExpr(condition, trueCase, falseCase, type) {\n            if (falseCase === void 0) { falseCase = null; }\n            if (type === void 0) { type = null; }\n            _super.call(this, type || trueCase.type);\n            this.condition = condition;\n            this.falseCase = falseCase;\n            this.trueCase = trueCase;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ConditionalExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitConditionalExpr(this, context);\n        };\n        return ConditionalExpr;\n    }(Expression));\n    var NotExpr = (function (_super) {\n        __extends$20(NotExpr, _super);\n        /**\n         * @param {?} condition\n         */\n        function NotExpr(condition) {\n            _super.call(this, BOOL_TYPE);\n            this.condition = condition;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        NotExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitNotExpr(this, context);\n        };\n        return NotExpr;\n    }(Expression));\n    var CastExpr = (function (_super) {\n        __extends$20(CastExpr, _super);\n        /**\n         * @param {?} value\n         * @param {?} type\n         */\n        function CastExpr(value, type) {\n            _super.call(this, type);\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        CastExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitCastExpr(this, context);\n        };\n        return CastExpr;\n    }(Expression));\n    var FnParam = (function () {\n        /**\n         * @param {?} name\n         * @param {?=} type\n         */\n        function FnParam(name, type) {\n            if (type === void 0) { type = null; }\n            this.name = name;\n            this.type = type;\n        }\n        return FnParam;\n    }());\n    var FunctionExpr = (function (_super) {\n        __extends$20(FunctionExpr, _super);\n        /**\n         * @param {?} params\n         * @param {?} statements\n         * @param {?=} type\n         */\n        function FunctionExpr(params, statements, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.params = params;\n            this.statements = statements;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        FunctionExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitFunctionExpr(this, context);\n        };\n        /**\n         * @param {?} name\n         * @param {?=} modifiers\n         * @return {?}\n         */\n        FunctionExpr.prototype.toDeclStmt = function (name, modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            return new DeclareFunctionStmt(name, this.params, this.statements, this.type, modifiers);\n        };\n        return FunctionExpr;\n    }(Expression));\n    var BinaryOperatorExpr = (function (_super) {\n        __extends$20(BinaryOperatorExpr, _super);\n        /**\n         * @param {?} operator\n         * @param {?} lhs\n         * @param {?} rhs\n         * @param {?=} type\n         */\n        function BinaryOperatorExpr(operator, lhs, rhs, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type || lhs.type);\n            this.operator = operator;\n            this.rhs = rhs;\n            this.lhs = lhs;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        BinaryOperatorExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitBinaryOperatorExpr(this, context);\n        };\n        return BinaryOperatorExpr;\n    }(Expression));\n    var ReadPropExpr = (function (_super) {\n        __extends$20(ReadPropExpr, _super);\n        /**\n         * @param {?} receiver\n         * @param {?} name\n         * @param {?=} type\n         */\n        function ReadPropExpr(receiver, name, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.receiver = receiver;\n            this.name = name;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ReadPropExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitReadPropExpr(this, context);\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ReadPropExpr.prototype.set = function (value) {\n            return new WritePropExpr(this.receiver, this.name, value);\n        };\n        return ReadPropExpr;\n    }(Expression));\n    var ReadKeyExpr = (function (_super) {\n        __extends$20(ReadKeyExpr, _super);\n        /**\n         * @param {?} receiver\n         * @param {?} index\n         * @param {?=} type\n         */\n        function ReadKeyExpr(receiver, index, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.receiver = receiver;\n            this.index = index;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ReadKeyExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitReadKeyExpr(this, context);\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ReadKeyExpr.prototype.set = function (value) {\n            return new WriteKeyExpr(this.receiver, this.index, value);\n        };\n        return ReadKeyExpr;\n    }(Expression));\n    var LiteralArrayExpr = (function (_super) {\n        __extends$20(LiteralArrayExpr, _super);\n        /**\n         * @param {?} entries\n         * @param {?=} type\n         */\n        function LiteralArrayExpr(entries, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.entries = entries;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        LiteralArrayExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitLiteralArrayExpr(this, context);\n        };\n        return LiteralArrayExpr;\n    }(Expression));\n    var LiteralMapEntry = (function () {\n        /**\n         * @param {?} key\n         * @param {?} value\n         * @param {?=} quoted\n         */\n        function LiteralMapEntry(key, value, quoted) {\n            if (quoted === void 0) { quoted = false; }\n            this.key = key;\n            this.value = value;\n            this.quoted = quoted;\n        }\n        return LiteralMapEntry;\n    }());\n    var LiteralMapExpr = (function (_super) {\n        __extends$20(LiteralMapExpr, _super);\n        /**\n         * @param {?} entries\n         * @param {?=} type\n         */\n        function LiteralMapExpr(entries, type) {\n            if (type === void 0) { type = null; }\n            _super.call(this, type);\n            this.entries = entries;\n            this.valueType = null;\n            if (isPresent(type)) {\n                this.valueType = type.valueType;\n            }\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        LiteralMapExpr.prototype.visitExpression = function (visitor, context) {\n            return visitor.visitLiteralMapExpr(this, context);\n        };\n        return LiteralMapExpr;\n    }(Expression));\n    var /** @type {?} */ THIS_EXPR = new ReadVarExpr(BuiltinVar.This);\n    var /** @type {?} */ SUPER_EXPR = new ReadVarExpr(BuiltinVar.Super);\n    var /** @type {?} */ CATCH_ERROR_VAR = new ReadVarExpr(BuiltinVar.CatchError);\n    var /** @type {?} */ CATCH_STACK_VAR = new ReadVarExpr(BuiltinVar.CatchStack);\n    var /** @type {?} */ NULL_EXPR = new LiteralExpr(null, null);\n    var /** @type {?} */ TYPED_NULL_EXPR = new LiteralExpr(null, NULL_TYPE);\n    var StmtModifier = {};\n    StmtModifier.Final = 0;\n    StmtModifier.Private = 1;\n    StmtModifier[StmtModifier.Final] = \"Final\";\n    StmtModifier[StmtModifier.Private] = \"Private\";\n    /**\n     * @abstract\n     */\n    var Statement = (function () {\n        /**\n         * @param {?=} modifiers\n         */\n        function Statement(modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            this.modifiers = modifiers;\n            if (!modifiers) {\n                this.modifiers = [];\n            }\n        }\n        /**\n         * @abstract\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        Statement.prototype.visitStatement = function (visitor, context) { };\n        /**\n         * @param {?} modifier\n         * @return {?}\n         */\n        Statement.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n        return Statement;\n    }());\n    var DeclareVarStmt = (function (_super) {\n        __extends$20(DeclareVarStmt, _super);\n        /**\n         * @param {?} name\n         * @param {?} value\n         * @param {?=} type\n         * @param {?=} modifiers\n         */\n        function DeclareVarStmt(name, value, type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.name = name;\n            this.value = value;\n            this.type = type || value.type;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        DeclareVarStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitDeclareVarStmt(this, context);\n        };\n        return DeclareVarStmt;\n    }(Statement));\n    var DeclareFunctionStmt = (function (_super) {\n        __extends$20(DeclareFunctionStmt, _super);\n        /**\n         * @param {?} name\n         * @param {?} params\n         * @param {?} statements\n         * @param {?=} type\n         * @param {?=} modifiers\n         */\n        function DeclareFunctionStmt(name, params, statements, type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.name = name;\n            this.params = params;\n            this.statements = statements;\n            this.type = type;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        DeclareFunctionStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitDeclareFunctionStmt(this, context);\n        };\n        return DeclareFunctionStmt;\n    }(Statement));\n    var ExpressionStatement = (function (_super) {\n        __extends$20(ExpressionStatement, _super);\n        /**\n         * @param {?} expr\n         */\n        function ExpressionStatement(expr) {\n            _super.call(this);\n            this.expr = expr;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionStatement.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitExpressionStmt(this, context);\n        };\n        return ExpressionStatement;\n    }(Statement));\n    var ReturnStatement = (function (_super) {\n        __extends$20(ReturnStatement, _super);\n        /**\n         * @param {?} value\n         */\n        function ReturnStatement(value) {\n            _super.call(this);\n            this.value = value;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ReturnStatement.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitReturnStmt(this, context);\n        };\n        return ReturnStatement;\n    }(Statement));\n    var AbstractClassPart = (function () {\n        /**\n         * @param {?=} type\n         * @param {?} modifiers\n         */\n        function AbstractClassPart(type, modifiers) {\n            if (type === void 0) { type = null; }\n            this.type = type;\n            this.modifiers = modifiers;\n            if (!modifiers) {\n                this.modifiers = [];\n            }\n        }\n        /**\n         * @param {?} modifier\n         * @return {?}\n         */\n        AbstractClassPart.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n        return AbstractClassPart;\n    }());\n    var ClassField = (function (_super) {\n        __extends$20(ClassField, _super);\n        /**\n         * @param {?} name\n         * @param {?=} type\n         * @param {?=} modifiers\n         */\n        function ClassField(name, type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, type, modifiers);\n            this.name = name;\n        }\n        return ClassField;\n    }(AbstractClassPart));\n    var ClassMethod = (function (_super) {\n        __extends$20(ClassMethod, _super);\n        /**\n         * @param {?} name\n         * @param {?} params\n         * @param {?} body\n         * @param {?=} type\n         * @param {?=} modifiers\n         */\n        function ClassMethod(name, params, body, type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, type, modifiers);\n            this.name = name;\n            this.params = params;\n            this.body = body;\n        }\n        return ClassMethod;\n    }(AbstractClassPart));\n    var ClassGetter = (function (_super) {\n        __extends$20(ClassGetter, _super);\n        /**\n         * @param {?} name\n         * @param {?} body\n         * @param {?=} type\n         * @param {?=} modifiers\n         */\n        function ClassGetter(name, body, type, modifiers) {\n            if (type === void 0) { type = null; }\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, type, modifiers);\n            this.name = name;\n            this.body = body;\n        }\n        return ClassGetter;\n    }(AbstractClassPart));\n    var ClassStmt = (function (_super) {\n        __extends$20(ClassStmt, _super);\n        /**\n         * @param {?} name\n         * @param {?} parent\n         * @param {?} fields\n         * @param {?} getters\n         * @param {?} constructorMethod\n         * @param {?} methods\n         * @param {?=} modifiers\n         */\n        function ClassStmt(name, parent, fields, getters, constructorMethod, methods, modifiers) {\n            if (modifiers === void 0) { modifiers = null; }\n            _super.call(this, modifiers);\n            this.name = name;\n            this.parent = parent;\n            this.fields = fields;\n            this.getters = getters;\n            this.constructorMethod = constructorMethod;\n            this.methods = methods;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ClassStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitDeclareClassStmt(this, context);\n        };\n        return ClassStmt;\n    }(Statement));\n    var IfStmt = (function (_super) {\n        __extends$20(IfStmt, _super);\n        /**\n         * @param {?} condition\n         * @param {?} trueCase\n         * @param {?=} falseCase\n         */\n        function IfStmt(condition, trueCase, falseCase) {\n            if (falseCase === void 0) { falseCase = []; }\n            _super.call(this);\n            this.condition = condition;\n            this.trueCase = trueCase;\n            this.falseCase = falseCase;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        IfStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitIfStmt(this, context);\n        };\n        return IfStmt;\n    }(Statement));\n    var CommentStmt = (function (_super) {\n        __extends$20(CommentStmt, _super);\n        /**\n         * @param {?} comment\n         */\n        function CommentStmt(comment) {\n            _super.call(this);\n            this.comment = comment;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        CommentStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitCommentStmt(this, context);\n        };\n        return CommentStmt;\n    }(Statement));\n    var TryCatchStmt = (function (_super) {\n        __extends$20(TryCatchStmt, _super);\n        /**\n         * @param {?} bodyStmts\n         * @param {?} catchStmts\n         */\n        function TryCatchStmt(bodyStmts, catchStmts) {\n            _super.call(this);\n            this.bodyStmts = bodyStmts;\n            this.catchStmts = catchStmts;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        TryCatchStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitTryCatchStmt(this, context);\n        };\n        return TryCatchStmt;\n    }(Statement));\n    var ThrowStmt = (function (_super) {\n        __extends$20(ThrowStmt, _super);\n        /**\n         * @param {?} error\n         */\n        function ThrowStmt(error) {\n            _super.call(this);\n            this.error = error;\n        }\n        /**\n         * @param {?} visitor\n         * @param {?} context\n         * @return {?}\n         */\n        ThrowStmt.prototype.visitStatement = function (visitor, context) {\n            return visitor.visitThrowStmt(this, context);\n        };\n        return ThrowStmt;\n    }(Statement));\n    var ExpressionTransformer = (function () {\n        function ExpressionTransformer() {\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitReadVarExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitWriteVarExpr = function (expr, context) {\n            return new WriteVarExpr(expr.name, expr.value.visitExpression(this, context));\n        };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitWriteKeyExpr = function (expr, context) {\n            return new WriteKeyExpr(expr.receiver.visitExpression(this, context), expr.index.visitExpression(this, context), expr.value.visitExpression(this, context));\n        };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitWritePropExpr = function (expr, context) {\n            return new WritePropExpr(expr.receiver.visitExpression(this, context), expr.name, expr.value.visitExpression(this, context));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitInvokeMethodExpr = function (ast, context) {\n            var /** @type {?} */ method = ast.builtin || ast.name;\n            return new InvokeMethodExpr(ast.receiver.visitExpression(this, context), method, this.visitAllExpressions(ast.args, context), ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitInvokeFunctionExpr = function (ast, context) {\n            return new InvokeFunctionExpr(ast.fn.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitInstantiateExpr = function (ast, context) {\n            return new InstantiateExpr(ast.classExpr.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitLiteralExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitExternalExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitConditionalExpr = function (ast, context) {\n            return new ConditionalExpr(ast.condition.visitExpression(this, context), ast.trueCase.visitExpression(this, context), ast.falseCase.visitExpression(this, context));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitNotExpr = function (ast, context) {\n            return new NotExpr(ast.condition.visitExpression(this, context));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitCastExpr = function (ast, context) {\n            return new CastExpr(ast.value.visitExpression(this, context), context);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitFunctionExpr = function (ast, context) {\n            // Don't descend into nested functions\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitBinaryOperatorExpr = function (ast, context) {\n            return new BinaryOperatorExpr(ast.operator, ast.lhs.visitExpression(this, context), ast.rhs.visitExpression(this, context), ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitReadPropExpr = function (ast, context) {\n            return new ReadPropExpr(ast.receiver.visitExpression(this, context), ast.name, ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitReadKeyExpr = function (ast, context) {\n            return new ReadKeyExpr(ast.receiver.visitExpression(this, context), ast.index.visitExpression(this, context), ast.type);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitLiteralArrayExpr = function (ast, context) {\n            return new LiteralArrayExpr(this.visitAllExpressions(ast.entries, context));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitLiteralMapExpr = function (ast, context) {\n            var _this = this;\n            var /** @type {?} */ entries = ast.entries.map(function (entry) { return new LiteralMapEntry(entry.key, entry.value.visitExpression(_this, context), entry.quoted); });\n            return new LiteralMapExpr(entries);\n        };\n        /**\n         * @param {?} exprs\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitAllExpressions = function (exprs, context) {\n            var _this = this;\n            return exprs.map(function (expr) { return expr.visitExpression(_this, context); });\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitDeclareVarStmt = function (stmt, context) {\n            return new DeclareVarStmt(stmt.name, stmt.value.visitExpression(this, context), stmt.type, stmt.modifiers);\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitDeclareFunctionStmt = function (stmt, context) {\n            // Don't descend into nested functions\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitExpressionStmt = function (stmt, context) {\n            return new ExpressionStatement(stmt.expr.visitExpression(this, context));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitReturnStmt = function (stmt, context) {\n            return new ReturnStatement(stmt.value.visitExpression(this, context));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitDeclareClassStmt = function (stmt, context) {\n            // Don't descend into nested functions\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitIfStmt = function (stmt, context) {\n            return new IfStmt(stmt.condition.visitExpression(this, context), this.visitAllStatements(stmt.trueCase, context), this.visitAllStatements(stmt.falseCase, context));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitTryCatchStmt = function (stmt, context) {\n            return new TryCatchStmt(this.visitAllStatements(stmt.bodyStmts, context), this.visitAllStatements(stmt.catchStmts, context));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitThrowStmt = function (stmt, context) {\n            return new ThrowStmt(stmt.error.visitExpression(this, context));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitCommentStmt = function (stmt, context) { return stmt; };\n        /**\n         * @param {?} stmts\n         * @param {?} context\n         * @return {?}\n         */\n        ExpressionTransformer.prototype.visitAllStatements = function (stmts, context) {\n            var _this = this;\n            return stmts.map(function (stmt) { return stmt.visitStatement(_this, context); });\n        };\n        return ExpressionTransformer;\n    }());\n    var RecursiveExpressionVisitor = (function () {\n        function RecursiveExpressionVisitor() {\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitReadVarExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitWriteVarExpr = function (expr, context) {\n            expr.value.visitExpression(this, context);\n            return expr;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitWriteKeyExpr = function (expr, context) {\n            expr.receiver.visitExpression(this, context);\n            expr.index.visitExpression(this, context);\n            expr.value.visitExpression(this, context);\n            return expr;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitWritePropExpr = function (expr, context) {\n            expr.receiver.visitExpression(this, context);\n            expr.value.visitExpression(this, context);\n            return expr;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitInvokeMethodExpr = function (ast, context) {\n            ast.receiver.visitExpression(this, context);\n            this.visitAllExpressions(ast.args, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitInvokeFunctionExpr = function (ast, context) {\n            ast.fn.visitExpression(this, context);\n            this.visitAllExpressions(ast.args, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitInstantiateExpr = function (ast, context) {\n            ast.classExpr.visitExpression(this, context);\n            this.visitAllExpressions(ast.args, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitLiteralExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitExternalExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitConditionalExpr = function (ast, context) {\n            ast.condition.visitExpression(this, context);\n            ast.trueCase.visitExpression(this, context);\n            ast.falseCase.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitNotExpr = function (ast, context) {\n            ast.condition.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitCastExpr = function (ast, context) {\n            ast.value.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitFunctionExpr = function (ast, context) { return ast; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitBinaryOperatorExpr = function (ast, context) {\n            ast.lhs.visitExpression(this, context);\n            ast.rhs.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitReadPropExpr = function (ast, context) {\n            ast.receiver.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitReadKeyExpr = function (ast, context) {\n            ast.receiver.visitExpression(this, context);\n            ast.index.visitExpression(this, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitLiteralArrayExpr = function (ast, context) {\n            this.visitAllExpressions(ast.entries, context);\n            return ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitLiteralMapExpr = function (ast, context) {\n            var _this = this;\n            ast.entries.forEach(function (entry) { return entry.value.visitExpression(_this, context); });\n            return ast;\n        };\n        /**\n         * @param {?} exprs\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitAllExpressions = function (exprs, context) {\n            var _this = this;\n            exprs.forEach(function (expr) { return expr.visitExpression(_this, context); });\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitDeclareVarStmt = function (stmt, context) {\n            stmt.value.visitExpression(this, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) {\n            // Don't descend into nested functions\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitExpressionStmt = function (stmt, context) {\n            stmt.expr.visitExpression(this, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitReturnStmt = function (stmt, context) {\n            stmt.value.visitExpression(this, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitDeclareClassStmt = function (stmt, context) {\n            // Don't descend into nested functions\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitIfStmt = function (stmt, context) {\n            stmt.condition.visitExpression(this, context);\n            this.visitAllStatements(stmt.trueCase, context);\n            this.visitAllStatements(stmt.falseCase, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitTryCatchStmt = function (stmt, context) {\n            this.visitAllStatements(stmt.bodyStmts, context);\n            this.visitAllStatements(stmt.catchStmts, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitThrowStmt = function (stmt, context) {\n            stmt.error.visitExpression(this, context);\n            return stmt;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitCommentStmt = function (stmt, context) { return stmt; };\n        /**\n         * @param {?} stmts\n         * @param {?} context\n         * @return {?}\n         */\n        RecursiveExpressionVisitor.prototype.visitAllStatements = function (stmts, context) {\n            var _this = this;\n            stmts.forEach(function (stmt) { return stmt.visitStatement(_this, context); });\n        };\n        return RecursiveExpressionVisitor;\n    }());\n    /**\n     * @param {?} varName\n     * @param {?} newValue\n     * @param {?} expression\n     * @return {?}\n     */\n    function replaceVarInExpression(varName, newValue, expression) {\n        var /** @type {?} */ transformer = new _ReplaceVariableTransformer(varName, newValue);\n        return expression.visitExpression(transformer, null);\n    }\n    var _ReplaceVariableTransformer = (function (_super) {\n        __extends$20(_ReplaceVariableTransformer, _super);\n        /**\n         * @param {?} _varName\n         * @param {?} _newValue\n         */\n        function _ReplaceVariableTransformer(_varName, _newValue) {\n            _super.call(this);\n            this._varName = _varName;\n            this._newValue = _newValue;\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _ReplaceVariableTransformer.prototype.visitReadVarExpr = function (ast, context) {\n            return ast.name == this._varName ? this._newValue : ast;\n        };\n        return _ReplaceVariableTransformer;\n    }(ExpressionTransformer));\n    /**\n     * @param {?} stmts\n     * @return {?}\n     */\n    function findReadVarNames(stmts) {\n        var /** @type {?} */ finder = new _VariableFinder();\n        finder.visitAllStatements(stmts, null);\n        return finder.varNames;\n    }\n    var _VariableFinder = (function (_super) {\n        __extends$20(_VariableFinder, _super);\n        function _VariableFinder() {\n            _super.apply(this, arguments);\n            this.varNames = new Set();\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _VariableFinder.prototype.visitReadVarExpr = function (ast, context) {\n            this.varNames.add(ast.name);\n            return null;\n        };\n        return _VariableFinder;\n    }(RecursiveExpressionVisitor));\n    /**\n     * @param {?} name\n     * @param {?=} type\n     * @return {?}\n     */\n    function variable(name, type) {\n        if (type === void 0) { type = null; }\n        return new ReadVarExpr(name, type);\n    }\n    /**\n     * @param {?} id\n     * @param {?=} typeParams\n     * @return {?}\n     */\n    function importExpr(id, typeParams) {\n        if (typeParams === void 0) { typeParams = null; }\n        return new ExternalExpr(id, null, typeParams);\n    }\n    /**\n     * @param {?} id\n     * @param {?=} typeParams\n     * @param {?=} typeModifiers\n     * @return {?}\n     */\n    function importType(id, typeParams, typeModifiers) {\n        if (typeParams === void 0) { typeParams = null; }\n        if (typeModifiers === void 0) { typeModifiers = null; }\n        return isPresent(id) ? expressionType(importExpr(id), typeParams, typeModifiers) : null;\n    }\n    /**\n     * @param {?} expr\n     * @param {?=} typeParams\n     * @param {?=} typeModifiers\n     * @return {?}\n     */\n    function expressionType(expr, typeParams, typeModifiers) {\n        if (typeParams === void 0) { typeParams = null; }\n        if (typeModifiers === void 0) { typeModifiers = null; }\n        return isPresent(expr) ? new ExpressionType(expr, typeParams, typeModifiers) : null;\n    }\n    /**\n     * @param {?} values\n     * @param {?=} type\n     * @return {?}\n     */\n    function literalArr(values, type) {\n        if (type === void 0) { type = null; }\n        return new LiteralArrayExpr(values, type);\n    }\n    /**\n     * @param {?} values\n     * @param {?=} type\n     * @param {?=} quoted\n     * @return {?}\n     */\n    function literalMap(values, type, quoted) {\n        if (type === void 0) { type = null; }\n        if (quoted === void 0) { quoted = false; }\n        return new LiteralMapExpr(values.map(function (entry) { return new LiteralMapEntry(entry[0], entry[1], quoted); }), type);\n    }\n    /**\n     * @param {?} expr\n     * @return {?}\n     */\n    function not(expr) {\n        return new NotExpr(expr);\n    }\n    /**\n     * @param {?} params\n     * @param {?} body\n     * @param {?=} type\n     * @return {?}\n     */\n    function fn(params, body, type) {\n        if (type === void 0) { type = null; }\n        return new FunctionExpr(params, body, type);\n    }\n    /**\n     * @param {?} value\n     * @param {?=} type\n     * @return {?}\n     */\n    function literal(value, type) {\n        if (type === void 0) { type = null; }\n        return new LiteralExpr(value, type);\n    }\n\n    var CheckBindingField = (function () {\n        /**\n         * @param {?} expression\n         * @param {?} bindingId\n         */\n        function CheckBindingField(expression, bindingId) {\n            this.expression = expression;\n            this.bindingId = bindingId;\n        }\n        return CheckBindingField;\n    }());\n    /**\n     * @param {?} builder\n     * @return {?}\n     */\n    function createCheckBindingField(builder) {\n        var /** @type {?} */ bindingId = \"\" + builder.fields.length;\n        var /** @type {?} */ fieldExpr = createBindFieldExpr(bindingId);\n        // private is fine here as no child view will reference the cached value...\n        builder.fields.push(new ClassField(fieldExpr.name, null, [StmtModifier.Private]));\n        builder.ctorStmts.push(THIS_EXPR.prop(fieldExpr.name)\n            .set(importExpr(createIdentifier(Identifiers.UNINITIALIZED)))\n            .toStmt());\n        return new CheckBindingField(fieldExpr, bindingId);\n    }\n    /**\n     * @param {?} evalResult\n     * @param {?} fieldExpr\n     * @param {?} throwOnChangeVar\n     * @param {?} actions\n     * @return {?}\n     */\n    function createCheckBindingStmt(evalResult, fieldExpr, throwOnChangeVar, actions) {\n        var /** @type {?} */ condition = importExpr(createIdentifier(Identifiers.checkBinding)).callFn([\n            throwOnChangeVar, fieldExpr, evalResult.currValExpr\n        ]);\n        if (evalResult.forceUpdate) {\n            condition = evalResult.forceUpdate.or(condition);\n        }\n        return evalResult.stmts.concat([\n            new IfStmt(condition, actions.concat([(THIS_EXPR.prop(fieldExpr.name).set(evalResult.currValExpr).toStmt())\n            ]))\n        ]);\n    }\n    /**\n     * @param {?} bindingId\n     * @return {?}\n     */\n    function createBindFieldExpr(bindingId) {\n        return THIS_EXPR.prop(\"_expr_\" + bindingId);\n    }\n\n    /**\n     * @param {?} token\n     * @return {?}\n     */\n    function createDiTokenExpression(token) {\n        if (isPresent(token.value)) {\n            return literal(token.value);\n        }\n        else {\n            return importExpr(token.identifier);\n        }\n    }\n    /**\n     * @param {?} values\n     * @return {?}\n     */\n    function createInlineArray(values) {\n        if (values.length === 0) {\n            return importExpr(createIdentifier(Identifiers.EMPTY_INLINE_ARRAY));\n        }\n        var /** @type {?} */ log2 = Math.log(values.length) / Math.log(2);\n        var /** @type {?} */ index = Math.ceil(log2);\n        var /** @type {?} */ identifierSpec = index < Identifiers.inlineArrays.length ? Identifiers.inlineArrays[index] :\n            Identifiers.InlineArrayDynamic;\n        var /** @type {?} */ identifier = createIdentifier(identifierSpec);\n        return importExpr(identifier).instantiate([(literal(values.length))\n        ].concat(values));\n    }\n    /**\n     * @param {?} fn\n     * @param {?} argCount\n     * @param {?} pureProxyProp\n     * @param {?} builder\n     * @return {?}\n     */\n    function createPureProxy(fn, argCount, pureProxyProp, builder) {\n        builder.fields.push(new ClassField(pureProxyProp.name, null));\n        var /** @type {?} */ pureProxyId = argCount < Identifiers.pureProxies.length ? Identifiers.pureProxies[argCount] : null;\n        if (!pureProxyId) {\n            throw new Error(\"Unsupported number of argument for pure functions: \" + argCount);\n        }\n        builder.ctorStmts.push(THIS_EXPR.prop(pureProxyProp.name)\n            .set(importExpr(createIdentifier(pureProxyId)).callFn([fn]))\n            .toStmt());\n    }\n    /**\n     * @param {?} enumType\n     * @param {?} enumValue\n     * @return {?}\n     */\n    function createEnumExpression(enumType, enumValue) {\n        var /** @type {?} */ enumName = Object.keys(enumType.runtime).find(function (propName) { return enumType.runtime[propName] === enumValue; });\n        if (!enumName) {\n            throw new Error(\"Unknown enum value \" + enumValue + \" in \" + enumType.name);\n        }\n        return importExpr(createEnumIdentifier(enumType, enumName));\n    }\n\n    var /** @type {?} */ VAL_UNWRAPPER_VAR = variable(\"valUnwrapper\");\n    var EventHandlerVars = (function () {\n        function EventHandlerVars() {\n        }\n        EventHandlerVars.event = variable('$event');\n        return EventHandlerVars;\n    }());\n    var ConvertPropertyBindingResult = (function () {\n        /**\n         * @param {?} stmts\n         * @param {?} currValExpr\n         * @param {?} forceUpdate\n         */\n        function ConvertPropertyBindingResult(stmts, currValExpr, forceUpdate) {\n            this.stmts = stmts;\n            this.currValExpr = currValExpr;\n            this.forceUpdate = forceUpdate;\n        }\n        return ConvertPropertyBindingResult;\n    }());\n    /**\n     * Converts the given expression AST into an executable output AST, assuming the expression is\n     * used in a property binding.\n     * @param {?} builder\n     * @param {?} nameResolver\n     * @param {?} implicitReceiver\n     * @param {?} expression\n     * @param {?} bindingId\n     * @return {?}\n     */\n    function convertPropertyBinding(builder, nameResolver, implicitReceiver, expression, bindingId) {\n        var /** @type {?} */ currValExpr = createCurrValueExpr(bindingId);\n        var /** @type {?} */ stmts = [];\n        if (!nameResolver) {\n            nameResolver = new DefaultNameResolver();\n        }\n        var /** @type {?} */ visitor = new _AstToIrVisitor(builder, nameResolver, implicitReceiver, VAL_UNWRAPPER_VAR, bindingId, false);\n        var /** @type {?} */ outputExpr = expression.visit(visitor, _Mode.Expression);\n        if (!outputExpr) {\n            // e.g. an empty expression was given\n            return null;\n        }\n        if (visitor.temporaryCount) {\n            for (var /** @type {?} */ i = 0; i < visitor.temporaryCount; i++) {\n                stmts.push(temporaryDeclaration(bindingId, i));\n            }\n        }\n        if (visitor.needsValueUnwrapper) {\n            var /** @type {?} */ initValueUnwrapperStmt = VAL_UNWRAPPER_VAR.callMethod('reset', []).toStmt();\n            stmts.push(initValueUnwrapperStmt);\n        }\n        stmts.push(currValExpr.set(outputExpr).toDeclStmt(null, [StmtModifier.Final]));\n        if (visitor.needsValueUnwrapper) {\n            return new ConvertPropertyBindingResult(stmts, currValExpr, VAL_UNWRAPPER_VAR.prop('hasWrappedValue'));\n        }\n        else {\n            return new ConvertPropertyBindingResult(stmts, currValExpr, null);\n        }\n    }\n    var ConvertActionBindingResult = (function () {\n        /**\n         * @param {?} stmts\n         * @param {?} preventDefault\n         */\n        function ConvertActionBindingResult(stmts, preventDefault) {\n            this.stmts = stmts;\n            this.preventDefault = preventDefault;\n        }\n        return ConvertActionBindingResult;\n    }());\n    /**\n     * Converts the given expression AST into an executable output AST, assuming the expression is\n     * used in an action binding (e.g. an event handler).\n     * @param {?} builder\n     * @param {?} nameResolver\n     * @param {?} implicitReceiver\n     * @param {?} action\n     * @param {?} bindingId\n     * @return {?}\n     */\n    function convertActionBinding(builder, nameResolver, implicitReceiver, action, bindingId) {\n        if (!nameResolver) {\n            nameResolver = new DefaultNameResolver();\n        }\n        var /** @type {?} */ visitor = new _AstToIrVisitor(builder, nameResolver, implicitReceiver, null, bindingId, true);\n        var /** @type {?} */ actionStmts = [];\n        flattenStatements(action.visit(visitor, _Mode.Statement), actionStmts);\n        prependTemporaryDecls(visitor.temporaryCount, bindingId, actionStmts);\n        var /** @type {?} */ lastIndex = actionStmts.length - 1;\n        var /** @type {?} */ preventDefaultVar = null;\n        if (lastIndex >= 0) {\n            var /** @type {?} */ lastStatement = actionStmts[lastIndex];\n            var /** @type {?} */ returnExpr = convertStmtIntoExpression(lastStatement);\n            if (returnExpr) {\n                // Note: We need to cast the result of the method call to dynamic,\n                // as it might be a void method!\n                preventDefaultVar = createPreventDefaultVar(bindingId);\n                actionStmts[lastIndex] =\n                    preventDefaultVar.set(returnExpr.cast(DYNAMIC_TYPE).notIdentical(literal(false)))\n                        .toDeclStmt(null, [StmtModifier.Final]);\n            }\n        }\n        return new ConvertActionBindingResult(actionStmts, preventDefaultVar);\n    }\n    /**\n     * Creates variables that are shared by multiple calls to `convertActionBinding` /\n     * `convertPropertyBinding`\n     * @param {?} stmts\n     * @return {?}\n     */\n    function createSharedBindingVariablesIfNeeded(stmts) {\n        var /** @type {?} */ unwrapperStmts = [];\n        var /** @type {?} */ readVars = findReadVarNames(stmts);\n        if (readVars.has(VAL_UNWRAPPER_VAR.name)) {\n            unwrapperStmts.push(VAL_UNWRAPPER_VAR\n                .set(importExpr(createIdentifier(Identifiers.ValueUnwrapper)).instantiate([]))\n                .toDeclStmt(null, [StmtModifier.Final]));\n        }\n        return unwrapperStmts;\n    }\n    /**\n     * @param {?} bindingId\n     * @param {?} temporaryNumber\n     * @return {?}\n     */\n    function temporaryName(bindingId, temporaryNumber) {\n        return \"tmp_\" + bindingId + \"_\" + temporaryNumber;\n    }\n    /**\n     * @param {?} bindingId\n     * @param {?} temporaryNumber\n     * @return {?}\n     */\n    function temporaryDeclaration(bindingId, temporaryNumber) {\n        return new DeclareVarStmt(temporaryName(bindingId, temporaryNumber), NULL_EXPR);\n    }\n    /**\n     * @param {?} temporaryCount\n     * @param {?} bindingId\n     * @param {?} statements\n     * @return {?}\n     */\n    function prependTemporaryDecls(temporaryCount, bindingId, statements) {\n        for (var /** @type {?} */ i = temporaryCount - 1; i >= 0; i--) {\n            statements.unshift(temporaryDeclaration(bindingId, i));\n        }\n    }\n    var _Mode = {};\n    _Mode.Statement = 0;\n    _Mode.Expression = 1;\n    _Mode[_Mode.Statement] = \"Statement\";\n    _Mode[_Mode.Expression] = \"Expression\";\n    /**\n     * @param {?} mode\n     * @param {?} ast\n     * @return {?}\n     */\n    function ensureStatementMode(mode, ast) {\n        if (mode !== _Mode.Statement) {\n            throw new Error(\"Expected a statement, but saw \" + ast);\n        }\n    }\n    /**\n     * @param {?} mode\n     * @param {?} ast\n     * @return {?}\n     */\n    function ensureExpressionMode(mode, ast) {\n        if (mode !== _Mode.Expression) {\n            throw new Error(\"Expected an expression, but saw \" + ast);\n        }\n    }\n    /**\n     * @param {?} mode\n     * @param {?} expr\n     * @return {?}\n     */\n    function convertToStatementIfNeeded(mode, expr) {\n        if (mode === _Mode.Statement) {\n            return expr.toStmt();\n        }\n        else {\n            return expr;\n        }\n    }\n    var _AstToIrVisitor = (function () {\n        /**\n         * @param {?} _builder\n         * @param {?} _nameResolver\n         * @param {?} _implicitReceiver\n         * @param {?} _valueUnwrapper\n         * @param {?} bindingId\n         * @param {?} isAction\n         */\n        function _AstToIrVisitor(_builder, _nameResolver, _implicitReceiver, _valueUnwrapper, bindingId, isAction) {\n            this._builder = _builder;\n            this._nameResolver = _nameResolver;\n            this._implicitReceiver = _implicitReceiver;\n            this._valueUnwrapper = _valueUnwrapper;\n            this.bindingId = bindingId;\n            this.isAction = isAction;\n            this._nodeMap = new Map();\n            this._resultMap = new Map();\n            this._currentTemporary = 0;\n            this.needsValueUnwrapper = false;\n            this.temporaryCount = 0;\n        }\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitBinary = function (ast, mode) {\n            var /** @type {?} */ op;\n            switch (ast.operation) {\n                case '+':\n                    op = BinaryOperator.Plus;\n                    break;\n                case '-':\n                    op = BinaryOperator.Minus;\n                    break;\n                case '*':\n                    op = BinaryOperator.Multiply;\n                    break;\n                case '/':\n                    op = BinaryOperator.Divide;\n                    break;\n                case '%':\n                    op = BinaryOperator.Modulo;\n                    break;\n                case '&&':\n                    op = BinaryOperator.And;\n                    break;\n                case '||':\n                    op = BinaryOperator.Or;\n                    break;\n                case '==':\n                    op = BinaryOperator.Equals;\n                    break;\n                case '!=':\n                    op = BinaryOperator.NotEquals;\n                    break;\n                case '===':\n                    op = BinaryOperator.Identical;\n                    break;\n                case '!==':\n                    op = BinaryOperator.NotIdentical;\n                    break;\n                case '<':\n                    op = BinaryOperator.Lower;\n                    break;\n                case '>':\n                    op = BinaryOperator.Bigger;\n                    break;\n                case '<=':\n                    op = BinaryOperator.LowerEquals;\n                    break;\n                case '>=':\n                    op = BinaryOperator.BiggerEquals;\n                    break;\n                default:\n                    throw new Error(\"Unsupported operation \" + ast.operation);\n            }\n            return convertToStatementIfNeeded(mode, new BinaryOperatorExpr(op, this.visit(ast.left, _Mode.Expression), this.visit(ast.right, _Mode.Expression)));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitChain = function (ast, mode) {\n            ensureStatementMode(mode, ast);\n            return this.visitAll(ast.expressions, mode);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitConditional = function (ast, mode) {\n            var /** @type {?} */ value = this.visit(ast.condition, _Mode.Expression);\n            return convertToStatementIfNeeded(mode, value.conditional(this.visit(ast.trueExp, _Mode.Expression), this.visit(ast.falseExp, _Mode.Expression)));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitPipe = function (ast, mode) {\n            var /** @type {?} */ input = this.visit(ast.exp, _Mode.Expression);\n            var /** @type {?} */ args = this.visitAll(ast.args, _Mode.Expression);\n            var /** @type {?} */ value = this._nameResolver.callPipe(ast.name, input, args);\n            if (!value) {\n                throw new Error(\"Illegal state: Pipe \" + ast.name + \" is not allowed here!\");\n            }\n            this.needsValueUnwrapper = true;\n            return convertToStatementIfNeeded(mode, this._valueUnwrapper.callMethod('unwrap', [value]));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitFunctionCall = function (ast, mode) {\n            return convertToStatementIfNeeded(mode, this.visit(ast.target, _Mode.Expression).callFn(this.visitAll(ast.args, _Mode.Expression)));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitImplicitReceiver = function (ast, mode) {\n            ensureExpressionMode(mode, ast);\n            return this._implicitReceiver;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitInterpolation = function (ast, mode) {\n            ensureExpressionMode(mode, ast);\n            var /** @type {?} */ args = [literal(ast.expressions.length)];\n            for (var /** @type {?} */ i = 0; i < ast.strings.length - 1; i++) {\n                args.push(literal(ast.strings[i]));\n                args.push(this.visit(ast.expressions[i], _Mode.Expression));\n            }\n            args.push(literal(ast.strings[ast.strings.length - 1]));\n            return ast.expressions.length <= 9 ?\n                importExpr(createIdentifier(Identifiers.inlineInterpolate)).callFn(args) :\n                importExpr(createIdentifier(Identifiers.interpolate)).callFn([\n                    args[0], literalArr(args.slice(1))\n                ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitKeyedRead = function (ast, mode) {\n            var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n            if (leftMostSafe) {\n                return this.convertSafeAccess(ast, leftMostSafe, mode);\n            }\n            else {\n                return convertToStatementIfNeeded(mode, this.visit(ast.obj, _Mode.Expression).key(this.visit(ast.key, _Mode.Expression)));\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitKeyedWrite = function (ast, mode) {\n            var /** @type {?} */ obj = this.visit(ast.obj, _Mode.Expression);\n            var /** @type {?} */ key = this.visit(ast.key, _Mode.Expression);\n            var /** @type {?} */ value = this.visit(ast.value, _Mode.Expression);\n            return convertToStatementIfNeeded(mode, obj.key(key).set(value));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitLiteralArray = function (ast, mode) {\n            var /** @type {?} */ parts = this.visitAll(ast.expressions, mode);\n            var /** @type {?} */ literalArr$$ = this.isAction ? literalArr(parts) : createCachedLiteralArray(this._builder, parts);\n            return convertToStatementIfNeeded(mode, literalArr$$);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitLiteralMap = function (ast, mode) {\n            var /** @type {?} */ parts = [];\n            for (var /** @type {?} */ i = 0; i < ast.keys.length; i++) {\n                parts.push([ast.keys[i], this.visit(ast.values[i], _Mode.Expression)]);\n            }\n            var /** @type {?} */ literalMap$$ = this.isAction ? literalMap(parts) : createCachedLiteralMap(this._builder, parts);\n            return convertToStatementIfNeeded(mode, literalMap$$);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitLiteralPrimitive = function (ast, mode) {\n            return convertToStatementIfNeeded(mode, literal(ast.value));\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype._getLocal = function (name) {\n            if (this.isAction && name == EventHandlerVars.event.name) {\n                return EventHandlerVars.event;\n            }\n            return this._nameResolver.getLocal(name);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitMethodCall = function (ast, mode) {\n            var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n            if (leftMostSafe) {\n                return this.convertSafeAccess(ast, leftMostSafe, mode);\n            }\n            else {\n                var /** @type {?} */ args = this.visitAll(ast.args, _Mode.Expression);\n                var /** @type {?} */ result = null;\n                var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n                if (receiver === this._implicitReceiver) {\n                    var /** @type {?} */ varExpr = this._getLocal(ast.name);\n                    if (varExpr) {\n                        result = varExpr.callFn(args);\n                    }\n                }\n                if (isBlank(result)) {\n                    result = receiver.callMethod(ast.name, args);\n                }\n                return convertToStatementIfNeeded(mode, result);\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitPrefixNot = function (ast, mode) {\n            return convertToStatementIfNeeded(mode, not(this.visit(ast.expression, _Mode.Expression)));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitPropertyRead = function (ast, mode) {\n            var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n            if (leftMostSafe) {\n                return this.convertSafeAccess(ast, leftMostSafe, mode);\n            }\n            else {\n                var /** @type {?} */ result = null;\n                var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n                if (receiver === this._implicitReceiver) {\n                    result = this._getLocal(ast.name);\n                }\n                if (isBlank(result)) {\n                    result = receiver.prop(ast.name);\n                }\n                return convertToStatementIfNeeded(mode, result);\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitPropertyWrite = function (ast, mode) {\n            var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n            if (receiver === this._implicitReceiver) {\n                var /** @type {?} */ varExpr = this._getLocal(ast.name);\n                if (varExpr) {\n                    throw new Error('Cannot assign to a reference or variable!');\n                }\n            }\n            return convertToStatementIfNeeded(mode, receiver.prop(ast.name).set(this.visit(ast.value, _Mode.Expression)));\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitSafePropertyRead = function (ast, mode) {\n            return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitSafeMethodCall = function (ast, mode) {\n            return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);\n        };\n        /**\n         * @param {?} asts\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitAll = function (asts, mode) {\n            var _this = this;\n            return asts.map(function (ast) { return _this.visit(ast, mode); });\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visitQuote = function (ast, mode) {\n            throw new Error('Quotes are not supported for evaluation!');\n        };\n        /**\n         * @param {?} ast\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.visit = function (ast, mode) {\n            var /** @type {?} */ result = this._resultMap.get(ast);\n            if (result)\n                return result;\n            return (this._nodeMap.get(ast) || ast).visit(this, mode);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} leftMostSafe\n         * @param {?} mode\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.convertSafeAccess = function (ast, leftMostSafe, mode) {\n            // If the expression contains a safe access node on the left it needs to be converted to\n            // an expression that guards the access to the member by checking the receiver for blank. As\n            // execution proceeds from left to right, the left most part of the expression must be guarded\n            // first but, because member access is left associative, the right side of the expression is at\n            // the top of the AST. The desired result requires lifting a copy of the the left part of the\n            // expression up to test it for blank before generating the unguarded version.\n            // Consider, for example the following expression: a?.b.c?.d.e\n            // This results in the ast:\n            //         .\n            //        / \\\n            //       ?.   e\n            //      /  \\\n            //     .    d\n            //    / \\\n            //   ?.  c\n            //  /  \\\n            // a    b\n            // The following tree should be generated:\n            //\n            //        /---- ? ----\\\n            //       /      |      \\\n            //     a   /--- ? ---\\  null\n            //        /     |     \\\n            //       .      .     null\n            //      / \\    / \\\n            //     .  c   .   e\n            //    / \\    / \\\n            //   a   b  ,   d\n            //         / \\\n            //        .   c\n            //       / \\\n            //      a   b\n            //\n            // Notice that the first guard condition is the left hand of the left most safe access node\n            // which comes in as leftMostSafe to this routine.\n            var /** @type {?} */ guardedExpression = this.visit(leftMostSafe.receiver, _Mode.Expression);\n            var /** @type {?} */ temporary;\n            if (this.needsTemporary(leftMostSafe.receiver)) {\n                // If the expression has method calls or pipes then we need to save the result into a\n                // temporary variable to avoid calling stateful or impure code more than once.\n                temporary = this.allocateTemporary();\n                // Preserve the result in the temporary variable\n                guardedExpression = temporary.set(guardedExpression);\n                // Ensure all further references to the guarded expression refer to the temporary instead.\n                this._resultMap.set(leftMostSafe.receiver, temporary);\n            }\n            var /** @type {?} */ condition = guardedExpression.isBlank();\n            // Convert the ast to an unguarded access to the receiver's member. The map will substitute\n            // leftMostNode with its unguarded version in the call to `this.visit()`.\n            if (leftMostSafe instanceof SafeMethodCall) {\n                this._nodeMap.set(leftMostSafe, new MethodCall(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name, leftMostSafe.args));\n            }\n            else {\n                this._nodeMap.set(leftMostSafe, new PropertyRead(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name));\n            }\n            // Recursively convert the node now without the guarded member access.\n            var /** @type {?} */ access = this.visit(ast, _Mode.Expression);\n            // Remove the mapping. This is not strictly required as the converter only traverses each node\n            // once but is safer if the conversion is changed to traverse the nodes more than once.\n            this._nodeMap.delete(leftMostSafe);\n            // If we allcoated a temporary, release it.\n            if (temporary) {\n                this.releaseTemporary(temporary);\n            }\n            // Produce the conditional\n            return convertToStatementIfNeeded(mode, condition.conditional(literal(null), access));\n        };\n        /**\n         * @param {?} ast\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.leftMostSafeNode = function (ast) {\n            var _this = this;\n            var /** @type {?} */ visit = function (visitor, ast) {\n                return (_this._nodeMap.get(ast) || ast).visit(visitor);\n            };\n            return ast.visit({\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitBinary: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitChain: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitConditional: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitFunctionCall: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitImplicitReceiver: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitInterpolation: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitKeyedRead: function (ast) { return visit(this, ast.obj); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitKeyedWrite: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralArray: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralMap: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralPrimitive: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitMethodCall: function (ast) { return visit(this, ast.receiver); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPipe: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPrefixNot: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPropertyRead: function (ast) { return visit(this, ast.receiver); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPropertyWrite: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitQuote: function (ast) { return null; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitSafeMethodCall: function (ast) { return visit(this, ast.receiver) || ast; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitSafePropertyRead: function (ast) {\n                    return visit(this, ast.receiver) || ast;\n                }\n            });\n        };\n        /**\n         * @param {?} ast\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.needsTemporary = function (ast) {\n            var _this = this;\n            var /** @type {?} */ visit = function (visitor, ast) {\n                return ast && (_this._nodeMap.get(ast) || ast).visit(visitor);\n            };\n            var /** @type {?} */ visitSome = function (visitor, ast) {\n                return ast.some(function (ast) { return visit(visitor, ast); });\n            };\n            return ast.visit({\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitBinary: function (ast) { return visit(this, ast.left) || visit(this, ast.right); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitChain: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitConditional: function (ast) {\n                    return visit(this, ast.condition) || visit(this, ast.trueExp) ||\n                        visit(this, ast.falseExp);\n                },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitFunctionCall: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitImplicitReceiver: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitInterpolation: function (ast) { return visitSome(this, ast.expressions); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitKeyedRead: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitKeyedWrite: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralArray: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralMap: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitLiteralPrimitive: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitMethodCall: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPipe: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPrefixNot: function (ast) { return visit(this, ast.expression); },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPropertyRead: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitPropertyWrite: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitQuote: function (ast) { return false; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitSafeMethodCall: function (ast) { return true; },\n                /**\n                 * @param {?} ast\n                 * @return {?}\n                 */\n                visitSafePropertyRead: function (ast) { return false; }\n            });\n        };\n        /**\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.allocateTemporary = function () {\n            var /** @type {?} */ tempNumber = this._currentTemporary++;\n            this.temporaryCount = Math.max(this._currentTemporary, this.temporaryCount);\n            return new ReadVarExpr(temporaryName(this.bindingId, tempNumber));\n        };\n        /**\n         * @param {?} temporary\n         * @return {?}\n         */\n        _AstToIrVisitor.prototype.releaseTemporary = function (temporary) {\n            this._currentTemporary--;\n            if (temporary.name != temporaryName(this.bindingId, this._currentTemporary)) {\n                throw new Error(\"Temporary \" + temporary.name + \" released out of order\");\n            }\n        };\n        return _AstToIrVisitor;\n    }());\n    /**\n     * @param {?} arg\n     * @param {?} output\n     * @return {?}\n     */\n    function flattenStatements(arg, output) {\n        if (Array.isArray(arg)) {\n            ((arg)).forEach(function (entry) { return flattenStatements(entry, output); });\n        }\n        else {\n            output.push(arg);\n        }\n    }\n    /**\n     * @param {?} builder\n     * @param {?} values\n     * @return {?}\n     */\n    function createCachedLiteralArray(builder, values) {\n        if (values.length === 0) {\n            return importExpr(createIdentifier(Identifiers.EMPTY_ARRAY));\n        }\n        var /** @type {?} */ proxyExpr = THIS_EXPR.prop(\"_arr_\" + builder.fields.length);\n        var /** @type {?} */ proxyParams = [];\n        var /** @type {?} */ proxyReturnEntries = [];\n        for (var /** @type {?} */ i = 0; i < values.length; i++) {\n            var /** @type {?} */ paramName = \"p\" + i;\n            proxyParams.push(new FnParam(paramName));\n            proxyReturnEntries.push(variable(paramName));\n        }\n        createPureProxy(fn(proxyParams, [new ReturnStatement(literalArr(proxyReturnEntries))], new ArrayType(DYNAMIC_TYPE)), values.length, proxyExpr, builder);\n        return proxyExpr.callFn(values);\n    }\n    /**\n     * @param {?} builder\n     * @param {?} entries\n     * @return {?}\n     */\n    function createCachedLiteralMap(builder, entries) {\n        if (entries.length === 0) {\n            return importExpr(createIdentifier(Identifiers.EMPTY_MAP));\n        }\n        var /** @type {?} */ proxyExpr = THIS_EXPR.prop(\"_map_\" + builder.fields.length);\n        var /** @type {?} */ proxyParams = [];\n        var /** @type {?} */ proxyReturnEntries = [];\n        var /** @type {?} */ values = [];\n        for (var /** @type {?} */ i = 0; i < entries.length; i++) {\n            var /** @type {?} */ paramName = \"p\" + i;\n            proxyParams.push(new FnParam(paramName));\n            proxyReturnEntries.push([entries[i][0], variable(paramName)]);\n            values.push(/** @type {?} */ (entries[i][1]));\n        }\n        createPureProxy(fn(proxyParams, [new ReturnStatement(literalMap(proxyReturnEntries))], new MapType(DYNAMIC_TYPE)), entries.length, proxyExpr, builder);\n        return proxyExpr.callFn(values);\n    }\n    var DefaultNameResolver = (function () {\n        function DefaultNameResolver() {\n        }\n        /**\n         * @param {?} name\n         * @param {?} input\n         * @param {?} args\n         * @return {?}\n         */\n        DefaultNameResolver.prototype.callPipe = function (name, input, args) { return null; };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        DefaultNameResolver.prototype.getLocal = function (name) { return null; };\n        return DefaultNameResolver;\n    }());\n    /**\n     * @param {?} bindingId\n     * @return {?}\n     */\n    function createCurrValueExpr(bindingId) {\n        return variable(\"currVal_\" + bindingId); // fix syntax highlighting: `\n    }\n    /**\n     * @param {?} bindingId\n     * @return {?}\n     */\n    function createPreventDefaultVar(bindingId) {\n        return variable(\"pd_\" + bindingId);\n    }\n    /**\n     * @param {?} stmt\n     * @return {?}\n     */\n    function convertStmtIntoExpression(stmt) {\n        if (stmt instanceof ExpressionStatement) {\n            return stmt.expr;\n        }\n        else if (stmt instanceof ReturnStatement) {\n            return stmt.value;\n        }\n        return null;\n    }\n\n    /**\n     * @param {?} view\n     * @param {?} boundProp\n     * @param {?} renderElement\n     * @param {?} renderValue\n     * @param {?} logBindingUpdate\n     * @param {?=} securityContextExpression\n     * @return {?}\n     */\n    function writeToRenderer(view, boundProp, renderElement, renderValue, logBindingUpdate, securityContextExpression) {\n        var /** @type {?} */ updateStmts = [];\n        var /** @type {?} */ renderer = view.prop('renderer');\n        renderValue = sanitizedValue(view, boundProp, renderValue, securityContextExpression);\n        switch (boundProp.type) {\n            case PropertyBindingType.Property:\n                if (logBindingUpdate) {\n                    updateStmts.push(importExpr(createIdentifier(Identifiers.setBindingDebugInfo))\n                        .callFn([renderer, renderElement, literal(boundProp.name), renderValue])\n                        .toStmt());\n                }\n                updateStmts.push(renderer\n                    .callMethod('setElementProperty', [renderElement, literal(boundProp.name), renderValue])\n                    .toStmt());\n                break;\n            case PropertyBindingType.Attribute:\n                renderValue =\n                    renderValue.isBlank().conditional(NULL_EXPR, renderValue.callMethod('toString', []));\n                updateStmts.push(renderer\n                    .callMethod('setElementAttribute', [renderElement, literal(boundProp.name), renderValue])\n                    .toStmt());\n                break;\n            case PropertyBindingType.Class:\n                updateStmts.push(renderer\n                    .callMethod('setElementClass', [renderElement, literal(boundProp.name), renderValue])\n                    .toStmt());\n                break;\n            case PropertyBindingType.Style:\n                var /** @type {?} */ strValue = renderValue.callMethod('toString', []);\n                if (isPresent(boundProp.unit)) {\n                    strValue = strValue.plus(literal(boundProp.unit));\n                }\n                renderValue = renderValue.isBlank().conditional(NULL_EXPR, strValue);\n                updateStmts.push(renderer\n                    .callMethod('setElementStyle', [renderElement, literal(boundProp.name), renderValue])\n                    .toStmt());\n                break;\n            case PropertyBindingType.Animation:\n                throw new Error('Illegal state: Should not come here!');\n        }\n        return updateStmts;\n    }\n    /**\n     * @param {?} view\n     * @param {?} boundProp\n     * @param {?} renderValue\n     * @param {?=} securityContextExpression\n     * @return {?}\n     */\n    function sanitizedValue(view, boundProp, renderValue, securityContextExpression) {\n        if (boundProp.securityContext === _angular_core.SecurityContext.NONE) {\n            return renderValue; // No sanitization needed.\n        }\n        if (!boundProp.needsRuntimeSecurityContext) {\n            securityContextExpression =\n                createEnumExpression(Identifiers.SecurityContext, boundProp.securityContext);\n        }\n        if (!securityContextExpression) {\n            throw new Error(\"internal error, no SecurityContext given \" + boundProp.name);\n        }\n        var /** @type {?} */ ctx = view.prop('viewUtils').prop('sanitizer');\n        var /** @type {?} */ args = [securityContextExpression, renderValue];\n        return ctx.callMethod('sanitize', args);\n    }\n    /**\n     * @param {?} view\n     * @param {?} componentView\n     * @param {?} boundProp\n     * @param {?} boundOutputs\n     * @param {?} eventListener\n     * @param {?} renderElement\n     * @param {?} renderValue\n     * @param {?} lastRenderValue\n     * @return {?}\n     */\n    function triggerAnimation(view, componentView, boundProp, boundOutputs, eventListener, renderElement, renderValue, lastRenderValue) {\n        var /** @type {?} */ detachStmts = [];\n        var /** @type {?} */ updateStmts = [];\n        var /** @type {?} */ animationName = boundProp.name;\n        var /** @type {?} */ animationFnExpr = componentView.prop('componentType').prop('animations').key(literal(animationName));\n        // it's important to normalize the void value as `void` explicitly\n        // so that the styles data can be obtained from the stringmap\n        var /** @type {?} */ emptyStateValue = literal(EMPTY_STATE);\n        var /** @type {?} */ unitializedValue = importExpr(createIdentifier(Identifiers.UNINITIALIZED));\n        var /** @type {?} */ animationTransitionVar = variable('animationTransition_' + animationName);\n        updateStmts.push(animationTransitionVar\n            .set(animationFnExpr.callFn([\n            view, renderElement,\n            lastRenderValue.equals(unitializedValue).conditional(emptyStateValue, lastRenderValue),\n            renderValue.equals(unitializedValue).conditional(emptyStateValue, renderValue)\n        ]))\n            .toDeclStmt());\n        detachStmts.push(animationTransitionVar\n            .set(animationFnExpr.callFn([view, renderElement, lastRenderValue, emptyStateValue]))\n            .toDeclStmt());\n        var /** @type {?} */ registerStmts = [];\n        var /** @type {?} */ animationStartMethodExists = boundOutputs.find(function (event) { return event.isAnimation && event.name == animationName && event.phase == 'start'; });\n        if (animationStartMethodExists) {\n            registerStmts.push(animationTransitionVar\n                .callMethod('onStart', [eventListener.callMethod(BuiltinMethod.Bind, [view, literal(BoundEventAst.calcFullName(animationName, null, 'start'))])])\n                .toStmt());\n        }\n        var /** @type {?} */ animationDoneMethodExists = boundOutputs.find(function (event) { return event.isAnimation && event.name == animationName && event.phase == 'done'; });\n        if (animationDoneMethodExists) {\n            registerStmts.push(animationTransitionVar\n                .callMethod('onDone', [eventListener.callMethod(BuiltinMethod.Bind, [view, literal(BoundEventAst.calcFullName(animationName, null, 'done'))])])\n                .toStmt());\n        }\n        updateStmts.push.apply(updateStmts, registerStmts);\n        detachStmts.push.apply(detachStmts, registerStmts);\n        return { updateStmts: updateStmts, detachStmts: detachStmts };\n    }\n\n    /**\n     * Create a new class stmts based on the given data.\n     * @param {?} config\n     * @return {?}\n     */\n    function createClassStmt(config) {\n        var /** @type {?} */ parentArgs = config.parentArgs || [];\n        var /** @type {?} */ superCtorStmts = config.parent ? [SUPER_EXPR.callFn(parentArgs).toStmt()] : [];\n        var /** @type {?} */ builder = concatClassBuilderParts(Array.isArray(config.builders) ? config.builders : [config.builders]);\n        var /** @type {?} */ ctor = new ClassMethod(null, config.ctorParams || [], superCtorStmts.concat(builder.ctorStmts));\n        return new ClassStmt(config.name, config.parent, builder.fields, builder.getters, ctor, builder.methods, config.modifiers || []);\n    }\n    /**\n     * @param {?} builders\n     * @return {?}\n     */\n    function concatClassBuilderParts(builders) {\n        return {\n            fields: (_a = []).concat.apply(_a, builders.map(function (builder) { return builder.fields || []; })),\n            methods: (_b = []).concat.apply(_b, builders.map(function (builder) { return builder.methods || []; })),\n            getters: (_c = []).concat.apply(_c, builders.map(function (builder) { return builder.getters || []; })),\n            ctorStmts: (_d = []).concat.apply(_d, builders.map(function (builder) { return builder.ctorStmts || []; })),\n        };\n        var _a, _b, _c, _d;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$8 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$8 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var DirectiveWrapperCompileResult = (function () {\n        /**\n         * @param {?} statements\n         * @param {?} dirWrapperClassVar\n         */\n        function DirectiveWrapperCompileResult(statements, dirWrapperClassVar) {\n            this.statements = statements;\n            this.dirWrapperClassVar = dirWrapperClassVar;\n        }\n        return DirectiveWrapperCompileResult;\n    }());\n    var /** @type {?} */ CONTEXT_FIELD_NAME = 'context';\n    var /** @type {?} */ CHANGES_FIELD_NAME = '_changes';\n    var /** @type {?} */ CHANGED_FIELD_NAME = '_changed';\n    var /** @type {?} */ EVENT_HANDLER_FIELD_NAME = '_eventHandler';\n    var /** @type {?} */ CURR_VALUE_VAR = variable('currValue');\n    var /** @type {?} */ THROW_ON_CHANGE_VAR = variable('throwOnChange');\n    var /** @type {?} */ FORCE_UPDATE_VAR = variable('forceUpdate');\n    var /** @type {?} */ VIEW_VAR = variable('view');\n    var /** @type {?} */ COMPONENT_VIEW_VAR = variable('componentView');\n    var /** @type {?} */ RENDER_EL_VAR = variable('el');\n    var /** @type {?} */ EVENT_NAME_VAR = variable('eventName');\n    var /** @type {?} */ RESET_CHANGES_STMT = THIS_EXPR.prop(CHANGES_FIELD_NAME).set(literalMap([])).toStmt();\n    /**\n     * We generate directive wrappers to prevent code bloat when a directive is used.\n     * A directive wrapper encapsulates\n     * the dirty checking for `\\@Input`, the handling of `\\@HostListener` / `\\@HostBinding`\n     * and calling the lifecyclehooks `ngOnInit`, `ngOnChanges`, `ngDoCheck`.\n     *\n     * So far, only `\\@Input` and the lifecycle hooks have been implemented.\n     */\n    var DirectiveWrapperCompiler = (function () {\n        /**\n         * @param {?} compilerConfig\n         * @param {?} _exprParser\n         * @param {?} _schemaRegistry\n         * @param {?} _console\n         */\n        function DirectiveWrapperCompiler(compilerConfig, _exprParser, _schemaRegistry, _console) {\n            this.compilerConfig = compilerConfig;\n            this._exprParser = _exprParser;\n            this._schemaRegistry = _schemaRegistry;\n            this._console = _console;\n        }\n        /**\n         * @param {?} id\n         * @return {?}\n         */\n        DirectiveWrapperCompiler.dirWrapperClassName = function (id) {\n            return \"Wrapper_\" + identifierName(id);\n        };\n        /**\n         * @param {?} dirMeta\n         * @return {?}\n         */\n        DirectiveWrapperCompiler.prototype.compile = function (dirMeta) {\n            var /** @type {?} */ hostParseResult = parseHostBindings(dirMeta, this._exprParser, this._schemaRegistry);\n            reportParseErrors(hostParseResult.errors, this._console);\n            var /** @type {?} */ builder = new DirectiveWrapperBuilder(this.compilerConfig, dirMeta);\n            Object.keys(dirMeta.inputs).forEach(function (inputFieldName) {\n                addCheckInputMethod(inputFieldName, builder);\n            });\n            addNgDoCheckMethod(builder);\n            addCheckHostMethod(hostParseResult.hostProps, hostParseResult.hostListeners, builder);\n            addHandleEventMethod(hostParseResult.hostListeners, builder);\n            addSubscribeMethod(dirMeta, builder);\n            var /** @type {?} */ classStmt = builder.build();\n            return new DirectiveWrapperCompileResult([classStmt], classStmt.name);\n        };\n        DirectiveWrapperCompiler = __decorate$8([\n            CompilerInjectable(), \n            __metadata$8('design:paramtypes', [CompilerConfig, Parser, ElementSchemaRegistry, Console])\n        ], DirectiveWrapperCompiler);\n        return DirectiveWrapperCompiler;\n    }());\n    var DirectiveWrapperBuilder = (function () {\n        /**\n         * @param {?} compilerConfig\n         * @param {?} dirMeta\n         */\n        function DirectiveWrapperBuilder(compilerConfig, dirMeta) {\n            this.compilerConfig = compilerConfig;\n            this.dirMeta = dirMeta;\n            this.fields = [];\n            this.getters = [];\n            this.methods = [];\n            this.ctorStmts = [];\n            this.detachStmts = [];\n            this.destroyStmts = [];\n            var dirLifecycleHooks = dirMeta.type.lifecycleHooks;\n            this.genChanges = dirLifecycleHooks.indexOf(LifecycleHooks.OnChanges) !== -1 ||\n                this.compilerConfig.logBindingUpdate;\n            this.ngOnChanges = dirLifecycleHooks.indexOf(LifecycleHooks.OnChanges) !== -1;\n            this.ngOnInit = dirLifecycleHooks.indexOf(LifecycleHooks.OnInit) !== -1;\n            this.ngDoCheck = dirLifecycleHooks.indexOf(LifecycleHooks.DoCheck) !== -1;\n            this.ngOnDestroy = dirLifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1;\n            if (this.ngOnDestroy) {\n                this.destroyStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngOnDestroy', []).toStmt());\n            }\n        }\n        /**\n         * @return {?}\n         */\n        DirectiveWrapperBuilder.prototype.build = function () {\n            var /** @type {?} */ dirDepParamNames = [];\n            for (var /** @type {?} */ i = 0; i < this.dirMeta.type.diDeps.length; i++) {\n                dirDepParamNames.push(\"p\" + i);\n            }\n            var /** @type {?} */ methods = [\n                new ClassMethod('ngOnDetach', [\n                    new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n                    new FnParam(COMPONENT_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n                    new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n                ], this.detachStmts),\n                new ClassMethod('ngOnDestroy', [], this.destroyStmts),\n            ];\n            var /** @type {?} */ fields = [\n                new ClassField(EVENT_HANDLER_FIELD_NAME, FUNCTION_TYPE, [StmtModifier.Private]),\n                new ClassField(CONTEXT_FIELD_NAME, importType(this.dirMeta.type)),\n                new ClassField(CHANGED_FIELD_NAME, BOOL_TYPE, [StmtModifier.Private]),\n            ];\n            var /** @type {?} */ ctorStmts = [THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(false)).toStmt()];\n            if (this.genChanges) {\n                fields.push(new ClassField(CHANGES_FIELD_NAME, new MapType(DYNAMIC_TYPE), [StmtModifier.Private]));\n                ctorStmts.push(RESET_CHANGES_STMT);\n            }\n            ctorStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n                .set(importExpr(this.dirMeta.type)\n                .instantiate(dirDepParamNames.map(function (paramName) { return variable(paramName); })))\n                .toStmt());\n            return createClassStmt({\n                name: DirectiveWrapperCompiler.dirWrapperClassName(this.dirMeta.type),\n                ctorParams: dirDepParamNames.map(function (paramName) { return new FnParam(paramName, DYNAMIC_TYPE); }),\n                builders: [{ fields: fields, ctorStmts: ctorStmts, methods: methods }, this]\n            });\n        };\n        return DirectiveWrapperBuilder;\n    }());\n    /**\n     * @param {?} builder\n     * @return {?}\n     */\n    function addNgDoCheckMethod(builder) {\n        var /** @type {?} */ changedVar = variable('changed');\n        var /** @type {?} */ stmts = [\n            changedVar.set(THIS_EXPR.prop(CHANGED_FIELD_NAME)).toDeclStmt(),\n            THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(false)).toStmt(),\n        ];\n        var /** @type {?} */ lifecycleStmts = [];\n        if (builder.genChanges) {\n            var /** @type {?} */ onChangesStmts = [];\n            if (builder.ngOnChanges) {\n                onChangesStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n                    .callMethod('ngOnChanges', [THIS_EXPR.prop(CHANGES_FIELD_NAME)])\n                    .toStmt());\n            }\n            if (builder.compilerConfig.logBindingUpdate) {\n                onChangesStmts.push(importExpr(createIdentifier(Identifiers.setBindingDebugInfoForChanges))\n                    .callFn([VIEW_VAR.prop('renderer'), RENDER_EL_VAR, THIS_EXPR.prop(CHANGES_FIELD_NAME)])\n                    .toStmt());\n            }\n            onChangesStmts.push(RESET_CHANGES_STMT);\n            lifecycleStmts.push(new IfStmt(changedVar, onChangesStmts));\n        }\n        if (builder.ngOnInit) {\n            lifecycleStmts.push(new IfStmt(VIEW_VAR.prop('numberOfChecks').identical(new LiteralExpr(0)), [THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngOnInit', []).toStmt()]));\n        }\n        if (builder.ngDoCheck) {\n            lifecycleStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngDoCheck', []).toStmt());\n        }\n        if (lifecycleStmts.length > 0) {\n            stmts.push(new IfStmt(not(THROW_ON_CHANGE_VAR), lifecycleStmts));\n        }\n        stmts.push(new ReturnStatement(changedVar));\n        builder.methods.push(new ClassMethod('ngDoCheck', [\n            new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n            new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n            new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n        ], stmts, BOOL_TYPE));\n    }\n    /**\n     * @param {?} input\n     * @param {?} builder\n     * @return {?}\n     */\n    function addCheckInputMethod(input, builder) {\n        var /** @type {?} */ field = createCheckBindingField(builder);\n        var /** @type {?} */ onChangeStatements = [\n            THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(true)).toStmt(),\n            THIS_EXPR.prop(CONTEXT_FIELD_NAME).prop(input).set(CURR_VALUE_VAR).toStmt(),\n        ];\n        if (builder.genChanges) {\n            onChangeStatements.push(THIS_EXPR.prop(CHANGES_FIELD_NAME)\n                .key(literal(input))\n                .set(importExpr(createIdentifier(Identifiers.SimpleChange))\n                .instantiate([field.expression, CURR_VALUE_VAR]))\n                .toStmt());\n        }\n        var /** @type {?} */ methodBody = createCheckBindingStmt({ currValExpr: CURR_VALUE_VAR, forceUpdate: FORCE_UPDATE_VAR, stmts: [] }, field.expression, THROW_ON_CHANGE_VAR, onChangeStatements);\n        builder.methods.push(new ClassMethod(\"check_\" + input, [\n            new FnParam(CURR_VALUE_VAR.name, DYNAMIC_TYPE),\n            new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n            new FnParam(FORCE_UPDATE_VAR.name, BOOL_TYPE),\n        ], methodBody));\n    }\n    /**\n     * @param {?} hostProps\n     * @param {?} hostEvents\n     * @param {?} builder\n     * @return {?}\n     */\n    function addCheckHostMethod(hostProps, hostEvents, builder) {\n        var /** @type {?} */ stmts = [];\n        var /** @type {?} */ methodParams = [\n            new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n            new FnParam(COMPONENT_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n            new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n            new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n        ];\n        hostProps.forEach(function (hostProp, hostPropIdx) {\n            var /** @type {?} */ field = createCheckBindingField(builder);\n            var /** @type {?} */ evalResult = convertPropertyBinding(builder, null, THIS_EXPR.prop(CONTEXT_FIELD_NAME), hostProp.value, field.bindingId);\n            if (!evalResult) {\n                return;\n            }\n            var /** @type {?} */ securityContextExpr;\n            if (hostProp.needsRuntimeSecurityContext) {\n                securityContextExpr = variable(\"secCtx_\" + methodParams.length);\n                methodParams.push(new FnParam(securityContextExpr.name, importType(createIdentifier(Identifiers.SecurityContext))));\n            }\n            var /** @type {?} */ checkBindingStmts;\n            if (hostProp.isAnimation) {\n                var _a = triggerAnimation(VIEW_VAR, COMPONENT_VIEW_VAR, hostProp, hostEvents, THIS_EXPR.prop(EVENT_HANDLER_FIELD_NAME)\n                    .or(importExpr(createIdentifier(Identifiers.noop))), RENDER_EL_VAR, evalResult.currValExpr, field.expression), updateStmts = _a.updateStmts, detachStmts = _a.detachStmts;\n                checkBindingStmts = updateStmts;\n                (_b = builder.detachStmts).push.apply(_b, detachStmts);\n            }\n            else {\n                checkBindingStmts = writeToRenderer(VIEW_VAR, hostProp, RENDER_EL_VAR, evalResult.currValExpr, builder.compilerConfig.logBindingUpdate, securityContextExpr);\n            }\n            stmts.push.apply(stmts, createCheckBindingStmt(evalResult, field.expression, THROW_ON_CHANGE_VAR, checkBindingStmts));\n            var _b;\n        });\n        builder.methods.push(new ClassMethod('checkHost', methodParams, stmts));\n    }\n    /**\n     * @param {?} hostListeners\n     * @param {?} builder\n     * @return {?}\n     */\n    function addHandleEventMethod(hostListeners, builder) {\n        var /** @type {?} */ resultVar = variable(\"result\");\n        var /** @type {?} */ actionStmts = [resultVar.set(literal(true)).toDeclStmt(BOOL_TYPE)];\n        hostListeners.forEach(function (hostListener, eventIdx) {\n            var /** @type {?} */ evalResult = convertActionBinding(builder, null, THIS_EXPR.prop(CONTEXT_FIELD_NAME), hostListener.handler, \"sub_\" + eventIdx);\n            var /** @type {?} */ trueStmts = evalResult.stmts;\n            if (evalResult.preventDefault) {\n                trueStmts.push(resultVar.set(evalResult.preventDefault.and(resultVar)).toStmt());\n            }\n            // TODO(tbosch): convert this into a `switch` once our OutputAst supports it.\n            actionStmts.push(new IfStmt(EVENT_NAME_VAR.equals(literal(hostListener.fullName)), trueStmts));\n        });\n        actionStmts.push(new ReturnStatement(resultVar));\n        builder.methods.push(new ClassMethod('handleEvent', [\n            new FnParam(EVENT_NAME_VAR.name, STRING_TYPE),\n            new FnParam(EventHandlerVars.event.name, DYNAMIC_TYPE)\n        ], actionStmts, BOOL_TYPE));\n    }\n    /**\n     * @param {?} dirMeta\n     * @param {?} builder\n     * @return {?}\n     */\n    function addSubscribeMethod(dirMeta, builder) {\n        var /** @type {?} */ methodParams = [\n            new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n            new FnParam(EVENT_HANDLER_FIELD_NAME, DYNAMIC_TYPE)\n        ];\n        var /** @type {?} */ stmts = [\n            THIS_EXPR.prop(EVENT_HANDLER_FIELD_NAME).set(variable(EVENT_HANDLER_FIELD_NAME)).toStmt()\n        ];\n        Object.keys(dirMeta.outputs).forEach(function (emitterPropName, emitterIdx) {\n            var /** @type {?} */ eventName = dirMeta.outputs[emitterPropName];\n            var /** @type {?} */ paramName = \"emit\" + emitterIdx;\n            methodParams.push(new FnParam(paramName, BOOL_TYPE));\n            var /** @type {?} */ subscriptionFieldName = \"subscription\" + emitterIdx;\n            builder.fields.push(new ClassField(subscriptionFieldName, DYNAMIC_TYPE));\n            stmts.push(new IfStmt(variable(paramName), [\n                THIS_EXPR.prop(subscriptionFieldName)\n                    .set(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n                    .prop(emitterPropName)\n                    .callMethod(BuiltinMethod.SubscribeObservable, [variable(EVENT_HANDLER_FIELD_NAME)\n                        .callMethod(BuiltinMethod.Bind, [VIEW_VAR, literal(eventName)])]))\n                    .toStmt()\n            ]));\n            builder.destroyStmts.push(THIS_EXPR.prop(subscriptionFieldName)\n                .and(THIS_EXPR.prop(subscriptionFieldName).callMethod('unsubscribe', []))\n                .toStmt());\n        });\n        builder.methods.push(new ClassMethod('subscribe', methodParams, stmts));\n    }\n    var ParseResult = (function () {\n        /**\n         * @param {?} hostProps\n         * @param {?} hostListeners\n         * @param {?} errors\n         */\n        function ParseResult(hostProps, hostListeners, errors) {\n            this.hostProps = hostProps;\n            this.hostListeners = hostListeners;\n            this.errors = errors;\n        }\n        return ParseResult;\n    }());\n    /**\n     * @param {?} dirMeta\n     * @param {?} exprParser\n     * @param {?} schemaRegistry\n     * @return {?}\n     */\n    function parseHostBindings(dirMeta, exprParser, schemaRegistry) {\n        var /** @type {?} */ errors = [];\n        var /** @type {?} */ parser = new BindingParser(exprParser, DEFAULT_INTERPOLATION_CONFIG, schemaRegistry, [], errors);\n        var /** @type {?} */ moduleUrl = identifierModuleUrl(dirMeta.type);\n        var /** @type {?} */ sourceFileName = moduleUrl ?\n            \"in Directive \" + identifierName(dirMeta.type) + \" in \" + moduleUrl :\n            \"in Directive \" + identifierName(dirMeta.type);\n        var /** @type {?} */ sourceFile = new ParseSourceFile('', sourceFileName);\n        var /** @type {?} */ sourceSpan = new ParseSourceSpan(new ParseLocation(sourceFile, null, null, null), new ParseLocation(sourceFile, null, null, null));\n        var /** @type {?} */ parsedHostProps = parser.createDirectiveHostPropertyAsts(dirMeta.toSummary(), sourceSpan);\n        var /** @type {?} */ parsedHostListeners = parser.createDirectiveHostEventAsts(dirMeta.toSummary(), sourceSpan);\n        return new ParseResult(parsedHostProps, parsedHostListeners, errors);\n    }\n    /**\n     * @param {?} parseErrors\n     * @param {?} console\n     * @return {?}\n     */\n    function reportParseErrors(parseErrors, console) {\n        var /** @type {?} */ warnings = parseErrors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; });\n        var /** @type {?} */ errors = parseErrors.filter(function (error) { return error.level === ParseErrorLevel.FATAL; });\n        if (warnings.length > 0) {\n            this._console.warn(\"Directive parse warnings:\\n\" + warnings.join('\\n'));\n        }\n        if (errors.length > 0) {\n            throw new Error(\"Directive parse errors:\\n\" + errors.join('\\n'));\n        }\n    }\n    var DirectiveWrapperExpressions = (function () {\n        function DirectiveWrapperExpressions() {\n        }\n        /**\n         * @param {?} dir\n         * @param {?} depsExpr\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.create = function (dir, depsExpr) {\n            return importExpr(dir).instantiate(depsExpr, importType(dir));\n        };\n        /**\n         * @param {?} dirWrapper\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.context = function (dirWrapper) {\n            return dirWrapper.prop(CONTEXT_FIELD_NAME);\n        };\n        /**\n         * @param {?} dirWrapper\n         * @param {?} view\n         * @param {?} renderElement\n         * @param {?} throwOnChange\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.ngDoCheck = function (dirWrapper, view, renderElement, throwOnChange) {\n            return dirWrapper.callMethod('ngDoCheck', [view, renderElement, throwOnChange]);\n        };\n        /**\n         * @param {?} hostProps\n         * @param {?} dirWrapper\n         * @param {?} view\n         * @param {?} componentView\n         * @param {?} renderElement\n         * @param {?} throwOnChange\n         * @param {?} runtimeSecurityContexts\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.checkHost = function (hostProps, dirWrapper, view, componentView, renderElement, throwOnChange, runtimeSecurityContexts) {\n            if (hostProps.length) {\n                return [dirWrapper\n                        .callMethod('checkHost', [view, componentView, renderElement, throwOnChange].concat(runtimeSecurityContexts))\n                        .toStmt()];\n            }\n            else {\n                return [];\n            }\n        };\n        /**\n         * @param {?} hostProps\n         * @param {?} dirWrapper\n         * @param {?} view\n         * @param {?} componentView\n         * @param {?} renderEl\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.ngOnDetach = function (hostProps, dirWrapper, view, componentView, renderEl) {\n            if (hostProps.some(function (prop) { return prop.isAnimation; })) {\n                return [dirWrapper\n                        .callMethod('ngOnDetach', [\n                        view,\n                        componentView,\n                        renderEl,\n                    ])\n                        .toStmt()];\n            }\n            else {\n                return [];\n            }\n        };\n        /**\n         * @param {?} dir\n         * @param {?} dirWrapper\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.ngOnDestroy = function (dir, dirWrapper) {\n            if (dir.type.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1 ||\n                Object.keys(dir.outputs).length > 0) {\n                return [dirWrapper.callMethod('ngOnDestroy', []).toStmt()];\n            }\n            else {\n                return [];\n            }\n        };\n        /**\n         * @param {?} dirMeta\n         * @param {?} hostProps\n         * @param {?} usedEvents\n         * @param {?} dirWrapper\n         * @param {?} view\n         * @param {?} eventListener\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.subscribe = function (dirMeta, hostProps, usedEvents, dirWrapper, view, eventListener) {\n            var /** @type {?} */ needsSubscribe = false;\n            var /** @type {?} */ eventFlags = [];\n            Object.keys(dirMeta.outputs).forEach(function (propName) {\n                var /** @type {?} */ eventName = dirMeta.outputs[propName];\n                var /** @type {?} */ eventUsed = usedEvents.indexOf(eventName) > -1;\n                needsSubscribe = needsSubscribe || eventUsed;\n                eventFlags.push(literal(eventUsed));\n            });\n            hostProps.forEach(function (hostProp) {\n                if (hostProp.isAnimation && usedEvents.length > 0) {\n                    needsSubscribe = true;\n                }\n            });\n            if (needsSubscribe) {\n                return [\n                    dirWrapper.callMethod('subscribe', [view, eventListener].concat(eventFlags)).toStmt()\n                ];\n            }\n            else {\n                return [];\n            }\n        };\n        /**\n         * @param {?} hostEvents\n         * @param {?} dirWrapper\n         * @param {?} eventName\n         * @param {?} event\n         * @return {?}\n         */\n        DirectiveWrapperExpressions.handleEvent = function (hostEvents, dirWrapper, eventName, event) {\n            return dirWrapper.callMethod('handleEvent', [eventName, event]);\n        };\n        return DirectiveWrapperExpressions;\n    }());\n\n    /**\n     * @param {?} hook\n     * @param {?} token\n     * @return {?}\n     */\n    function hasLifecycleHook(hook, token) {\n        return reflector.hasLifecycleHook(token, getHookName(hook));\n    }\n    /**\n     * @param {?} hook\n     * @return {?}\n     */\n    function getHookName(hook) {\n        switch (hook) {\n            case LifecycleHooks.OnInit:\n                return 'ngOnInit';\n            case LifecycleHooks.OnDestroy:\n                return 'ngOnDestroy';\n            case LifecycleHooks.DoCheck:\n                return 'ngDoCheck';\n            case LifecycleHooks.OnChanges:\n                return 'ngOnChanges';\n            case LifecycleHooks.AfterContentInit:\n                return 'ngAfterContentInit';\n            case LifecycleHooks.AfterContentChecked:\n                return 'ngAfterContentChecked';\n            case LifecycleHooks.AfterViewInit:\n                return 'ngAfterViewInit';\n            case LifecycleHooks.AfterViewChecked:\n                return 'ngAfterViewChecked';\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$10 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$10 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function _isNgModuleMetadata(obj) {\n        return obj instanceof _angular_core.NgModule;\n    }\n    /**\n     * Resolves types to {\\@link NgModule}.\n     */\n    var NgModuleResolver = (function () {\n        /**\n         * @param {?=} _reflector\n         */\n        function NgModuleResolver(_reflector) {\n            if (_reflector === void 0) { _reflector = reflector; }\n            this._reflector = _reflector;\n        }\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        NgModuleResolver.prototype.isNgModule = function (type) { return this._reflector.annotations(type).some(_isNgModuleMetadata); };\n        /**\n         * @param {?} type\n         * @param {?=} throwIfNotFound\n         * @return {?}\n         */\n        NgModuleResolver.prototype.resolve = function (type, throwIfNotFound) {\n            if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n            var /** @type {?} */ ngModuleMeta = ListWrapper.findLast(this._reflector.annotations(type), _isNgModuleMetadata);\n            if (ngModuleMeta) {\n                return ngModuleMeta;\n            }\n            else {\n                if (throwIfNotFound) {\n                    throw new Error(\"No NgModule metadata found for '\" + stringify(type) + \"'.\");\n                }\n                return null;\n            }\n        };\n        NgModuleResolver = __decorate$10([\n            CompilerInjectable(), \n            __metadata$10('design:paramtypes', [ReflectorReader])\n        ], NgModuleResolver);\n        return NgModuleResolver;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$11 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$11 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function _isPipeMetadata(type) {\n        return type instanceof _angular_core.Pipe;\n    }\n    /**\n     * Resolve a `Type` for {\\@link Pipe}.\n     *\n     * This interface can be overridden by the application developer to create custom behavior.\n     *\n     * See {\\@link Compiler}\n     */\n    var PipeResolver = (function () {\n        /**\n         * @param {?=} _reflector\n         */\n        function PipeResolver(_reflector) {\n            if (_reflector === void 0) { _reflector = reflector; }\n            this._reflector = _reflector;\n        }\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        PipeResolver.prototype.isPipe = function (type) {\n            var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n            return typeMetadata && typeMetadata.some(_isPipeMetadata);\n        };\n        /**\n         * Return {\\@link Pipe} for a given `Type`.\n         * @param {?} type\n         * @param {?=} throwIfNotFound\n         * @return {?}\n         */\n        PipeResolver.prototype.resolve = function (type, throwIfNotFound) {\n            if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n            var /** @type {?} */ metas = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n            if (metas) {\n                var /** @type {?} */ annotation = ListWrapper.findLast(metas, _isPipeMetadata);\n                if (annotation) {\n                    return annotation;\n                }\n            }\n            if (throwIfNotFound) {\n                throw new Error(\"No Pipe decorator found on \" + stringify(type));\n            }\n            return null;\n        };\n        PipeResolver = __decorate$11([\n            CompilerInjectable(), \n            __metadata$11('design:paramtypes', [ReflectorReader])\n        ], PipeResolver);\n        return PipeResolver;\n    }());\n\n    var __decorate$12 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$12 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var SummaryResolver = (function () {\n        function SummaryResolver() {\n        }\n        /**\n         * @param {?} reference\n         * @return {?}\n         */\n        SummaryResolver.prototype.resolveSummary = function (reference) { return null; };\n        ;\n        /**\n         * @param {?} filePath\n         * @return {?}\n         */\n        SummaryResolver.prototype.getSymbolsOf = function (filePath) { return []; };\n        SummaryResolver = __decorate$12([\n            CompilerInjectable(), \n            __metadata$12('design:paramtypes', [])\n        ], SummaryResolver);\n        return SummaryResolver;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$21 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var __decorate$9 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$9 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var /** @type {?} */ ERROR_COLLECTOR_TOKEN = new _angular_core.OpaqueToken('ErrorCollector');\n    var CompileMetadataResolver = (function () {\n        /**\n         * @param {?} _ngModuleResolver\n         * @param {?} _directiveResolver\n         * @param {?} _pipeResolver\n         * @param {?} _summaryResolver\n         * @param {?} _schemaRegistry\n         * @param {?} _directiveNormalizer\n         * @param {?=} _reflector\n         * @param {?=} _errorCollector\n         */\n        function CompileMetadataResolver(_ngModuleResolver, _directiveResolver, _pipeResolver, _summaryResolver, _schemaRegistry, _directiveNormalizer, _reflector, _errorCollector) {\n            if (_reflector === void 0) { _reflector = reflector; }\n            this._ngModuleResolver = _ngModuleResolver;\n            this._directiveResolver = _directiveResolver;\n            this._pipeResolver = _pipeResolver;\n            this._summaryResolver = _summaryResolver;\n            this._schemaRegistry = _schemaRegistry;\n            this._directiveNormalizer = _directiveNormalizer;\n            this._reflector = _reflector;\n            this._errorCollector = _errorCollector;\n            this._directiveCache = new Map();\n            this._summaryCache = new Map();\n            this._pipeCache = new Map();\n            this._ngModuleCache = new Map();\n            this._ngModuleOfTypes = new Map();\n        }\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.clearCacheFor = function (type) {\n            var /** @type {?} */ dirMeta = this._directiveCache.get(type);\n            this._directiveCache.delete(type);\n            this._summaryCache.delete(type);\n            this._pipeCache.delete(type);\n            this._ngModuleOfTypes.delete(type);\n            // Clear all of the NgModule as they contain transitive information!\n            this._ngModuleCache.clear();\n            if (dirMeta) {\n                this._directiveNormalizer.clearCacheFor(dirMeta);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.clearCache = function () {\n            this._directiveCache.clear();\n            this._summaryCache.clear();\n            this._pipeCache.clear();\n            this._ngModuleCache.clear();\n            this._ngModuleOfTypes.clear();\n            this._directiveNormalizer.clearCache();\n        };\n        /**\n         * @param {?} entry\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getAnimationEntryMetadata = function (entry) {\n            var _this = this;\n            var /** @type {?} */ defs = entry.definitions.map(function (def) { return _this._getAnimationStateMetadata(def); });\n            return new CompileAnimationEntryMetadata(entry.name, defs);\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getAnimationStateMetadata = function (value) {\n            if (value instanceof _angular_core.AnimationStateDeclarationMetadata) {\n                var /** @type {?} */ styles = this._getAnimationStyleMetadata(value.styles);\n                return new CompileAnimationStateDeclarationMetadata(value.stateNameExpr, styles);\n            }\n            if (value instanceof _angular_core.AnimationStateTransitionMetadata) {\n                return new CompileAnimationStateTransitionMetadata(value.stateChangeExpr, this._getAnimationMetadata(value.steps));\n            }\n            return null;\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getAnimationStyleMetadata = function (value) {\n            return new CompileAnimationStyleMetadata(value.offset, value.styles);\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getAnimationMetadata = function (value) {\n            var _this = this;\n            if (value instanceof _angular_core.AnimationStyleMetadata) {\n                return this._getAnimationStyleMetadata(value);\n            }\n            if (value instanceof _angular_core.AnimationKeyframesSequenceMetadata) {\n                return new CompileAnimationKeyframesSequenceMetadata(value.steps.map(function (entry) { return _this._getAnimationStyleMetadata(entry); }));\n            }\n            if (value instanceof _angular_core.AnimationAnimateMetadata) {\n                var /** @type {?} */ animateData = (this\n                    ._getAnimationMetadata(value.styles));\n                return new CompileAnimationAnimateMetadata(value.timings, animateData);\n            }\n            if (value instanceof _angular_core.AnimationWithStepsMetadata) {\n                var /** @type {?} */ steps = value.steps.map(function (step) { return _this._getAnimationMetadata(step); });\n                if (value instanceof _angular_core.AnimationGroupMetadata) {\n                    return new CompileAnimationGroupMetadata(steps);\n                }\n                return new CompileAnimationSequenceMetadata(steps);\n            }\n            return null;\n        };\n        /**\n         * @param {?} type\n         * @param {?} kind\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._loadSummary = function (type, kind) {\n            var /** @type {?} */ typeSummary = this._summaryCache.get(type);\n            if (!typeSummary) {\n                var /** @type {?} */ summary = this._summaryResolver.resolveSummary(type);\n                typeSummary = summary ? summary.type : null;\n                this._summaryCache.set(type, typeSummary);\n            }\n            return typeSummary && typeSummary.summaryKind === kind ? typeSummary : null;\n        };\n        /**\n         * @param {?} directiveType\n         * @param {?} isSync\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._loadDirectiveMetadata = function (directiveType, isSync) {\n            var _this = this;\n            if (this._directiveCache.has(directiveType)) {\n                return;\n            }\n            directiveType = _angular_core.resolveForwardRef(directiveType);\n            var _a = this.getNonNormalizedDirectiveMetadata(directiveType), annotation = _a.annotation, metadata = _a.metadata;\n            var /** @type {?} */ createDirectiveMetadata = function (templateMetadata) {\n                var /** @type {?} */ normalizedDirMeta = new CompileDirectiveMetadata({\n                    type: metadata.type,\n                    isComponent: metadata.isComponent,\n                    selector: metadata.selector,\n                    exportAs: metadata.exportAs,\n                    changeDetection: metadata.changeDetection,\n                    inputs: metadata.inputs,\n                    outputs: metadata.outputs,\n                    hostListeners: metadata.hostListeners,\n                    hostProperties: metadata.hostProperties,\n                    hostAttributes: metadata.hostAttributes,\n                    providers: metadata.providers,\n                    viewProviders: metadata.viewProviders,\n                    queries: metadata.queries,\n                    viewQueries: metadata.viewQueries,\n                    entryComponents: metadata.entryComponents,\n                    template: templateMetadata\n                });\n                _this._directiveCache.set(directiveType, normalizedDirMeta);\n                _this._summaryCache.set(directiveType, normalizedDirMeta.toSummary());\n                return normalizedDirMeta;\n            };\n            if (metadata.isComponent) {\n                var /** @type {?} */ templateMeta = this._directiveNormalizer.normalizeTemplate({\n                    componentType: directiveType,\n                    moduleUrl: componentModuleUrl(this._reflector, directiveType, annotation),\n                    encapsulation: metadata.template.encapsulation,\n                    template: metadata.template.template,\n                    templateUrl: metadata.template.templateUrl,\n                    styles: metadata.template.styles,\n                    styleUrls: metadata.template.styleUrls,\n                    animations: metadata.template.animations,\n                    interpolation: metadata.template.interpolation\n                });\n                if (templateMeta.syncResult) {\n                    createDirectiveMetadata(templateMeta.syncResult);\n                    return null;\n                }\n                else {\n                    if (isSync) {\n                        this._reportError(new ComponentStillLoadingError(directiveType), directiveType);\n                        return null;\n                    }\n                    return templateMeta.asyncResult.then(createDirectiveMetadata);\n                }\n            }\n            else {\n                // directive\n                createDirectiveMetadata(null);\n                return null;\n            }\n        };\n        /**\n         * @param {?} directiveType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getNonNormalizedDirectiveMetadata = function (directiveType) {\n            var _this = this;\n            directiveType = _angular_core.resolveForwardRef(directiveType);\n            var /** @type {?} */ dirMeta = this._directiveResolver.resolve(directiveType);\n            if (!dirMeta) {\n                return null;\n            }\n            var /** @type {?} */ nonNormalizedTemplateMetadata;\n            if (dirMeta instanceof _angular_core.Component) {\n                // component\n                assertArrayOfStrings('styles', dirMeta.styles);\n                assertArrayOfStrings('styleUrls', dirMeta.styleUrls);\n                assertInterpolationSymbols('interpolation', dirMeta.interpolation);\n                var /** @type {?} */ animations = dirMeta.animations ?\n                    dirMeta.animations.map(function (e) { return _this.getAnimationEntryMetadata(e); }) :\n                    null;\n                nonNormalizedTemplateMetadata = new CompileTemplateMetadata({\n                    encapsulation: dirMeta.encapsulation,\n                    template: dirMeta.template,\n                    templateUrl: dirMeta.templateUrl,\n                    styles: dirMeta.styles,\n                    styleUrls: dirMeta.styleUrls,\n                    animations: animations,\n                    interpolation: dirMeta.interpolation\n                });\n            }\n            var /** @type {?} */ changeDetectionStrategy = null;\n            var /** @type {?} */ viewProviders = [];\n            var /** @type {?} */ entryComponentMetadata = [];\n            var /** @type {?} */ selector = dirMeta.selector;\n            if (dirMeta instanceof _angular_core.Component) {\n                // Component\n                changeDetectionStrategy = dirMeta.changeDetection;\n                if (dirMeta.viewProviders) {\n                    viewProviders = this._getProvidersMetadata(dirMeta.viewProviders, entryComponentMetadata, \"viewProviders for \\\"\" + stringifyType(directiveType) + \"\\\"\", [], directiveType);\n                }\n                if (dirMeta.entryComponents) {\n                    entryComponentMetadata = flattenAndDedupeArray(dirMeta.entryComponents)\n                        .map(function (type) { return _this._getIdentifierMetadata(type); })\n                        .concat(entryComponentMetadata);\n                }\n                if (!selector) {\n                    selector = this._schemaRegistry.getDefaultComponentElementName();\n                }\n            }\n            else {\n                // Directive\n                if (!selector) {\n                    this._reportError(new SyntaxError(\"Directive \" + stringifyType(directiveType) + \" has no selector, please add it!\"), directiveType);\n                    selector = 'error';\n                }\n            }\n            var /** @type {?} */ providers = [];\n            if (isPresent(dirMeta.providers)) {\n                providers = this._getProvidersMetadata(dirMeta.providers, entryComponentMetadata, \"providers for \\\"\" + stringifyType(directiveType) + \"\\\"\", [], directiveType);\n            }\n            var /** @type {?} */ queries = [];\n            var /** @type {?} */ viewQueries = [];\n            if (isPresent(dirMeta.queries)) {\n                queries = this._getQueriesMetadata(dirMeta.queries, false, directiveType);\n                viewQueries = this._getQueriesMetadata(dirMeta.queries, true, directiveType);\n            }\n            var /** @type {?} */ metadata = CompileDirectiveMetadata.create({\n                selector: selector,\n                exportAs: dirMeta.exportAs,\n                isComponent: !!nonNormalizedTemplateMetadata,\n                type: this._getTypeMetadata(directiveType),\n                template: nonNormalizedTemplateMetadata,\n                changeDetection: changeDetectionStrategy,\n                inputs: dirMeta.inputs,\n                outputs: dirMeta.outputs,\n                host: dirMeta.host,\n                providers: providers,\n                viewProviders: viewProviders,\n                queries: queries,\n                viewQueries: viewQueries,\n                entryComponents: entryComponentMetadata\n            });\n            return { metadata: metadata, annotation: dirMeta };\n        };\n        /**\n         * Gets the metadata for the given directive.\n         * This assumes `loadNgModuleDirectiveAndPipeMetadata` has been called first.\n         * @param {?} directiveType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getDirectiveMetadata = function (directiveType) {\n            var /** @type {?} */ dirMeta = this._directiveCache.get(directiveType);\n            if (!dirMeta) {\n                this._reportError(new SyntaxError(\"Illegal state: getDirectiveMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Directive \" + stringifyType(directiveType) + \".\"), directiveType);\n            }\n            return dirMeta;\n        };\n        /**\n         * @param {?} dirType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getDirectiveSummary = function (dirType) {\n            var /** @type {?} */ dirSummary = (this._loadSummary(dirType, CompileSummaryKind.Directive));\n            if (!dirSummary) {\n                this._reportError(new SyntaxError(\"Illegal state: Could not load the summary for directive \" + stringifyType(dirType) + \".\"), dirType);\n            }\n            return dirSummary;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.isDirective = function (type) { return this._directiveResolver.isDirective(type); };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.isPipe = function (type) { return this._pipeResolver.isPipe(type); };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getNgModuleSummary = function (moduleType) {\n            var /** @type {?} */ moduleSummary = (this._loadSummary(moduleType, CompileSummaryKind.NgModule));\n            if (!moduleSummary) {\n                var /** @type {?} */ moduleMeta = this.getNgModuleMetadata(moduleType, false);\n                moduleSummary = moduleMeta ? moduleMeta.toSummary() : null;\n                if (moduleSummary) {\n                    this._summaryCache.set(moduleType, moduleSummary);\n                }\n            }\n            return moduleSummary;\n        };\n        /**\n         * Loads the declared directives and pipes of an NgModule.\n         * @param {?} moduleType\n         * @param {?} isSync\n         * @param {?=} throwIfNotFound\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.loadNgModuleDirectiveAndPipeMetadata = function (moduleType, isSync, throwIfNotFound) {\n            var _this = this;\n            if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n            var /** @type {?} */ ngModule = this.getNgModuleMetadata(moduleType, throwIfNotFound);\n            var /** @type {?} */ loading = [];\n            if (ngModule) {\n                ngModule.declaredDirectives.forEach(function (id) {\n                    var /** @type {?} */ promise = _this._loadDirectiveMetadata(id.reference, isSync);\n                    if (promise) {\n                        loading.push(promise);\n                    }\n                });\n                ngModule.declaredPipes.forEach(function (id) { return _this._loadPipeMetadata(id.reference); });\n            }\n            return Promise.all(loading);\n        };\n        /**\n         * @param {?} moduleType\n         * @param {?=} throwIfNotFound\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getNgModuleMetadata = function (moduleType, throwIfNotFound) {\n            var _this = this;\n            if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n            moduleType = _angular_core.resolveForwardRef(moduleType);\n            var /** @type {?} */ compileMeta = this._ngModuleCache.get(moduleType);\n            if (compileMeta) {\n                return compileMeta;\n            }\n            var /** @type {?} */ meta = this._ngModuleResolver.resolve(moduleType, throwIfNotFound);\n            if (!meta) {\n                return null;\n            }\n            var /** @type {?} */ declaredDirectives = [];\n            var /** @type {?} */ exportedNonModuleIdentifiers = [];\n            var /** @type {?} */ declaredPipes = [];\n            var /** @type {?} */ importedModules = [];\n            var /** @type {?} */ exportedModules = [];\n            var /** @type {?} */ providers = [];\n            var /** @type {?} */ entryComponents = [];\n            var /** @type {?} */ bootstrapComponents = [];\n            var /** @type {?} */ schemas = [];\n            if (meta.imports) {\n                flattenAndDedupeArray(meta.imports).forEach(function (importedType) {\n                    var /** @type {?} */ importedModuleType;\n                    if (isValidType(importedType)) {\n                        importedModuleType = importedType;\n                    }\n                    else if (importedType && importedType.ngModule) {\n                        var /** @type {?} */ moduleWithProviders = importedType;\n                        importedModuleType = moduleWithProviders.ngModule;\n                        if (moduleWithProviders.providers) {\n                            providers.push.apply(providers, _this._getProvidersMetadata(moduleWithProviders.providers, entryComponents, \"provider for the NgModule '\" + stringifyType(importedModuleType) + \"'\", [], importedType));\n                        }\n                    }\n                    if (importedModuleType) {\n                        var /** @type {?} */ importedModuleSummary = _this.getNgModuleSummary(importedModuleType);\n                        if (!importedModuleSummary) {\n                            _this._reportError(new SyntaxError(\"Unexpected \" + _this._getTypeDescriptor(importedType) + \" '\" + stringifyType(importedType) + \"' imported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                            return;\n                        }\n                        importedModules.push(importedModuleSummary);\n                    }\n                    else {\n                        _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(importedType) + \"' imported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                        return;\n                    }\n                });\n            }\n            if (meta.exports) {\n                flattenAndDedupeArray(meta.exports).forEach(function (exportedType) {\n                    if (!isValidType(exportedType)) {\n                        _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(exportedType) + \"' exported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                        return;\n                    }\n                    var /** @type {?} */ exportedModuleSummary = _this.getNgModuleSummary(exportedType);\n                    if (exportedModuleSummary) {\n                        exportedModules.push(exportedModuleSummary);\n                    }\n                    else {\n                        exportedNonModuleIdentifiers.push(_this._getIdentifierMetadata(exportedType));\n                    }\n                });\n            }\n            // Note: This will be modified later, so we rely on\n            // getting a new instance every time!\n            var /** @type {?} */ transitiveModule = this._getTransitiveNgModuleMetadata(importedModules, exportedModules);\n            if (meta.declarations) {\n                flattenAndDedupeArray(meta.declarations).forEach(function (declaredType) {\n                    if (!isValidType(declaredType)) {\n                        _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(declaredType) + \"' declared by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                        return;\n                    }\n                    var /** @type {?} */ declaredIdentifier = _this._getIdentifierMetadata(declaredType);\n                    if (_this._directiveResolver.isDirective(declaredType)) {\n                        transitiveModule.addDirective(declaredIdentifier);\n                        declaredDirectives.push(declaredIdentifier);\n                        _this._addTypeToModule(declaredType, moduleType);\n                    }\n                    else if (_this._pipeResolver.isPipe(declaredType)) {\n                        transitiveModule.addPipe(declaredIdentifier);\n                        transitiveModule.pipes.push(declaredIdentifier);\n                        declaredPipes.push(declaredIdentifier);\n                        _this._addTypeToModule(declaredType, moduleType);\n                    }\n                    else {\n                        _this._reportError(new SyntaxError(\"Unexpected \" + _this._getTypeDescriptor(declaredType) + \" '\" + stringifyType(declaredType) + \"' declared by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                        return;\n                    }\n                });\n            }\n            var /** @type {?} */ exportedDirectives = [];\n            var /** @type {?} */ exportedPipes = [];\n            exportedNonModuleIdentifiers.forEach(function (exportedId) {\n                if (transitiveModule.directivesSet.has(exportedId.reference)) {\n                    exportedDirectives.push(exportedId);\n                    transitiveModule.addExportedDirective(exportedId);\n                }\n                else if (transitiveModule.pipesSet.has(exportedId.reference)) {\n                    exportedPipes.push(exportedId);\n                    transitiveModule.addExportedPipe(exportedId);\n                }\n                else {\n                    _this._reportError(new SyntaxError(\"Can't export \" + _this._getTypeDescriptor(exportedId.reference) + \" \" + stringifyType(exportedId.reference) + \" from \" + stringifyType(moduleType) + \" as it was neither declared nor imported!\"), moduleType);\n                }\n            });\n            // The providers of the module have to go last\n            // so that they overwrite any other provider we already added.\n            if (meta.providers) {\n                providers.push.apply(providers, this._getProvidersMetadata(meta.providers, entryComponents, \"provider for the NgModule '\" + stringifyType(moduleType) + \"'\", [], moduleType));\n            }\n            if (meta.entryComponents) {\n                entryComponents.push.apply(entryComponents, flattenAndDedupeArray(meta.entryComponents)\n                    .map(function (type) { return _this._getIdentifierMetadata(type); }));\n            }\n            if (meta.bootstrap) {\n                flattenAndDedupeArray(meta.bootstrap).forEach(function (type) {\n                    if (!isValidType(type)) {\n                        _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(type) + \"' used in the bootstrap property of module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n                        return;\n                    }\n                    bootstrapComponents.push(_this._getIdentifierMetadata(type));\n                });\n            }\n            entryComponents.push.apply(entryComponents, bootstrapComponents);\n            if (meta.schemas) {\n                schemas.push.apply(schemas, flattenAndDedupeArray(meta.schemas));\n            }\n            compileMeta = new CompileNgModuleMetadata({\n                type: this._getTypeMetadata(moduleType),\n                providers: providers,\n                entryComponents: entryComponents,\n                bootstrapComponents: bootstrapComponents,\n                schemas: schemas,\n                declaredDirectives: declaredDirectives,\n                exportedDirectives: exportedDirectives,\n                declaredPipes: declaredPipes,\n                exportedPipes: exportedPipes,\n                importedModules: importedModules,\n                exportedModules: exportedModules,\n                transitiveModule: transitiveModule,\n                id: meta.id,\n            });\n            entryComponents.forEach(function (id) { return transitiveModule.addEntryComponent(id); });\n            providers.forEach(function (provider) { return transitiveModule.addProvider(provider, compileMeta.type); });\n            transitiveModule.addModule(compileMeta.type);\n            this._ngModuleCache.set(moduleType, compileMeta);\n            return compileMeta;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getTypeDescriptor = function (type) {\n            if (this._directiveResolver.isDirective(type)) {\n                return 'directive';\n            }\n            if (this._pipeResolver.isPipe(type)) {\n                return 'pipe';\n            }\n            if (this._ngModuleResolver.isNgModule(type)) {\n                return 'module';\n            }\n            if (((type)).provide) {\n                return 'provider';\n            }\n            return 'value';\n        };\n        /**\n         * @param {?} type\n         * @param {?} moduleType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._addTypeToModule = function (type, moduleType) {\n            var /** @type {?} */ oldModule = this._ngModuleOfTypes.get(type);\n            if (oldModule && oldModule !== moduleType) {\n                this._reportError(new SyntaxError((\"Type \" + stringifyType(type) + \" is part of the declarations of 2 modules: \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \"! \") +\n                    (\"Please consider moving \" + stringifyType(type) + \" to a higher module that imports \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \". \") +\n                    (\"You can also create a new NgModule that exports and includes \" + stringifyType(type) + \" then import that NgModule in \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \".\")), moduleType);\n            }\n            this._ngModuleOfTypes.set(type, moduleType);\n        };\n        /**\n         * @param {?} importedModules\n         * @param {?} exportedModules\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getTransitiveNgModuleMetadata = function (importedModules, exportedModules) {\n            // collect `providers` / `entryComponents` from all imported and all exported modules\n            var /** @type {?} */ result = new TransitiveCompileNgModuleMetadata();\n            var /** @type {?} */ modulesByToken = new Map();\n            importedModules.concat(exportedModules).forEach(function (modSummary) {\n                modSummary.modules.forEach(function (mod) { return result.addModule(mod); });\n                modSummary.entryComponents.forEach(function (comp) { return result.addEntryComponent(comp); });\n                var /** @type {?} */ addedTokens = new Set();\n                modSummary.providers.forEach(function (entry) {\n                    var /** @type {?} */ tokenRef = tokenReference(entry.provider.token);\n                    var /** @type {?} */ prevModules = modulesByToken.get(tokenRef);\n                    if (!prevModules) {\n                        prevModules = new Set();\n                        modulesByToken.set(tokenRef, prevModules);\n                    }\n                    var /** @type {?} */ moduleRef = entry.module.reference;\n                    // Note: the providers of one module may still contain multiple providers\n                    // per token (e.g. for multi providers), and we need to preserve these.\n                    if (addedTokens.has(tokenRef) || !prevModules.has(moduleRef)) {\n                        prevModules.add(moduleRef);\n                        addedTokens.add(tokenRef);\n                        result.addProvider(entry.provider, entry.module);\n                    }\n                });\n            });\n            exportedModules.forEach(function (modSummary) {\n                modSummary.exportedDirectives.forEach(function (id) { return result.addExportedDirective(id); });\n                modSummary.exportedPipes.forEach(function (id) { return result.addExportedPipe(id); });\n            });\n            importedModules.forEach(function (modSummary) {\n                modSummary.exportedDirectives.forEach(function (id) { return result.addDirective(id); });\n                modSummary.exportedPipes.forEach(function (id) { return result.addPipe(id); });\n            });\n            return result;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getIdentifierMetadata = function (type) {\n            type = _angular_core.resolveForwardRef(type);\n            return { reference: type };\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.isInjectable = function (type) {\n            var /** @type {?} */ annotations = this._reflector.annotations(type);\n            // Note: We need an exact check here as @Component / @Directive / ... inherit\n            // from @CompilerInjectable!\n            return annotations.some(function (ann) { return ann.constructor === _angular_core.Injectable; });\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getInjectableSummary = function (type) {\n            return { summaryKind: CompileSummaryKind.Injectable, type: this._getTypeMetadata(type) };\n        };\n        /**\n         * @param {?} type\n         * @param {?=} dependencies\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getInjectableMetadata = function (type, dependencies) {\n            if (dependencies === void 0) { dependencies = null; }\n            var /** @type {?} */ typeSummary = this._loadSummary(type, CompileSummaryKind.Injectable);\n            if (typeSummary) {\n                return typeSummary.type;\n            }\n            return this._getTypeMetadata(type, dependencies);\n        };\n        /**\n         * @param {?} type\n         * @param {?=} dependencies\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getTypeMetadata = function (type, dependencies) {\n            if (dependencies === void 0) { dependencies = null; }\n            var /** @type {?} */ identifier = this._getIdentifierMetadata(type);\n            return {\n                reference: identifier.reference,\n                diDeps: this._getDependenciesMetadata(identifier.reference, dependencies),\n                lifecycleHooks: LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return hasLifecycleHook(hook, identifier.reference); }),\n            };\n        };\n        /**\n         * @param {?} factory\n         * @param {?=} dependencies\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getFactoryMetadata = function (factory, dependencies) {\n            if (dependencies === void 0) { dependencies = null; }\n            factory = _angular_core.resolveForwardRef(factory);\n            return { reference: factory, diDeps: this._getDependenciesMetadata(factory, dependencies) };\n        };\n        /**\n         * Gets the metadata for the given pipe.\n         * This assumes `loadNgModuleDirectiveAndPipeMetadata` has been called first.\n         * @param {?} pipeType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getPipeMetadata = function (pipeType) {\n            var /** @type {?} */ pipeMeta = this._pipeCache.get(pipeType);\n            if (!pipeMeta) {\n                this._reportError(new SyntaxError(\"Illegal state: getPipeMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Pipe \" + stringifyType(pipeType) + \".\"), pipeType);\n            }\n            return pipeMeta;\n        };\n        /**\n         * @param {?} pipeType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getPipeSummary = function (pipeType) {\n            var /** @type {?} */ pipeSummary = (this._loadSummary(pipeType, CompileSummaryKind.Pipe));\n            if (!pipeSummary) {\n                this._reportError(new SyntaxError(\"Illegal state: Could not load the summary for pipe \" + stringifyType(pipeType) + \".\"), pipeType);\n            }\n            return pipeSummary;\n        };\n        /**\n         * @param {?} pipeType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getOrLoadPipeMetadata = function (pipeType) {\n            var /** @type {?} */ pipeMeta = this._pipeCache.get(pipeType);\n            if (!pipeMeta) {\n                pipeMeta = this._loadPipeMetadata(pipeType);\n            }\n            return pipeMeta;\n        };\n        /**\n         * @param {?} pipeType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._loadPipeMetadata = function (pipeType) {\n            pipeType = _angular_core.resolveForwardRef(pipeType);\n            var /** @type {?} */ pipeAnnotation = this._pipeResolver.resolve(pipeType);\n            var /** @type {?} */ pipeMeta = new CompilePipeMetadata({\n                type: this._getTypeMetadata(pipeType),\n                name: pipeAnnotation.name,\n                pure: pipeAnnotation.pure\n            });\n            this._pipeCache.set(pipeType, pipeMeta);\n            this._summaryCache.set(pipeType, pipeMeta.toSummary());\n            return pipeMeta;\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @param {?} dependencies\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getDependenciesMetadata = function (typeOrFunc, dependencies) {\n            var _this = this;\n            var /** @type {?} */ hasUnknownDeps = false;\n            var /** @type {?} */ params = dependencies || this._reflector.parameters(typeOrFunc) || [];\n            var /** @type {?} */ dependenciesMetadata = params.map(function (param) {\n                var /** @type {?} */ isAttribute = false;\n                var /** @type {?} */ isHost = false;\n                var /** @type {?} */ isSelf = false;\n                var /** @type {?} */ isSkipSelf = false;\n                var /** @type {?} */ isOptional = false;\n                var /** @type {?} */ token = null;\n                if (Array.isArray(param)) {\n                    param.forEach(function (paramEntry) {\n                        if (paramEntry instanceof _angular_core.Host) {\n                            isHost = true;\n                        }\n                        else if (paramEntry instanceof _angular_core.Self) {\n                            isSelf = true;\n                        }\n                        else if (paramEntry instanceof _angular_core.SkipSelf) {\n                            isSkipSelf = true;\n                        }\n                        else if (paramEntry instanceof _angular_core.Optional) {\n                            isOptional = true;\n                        }\n                        else if (paramEntry instanceof _angular_core.Attribute) {\n                            isAttribute = true;\n                            token = paramEntry.attributeName;\n                        }\n                        else if (paramEntry instanceof _angular_core.Inject) {\n                            token = paramEntry.token;\n                        }\n                        else if (isValidType(paramEntry) && isBlank(token)) {\n                            token = paramEntry;\n                        }\n                    });\n                }\n                else {\n                    token = param;\n                }\n                if (isBlank(token)) {\n                    hasUnknownDeps = true;\n                    return null;\n                }\n                return {\n                    isAttribute: isAttribute,\n                    isHost: isHost,\n                    isSelf: isSelf,\n                    isSkipSelf: isSkipSelf,\n                    isOptional: isOptional,\n                    token: _this._getTokenMetadata(token)\n                };\n            });\n            if (hasUnknownDeps) {\n                var /** @type {?} */ depsTokens = dependenciesMetadata.map(function (dep) { return dep ? stringifyType(dep.token) : '?'; }).join(', ');\n                this._reportError(new SyntaxError(\"Can't resolve all parameters for \" + stringifyType(typeOrFunc) + \": (\" + depsTokens + \").\"), typeOrFunc);\n            }\n            return dependenciesMetadata;\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getTokenMetadata = function (token) {\n            token = _angular_core.resolveForwardRef(token);\n            var /** @type {?} */ compileToken;\n            if (typeof token === 'string') {\n                compileToken = { value: token };\n            }\n            else {\n                compileToken = { identifier: { reference: token } };\n            }\n            return compileToken;\n        };\n        /**\n         * @param {?} providers\n         * @param {?} targetEntryComponents\n         * @param {?=} debugInfo\n         * @param {?=} compileProviders\n         * @param {?=} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getProvidersMetadata = function (providers, targetEntryComponents, debugInfo, compileProviders, type) {\n            var _this = this;\n            if (compileProviders === void 0) { compileProviders = []; }\n            providers.forEach(function (provider, providerIdx) {\n                if (Array.isArray(provider)) {\n                    _this._getProvidersMetadata(provider, targetEntryComponents, debugInfo, compileProviders);\n                }\n                else {\n                    provider = _angular_core.resolveForwardRef(provider);\n                    var /** @type {?} */ providerMeta = void 0;\n                    if (provider && typeof provider == 'object' && provider.hasOwnProperty('provide')) {\n                        providerMeta = new ProviderMeta(provider.provide, provider);\n                    }\n                    else if (isValidType(provider)) {\n                        providerMeta = new ProviderMeta(provider, { useClass: provider });\n                    }\n                    else {\n                        var /** @type {?} */ providersInfo = ((providers.reduce(function (soFar, seenProvider, seenProviderIdx) {\n                            if (seenProviderIdx < providerIdx) {\n                                soFar.push(\"\" + stringifyType(seenProvider));\n                            }\n                            else if (seenProviderIdx == providerIdx) {\n                                soFar.push(\"?\" + stringifyType(seenProvider) + \"?\");\n                            }\n                            else if (seenProviderIdx == providerIdx + 1) {\n                                soFar.push('...');\n                            }\n                            return soFar;\n                        }, [])))\n                            .join(', ');\n                        _this._reportError(new SyntaxError(\"Invalid \" + (debugInfo ? debugInfo : 'provider') + \" - only instances of Provider and Type are allowed, got: [\" + providersInfo + \"]\"), type);\n                    }\n                    if (providerMeta.token === resolveIdentifier(Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS)) {\n                        targetEntryComponents.push.apply(targetEntryComponents, _this._getEntryComponentsFromProvider(providerMeta, type));\n                    }\n                    else {\n                        compileProviders.push(_this.getProviderMetadata(providerMeta));\n                    }\n                }\n            });\n            return compileProviders;\n        };\n        /**\n         * @param {?} provider\n         * @param {?=} type\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getEntryComponentsFromProvider = function (provider, type) {\n            var _this = this;\n            var /** @type {?} */ components = [];\n            var /** @type {?} */ collectedIdentifiers = [];\n            if (provider.useFactory || provider.useExisting || provider.useClass) {\n                this._reportError(new SyntaxError(\"The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!\"), type);\n                return [];\n            }\n            if (!provider.multi) {\n                this._reportError(new SyntaxError(\"The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!\"), type);\n                return [];\n            }\n            extractIdentifiers(provider.useValue, collectedIdentifiers);\n            collectedIdentifiers.forEach(function (identifier) {\n                if (_this._directiveResolver.isDirective(identifier.reference) ||\n                    _this._loadSummary(identifier.reference, CompileSummaryKind.Directive)) {\n                    components.push(identifier);\n                }\n            });\n            return components;\n        };\n        /**\n         * @param {?} provider\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype.getProviderMetadata = function (provider) {\n            var /** @type {?} */ compileDeps;\n            var /** @type {?} */ compileTypeMetadata = null;\n            var /** @type {?} */ compileFactoryMetadata = null;\n            var /** @type {?} */ token = this._getTokenMetadata(provider.token);\n            if (provider.useClass) {\n                compileTypeMetadata = this._getInjectableMetadata(provider.useClass, provider.dependencies);\n                compileDeps = compileTypeMetadata.diDeps;\n                if (provider.token === provider.useClass) {\n                    // use the compileTypeMetadata as it contains information about lifecycleHooks...\n                    token = { identifier: compileTypeMetadata };\n                }\n            }\n            else if (provider.useFactory) {\n                compileFactoryMetadata = this._getFactoryMetadata(provider.useFactory, provider.dependencies);\n                compileDeps = compileFactoryMetadata.diDeps;\n            }\n            return {\n                token: token,\n                useClass: compileTypeMetadata,\n                useValue: provider.useValue,\n                useFactory: compileFactoryMetadata,\n                useExisting: provider.useExisting ? this._getTokenMetadata(provider.useExisting) : null,\n                deps: compileDeps,\n                multi: provider.multi\n            };\n        };\n        /**\n         * @param {?} queries\n         * @param {?} isViewQuery\n         * @param {?} directiveType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getQueriesMetadata = function (queries, isViewQuery, directiveType) {\n            var _this = this;\n            var /** @type {?} */ res = [];\n            Object.keys(queries).forEach(function (propertyName) {\n                var /** @type {?} */ query = queries[propertyName];\n                if (query.isViewQuery === isViewQuery) {\n                    res.push(_this._getQueryMetadata(query, propertyName, directiveType));\n                }\n            });\n            return res;\n        };\n        /**\n         * @param {?} selector\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._queryVarBindings = function (selector) { return selector.split(/\\s*,\\s*/); };\n        /**\n         * @param {?} q\n         * @param {?} propertyName\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._getQueryMetadata = function (q, propertyName, typeOrFunc) {\n            var _this = this;\n            var /** @type {?} */ selectors;\n            if (typeof q.selector === 'string') {\n                selectors =\n                    this._queryVarBindings(q.selector).map(function (varName) { return _this._getTokenMetadata(varName); });\n            }\n            else {\n                if (!q.selector) {\n                    this._reportError(new SyntaxError(\"Can't construct a query for the property \\\"\" + propertyName + \"\\\" of \\\"\" + stringifyType(typeOrFunc) + \"\\\" since the query selector wasn't defined.\"), typeOrFunc);\n                }\n                selectors = [this._getTokenMetadata(q.selector)];\n            }\n            return {\n                selectors: selectors,\n                first: q.first,\n                descendants: q.descendants, propertyName: propertyName,\n                read: q.read ? this._getTokenMetadata(q.read) : null\n            };\n        };\n        /**\n         * @param {?} error\n         * @param {?=} type\n         * @param {?=} otherType\n         * @return {?}\n         */\n        CompileMetadataResolver.prototype._reportError = function (error, type, otherType) {\n            if (this._errorCollector) {\n                this._errorCollector(error, type);\n                if (otherType) {\n                    this._errorCollector(error, otherType);\n                }\n            }\n            else {\n                throw error;\n            }\n        };\n        /** @nocollapse */\n        CompileMetadataResolver.ctorParameters = function () { return [\n            { type: NgModuleResolver, },\n            { type: DirectiveResolver, },\n            { type: PipeResolver, },\n            { type: SummaryResolver, },\n            { type: ElementSchemaRegistry, },\n            { type: DirectiveNormalizer, },\n            { type: ReflectorReader, },\n            { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [ERROR_COLLECTOR_TOKEN,] },] },\n        ]; };\n        CompileMetadataResolver = __decorate$9([\n            CompilerInjectable(), \n            __metadata$9('design:paramtypes', [NgModuleResolver, DirectiveResolver, PipeResolver, SummaryResolver, ElementSchemaRegistry, DirectiveNormalizer, ReflectorReader, Function])\n        ], CompileMetadataResolver);\n        return CompileMetadataResolver;\n    }());\n    /**\n     * @param {?} tree\n     * @param {?=} out\n     * @return {?}\n     */\n    function flattenArray(tree, out) {\n        if (out === void 0) { out = []; }\n        if (tree) {\n            for (var /** @type {?} */ i = 0; i < tree.length; i++) {\n                var /** @type {?} */ item = _angular_core.resolveForwardRef(tree[i]);\n                if (Array.isArray(item)) {\n                    flattenArray(item, out);\n                }\n                else {\n                    out.push(item);\n                }\n            }\n        }\n        return out;\n    }\n    /**\n     * @param {?} array\n     * @return {?}\n     */\n    function dedupeArray(array) {\n        if (array) {\n            return Array.from(new Set(array));\n        }\n        return [];\n    }\n    /**\n     * @param {?} tree\n     * @return {?}\n     */\n    function flattenAndDedupeArray(tree) {\n        return dedupeArray(flattenArray(tree));\n    }\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    function isValidType(value) {\n        return (value instanceof StaticSymbol) || (value instanceof _angular_core.Type);\n    }\n    /**\n     * @param {?} reflector\n     * @param {?} type\n     * @param {?} cmpMetadata\n     * @return {?}\n     */\n    function componentModuleUrl(reflector, type, cmpMetadata) {\n        if (type instanceof StaticSymbol) {\n            return type.filePath;\n        }\n        var /** @type {?} */ moduleId = cmpMetadata.moduleId;\n        if (typeof moduleId === 'string') {\n            var /** @type {?} */ scheme = getUrlScheme(moduleId);\n            return scheme ? moduleId : \"package:\" + moduleId + MODULE_SUFFIX;\n        }\n        else if (moduleId !== null && moduleId !== void 0) {\n            throw new SyntaxError((\"moduleId should be a string in \\\"\" + stringifyType(type) + \"\\\". See https://goo.gl/wIDDiL for more information.\\n\") +\n                \"If you're using Webpack you should inline the template and the styles, see https://goo.gl/X2J8zc.\");\n        }\n        return reflector.importUri(type);\n    }\n    /**\n     * @param {?} value\n     * @param {?} targetIdentifiers\n     * @return {?}\n     */\n    function extractIdentifiers(value, targetIdentifiers) {\n        visitValue(value, new _CompileValueConverter(), targetIdentifiers);\n    }\n    var _CompileValueConverter = (function (_super) {\n        __extends$21(_CompileValueConverter, _super);\n        function _CompileValueConverter() {\n            _super.apply(this, arguments);\n        }\n        /**\n         * @param {?} value\n         * @param {?} targetIdentifiers\n         * @return {?}\n         */\n        _CompileValueConverter.prototype.visitOther = function (value, targetIdentifiers) {\n            targetIdentifiers.push({ reference: value });\n        };\n        return _CompileValueConverter;\n    }(ValueTransformer));\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function stringifyType(type) {\n        if (type instanceof StaticSymbol) {\n            return type.name + \" in \" + type.filePath;\n        }\n        else {\n            return stringify(type);\n        }\n    }\n\n    var /** @type {?} */ QUOTED_KEYS = '$quoted$';\n    /**\n     * @param {?} value\n     * @param {?=} type\n     * @return {?}\n     */\n    function convertValueToOutputAst(value, type) {\n        if (type === void 0) { type = null; }\n        return visitValue(value, new _ValueOutputAstTransformer(), type);\n    }\n    var _ValueOutputAstTransformer = (function () {\n        function _ValueOutputAstTransformer() {\n        }\n        /**\n         * @param {?} arr\n         * @param {?} type\n         * @return {?}\n         */\n        _ValueOutputAstTransformer.prototype.visitArray = function (arr, type) {\n            var _this = this;\n            return literalArr(arr.map(function (value) { return visitValue(value, _this, null); }), type);\n        };\n        /**\n         * @param {?} map\n         * @param {?} type\n         * @return {?}\n         */\n        _ValueOutputAstTransformer.prototype.visitStringMap = function (map, type) {\n            var _this = this;\n            var /** @type {?} */ entries = [];\n            var /** @type {?} */ quotedSet = new Set(map && map[QUOTED_KEYS]);\n            Object.keys(map).forEach(function (key) {\n                entries.push(new LiteralMapEntry(key, visitValue(map[key], _this, null), quotedSet.has(key)));\n            });\n            return new LiteralMapExpr(entries, type);\n        };\n        /**\n         * @param {?} value\n         * @param {?} type\n         * @return {?}\n         */\n        _ValueOutputAstTransformer.prototype.visitPrimitive = function (value, type) { return literal(value, type); };\n        /**\n         * @param {?} value\n         * @param {?} type\n         * @return {?}\n         */\n        _ValueOutputAstTransformer.prototype.visitOther = function (value, type) {\n            if (value instanceof Expression) {\n                return value;\n            }\n            else {\n                return importExpr({ reference: value });\n            }\n        };\n        return _ValueOutputAstTransformer;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$13 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$13 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var ComponentFactoryDependency = (function () {\n        /**\n         * @param {?} comp\n         * @param {?} placeholder\n         */\n        function ComponentFactoryDependency(comp, placeholder) {\n            this.comp = comp;\n            this.placeholder = placeholder;\n        }\n        return ComponentFactoryDependency;\n    }());\n    var NgModuleCompileResult = (function () {\n        /**\n         * @param {?} statements\n         * @param {?} ngModuleFactoryVar\n         * @param {?} dependencies\n         */\n        function NgModuleCompileResult(statements, ngModuleFactoryVar, dependencies) {\n            this.statements = statements;\n            this.ngModuleFactoryVar = ngModuleFactoryVar;\n            this.dependencies = dependencies;\n        }\n        return NgModuleCompileResult;\n    }());\n    var NgModuleCompiler = (function () {\n        function NgModuleCompiler() {\n        }\n        /**\n         * @param {?} ngModuleMeta\n         * @param {?} extraProviders\n         * @return {?}\n         */\n        NgModuleCompiler.prototype.compile = function (ngModuleMeta, extraProviders) {\n            var /** @type {?} */ moduleUrl = identifierModuleUrl(ngModuleMeta.type);\n            var /** @type {?} */ sourceFileName = isPresent(moduleUrl) ?\n                \"in NgModule \" + identifierName(ngModuleMeta.type) + \" in \" + moduleUrl :\n                \"in NgModule \" + identifierName(ngModuleMeta.type);\n            var /** @type {?} */ sourceFile = new ParseSourceFile('', sourceFileName);\n            var /** @type {?} */ sourceSpan = new ParseSourceSpan(new ParseLocation(sourceFile, null, null, null), new ParseLocation(sourceFile, null, null, null));\n            var /** @type {?} */ deps = [];\n            var /** @type {?} */ bootstrapComponentFactories = [];\n            var /** @type {?} */ entryComponentFactories = ngModuleMeta.transitiveModule.entryComponents.map(function (entryComponent) {\n                var /** @type {?} */ id = { reference: null };\n                if (ngModuleMeta.bootstrapComponents.some(function (id) { return id.reference === entryComponent.reference; })) {\n                    bootstrapComponentFactories.push(id);\n                }\n                deps.push(new ComponentFactoryDependency(entryComponent, id));\n                return id;\n            });\n            var /** @type {?} */ builder = new _InjectorBuilder(ngModuleMeta, entryComponentFactories, bootstrapComponentFactories, sourceSpan);\n            var /** @type {?} */ providerParser = new NgModuleProviderAnalyzer(ngModuleMeta, extraProviders, sourceSpan);\n            providerParser.parse().forEach(function (provider) { return builder.addProvider(provider); });\n            var /** @type {?} */ injectorClass = builder.build();\n            var /** @type {?} */ ngModuleFactoryVar = identifierName(ngModuleMeta.type) + \"NgFactory\";\n            var /** @type {?} */ ngModuleFactoryStmt = variable(ngModuleFactoryVar)\n                .set(importExpr(createIdentifier(Identifiers.NgModuleFactory))\n                .instantiate([variable(injectorClass.name), importExpr(ngModuleMeta.type)], importType(createIdentifier(Identifiers.NgModuleFactory), [importType(ngModuleMeta.type)], [TypeModifier.Const])))\n                .toDeclStmt(null, [StmtModifier.Final]);\n            var /** @type {?} */ stmts = [injectorClass, ngModuleFactoryStmt];\n            if (ngModuleMeta.id) {\n                var /** @type {?} */ registerFactoryStmt = importExpr(createIdentifier(Identifiers.RegisterModuleFactoryFn))\n                    .callFn([literal(ngModuleMeta.id), variable(ngModuleFactoryVar)])\n                    .toStmt();\n                stmts.push(registerFactoryStmt);\n            }\n            return new NgModuleCompileResult(stmts, ngModuleFactoryVar, deps);\n        };\n        NgModuleCompiler = __decorate$13([\n            CompilerInjectable(), \n            __metadata$13('design:paramtypes', [])\n        ], NgModuleCompiler);\n        return NgModuleCompiler;\n    }());\n    var _InjectorBuilder = (function () {\n        /**\n         * @param {?} _ngModuleMeta\n         * @param {?} _entryComponentFactories\n         * @param {?} _bootstrapComponentFactories\n         * @param {?} _sourceSpan\n         */\n        function _InjectorBuilder(_ngModuleMeta, _entryComponentFactories, _bootstrapComponentFactories, _sourceSpan) {\n            this._ngModuleMeta = _ngModuleMeta;\n            this._entryComponentFactories = _entryComponentFactories;\n            this._bootstrapComponentFactories = _bootstrapComponentFactories;\n            this._sourceSpan = _sourceSpan;\n            this.fields = [];\n            this.getters = [];\n            this.methods = [];\n            this.ctorStmts = [];\n            this._tokens = [];\n            this._instances = new Map();\n            this._createStmts = [];\n            this._destroyStmts = [];\n        }\n        /**\n         * @param {?} resolvedProvider\n         * @return {?}\n         */\n        _InjectorBuilder.prototype.addProvider = function (resolvedProvider) {\n            var _this = this;\n            var /** @type {?} */ providerValueExpressions = resolvedProvider.providers.map(function (provider) { return _this._getProviderValue(provider); });\n            var /** @type {?} */ propName = \"_\" + tokenName(resolvedProvider.token) + \"_\" + this._instances.size;\n            var /** @type {?} */ instance = this._createProviderProperty(propName, resolvedProvider, providerValueExpressions, resolvedProvider.multiProvider, resolvedProvider.eager);\n            if (resolvedProvider.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n                this._destroyStmts.push(instance.callMethod('ngOnDestroy', []).toStmt());\n            }\n            this._tokens.push(resolvedProvider.token);\n            this._instances.set(tokenReference(resolvedProvider.token), instance);\n        };\n        /**\n         * @return {?}\n         */\n        _InjectorBuilder.prototype.build = function () {\n            var _this = this;\n            var /** @type {?} */ getMethodStmts = this._tokens.map(function (token) {\n                var /** @type {?} */ providerExpr = _this._instances.get(tokenReference(token));\n                return new IfStmt(InjectMethodVars.token.identical(createDiTokenExpression(token)), [new ReturnStatement(providerExpr)]);\n            });\n            var /** @type {?} */ methods = [\n                new ClassMethod('createInternal', [], this._createStmts.concat(new ReturnStatement(this._instances.get(this._ngModuleMeta.type.reference))), importType(this._ngModuleMeta.type)),\n                new ClassMethod('getInternal', [\n                    new FnParam(InjectMethodVars.token.name, DYNAMIC_TYPE),\n                    new FnParam(InjectMethodVars.notFoundResult.name, DYNAMIC_TYPE)\n                ], getMethodStmts.concat([new ReturnStatement(InjectMethodVars.notFoundResult)]), DYNAMIC_TYPE),\n                new ClassMethod('destroyInternal', [], this._destroyStmts),\n            ];\n            var /** @type {?} */ parentArgs = [\n                variable(InjectorProps.parent.name),\n                literalArr(this._entryComponentFactories.map(function (componentFactory) { return importExpr(componentFactory); })),\n                literalArr(this._bootstrapComponentFactories.map(function (componentFactory) { return importExpr(componentFactory); }))\n            ];\n            var /** @type {?} */ injClassName = identifierName(this._ngModuleMeta.type) + \"Injector\";\n            return createClassStmt({\n                name: injClassName,\n                ctorParams: [new FnParam(InjectorProps.parent.name, importType(createIdentifier(Identifiers.Injector)))],\n                parent: importExpr(createIdentifier(Identifiers.NgModuleInjector), [importType(this._ngModuleMeta.type)]),\n                parentArgs: parentArgs,\n                builders: [{ methods: methods }, this]\n            });\n        };\n        /**\n         * @param {?} provider\n         * @return {?}\n         */\n        _InjectorBuilder.prototype._getProviderValue = function (provider) {\n            var _this = this;\n            var /** @type {?} */ result;\n            if (isPresent(provider.useExisting)) {\n                result = this._getDependency({ token: provider.useExisting });\n            }\n            else if (isPresent(provider.useFactory)) {\n                var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n                var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(dep); });\n                result = importExpr(provider.useFactory).callFn(depsExpr);\n            }\n            else if (isPresent(provider.useClass)) {\n                var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n                var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(dep); });\n                result =\n                    importExpr(provider.useClass).instantiate(depsExpr, importType(provider.useClass));\n            }\n            else {\n                result = convertValueToOutputAst(provider.useValue);\n            }\n            return result;\n        };\n        /**\n         * @param {?} propName\n         * @param {?} provider\n         * @param {?} providerValueExpressions\n         * @param {?} isMulti\n         * @param {?} isEager\n         * @return {?}\n         */\n        _InjectorBuilder.prototype._createProviderProperty = function (propName, provider, providerValueExpressions, isMulti, isEager) {\n            var /** @type {?} */ resolvedProviderValueExpr;\n            var /** @type {?} */ type;\n            if (isMulti) {\n                resolvedProviderValueExpr = literalArr(providerValueExpressions);\n                type = new ArrayType(DYNAMIC_TYPE);\n            }\n            else {\n                resolvedProviderValueExpr = providerValueExpressions[0];\n                type = providerValueExpressions[0].type;\n            }\n            if (!type) {\n                type = DYNAMIC_TYPE;\n            }\n            if (isEager) {\n                this.fields.push(new ClassField(propName, type));\n                this._createStmts.push(THIS_EXPR.prop(propName).set(resolvedProviderValueExpr).toStmt());\n            }\n            else {\n                var /** @type {?} */ internalField = \"_\" + propName;\n                this.fields.push(new ClassField(internalField, type));\n                // Note: Equals is important for JS so that it also checks the undefined case!\n                var /** @type {?} */ getterStmts = [\n                    new IfStmt(THIS_EXPR.prop(internalField).isBlank(), [THIS_EXPR.prop(internalField).set(resolvedProviderValueExpr).toStmt()]),\n                    new ReturnStatement(THIS_EXPR.prop(internalField))\n                ];\n                this.getters.push(new ClassGetter(propName, getterStmts, type));\n            }\n            return THIS_EXPR.prop(propName);\n        };\n        /**\n         * @param {?} dep\n         * @return {?}\n         */\n        _InjectorBuilder.prototype._getDependency = function (dep) {\n            var /** @type {?} */ result = null;\n            if (dep.isValue) {\n                result = literal(dep.value);\n            }\n            if (!dep.isSkipSelf) {\n                if (dep.token &&\n                    (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector) ||\n                        tokenReference(dep.token) === resolveIdentifier(Identifiers.ComponentFactoryResolver))) {\n                    result = THIS_EXPR;\n                }\n                if (!result) {\n                    result = this._instances.get(tokenReference(dep.token));\n                }\n            }\n            if (!result) {\n                var /** @type {?} */ args = [createDiTokenExpression(dep.token)];\n                if (dep.isOptional) {\n                    args.push(NULL_EXPR);\n                }\n                result = InjectorProps.parent.callMethod('get', args);\n            }\n            return result;\n        };\n        return _InjectorBuilder;\n    }());\n    var InjectorProps = (function () {\n        function InjectorProps() {\n        }\n        InjectorProps.parent = THIS_EXPR.prop('parent');\n        return InjectorProps;\n    }());\n    var InjectMethodVars = (function () {\n        function InjectMethodVars() {\n        }\n        InjectMethodVars.token = variable('token');\n        InjectMethodVars.notFoundResult = variable('notFoundResult');\n        return InjectMethodVars;\n    }());\n\n    var /** @type {?} */ _SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\\\|\\n|\\r|\\$/g;\n    var /** @type {?} */ _LEGAL_IDENTIFIER_RE = /^[$A-Z_][0-9A-Z_$]*$/i;\n    var /** @type {?} */ CATCH_ERROR_VAR$1 = variable('error');\n    var /** @type {?} */ CATCH_STACK_VAR$1 = variable('stack');\n    var _EmittedLine = (function () {\n        /**\n         * @param {?} indent\n         */\n        function _EmittedLine(indent) {\n            this.indent = indent;\n            this.parts = [];\n        }\n        return _EmittedLine;\n    }());\n    var EmitterVisitorContext = (function () {\n        /**\n         * @param {?} _exportedVars\n         * @param {?} _indent\n         */\n        function EmitterVisitorContext(_exportedVars, _indent) {\n            this._exportedVars = _exportedVars;\n            this._indent = _indent;\n            this._classes = [];\n            this._lines = [new _EmittedLine(_indent)];\n        }\n        /**\n         * @param {?} exportedVars\n         * @return {?}\n         */\n        EmitterVisitorContext.createRoot = function (exportedVars) {\n            return new EmitterVisitorContext(exportedVars, 0);\n        };\n        Object.defineProperty(EmitterVisitorContext.prototype, \"_currentLine\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._lines[this._lines.length - 1]; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} varName\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.isExportedVar = function (varName) { return this._exportedVars.indexOf(varName) !== -1; };\n        /**\n         * @param {?=} lastPart\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.println = function (lastPart) {\n            if (lastPart === void 0) { lastPart = ''; }\n            this.print(lastPart, true);\n        };\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.lineIsEmpty = function () { return this._currentLine.parts.length === 0; };\n        /**\n         * @param {?} part\n         * @param {?=} newLine\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.print = function (part, newLine) {\n            if (newLine === void 0) { newLine = false; }\n            if (part.length > 0) {\n                this._currentLine.parts.push(part);\n            }\n            if (newLine) {\n                this._lines.push(new _EmittedLine(this._indent));\n            }\n        };\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.removeEmptyLastLine = function () {\n            if (this.lineIsEmpty()) {\n                this._lines.pop();\n            }\n        };\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.incIndent = function () {\n            this._indent++;\n            this._currentLine.indent = this._indent;\n        };\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.decIndent = function () {\n            this._indent--;\n            this._currentLine.indent = this._indent;\n        };\n        /**\n         * @param {?} clazz\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.pushClass = function (clazz) { this._classes.push(clazz); };\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.popClass = function () { return this._classes.pop(); };\n        Object.defineProperty(EmitterVisitorContext.prototype, \"currentClass\", {\n            /**\n             * @return {?}\n             */\n            get: function () {\n                return this._classes.length > 0 ? this._classes[this._classes.length - 1] : null;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @return {?}\n         */\n        EmitterVisitorContext.prototype.toSource = function () {\n            var /** @type {?} */ lines = this._lines;\n            if (lines[lines.length - 1].parts.length === 0) {\n                lines = lines.slice(0, lines.length - 1);\n            }\n            return lines\n                .map(function (line) {\n                if (line.parts.length > 0) {\n                    return _createIndent(line.indent) + line.parts.join('');\n                }\n                else {\n                    return '';\n                }\n            })\n                .join('\\n');\n        };\n        return EmitterVisitorContext;\n    }());\n    /**\n     * @abstract\n     */\n    var AbstractEmitterVisitor = (function () {\n        /**\n         * @param {?} _escapeDollarInStrings\n         */\n        function AbstractEmitterVisitor(_escapeDollarInStrings) {\n            this._escapeDollarInStrings = _escapeDollarInStrings;\n        }\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitExpressionStmt = function (stmt, ctx) {\n            stmt.expr.visitExpression(this, ctx);\n            ctx.println(';');\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitReturnStmt = function (stmt, ctx) {\n            ctx.print(\"return \");\n            stmt.value.visitExpression(this, ctx);\n            ctx.println(';');\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitCastExpr = function (ast, context) { };\n        /**\n         * @abstract\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) { };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitIfStmt = function (stmt, ctx) {\n            ctx.print(\"if (\");\n            stmt.condition.visitExpression(this, ctx);\n            ctx.print(\") {\");\n            var /** @type {?} */ hasElseCase = isPresent(stmt.falseCase) && stmt.falseCase.length > 0;\n            if (stmt.trueCase.length <= 1 && !hasElseCase) {\n                ctx.print(\" \");\n                this.visitAllStatements(stmt.trueCase, ctx);\n                ctx.removeEmptyLastLine();\n                ctx.print(\" \");\n            }\n            else {\n                ctx.println();\n                ctx.incIndent();\n                this.visitAllStatements(stmt.trueCase, ctx);\n                ctx.decIndent();\n                if (hasElseCase) {\n                    ctx.println(\"} else {\");\n                    ctx.incIndent();\n                    this.visitAllStatements(stmt.falseCase, ctx);\n                    ctx.decIndent();\n                }\n            }\n            ctx.println(\"}\");\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) { };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitThrowStmt = function (stmt, ctx) {\n            ctx.print(\"throw \");\n            stmt.error.visitExpression(this, ctx);\n            ctx.println(\";\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitCommentStmt = function (stmt, ctx) {\n            var /** @type {?} */ lines = stmt.comment.split('\\n');\n            lines.forEach(function (line) { ctx.println(\"// \" + line); });\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) { };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitWriteVarExpr = function (expr, ctx) {\n            var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n            if (!lineWasEmpty) {\n                ctx.print('(');\n            }\n            ctx.print(expr.name + \" = \");\n            expr.value.visitExpression(this, ctx);\n            if (!lineWasEmpty) {\n                ctx.print(')');\n            }\n            return null;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitWriteKeyExpr = function (expr, ctx) {\n            var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n            if (!lineWasEmpty) {\n                ctx.print('(');\n            }\n            expr.receiver.visitExpression(this, ctx);\n            ctx.print(\"[\");\n            expr.index.visitExpression(this, ctx);\n            ctx.print(\"] = \");\n            expr.value.visitExpression(this, ctx);\n            if (!lineWasEmpty) {\n                ctx.print(')');\n            }\n            return null;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitWritePropExpr = function (expr, ctx) {\n            var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n            if (!lineWasEmpty) {\n                ctx.print('(');\n            }\n            expr.receiver.visitExpression(this, ctx);\n            ctx.print(\".\" + expr.name + \" = \");\n            expr.value.visitExpression(this, ctx);\n            if (!lineWasEmpty) {\n                ctx.print(')');\n            }\n            return null;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitInvokeMethodExpr = function (expr, ctx) {\n            expr.receiver.visitExpression(this, ctx);\n            var /** @type {?} */ name = expr.name;\n            if (isPresent(expr.builtin)) {\n                name = this.getBuiltinMethodName(expr.builtin);\n                if (isBlank(name)) {\n                    // some builtins just mean to skip the call.\n                    return null;\n                }\n            }\n            ctx.print(\".\" + name + \"(\");\n            this.visitAllExpressions(expr.args, ctx, \",\");\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} method\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.getBuiltinMethodName = function (method) { };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {\n            expr.fn.visitExpression(this, ctx);\n            ctx.print(\"(\");\n            this.visitAllExpressions(expr.args, ctx, ',');\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {\n            var /** @type {?} */ varName = ast.name;\n            if (isPresent(ast.builtin)) {\n                switch (ast.builtin) {\n                    case BuiltinVar.Super:\n                        varName = 'super';\n                        break;\n                    case BuiltinVar.This:\n                        varName = 'this';\n                        break;\n                    case BuiltinVar.CatchError:\n                        varName = CATCH_ERROR_VAR$1.name;\n                        break;\n                    case BuiltinVar.CatchStack:\n                        varName = CATCH_STACK_VAR$1.name;\n                        break;\n                    default:\n                        throw new Error(\"Unknown builtin variable \" + ast.builtin);\n                }\n            }\n            ctx.print(varName);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitInstantiateExpr = function (ast, ctx) {\n            ctx.print(\"new \");\n            ast.classExpr.visitExpression(this, ctx);\n            ctx.print(\"(\");\n            this.visitAllExpressions(ast.args, ctx, ',');\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {\n            var /** @type {?} */ value = ast.value;\n            if (typeof value === 'string') {\n                ctx.print(escapeIdentifier(value, this._escapeDollarInStrings));\n            }\n            else {\n                ctx.print(\"\" + value);\n            }\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) { };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitConditionalExpr = function (ast, ctx) {\n            ctx.print(\"(\");\n            ast.condition.visitExpression(this, ctx);\n            ctx.print('? ');\n            ast.trueCase.visitExpression(this, ctx);\n            ctx.print(': ');\n            ast.falseCase.visitExpression(this, ctx);\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitNotExpr = function (ast, ctx) {\n            ctx.print('!');\n            ast.condition.visitExpression(this, ctx);\n            return null;\n        };\n        /**\n         * @abstract\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) { };\n        /**\n         * @abstract\n         * @param {?} stmt\n         * @param {?} context\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) { };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitBinaryOperatorExpr = function (ast, ctx) {\n            var /** @type {?} */ opStr;\n            switch (ast.operator) {\n                case BinaryOperator.Equals:\n                    opStr = '==';\n                    break;\n                case BinaryOperator.Identical:\n                    opStr = '===';\n                    break;\n                case BinaryOperator.NotEquals:\n                    opStr = '!=';\n                    break;\n                case BinaryOperator.NotIdentical:\n                    opStr = '!==';\n                    break;\n                case BinaryOperator.And:\n                    opStr = '&&';\n                    break;\n                case BinaryOperator.Or:\n                    opStr = '||';\n                    break;\n                case BinaryOperator.Plus:\n                    opStr = '+';\n                    break;\n                case BinaryOperator.Minus:\n                    opStr = '-';\n                    break;\n                case BinaryOperator.Divide:\n                    opStr = '/';\n                    break;\n                case BinaryOperator.Multiply:\n                    opStr = '*';\n                    break;\n                case BinaryOperator.Modulo:\n                    opStr = '%';\n                    break;\n                case BinaryOperator.Lower:\n                    opStr = '<';\n                    break;\n                case BinaryOperator.LowerEquals:\n                    opStr = '<=';\n                    break;\n                case BinaryOperator.Bigger:\n                    opStr = '>';\n                    break;\n                case BinaryOperator.BiggerEquals:\n                    opStr = '>=';\n                    break;\n                default:\n                    throw new Error(\"Unknown operator \" + ast.operator);\n            }\n            ctx.print(\"(\");\n            ast.lhs.visitExpression(this, ctx);\n            ctx.print(\" \" + opStr + \" \");\n            ast.rhs.visitExpression(this, ctx);\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitReadPropExpr = function (ast, ctx) {\n            ast.receiver.visitExpression(this, ctx);\n            ctx.print(\".\");\n            ctx.print(ast.name);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitReadKeyExpr = function (ast, ctx) {\n            ast.receiver.visitExpression(this, ctx);\n            ctx.print(\"[\");\n            ast.index.visitExpression(this, ctx);\n            ctx.print(\"]\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n            var /** @type {?} */ useNewLine = ast.entries.length > 1;\n            ctx.print(\"[\", useNewLine);\n            ctx.incIndent();\n            this.visitAllExpressions(ast.entries, ctx, ',', useNewLine);\n            ctx.decIndent();\n            ctx.print(\"]\", useNewLine);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitLiteralMapExpr = function (ast, ctx) {\n            var _this = this;\n            var /** @type {?} */ useNewLine = ast.entries.length > 1;\n            ctx.print(\"{\", useNewLine);\n            ctx.incIndent();\n            this.visitAllObjects(function (entry) {\n                ctx.print(escapeIdentifier(entry.key, _this._escapeDollarInStrings, entry.quoted) + \": \");\n                entry.value.visitExpression(_this, ctx);\n            }, ast.entries, ctx, ',', useNewLine);\n            ctx.decIndent();\n            ctx.print(\"}\", useNewLine);\n            return null;\n        };\n        /**\n         * @param {?} expressions\n         * @param {?} ctx\n         * @param {?} separator\n         * @param {?=} newLine\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitAllExpressions = function (expressions, ctx, separator, newLine) {\n            var _this = this;\n            if (newLine === void 0) { newLine = false; }\n            this.visitAllObjects(function (expr) { return expr.visitExpression(_this, ctx); }, expressions, ctx, separator, newLine);\n        };\n        /**\n         * @param {?} handler\n         * @param {?} expressions\n         * @param {?} ctx\n         * @param {?} separator\n         * @param {?=} newLine\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitAllObjects = function (handler, expressions, ctx, separator, newLine) {\n            if (newLine === void 0) { newLine = false; }\n            for (var /** @type {?} */ i = 0; i < expressions.length; i++) {\n                if (i > 0) {\n                    ctx.print(separator, newLine);\n                }\n                handler(expressions[i]);\n            }\n            if (newLine) {\n                ctx.println();\n            }\n        };\n        /**\n         * @param {?} statements\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractEmitterVisitor.prototype.visitAllStatements = function (statements, ctx) {\n            var _this = this;\n            statements.forEach(function (stmt) { return stmt.visitStatement(_this, ctx); });\n        };\n        return AbstractEmitterVisitor;\n    }());\n    /**\n     * @param {?} input\n     * @param {?} escapeDollar\n     * @param {?=} alwaysQuote\n     * @return {?}\n     */\n    function escapeIdentifier(input, escapeDollar, alwaysQuote) {\n        if (alwaysQuote === void 0) { alwaysQuote = true; }\n        if (isBlank(input)) {\n            return null;\n        }\n        var /** @type {?} */ body = input.replace(_SINGLE_QUOTE_ESCAPE_STRING_RE, function () {\n            var match = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                match[_i - 0] = arguments[_i];\n            }\n            if (match[0] == '$') {\n                return escapeDollar ? '\\\\$' : '$';\n            }\n            else if (match[0] == '\\n') {\n                return '\\\\n';\n            }\n            else if (match[0] == '\\r') {\n                return '\\\\r';\n            }\n            else {\n                return \"\\\\\" + match[0];\n            }\n        });\n        var /** @type {?} */ requiresQuotes = alwaysQuote || !_LEGAL_IDENTIFIER_RE.test(body);\n        return requiresQuotes ? \"'\" + body + \"'\" : body;\n    }\n    /**\n     * @param {?} count\n     * @return {?}\n     */\n    function _createIndent(count) {\n        var /** @type {?} */ res = '';\n        for (var /** @type {?} */ i = 0; i < count; i++) {\n            res += '  ';\n        }\n        return res;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$22 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ _debugModuleUrl = '/debug/lib';\n    /**\n     * @param {?} ast\n     * @return {?}\n     */\n    function debugOutputAstAsTypeScript(ast) {\n        var /** @type {?} */ converter = new _TsEmitterVisitor(_debugModuleUrl);\n        var /** @type {?} */ ctx = EmitterVisitorContext.createRoot([]);\n        var /** @type {?} */ asts = Array.isArray(ast) ? ast : [ast];\n        asts.forEach(function (ast) {\n            if (ast instanceof Statement) {\n                ast.visitStatement(converter, ctx);\n            }\n            else if (ast instanceof Expression) {\n                ast.visitExpression(converter, ctx);\n            }\n            else if (ast instanceof Type$1) {\n                ast.visitType(converter, ctx);\n            }\n            else {\n                throw new Error(\"Don't know how to print debug info for \" + ast);\n            }\n        });\n        return ctx.toSource();\n    }\n    var TypeScriptEmitter = (function () {\n        /**\n         * @param {?} _importGenerator\n         */\n        function TypeScriptEmitter(_importGenerator) {\n            this._importGenerator = _importGenerator;\n        }\n        /**\n         * @param {?} moduleUrl\n         * @param {?} stmts\n         * @param {?} exportedVars\n         * @return {?}\n         */\n        TypeScriptEmitter.prototype.emitStatements = function (moduleUrl, stmts, exportedVars) {\n            var _this = this;\n            var /** @type {?} */ converter = new _TsEmitterVisitor(moduleUrl);\n            var /** @type {?} */ ctx = EmitterVisitorContext.createRoot(exportedVars);\n            converter.visitAllStatements(stmts, ctx);\n            var /** @type {?} */ srcParts = [];\n            converter.importsWithPrefixes.forEach(function (prefix, importedModuleUrl) {\n                // Note: can't write the real word for import as it screws up system.js auto detection...\n                srcParts.push(\"imp\" +\n                    (\"ort * as \" + prefix + \" from '\" + _this._importGenerator.fileNameToModuleName(importedModuleUrl, moduleUrl) + \"';\"));\n            });\n            srcParts.push(ctx.toSource());\n            return srcParts.join('\\n');\n        };\n        return TypeScriptEmitter;\n    }());\n    var _TsEmitterVisitor = (function (_super) {\n        __extends$22(_TsEmitterVisitor, _super);\n        /**\n         * @param {?} _moduleUrl\n         */\n        function _TsEmitterVisitor(_moduleUrl) {\n            _super.call(this, false);\n            this._moduleUrl = _moduleUrl;\n            this.importsWithPrefixes = new Map();\n        }\n        /**\n         * @param {?} t\n         * @param {?} ctx\n         * @param {?=} defaultType\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitType = function (t, ctx, defaultType) {\n            if (defaultType === void 0) { defaultType = 'any'; }\n            if (isPresent(t)) {\n                t.visitType(this, ctx);\n            }\n            else {\n                ctx.print(defaultType);\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {\n            var /** @type {?} */ value = ast.value;\n            if (isBlank(value) && ast.type != NULL_TYPE) {\n                ctx.print(\"(\" + value + \" as any)\");\n                return null;\n            }\n            return _super.prototype.visitLiteralExpr.call(this, ast, ctx);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n            if (ast.entries.length === 0) {\n                ctx.print('(');\n            }\n            var /** @type {?} */ result = _super.prototype.visitLiteralArrayExpr.call(this, ast, ctx);\n            if (ast.entries.length === 0) {\n                ctx.print(' as any[])');\n            }\n            return result;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {\n            this._visitIdentifier(ast.value, ast.typeParams, ctx);\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n            if (ctx.isExportedVar(stmt.name)) {\n                ctx.print(\"export \");\n            }\n            if (stmt.hasModifier(StmtModifier.Final)) {\n                ctx.print(\"const\");\n            }\n            else {\n                ctx.print(\"var\");\n            }\n            ctx.print(\" \" + stmt.name + \":\");\n            this.visitType(stmt.type, ctx);\n            ctx.print(\" = \");\n            stmt.value.visitExpression(this, ctx);\n            ctx.println(\";\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {\n            ctx.print(\"(<\");\n            ast.type.visitType(this, ctx);\n            ctx.print(\">\");\n            ast.value.visitExpression(this, ctx);\n            ctx.print(\")\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n            var _this = this;\n            ctx.pushClass(stmt);\n            if (ctx.isExportedVar(stmt.name)) {\n                ctx.print(\"export \");\n            }\n            ctx.print(\"class \" + stmt.name);\n            if (isPresent(stmt.parent)) {\n                ctx.print(\" extends \");\n                stmt.parent.visitExpression(this, ctx);\n            }\n            ctx.println(\" {\");\n            ctx.incIndent();\n            stmt.fields.forEach(function (field) { return _this._visitClassField(field, ctx); });\n            if (isPresent(stmt.constructorMethod)) {\n                this._visitClassConstructor(stmt, ctx);\n            }\n            stmt.getters.forEach(function (getter) { return _this._visitClassGetter(getter, ctx); });\n            stmt.methods.forEach(function (method) { return _this._visitClassMethod(method, ctx); });\n            ctx.decIndent();\n            ctx.println(\"}\");\n            ctx.popClass();\n            return null;\n        };\n        /**\n         * @param {?} field\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitClassField = function (field, ctx) {\n            if (field.hasModifier(StmtModifier.Private)) {\n                // comment out as a workaround for #10967\n                ctx.print(\"/*private*/ \");\n            }\n            ctx.print(field.name);\n            ctx.print(':');\n            this.visitType(field.type, ctx);\n            ctx.println(\";\");\n        };\n        /**\n         * @param {?} getter\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitClassGetter = function (getter, ctx) {\n            if (getter.hasModifier(StmtModifier.Private)) {\n                ctx.print(\"private \");\n            }\n            ctx.print(\"get \" + getter.name + \"()\");\n            ctx.print(':');\n            this.visitType(getter.type, ctx);\n            ctx.println(\" {\");\n            ctx.incIndent();\n            this.visitAllStatements(getter.body, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {\n            ctx.print(\"constructor(\");\n            this._visitParams(stmt.constructorMethod.params, ctx);\n            ctx.println(\") {\");\n            ctx.incIndent();\n            this.visitAllStatements(stmt.constructorMethod.body, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n        };\n        /**\n         * @param {?} method\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitClassMethod = function (method, ctx) {\n            if (method.hasModifier(StmtModifier.Private)) {\n                ctx.print(\"private \");\n            }\n            ctx.print(method.name + \"(\");\n            this._visitParams(method.params, ctx);\n            ctx.print(\"):\");\n            this.visitType(method.type, ctx, 'void');\n            ctx.println(\" {\");\n            ctx.incIndent();\n            this.visitAllStatements(method.body, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {\n            ctx.print(\"(\");\n            this._visitParams(ast.params, ctx);\n            ctx.print(\"):\");\n            this.visitType(ast.type, ctx, 'void');\n            ctx.println(\" => {\");\n            ctx.incIndent();\n            this.visitAllStatements(ast.statements, ctx);\n            ctx.decIndent();\n            ctx.print(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n            if (ctx.isExportedVar(stmt.name)) {\n                ctx.print(\"export \");\n            }\n            ctx.print(\"function \" + stmt.name + \"(\");\n            this._visitParams(stmt.params, ctx);\n            ctx.print(\"):\");\n            this.visitType(stmt.type, ctx, 'void');\n            ctx.println(\" {\");\n            ctx.incIndent();\n            this.visitAllStatements(stmt.statements, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {\n            ctx.println(\"try {\");\n            ctx.incIndent();\n            this.visitAllStatements(stmt.bodyStmts, ctx);\n            ctx.decIndent();\n            ctx.println(\"} catch (\" + CATCH_ERROR_VAR$1.name + \") {\");\n            ctx.incIndent();\n            var /** @type {?} */ catchStmts = [(CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack')).toDeclStmt(null, [\n                    StmtModifier.Final\n                ]))].concat(stmt.catchStmts);\n            this.visitAllStatements(catchStmts, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} type\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitBuiltintType = function (type, ctx) {\n            var /** @type {?} */ typeStr;\n            switch (type.name) {\n                case BuiltinTypeName.Bool:\n                    typeStr = 'boolean';\n                    break;\n                case BuiltinTypeName.Dynamic:\n                    typeStr = 'any';\n                    break;\n                case BuiltinTypeName.Function:\n                    typeStr = 'Function';\n                    break;\n                case BuiltinTypeName.Number:\n                    typeStr = 'number';\n                    break;\n                case BuiltinTypeName.Int:\n                    typeStr = 'number';\n                    break;\n                case BuiltinTypeName.String:\n                    typeStr = 'string';\n                    break;\n                default:\n                    throw new Error(\"Unsupported builtin type \" + type.name);\n            }\n            ctx.print(typeStr);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitExpressionType = function (ast, ctx) {\n            var _this = this;\n            ast.value.visitExpression(this, ctx);\n            if (isPresent(ast.typeParams) && ast.typeParams.length > 0) {\n                ctx.print(\"<\");\n                this.visitAllObjects(function (type) { return type.visitType(_this, ctx); }, ast.typeParams, ctx, ',');\n                ctx.print(\">\");\n            }\n            return null;\n        };\n        /**\n         * @param {?} type\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitArrayType = function (type, ctx) {\n            this.visitType(type.of, ctx);\n            ctx.print(\"[]\");\n            return null;\n        };\n        /**\n         * @param {?} type\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.visitMapType = function (type, ctx) {\n            ctx.print(\"{[key: string]:\");\n            this.visitType(type.valueType, ctx);\n            ctx.print(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} method\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {\n            var /** @type {?} */ name;\n            switch (method) {\n                case BuiltinMethod.ConcatArray:\n                    name = 'concat';\n                    break;\n                case BuiltinMethod.SubscribeObservable:\n                    name = 'subscribe';\n                    break;\n                case BuiltinMethod.Bind:\n                    name = 'bind';\n                    break;\n                default:\n                    throw new Error(\"Unknown builtin method: \" + method);\n            }\n            return name;\n        };\n        /**\n         * @param {?} params\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitParams = function (params, ctx) {\n            var _this = this;\n            this.visitAllObjects(function (param) {\n                ctx.print(param.name);\n                ctx.print(':');\n                _this.visitType(param.type, ctx);\n            }, params, ctx, ',');\n        };\n        /**\n         * @param {?} value\n         * @param {?} typeParams\n         * @param {?} ctx\n         * @return {?}\n         */\n        _TsEmitterVisitor.prototype._visitIdentifier = function (value, typeParams, ctx) {\n            var _this = this;\n            var /** @type {?} */ name = identifierName(value);\n            var /** @type {?} */ moduleUrl = identifierModuleUrl(value);\n            if (isBlank(name)) {\n                throw new Error(\"Internal error: unknown identifier \" + value);\n            }\n            if (isPresent(moduleUrl) && moduleUrl != this._moduleUrl) {\n                var /** @type {?} */ prefix = this.importsWithPrefixes.get(moduleUrl);\n                if (isBlank(prefix)) {\n                    prefix = \"import\" + this.importsWithPrefixes.size;\n                    this.importsWithPrefixes.set(moduleUrl, prefix);\n                }\n                ctx.print(prefix + \".\");\n            }\n            if (value.reference && value.reference.members && value.reference.members.length) {\n                ctx.print(value.reference.name);\n                ctx.print('.');\n                ctx.print(value.reference.members.join('.'));\n            }\n            else {\n                ctx.print(name);\n            }\n            if (isPresent(typeParams) && typeParams.length > 0) {\n                ctx.print(\"<\");\n                this.visitAllObjects(function (type) { return type.visitType(_this, ctx); }, typeParams, ctx, ',');\n                ctx.print(\">\");\n            }\n        };\n        return _TsEmitterVisitor;\n    }(AbstractEmitterVisitor));\n\n    // =================================================================================================\n    // =================================================================================================\n    // =========== S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P  ===========\n    // =================================================================================================\n    // =================================================================================================\n    //\n    //        DO NOT EDIT THIS LIST OF SECURITY SENSITIVE PROPERTIES WITHOUT A SECURITY REVIEW!\n    //                               Reach out to mprobst for details.\n    //\n    // =================================================================================================\n    /** Map from tagName|propertyName SecurityContext. Properties applying to all tags use '*'. */\n    var /** @type {?} */ SECURITY_SCHEMA = {};\n    /**\n     * @param {?} ctx\n     * @param {?} specs\n     * @return {?}\n     */\n    function registerContext(ctx, specs) {\n        for (var _i = 0, specs_1 = specs; _i < specs_1.length; _i++) {\n            var spec = specs_1[_i];\n            SECURITY_SCHEMA[spec.toLowerCase()] = ctx;\n        }\n    }\n    // Case is insignificant below, all element and attribute names are lower-cased for lookup.\n    registerContext(_angular_core.SecurityContext.HTML, [\n        'iframe|srcdoc',\n        '*|innerHTML',\n        '*|outerHTML',\n    ]);\n    registerContext(_angular_core.SecurityContext.STYLE, ['*|style']);\n    // NB: no SCRIPT contexts here, they are never allowed due to the parser stripping them.\n    registerContext(_angular_core.SecurityContext.URL, [\n        '*|formAction', 'area|href', 'area|ping', 'audio|src', 'a|href',\n        'a|ping', 'blockquote|cite', 'body|background', 'del|cite', 'form|action',\n        'img|src', 'img|srcset', 'input|src', 'ins|cite', 'q|cite',\n        'source|src', 'source|srcset', 'track|src', 'video|poster', 'video|src',\n    ]);\n    registerContext(_angular_core.SecurityContext.RESOURCE_URL, [\n        'applet|code',\n        'applet|codebase',\n        'base|href',\n        'embed|src',\n        'frame|src',\n        'head|profile',\n        'html|manifest',\n        'iframe|src',\n        'link|href',\n        'media|src',\n        'object|codebase',\n        'object|data',\n        'script|src',\n    ]);\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$23 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var __decorate$14 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$14 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var /** @type {?} */ BOOLEAN = 'boolean';\n    var /** @type {?} */ NUMBER = 'number';\n    var /** @type {?} */ STRING = 'string';\n    var /** @type {?} */ OBJECT = 'object';\n    /**\n     * This array represents the DOM schema. It encodes inheritance, properties, and events.\n     *\n     * ## Overview\n     *\n     * Each line represents one kind of element. The `element_inheritance` and properties are joined\n     * using `element_inheritance|properties` syntax.\n     *\n     * ## Element Inheritance\n     *\n     * The `element_inheritance` can be further subdivided as `element1,element2,...^parentElement`.\n     * Here the individual elements are separated by `,` (commas). Every element in the list\n     * has identical properties.\n     *\n     * An `element` may inherit additional properties from `parentElement` If no `^parentElement` is\n     * specified then `\"\"` (blank) element is assumed.\n     *\n     * NOTE: The blank element inherits from root `[Element]` element, the super element of all\n     * elements.\n     *\n     * NOTE an element prefix such as `:svg:` has no special meaning to the schema.\n     *\n     * ## Properties\n     *\n     * Each element has a set of properties separated by `,` (commas). Each property can be prefixed\n     * by a special character designating its type:\n     *\n     * - (no prefix): property is a string.\n     * - `*`: property represents an event.\n     * - `!`: property is a boolean.\n     * - `#`: property is a number.\n     * - `%`: property is an object.\n     *\n     * ## Query\n     *\n     * The class creates an internal squas representation which allows to easily answer the query of\n     * if a given property exist on a given element.\n     *\n     * NOTE: We don't yet support querying for types or events.\n     * NOTE: This schema is auto extracted from `schema_extractor.ts` located in the test folder,\n     *       see dom_element_schema_registry_spec.ts\n     */\n    // =================================================================================================\n    // =================================================================================================\n    // =========== S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P  ===========\n    // =================================================================================================\n    // =================================================================================================\n    //\n    //                       DO NOT EDIT THIS DOM SCHEMA WITHOUT A SECURITY REVIEW!\n    //\n    // Newly added properties must be security reviewed and assigned an appropriate SecurityContext in\n    // dom_security_schema.ts. Reach out to mprobst & rjamet for details.\n    //\n    // =================================================================================================\n    var /** @type {?} */ SCHEMA = [\n        '[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop',\n        '[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*beforecopy,*beforecut,*beforepaste,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*message,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*paste,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*search,*seeked,*seeking,*select,*selectstart,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate',\n        'abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*beforecopy,*beforecut,*beforepaste,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*message,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*paste,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*search,*seeked,*seeking,*select,*selectstart,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate',\n        'media^[HTMLElement]|!autoplay,!controls,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,#playbackRate,preload,src,%srcObject,#volume',\n        ':svg:^[HTMLElement]|*abort,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex',\n        ':svg:graphics^:svg:|',\n        ':svg:animation^:svg:|*begin,*end,*repeat',\n        ':svg:geometry^:svg:|',\n        ':svg:componentTransferFunction^:svg:|',\n        ':svg:gradient^:svg:|',\n        ':svg:textContent^:svg:graphics|',\n        ':svg:textPositioning^:svg:textContent|',\n        'a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username',\n        'area^[HTMLElement]|alt,coords,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,search,shape,target,username',\n        'audio^media|',\n        'br^[HTMLElement]|clear',\n        'base^[HTMLElement]|href,target',\n        'body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink',\n        'button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value',\n        'canvas^[HTMLElement]|#height,#width',\n        'content^[HTMLElement]|select',\n        'dl^[HTMLElement]|!compact',\n        'datalist^[HTMLElement]|',\n        'details^[HTMLElement]|!open',\n        'dialog^[HTMLElement]|!open,returnValue',\n        'dir^[HTMLElement]|!compact',\n        'div^[HTMLElement]|align',\n        'embed^[HTMLElement]|align,height,name,src,type,width',\n        'fieldset^[HTMLElement]|!disabled,name',\n        'font^[HTMLElement]|color,face,size',\n        'form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target',\n        'frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src',\n        'frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows',\n        'hr^[HTMLElement]|align,color,!noShade,size,width',\n        'head^[HTMLElement]|',\n        'h1,h2,h3,h4,h5,h6^[HTMLElement]|align',\n        'html^[HTMLElement]|version',\n        'iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width',\n        'img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width',\n        'input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width',\n        'keygen^[HTMLElement]|!autofocus,challenge,!disabled,keytype,name',\n        'li^[HTMLElement]|type,#value',\n        'label^[HTMLElement]|htmlFor',\n        'legend^[HTMLElement]|align',\n        'link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,rel,%relList,rev,%sizes,target,type',\n        'map^[HTMLElement]|name',\n        'marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width',\n        'menu^[HTMLElement]|!compact',\n        'meta^[HTMLElement]|content,httpEquiv,name,scheme',\n        'meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value',\n        'ins,del^[HTMLElement]|cite,dateTime',\n        'ol^[HTMLElement]|!compact,!reversed,#start,type',\n        'object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width',\n        'optgroup^[HTMLElement]|!disabled,label',\n        'option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value',\n        'output^[HTMLElement]|defaultValue,%htmlFor,name,value',\n        'p^[HTMLElement]|align',\n        'param^[HTMLElement]|name,type,value,valueType',\n        'picture^[HTMLElement]|',\n        'pre^[HTMLElement]|#width',\n        'progress^[HTMLElement]|#max,#value',\n        'q,blockquote,cite^[HTMLElement]|',\n        'script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type',\n        'select^[HTMLElement]|!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value',\n        'shadow^[HTMLElement]|',\n        'source^[HTMLElement]|media,sizes,src,srcset,type',\n        'span^[HTMLElement]|',\n        'style^[HTMLElement]|!disabled,media,type',\n        'caption^[HTMLElement]|align',\n        'th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width',\n        'col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width',\n        'table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width',\n        'tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign',\n        'tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign',\n        'template^[HTMLElement]|',\n        'textarea^[HTMLElement]|autocapitalize,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap',\n        'title^[HTMLElement]|text',\n        'track^[HTMLElement]|!default,kind,label,src,srclang',\n        'ul^[HTMLElement]|!compact,type',\n        'unknown^[HTMLElement]|',\n        'video^media|#height,poster,#width',\n        ':svg:a^:svg:graphics|',\n        ':svg:animate^:svg:animation|',\n        ':svg:animateMotion^:svg:animation|',\n        ':svg:animateTransform^:svg:animation|',\n        ':svg:circle^:svg:geometry|',\n        ':svg:clipPath^:svg:graphics|',\n        ':svg:cursor^:svg:|',\n        ':svg:defs^:svg:graphics|',\n        ':svg:desc^:svg:|',\n        ':svg:discard^:svg:|',\n        ':svg:ellipse^:svg:geometry|',\n        ':svg:feBlend^:svg:|',\n        ':svg:feColorMatrix^:svg:|',\n        ':svg:feComponentTransfer^:svg:|',\n        ':svg:feComposite^:svg:|',\n        ':svg:feConvolveMatrix^:svg:|',\n        ':svg:feDiffuseLighting^:svg:|',\n        ':svg:feDisplacementMap^:svg:|',\n        ':svg:feDistantLight^:svg:|',\n        ':svg:feDropShadow^:svg:|',\n        ':svg:feFlood^:svg:|',\n        ':svg:feFuncA^:svg:componentTransferFunction|',\n        ':svg:feFuncB^:svg:componentTransferFunction|',\n        ':svg:feFuncG^:svg:componentTransferFunction|',\n        ':svg:feFuncR^:svg:componentTransferFunction|',\n        ':svg:feGaussianBlur^:svg:|',\n        ':svg:feImage^:svg:|',\n        ':svg:feMerge^:svg:|',\n        ':svg:feMergeNode^:svg:|',\n        ':svg:feMorphology^:svg:|',\n        ':svg:feOffset^:svg:|',\n        ':svg:fePointLight^:svg:|',\n        ':svg:feSpecularLighting^:svg:|',\n        ':svg:feSpotLight^:svg:|',\n        ':svg:feTile^:svg:|',\n        ':svg:feTurbulence^:svg:|',\n        ':svg:filter^:svg:|',\n        ':svg:foreignObject^:svg:graphics|',\n        ':svg:g^:svg:graphics|',\n        ':svg:image^:svg:graphics|',\n        ':svg:line^:svg:geometry|',\n        ':svg:linearGradient^:svg:gradient|',\n        ':svg:mpath^:svg:|',\n        ':svg:marker^:svg:|',\n        ':svg:mask^:svg:|',\n        ':svg:metadata^:svg:|',\n        ':svg:path^:svg:geometry|',\n        ':svg:pattern^:svg:|',\n        ':svg:polygon^:svg:geometry|',\n        ':svg:polyline^:svg:geometry|',\n        ':svg:radialGradient^:svg:gradient|',\n        ':svg:rect^:svg:geometry|',\n        ':svg:svg^:svg:graphics|#currentScale,#zoomAndPan',\n        ':svg:script^:svg:|type',\n        ':svg:set^:svg:animation|',\n        ':svg:stop^:svg:|',\n        ':svg:style^:svg:|!disabled,media,title,type',\n        ':svg:switch^:svg:graphics|',\n        ':svg:symbol^:svg:|',\n        ':svg:tspan^:svg:textPositioning|',\n        ':svg:text^:svg:textPositioning|',\n        ':svg:textPath^:svg:textContent|',\n        ':svg:title^:svg:|',\n        ':svg:use^:svg:graphics|',\n        ':svg:view^:svg:|#zoomAndPan',\n        'data^[HTMLElement]|value',\n        'menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default',\n        'summary^[HTMLElement]|',\n        'time^[HTMLElement]|dateTime',\n    ];\n    var /** @type {?} */ _ATTR_TO_PROP = {\n        'class': 'className',\n        'for': 'htmlFor',\n        'formaction': 'formAction',\n        'innerHtml': 'innerHTML',\n        'readonly': 'readOnly',\n        'tabindex': 'tabIndex',\n    };\n    var DomElementSchemaRegistry = (function (_super) {\n        __extends$23(DomElementSchemaRegistry, _super);\n        function DomElementSchemaRegistry() {\n            var _this = this;\n            _super.call(this);\n            this._schema = {};\n            SCHEMA.forEach(function (encodedType) {\n                var type = {};\n                var _a = encodedType.split('|'), strType = _a[0], strProperties = _a[1];\n                var properties = strProperties.split(',');\n                var _b = strType.split('^'), typeNames = _b[0], superName = _b[1];\n                typeNames.split(',').forEach(function (tag) { return _this._schema[tag.toLowerCase()] = type; });\n                var superType = superName && _this._schema[superName.toLowerCase()];\n                if (superType) {\n                    Object.keys(superType).forEach(function (prop) { type[prop] = superType[prop]; });\n                }\n                properties.forEach(function (property) {\n                    if (property.length > 0) {\n                        switch (property[0]) {\n                            case '*':\n                                // We don't yet support events.\n                                // If ever allowing to bind to events, GO THROUGH A SECURITY REVIEW, allowing events\n                                // will\n                                // almost certainly introduce bad XSS vulnerabilities.\n                                // type[property.substring(1)] = EVENT;\n                                break;\n                            case '!':\n                                type[property.substring(1)] = BOOLEAN;\n                                break;\n                            case '#':\n                                type[property.substring(1)] = NUMBER;\n                                break;\n                            case '%':\n                                type[property.substring(1)] = OBJECT;\n                                break;\n                            default:\n                                type[property] = STRING;\n                        }\n                    }\n                });\n            });\n        }\n        /**\n         * @param {?} tagName\n         * @param {?} propName\n         * @param {?} schemaMetas\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName, schemaMetas) {\n            if (schemaMetas.some(function (schema) { return schema.name === _angular_core.NO_ERRORS_SCHEMA.name; })) {\n                return true;\n            }\n            if (tagName.indexOf('-') > -1) {\n                if (tagName === 'ng-container' || tagName === 'ng-content') {\n                    return false;\n                }\n                if (schemaMetas.some(function (schema) { return schema.name === _angular_core.CUSTOM_ELEMENTS_SCHEMA.name; })) {\n                    // Can't tell now as we don't know which properties a custom element will get\n                    // once it is instantiated\n                    return true;\n                }\n            }\n            var /** @type {?} */ elementProperties = this._schema[tagName.toLowerCase()] || this._schema['unknown'];\n            return !!elementProperties[propName];\n        };\n        /**\n         * @param {?} tagName\n         * @param {?} schemaMetas\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.hasElement = function (tagName, schemaMetas) {\n            if (schemaMetas.some(function (schema) { return schema.name === _angular_core.NO_ERRORS_SCHEMA.name; })) {\n                return true;\n            }\n            if (tagName.indexOf('-') > -1) {\n                if (tagName === 'ng-container' || tagName === 'ng-content') {\n                    return true;\n                }\n                if (schemaMetas.some(function (schema) { return schema.name === _angular_core.CUSTOM_ELEMENTS_SCHEMA.name; })) {\n                    // Allow any custom elements\n                    return true;\n                }\n            }\n            return !!this._schema[tagName.toLowerCase()];\n        };\n        /**\n         * securityContext returns the security context for the given property on the given DOM tag.\n         *\n         * Tag and property name are statically known and cannot change at runtime, i.e. it is not\n         * possible to bind a value into a changing attribute or tag name.\n         *\n         * The filtering is white list based. All attributes in the schema above are assumed to have the\n         * 'NONE' security context, i.e. that they are safe inert string values. Only specific well known\n         * attack vectors are assigned their appropriate context.\n         * @param {?} tagName\n         * @param {?} propName\n         * @param {?} isAttribute\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.securityContext = function (tagName, propName, isAttribute) {\n            if (isAttribute) {\n                // NB: For security purposes, use the mapped property name, not the attribute name.\n                propName = this.getMappedPropName(propName);\n            }\n            // Make sure comparisons are case insensitive, so that case differences between attribute and\n            // property names do not have a security impact.\n            tagName = tagName.toLowerCase();\n            propName = propName.toLowerCase();\n            var /** @type {?} */ ctx = SECURITY_SCHEMA[tagName + '|' + propName];\n            if (ctx) {\n                return ctx;\n            }\n            ctx = SECURITY_SCHEMA['*|' + propName];\n            return ctx ? ctx : _angular_core.SecurityContext.NONE;\n        };\n        /**\n         * @param {?} propName\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return _ATTR_TO_PROP[propName] || propName; };\n        /**\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.getDefaultComponentElementName = function () { return 'ng-component'; };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.validateProperty = function (name) {\n            if (name.toLowerCase().startsWith('on')) {\n                var /** @type {?} */ msg = (\"Binding to event property '\" + name + \"' is disallowed for security reasons, \") +\n                    (\"please use (\" + name.slice(2) + \")=...\") +\n                    (\"\\nIf '\" + name + \"' is a directive input, make sure the directive is imported by the\") +\n                    \" current module.\";\n                return { error: true, msg: msg };\n            }\n            else {\n                return { error: false };\n            }\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.validateAttribute = function (name) {\n            if (name.toLowerCase().startsWith('on')) {\n                var /** @type {?} */ msg = (\"Binding to event attribute '\" + name + \"' is disallowed for security reasons, \") +\n                    (\"please use (\" + name.slice(2) + \")=...\");\n                return { error: true, msg: msg };\n            }\n            else {\n                return { error: false };\n            }\n        };\n        /**\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.allKnownElementNames = function () { return Object.keys(this._schema); };\n        /**\n         * @param {?} propName\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.normalizeAnimationStyleProperty = function (propName) {\n            return dashCaseToCamelCase(propName);\n        };\n        /**\n         * @param {?} camelCaseProp\n         * @param {?} userProvidedProp\n         * @param {?} val\n         * @return {?}\n         */\n        DomElementSchemaRegistry.prototype.normalizeAnimationStyleValue = function (camelCaseProp, userProvidedProp, val) {\n            var /** @type {?} */ unit = '';\n            var /** @type {?} */ strVal = val.toString().trim();\n            var /** @type {?} */ errorMsg = null;\n            if (_isPixelDimensionStyle(camelCaseProp) && val !== 0 && val !== '0') {\n                if (typeof val === 'number') {\n                    unit = 'px';\n                }\n                else {\n                    var /** @type {?} */ valAndSuffixMatch = val.match(/^[+-]?[\\d\\.]+([a-z]*)$/);\n                    if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {\n                        errorMsg = \"Please provide a CSS unit value for \" + userProvidedProp + \":\" + val;\n                    }\n                }\n            }\n            return { error: errorMsg, value: strVal + unit };\n        };\n        DomElementSchemaRegistry = __decorate$14([\n            CompilerInjectable(), \n            __metadata$14('design:paramtypes', [])\n        ], DomElementSchemaRegistry);\n        return DomElementSchemaRegistry;\n    }(ElementSchemaRegistry));\n    /**\n     * @param {?} prop\n     * @return {?}\n     */\n    function _isPixelDimensionStyle(prop) {\n        switch (prop) {\n            case 'width':\n            case 'height':\n            case 'minWidth':\n            case 'minHeight':\n            case 'maxWidth':\n            case 'maxHeight':\n            case 'left':\n            case 'top':\n            case 'bottom':\n            case 'right':\n            case 'fontSize':\n            case 'outlineWidth':\n            case 'outlineOffset':\n            case 'paddingTop':\n            case 'paddingLeft':\n            case 'paddingBottom':\n            case 'paddingRight':\n            case 'marginTop':\n            case 'marginLeft':\n            case 'marginBottom':\n            case 'marginRight':\n            case 'borderRadius':\n            case 'borderWidth':\n            case 'borderTopWidth':\n            case 'borderLeftWidth':\n            case 'borderRightWidth':\n            case 'borderBottomWidth':\n            case 'textIndent':\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    var ShadowCss = (function () {\n        function ShadowCss() {\n            this.strictStyling = true;\n        }\n        /**\n         * @param {?} cssText\n         * @param {?} selector\n         * @param {?=} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {\n            if (hostSelector === void 0) { hostSelector = ''; }\n            var /** @type {?} */ sourceMappingUrl = extractSourceMappingUrl(cssText);\n            cssText = stripComments(cssText);\n            cssText = this._insertDirectives(cssText);\n            return this._scopeCssText(cssText, selector, hostSelector) + sourceMappingUrl;\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._insertDirectives = function (cssText) {\n            cssText = this._insertPolyfillDirectivesInCssText(cssText);\n            return this._insertPolyfillRulesInCssText(cssText);\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {\n            // Difference with webcomponents.js: does not handle comments\n            return cssText.replace(_cssContentNextSelectorRe, function () {\n                var m = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    m[_i - 0] = arguments[_i];\n                }\n                return m[2] + '{';\n            });\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {\n            // Difference with webcomponents.js: does not handle comments\n            return cssText.replace(_cssContentRuleRe, function () {\n                var m = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    m[_i - 0] = arguments[_i];\n                }\n                var /** @type {?} */ rule = m[0].replace(m[1], '').replace(m[2], '');\n                return m[4] + rule;\n            });\n        };\n        /**\n         * @param {?} cssText\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {\n            var /** @type {?} */ unscopedRules = this._extractUnscopedRulesFromCssText(cssText);\n            // replace :host and :host-context -shadowcsshost and -shadowcsshost respectively\n            cssText = this._insertPolyfillHostInCssText(cssText);\n            cssText = this._convertColonHost(cssText);\n            cssText = this._convertColonHostContext(cssText);\n            cssText = this._convertShadowDOMSelectors(cssText);\n            if (scopeSelector) {\n                cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);\n            }\n            cssText = cssText + '\\n' + unscopedRules;\n            return cssText.trim();\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {\n            // Difference with webcomponents.js: does not handle comments\n            var /** @type {?} */ r = '';\n            var /** @type {?} */ m;\n            _cssContentUnscopedRuleRe.lastIndex = 0;\n            while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) {\n                var /** @type {?} */ rule = m[0].replace(m[2], '').replace(m[1], m[4]);\n                r += rule + '\\n\\n';\n            }\n            return r;\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._convertColonHost = function (cssText) {\n            return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._convertColonHostContext = function (cssText) {\n            return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);\n        };\n        /**\n         * @param {?} cssText\n         * @param {?} regExp\n         * @param {?} partReplacer\n         * @return {?}\n         */\n        ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {\n            // m[1] = :host(-context), m[2] = contents of (), m[3] rest of rule\n            return cssText.replace(regExp, function () {\n                var m = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    m[_i - 0] = arguments[_i];\n                }\n                if (m[2]) {\n                    var /** @type {?} */ parts = m[2].split(',');\n                    var /** @type {?} */ r = [];\n                    for (var /** @type {?} */ i = 0; i < parts.length; i++) {\n                        var /** @type {?} */ p = parts[i].trim();\n                        if (!p)\n                            break;\n                        r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));\n                    }\n                    return r.join(',');\n                }\n                else {\n                    return _polyfillHostNoCombinator + m[3];\n                }\n            });\n        };\n        /**\n         * @param {?} host\n         * @param {?} part\n         * @param {?} suffix\n         * @return {?}\n         */\n        ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {\n            if (part.indexOf(_polyfillHost) > -1) {\n                return this._colonHostPartReplacer(host, part, suffix);\n            }\n            else {\n                return host + part + suffix + ', ' + part + ' ' + host + suffix;\n            }\n        };\n        /**\n         * @param {?} host\n         * @param {?} part\n         * @param {?} suffix\n         * @return {?}\n         */\n        ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {\n            return host + part.replace(_polyfillHost, '') + suffix;\n        };\n        /**\n         * @param {?} cssText\n         * @return {?}\n         */\n        ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {\n            return _shadowDOMSelectorsRe.reduce(function (result, pattern) { return result.replace(pattern, ' '); }, cssText);\n        };\n        /**\n         * @param {?} cssText\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {\n            var _this = this;\n            return processRules(cssText, function (rule) {\n                var /** @type {?} */ selector = rule.selector;\n                var /** @type {?} */ content = rule.content;\n                if (rule.selector[0] != '@') {\n                    selector =\n                        _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);\n                }\n                else if (rule.selector.startsWith('@media') || rule.selector.startsWith('@supports') ||\n                    rule.selector.startsWith('@page') || rule.selector.startsWith('@document')) {\n                    content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);\n                }\n                return new CssRule(selector, content);\n            });\n        };\n        /**\n         * @param {?} selector\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @param {?} strict\n         * @return {?}\n         */\n        ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {\n            var _this = this;\n            return selector.split(',')\n                .map(function (part) { return part.trim().split(_shadowDeepSelectors); })\n                .map(function (deepParts) {\n                var shallowPart = deepParts[0], otherParts = deepParts.slice(1);\n                var /** @type {?} */ applyScope = function (shallowPart) {\n                    if (_this._selectorNeedsScoping(shallowPart, scopeSelector)) {\n                        return strict ?\n                            _this._applyStrictSelectorScope(shallowPart, scopeSelector, hostSelector) :\n                            _this._applySelectorScope(shallowPart, scopeSelector, hostSelector);\n                    }\n                    else {\n                        return shallowPart;\n                    }\n                };\n                return [applyScope(shallowPart)].concat(otherParts).join(' ');\n            })\n                .join(', ');\n        };\n        /**\n         * @param {?} selector\n         * @param {?} scopeSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {\n            var /** @type {?} */ re = this._makeScopeMatcher(scopeSelector);\n            return !re.test(selector);\n        };\n        /**\n         * @param {?} scopeSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {\n            var /** @type {?} */ lre = /\\[/g;\n            var /** @type {?} */ rre = /\\]/g;\n            scopeSelector = scopeSelector.replace(lre, '\\\\[').replace(rre, '\\\\]');\n            return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');\n        };\n        /**\n         * @param {?} selector\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {\n            // Difference from webcomponents.js: scopeSelector could not be an array\n            return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);\n        };\n        /**\n         * @param {?} selector\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {\n            // In Android browser, the lastIndex is not reset when the regex is used in String.replace()\n            _polyfillHostRe.lastIndex = 0;\n            if (_polyfillHostRe.test(selector)) {\n                var /** @type {?} */ replaceBy_1 = this.strictStyling ? \"[\" + hostSelector + \"]\" : scopeSelector;\n                return selector\n                    .replace(_polyfillHostNoCombinatorRe, function (hnc, selector) {\n                    return selector.replace(/([^:]*)(:*)(.*)/, function (_, before, colon, after) {\n                        return before + replaceBy_1 + colon + after;\n                    });\n                })\n                    .replace(_polyfillHostRe, replaceBy_1 + ' ');\n            }\n            return scopeSelector + ' ' + selector;\n        };\n        /**\n         * @param {?} selector\n         * @param {?} scopeSelector\n         * @param {?} hostSelector\n         * @return {?}\n         */\n        ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector, hostSelector) {\n            var _this = this;\n            var /** @type {?} */ isRe = /\\[is=([^\\]]*)\\]/g;\n            scopeSelector = scopeSelector.replace(isRe, function (_) {\n                var parts = [];\n                for (var _i = 1; _i < arguments.length; _i++) {\n                    parts[_i - 1] = arguments[_i];\n                }\n                return parts[0];\n            });\n            var /** @type {?} */ attrName = '[' + scopeSelector + ']';\n            var /** @type {?} */ _scopeSelectorPart = function (p) {\n                var /** @type {?} */ scopedP = p.trim();\n                if (!scopedP) {\n                    return '';\n                }\n                if (p.indexOf(_polyfillHostNoCombinator) > -1) {\n                    scopedP = _this._applySimpleSelectorScope(p, scopeSelector, hostSelector);\n                }\n                else {\n                    // remove :host since it should be unnecessary\n                    var /** @type {?} */ t = p.replace(_polyfillHostRe, '');\n                    if (t.length > 0) {\n                        var /** @type {?} */ matches = t.match(/([^:]*)(:*)(.*)/);\n                        if (matches) {\n                            scopedP = matches[1] + attrName + matches[2] + matches[3];\n                        }\n                    }\n                }\n                return scopedP;\n            };\n            var /** @type {?} */ safeContent = new SafeSelector(selector);\n            selector = safeContent.content();\n            var /** @type {?} */ scopedSelector = '';\n            var /** @type {?} */ startIndex = 0;\n            var /** @type {?} */ res;\n            var /** @type {?} */ sep = /( |>|\\+|~(?!=))\\s*/g;\n            var /** @type {?} */ scopeAfter = selector.indexOf(_polyfillHostNoCombinator);\n            while ((res = sep.exec(selector)) !== null) {\n                var /** @type {?} */ separator = res[1];\n                var /** @type {?} */ part = selector.slice(startIndex, res.index).trim();\n                // if a selector appears before :host-context it should not be shimmed as it\n                // matches on ancestor elements and not on elements in the host's shadow\n                var /** @type {?} */ scopedPart = startIndex >= scopeAfter ? _scopeSelectorPart(part) : part;\n                scopedSelector += scopedPart + \" \" + separator + \" \";\n                startIndex = sep.lastIndex;\n            }\n            scopedSelector += _scopeSelectorPart(selector.substring(startIndex));\n            // replace the placeholders with their original values\n            return safeContent.restore(scopedSelector);\n        };\n        /**\n         * @param {?} selector\n         * @return {?}\n         */\n        ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {\n            return selector.replace(_colonHostContextRe, _polyfillHostContext)\n                .replace(_colonHostRe, _polyfillHost);\n        };\n        return ShadowCss;\n    }());\n    var SafeSelector = (function () {\n        /**\n         * @param {?} selector\n         */\n        function SafeSelector(selector) {\n            var _this = this;\n            this.placeholders = [];\n            this.index = 0;\n            // Replaces attribute selectors with placeholders.\n            // The WS in [attr=\"va lue\"] would otherwise be interpreted as a selector separator.\n            selector = selector.replace(/(\\[[^\\]]*\\])/g, function (_, keep) {\n                var replaceBy = \"__ph-\" + _this.index + \"__\";\n                _this.placeholders.push(keep);\n                _this.index++;\n                return replaceBy;\n            });\n            // Replaces the expression in `:nth-child(2n + 1)` with a placeholder.\n            // WS and \"+\" would otherwise be interpreted as selector separators.\n            this._content = selector.replace(/(:nth-[-\\w]+)(\\([^)]+\\))/g, function (_, pseudo, exp) {\n                var replaceBy = \"__ph-\" + _this.index + \"__\";\n                _this.placeholders.push(exp);\n                _this.index++;\n                return pseudo + replaceBy;\n            });\n        }\n        ;\n        /**\n         * @param {?} content\n         * @return {?}\n         */\n        SafeSelector.prototype.restore = function (content) {\n            var _this = this;\n            return content.replace(/__ph-(\\d+)__/g, function (ph, index) { return _this.placeholders[+index]; });\n        };\n        /**\n         * @return {?}\n         */\n        SafeSelector.prototype.content = function () { return this._content; };\n        return SafeSelector;\n    }());\n    var /** @type {?} */ _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\\s]*?(['\"])(.*?)\\1[;\\s]*}([^{]*?){/gim;\n    var /** @type {?} */ _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\\s]*(['\"])(.*?)\\3)[;\\s]*[^}]*}/gim;\n    var /** @type {?} */ _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\\s]*(['\"])(.*?)\\3)[;\\s]*[^}]*}/gim;\n    var /** @type {?} */ _polyfillHost = '-shadowcsshost';\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    var /** @type {?} */ _polyfillHostContext = '-shadowcsscontext';\n    var /** @type {?} */ _parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    var /** @type {?} */ _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim');\n    var /** @type {?} */ _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim');\n    var /** @type {?} */ _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';\n    var /** @type {?} */ _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\\s]*)/;\n    var /** @type {?} */ _shadowDOMSelectorsRe = [\n        /::shadow/g,\n        /::content/g,\n        // Deprecated selectors\n        /\\/shadow-deep\\//g,\n        /\\/shadow\\//g,\n    ];\n    var /** @type {?} */ _shadowDeepSelectors = /(?:>>>)|(?:\\/deep\\/)/g;\n    var /** @type {?} */ _selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$';\n    var /** @type {?} */ _polyfillHostRe = /-shadowcsshost/gim;\n    var /** @type {?} */ _colonHostRe = /:host/gim;\n    var /** @type {?} */ _colonHostContextRe = /:host-context/gim;\n    var /** @type {?} */ _commentRe = /\\/\\*\\s*[\\s\\S]*?\\*\\//g;\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function stripComments(input) {\n        return input.replace(_commentRe, '');\n    }\n    // all comments except inline source mapping\n    var /** @type {?} */ _sourceMappingUrlRe = /\\/\\*\\s*#\\s*sourceMappingURL=[\\s\\S]+?\\*\\//;\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function extractSourceMappingUrl(input) {\n        var /** @type {?} */ matcher = input.match(_sourceMappingUrlRe);\n        return matcher ? matcher[0] : '';\n    }\n    var /** @type {?} */ _ruleRe = /(\\s*)([^;\\{\\}]+?)(\\s*)((?:{%BLOCK%}?\\s*;?)|(?:\\s*;))/g;\n    var /** @type {?} */ _curlyRe = /([{}])/g;\n    var /** @type {?} */ OPEN_CURLY = '{';\n    var /** @type {?} */ CLOSE_CURLY = '}';\n    var /** @type {?} */ BLOCK_PLACEHOLDER = '%BLOCK%';\n    var CssRule = (function () {\n        /**\n         * @param {?} selector\n         * @param {?} content\n         */\n        function CssRule(selector, content) {\n            this.selector = selector;\n            this.content = content;\n        }\n        return CssRule;\n    }());\n    /**\n     * @param {?} input\n     * @param {?} ruleCallback\n     * @return {?}\n     */\n    function processRules(input, ruleCallback) {\n        var /** @type {?} */ inputWithEscapedBlocks = escapeBlocks(input);\n        var /** @type {?} */ nextBlockIndex = 0;\n        return inputWithEscapedBlocks.escapedString.replace(_ruleRe, function () {\n            var m = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                m[_i - 0] = arguments[_i];\n            }\n            var /** @type {?} */ selector = m[2];\n            var /** @type {?} */ content = '';\n            var /** @type {?} */ suffix = m[4];\n            var /** @type {?} */ contentPrefix = '';\n            if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) {\n                content = inputWithEscapedBlocks.blocks[nextBlockIndex++];\n                suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);\n                contentPrefix = '{';\n            }\n            var /** @type {?} */ rule = ruleCallback(new CssRule(selector, content));\n            return \"\" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;\n        });\n    }\n    var StringWithEscapedBlocks = (function () {\n        /**\n         * @param {?} escapedString\n         * @param {?} blocks\n         */\n        function StringWithEscapedBlocks(escapedString, blocks) {\n            this.escapedString = escapedString;\n            this.blocks = blocks;\n        }\n        return StringWithEscapedBlocks;\n    }());\n    /**\n     * @param {?} input\n     * @return {?}\n     */\n    function escapeBlocks(input) {\n        var /** @type {?} */ inputParts = input.split(_curlyRe);\n        var /** @type {?} */ resultParts = [];\n        var /** @type {?} */ escapedBlocks = [];\n        var /** @type {?} */ bracketCount = 0;\n        var /** @type {?} */ currentBlockParts = [];\n        for (var /** @type {?} */ partIndex = 0; partIndex < inputParts.length; partIndex++) {\n            var /** @type {?} */ part = inputParts[partIndex];\n            if (part == CLOSE_CURLY) {\n                bracketCount--;\n            }\n            if (bracketCount > 0) {\n                currentBlockParts.push(part);\n            }\n            else {\n                if (currentBlockParts.length > 0) {\n                    escapedBlocks.push(currentBlockParts.join(''));\n                    resultParts.push(BLOCK_PLACEHOLDER);\n                    currentBlockParts = [];\n                }\n                resultParts.push(part);\n            }\n            if (part == OPEN_CURLY) {\n                bracketCount++;\n            }\n        }\n        if (currentBlockParts.length > 0) {\n            escapedBlocks.push(currentBlockParts.join(''));\n            resultParts.push(BLOCK_PLACEHOLDER);\n        }\n        return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$15 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$15 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var /** @type {?} */ COMPONENT_VARIABLE = '%COMP%';\n    var /** @type {?} */ HOST_ATTR = \"_nghost-\" + COMPONENT_VARIABLE;\n    var /** @type {?} */ CONTENT_ATTR = \"_ngcontent-\" + COMPONENT_VARIABLE;\n    var StylesCompileDependency = (function () {\n        /**\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @param {?} isShimmed\n         * @param {?} valuePlaceholder\n         */\n        function StylesCompileDependency(name, moduleUrl, isShimmed, valuePlaceholder) {\n            this.name = name;\n            this.moduleUrl = moduleUrl;\n            this.isShimmed = isShimmed;\n            this.valuePlaceholder = valuePlaceholder;\n        }\n        return StylesCompileDependency;\n    }());\n    var StylesCompileResult = (function () {\n        /**\n         * @param {?} componentStylesheet\n         * @param {?} externalStylesheets\n         */\n        function StylesCompileResult(componentStylesheet, externalStylesheets) {\n            this.componentStylesheet = componentStylesheet;\n            this.externalStylesheets = externalStylesheets;\n        }\n        return StylesCompileResult;\n    }());\n    var CompiledStylesheet = (function () {\n        /**\n         * @param {?} statements\n         * @param {?} stylesVar\n         * @param {?} dependencies\n         * @param {?} isShimmed\n         * @param {?} meta\n         */\n        function CompiledStylesheet(statements, stylesVar, dependencies, isShimmed, meta) {\n            this.statements = statements;\n            this.stylesVar = stylesVar;\n            this.dependencies = dependencies;\n            this.isShimmed = isShimmed;\n            this.meta = meta;\n        }\n        return CompiledStylesheet;\n    }());\n    var StyleCompiler = (function () {\n        /**\n         * @param {?} _urlResolver\n         */\n        function StyleCompiler(_urlResolver) {\n            this._urlResolver = _urlResolver;\n            this._shadowCss = new ShadowCss();\n        }\n        /**\n         * @param {?} comp\n         * @return {?}\n         */\n        StyleCompiler.prototype.compileComponent = function (comp) {\n            var _this = this;\n            var /** @type {?} */ externalStylesheets = [];\n            var /** @type {?} */ componentStylesheet = this._compileStyles(comp, new CompileStylesheetMetadata({\n                styles: comp.template.styles,\n                styleUrls: comp.template.styleUrls,\n                moduleUrl: identifierModuleUrl(comp.type)\n            }), true);\n            comp.template.externalStylesheets.forEach(function (stylesheetMeta) {\n                var /** @type {?} */ compiledStylesheet = _this._compileStyles(comp, stylesheetMeta, false);\n                externalStylesheets.push(compiledStylesheet);\n            });\n            return new StylesCompileResult(componentStylesheet, externalStylesheets);\n        };\n        /**\n         * @param {?} comp\n         * @param {?} stylesheet\n         * @param {?} isComponentStylesheet\n         * @return {?}\n         */\n        StyleCompiler.prototype._compileStyles = function (comp, stylesheet, isComponentStylesheet) {\n            var _this = this;\n            var /** @type {?} */ shim = comp.template.encapsulation === _angular_core.ViewEncapsulation.Emulated;\n            var /** @type {?} */ styleExpressions = stylesheet.styles.map(function (plainStyle) { return literal(_this._shimIfNeeded(plainStyle, shim)); });\n            var /** @type {?} */ dependencies = [];\n            for (var /** @type {?} */ i = 0; i < stylesheet.styleUrls.length; i++) {\n                var /** @type {?} */ identifier = { reference: null };\n                dependencies.push(new StylesCompileDependency(getStylesVarName(null), stylesheet.styleUrls[i], shim, identifier));\n                styleExpressions.push(new ExternalExpr(identifier));\n            }\n            // styles variable contains plain strings and arrays of other styles arrays (recursive),\n            // so we set its type to dynamic.\n            var /** @type {?} */ stylesVar = getStylesVarName(isComponentStylesheet ? comp : null);\n            var /** @type {?} */ stmt = variable(stylesVar)\n                .set(literalArr(styleExpressions, new ArrayType(DYNAMIC_TYPE, [TypeModifier.Const])))\n                .toDeclStmt(null, [StmtModifier.Final]);\n            return new CompiledStylesheet([stmt], stylesVar, dependencies, shim, stylesheet);\n        };\n        /**\n         * @param {?} style\n         * @param {?} shim\n         * @return {?}\n         */\n        StyleCompiler.prototype._shimIfNeeded = function (style, shim) {\n            return shim ? this._shadowCss.shimCssText(style, CONTENT_ATTR, HOST_ATTR) : style;\n        };\n        StyleCompiler = __decorate$15([\n            CompilerInjectable(), \n            __metadata$15('design:paramtypes', [UrlResolver])\n        ], StyleCompiler);\n        return StyleCompiler;\n    }());\n    /**\n     * @param {?} component\n     * @return {?}\n     */\n    function getStylesVarName(component) {\n        var /** @type {?} */ result = \"styles\";\n        if (component) {\n            result += \"_\" + identifierName(component.type);\n        }\n        return result;\n    }\n\n    var _DebugState = (function () {\n        /**\n         * @param {?} nodeIndex\n         * @param {?} sourceAst\n         */\n        function _DebugState(nodeIndex, sourceAst) {\n            this.nodeIndex = nodeIndex;\n            this.sourceAst = sourceAst;\n        }\n        return _DebugState;\n    }());\n    var /** @type {?} */ NULL_DEBUG_STATE = new _DebugState(null, null);\n    var CompileMethod = (function () {\n        /**\n         * @param {?} _view\n         */\n        function CompileMethod(_view) {\n            this._view = _view;\n            this._newState = NULL_DEBUG_STATE;\n            this._currState = NULL_DEBUG_STATE;\n            this._bodyStatements = [];\n            this._debugEnabled = this._view.genConfig.genDebugInfo;\n        }\n        /**\n         * @return {?}\n         */\n        CompileMethod.prototype._updateDebugContextIfNeeded = function () {\n            if (this._newState.nodeIndex !== this._currState.nodeIndex ||\n                this._newState.sourceAst !== this._currState.sourceAst) {\n                var /** @type {?} */ expr = this._updateDebugContext(this._newState);\n                if (expr) {\n                    this._bodyStatements.push(expr.toStmt());\n                }\n            }\n        };\n        /**\n         * @param {?} newState\n         * @return {?}\n         */\n        CompileMethod.prototype._updateDebugContext = function (newState) {\n            this._currState = this._newState = newState;\n            if (this._debugEnabled) {\n                var /** @type {?} */ sourceLocation = newState.sourceAst ? newState.sourceAst.sourceSpan.start : null;\n                return THIS_EXPR.callMethod('debug', [\n                    literal(newState.nodeIndex),\n                    sourceLocation ? literal(sourceLocation.line) : NULL_EXPR,\n                    sourceLocation ? literal(sourceLocation.col) : NULL_EXPR\n                ]);\n            }\n            else {\n                return null;\n            }\n        };\n        /**\n         * @param {?} nodeIndex\n         * @param {?} templateAst\n         * @return {?}\n         */\n        CompileMethod.prototype.resetDebugInfoExpr = function (nodeIndex, templateAst) {\n            var /** @type {?} */ res = this._updateDebugContext(new _DebugState(nodeIndex, templateAst));\n            return res || NULL_EXPR;\n        };\n        /**\n         * @param {?} nodeIndex\n         * @param {?} templateAst\n         * @return {?}\n         */\n        CompileMethod.prototype.resetDebugInfo = function (nodeIndex, templateAst) {\n            this._newState = new _DebugState(nodeIndex, templateAst);\n        };\n        /**\n         * @param {...?} stmts\n         * @return {?}\n         */\n        CompileMethod.prototype.push = function () {\n            var stmts = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                stmts[_i - 0] = arguments[_i];\n            }\n            this.addStmts(stmts);\n        };\n        /**\n         * @param {?} stmt\n         * @return {?}\n         */\n        CompileMethod.prototype.addStmt = function (stmt) {\n            this._updateDebugContextIfNeeded();\n            this._bodyStatements.push(stmt);\n        };\n        /**\n         * @param {?} stmts\n         * @return {?}\n         */\n        CompileMethod.prototype.addStmts = function (stmts) {\n            this._updateDebugContextIfNeeded();\n            (_a = this._bodyStatements).push.apply(_a, stmts);\n            var _a;\n        };\n        /**\n         * @return {?}\n         */\n        CompileMethod.prototype.finish = function () { return this._bodyStatements; };\n        /**\n         * @return {?}\n         */\n        CompileMethod.prototype.isEmpty = function () { return this._bodyStatements.length === 0; };\n        return CompileMethod;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$25 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @param {?} property\n     * @param {?} callingView\n     * @param {?} definedView\n     * @return {?}\n     */\n    function getPropertyInView(property, callingView, definedView) {\n        if (callingView === definedView) {\n            return property;\n        }\n        else {\n            var /** @type {?} */ viewProp = THIS_EXPR;\n            var /** @type {?} */ currView = callingView;\n            while (currView !== definedView && currView.declarationElement.view) {\n                currView = currView.declarationElement.view;\n                viewProp = viewProp.prop('parentView');\n            }\n            if (currView !== definedView) {\n                throw new Error(\"Internal error: Could not calculate a property in a parent view: \" + property);\n            }\n            return property.visitExpression(new _ReplaceViewTransformer(viewProp, definedView), null);\n        }\n    }\n    var _ReplaceViewTransformer = (function (_super) {\n        __extends$25(_ReplaceViewTransformer, _super);\n        /**\n         * @param {?} _viewExpr\n         * @param {?} _view\n         */\n        function _ReplaceViewTransformer(_viewExpr, _view) {\n            _super.call(this);\n            this._viewExpr = _viewExpr;\n            this._view = _view;\n        }\n        /**\n         * @param {?} expr\n         * @return {?}\n         */\n        _ReplaceViewTransformer.prototype._isThis = function (expr) {\n            return expr instanceof ReadVarExpr && expr.builtin === BuiltinVar.This;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _ReplaceViewTransformer.prototype.visitReadVarExpr = function (ast, context) {\n            return this._isThis(ast) ? this._viewExpr : ast;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _ReplaceViewTransformer.prototype.visitReadPropExpr = function (ast, context) {\n            if (this._isThis(ast.receiver)) {\n                // Note: Don't cast for members of the AppView base class...\n                if (this._view.fields.some(function (field) { return field.name == ast.name; }) ||\n                    this._view.getters.some(function (field) { return field.name == ast.name; })) {\n                    return this._viewExpr.cast(this._view.classType).prop(ast.name);\n                }\n            }\n            return _super.prototype.visitReadPropExpr.call(this, ast, context);\n        };\n        return _ReplaceViewTransformer;\n    }(ExpressionTransformer));\n    /**\n     * @param {?} view\n     * @param {?} token\n     * @param {?} optional\n     * @return {?}\n     */\n    function injectFromViewParentInjector(view, token, optional) {\n        var /** @type {?} */ viewExpr;\n        if (view.viewType === ViewType.HOST) {\n            viewExpr = THIS_EXPR;\n        }\n        else {\n            viewExpr = THIS_EXPR.prop('parentView');\n        }\n        var /** @type {?} */ args = [createDiTokenExpression(token), THIS_EXPR.prop('parentIndex')];\n        if (optional) {\n            args.push(NULL_EXPR);\n        }\n        return viewExpr.callMethod('injectorGet', args);\n    }\n    /**\n     * @param {?} component\n     * @param {?} embeddedTemplateIndex\n     * @return {?}\n     */\n    function getViewClassName(component, embeddedTemplateIndex) {\n        return \"View_\" + identifierName(component.type) + embeddedTemplateIndex;\n    }\n    /**\n     * @param {?} elementIndex\n     * @return {?}\n     */\n    function getHandleEventMethodName(elementIndex) {\n        return \"handleEvent_\" + elementIndex;\n    }\n\n    var ViewQueryValues = (function () {\n        /**\n         * @param {?} view\n         * @param {?} values\n         */\n        function ViewQueryValues(view, values) {\n            this.view = view;\n            this.values = values;\n        }\n        return ViewQueryValues;\n    }());\n    var CompileQuery = (function () {\n        /**\n         * @param {?} meta\n         * @param {?} queryList\n         * @param {?} ownerDirectiveExpression\n         * @param {?} view\n         */\n        function CompileQuery(meta, queryList, ownerDirectiveExpression, view) {\n            this.meta = meta;\n            this.queryList = queryList;\n            this.ownerDirectiveExpression = ownerDirectiveExpression;\n            this.view = view;\n            this._values = new ViewQueryValues(view, []);\n        }\n        /**\n         * @param {?} value\n         * @param {?} view\n         * @return {?}\n         */\n        CompileQuery.prototype.addValue = function (value, view) {\n            var /** @type {?} */ currentView = view;\n            var /** @type {?} */ elPath = [];\n            while (currentView && currentView !== this.view) {\n                var /** @type {?} */ parentEl = currentView.declarationElement;\n                elPath.unshift(parentEl);\n                currentView = parentEl.view;\n            }\n            var /** @type {?} */ queryListForDirtyExpr = getPropertyInView(this.queryList, view, this.view);\n            var /** @type {?} */ viewValues = this._values;\n            elPath.forEach(function (el) {\n                var /** @type {?} */ last = viewValues.values.length > 0 ? viewValues.values[viewValues.values.length - 1] : null;\n                if (last instanceof ViewQueryValues && last.view === el.embeddedView) {\n                    viewValues = last;\n                }\n                else {\n                    var /** @type {?} */ newViewValues = new ViewQueryValues(el.embeddedView, []);\n                    viewValues.values.push(newViewValues);\n                    viewValues = newViewValues;\n                }\n            });\n            viewValues.values.push(value);\n            if (elPath.length > 0) {\n                view.dirtyParentQueriesMethod.addStmt(queryListForDirtyExpr.callMethod('setDirty', []).toStmt());\n            }\n        };\n        /**\n         * @return {?}\n         */\n        CompileQuery.prototype._isStatic = function () {\n            return !this._values.values.some(function (value) { return value instanceof ViewQueryValues; });\n        };\n        /**\n         * @param {?} targetStaticMethod\n         * @param {?} targetDynamicMethod\n         * @return {?}\n         */\n        CompileQuery.prototype.generateStatements = function (targetStaticMethod, targetDynamicMethod) {\n            var /** @type {?} */ values = createQueryValues(this._values);\n            var /** @type {?} */ updateStmts = [this.queryList.callMethod('reset', [literalArr(values)]).toStmt()];\n            if (this.ownerDirectiveExpression) {\n                var /** @type {?} */ valueExpr = this.meta.first ? this.queryList.prop('first') : this.queryList;\n                updateStmts.push(this.ownerDirectiveExpression.prop(this.meta.propertyName).set(valueExpr).toStmt());\n            }\n            if (!this.meta.first) {\n                updateStmts.push(this.queryList.callMethod('notifyOnChanges', []).toStmt());\n            }\n            if (this.meta.first && this._isStatic()) {\n                // for queries that don't change and the user asked for a single element,\n                // set it immediately. That is e.g. needed for querying for ViewContainerRefs, ...\n                // we don't do this for QueryLists for now as this would break the timing when\n                // we call QueryList listeners...\n                targetStaticMethod.addStmts(updateStmts);\n            }\n            else {\n                targetDynamicMethod.addStmt(new IfStmt(this.queryList.prop('dirty'), updateStmts));\n            }\n        };\n        return CompileQuery;\n    }());\n    /**\n     * @param {?} viewValues\n     * @return {?}\n     */\n    function createQueryValues(viewValues) {\n        return ListWrapper.flatten(viewValues.values.map(function (entry) {\n            if (entry instanceof ViewQueryValues) {\n                return mapNestedViews(entry.view.declarationElement.viewContainer, entry.view, createQueryValues(entry));\n            }\n            else {\n                return (entry);\n            }\n        }));\n    }\n    /**\n     * @param {?} viewContainer\n     * @param {?} view\n     * @param {?} expressions\n     * @return {?}\n     */\n    function mapNestedViews(viewContainer, view, expressions) {\n        var /** @type {?} */ adjustedExpressions = expressions.map(function (expr) { return replaceVarInExpression(THIS_EXPR.name, variable('nestedView'), expr); });\n        return viewContainer.callMethod('mapNestedViews', [\n            variable(view.className),\n            fn([new FnParam('nestedView', view.classType)], [new ReturnStatement(literalArr(adjustedExpressions))], DYNAMIC_TYPE)\n        ]);\n    }\n    /**\n     * @param {?} propertyName\n     * @param {?} compileView\n     * @return {?}\n     */\n    function createQueryList(propertyName, compileView) {\n        compileView.fields.push(new ClassField(propertyName, importType(createIdentifier(Identifiers.QueryList), [DYNAMIC_TYPE])));\n        var /** @type {?} */ expr = THIS_EXPR.prop(propertyName);\n        compileView.createMethod.addStmt(THIS_EXPR.prop(propertyName)\n            .set(importExpr(createIdentifier(Identifiers.QueryList), [DYNAMIC_TYPE]).instantiate([]))\n            .toStmt());\n        return expr;\n    }\n    /**\n     * @param {?} map\n     * @param {?} query\n     * @return {?}\n     */\n    function addQueryToTokenMap(map, query) {\n        query.meta.selectors.forEach(function (selector) {\n            var /** @type {?} */ entry = map.get(tokenReference(selector));\n            if (!entry) {\n                entry = [];\n                map.set(tokenReference(selector), entry);\n            }\n            entry.push(query);\n        });\n    }\n\n    var ViewTypeEnum = (function () {\n        function ViewTypeEnum() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ViewTypeEnum.fromValue = function (value) {\n            return createEnumExpression(Identifiers.ViewType, value);\n        };\n        return ViewTypeEnum;\n    }());\n    var ViewEncapsulationEnum = (function () {\n        function ViewEncapsulationEnum() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ViewEncapsulationEnum.fromValue = function (value) {\n            return createEnumExpression(Identifiers.ViewEncapsulation, value);\n        };\n        return ViewEncapsulationEnum;\n    }());\n    var ChangeDetectorStatusEnum = (function () {\n        function ChangeDetectorStatusEnum() {\n        }\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        ChangeDetectorStatusEnum.fromValue = function (value) {\n            return createEnumExpression(Identifiers.ChangeDetectorStatus, value);\n        };\n        return ChangeDetectorStatusEnum;\n    }());\n    var ViewConstructorVars = (function () {\n        function ViewConstructorVars() {\n        }\n        ViewConstructorVars.viewUtils = variable('viewUtils');\n        ViewConstructorVars.parentView = variable('parentView');\n        ViewConstructorVars.parentIndex = variable('parentIndex');\n        ViewConstructorVars.parentElement = variable('parentElement');\n        return ViewConstructorVars;\n    }());\n    var ViewProperties = (function () {\n        function ViewProperties() {\n        }\n        ViewProperties.renderer = THIS_EXPR.prop('renderer');\n        ViewProperties.viewUtils = THIS_EXPR.prop('viewUtils');\n        return ViewProperties;\n    }());\n    var InjectMethodVars$1 = (function () {\n        function InjectMethodVars() {\n        }\n        InjectMethodVars.token = variable('token');\n        InjectMethodVars.requestNodeIndex = variable('requestNodeIndex');\n        InjectMethodVars.notFoundResult = variable('notFoundResult');\n        return InjectMethodVars;\n    }());\n    var DetectChangesVars = (function () {\n        function DetectChangesVars() {\n        }\n        DetectChangesVars.throwOnChange = variable(\"throwOnChange\");\n        DetectChangesVars.changes = variable(\"changes\");\n        DetectChangesVars.changed = variable(\"changed\");\n        return DetectChangesVars;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var ViewClassDependency = (function () {\n        /**\n         * @param {?} comp\n         * @param {?} name\n         * @param {?} placeholder\n         */\n        function ViewClassDependency(comp, name, placeholder) {\n            this.comp = comp;\n            this.name = name;\n            this.placeholder = placeholder;\n        }\n        return ViewClassDependency;\n    }());\n    var ComponentFactoryDependency$1 = (function () {\n        /**\n         * @param {?} comp\n         * @param {?} placeholder\n         */\n        function ComponentFactoryDependency(comp, placeholder) {\n            this.comp = comp;\n            this.placeholder = placeholder;\n        }\n        return ComponentFactoryDependency;\n    }());\n    var DirectiveWrapperDependency = (function () {\n        /**\n         * @param {?} dir\n         * @param {?} name\n         * @param {?} placeholder\n         */\n        function DirectiveWrapperDependency(dir, name, placeholder) {\n            this.dir = dir;\n            this.name = name;\n            this.placeholder = placeholder;\n        }\n        return DirectiveWrapperDependency;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$24 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var CompileNode = (function () {\n        /**\n         * @param {?} parent\n         * @param {?} view\n         * @param {?} nodeIndex\n         * @param {?} renderNode\n         * @param {?} sourceAst\n         */\n        function CompileNode(parent, view, nodeIndex, renderNode, sourceAst) {\n            this.parent = parent;\n            this.view = view;\n            this.nodeIndex = nodeIndex;\n            this.renderNode = renderNode;\n            this.sourceAst = sourceAst;\n        }\n        /**\n         * @return {?}\n         */\n        CompileNode.prototype.isNull = function () { return !this.renderNode; };\n        /**\n         * @return {?}\n         */\n        CompileNode.prototype.isRootElement = function () { return this.view != this.parent.view; };\n        return CompileNode;\n    }());\n    var CompileElement = (function (_super) {\n        __extends$24(CompileElement, _super);\n        /**\n         * @param {?} parent\n         * @param {?} view\n         * @param {?} nodeIndex\n         * @param {?} renderNode\n         * @param {?} sourceAst\n         * @param {?} component\n         * @param {?} _directives\n         * @param {?} _resolvedProvidersArray\n         * @param {?} hasViewContainer\n         * @param {?} hasEmbeddedView\n         * @param {?} references\n         */\n        function CompileElement(parent, view, nodeIndex, renderNode, sourceAst, component, _directives, _resolvedProvidersArray, hasViewContainer, hasEmbeddedView, references) {\n            var _this = this;\n            _super.call(this, parent, view, nodeIndex, renderNode, sourceAst);\n            this.component = component;\n            this._directives = _directives;\n            this._resolvedProvidersArray = _resolvedProvidersArray;\n            this.hasViewContainer = hasViewContainer;\n            this.hasEmbeddedView = hasEmbeddedView;\n            this.compViewExpr = null;\n            this.instances = new Map();\n            this.directiveWrapperInstance = new Map();\n            this._queryCount = 0;\n            this._queries = new Map();\n            this.contentNodesByNgContentIndex = null;\n            this.referenceTokens = {};\n            references.forEach(function (ref) { return _this.referenceTokens[ref.name] = ref.value; });\n            this.elementRef =\n                importExpr(createIdentifier(Identifiers.ElementRef)).instantiate([this.renderNode]);\n            this.instances.set(resolveIdentifier(Identifiers.ElementRef), this.elementRef);\n            this.instances.set(resolveIdentifier(Identifiers.Injector), THIS_EXPR.callMethod('injector', [literal(this.nodeIndex)]));\n            this.instances.set(resolveIdentifier(Identifiers.Renderer), THIS_EXPR.prop('renderer'));\n            if (this.hasViewContainer || this.hasEmbeddedView) {\n                this._createViewContainer();\n            }\n            if (this.component) {\n                this._createComponentFactoryResolver();\n            }\n        }\n        /**\n         * @return {?}\n         */\n        CompileElement.createNull = function () {\n            return new CompileElement(null, null, null, null, null, null, [], [], false, false, []);\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype._createViewContainer = function () {\n            var /** @type {?} */ fieldName = \"_vc_\" + this.nodeIndex;\n            var /** @type {?} */ parentNodeIndex = this.isRootElement() ? null : this.parent.nodeIndex;\n            // private is fine here as no child view will reference a ViewContainer\n            this.view.fields.push(new ClassField(fieldName, importType(createIdentifier(Identifiers.ViewContainer)), [StmtModifier.Private]));\n            var /** @type {?} */ statement = THIS_EXPR.prop(fieldName)\n                .set(importExpr(createIdentifier(Identifiers.ViewContainer)).instantiate([\n                literal(this.nodeIndex), literal(parentNodeIndex), THIS_EXPR, this.renderNode\n            ]))\n                .toStmt();\n            this.view.createMethod.addStmt(statement);\n            this.viewContainer = THIS_EXPR.prop(fieldName);\n            this.instances.set(resolveIdentifier(Identifiers.ViewContainer), this.viewContainer);\n            this.view.viewContainers.push(this.viewContainer);\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype._createComponentFactoryResolver = function () {\n            var _this = this;\n            var /** @type {?} */ entryComponents = this.component.entryComponents.map(function (entryComponent) {\n                var /** @type {?} */ id = { reference: null };\n                _this.view.targetDependencies.push(new ComponentFactoryDependency$1(entryComponent, id));\n                return id;\n            });\n            if (!entryComponents || entryComponents.length === 0) {\n                return;\n            }\n            var /** @type {?} */ createComponentFactoryResolverExpr = importExpr(createIdentifier(Identifiers.CodegenComponentFactoryResolver)).instantiate([\n                literalArr(entryComponents.map(function (entryComponent) { return importExpr(entryComponent); })),\n                injectFromViewParentInjector(this.view, createIdentifierToken(Identifiers.ComponentFactoryResolver), false)\n            ]);\n            var /** @type {?} */ provider = {\n                token: createIdentifierToken(Identifiers.ComponentFactoryResolver),\n                useValue: createComponentFactoryResolverExpr\n            };\n            // Add ComponentFactoryResolver as first provider as it does not have deps on other providers\n            // ProviderAstType.PrivateService as only the component and its view can see it,\n            // but nobody else\n            this._resolvedProvidersArray.unshift(new ProviderAst(provider.token, false, true, [provider], ProviderAstType.PrivateService, [], this.sourceAst.sourceSpan));\n        };\n        /**\n         * @param {?} compViewExpr\n         * @return {?}\n         */\n        CompileElement.prototype.setComponentView = function (compViewExpr) {\n            this.compViewExpr = compViewExpr;\n            this.contentNodesByNgContentIndex =\n                new Array(this.component.template.ngContentSelectors.length);\n            for (var /** @type {?} */ i = 0; i < this.contentNodesByNgContentIndex.length; i++) {\n                this.contentNodesByNgContentIndex[i] = [];\n            }\n        };\n        /**\n         * @param {?} embeddedView\n         * @return {?}\n         */\n        CompileElement.prototype.setEmbeddedView = function (embeddedView) {\n            this.embeddedView = embeddedView;\n            if (isPresent(embeddedView)) {\n                var /** @type {?} */ createTemplateRefExpr = importExpr(createIdentifier(Identifiers.TemplateRef_)).instantiate([\n                    THIS_EXPR, literal(this.nodeIndex), this.renderNode\n                ]);\n                var /** @type {?} */ provider = {\n                    token: createIdentifierToken(Identifiers.TemplateRef),\n                    useValue: createTemplateRefExpr\n                };\n                // Add TemplateRef as first provider as it does not have deps on other providers\n                this._resolvedProvidersArray.unshift(new ProviderAst(provider.token, false, true, [provider], ProviderAstType.Builtin, [], this.sourceAst.sourceSpan));\n            }\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype.beforeChildren = function () {\n            var _this = this;\n            if (this.hasViewContainer) {\n                this.instances.set(resolveIdentifier(Identifiers.ViewContainerRef), this.viewContainer.prop('vcRef'));\n            }\n            this._resolvedProviders = new Map();\n            this._resolvedProvidersArray.forEach(function (provider) { return _this._resolvedProviders.set(tokenReference(provider.token), provider); });\n            // create all the provider instances, some in the view constructor,\n            // some as getters. We rely on the fact that they are already sorted topologically.\n            Array.from(this._resolvedProviders.values()).forEach(function (resolvedProvider) {\n                var /** @type {?} */ isDirectiveWrapper = resolvedProvider.providerType === ProviderAstType.Component ||\n                    resolvedProvider.providerType === ProviderAstType.Directive;\n                var /** @type {?} */ providerValueExpressions = resolvedProvider.providers.map(function (provider) {\n                    if (provider.useExisting) {\n                        return _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting });\n                    }\n                    else if (provider.useFactory) {\n                        var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n                        var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep); });\n                        return importExpr(provider.useFactory).callFn(depsExpr);\n                    }\n                    else if (provider.useClass) {\n                        var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n                        var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep); });\n                        if (isDirectiveWrapper) {\n                            var /** @type {?} */ directiveWrapperIdentifier = { reference: null };\n                            _this.view.targetDependencies.push(new DirectiveWrapperDependency(provider.useClass, DirectiveWrapperCompiler.dirWrapperClassName(provider.useClass), directiveWrapperIdentifier));\n                            return DirectiveWrapperExpressions.create(directiveWrapperIdentifier, depsExpr);\n                        }\n                        else {\n                            return importExpr(provider.useClass)\n                                .instantiate(depsExpr, importType(provider.useClass));\n                        }\n                    }\n                    else {\n                        return convertValueToOutputAst(provider.useValue);\n                    }\n                });\n                var /** @type {?} */ propName = \"_\" + tokenName(resolvedProvider.token) + \"_\" + _this.nodeIndex + \"_\" + _this.instances.size;\n                var /** @type {?} */ instance = createProviderProperty(propName, providerValueExpressions, resolvedProvider.multiProvider, resolvedProvider.eager, _this);\n                if (isDirectiveWrapper) {\n                    _this.directiveWrapperInstance.set(tokenReference(resolvedProvider.token), instance);\n                    _this.instances.set(tokenReference(resolvedProvider.token), DirectiveWrapperExpressions.context(instance));\n                }\n                else {\n                    _this.instances.set(tokenReference(resolvedProvider.token), instance);\n                }\n            });\n            var _loop_1 = function(i) {\n                var /** @type {?} */ directive = this_1._directives[i];\n                var /** @type {?} */ directiveInstance = this_1.instances.get(tokenReference(identifierToken(directive.type)));\n                directive.queries.forEach(function (queryMeta) { _this._addQuery(queryMeta, directiveInstance); });\n            };\n            var this_1 = this;\n            for (var /** @type {?} */ i = 0; i < this._directives.length; i++) {\n                _loop_1(i);\n            }\n            Object.keys(this.referenceTokens).forEach(function (varName) {\n                var /** @type {?} */ token = _this.referenceTokens[varName];\n                var /** @type {?} */ varValue;\n                if (token) {\n                    varValue = _this.instances.get(tokenReference(token));\n                }\n                else {\n                    varValue = _this.renderNode;\n                }\n                _this.view.locals.set(varName, varValue);\n            });\n        };\n        /**\n         * @param {?} childNodeCount\n         * @return {?}\n         */\n        CompileElement.prototype.afterChildren = function (childNodeCount) {\n            var _this = this;\n            Array.from(this._resolvedProviders.values()).forEach(function (resolvedProvider) {\n                // Note: afterChildren is called after recursing into children.\n                // This is good so that an injector match in an element that is closer to a requesting element\n                // matches first.\n                var /** @type {?} */ providerExpr = _this.instances.get(tokenReference(resolvedProvider.token));\n                // Note: view providers are only visible on the injector of that element.\n                // This is not fully correct as the rules during codegen don't allow a directive\n                // to get hold of a view provdier on the same element. We still do this semantic\n                // as it simplifies our model to having only one runtime injector per element.\n                var /** @type {?} */ providerChildNodeCount = resolvedProvider.providerType === ProviderAstType.PrivateService ? 0 : childNodeCount;\n                _this.view.injectorGetMethod.addStmt(createInjectInternalCondition(_this.nodeIndex, providerChildNodeCount, resolvedProvider, providerExpr));\n            });\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype.finish = function () {\n            var _this = this;\n            Array.from(this._queries.values())\n                .forEach(function (queries) { return queries.forEach(function (q) { return q.generateStatements(_this.view.createMethod, _this.view.updateContentQueriesMethod); }); });\n        };\n        /**\n         * @param {?} ngContentIndex\n         * @param {?} nodeExpr\n         * @return {?}\n         */\n        CompileElement.prototype.addContentNode = function (ngContentIndex, nodeExpr) {\n            this.contentNodesByNgContentIndex[ngContentIndex].push(nodeExpr);\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype.getComponent = function () {\n            return isPresent(this.component) ?\n                this.instances.get(tokenReference(identifierToken(this.component.type))) :\n                null;\n        };\n        /**\n         * @return {?}\n         */\n        CompileElement.prototype.getProviderTokens = function () {\n            return Array.from(this._resolvedProviders.values()).map(function (provider) { return provider.token; });\n        };\n        /**\n         * @param {?} token\n         * @return {?}\n         */\n        CompileElement.prototype.getQueriesFor = function (token) {\n            var /** @type {?} */ result = [];\n            var /** @type {?} */ currentEl = this;\n            var /** @type {?} */ distance = 0;\n            var /** @type {?} */ queries;\n            while (!currentEl.isNull()) {\n                queries = currentEl._queries.get(tokenReference(token));\n                if (isPresent(queries)) {\n                    result.push.apply(result, queries.filter(function (query) { return query.meta.descendants || distance <= 1; }));\n                }\n                if (currentEl._directives.length > 0) {\n                    distance++;\n                }\n                currentEl = currentEl.parent;\n            }\n            queries = this.view.componentView.viewQueries.get(tokenReference(token));\n            if (isPresent(queries)) {\n                result.push.apply(result, queries);\n            }\n            return result;\n        };\n        /**\n         * @param {?} queryMeta\n         * @param {?} directiveInstance\n         * @return {?}\n         */\n        CompileElement.prototype._addQuery = function (queryMeta, directiveInstance) {\n            var /** @type {?} */ propName = \"_query_\" + tokenName(queryMeta.selectors[0]) + \"_\" + this.nodeIndex + \"_\" + this._queryCount++;\n            var /** @type {?} */ queryList = createQueryList(propName, this.view);\n            var /** @type {?} */ query = new CompileQuery(queryMeta, queryList, directiveInstance, this.view);\n            addQueryToTokenMap(this._queries, query);\n            return query;\n        };\n        /**\n         * @param {?} requestingProviderType\n         * @param {?} dep\n         * @return {?}\n         */\n        CompileElement.prototype._getLocalDependency = function (requestingProviderType, dep) {\n            var /** @type {?} */ result = null;\n            if (isPresent(dep.token)) {\n                // access builtins with special visibility\n                if (!result) {\n                    if (tokenReference(dep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef)) {\n                        if (requestingProviderType === ProviderAstType.Component) {\n                            return this.compViewExpr.prop('ref');\n                        }\n                        else {\n                            return getPropertyInView(THIS_EXPR.prop('ref'), this.view, this.view.componentView);\n                        }\n                    }\n                }\n                // access regular providers on the element\n                if (!result) {\n                    var /** @type {?} */ resolvedProvider = this._resolvedProviders.get(tokenReference(dep.token));\n                    // don't allow directives / public services to access private services.\n                    // only components and private services can access private services.\n                    if (resolvedProvider && (requestingProviderType === ProviderAstType.Directive ||\n                        requestingProviderType === ProviderAstType.PublicService) &&\n                        resolvedProvider.providerType === ProviderAstType.PrivateService) {\n                        return null;\n                    }\n                    result = this.instances.get(tokenReference(dep.token));\n                }\n            }\n            return result;\n        };\n        /**\n         * @param {?} requestingProviderType\n         * @param {?} dep\n         * @return {?}\n         */\n        CompileElement.prototype._getDependency = function (requestingProviderType, dep) {\n            var /** @type {?} */ currElement = this;\n            var /** @type {?} */ result = null;\n            if (dep.isValue) {\n                result = literal(dep.value);\n            }\n            if (!result && !dep.isSkipSelf) {\n                result = this._getLocalDependency(requestingProviderType, dep);\n            }\n            // check parent elements\n            while (!result && !currElement.parent.isNull()) {\n                currElement = currElement.parent;\n                result = currElement._getLocalDependency(ProviderAstType.PublicService, { token: dep.token });\n            }\n            if (!result) {\n                result = injectFromViewParentInjector(this.view, dep.token, dep.isOptional);\n            }\n            if (!result) {\n                result = NULL_EXPR;\n            }\n            return getPropertyInView(result, this.view, currElement.view);\n        };\n        return CompileElement;\n    }(CompileNode));\n    /**\n     * @param {?} nodeIndex\n     * @param {?} childNodeCount\n     * @param {?} provider\n     * @param {?} providerExpr\n     * @return {?}\n     */\n    function createInjectInternalCondition(nodeIndex, childNodeCount, provider, providerExpr) {\n        var /** @type {?} */ indexCondition;\n        if (childNodeCount > 0) {\n            indexCondition = literal(nodeIndex)\n                .lowerEquals(InjectMethodVars$1.requestNodeIndex)\n                .and(InjectMethodVars$1.requestNodeIndex.lowerEquals(literal(nodeIndex + childNodeCount)));\n        }\n        else {\n            indexCondition = literal(nodeIndex).identical(InjectMethodVars$1.requestNodeIndex);\n        }\n        return new IfStmt(InjectMethodVars$1.token.identical(createDiTokenExpression(provider.token)).and(indexCondition), [new ReturnStatement(providerExpr)]);\n    }\n    /**\n     * @param {?} propName\n     * @param {?} providerValueExpressions\n     * @param {?} isMulti\n     * @param {?} isEager\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function createProviderProperty(propName, providerValueExpressions, isMulti, isEager, compileElement) {\n        var /** @type {?} */ view = compileElement.view;\n        var /** @type {?} */ resolvedProviderValueExpr;\n        var /** @type {?} */ type;\n        if (isMulti) {\n            resolvedProviderValueExpr = literalArr(providerValueExpressions);\n            type = new ArrayType(DYNAMIC_TYPE);\n        }\n        else {\n            resolvedProviderValueExpr = providerValueExpressions[0];\n            type = providerValueExpressions[0].type;\n        }\n        if (!type) {\n            type = DYNAMIC_TYPE;\n        }\n        if (isEager) {\n            view.fields.push(new ClassField(propName, type));\n            view.createMethod.addStmt(THIS_EXPR.prop(propName).set(resolvedProviderValueExpr).toStmt());\n        }\n        else {\n            var /** @type {?} */ internalField = \"_\" + propName;\n            view.fields.push(new ClassField(internalField, type));\n            var /** @type {?} */ getter = new CompileMethod(view);\n            getter.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n            // Note: Equals is important for JS so that it also checks the undefined case!\n            getter.addStmt(new IfStmt(THIS_EXPR.prop(internalField).isBlank(), [THIS_EXPR.prop(internalField).set(resolvedProviderValueExpr).toStmt()]));\n            getter.addStmt(new ReturnStatement(THIS_EXPR.prop(internalField)));\n            view.getters.push(new ClassGetter(propName, getter.finish(), type));\n        }\n        return THIS_EXPR.prop(propName);\n    }\n\n    var CompilePipe = (function () {\n        /**\n         * @param {?} view\n         * @param {?} meta\n         */\n        function CompilePipe(view, meta) {\n            var _this = this;\n            this.view = view;\n            this.meta = meta;\n            this._purePipeProxyCount = 0;\n            this.instance = THIS_EXPR.prop(\"_pipe_\" + meta.name + \"_\" + view.pipeCount++);\n            var deps = this.meta.type.diDeps.map(function (diDep) {\n                if (tokenReference(diDep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef)) {\n                    return getPropertyInView(THIS_EXPR.prop('ref'), _this.view, _this.view.componentView);\n                }\n                return injectFromViewParentInjector(view, diDep.token, false);\n            });\n            this.view.fields.push(new ClassField(this.instance.name, importType(this.meta.type)));\n            this.view.createMethod.resetDebugInfo(null, null);\n            this.view.createMethod.addStmt(THIS_EXPR.prop(this.instance.name)\n                .set(importExpr(this.meta.type).instantiate(deps))\n                .toStmt());\n        }\n        /**\n         * @param {?} view\n         * @param {?} name\n         * @param {?} args\n         * @return {?}\n         */\n        CompilePipe.call = function (view, name, args) {\n            var /** @type {?} */ compView = view.componentView;\n            var /** @type {?} */ meta = _findPipeMeta(compView, name);\n            var /** @type {?} */ pipe;\n            if (meta.pure) {\n                // pure pipes live on the component view\n                pipe = compView.purePipes.get(name);\n                if (!pipe) {\n                    pipe = new CompilePipe(compView, meta);\n                    compView.purePipes.set(name, pipe);\n                    compView.pipes.push(pipe);\n                }\n            }\n            else {\n                // Non pure pipes live on the view that called it\n                pipe = new CompilePipe(view, meta);\n                view.pipes.push(pipe);\n            }\n            return pipe._call(view, args);\n        };\n        Object.defineProperty(CompilePipe.prototype, \"pure\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this.meta.pure; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} callingView\n         * @param {?} args\n         * @return {?}\n         */\n        CompilePipe.prototype._call = function (callingView, args) {\n            if (this.meta.pure) {\n                // PurePipeProxies live on the view that called them.\n                var /** @type {?} */ purePipeProxyInstance = THIS_EXPR.prop(this.instance.name + \"_\" + this._purePipeProxyCount++);\n                var /** @type {?} */ pipeInstanceSeenFromPureProxy = getPropertyInView(this.instance, callingView, this.view);\n                createPureProxy(pipeInstanceSeenFromPureProxy.prop('transform')\n                    .callMethod(BuiltinMethod.Bind, [pipeInstanceSeenFromPureProxy]), args.length, purePipeProxyInstance, { fields: callingView.fields, ctorStmts: callingView.createMethod });\n                return importExpr(createIdentifier(Identifiers.castByValue))\n                    .callFn([purePipeProxyInstance, pipeInstanceSeenFromPureProxy.prop('transform')])\n                    .callFn(args);\n            }\n            else {\n                return getPropertyInView(this.instance, callingView, this.view).callMethod('transform', args);\n            }\n        };\n        return CompilePipe;\n    }());\n    /**\n     * @param {?} view\n     * @param {?} name\n     * @return {?}\n     */\n    function _findPipeMeta(view, name) {\n        var /** @type {?} */ pipeMeta = null;\n        for (var /** @type {?} */ i = view.pipeMetas.length - 1; i >= 0; i--) {\n            var /** @type {?} */ localPipeMeta = view.pipeMetas[i];\n            if (localPipeMeta.name == name) {\n                pipeMeta = localPipeMeta;\n                break;\n            }\n        }\n        if (!pipeMeta) {\n            throw new Error(\"Illegal state: Could not find pipe \" + name + \" although the parser should have detected this error!\");\n        }\n        return pipeMeta;\n    }\n\n    var CompileViewRootNodeType = {};\n    CompileViewRootNodeType.Node = 0;\n    CompileViewRootNodeType.ViewContainer = 1;\n    CompileViewRootNodeType.NgContent = 2;\n    CompileViewRootNodeType[CompileViewRootNodeType.Node] = \"Node\";\n    CompileViewRootNodeType[CompileViewRootNodeType.ViewContainer] = \"ViewContainer\";\n    CompileViewRootNodeType[CompileViewRootNodeType.NgContent] = \"NgContent\";\n    var CompileViewRootNode = (function () {\n        /**\n         * @param {?} type\n         * @param {?} expr\n         * @param {?=} ngContentIndex\n         */\n        function CompileViewRootNode(type, expr, ngContentIndex) {\n            this.type = type;\n            this.expr = expr;\n            this.ngContentIndex = ngContentIndex;\n        }\n        return CompileViewRootNode;\n    }());\n    var CompileView = (function () {\n        /**\n         * @param {?} component\n         * @param {?} genConfig\n         * @param {?} pipeMetas\n         * @param {?} styles\n         * @param {?} animations\n         * @param {?} viewIndex\n         * @param {?} declarationElement\n         * @param {?} templateVariableBindings\n         * @param {?} targetDependencies\n         */\n        function CompileView(component, genConfig, pipeMetas, styles, animations, viewIndex, declarationElement, templateVariableBindings, targetDependencies) {\n            var _this = this;\n            this.component = component;\n            this.genConfig = genConfig;\n            this.pipeMetas = pipeMetas;\n            this.styles = styles;\n            this.animations = animations;\n            this.viewIndex = viewIndex;\n            this.declarationElement = declarationElement;\n            this.templateVariableBindings = templateVariableBindings;\n            this.targetDependencies = targetDependencies;\n            this.viewChildren = [];\n            this.nodes = [];\n            this.rootNodes = [];\n            this.lastRenderNode = NULL_EXPR;\n            this.viewContainers = [];\n            this.methods = [];\n            this.ctorStmts = [];\n            this.fields = [];\n            this.getters = [];\n            this.disposables = [];\n            this.purePipes = new Map();\n            this.pipes = [];\n            this.locals = new Map();\n            this.literalArrayCount = 0;\n            this.literalMapCount = 0;\n            this.pipeCount = 0;\n            this.createMethod = new CompileMethod(this);\n            this.animationBindingsMethod = new CompileMethod(this);\n            this.injectorGetMethod = new CompileMethod(this);\n            this.updateContentQueriesMethod = new CompileMethod(this);\n            this.dirtyParentQueriesMethod = new CompileMethod(this);\n            this.updateViewQueriesMethod = new CompileMethod(this);\n            this.detectChangesInInputsMethod = new CompileMethod(this);\n            this.detectChangesRenderPropertiesMethod = new CompileMethod(this);\n            this.afterContentLifecycleCallbacksMethod = new CompileMethod(this);\n            this.afterViewLifecycleCallbacksMethod = new CompileMethod(this);\n            this.destroyMethod = new CompileMethod(this);\n            this.detachMethod = new CompileMethod(this);\n            this.viewType = getViewType(component, viewIndex);\n            this.className = getViewClassName(component, viewIndex);\n            this.classType = expressionType(variable(this.className));\n            this.classExpr = variable(this.className);\n            if (this.viewType === ViewType.COMPONENT || this.viewType === ViewType.HOST) {\n                this.componentView = this;\n            }\n            else {\n                this.componentView = this.declarationElement.view.componentView;\n            }\n            this.componentContext =\n                getPropertyInView(THIS_EXPR.prop('context'), this, this.componentView);\n            var viewQueries = new Map();\n            if (this.viewType === ViewType.COMPONENT) {\n                var directiveInstance_1 = THIS_EXPR.prop('context');\n                this.component.viewQueries.forEach(function (queryMeta, queryIndex) {\n                    var propName = \"_viewQuery_\" + tokenName(queryMeta.selectors[0]) + \"_\" + queryIndex;\n                    var queryList = createQueryList(propName, _this);\n                    var query = new CompileQuery(queryMeta, queryList, directiveInstance_1, _this);\n                    addQueryToTokenMap(viewQueries, query);\n                });\n            }\n            this.viewQueries = viewQueries;\n            templateVariableBindings.forEach(function (entry) { _this.locals.set(entry[1], THIS_EXPR.prop('context').prop(entry[0])); });\n            if (!this.declarationElement.isNull()) {\n                this.declarationElement.setEmbeddedView(this);\n            }\n        }\n        /**\n         * @param {?} name\n         * @param {?} input\n         * @param {?} args\n         * @return {?}\n         */\n        CompileView.prototype.callPipe = function (name, input, args) {\n            return CompilePipe.call(this, name, [input].concat(args));\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        CompileView.prototype.getLocal = function (name) {\n            if (name == EventHandlerVars.event.name) {\n                return EventHandlerVars.event;\n            }\n            var /** @type {?} */ currView = this;\n            var /** @type {?} */ result = currView.locals.get(name);\n            while (!result && isPresent(currView.declarationElement.view)) {\n                currView = currView.declarationElement.view;\n                result = currView.locals.get(name);\n            }\n            if (isPresent(result)) {\n                return getPropertyInView(result, this, currView);\n            }\n            else {\n                return null;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        CompileView.prototype.finish = function () {\n            var _this = this;\n            Array.from(this.viewQueries.values())\n                .forEach(function (queries) { return queries.forEach(function (q) { return q.generateStatements(_this.createMethod, _this.updateViewQueriesMethod); }); });\n        };\n        return CompileView;\n    }());\n    /**\n     * @param {?} component\n     * @param {?} embeddedTemplateIndex\n     * @return {?}\n     */\n    function getViewType(component, embeddedTemplateIndex) {\n        if (embeddedTemplateIndex > 0) {\n            return ViewType.EMBEDDED;\n        }\n        if (component.isHost) {\n            return ViewType.HOST;\n        }\n        return ViewType.COMPONENT;\n    }\n\n    /**\n     * @param {?} boundEvents\n     * @param {?} directives\n     * @param {?} compileElement\n     * @param {?} bindToRenderer\n     * @return {?}\n     */\n    function bindOutputs(boundEvents, directives, compileElement, bindToRenderer) {\n        var /** @type {?} */ usedEvents = collectEvents(boundEvents, directives);\n        if (!usedEvents.size) {\n            return false;\n        }\n        if (bindToRenderer) {\n            subscribeToRenderEvents(usedEvents, compileElement);\n        }\n        subscribeToDirectiveEvents(usedEvents, directives, compileElement);\n        generateHandleEventMethod(boundEvents, directives, compileElement);\n        return true;\n    }\n    /**\n     * @param {?} boundEvents\n     * @param {?} directives\n     * @return {?}\n     */\n    function collectEvents(boundEvents, directives) {\n        var /** @type {?} */ usedEvents = new Map();\n        boundEvents.forEach(function (event) { usedEvents.set(event.fullName, event); });\n        directives.forEach(function (dirAst) {\n            dirAst.hostEvents.forEach(function (event) { usedEvents.set(event.fullName, event); });\n        });\n        return usedEvents;\n    }\n    /**\n     * @param {?} usedEvents\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function subscribeToRenderEvents(usedEvents, compileElement) {\n        var /** @type {?} */ eventAndTargetExprs = [];\n        usedEvents.forEach(function (event) {\n            if (!event.phase) {\n                eventAndTargetExprs.push(literal(event.name), literal(event.target));\n            }\n        });\n        if (eventAndTargetExprs.length) {\n            var /** @type {?} */ disposableVar = variable(\"disposable_\" + compileElement.view.disposables.length);\n            compileElement.view.disposables.push(disposableVar);\n            compileElement.view.createMethod.addStmt(disposableVar\n                .set(importExpr(createIdentifier(Identifiers.subscribeToRenderElement)).callFn([\n                THIS_EXPR, compileElement.renderNode, createInlineArray(eventAndTargetExprs),\n                handleEventExpr(compileElement)\n            ]))\n                .toDeclStmt(FUNCTION_TYPE, [StmtModifier.Private]));\n        }\n    }\n    /**\n     * @param {?} usedEvents\n     * @param {?} directives\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function subscribeToDirectiveEvents(usedEvents, directives, compileElement) {\n        var /** @type {?} */ usedEventNames = Array.from(usedEvents.keys());\n        directives.forEach(function (dirAst) {\n            var /** @type {?} */ dirWrapper = compileElement.directiveWrapperInstance.get(dirAst.directive.type.reference);\n            compileElement.view.createMethod.addStmts(DirectiveWrapperExpressions.subscribe(dirAst.directive, dirAst.hostProperties, usedEventNames, dirWrapper, THIS_EXPR, handleEventExpr(compileElement)));\n        });\n    }\n    /**\n     * @param {?} boundEvents\n     * @param {?} directives\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function generateHandleEventMethod(boundEvents, directives, compileElement) {\n        var /** @type {?} */ hasComponentHostListener = directives.some(function (dirAst) { return dirAst.hostEvents.some(function (event) { return dirAst.directive.isComponent; }); });\n        var /** @type {?} */ markPathToRootStart = hasComponentHostListener ? compileElement.compViewExpr : THIS_EXPR;\n        var /** @type {?} */ handleEventStmts = new CompileMethod(compileElement.view);\n        handleEventStmts.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n        handleEventStmts.push(markPathToRootStart.callMethod('markPathToRootAsCheckOnce', []).toStmt());\n        var /** @type {?} */ eventNameVar = variable('eventName');\n        var /** @type {?} */ resultVar = variable('result');\n        handleEventStmts.push(resultVar.set(literal(true)).toDeclStmt(BOOL_TYPE));\n        directives.forEach(function (dirAst, dirIdx) {\n            var /** @type {?} */ dirWrapper = compileElement.directiveWrapperInstance.get(dirAst.directive.type.reference);\n            if (dirAst.hostEvents.length > 0) {\n                handleEventStmts.push(resultVar\n                    .set(DirectiveWrapperExpressions\n                    .handleEvent(dirAst.hostEvents, dirWrapper, eventNameVar, EventHandlerVars.event)\n                    .and(resultVar))\n                    .toStmt());\n            }\n        });\n        boundEvents.forEach(function (renderEvent, renderEventIdx) {\n            var /** @type {?} */ evalResult = convertActionBinding(compileElement.view, compileElement.view, compileElement.view.componentContext, renderEvent.handler, \"sub_\" + renderEventIdx);\n            var /** @type {?} */ trueStmts = evalResult.stmts;\n            if (evalResult.preventDefault) {\n                trueStmts.push(resultVar.set(evalResult.preventDefault.and(resultVar)).toStmt());\n            }\n            // TODO(tbosch): convert this into a `switch` once our OutputAst supports it.\n            handleEventStmts.push(new IfStmt(eventNameVar.equals(literal(renderEvent.fullName)), trueStmts));\n        });\n        handleEventStmts.push(new ReturnStatement(resultVar));\n        compileElement.view.methods.push(new ClassMethod(getHandleEventMethodName(compileElement.nodeIndex), [\n            new FnParam(eventNameVar.name, STRING_TYPE),\n            new FnParam(EventHandlerVars.event.name, DYNAMIC_TYPE)\n        ], handleEventStmts.finish(), BOOL_TYPE));\n    }\n    /**\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function handleEventExpr(compileElement) {\n        var /** @type {?} */ handleEventMethodName = getHandleEventMethodName(compileElement.nodeIndex);\n        return THIS_EXPR.callMethod('eventHandler', [THIS_EXPR.prop(handleEventMethodName)]);\n    }\n\n    var /** @type {?} */ STATE_IS_NEVER_CHECKED = THIS_EXPR.prop('numberOfChecks').identical(new LiteralExpr(0));\n    var /** @type {?} */ NOT_THROW_ON_CHANGES = not(DetectChangesVars.throwOnChange);\n    /**\n     * @param {?} directiveMeta\n     * @param {?} directiveInstance\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindDirectiveAfterContentLifecycleCallbacks(directiveMeta, directiveInstance, compileElement) {\n        var /** @type {?} */ view = compileElement.view;\n        var /** @type {?} */ lifecycleHooks = directiveMeta.type.lifecycleHooks;\n        var /** @type {?} */ afterContentLifecycleCallbacksMethod = view.afterContentLifecycleCallbacksMethod;\n        afterContentLifecycleCallbacksMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n        if (lifecycleHooks.indexOf(LifecycleHooks.AfterContentInit) !== -1) {\n            afterContentLifecycleCallbacksMethod.addStmt(new IfStmt(STATE_IS_NEVER_CHECKED, [directiveInstance.callMethod('ngAfterContentInit', []).toStmt()]));\n        }\n        if (lifecycleHooks.indexOf(LifecycleHooks.AfterContentChecked) !== -1) {\n            afterContentLifecycleCallbacksMethod.addStmt(directiveInstance.callMethod('ngAfterContentChecked', []).toStmt());\n        }\n    }\n    /**\n     * @param {?} directiveMeta\n     * @param {?} directiveInstance\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindDirectiveAfterViewLifecycleCallbacks(directiveMeta, directiveInstance, compileElement) {\n        var /** @type {?} */ view = compileElement.view;\n        var /** @type {?} */ lifecycleHooks = directiveMeta.type.lifecycleHooks;\n        var /** @type {?} */ afterViewLifecycleCallbacksMethod = view.afterViewLifecycleCallbacksMethod;\n        afterViewLifecycleCallbacksMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n        if (lifecycleHooks.indexOf(LifecycleHooks.AfterViewInit) !== -1) {\n            afterViewLifecycleCallbacksMethod.addStmt(new IfStmt(STATE_IS_NEVER_CHECKED, [directiveInstance.callMethod('ngAfterViewInit', []).toStmt()]));\n        }\n        if (lifecycleHooks.indexOf(LifecycleHooks.AfterViewChecked) !== -1) {\n            afterViewLifecycleCallbacksMethod.addStmt(directiveInstance.callMethod('ngAfterViewChecked', []).toStmt());\n        }\n    }\n    /**\n     * @param {?} dir\n     * @param {?} directiveWrapperIntance\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindDirectiveWrapperLifecycleCallbacks(dir, directiveWrapperIntance, compileElement) {\n        compileElement.view.destroyMethod.addStmts(DirectiveWrapperExpressions.ngOnDestroy(dir.directive, directiveWrapperIntance));\n        compileElement.view.detachMethod.addStmts(DirectiveWrapperExpressions.ngOnDetach(dir.hostProperties, directiveWrapperIntance, THIS_EXPR, compileElement.compViewExpr || THIS_EXPR, compileElement.renderNode));\n    }\n    /**\n     * @param {?} provider\n     * @param {?} providerInstance\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindInjectableDestroyLifecycleCallbacks(provider, providerInstance, compileElement) {\n        var /** @type {?} */ onDestroyMethod = compileElement.view.destroyMethod;\n        onDestroyMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n        if (provider.providerType !== ProviderAstType.Directive &&\n            provider.providerType !== ProviderAstType.Component &&\n            provider.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n            onDestroyMethod.addStmt(providerInstance.callMethod('ngOnDestroy', []).toStmt());\n        }\n    }\n    /**\n     * @param {?} pipeMeta\n     * @param {?} pipeInstance\n     * @param {?} view\n     * @return {?}\n     */\n    function bindPipeDestroyLifecycleCallbacks(pipeMeta, pipeInstance, view) {\n        var /** @type {?} */ onDestroyMethod = view.destroyMethod;\n        if (pipeMeta.type.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n            onDestroyMethod.addStmt(pipeInstance.callMethod('ngOnDestroy', []).toStmt());\n        }\n    }\n\n    /**\n     * @param {?} boundText\n     * @param {?} compileNode\n     * @param {?} view\n     * @return {?}\n     */\n    function bindRenderText(boundText, compileNode, view) {\n        var /** @type {?} */ valueField = createCheckBindingField(view);\n        var /** @type {?} */ evalResult = convertPropertyBinding(view, view, view.componentContext, boundText.value, valueField.bindingId);\n        if (!evalResult) {\n            return null;\n        }\n        view.detectChangesRenderPropertiesMethod.resetDebugInfo(compileNode.nodeIndex, boundText);\n        view.detectChangesRenderPropertiesMethod.addStmts(createCheckBindingStmt(evalResult, valueField.expression, DetectChangesVars.throwOnChange, [THIS_EXPR.prop('renderer')\n                .callMethod('setText', [compileNode.renderNode, evalResult.currValExpr])\n                .toStmt()]));\n    }\n    /**\n     * @param {?} boundProps\n     * @param {?} boundOutputs\n     * @param {?} hasEvents\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindRenderInputs(boundProps, boundOutputs, hasEvents, compileElement) {\n        var /** @type {?} */ view = compileElement.view;\n        var /** @type {?} */ renderNode = compileElement.renderNode;\n        boundProps.forEach(function (boundProp) {\n            var /** @type {?} */ bindingField = createCheckBindingField(view);\n            view.detectChangesRenderPropertiesMethod.resetDebugInfo(compileElement.nodeIndex, boundProp);\n            var /** @type {?} */ evalResult = convertPropertyBinding(view, view, compileElement.view.componentContext, boundProp.value, bindingField.bindingId);\n            if (!evalResult) {\n                return;\n            }\n            var /** @type {?} */ checkBindingStmts = [];\n            var /** @type {?} */ compileMethod = view.detectChangesRenderPropertiesMethod;\n            switch (boundProp.type) {\n                case PropertyBindingType.Property:\n                case PropertyBindingType.Attribute:\n                case PropertyBindingType.Class:\n                case PropertyBindingType.Style:\n                    checkBindingStmts.push.apply(checkBindingStmts, writeToRenderer(THIS_EXPR, boundProp, renderNode, evalResult.currValExpr, view.genConfig.logBindingUpdate));\n                    break;\n                case PropertyBindingType.Animation:\n                    compileMethod = view.animationBindingsMethod;\n                    var _a = triggerAnimation(THIS_EXPR, THIS_EXPR, boundProp, boundOutputs, (hasEvents ? THIS_EXPR.prop(getHandleEventMethodName(compileElement.nodeIndex)) :\n                        importExpr(createIdentifier(Identifiers.noop)))\n                        .callMethod(BuiltinMethod.Bind, [THIS_EXPR]), compileElement.renderNode, evalResult.currValExpr, bindingField.expression), updateStmts = _a.updateStmts, detachStmts = _a.detachStmts;\n                    checkBindingStmts.push.apply(checkBindingStmts, updateStmts);\n                    view.detachMethod.addStmts(detachStmts);\n                    break;\n            }\n            compileMethod.addStmts(createCheckBindingStmt(evalResult, bindingField.expression, DetectChangesVars.throwOnChange, checkBindingStmts));\n        });\n    }\n    /**\n     * @param {?} directiveAst\n     * @param {?} directiveWrapperInstance\n     * @param {?} compileElement\n     * @param {?} elementName\n     * @param {?} schemaRegistry\n     * @return {?}\n     */\n    function bindDirectiveHostProps(directiveAst, directiveWrapperInstance, compileElement, elementName, schemaRegistry) {\n        // We need to provide the SecurityContext for properties that could need sanitization.\n        var /** @type {?} */ runtimeSecurityCtxExprs = directiveAst.hostProperties.filter(function (boundProp) { return boundProp.needsRuntimeSecurityContext; })\n            .map(function (boundProp) {\n            var /** @type {?} */ ctx;\n            switch (boundProp.type) {\n                case PropertyBindingType.Property:\n                    ctx = schemaRegistry.securityContext(elementName, boundProp.name, false);\n                    break;\n                case PropertyBindingType.Attribute:\n                    ctx = schemaRegistry.securityContext(elementName, boundProp.name, true);\n                    break;\n                default:\n                    throw new Error(\"Illegal state: Only property / attribute bindings can have an unknown security context! Binding \" + boundProp.name);\n            }\n            return createEnumExpression(Identifiers.SecurityContext, ctx);\n        });\n        compileElement.view.detectChangesRenderPropertiesMethod.addStmts(DirectiveWrapperExpressions.checkHost(directiveAst.hostProperties, directiveWrapperInstance, THIS_EXPR, compileElement.compViewExpr || THIS_EXPR, compileElement.renderNode, DetectChangesVars.throwOnChange, runtimeSecurityCtxExprs));\n    }\n    /**\n     * @param {?} directiveAst\n     * @param {?} directiveWrapperInstance\n     * @param {?} dirIndex\n     * @param {?} compileElement\n     * @return {?}\n     */\n    function bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement) {\n        var /** @type {?} */ view = compileElement.view;\n        var /** @type {?} */ detectChangesInInputsMethod = view.detectChangesInInputsMethod;\n        detectChangesInInputsMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n        directiveAst.inputs.forEach(function (input, inputIdx) {\n            // Note: We can't use `fields.length` here, as we are not adding a field!\n            var /** @type {?} */ bindingId = compileElement.nodeIndex + \"_\" + dirIndex + \"_\" + inputIdx;\n            detectChangesInInputsMethod.resetDebugInfo(compileElement.nodeIndex, input);\n            var /** @type {?} */ evalResult = convertPropertyBinding(view, view, view.componentContext, input.value, bindingId);\n            if (!evalResult) {\n                return;\n            }\n            detectChangesInInputsMethod.addStmts(evalResult.stmts);\n            detectChangesInInputsMethod.addStmt(directiveWrapperInstance\n                .callMethod(\"check_\" + input.directiveName, [\n                evalResult.currValExpr, DetectChangesVars.throwOnChange,\n                evalResult.forceUpdate || literal(false)\n            ])\n                .toStmt());\n        });\n        var /** @type {?} */ isOnPushComp = directiveAst.directive.isComponent &&\n            !isDefaultChangeDetectionStrategy(directiveAst.directive.changeDetection);\n        var /** @type {?} */ directiveDetectChangesExpr = DirectiveWrapperExpressions.ngDoCheck(directiveWrapperInstance, THIS_EXPR, compileElement.renderNode, DetectChangesVars.throwOnChange);\n        var /** @type {?} */ directiveDetectChangesStmt = isOnPushComp ?\n            new IfStmt(directiveDetectChangesExpr, [compileElement.compViewExpr.callMethod('markAsCheckOnce', []).toStmt()]) :\n            directiveDetectChangesExpr.toStmt();\n        detectChangesInInputsMethod.addStmt(directiveDetectChangesStmt);\n    }\n\n    /**\n     * @param {?} ce\n     * @return {?}\n     */\n    function bindQueryValues(ce) {\n        var /** @type {?} */ queriesWithReads = [];\n        ce.getProviderTokens().forEach(function (token) {\n            var /** @type {?} */ queriesForProvider = ce.getQueriesFor(token);\n            queriesWithReads.push.apply(queriesWithReads, queriesForProvider.map(function (query) { return new _QueryWithRead(query, token); }));\n        });\n        Object.keys(ce.referenceTokens).forEach(function (varName) {\n            var /** @type {?} */ varToken = { value: varName };\n            queriesWithReads.push.apply(queriesWithReads, ce.getQueriesFor(varToken).map(function (query) { return new _QueryWithRead(query, varToken); }));\n        });\n        queriesWithReads.forEach(function (queryWithRead) {\n            var /** @type {?} */ value;\n            if (queryWithRead.read.identifier) {\n                // query for an identifier\n                value = ce.instances.get(tokenReference(queryWithRead.read));\n            }\n            else {\n                // query for a reference\n                var /** @type {?} */ token = ce.referenceTokens[queryWithRead.read.value];\n                if (token) {\n                    value = ce.instances.get(tokenReference(token));\n                }\n                else {\n                    value = ce.elementRef;\n                }\n            }\n            if (value) {\n                queryWithRead.query.addValue(value, ce.view);\n            }\n        });\n    }\n    var _QueryWithRead = (function () {\n        /**\n         * @param {?} query\n         * @param {?} match\n         */\n        function _QueryWithRead(query, match) {\n            this.query = query;\n            this.read = query.meta.read || match;\n        }\n        return _QueryWithRead;\n    }());\n\n    /**\n     * @param {?} view\n     * @param {?} parsedTemplate\n     * @param {?} schemaRegistry\n     * @return {?}\n     */\n    function bindView(view, parsedTemplate, schemaRegistry) {\n        var /** @type {?} */ visitor = new ViewBinderVisitor(view, schemaRegistry);\n        templateVisitAll(visitor, parsedTemplate);\n        view.pipes.forEach(function (pipe) { bindPipeDestroyLifecycleCallbacks(pipe.meta, pipe.instance, pipe.view); });\n    }\n    var ViewBinderVisitor = (function () {\n        /**\n         * @param {?} view\n         * @param {?} _schemaRegistry\n         */\n        function ViewBinderVisitor(view, _schemaRegistry) {\n            this.view = view;\n            this._schemaRegistry = _schemaRegistry;\n            this._nodeIndex = 0;\n        }\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitBoundText = function (ast, parent) {\n            var /** @type {?} */ node = this.view.nodes[this._nodeIndex++];\n            bindRenderText(ast, node, this.view);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitText = function (ast, parent) {\n            this._nodeIndex++;\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitNgContent = function (ast, parent) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitElement = function (ast, parent) {\n            var _this = this;\n            var /** @type {?} */ compileElement = (this.view.nodes[this._nodeIndex++]);\n            bindQueryValues(compileElement);\n            var /** @type {?} */ hasEvents = bindOutputs(ast.outputs, ast.directives, compileElement, true);\n            bindRenderInputs(ast.inputs, ast.outputs, hasEvents, compileElement);\n            ast.directives.forEach(function (directiveAst, dirIndex) {\n                var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n                bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement);\n                bindDirectiveHostProps(directiveAst, directiveWrapperInstance, compileElement, ast.name, _this._schemaRegistry);\n            });\n            templateVisitAll(this, ast.children, compileElement);\n            // afterContent and afterView lifecycles need to be called bottom up\n            // so that children are notified before parents\n            ast.directives.forEach(function (directiveAst) {\n                var /** @type {?} */ directiveInstance = compileElement.instances.get(directiveAst.directive.type.reference);\n                var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n                bindDirectiveAfterContentLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n                bindDirectiveAfterViewLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n                bindDirectiveWrapperLifecycleCallbacks(directiveAst, directiveWrapperInstance, compileElement);\n            });\n            ast.providers.forEach(function (providerAst) {\n                var /** @type {?} */ providerInstance = compileElement.instances.get(tokenReference(providerAst.token));\n                bindInjectableDestroyLifecycleCallbacks(providerAst, providerInstance, compileElement);\n            });\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitEmbeddedTemplate = function (ast, parent) {\n            var /** @type {?} */ compileElement = (this.view.nodes[this._nodeIndex++]);\n            bindQueryValues(compileElement);\n            bindOutputs(ast.outputs, ast.directives, compileElement, false);\n            ast.directives.forEach(function (directiveAst, dirIndex) {\n                var /** @type {?} */ directiveInstance = compileElement.instances.get(directiveAst.directive.type.reference);\n                var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n                bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement);\n                bindDirectiveAfterContentLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n                bindDirectiveAfterViewLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n                bindDirectiveWrapperLifecycleCallbacks(directiveAst, directiveWrapperInstance, compileElement);\n            });\n            ast.providers.forEach(function (providerAst) {\n                var /** @type {?} */ providerInstance = compileElement.instances.get(tokenReference(providerAst.token));\n                bindInjectableDestroyLifecycleCallbacks(providerAst, providerInstance, compileElement);\n            });\n            bindView(compileElement.embeddedView, ast.children, this._schemaRegistry);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitAttr = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitDirective = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} eventTargetAndNames\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitReference = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ViewBinderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };\n        return ViewBinderVisitor;\n    }());\n\n    var /** @type {?} */ IMPLICIT_TEMPLATE_VAR = '\\$implicit';\n    var /** @type {?} */ CLASS_ATTR$1 = 'class';\n    var /** @type {?} */ STYLE_ATTR = 'style';\n    var /** @type {?} */ NG_CONTAINER_TAG = 'ng-container';\n    var /** @type {?} */ parentRenderNodeVar = variable('parentRenderNode');\n    var /** @type {?} */ rootSelectorVar = variable('rootSelector');\n    /**\n     * @param {?} view\n     * @param {?} template\n     * @param {?} targetDependencies\n     * @return {?}\n     */\n    function buildView(view, template, targetDependencies) {\n        var /** @type {?} */ builderVisitor = new ViewBuilderVisitor(view, targetDependencies);\n        var /** @type {?} */ parentEl = view.declarationElement.isNull() ? view.declarationElement : view.declarationElement.parent;\n        templateVisitAll(builderVisitor, template, parentEl);\n        if (view.viewType === ViewType.EMBEDDED || view.viewType === ViewType.HOST) {\n            view.lastRenderNode = builderVisitor.getOrCreateLastRenderNode();\n        }\n        return builderVisitor.nestedViewCount;\n    }\n    /**\n     * @param {?} view\n     * @param {?} targetStatements\n     * @return {?}\n     */\n    function finishView(view, targetStatements) {\n        view.nodes.forEach(function (node) {\n            if (node instanceof CompileElement) {\n                node.finish();\n                if (node.hasEmbeddedView) {\n                    finishView(node.embeddedView, targetStatements);\n                }\n            }\n        });\n        view.finish();\n        createViewTopLevelStmts(view, targetStatements);\n    }\n    var ViewBuilderVisitor = (function () {\n        /**\n         * @param {?} view\n         * @param {?} targetDependencies\n         */\n        function ViewBuilderVisitor(view, targetDependencies) {\n            this.view = view;\n            this.targetDependencies = targetDependencies;\n            this.nestedViewCount = 0;\n        }\n        /**\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype._isRootNode = function (parent) { return parent.view !== this.view; };\n        /**\n         * @param {?} node\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype._addRootNodeAndProject = function (node) {\n            var /** @type {?} */ projectedNode = _getOuterContainerOrSelf(node);\n            var /** @type {?} */ parent = projectedNode.parent;\n            var /** @type {?} */ ngContentIndex = ((projectedNode.sourceAst)).ngContentIndex;\n            var /** @type {?} */ viewContainer = (node instanceof CompileElement && node.hasViewContainer) ? node.viewContainer : null;\n            if (this._isRootNode(parent)) {\n                if (this.view.viewType !== ViewType.COMPONENT) {\n                    this.view.rootNodes.push(new CompileViewRootNode(viewContainer ? CompileViewRootNodeType.ViewContainer : CompileViewRootNodeType.Node, viewContainer || node.renderNode));\n                }\n            }\n            else if (isPresent(parent.component) && isPresent(ngContentIndex)) {\n                parent.addContentNode(ngContentIndex, new CompileViewRootNode(viewContainer ? CompileViewRootNodeType.ViewContainer : CompileViewRootNodeType.Node, viewContainer || node.renderNode));\n            }\n        };\n        /**\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype._getParentRenderNode = function (parent) {\n            parent = _getOuterContainerParentOrSelf(parent);\n            if (this._isRootNode(parent)) {\n                if (this.view.viewType === ViewType.COMPONENT) {\n                    return parentRenderNodeVar;\n                }\n                else {\n                    // root node of an embedded/host view\n                    return NULL_EXPR;\n                }\n            }\n            else {\n                return isPresent(parent.component) &&\n                    parent.component.template.encapsulation !== _angular_core.ViewEncapsulation.Native ?\n                    NULL_EXPR :\n                    parent.renderNode;\n            }\n        };\n        /**\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.getOrCreateLastRenderNode = function () {\n            var /** @type {?} */ view = this.view;\n            if (view.rootNodes.length === 0 ||\n                view.rootNodes[view.rootNodes.length - 1].type !== CompileViewRootNodeType.Node) {\n                var /** @type {?} */ fieldName = \"_el_\" + view.nodes.length;\n                view.fields.push(new ClassField(fieldName, importType(view.genConfig.renderTypes.renderElement)));\n                view.createMethod.addStmt(THIS_EXPR.prop(fieldName)\n                    .set(ViewProperties.renderer.callMethod('createTemplateAnchor', [NULL_EXPR, NULL_EXPR]))\n                    .toStmt());\n                view.rootNodes.push(new CompileViewRootNode(CompileViewRootNodeType.Node, THIS_EXPR.prop(fieldName)));\n            }\n            return view.rootNodes[view.rootNodes.length - 1].expr;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitBoundText = function (ast, parent) {\n            return this._visitText(ast, '', parent);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitText = function (ast, parent) {\n            return this._visitText(ast, ast.value, parent);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} value\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype._visitText = function (ast, value, parent) {\n            var /** @type {?} */ fieldName = \"_text_\" + this.view.nodes.length;\n            this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderText)));\n            var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n            var /** @type {?} */ compileNode = new CompileNode(parent, this.view, this.view.nodes.length, renderNode, ast);\n            var /** @type {?} */ createRenderNode = THIS_EXPR.prop(fieldName)\n                .set(ViewProperties.renderer.callMethod('createText', [\n                this._getParentRenderNode(parent), literal(value),\n                this.view.createMethod.resetDebugInfoExpr(this.view.nodes.length, ast)\n            ]))\n                .toStmt();\n            this.view.nodes.push(compileNode);\n            this.view.createMethod.addStmt(createRenderNode);\n            this._addRootNodeAndProject(compileNode);\n            return renderNode;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitNgContent = function (ast, parent) {\n            // the projected nodes originate from a different view, so we don't\n            // have debug information for them...\n            this.view.createMethod.resetDebugInfo(null, ast);\n            var /** @type {?} */ parentRenderNode = this._getParentRenderNode(parent);\n            if (parentRenderNode !== NULL_EXPR) {\n                this.view.createMethod.addStmt(THIS_EXPR.callMethod('projectNodes', [parentRenderNode, literal(ast.index)])\n                    .toStmt());\n            }\n            else if (this._isRootNode(parent)) {\n                if (this.view.viewType !== ViewType.COMPONENT) {\n                    // store root nodes only for embedded/host views\n                    this.view.rootNodes.push(new CompileViewRootNode(CompileViewRootNodeType.NgContent, null, ast.index));\n                }\n            }\n            else {\n                if (isPresent(parent.component) && isPresent(ast.ngContentIndex)) {\n                    parent.addContentNode(ast.ngContentIndex, new CompileViewRootNode(CompileViewRootNodeType.NgContent, null, ast.index));\n                }\n            }\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitElement = function (ast, parent) {\n            var /** @type {?} */ nodeIndex = this.view.nodes.length;\n            var /** @type {?} */ createRenderNodeExpr;\n            var /** @type {?} */ debugContextExpr = this.view.createMethod.resetDebugInfoExpr(nodeIndex, ast);\n            var /** @type {?} */ directives = ast.directives.map(function (directiveAst) { return directiveAst.directive; });\n            var /** @type {?} */ component = directives.find(function (directive) { return directive.isComponent; });\n            if (ast.name === NG_CONTAINER_TAG) {\n                createRenderNodeExpr = ViewProperties.renderer.callMethod('createTemplateAnchor', [this._getParentRenderNode(parent), debugContextExpr]);\n            }\n            else {\n                var /** @type {?} */ htmlAttrs = _readHtmlAttrs(ast.attrs);\n                var /** @type {?} */ attrNameAndValues = createInlineArray(_mergeHtmlAndDirectiveAttrs(htmlAttrs, directives).map(function (v) { return literal(v); }));\n                if (nodeIndex === 0 && this.view.viewType === ViewType.HOST) {\n                    createRenderNodeExpr =\n                        importExpr(createIdentifier(Identifiers.selectOrCreateRenderHostElement)).callFn([\n                            ViewProperties.renderer, literal(ast.name), attrNameAndValues, rootSelectorVar,\n                            debugContextExpr\n                        ]);\n                }\n                else {\n                    createRenderNodeExpr =\n                        importExpr(createIdentifier(Identifiers.createRenderElement)).callFn([\n                            ViewProperties.renderer, this._getParentRenderNode(parent), literal(ast.name),\n                            attrNameAndValues, debugContextExpr\n                        ]);\n                }\n            }\n            var /** @type {?} */ fieldName = \"_el_\" + nodeIndex;\n            this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderElement)));\n            this.view.createMethod.addStmt(THIS_EXPR.prop(fieldName).set(createRenderNodeExpr).toStmt());\n            var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n            var /** @type {?} */ compileElement = new CompileElement(parent, this.view, nodeIndex, renderNode, ast, component, directives, ast.providers, ast.hasViewContainer, false, ast.references);\n            this.view.nodes.push(compileElement);\n            var /** @type {?} */ compViewExpr = null;\n            if (isPresent(component)) {\n                var /** @type {?} */ nestedComponentIdentifier = { reference: null };\n                this.targetDependencies.push(new ViewClassDependency(component.type, getViewClassName(component, 0), nestedComponentIdentifier));\n                compViewExpr = THIS_EXPR.prop(\"compView_\" + nodeIndex); // fix highlighting: `\n                this.view.fields.push(new ClassField(compViewExpr.name, importType(createIdentifier(Identifiers.AppView), [importType(component.type)])));\n                this.view.viewChildren.push(compViewExpr);\n                compileElement.setComponentView(compViewExpr);\n                this.view.createMethod.addStmt(compViewExpr\n                    .set(importExpr(nestedComponentIdentifier).instantiate([\n                    ViewProperties.viewUtils, THIS_EXPR, literal(nodeIndex), renderNode\n                ]))\n                    .toStmt());\n            }\n            compileElement.beforeChildren();\n            this._addRootNodeAndProject(compileElement);\n            templateVisitAll(this, ast.children, compileElement);\n            compileElement.afterChildren(this.view.nodes.length - nodeIndex - 1);\n            if (isPresent(compViewExpr)) {\n                this.view.createMethod.addStmt(compViewExpr.callMethod('create', [compileElement.getComponent()]).toStmt());\n            }\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} parent\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitEmbeddedTemplate = function (ast, parent) {\n            var /** @type {?} */ nodeIndex = this.view.nodes.length;\n            var /** @type {?} */ fieldName = \"_anchor_\" + nodeIndex;\n            this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderComment)));\n            this.view.createMethod.addStmt(THIS_EXPR.prop(fieldName)\n                .set(ViewProperties.renderer.callMethod('createTemplateAnchor', [\n                this._getParentRenderNode(parent),\n                this.view.createMethod.resetDebugInfoExpr(nodeIndex, ast)\n            ]))\n                .toStmt());\n            var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n            var /** @type {?} */ templateVariableBindings = ast.variables.map(function (varAst) { return [varAst.value.length > 0 ? varAst.value : IMPLICIT_TEMPLATE_VAR, varAst.name]; });\n            var /** @type {?} */ directives = ast.directives.map(function (directiveAst) { return directiveAst.directive; });\n            var /** @type {?} */ compileElement = new CompileElement(parent, this.view, nodeIndex, renderNode, ast, null, directives, ast.providers, ast.hasViewContainer, true, ast.references);\n            this.view.nodes.push(compileElement);\n            this.nestedViewCount++;\n            var /** @type {?} */ embeddedView = new CompileView(this.view.component, this.view.genConfig, this.view.pipeMetas, NULL_EXPR, this.view.animations, this.view.viewIndex + this.nestedViewCount, compileElement, templateVariableBindings, this.targetDependencies);\n            this.nestedViewCount += buildView(embeddedView, ast.children, this.targetDependencies);\n            compileElement.beforeChildren();\n            this._addRootNodeAndProject(compileElement);\n            compileElement.afterChildren(0);\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitAttr = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitDirective = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} eventTargetAndNames\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitReference = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        ViewBuilderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };\n        return ViewBuilderVisitor;\n    }());\n    /**\n     * Walks up the nodes while the direct parent is a container.\n     *\n     * Returns the outer container or the node itself when it is not a direct child of a container.\n     *\n     * \\@internal\n     * @param {?} node\n     * @return {?}\n     */\n    function _getOuterContainerOrSelf(node) {\n        var /** @type {?} */ view = node.view;\n        while (_isNgContainer(node.parent, view)) {\n            node = node.parent;\n        }\n        return node;\n    }\n    /**\n     * Walks up the nodes while they are container and returns the first parent which is not.\n     *\n     * Returns the parent of the outer container or the node itself when it is not a container.\n     *\n     * \\@internal\n     * @param {?} el\n     * @return {?}\n     */\n    function _getOuterContainerParentOrSelf(el) {\n        var /** @type {?} */ view = el.view;\n        while (_isNgContainer(el, view)) {\n            el = el.parent;\n        }\n        return el;\n    }\n    /**\n     * @param {?} node\n     * @param {?} view\n     * @return {?}\n     */\n    function _isNgContainer(node, view) {\n        return !node.isNull() && ((node.sourceAst)).name === NG_CONTAINER_TAG &&\n            node.view === view;\n    }\n    /**\n     * @param {?} declaredHtmlAttrs\n     * @param {?} directives\n     * @return {?}\n     */\n    function _mergeHtmlAndDirectiveAttrs(declaredHtmlAttrs, directives) {\n        var /** @type {?} */ mapResult = {};\n        Object.keys(declaredHtmlAttrs).forEach(function (key) { mapResult[key] = declaredHtmlAttrs[key]; });\n        directives.forEach(function (directiveMeta) {\n            Object.keys(directiveMeta.hostAttributes).forEach(function (name) {\n                var /** @type {?} */ value = directiveMeta.hostAttributes[name];\n                var /** @type {?} */ prevValue = mapResult[name];\n                mapResult[name] = isPresent(prevValue) ? mergeAttributeValue(name, prevValue, value) : value;\n            });\n        });\n        var /** @type {?} */ arrResult = [];\n        // Note: We need to sort to get a defined output order\n        // for tests and for caching generated artifacts...\n        Object.keys(mapResult).sort().forEach(function (attrName) { arrResult.push(attrName, mapResult[attrName]); });\n        return arrResult;\n    }\n    /**\n     * @param {?} attrs\n     * @return {?}\n     */\n    function _readHtmlAttrs(attrs) {\n        var /** @type {?} */ htmlAttrs = {};\n        attrs.forEach(function (ast) { htmlAttrs[ast.name] = ast.value; });\n        return htmlAttrs;\n    }\n    /**\n     * @param {?} attrName\n     * @param {?} attrValue1\n     * @param {?} attrValue2\n     * @return {?}\n     */\n    function mergeAttributeValue(attrName, attrValue1, attrValue2) {\n        if (attrName == CLASS_ATTR$1 || attrName == STYLE_ATTR) {\n            return attrValue1 + \" \" + attrValue2;\n        }\n        else {\n            return attrValue2;\n        }\n    }\n    /**\n     * @param {?} view\n     * @param {?} targetStatements\n     * @return {?}\n     */\n    function createViewTopLevelStmts(view, targetStatements) {\n        var /** @type {?} */ nodeDebugInfosVar = NULL_EXPR;\n        if (view.genConfig.genDebugInfo) {\n            nodeDebugInfosVar = variable(\"nodeDebugInfos_\" + identifierName(view.component.type) + view.viewIndex); // fix\n            // highlighting:\n            // `\n            targetStatements.push(((nodeDebugInfosVar))\n                .set(literalArr(view.nodes.map(createStaticNodeDebugInfo), new ArrayType(importType(createIdentifier(Identifiers.StaticNodeDebugInfo)), [TypeModifier.Const])))\n                .toDeclStmt(null, [StmtModifier.Final]));\n        }\n        var /** @type {?} */ renderCompTypeVar = variable(\"renderType_\" + identifierName(view.component.type)); // fix highlighting: `\n        if (view.viewIndex === 0) {\n            var /** @type {?} */ templateUrlInfo = void 0;\n            if (view.component.template.templateUrl == identifierModuleUrl(view.component.type)) {\n                templateUrlInfo =\n                    identifierModuleUrl(view.component.type) + \" class \" + identifierName(view.component.type) + \" - inline template\";\n            }\n            else {\n                templateUrlInfo = view.component.template.templateUrl;\n            }\n            targetStatements.push(renderCompTypeVar\n                .set(importExpr(createIdentifier(Identifiers.createRenderComponentType)).callFn([\n                view.genConfig.genDebugInfo ? literal(templateUrlInfo) : literal(''),\n                literal(view.component.template.ngContentSelectors.length),\n                ViewEncapsulationEnum.fromValue(view.component.template.encapsulation),\n                view.styles,\n                literalMap(view.animations.map(function (entry) { return [entry.name, entry.fnExp]; }), null, true),\n            ]))\n                .toDeclStmt(importType(createIdentifier(Identifiers.RenderComponentType))));\n        }\n        var /** @type {?} */ viewClass = createViewClass(view, renderCompTypeVar, nodeDebugInfosVar);\n        targetStatements.push(viewClass);\n    }\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    function createStaticNodeDebugInfo(node) {\n        var /** @type {?} */ compileElement = node instanceof CompileElement ? node : null;\n        var /** @type {?} */ providerTokens = [];\n        var /** @type {?} */ componentToken = NULL_EXPR;\n        var /** @type {?} */ varTokenEntries = [];\n        if (isPresent(compileElement)) {\n            providerTokens =\n                compileElement.getProviderTokens().map(function (token) { return createDiTokenExpression(token); });\n            if (isPresent(compileElement.component)) {\n                componentToken = createDiTokenExpression(identifierToken(compileElement.component.type));\n            }\n            Object.keys(compileElement.referenceTokens).forEach(function (varName) {\n                var /** @type {?} */ token = compileElement.referenceTokens[varName];\n                varTokenEntries.push([varName, isPresent(token) ? createDiTokenExpression(token) : NULL_EXPR]);\n            });\n        }\n        return importExpr(createIdentifier(Identifiers.StaticNodeDebugInfo))\n            .instantiate([\n            literalArr(providerTokens, new ArrayType(DYNAMIC_TYPE, [TypeModifier.Const])),\n            componentToken,\n            literalMap(varTokenEntries, new MapType(DYNAMIC_TYPE, [TypeModifier.Const]))\n        ], importType(createIdentifier(Identifiers.StaticNodeDebugInfo), null, [TypeModifier.Const]));\n    }\n    /**\n     * @param {?} view\n     * @param {?} renderCompTypeVar\n     * @param {?} nodeDebugInfosVar\n     * @return {?}\n     */\n    function createViewClass(view, renderCompTypeVar, nodeDebugInfosVar) {\n        var /** @type {?} */ viewConstructorArgs = [\n            new FnParam(ViewConstructorVars.viewUtils.name, importType(createIdentifier(Identifiers.ViewUtils))),\n            new FnParam(ViewConstructorVars.parentView.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n            new FnParam(ViewConstructorVars.parentIndex.name, NUMBER_TYPE),\n            new FnParam(ViewConstructorVars.parentElement.name, DYNAMIC_TYPE)\n        ];\n        var /** @type {?} */ superConstructorArgs = [\n            variable(view.className), renderCompTypeVar, ViewTypeEnum.fromValue(view.viewType),\n            ViewConstructorVars.viewUtils, ViewConstructorVars.parentView, ViewConstructorVars.parentIndex,\n            ViewConstructorVars.parentElement,\n            ChangeDetectorStatusEnum.fromValue(getChangeDetectionMode(view))\n        ];\n        if (view.genConfig.genDebugInfo) {\n            superConstructorArgs.push(nodeDebugInfosVar);\n        }\n        if (view.viewType === ViewType.EMBEDDED) {\n            viewConstructorArgs.push(new FnParam('declaredViewContainer', importType(createIdentifier(Identifiers.ViewContainer))));\n            superConstructorArgs.push(variable('declaredViewContainer'));\n        }\n        var /** @type {?} */ viewMethods = [\n            new ClassMethod('createInternal', [new FnParam(rootSelectorVar.name, STRING_TYPE)], generateCreateMethod(view), importType(createIdentifier(Identifiers.ComponentRef), [DYNAMIC_TYPE])),\n            new ClassMethod('injectorGetInternal', [\n                new FnParam(InjectMethodVars$1.token.name, DYNAMIC_TYPE),\n                // Note: Can't use o.INT_TYPE here as the method in AppView uses number\n                new FnParam(InjectMethodVars$1.requestNodeIndex.name, NUMBER_TYPE),\n                new FnParam(InjectMethodVars$1.notFoundResult.name, DYNAMIC_TYPE)\n            ], addReturnValuefNotEmpty(view.injectorGetMethod.finish(), InjectMethodVars$1.notFoundResult), DYNAMIC_TYPE),\n            new ClassMethod('detectChangesInternal', [new FnParam(DetectChangesVars.throwOnChange.name, BOOL_TYPE)], generateDetectChangesMethod(view)),\n            new ClassMethod('dirtyParentQueriesInternal', [], view.dirtyParentQueriesMethod.finish()),\n            new ClassMethod('destroyInternal', [], generateDestroyMethod(view)),\n            new ClassMethod('detachInternal', [], view.detachMethod.finish()),\n            generateVisitRootNodesMethod(view), generateVisitProjectableNodesMethod(view),\n            generateCreateEmbeddedViewsMethod(view)\n        ].filter(function (method) { return method.body.length > 0; });\n        var /** @type {?} */ superClass = view.genConfig.genDebugInfo ? Identifiers.DebugAppView : Identifiers.AppView;\n        var /** @type {?} */ viewClass = createClassStmt({\n            name: view.className,\n            parent: importExpr(createIdentifier(superClass), [getContextType(view)]),\n            parentArgs: superConstructorArgs,\n            ctorParams: viewConstructorArgs,\n            builders: [{ methods: viewMethods }, view]\n        });\n        return viewClass;\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateDestroyMethod(view) {\n        var /** @type {?} */ stmts = [];\n        view.viewContainers.forEach(function (viewContainer) {\n            stmts.push(viewContainer.callMethod('destroyNestedViews', []).toStmt());\n        });\n        view.viewChildren.forEach(function (viewChild) { stmts.push(viewChild.callMethod('destroy', []).toStmt()); });\n        stmts.push.apply(stmts, view.destroyMethod.finish());\n        return stmts;\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateCreateMethod(view) {\n        var /** @type {?} */ parentRenderNodeExpr = NULL_EXPR;\n        var /** @type {?} */ parentRenderNodeStmts = [];\n        if (view.viewType === ViewType.COMPONENT) {\n            parentRenderNodeExpr =\n                ViewProperties.renderer.callMethod('createViewRoot', [THIS_EXPR.prop('parentElement')]);\n            parentRenderNodeStmts =\n                [parentRenderNodeVar.set(parentRenderNodeExpr)\n                        .toDeclStmt(importType(view.genConfig.renderTypes.renderNode), [StmtModifier.Final])];\n        }\n        var /** @type {?} */ resultExpr;\n        if (view.viewType === ViewType.HOST) {\n            var /** @type {?} */ hostEl = (view.nodes[0]);\n            resultExpr =\n                importExpr(createIdentifier(Identifiers.ComponentRef_), [DYNAMIC_TYPE]).instantiate([\n                    literal(hostEl.nodeIndex), THIS_EXPR, hostEl.renderNode, hostEl.getComponent()\n                ]);\n        }\n        else {\n            resultExpr = NULL_EXPR;\n        }\n        var /** @type {?} */ allNodesExpr = ViewProperties.renderer.cast(DYNAMIC_TYPE)\n            .prop('directRenderer')\n            .conditional(NULL_EXPR, literalArr(view.nodes.map(function (node) { return node.renderNode; })));\n        return parentRenderNodeStmts.concat(view.createMethod.finish(), [\n            THIS_EXPR\n                .callMethod('init', [\n                view.lastRenderNode,\n                allNodesExpr,\n                view.disposables.length ? literalArr(view.disposables) : NULL_EXPR,\n            ])\n                .toStmt(),\n            new ReturnStatement(resultExpr)\n        ]);\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateDetectChangesMethod(view) {\n        var /** @type {?} */ stmts = [];\n        if (view.animationBindingsMethod.isEmpty() && view.detectChangesInInputsMethod.isEmpty() &&\n            view.updateContentQueriesMethod.isEmpty() &&\n            view.afterContentLifecycleCallbacksMethod.isEmpty() &&\n            view.detectChangesRenderPropertiesMethod.isEmpty() &&\n            view.updateViewQueriesMethod.isEmpty() && view.afterViewLifecycleCallbacksMethod.isEmpty() &&\n            view.viewContainers.length === 0 && view.viewChildren.length === 0) {\n            return stmts;\n        }\n        stmts.push.apply(stmts, view.animationBindingsMethod.finish());\n        stmts.push.apply(stmts, view.detectChangesInInputsMethod.finish());\n        view.viewContainers.forEach(function (viewContainer) {\n            stmts.push(viewContainer.callMethod('detectChangesInNestedViews', [DetectChangesVars.throwOnChange])\n                .toStmt());\n        });\n        var /** @type {?} */ afterContentStmts = view.updateContentQueriesMethod.finish().concat(view.afterContentLifecycleCallbacksMethod.finish());\n        if (afterContentStmts.length > 0) {\n            stmts.push(new IfStmt(not(DetectChangesVars.throwOnChange), afterContentStmts));\n        }\n        stmts.push.apply(stmts, view.detectChangesRenderPropertiesMethod.finish());\n        view.viewChildren.forEach(function (viewChild) {\n            stmts.push(viewChild.callMethod('internalDetectChanges', [DetectChangesVars.throwOnChange]).toStmt());\n        });\n        var /** @type {?} */ afterViewStmts = view.updateViewQueriesMethod.finish().concat(view.afterViewLifecycleCallbacksMethod.finish());\n        if (afterViewStmts.length > 0) {\n            stmts.push(new IfStmt(not(DetectChangesVars.throwOnChange), afterViewStmts));\n        }\n        var /** @type {?} */ varStmts = [];\n        var /** @type {?} */ readVars = findReadVarNames(stmts);\n        if (readVars.has(DetectChangesVars.changed.name)) {\n            varStmts.push(DetectChangesVars.changed.set(literal(true)).toDeclStmt(BOOL_TYPE));\n        }\n        if (readVars.has(DetectChangesVars.changes.name)) {\n            varStmts.push(DetectChangesVars.changes.set(NULL_EXPR)\n                .toDeclStmt(new MapType(importType(createIdentifier(Identifiers.SimpleChange)))));\n        }\n        varStmts.push.apply(varStmts, createSharedBindingVariablesIfNeeded(stmts));\n        return varStmts.concat(stmts);\n    }\n    /**\n     * @param {?} statements\n     * @param {?} value\n     * @return {?}\n     */\n    function addReturnValuefNotEmpty(statements, value) {\n        if (statements.length > 0) {\n            return statements.concat([new ReturnStatement(value)]);\n        }\n        else {\n            return statements;\n        }\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function getContextType(view) {\n        if (view.viewType === ViewType.COMPONENT) {\n            return importType(view.component.type);\n        }\n        return DYNAMIC_TYPE;\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function getChangeDetectionMode(view) {\n        var /** @type {?} */ mode;\n        if (view.viewType === ViewType.COMPONENT) {\n            mode = isDefaultChangeDetectionStrategy(view.component.changeDetection) ?\n                ChangeDetectorStatus.CheckAlways :\n                ChangeDetectorStatus.CheckOnce;\n        }\n        else {\n            mode = ChangeDetectorStatus.CheckAlways;\n        }\n        return mode;\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateVisitRootNodesMethod(view) {\n        var /** @type {?} */ cbVar = variable('cb');\n        var /** @type {?} */ ctxVar = variable('ctx');\n        var /** @type {?} */ stmts = generateVisitNodesStmts(view.rootNodes, cbVar, ctxVar);\n        return new ClassMethod('visitRootNodesInternal', [new FnParam(cbVar.name, DYNAMIC_TYPE), new FnParam(ctxVar.name, DYNAMIC_TYPE)], stmts);\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateVisitProjectableNodesMethod(view) {\n        var /** @type {?} */ nodeIndexVar = variable('nodeIndex');\n        var /** @type {?} */ ngContentIndexVar = variable('ngContentIndex');\n        var /** @type {?} */ cbVar = variable('cb');\n        var /** @type {?} */ ctxVar = variable('ctx');\n        var /** @type {?} */ stmts = [];\n        view.nodes.forEach(function (node) {\n            if (node instanceof CompileElement && node.component) {\n                node.contentNodesByNgContentIndex.forEach(function (projectedNodes, ngContentIndex) {\n                    stmts.push(new IfStmt(nodeIndexVar.equals(literal(node.nodeIndex))\n                        .and(ngContentIndexVar.equals(literal(ngContentIndex))), generateVisitNodesStmts(projectedNodes, cbVar, ctxVar)));\n                });\n            }\n        });\n        return new ClassMethod('visitProjectableNodesInternal', [\n            new FnParam(nodeIndexVar.name, NUMBER_TYPE),\n            new FnParam(ngContentIndexVar.name, NUMBER_TYPE),\n            new FnParam(cbVar.name, DYNAMIC_TYPE), new FnParam(ctxVar.name, DYNAMIC_TYPE)\n        ], stmts);\n    }\n    /**\n     * @param {?} nodes\n     * @param {?} cb\n     * @param {?} ctx\n     * @return {?}\n     */\n    function generateVisitNodesStmts(nodes, cb, ctx) {\n        var /** @type {?} */ stmts = [];\n        nodes.forEach(function (node) {\n            switch (node.type) {\n                case CompileViewRootNodeType.Node:\n                    stmts.push(cb.callFn([node.expr, ctx]).toStmt());\n                    break;\n                case CompileViewRootNodeType.ViewContainer:\n                    stmts.push(cb.callFn([node.expr.prop('nativeElement'), ctx]).toStmt());\n                    stmts.push(node.expr.callMethod('visitNestedViewRootNodes', [cb, ctx]).toStmt());\n                    break;\n                case CompileViewRootNodeType.NgContent:\n                    stmts.push(THIS_EXPR.callMethod('visitProjectedNodes', [literal(node.ngContentIndex), cb, ctx])\n                        .toStmt());\n                    break;\n            }\n        });\n        return stmts;\n    }\n    /**\n     * @param {?} view\n     * @return {?}\n     */\n    function generateCreateEmbeddedViewsMethod(view) {\n        var /** @type {?} */ nodeIndexVar = variable('nodeIndex');\n        var /** @type {?} */ stmts = [];\n        view.nodes.forEach(function (node) {\n            if (node instanceof CompileElement) {\n                if (node.embeddedView) {\n                    stmts.push(new IfStmt(nodeIndexVar.equals(literal(node.nodeIndex)), [new ReturnStatement(node.embeddedView.classExpr.instantiate([\n                            ViewProperties.viewUtils, THIS_EXPR, literal(node.nodeIndex), node.renderNode,\n                            node.viewContainer\n                        ]))]));\n                }\n            }\n        });\n        if (stmts.length > 0) {\n            stmts.push(new ReturnStatement(NULL_EXPR));\n        }\n        return new ClassMethod('createEmbeddedViewInternal', [new FnParam(nodeIndexVar.name, NUMBER_TYPE)], stmts, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE]));\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$16 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$16 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var ViewCompileResult = (function () {\n        /**\n         * @param {?} statements\n         * @param {?} viewClassVar\n         * @param {?} dependencies\n         */\n        function ViewCompileResult(statements, viewClassVar, dependencies) {\n            this.statements = statements;\n            this.viewClassVar = viewClassVar;\n            this.dependencies = dependencies;\n        }\n        return ViewCompileResult;\n    }());\n    var ViewCompiler = (function () {\n        /**\n         * @param {?} _genConfig\n         * @param {?} _schemaRegistry\n         */\n        function ViewCompiler(_genConfig, _schemaRegistry) {\n            this._genConfig = _genConfig;\n            this._schemaRegistry = _schemaRegistry;\n        }\n        /**\n         * @param {?} component\n         * @param {?} template\n         * @param {?} styles\n         * @param {?} pipes\n         * @param {?} compiledAnimations\n         * @return {?}\n         */\n        ViewCompiler.prototype.compileComponent = function (component, template, styles, pipes, compiledAnimations) {\n            var /** @type {?} */ dependencies = [];\n            var /** @type {?} */ view = new CompileView(component, this._genConfig, pipes, styles, compiledAnimations, 0, CompileElement.createNull(), [], dependencies);\n            var /** @type {?} */ statements = [];\n            buildView(view, template, dependencies);\n            // Need to separate binding from creation to be able to refer to\n            // variables that have been declared after usage.\n            bindView(view, template, this._schemaRegistry);\n            finishView(view, statements);\n            return new ViewCompileResult(statements, view.classExpr.name, dependencies);\n        };\n        ViewCompiler = __decorate$16([\n            CompilerInjectable(), \n            __metadata$16('design:paramtypes', [CompilerConfig, ElementSchemaRegistry])\n        ], ViewCompiler);\n        return ViewCompiler;\n    }());\n\n    var AnimationEntryCompileResult = (function () {\n        /**\n         * @param {?} name\n         * @param {?} statements\n         * @param {?} fnExp\n         */\n        function AnimationEntryCompileResult(name, statements, fnExp) {\n            this.name = name;\n            this.statements = statements;\n            this.fnExp = fnExp;\n        }\n        return AnimationEntryCompileResult;\n    }());\n    var AnimationCompiler = (function () {\n        function AnimationCompiler() {\n        }\n        /**\n         * @param {?} factoryNamePrefix\n         * @param {?} parsedAnimations\n         * @return {?}\n         */\n        AnimationCompiler.prototype.compile = function (factoryNamePrefix, parsedAnimations) {\n            return parsedAnimations.map(function (entry) {\n                var /** @type {?} */ factoryName = factoryNamePrefix + \"_\" + entry.name;\n                var /** @type {?} */ visitor = new _AnimationBuilder(entry.name, factoryName);\n                return visitor.build(entry);\n            });\n        };\n        return AnimationCompiler;\n    }());\n    var /** @type {?} */ _ANIMATION_FACTORY_ELEMENT_VAR = variable('element');\n    var /** @type {?} */ _ANIMATION_DEFAULT_STATE_VAR = variable('defaultStateStyles');\n    var /** @type {?} */ _ANIMATION_FACTORY_VIEW_VAR = variable('view');\n    var /** @type {?} */ _ANIMATION_FACTORY_VIEW_CONTEXT = _ANIMATION_FACTORY_VIEW_VAR.prop('animationContext');\n    var /** @type {?} */ _ANIMATION_FACTORY_RENDERER_VAR = _ANIMATION_FACTORY_VIEW_VAR.prop('renderer');\n    var /** @type {?} */ _ANIMATION_CURRENT_STATE_VAR = variable('currentState');\n    var /** @type {?} */ _ANIMATION_NEXT_STATE_VAR = variable('nextState');\n    var /** @type {?} */ _ANIMATION_PLAYER_VAR = variable('player');\n    var /** @type {?} */ _ANIMATION_TIME_VAR = variable('totalTime');\n    var /** @type {?} */ _ANIMATION_START_STATE_STYLES_VAR = variable('startStateStyles');\n    var /** @type {?} */ _ANIMATION_END_STATE_STYLES_VAR = variable('endStateStyles');\n    var /** @type {?} */ _ANIMATION_COLLECTED_STYLES = variable('collectedStyles');\n    var /** @type {?} */ _PREVIOUS_ANIMATION_PLAYERS = variable('previousPlayers');\n    var /** @type {?} */ _EMPTY_MAP = literalMap([]);\n    var /** @type {?} */ _EMPTY_ARRAY = literalArr([]);\n    var _AnimationBuilder = (function () {\n        /**\n         * @param {?} animationName\n         * @param {?} factoryName\n         */\n        function _AnimationBuilder(animationName, factoryName) {\n            this.animationName = animationName;\n            this._fnVarName = factoryName + '_factory';\n            this._statesMapVarName = factoryName + '_states';\n            this._statesMapVar = variable(this._statesMapVarName);\n        }\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationStyles = function (ast, context) {\n            var /** @type {?} */ stylesArr = [];\n            if (context.isExpectingFirstStyleStep) {\n                stylesArr.push(_ANIMATION_START_STATE_STYLES_VAR);\n                context.isExpectingFirstStyleStep = false;\n            }\n            ast.styles.forEach(function (entry) {\n                var /** @type {?} */ entries = Object.keys(entry).map(function (key) { return [key, literal(entry[key])]; });\n                stylesArr.push(literalMap(entries, null, true));\n            });\n            return importExpr(createIdentifier(Identifiers.AnimationStyles)).instantiate([\n                importExpr(createIdentifier(Identifiers.collectAndResolveStyles)).callFn([\n                    _ANIMATION_COLLECTED_STYLES, literalArr(stylesArr)\n                ])\n            ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationKeyframe = function (ast, context) {\n            return importExpr(createIdentifier(Identifiers.AnimationKeyframe)).instantiate([\n                literal(ast.offset), ast.styles.visit(this, context)\n            ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationStep = function (ast, context) {\n            var _this = this;\n            if (context.endStateAnimateStep === ast) {\n                return this._visitEndStateAnimation(ast, context);\n            }\n            var /** @type {?} */ startingStylesExpr = ast.startingStyles.visit(this, context);\n            var /** @type {?} */ keyframeExpressions = ast.keyframes.map(function (keyframeEntry) { return keyframeEntry.visit(_this, context); });\n            return this._callAnimateMethod(ast, startingStylesExpr, literalArr(keyframeExpressions), context);\n        };\n        /**\n         * \\@internal\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype._visitEndStateAnimation = function (ast, context) {\n            var _this = this;\n            var /** @type {?} */ startingStylesExpr = ast.startingStyles.visit(this, context);\n            var /** @type {?} */ keyframeExpressions = ast.keyframes.map(function (keyframe) { return keyframe.visit(_this, context); });\n            var /** @type {?} */ keyframesExpr = importExpr(createIdentifier(Identifiers.balanceAnimationKeyframes)).callFn([\n                _ANIMATION_COLLECTED_STYLES, _ANIMATION_END_STATE_STYLES_VAR,\n                literalArr(keyframeExpressions)\n            ]);\n            return this._callAnimateMethod(ast, startingStylesExpr, keyframesExpr, context);\n        };\n        /**\n         * \\@internal\n         * @param {?} ast\n         * @param {?} startingStylesExpr\n         * @param {?} keyframesExpr\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype._callAnimateMethod = function (ast, startingStylesExpr, keyframesExpr, context) {\n            var /** @type {?} */ previousStylesValue = _EMPTY_ARRAY;\n            if (context.isExpectingFirstAnimateStep) {\n                previousStylesValue = _PREVIOUS_ANIMATION_PLAYERS;\n                context.isExpectingFirstAnimateStep = false;\n            }\n            context.totalTransitionTime += ast.duration + ast.delay;\n            return _ANIMATION_FACTORY_RENDERER_VAR.callMethod('animate', [\n                _ANIMATION_FACTORY_ELEMENT_VAR, startingStylesExpr, keyframesExpr, literal(ast.duration),\n                literal(ast.delay), literal(ast.easing), previousStylesValue\n            ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationSequence = function (ast, context) {\n            var _this = this;\n            var /** @type {?} */ playerExprs = ast.steps.map(function (step) { return step.visit(_this, context); });\n            return importExpr(createIdentifier(Identifiers.AnimationSequencePlayer)).instantiate([\n                literalArr(playerExprs)\n            ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationGroup = function (ast, context) {\n            var _this = this;\n            var /** @type {?} */ playerExprs = ast.steps.map(function (step) { return step.visit(_this, context); });\n            return importExpr(createIdentifier(Identifiers.AnimationGroupPlayer)).instantiate([\n                literalArr(playerExprs)\n            ]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationStateDeclaration = function (ast, context) {\n            var /** @type {?} */ flatStyles = {};\n            _getStylesArray(ast).forEach(function (entry) { Object.keys(entry).forEach(function (key) { flatStyles[key] = entry[key]; }); });\n            context.stateMap.registerState(ast.stateName, flatStyles);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationStateTransition = function (ast, context) {\n            var /** @type {?} */ steps = ast.animation.steps;\n            var /** @type {?} */ lastStep = steps[steps.length - 1];\n            if (_isEndStateAnimateStep(lastStep)) {\n                context.endStateAnimateStep = (lastStep);\n            }\n            context.totalTransitionTime = 0;\n            context.isExpectingFirstStyleStep = true;\n            context.isExpectingFirstAnimateStep = true;\n            var /** @type {?} */ stateChangePreconditions = [];\n            ast.stateChanges.forEach(function (stateChange) {\n                stateChangePreconditions.push(_compareToAnimationStateExpr(_ANIMATION_CURRENT_STATE_VAR, stateChange.fromState)\n                    .and(_compareToAnimationStateExpr(_ANIMATION_NEXT_STATE_VAR, stateChange.toState)));\n                if (stateChange.fromState != ANY_STATE) {\n                    context.stateMap.registerState(stateChange.fromState);\n                }\n                if (stateChange.toState != ANY_STATE) {\n                    context.stateMap.registerState(stateChange.toState);\n                }\n            });\n            var /** @type {?} */ animationPlayerExpr = ast.animation.visit(this, context);\n            var /** @type {?} */ reducedStateChangesPrecondition = stateChangePreconditions.reduce(function (a, b) { return a.or(b); });\n            var /** @type {?} */ precondition = _ANIMATION_PLAYER_VAR.equals(NULL_EXPR).and(reducedStateChangesPrecondition);\n            var /** @type {?} */ animationStmt = _ANIMATION_PLAYER_VAR.set(animationPlayerExpr).toStmt();\n            var /** @type {?} */ totalTimeStmt = _ANIMATION_TIME_VAR.set(literal(context.totalTransitionTime)).toStmt();\n            return new IfStmt(precondition, [animationStmt, totalTimeStmt]);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} context\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.visitAnimationEntry = function (ast, context) {\n            var _this = this;\n            // visit each of the declarations first to build the context state map\n            ast.stateDeclarations.forEach(function (def) { return def.visit(_this, context); });\n            // this should always be defined even if the user overrides it\n            context.stateMap.registerState(DEFAULT_STATE, {});\n            var /** @type {?} */ statements = [];\n            statements.push(_PREVIOUS_ANIMATION_PLAYERS\n                .set(_ANIMATION_FACTORY_VIEW_CONTEXT.callMethod('getAnimationPlayers', [\n                _ANIMATION_FACTORY_ELEMENT_VAR,\n                _ANIMATION_NEXT_STATE_VAR.equals(literal(EMPTY_STATE))\n                    .conditional(NULL_EXPR, literal(this.animationName))\n            ]))\n                .toDeclStmt());\n            statements.push(_ANIMATION_COLLECTED_STYLES.set(_EMPTY_MAP).toDeclStmt());\n            statements.push(_ANIMATION_PLAYER_VAR.set(NULL_EXPR).toDeclStmt());\n            statements.push(_ANIMATION_TIME_VAR.set(literal(0)).toDeclStmt());\n            statements.push(_ANIMATION_DEFAULT_STATE_VAR.set(this._statesMapVar.key(literal(DEFAULT_STATE)))\n                .toDeclStmt());\n            statements.push(_ANIMATION_START_STATE_STYLES_VAR.set(this._statesMapVar.key(_ANIMATION_CURRENT_STATE_VAR))\n                .toDeclStmt());\n            statements.push(new IfStmt(_ANIMATION_START_STATE_STYLES_VAR.equals(NULL_EXPR), [_ANIMATION_START_STATE_STYLES_VAR.set(_ANIMATION_DEFAULT_STATE_VAR).toStmt()]));\n            statements.push(_ANIMATION_END_STATE_STYLES_VAR.set(this._statesMapVar.key(_ANIMATION_NEXT_STATE_VAR))\n                .toDeclStmt());\n            statements.push(new IfStmt(_ANIMATION_END_STATE_STYLES_VAR.equals(NULL_EXPR), [_ANIMATION_END_STATE_STYLES_VAR.set(_ANIMATION_DEFAULT_STATE_VAR).toStmt()]));\n            var /** @type {?} */ RENDER_STYLES_FN = importExpr(createIdentifier(Identifiers.renderStyles));\n            ast.stateTransitions.forEach(function (transAst) { return statements.push(transAst.visit(_this, context)); });\n            // this check ensures that the animation factory always returns a player\n            // so that the onDone callback can be used for tracking\n            statements.push(new IfStmt(_ANIMATION_PLAYER_VAR.equals(NULL_EXPR), [_ANIMATION_PLAYER_VAR\n                    .set(importExpr(createIdentifier(Identifiers.NoOpAnimationPlayer)).instantiate([]))\n                    .toStmt()]));\n            // once complete we want to apply the styles on the element\n            // since the destination state's values should persist once\n            // the animation sequence has completed.\n            statements.push(_ANIMATION_PLAYER_VAR\n                .callMethod('onDone', [fn([], [\n                    _ANIMATION_PLAYER_VAR.callMethod('destroy', []).toStmt(),\n                    RENDER_STYLES_FN\n                        .callFn([\n                        _ANIMATION_FACTORY_ELEMENT_VAR, _ANIMATION_FACTORY_RENDERER_VAR,\n                        importExpr(createIdentifier(Identifiers.prepareFinalAnimationStyles))\n                            .callFn([\n                            _ANIMATION_START_STATE_STYLES_VAR,\n                            _ANIMATION_END_STATE_STYLES_VAR\n                        ])\n                    ])\n                        .toStmt()\n                ])])\n                .toStmt());\n            statements.push(importExpr(createIdentifier(Identifiers.AnimationSequencePlayer))\n                .instantiate([_PREVIOUS_ANIMATION_PLAYERS])\n                .callMethod('destroy', [])\n                .toStmt());\n            // before we start any animation we want to clear out the starting\n            // styles from the element's style property (since they were placed\n            // there at the end of the last animation\n            statements.push(RENDER_STYLES_FN\n                .callFn([\n                _ANIMATION_FACTORY_ELEMENT_VAR, _ANIMATION_FACTORY_RENDERER_VAR,\n                importExpr(createIdentifier(Identifiers.clearStyles))\n                    .callFn([_ANIMATION_START_STATE_STYLES_VAR])\n            ])\n                .toStmt());\n            statements.push(_ANIMATION_FACTORY_VIEW_CONTEXT\n                .callMethod('queueAnimation', [\n                _ANIMATION_FACTORY_ELEMENT_VAR, literal(this.animationName),\n                _ANIMATION_PLAYER_VAR\n            ])\n                .toStmt());\n            statements.push(new ReturnStatement(importExpr(createIdentifier(Identifiers.AnimationTransition)).instantiate([\n                _ANIMATION_PLAYER_VAR, _ANIMATION_CURRENT_STATE_VAR, _ANIMATION_NEXT_STATE_VAR,\n                _ANIMATION_TIME_VAR\n            ])));\n            return fn([\n                new FnParam(_ANIMATION_FACTORY_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n                new FnParam(_ANIMATION_FACTORY_ELEMENT_VAR.name, DYNAMIC_TYPE),\n                new FnParam(_ANIMATION_CURRENT_STATE_VAR.name, DYNAMIC_TYPE),\n                new FnParam(_ANIMATION_NEXT_STATE_VAR.name, DYNAMIC_TYPE)\n            ], statements, importType(createIdentifier(Identifiers.AnimationTransition)));\n        };\n        /**\n         * @param {?} ast\n         * @return {?}\n         */\n        _AnimationBuilder.prototype.build = function (ast) {\n            var /** @type {?} */ context = new _AnimationBuilderContext();\n            var /** @type {?} */ fnStatement = ast.visit(this, context).toDeclStmt(this._fnVarName);\n            var /** @type {?} */ fnVariable = variable(this._fnVarName);\n            var /** @type {?} */ lookupMap = [];\n            Object.keys(context.stateMap.states).forEach(function (stateName) {\n                var /** @type {?} */ value = context.stateMap.states[stateName];\n                var /** @type {?} */ variableValue = _EMPTY_MAP;\n                if (isPresent(value)) {\n                    var /** @type {?} */ styleMap_1 = [];\n                    Object.keys(value).forEach(function (key) { styleMap_1.push([key, literal(value[key])]); });\n                    variableValue = literalMap(styleMap_1, null, true);\n                }\n                lookupMap.push([stateName, variableValue]);\n            });\n            var /** @type {?} */ compiledStatesMapStmt = this._statesMapVar.set(literalMap(lookupMap, null, true)).toDeclStmt();\n            var /** @type {?} */ statements = [compiledStatesMapStmt, fnStatement];\n            return new AnimationEntryCompileResult(this.animationName, statements, fnVariable);\n        };\n        return _AnimationBuilder;\n    }());\n    var _AnimationBuilderContext = (function () {\n        function _AnimationBuilderContext() {\n            this.stateMap = new _AnimationBuilderStateMap();\n            this.endStateAnimateStep = null;\n            this.isExpectingFirstStyleStep = false;\n            this.isExpectingFirstAnimateStep = false;\n            this.totalTransitionTime = 0;\n        }\n        return _AnimationBuilderContext;\n    }());\n    var _AnimationBuilderStateMap = (function () {\n        function _AnimationBuilderStateMap() {\n            this._states = {};\n        }\n        Object.defineProperty(_AnimationBuilderStateMap.prototype, \"states\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._states; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} name\n         * @param {?=} value\n         * @return {?}\n         */\n        _AnimationBuilderStateMap.prototype.registerState = function (name, value) {\n            if (value === void 0) { value = null; }\n            var /** @type {?} */ existingEntry = this._states[name];\n            if (!existingEntry) {\n                this._states[name] = value;\n            }\n        };\n        return _AnimationBuilderStateMap;\n    }());\n    /**\n     * @param {?} value\n     * @param {?} animationState\n     * @return {?}\n     */\n    function _compareToAnimationStateExpr(value, animationState) {\n        var /** @type {?} */ emptyStateLiteral = literal(EMPTY_STATE);\n        switch (animationState) {\n            case EMPTY_STATE:\n                return value.equals(emptyStateLiteral);\n            case ANY_STATE:\n                return literal(true);\n            default:\n                return value.equals(literal(animationState));\n        }\n    }\n    /**\n     * @param {?} step\n     * @return {?}\n     */\n    function _isEndStateAnimateStep(step) {\n        // the final animation step is characterized by having only TWO\n        // keyframe values and it must have zero styles for both keyframes\n        if (step instanceof AnimationStepAst && step.duration > 0 && step.keyframes.length == 2) {\n            var /** @type {?} */ styles1 = _getStylesArray(step.keyframes[0])[0];\n            var /** @type {?} */ styles2 = _getStylesArray(step.keyframes[1])[0];\n            return Object.keys(styles1).length === 0 && Object.keys(styles2).length === 0;\n        }\n        return false;\n    }\n    /**\n     * @param {?} obj\n     * @return {?}\n     */\n    function _getStylesArray(obj) {\n        return obj.styles.styles;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var GeneratedFile = (function () {\n        /**\n         * @param {?} srcFileUrl\n         * @param {?} genFileUrl\n         * @param {?} source\n         */\n        function GeneratedFile(srcFileUrl, genFileUrl, source) {\n            this.srcFileUrl = srcFileUrl;\n            this.genFileUrl = genFileUrl;\n            this.source = source;\n        }\n        return GeneratedFile;\n    }());\n\n    var __extends$26 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ STRIP_SRC_FILE_SUFFIXES = /(\\.ts|\\.d\\.ts|\\.js|\\.jsx|\\.tsx)$/;\n    /**\n     * @param {?} host\n     * @param {?} summaryResolver\n     * @param {?} symbolResolver\n     * @param {?} symbols\n     * @param {?} types\n     * @return {?}\n     */\n    function serializeSummaries(host, summaryResolver, symbolResolver, symbols, types) {\n        var /** @type {?} */ serializer = new Serializer$1(host);\n        // for symbols, we use everything except for the class metadata itself\n        // (we keep the statics though), as the class metadata is contained in the\n        // CompileTypeSummary.\n        symbols.forEach(function (resolvedSymbol) { return serializer.addOrMergeSummary({ symbol: resolvedSymbol.symbol, metadata: resolvedSymbol.metadata }); });\n        // Add summaries that are referenced by the given symbols (transitively)\n        // Note: the serializer.symbols array might be growing while\n        // we execute the loop!\n        for (var /** @type {?} */ processedIndex = 0; processedIndex < serializer.symbols.length; processedIndex++) {\n            var /** @type {?} */ symbol = serializer.symbols[processedIndex];\n            if (!host.isSourceFile(symbol.filePath)) {\n                var /** @type {?} */ summary = summaryResolver.resolveSummary(symbol);\n                if (!summary) {\n                    // some symbols might originate from a plain typescript library\n                    // that just exported .d.ts and .metadata.json files, i.e. where no summary\n                    // files were created.\n                    var /** @type {?} */ resolvedSymbol = symbolResolver.resolveSymbol(symbol);\n                    if (resolvedSymbol) {\n                        summary = { symbol: resolvedSymbol.symbol, metadata: resolvedSymbol.metadata };\n                    }\n                }\n                if (summary) {\n                    serializer.addOrMergeSummary(summary);\n                }\n            }\n        }\n        // Add type summaries.\n        // Note: We don't add the summaries of all referenced symbols as for the ResolvedSymbols,\n        // as the type summaries already contain the transitive data that they require\n        // (in a minimal way).\n        types.forEach(function (typeSummary) {\n            serializer.addOrMergeSummary({ symbol: typeSummary.type.reference, metadata: { __symbolic: 'class' }, type: typeSummary });\n            if (typeSummary.summaryKind === CompileSummaryKind.NgModule) {\n                var /** @type {?} */ ngModuleSummary = (typeSummary);\n                ngModuleSummary.exportedDirectives.concat(ngModuleSummary.exportedPipes).forEach(function (id) {\n                    var /** @type {?} */ symbol = id.reference;\n                    if (!host.isSourceFile(symbol.filePath)) {\n                        serializer.addOrMergeSummary(summaryResolver.resolveSummary(symbol));\n                    }\n                });\n            }\n        });\n        return serializer.serialize();\n    }\n    /**\n     * @param {?} symbolCache\n     * @param {?} json\n     * @return {?}\n     */\n    function deserializeSummaries(symbolCache, json) {\n        var /** @type {?} */ deserializer = new Deserializer(symbolCache);\n        return deserializer.deserialize(json);\n    }\n    /**\n     * @param {?} fileName\n     * @return {?}\n     */\n    function summaryFileName(fileName) {\n        var /** @type {?} */ fileNameWithoutSuffix = fileName.replace(STRIP_SRC_FILE_SUFFIXES, '');\n        return fileNameWithoutSuffix + \".ngsummary.json\";\n    }\n    var Serializer$1 = (function (_super) {\n        __extends$26(Serializer, _super);\n        /**\n         * @param {?} host\n         */\n        function Serializer(host) {\n            _super.call(this);\n            this.host = host;\n            this.symbols = [];\n            this.indexBySymbol = new Map();\n            this.processedSummaryBySymbol = new Map();\n            this.processedSummaries = [];\n        }\n        /**\n         * @param {?} summary\n         * @return {?}\n         */\n        Serializer.prototype.addOrMergeSummary = function (summary) {\n            var /** @type {?} */ symbolMeta = summary.metadata;\n            if (symbolMeta && symbolMeta.__symbolic === 'class') {\n                // For classes, we only keep their statics, but not the metadata\n                // of the class itself as that has been captured already via other summaries\n                // (e.g. DirectiveSummary, ...).\n                symbolMeta = { __symbolic: 'class', statics: symbolMeta.statics };\n            }\n            var /** @type {?} */ processedSummary = this.processedSummaryBySymbol.get(summary.symbol);\n            if (!processedSummary) {\n                processedSummary = this.processValue({ symbol: summary.symbol });\n                this.processedSummaries.push(processedSummary);\n                this.processedSummaryBySymbol.set(summary.symbol, processedSummary);\n            }\n            // Note: == by purpose to compare with undefined!\n            if (processedSummary.metadata == null && symbolMeta != null) {\n                processedSummary.metadata = this.processValue(symbolMeta);\n            }\n            // Note: == by purpose to compare with undefined!\n            if (processedSummary.type == null && summary.type != null) {\n                processedSummary.type = this.processValue(summary.type);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        Serializer.prototype.serialize = function () {\n            var _this = this;\n            return JSON.stringify({\n                summaries: this.processedSummaries,\n                symbols: this.symbols.map(function (symbol, index) {\n                    return {\n                        __symbol: index,\n                        name: symbol.name,\n                        // We convert the source filenames tinto output filenames,\n                        // as the generated summary file will be used when teh current\n                        // compilation unit is used as a library\n                        filePath: _this.host.getOutputFileName(symbol.filePath)\n                    };\n                })\n            });\n        };\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        Serializer.prototype.processValue = function (value) { return visitValue(value, this, null); };\n        /**\n         * @param {?} value\n         * @param {?} context\n         * @return {?}\n         */\n        Serializer.prototype.visitOther = function (value, context) {\n            if (value instanceof StaticSymbol) {\n                var /** @type {?} */ index = this.indexBySymbol.get(value);\n                // Note: == by purpose to compare with undefined!\n                if (index == null) {\n                    index = this.indexBySymbol.size;\n                    this.indexBySymbol.set(value, index);\n                    this.symbols.push(value);\n                }\n                return { __symbol: index };\n            }\n        };\n        return Serializer;\n    }(ValueTransformer));\n    var Deserializer = (function (_super) {\n        __extends$26(Deserializer, _super);\n        /**\n         * @param {?} symbolCache\n         */\n        function Deserializer(symbolCache) {\n            _super.call(this);\n            this.symbolCache = symbolCache;\n        }\n        /**\n         * @param {?} json\n         * @return {?}\n         */\n        Deserializer.prototype.deserialize = function (json) {\n            var _this = this;\n            var /** @type {?} */ data = JSON.parse(json);\n            this.symbols = data.symbols.map(function (serializedSymbol) { return _this.symbolCache.get(serializedSymbol.filePath, serializedSymbol.name); });\n            return visitValue(data.summaries, this, null);\n        };\n        /**\n         * @param {?} map\n         * @param {?} context\n         * @return {?}\n         */\n        Deserializer.prototype.visitStringMap = function (map, context) {\n            if ('__symbol' in map) {\n                return this.symbols[map['__symbol']];\n            }\n            else {\n                return _super.prototype.visitStringMap.call(this, map, context);\n            }\n        };\n        return Deserializer;\n    }(ValueTransformer));\n\n    var AotCompiler = (function () {\n        /**\n         * @param {?} _host\n         * @param {?} _metadataResolver\n         * @param {?} _templateParser\n         * @param {?} _styleCompiler\n         * @param {?} _viewCompiler\n         * @param {?} _dirWrapperCompiler\n         * @param {?} _ngModuleCompiler\n         * @param {?} _outputEmitter\n         * @param {?} _summaryResolver\n         * @param {?} _localeId\n         * @param {?} _translationFormat\n         * @param {?} _animationParser\n         * @param {?} _symbolResolver\n         */\n        function AotCompiler(_host, _metadataResolver, _templateParser, _styleCompiler, _viewCompiler, _dirWrapperCompiler, _ngModuleCompiler, _outputEmitter, _summaryResolver, _localeId, _translationFormat, _animationParser, _symbolResolver) {\n            this._host = _host;\n            this._metadataResolver = _metadataResolver;\n            this._templateParser = _templateParser;\n            this._styleCompiler = _styleCompiler;\n            this._viewCompiler = _viewCompiler;\n            this._dirWrapperCompiler = _dirWrapperCompiler;\n            this._ngModuleCompiler = _ngModuleCompiler;\n            this._outputEmitter = _outputEmitter;\n            this._summaryResolver = _summaryResolver;\n            this._localeId = _localeId;\n            this._translationFormat = _translationFormat;\n            this._animationParser = _animationParser;\n            this._symbolResolver = _symbolResolver;\n            this._animationCompiler = new AnimationCompiler();\n        }\n        /**\n         * @return {?}\n         */\n        AotCompiler.prototype.clearCache = function () { this._metadataResolver.clearCache(); };\n        /**\n         * @param {?} rootFiles\n         * @return {?}\n         */\n        AotCompiler.prototype.compileAll = function (rootFiles) {\n            var _this = this;\n            var /** @type {?} */ programSymbols = extractProgramSymbols(this._symbolResolver, rootFiles, this._host);\n            var _a = analyzeAndValidateNgModules(programSymbols, this._host, this._metadataResolver), ngModuleByPipeOrDirective = _a.ngModuleByPipeOrDirective, files = _a.files, ngModules = _a.ngModules;\n            return Promise\n                .all(ngModules.map(function (ngModule) { return _this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference, false); }))\n                .then(function () {\n                var /** @type {?} */ sourceModules = files.map(function (file) { return _this._compileSrcFile(file.srcUrl, ngModuleByPipeOrDirective, file.directives, file.pipes, file.ngModules, file.injectables); });\n                return ListWrapper.flatten(sourceModules);\n            });\n        };\n        /**\n         * @param {?} srcFileUrl\n         * @param {?} ngModuleByPipeOrDirective\n         * @param {?} directives\n         * @param {?} pipes\n         * @param {?} ngModules\n         * @param {?} injectables\n         * @return {?}\n         */\n        AotCompiler.prototype._compileSrcFile = function (srcFileUrl, ngModuleByPipeOrDirective, directives, pipes, ngModules, injectables) {\n            var _this = this;\n            var /** @type {?} */ fileSuffix = _splitTypescriptSuffix(srcFileUrl)[1];\n            var /** @type {?} */ statements = [];\n            var /** @type {?} */ exportedVars = [];\n            var /** @type {?} */ generatedFiles = [];\n            generatedFiles.push(this._createSummary(srcFileUrl, directives, pipes, ngModules, injectables));\n            // compile all ng modules\n            exportedVars.push.apply(exportedVars, ngModules.map(function (ngModuleType) { return _this._compileModule(ngModuleType, statements); }));\n            // compile directive wrappers\n            exportedVars.push.apply(exportedVars, directives.map(function (directiveType) { return _this._compileDirectiveWrapper(directiveType, statements); }));\n            // compile components\n            directives.forEach(function (dirType) {\n                var /** @type {?} */ compMeta = _this._metadataResolver.getDirectiveMetadata(/** @type {?} */ (dirType));\n                if (!compMeta.isComponent) {\n                    return Promise.resolve(null);\n                }\n                var /** @type {?} */ ngModule = ngModuleByPipeOrDirective.get(dirType);\n                if (!ngModule) {\n                    throw new Error(\"Internal Error: cannot determine the module for component \" + identifierName(compMeta.type) + \"!\");\n                }\n                _assertComponent(compMeta);\n                // compile styles\n                var /** @type {?} */ stylesCompileResults = _this._styleCompiler.compileComponent(compMeta);\n                stylesCompileResults.externalStylesheets.forEach(function (compiledStyleSheet) {\n                    generatedFiles.push(_this._codgenStyles(srcFileUrl, compiledStyleSheet, fileSuffix));\n                });\n                // compile components\n                exportedVars.push(_this._compileComponentFactory(compMeta, ngModule, fileSuffix, statements), _this._compileComponent(compMeta, ngModule, ngModule.transitiveModule.directives, stylesCompileResults.componentStylesheet, fileSuffix, statements));\n            });\n            if (statements.length > 0) {\n                var /** @type {?} */ srcModule = this._codegenSourceModule(srcFileUrl, _ngfactoryModuleUrl(srcFileUrl), statements, exportedVars);\n                generatedFiles.unshift(srcModule);\n            }\n            return generatedFiles;\n        };\n        /**\n         * @param {?} srcFileUrl\n         * @param {?} directives\n         * @param {?} pipes\n         * @param {?} ngModules\n         * @param {?} injectables\n         * @return {?}\n         */\n        AotCompiler.prototype._createSummary = function (srcFileUrl, directives, pipes, ngModules, injectables) {\n            var _this = this;\n            var /** @type {?} */ symbolSummaries = this._symbolResolver.getSymbolsOf(srcFileUrl)\n                .map(function (symbol) { return _this._symbolResolver.resolveSymbol(symbol); });\n            var /** @type {?} */ typeSummaries = ngModules.map(function (ref) { return _this._metadataResolver.getNgModuleSummary(ref); }).concat(directives.map(function (ref) { return _this._metadataResolver.getDirectiveSummary(ref); }), pipes.map(function (ref) { return _this._metadataResolver.getPipeSummary(ref); }), injectables.map(function (ref) { return _this._metadataResolver.getInjectableSummary(ref); }));\n            var /** @type {?} */ json = serializeSummaries(this._host, this._summaryResolver, this._symbolResolver, symbolSummaries, typeSummaries);\n            return new GeneratedFile(srcFileUrl, summaryFileName(srcFileUrl), json);\n        };\n        /**\n         * @param {?} ngModuleType\n         * @param {?} targetStatements\n         * @return {?}\n         */\n        AotCompiler.prototype._compileModule = function (ngModuleType, targetStatements) {\n            var _this = this;\n            var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(ngModuleType);\n            var /** @type {?} */ providers = [];\n            if (this._localeId) {\n                providers.push({\n                    token: createIdentifierToken(Identifiers.LOCALE_ID),\n                    useValue: this._localeId,\n                });\n            }\n            if (this._translationFormat) {\n                providers.push({\n                    token: createIdentifierToken(Identifiers.TRANSLATIONS_FORMAT),\n                    useValue: this._translationFormat\n                });\n            }\n            var /** @type {?} */ appCompileResult = this._ngModuleCompiler.compile(ngModule, providers);\n            appCompileResult.dependencies.forEach(function (dep) {\n                dep.placeholder.reference = _this._symbolResolver.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(dep.comp)), _componentFactoryName(dep.comp));\n            });\n            targetStatements.push.apply(targetStatements, appCompileResult.statements);\n            return appCompileResult.ngModuleFactoryVar;\n        };\n        /**\n         * @param {?} directiveType\n         * @param {?} targetStatements\n         * @return {?}\n         */\n        AotCompiler.prototype._compileDirectiveWrapper = function (directiveType, targetStatements) {\n            var /** @type {?} */ dirMeta = this._metadataResolver.getDirectiveMetadata(directiveType);\n            var /** @type {?} */ dirCompileResult = this._dirWrapperCompiler.compile(dirMeta);\n            targetStatements.push.apply(targetStatements, dirCompileResult.statements);\n            return dirCompileResult.dirWrapperClassVar;\n        };\n        /**\n         * @param {?} compMeta\n         * @param {?} ngModule\n         * @param {?} fileSuffix\n         * @param {?} targetStatements\n         * @return {?}\n         */\n        AotCompiler.prototype._compileComponentFactory = function (compMeta, ngModule, fileSuffix, targetStatements) {\n            var /** @type {?} */ hostMeta = createHostComponentMeta(this._symbolResolver.getStaticSymbol(identifierModuleUrl(compMeta.type), identifierName(compMeta.type) + \"_Host\"), compMeta);\n            var /** @type {?} */ hostViewFactoryVar = this._compileComponent(hostMeta, ngModule, [compMeta.type], null, fileSuffix, targetStatements);\n            var /** @type {?} */ compFactoryVar = _componentFactoryName(compMeta.type);\n            targetStatements.push(variable(compFactoryVar)\n                .set(importExpr(createIdentifier(Identifiers.ComponentFactory), [importType(compMeta.type)])\n                .instantiate([\n                literal(compMeta.selector),\n                variable(hostViewFactoryVar),\n                importExpr(compMeta.type),\n            ], importType(createIdentifier(Identifiers.ComponentFactory), [importType(compMeta.type)], [TypeModifier.Const])))\n                .toDeclStmt(null, [StmtModifier.Final]));\n            return compFactoryVar;\n        };\n        /**\n         * @param {?} compMeta\n         * @param {?} ngModule\n         * @param {?} directiveIdentifiers\n         * @param {?} componentStyles\n         * @param {?} fileSuffix\n         * @param {?} targetStatements\n         * @return {?}\n         */\n        AotCompiler.prototype._compileComponent = function (compMeta, ngModule, directiveIdentifiers, componentStyles, fileSuffix, targetStatements) {\n            var _this = this;\n            var /** @type {?} */ parsedAnimations = this._animationParser.parseComponent(compMeta);\n            var /** @type {?} */ directives = directiveIdentifiers.map(function (dir) { return _this._metadataResolver.getDirectiveSummary(dir.reference); });\n            var /** @type {?} */ pipes = ngModule.transitiveModule.pipes.map(function (pipe) { return _this._metadataResolver.getPipeSummary(pipe.reference); });\n            var /** @type {?} */ parsedTemplate = this._templateParser.parse(compMeta, compMeta.template.template, directives, pipes, ngModule.schemas, identifierName(compMeta.type));\n            var /** @type {?} */ stylesExpr = componentStyles ? variable(componentStyles.stylesVar) : literalArr([]);\n            var /** @type {?} */ compiledAnimations = this._animationCompiler.compile(identifierName(compMeta.type), parsedAnimations);\n            var /** @type {?} */ viewResult = this._viewCompiler.compileComponent(compMeta, parsedTemplate, stylesExpr, pipes, compiledAnimations);\n            if (componentStyles) {\n                targetStatements.push.apply(targetStatements, _resolveStyleStatements(this._symbolResolver, componentStyles, fileSuffix));\n            }\n            compiledAnimations.forEach(function (entry) { return targetStatements.push.apply(targetStatements, entry.statements); });\n            targetStatements.push.apply(targetStatements, _resolveViewStatements(this._symbolResolver, viewResult));\n            return viewResult.viewClassVar;\n        };\n        /**\n         * @param {?} fileUrl\n         * @param {?} stylesCompileResult\n         * @param {?} fileSuffix\n         * @return {?}\n         */\n        AotCompiler.prototype._codgenStyles = function (fileUrl, stylesCompileResult, fileSuffix) {\n            _resolveStyleStatements(this._symbolResolver, stylesCompileResult, fileSuffix);\n            return this._codegenSourceModule(fileUrl, _stylesModuleUrl(stylesCompileResult.meta.moduleUrl, stylesCompileResult.isShimmed, fileSuffix), stylesCompileResult.statements, [stylesCompileResult.stylesVar]);\n        };\n        /**\n         * @param {?} srcFileUrl\n         * @param {?} genFileUrl\n         * @param {?} statements\n         * @param {?} exportedVars\n         * @return {?}\n         */\n        AotCompiler.prototype._codegenSourceModule = function (srcFileUrl, genFileUrl, statements, exportedVars) {\n            return new GeneratedFile(srcFileUrl, genFileUrl, this._outputEmitter.emitStatements(genFileUrl, statements, exportedVars));\n        };\n        return AotCompiler;\n    }());\n    /**\n     * @param {?} reflector\n     * @param {?} compileResult\n     * @return {?}\n     */\n    function _resolveViewStatements(reflector, compileResult) {\n        compileResult.dependencies.forEach(function (dep) {\n            if (dep instanceof ViewClassDependency) {\n                var /** @type {?} */ vfd = (dep);\n                vfd.placeholder.reference =\n                    reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(vfd.comp)), dep.name);\n            }\n            else if (dep instanceof ComponentFactoryDependency$1) {\n                var /** @type {?} */ cfd = (dep);\n                cfd.placeholder.reference = reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(cfd.comp)), _componentFactoryName(cfd.comp));\n            }\n            else if (dep instanceof DirectiveWrapperDependency) {\n                var /** @type {?} */ dwd = (dep);\n                dwd.placeholder.reference =\n                    reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(dwd.dir)), dwd.name);\n            }\n        });\n        return compileResult.statements;\n    }\n    /**\n     * @param {?} reflector\n     * @param {?} compileResult\n     * @param {?} fileSuffix\n     * @return {?}\n     */\n    function _resolveStyleStatements(reflector, compileResult, fileSuffix) {\n        compileResult.dependencies.forEach(function (dep) {\n            dep.valuePlaceholder.reference = reflector.getStaticSymbol(_stylesModuleUrl(dep.moduleUrl, dep.isShimmed, fileSuffix), dep.name);\n        });\n        return compileResult.statements;\n    }\n    /**\n     * @param {?} dirUrl\n     * @return {?}\n     */\n    function _ngfactoryModuleUrl(dirUrl) {\n        var /** @type {?} */ urlWithSuffix = _splitTypescriptSuffix(dirUrl);\n        return urlWithSuffix[0] + \".ngfactory\" + urlWithSuffix[1];\n    }\n    /**\n     * @param {?} comp\n     * @return {?}\n     */\n    function _componentFactoryName(comp) {\n        return identifierName(comp) + \"NgFactory\";\n    }\n    /**\n     * @param {?} stylesheetUrl\n     * @param {?} shim\n     * @param {?} suffix\n     * @return {?}\n     */\n    function _stylesModuleUrl(stylesheetUrl, shim, suffix) {\n        return \"\" + stylesheetUrl + (shim ? '.shim' : '') + \".ngstyle\" + suffix;\n    }\n    /**\n     * @param {?} meta\n     * @return {?}\n     */\n    function _assertComponent(meta) {\n        if (!meta.isComponent) {\n            throw new Error(\"Could not compile '\" + identifierName(meta.type) + \"' because it is not a component.\");\n        }\n    }\n    /**\n     * @param {?} path\n     * @return {?}\n     */\n    function _splitTypescriptSuffix(path) {\n        if (path.endsWith('.d.ts')) {\n            return [path.slice(0, -5), '.ts'];\n        }\n        var /** @type {?} */ lastDot = path.lastIndexOf('.');\n        if (lastDot !== -1) {\n            return [path.substring(0, lastDot), path.substring(lastDot)];\n        }\n        return [path, ''];\n    }\n    /**\n     * @param {?} programStaticSymbols\n     * @param {?} host\n     * @param {?} metadataResolver\n     * @return {?}\n     */\n    function analyzeNgModules(programStaticSymbols, host, metadataResolver) {\n        var _a = _createNgModules(programStaticSymbols, host, metadataResolver), ngModules = _a.ngModules, symbolsMissingModule = _a.symbolsMissingModule;\n        return _analyzeNgModules(programStaticSymbols, ngModules, symbolsMissingModule, metadataResolver);\n    }\n    /**\n     * @param {?} programStaticSymbols\n     * @param {?} host\n     * @param {?} metadataResolver\n     * @return {?}\n     */\n    function analyzeAndValidateNgModules(programStaticSymbols, host, metadataResolver) {\n        var /** @type {?} */ result = analyzeNgModules(programStaticSymbols, host, metadataResolver);\n        if (result.symbolsMissingModule && result.symbolsMissingModule.length) {\n            var /** @type {?} */ messages = result.symbolsMissingModule.map(function (s) { return (\"Cannot determine the module for class \" + s.name + \" in \" + s.filePath + \"!\"); });\n            throw new Error(messages.join('\\n'));\n        }\n        return result;\n    }\n    /**\n     * @param {?} programSymbols\n     * @param {?} ngModuleMetas\n     * @param {?} symbolsMissingModule\n     * @param {?} metadataResolver\n     * @return {?}\n     */\n    function _analyzeNgModules(programSymbols, ngModuleMetas, symbolsMissingModule, metadataResolver) {\n        var /** @type {?} */ moduleMetasByRef = new Map();\n        ngModuleMetas.forEach(function (ngModule) { return moduleMetasByRef.set(ngModule.type.reference, ngModule); });\n        var /** @type {?} */ ngModuleByPipeOrDirective = new Map();\n        var /** @type {?} */ ngModulesByFile = new Map();\n        var /** @type {?} */ ngDirectivesByFile = new Map();\n        var /** @type {?} */ ngPipesByFile = new Map();\n        var /** @type {?} */ ngInjectablesByFile = new Map();\n        var /** @type {?} */ filePaths = new Set();\n        // Make sure we produce an analyzed file for each input file\n        programSymbols.forEach(function (symbol) {\n            var /** @type {?} */ filePath = symbol.filePath;\n            filePaths.add(filePath);\n            if (metadataResolver.isInjectable(symbol)) {\n                ngInjectablesByFile.set(filePath, (ngInjectablesByFile.get(filePath) || []).concat(symbol));\n            }\n        });\n        // Looping over all modules to construct:\n        // - a map from file to modules `ngModulesByFile`,\n        // - a map from file to directives `ngDirectivesByFile`,\n        // - a map from file to pipes `ngPipesByFile`,\n        // - a map from directive/pipe to module `ngModuleByPipeOrDirective`.\n        ngModuleMetas.forEach(function (ngModuleMeta) {\n            var /** @type {?} */ srcFileUrl = ngModuleMeta.type.reference.filePath;\n            filePaths.add(srcFileUrl);\n            ngModulesByFile.set(srcFileUrl, (ngModulesByFile.get(srcFileUrl) || []).concat(ngModuleMeta.type.reference));\n            ngModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n                var /** @type {?} */ fileUrl = dirIdentifier.reference.filePath;\n                filePaths.add(fileUrl);\n                ngDirectivesByFile.set(fileUrl, (ngDirectivesByFile.get(fileUrl) || []).concat(dirIdentifier.reference));\n                ngModuleByPipeOrDirective.set(dirIdentifier.reference, ngModuleMeta);\n            });\n            ngModuleMeta.declaredPipes.forEach(function (pipeIdentifier) {\n                var /** @type {?} */ fileUrl = pipeIdentifier.reference.filePath;\n                filePaths.add(fileUrl);\n                ngPipesByFile.set(fileUrl, (ngPipesByFile.get(fileUrl) || []).concat(pipeIdentifier.reference));\n                ngModuleByPipeOrDirective.set(pipeIdentifier.reference, ngModuleMeta);\n            });\n        });\n        var /** @type {?} */ files = [];\n        filePaths.forEach(function (srcUrl) {\n            var /** @type {?} */ directives = ngDirectivesByFile.get(srcUrl) || [];\n            var /** @type {?} */ pipes = ngPipesByFile.get(srcUrl) || [];\n            var /** @type {?} */ ngModules = ngModulesByFile.get(srcUrl) || [];\n            var /** @type {?} */ injectables = ngInjectablesByFile.get(srcUrl) || [];\n            files.push({ srcUrl: srcUrl, directives: directives, pipes: pipes, ngModules: ngModules, injectables: injectables });\n        });\n        return {\n            // map directive/pipe to module\n            ngModuleByPipeOrDirective: ngModuleByPipeOrDirective,\n            // list modules and directives for every source file\n            files: files,\n            ngModules: ngModuleMetas, symbolsMissingModule: symbolsMissingModule\n        };\n    }\n    /**\n     * @param {?} staticSymbolResolver\n     * @param {?} files\n     * @param {?} host\n     * @return {?}\n     */\n    function extractProgramSymbols(staticSymbolResolver, files, host) {\n        var /** @type {?} */ staticSymbols = [];\n        files.filter(function (fileName) { return host.isSourceFile(fileName); }).forEach(function (sourceFile) {\n            staticSymbolResolver.getSymbolsOf(sourceFile).forEach(function (symbol) {\n                var /** @type {?} */ resolvedSymbol = staticSymbolResolver.resolveSymbol(symbol);\n                var /** @type {?} */ symbolMeta = resolvedSymbol.metadata;\n                if (symbolMeta) {\n                    if (symbolMeta.__symbolic != 'error') {\n                        // Ignore symbols that are only included to record error information.\n                        staticSymbols.push(resolvedSymbol.symbol);\n                    }\n                }\n            });\n        });\n        return staticSymbols;\n    }\n    /**\n     * @param {?} programStaticSymbols\n     * @param {?} host\n     * @param {?} metadataResolver\n     * @return {?}\n     */\n    function _createNgModules(programStaticSymbols, host, metadataResolver) {\n        var /** @type {?} */ ngModules = new Map();\n        var /** @type {?} */ programPipesAndDirectives = [];\n        var /** @type {?} */ ngModulePipesAndDirective = new Set();\n        var /** @type {?} */ addNgModule = function (staticSymbol) {\n            if (ngModules.has(staticSymbol) || !host.isSourceFile(staticSymbol.filePath)) {\n                return false;\n            }\n            var /** @type {?} */ ngModule = metadataResolver.getNgModuleMetadata(staticSymbol, false);\n            if (ngModule) {\n                ngModules.set(ngModule.type.reference, ngModule);\n                ngModule.declaredDirectives.forEach(function (dir) { return ngModulePipesAndDirective.add(dir.reference); });\n                ngModule.declaredPipes.forEach(function (pipe) { return ngModulePipesAndDirective.add(pipe.reference); });\n                // For every input module add the list of transitively included modules\n                ngModule.transitiveModule.modules.forEach(function (modMeta) { return addNgModule(modMeta.reference); });\n            }\n            return !!ngModule;\n        };\n        programStaticSymbols.forEach(function (staticSymbol) {\n            if (!addNgModule(staticSymbol) &&\n                (metadataResolver.isDirective(staticSymbol) || metadataResolver.isPipe(staticSymbol))) {\n                programPipesAndDirectives.push(staticSymbol);\n            }\n        });\n        // Throw an error if any of the program pipe or directives is not declared by a module\n        var /** @type {?} */ symbolsMissingModule = programPipesAndDirectives.filter(function (s) { return !ngModulePipesAndDirective.has(s); });\n        return { ngModules: Array.from(ngModules.values()), symbolsMissingModule: symbolsMissingModule };\n    }\n\n    var StaticAndDynamicReflectionCapabilities = (function () {\n        /**\n         * @param {?} staticDelegate\n         */\n        function StaticAndDynamicReflectionCapabilities(staticDelegate) {\n            this.staticDelegate = staticDelegate;\n            this.dynamicDelegate = new ReflectionCapabilities();\n        }\n        /**\n         * @param {?} staticDelegate\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.install = function (staticDelegate) {\n            reflector.updateCapabilities(new StaticAndDynamicReflectionCapabilities(staticDelegate));\n        };\n        /**\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.factory = function (type) { return this.dynamicDelegate.factory(type); };\n        /**\n         * @param {?} type\n         * @param {?} lcProperty\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.hasLifecycleHook = function (type, lcProperty) {\n            return isStaticType(type) ? this.staticDelegate.hasLifecycleHook(type, lcProperty) :\n                this.dynamicDelegate.hasLifecycleHook(type, lcProperty);\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.parameters = function (type) {\n            return isStaticType(type) ? this.staticDelegate.parameters(type) :\n                this.dynamicDelegate.parameters(type);\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.annotations = function (type) {\n            return isStaticType(type) ? this.staticDelegate.annotations(type) :\n                this.dynamicDelegate.annotations(type);\n        };\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {\n            return isStaticType(typeOrFunc) ? this.staticDelegate.propMetadata(typeOrFunc) :\n                this.dynamicDelegate.propMetadata(typeOrFunc);\n        };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.getter = function (name) { return this.dynamicDelegate.getter(name); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.setter = function (name) { return this.dynamicDelegate.setter(name); };\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.method = function (name) { return this.dynamicDelegate.method(name); };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.importUri = function (type) { return this.staticDelegate.importUri(type); };\n        /**\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @param {?} runtime\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.resolveIdentifier = function (name, moduleUrl, runtime) {\n            return this.staticDelegate.resolveIdentifier(name, moduleUrl);\n        };\n        /**\n         * @param {?} enumIdentifier\n         * @param {?} name\n         * @return {?}\n         */\n        StaticAndDynamicReflectionCapabilities.prototype.resolveEnum = function (enumIdentifier, name) {\n            if (isStaticType(enumIdentifier)) {\n                return this.staticDelegate.resolveEnum(enumIdentifier, name);\n            }\n            else {\n                return null;\n            }\n        };\n        return StaticAndDynamicReflectionCapabilities;\n    }());\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    function isStaticType(type) {\n        return typeof type === 'object' && type.name && type.filePath;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$27 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var /** @type {?} */ ANGULAR_IMPORT_LOCATIONS = {\n        coreDecorators: '@angular/core/src/metadata',\n        diDecorators: '@angular/core/src/di/metadata',\n        diMetadata: '@angular/core/src/di/metadata',\n        diOpaqueToken: '@angular/core/src/di/opaque_token',\n        animationMetadata: '@angular/core/src/animation/metadata',\n        provider: '@angular/core/src/di/provider'\n    };\n    var /** @type {?} */ HIDDEN_KEY = /^\\$.*\\$$/;\n    /**\n     * A static reflector implements enough of the Reflector API that is necessary to compile\n     * templates statically.\n     */\n    var StaticReflector = (function () {\n        /**\n         * @param {?} symbolResolver\n         * @param {?=} knownMetadataClasses\n         * @param {?=} knownMetadataFunctions\n         * @param {?=} errorRecorder\n         */\n        function StaticReflector(symbolResolver, knownMetadataClasses, knownMetadataFunctions, errorRecorder) {\n            var _this = this;\n            if (knownMetadataClasses === void 0) { knownMetadataClasses = []; }\n            if (knownMetadataFunctions === void 0) { knownMetadataFunctions = []; }\n            this.symbolResolver = symbolResolver;\n            this.errorRecorder = errorRecorder;\n            this.annotationCache = new Map();\n            this.propertyCache = new Map();\n            this.parameterCache = new Map();\n            this.methodCache = new Map();\n            this.conversionMap = new Map();\n            this.initializeConversionMap();\n            knownMetadataClasses.forEach(function (kc) { return _this._registerDecoratorOrConstructor(_this.getStaticSymbol(kc.filePath, kc.name), kc.ctor); });\n            knownMetadataFunctions.forEach(function (kf) { return _this._registerFunction(_this.getStaticSymbol(kf.filePath, kf.name), kf.fn); });\n        }\n        /**\n         * @param {?} typeOrFunc\n         * @return {?}\n         */\n        StaticReflector.prototype.importUri = function (typeOrFunc) {\n            var /** @type {?} */ staticSymbol = this.findSymbolDeclaration(typeOrFunc);\n            return staticSymbol ? staticSymbol.filePath : null;\n        };\n        /**\n         * @param {?} name\n         * @param {?} moduleUrl\n         * @return {?}\n         */\n        StaticReflector.prototype.resolveIdentifier = function (name, moduleUrl) {\n            return this.findDeclaration(moduleUrl, name);\n        };\n        /**\n         * @param {?} moduleUrl\n         * @param {?} name\n         * @param {?=} containingFile\n         * @return {?}\n         */\n        StaticReflector.prototype.findDeclaration = function (moduleUrl, name, containingFile) {\n            return this.findSymbolDeclaration(this.symbolResolver.getSymbolByModule(moduleUrl, name, containingFile));\n        };\n        /**\n         * @param {?} symbol\n         * @return {?}\n         */\n        StaticReflector.prototype.findSymbolDeclaration = function (symbol) {\n            var /** @type {?} */ resolvedSymbol = this.symbolResolver.resolveSymbol(symbol);\n            if (resolvedSymbol && resolvedSymbol.metadata instanceof StaticSymbol) {\n                return this.findSymbolDeclaration(resolvedSymbol.metadata);\n            }\n            else {\n                return symbol;\n            }\n        };\n        /**\n         * @param {?} enumIdentifier\n         * @param {?} name\n         * @return {?}\n         */\n        StaticReflector.prototype.resolveEnum = function (enumIdentifier, name) {\n            var /** @type {?} */ staticSymbol = enumIdentifier;\n            return this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name, [name]);\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticReflector.prototype.annotations = function (type) {\n            var /** @type {?} */ annotations = this.annotationCache.get(type);\n            if (!annotations) {\n                annotations = [];\n                var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n                if (classMetadata['extends']) {\n                    var /** @type {?} */ parentAnnotations = this.annotations(this.simplify(type, classMetadata['extends']));\n                    annotations.push.apply(annotations, parentAnnotations);\n                }\n                if (classMetadata['decorators']) {\n                    var /** @type {?} */ ownAnnotations = this.simplify(type, classMetadata['decorators']);\n                    annotations.push.apply(annotations, ownAnnotations);\n                }\n                this.annotationCache.set(type, annotations.filter(function (ann) { return !!ann; }));\n            }\n            return annotations;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticReflector.prototype.propMetadata = function (type) {\n            var _this = this;\n            var /** @type {?} */ propMetadata = this.propertyCache.get(type);\n            if (!propMetadata) {\n                var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n                propMetadata = {};\n                if (classMetadata['extends']) {\n                    var /** @type {?} */ parentPropMetadata_1 = this.propMetadata(this.simplify(type, classMetadata['extends']));\n                    Object.keys(parentPropMetadata_1).forEach(function (parentProp) {\n                        propMetadata[parentProp] = parentPropMetadata_1[parentProp];\n                    });\n                }\n                var /** @type {?} */ members_1 = classMetadata['members'] || {};\n                Object.keys(members_1).forEach(function (propName) {\n                    var /** @type {?} */ propData = members_1[propName];\n                    var /** @type {?} */ prop = ((propData))\n                        .find(function (a) { return a['__symbolic'] == 'property' || a['__symbolic'] == 'method'; });\n                    var /** @type {?} */ decorators = [];\n                    if (propMetadata[propName]) {\n                        decorators.push.apply(decorators, propMetadata[propName]);\n                    }\n                    propMetadata[propName] = decorators;\n                    if (prop && prop['decorators']) {\n                        decorators.push.apply(decorators, _this.simplify(type, prop['decorators']));\n                    }\n                });\n                this.propertyCache.set(type, propMetadata);\n            }\n            return propMetadata;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticReflector.prototype.parameters = function (type) {\n            if (!(type instanceof StaticSymbol)) {\n                this.reportError(new Error(\"parameters received \" + JSON.stringify(type) + \" which is not a StaticSymbol\"), type);\n                return [];\n            }\n            try {\n                var /** @type {?} */ parameters_1 = this.parameterCache.get(type);\n                if (!parameters_1) {\n                    var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n                    var /** @type {?} */ members = classMetadata ? classMetadata['members'] : null;\n                    var /** @type {?} */ ctorData = members ? members['__ctor__'] : null;\n                    if (ctorData) {\n                        var /** @type {?} */ ctor = ((ctorData)).find(function (a) { return a['__symbolic'] == 'constructor'; });\n                        var /** @type {?} */ parameterTypes = (this.simplify(type, ctor['parameters'] || []));\n                        var /** @type {?} */ parameterDecorators_1 = (this.simplify(type, ctor['parameterDecorators'] || []));\n                        parameters_1 = [];\n                        parameterTypes.forEach(function (paramType, index) {\n                            var /** @type {?} */ nestedResult = [];\n                            if (paramType) {\n                                nestedResult.push(paramType);\n                            }\n                            var /** @type {?} */ decorators = parameterDecorators_1 ? parameterDecorators_1[index] : null;\n                            if (decorators) {\n                                nestedResult.push.apply(nestedResult, decorators);\n                            }\n                            parameters_1.push(nestedResult);\n                        });\n                    }\n                    else if (classMetadata['extends']) {\n                        parameters_1 = this.parameters(this.simplify(type, classMetadata['extends']));\n                    }\n                    if (!parameters_1) {\n                        parameters_1 = [];\n                    }\n                    this.parameterCache.set(type, parameters_1);\n                }\n                return parameters_1;\n            }\n            catch (e) {\n                console.error(\"Failed on type \" + JSON.stringify(type) + \" with error \" + e);\n                throw e;\n            }\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticReflector.prototype._methodNames = function (type) {\n            var /** @type {?} */ methodNames = this.methodCache.get(type);\n            if (!methodNames) {\n                var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n                methodNames = {};\n                if (classMetadata['extends']) {\n                    var /** @type {?} */ parentMethodNames_1 = this._methodNames(this.simplify(type, classMetadata['extends']));\n                    Object.keys(parentMethodNames_1).forEach(function (parentProp) {\n                        methodNames[parentProp] = parentMethodNames_1[parentProp];\n                    });\n                }\n                var /** @type {?} */ members_2 = classMetadata['members'] || {};\n                Object.keys(members_2).forEach(function (propName) {\n                    var /** @type {?} */ propData = members_2[propName];\n                    var /** @type {?} */ isMethod = ((propData)).some(function (a) { return a['__symbolic'] == 'method'; });\n                    methodNames[propName] = methodNames[propName] || isMethod;\n                });\n                this.methodCache.set(type, methodNames);\n            }\n            return methodNames;\n        };\n        /**\n         * @param {?} type\n         * @param {?} lcProperty\n         * @return {?}\n         */\n        StaticReflector.prototype.hasLifecycleHook = function (type, lcProperty) {\n            if (!(type instanceof StaticSymbol)) {\n                this.reportError(new Error(\"hasLifecycleHook received \" + JSON.stringify(type) + \" which is not a StaticSymbol\"), type);\n            }\n            try {\n                return !!this._methodNames(type)[lcProperty];\n            }\n            catch (e) {\n                console.error(\"Failed on type \" + JSON.stringify(type) + \" with error \" + e);\n                throw e;\n            }\n        };\n        /**\n         * @param {?} type\n         * @param {?} ctor\n         * @return {?}\n         */\n        StaticReflector.prototype._registerDecoratorOrConstructor = function (type, ctor) {\n            this.conversionMap.set(type, function (context, args) { return new (ctor.bind.apply(ctor, [void 0].concat(args)))(); });\n        };\n        /**\n         * @param {?} type\n         * @param {?} fn\n         * @return {?}\n         */\n        StaticReflector.prototype._registerFunction = function (type, fn) {\n            this.conversionMap.set(type, function (context, args) { return fn.apply(undefined, args); });\n        };\n        /**\n         * @return {?}\n         */\n        StaticReflector.prototype.initializeConversionMap = function () {\n            var coreDecorators = ANGULAR_IMPORT_LOCATIONS.coreDecorators, diDecorators = ANGULAR_IMPORT_LOCATIONS.diDecorators, diMetadata = ANGULAR_IMPORT_LOCATIONS.diMetadata, diOpaqueToken = ANGULAR_IMPORT_LOCATIONS.diOpaqueToken, animationMetadata = ANGULAR_IMPORT_LOCATIONS.animationMetadata, provider = ANGULAR_IMPORT_LOCATIONS.provider;\n            this.opaqueToken = this.findDeclaration(diOpaqueToken, 'OpaqueToken');\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Host'), _angular_core.Host);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Injectable'), _angular_core.Injectable);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Self'), _angular_core.Self);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'SkipSelf'), _angular_core.SkipSelf);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Inject'), _angular_core.Inject);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Optional'), _angular_core.Optional);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Attribute'), _angular_core.Attribute);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ContentChild'), _angular_core.ContentChild);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ContentChildren'), _angular_core.ContentChildren);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ViewChild'), _angular_core.ViewChild);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ViewChildren'), _angular_core.ViewChildren);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Input'), _angular_core.Input);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Output'), _angular_core.Output);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Pipe'), _angular_core.Pipe);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'HostBinding'), _angular_core.HostBinding);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'HostListener'), _angular_core.HostListener);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Directive'), _angular_core.Directive);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Component'), _angular_core.Component);\n            this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'NgModule'), _angular_core.NgModule);\n            // Note: Some metadata classes can be used directly with Provider.deps.\n            this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Host'), _angular_core.Host);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Self'), _angular_core.Self);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'SkipSelf'), _angular_core.SkipSelf);\n            this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Optional'), _angular_core.Optional);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'trigger'), _angular_core.trigger);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'state'), _angular_core.state);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'transition'), _angular_core.transition);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'style'), _angular_core.style);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'animate'), _angular_core.animate);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'keyframes'), _angular_core.keyframes);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'sequence'), _angular_core.sequence);\n            this._registerFunction(this.findDeclaration(animationMetadata, 'group'), _angular_core.group);\n        };\n        /**\n         * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.\n         * All types passed to the StaticResolver should be pseudo-types returned by this method.\n         *\n         * @param {?} declarationFile the absolute path of the file where the symbol is declared\n         * @param {?} name the name of the type.\n         * @param {?=} members\n         * @return {?}\n         */\n        StaticReflector.prototype.getStaticSymbol = function (declarationFile, name, members) {\n            return this.symbolResolver.getStaticSymbol(declarationFile, name, members);\n        };\n        /**\n         * @param {?} error\n         * @param {?} context\n         * @param {?=} path\n         * @return {?}\n         */\n        StaticReflector.prototype.reportError = function (error, context, path) {\n            if (this.errorRecorder) {\n                this.errorRecorder(error, (context && context.filePath) || path);\n            }\n            else {\n                throw error;\n            }\n        };\n        /**\n         * \\@internal\n         * @param {?} context\n         * @param {?} value\n         * @return {?}\n         */\n        StaticReflector.prototype.simplify = function (context, value) {\n            var _this = this;\n            var /** @type {?} */ self = this;\n            var /** @type {?} */ scope = BindingScope.empty;\n            var /** @type {?} */ calling = new Map();\n            /**\n             * @param {?} context\n             * @param {?} value\n             * @param {?} depth\n             * @return {?}\n             */\n            function simplifyInContext(context, value, depth) {\n                /**\n                 * @param {?} staticSymbol\n                 * @return {?}\n                 */\n                function resolveReferenceValue(staticSymbol) {\n                    var /** @type {?} */ resolvedSymbol = self.symbolResolver.resolveSymbol(staticSymbol);\n                    return resolvedSymbol ? resolvedSymbol.metadata : null;\n                }\n                /**\n                 * @param {?} functionSymbol\n                 * @param {?} targetFunction\n                 * @param {?} args\n                 * @return {?}\n                 */\n                function simplifyCall(functionSymbol, targetFunction, args) {\n                    if (targetFunction && targetFunction['__symbolic'] == 'function') {\n                        if (calling.get(functionSymbol)) {\n                            throw new Error('Recursion not supported');\n                        }\n                        calling.set(functionSymbol, true);\n                        try {\n                            var /** @type {?} */ value_1 = targetFunction['value'];\n                            if (value_1 && (depth != 0 || value_1.__symbolic != 'error')) {\n                                var /** @type {?} */ parameters = targetFunction['parameters'];\n                                var /** @type {?} */ defaults = targetFunction.defaults;\n                                args = args.map(function (arg) { return simplifyInContext(context, arg, depth + 1); });\n                                if (defaults && defaults.length > args.length) {\n                                    args.push.apply(args, defaults.slice(args.length).map(function (value) { return simplify(value); }));\n                                }\n                                var /** @type {?} */ functionScope = BindingScope.build();\n                                for (var /** @type {?} */ i = 0; i < parameters.length; i++) {\n                                    functionScope.define(parameters[i], args[i]);\n                                }\n                                var /** @type {?} */ oldScope = scope;\n                                var /** @type {?} */ result_1;\n                                try {\n                                    scope = functionScope.done();\n                                    result_1 = simplifyInContext(functionSymbol, value_1, depth + 1);\n                                }\n                                finally {\n                                    scope = oldScope;\n                                }\n                                return result_1;\n                            }\n                        }\n                        finally {\n                            calling.delete(functionSymbol);\n                        }\n                    }\n                    if (depth === 0) {\n                        // If depth is 0 we are evaluating the top level expression that is describing element\n                        // decorator. In this case, it is a decorator we don't understand, such as a custom\n                        // non-angular decorator, and we should just ignore it.\n                        return { __symbolic: 'ignore' };\n                    }\n                    return simplify({ __symbolic: 'error', message: 'Function call not supported', context: functionSymbol });\n                }\n                /**\n                 * @param {?} expression\n                 * @return {?}\n                 */\n                function simplify(expression) {\n                    if (isPrimitive$1(expression)) {\n                        return expression;\n                    }\n                    if (expression instanceof Array) {\n                        var /** @type {?} */ result_2 = [];\n                        for (var _i = 0, _a = ((expression)); _i < _a.length; _i++) {\n                            var item = _a[_i];\n                            // Check for a spread expression\n                            if (item && item.__symbolic === 'spread') {\n                                var /** @type {?} */ spreadArray = simplify(item.expression);\n                                if (Array.isArray(spreadArray)) {\n                                    for (var _b = 0, spreadArray_1 = spreadArray; _b < spreadArray_1.length; _b++) {\n                                        var spreadItem = spreadArray_1[_b];\n                                        result_2.push(spreadItem);\n                                    }\n                                    continue;\n                                }\n                            }\n                            var /** @type {?} */ value_2 = simplify(item);\n                            if (shouldIgnore(value_2)) {\n                                continue;\n                            }\n                            result_2.push(value_2);\n                        }\n                        return result_2;\n                    }\n                    if (expression instanceof StaticSymbol) {\n                        // Stop simplification at builtin symbols\n                        if (expression === self.opaqueToken || self.conversionMap.has(expression)) {\n                            return expression;\n                        }\n                        else {\n                            var /** @type {?} */ staticSymbol = expression;\n                            var /** @type {?} */ declarationValue = resolveReferenceValue(staticSymbol);\n                            if (declarationValue) {\n                                return simplifyInContext(staticSymbol, declarationValue, depth + 1);\n                            }\n                            else {\n                                return staticSymbol;\n                            }\n                        }\n                    }\n                    if (expression) {\n                        if (expression['__symbolic']) {\n                            var /** @type {?} */ staticSymbol = void 0;\n                            switch (expression['__symbolic']) {\n                                case 'binop':\n                                    var /** @type {?} */ left = simplify(expression['left']);\n                                    if (shouldIgnore(left))\n                                        return left;\n                                    var /** @type {?} */ right = simplify(expression['right']);\n                                    if (shouldIgnore(right))\n                                        return right;\n                                    switch (expression['operator']) {\n                                        case '&&':\n                                            return left && right;\n                                        case '||':\n                                            return left || right;\n                                        case '|':\n                                            return left | right;\n                                        case '^':\n                                            return left ^ right;\n                                        case '&':\n                                            return left & right;\n                                        case '==':\n                                            return left == right;\n                                        case '!=':\n                                            return left != right;\n                                        case '===':\n                                            return left === right;\n                                        case '!==':\n                                            return left !== right;\n                                        case '<':\n                                            return left < right;\n                                        case '>':\n                                            return left > right;\n                                        case '<=':\n                                            return left <= right;\n                                        case '>=':\n                                            return left >= right;\n                                        case '<<':\n                                            return left << right;\n                                        case '>>':\n                                            return left >> right;\n                                        case '+':\n                                            return left + right;\n                                        case '-':\n                                            return left - right;\n                                        case '*':\n                                            return left * right;\n                                        case '/':\n                                            return left / right;\n                                        case '%':\n                                            return left % right;\n                                    }\n                                    return null;\n                                case 'if':\n                                    var /** @type {?} */ condition = simplify(expression['condition']);\n                                    return condition ? simplify(expression['thenExpression']) :\n                                        simplify(expression['elseExpression']);\n                                case 'pre':\n                                    var /** @type {?} */ operand = simplify(expression['operand']);\n                                    if (shouldIgnore(operand))\n                                        return operand;\n                                    switch (expression['operator']) {\n                                        case '+':\n                                            return operand;\n                                        case '-':\n                                            return -operand;\n                                        case '!':\n                                            return !operand;\n                                        case '~':\n                                            return ~operand;\n                                    }\n                                    return null;\n                                case 'index':\n                                    var /** @type {?} */ indexTarget = simplify(expression['expression']);\n                                    var /** @type {?} */ index = simplify(expression['index']);\n                                    if (indexTarget && isPrimitive$1(index))\n                                        return indexTarget[index];\n                                    return null;\n                                case 'select':\n                                    var /** @type {?} */ member = expression['member'];\n                                    var /** @type {?} */ selectContext = context;\n                                    var /** @type {?} */ selectTarget = simplify(expression['expression']);\n                                    if (selectTarget instanceof StaticSymbol) {\n                                        var /** @type {?} */ members = selectTarget.members.concat(member);\n                                        selectContext =\n                                            self.getStaticSymbol(selectTarget.filePath, selectTarget.name, members);\n                                        var /** @type {?} */ declarationValue = resolveReferenceValue(selectContext);\n                                        if (declarationValue) {\n                                            return simplifyInContext(selectContext, declarationValue, depth + 1);\n                                        }\n                                        else {\n                                            return selectContext;\n                                        }\n                                    }\n                                    if (selectTarget && isPrimitive$1(member))\n                                        return simplifyInContext(selectContext, selectTarget[member], depth + 1);\n                                    return null;\n                                case 'reference':\n                                    // Note: This only has to deal with variable references,\n                                    // as symbol references have been converted into StaticSymbols already\n                                    // in the StaticSymbolResolver!\n                                    var /** @type {?} */ name_1 = expression['name'];\n                                    var /** @type {?} */ localValue = scope.resolve(name_1);\n                                    if (localValue != BindingScope.missing) {\n                                        return localValue;\n                                    }\n                                    break;\n                                case 'class':\n                                    return context;\n                                case 'function':\n                                    return context;\n                                case 'new':\n                                case 'call':\n                                    // Determine if the function is a built-in conversion\n                                    staticSymbol = simplifyInContext(context, expression['expression'], depth + 1);\n                                    if (staticSymbol instanceof StaticSymbol) {\n                                        if (staticSymbol === self.opaqueToken) {\n                                            // if somebody calls new OpaqueToken, don't create an OpaqueToken,\n                                            // but rather return the symbol to which the OpaqueToken is assigned to.\n                                            return context;\n                                        }\n                                        var /** @type {?} */ argExpressions = expression['arguments'] || [];\n                                        var /** @type {?} */ converter = self.conversionMap.get(staticSymbol);\n                                        if (converter) {\n                                            var /** @type {?} */ args = argExpressions.map(function (arg) { return simplifyInContext(context, arg, depth + 1); });\n                                            return converter(context, args);\n                                        }\n                                        else {\n                                            // Determine if the function is one we can simplify.\n                                            var /** @type {?} */ targetFunction = resolveReferenceValue(staticSymbol);\n                                            return simplifyCall(staticSymbol, targetFunction, argExpressions);\n                                        }\n                                    }\n                                    break;\n                                case 'error':\n                                    var /** @type {?} */ message = produceErrorMessage(expression);\n                                    if (expression['line']) {\n                                        message =\n                                            message + \" (position \" + (expression['line'] + 1) + \":\" + (expression['character'] + 1) + \" in the original .ts file)\";\n                                        throw positionalError(message, context.filePath, expression['line'], expression['character']);\n                                    }\n                                    throw new Error(message);\n                            }\n                            return null;\n                        }\n                        return mapStringMap(expression, function (value, name) { return simplify(value); });\n                    }\n                    return null;\n                }\n                try {\n                    return simplify(value);\n                }\n                catch (e) {\n                    var /** @type {?} */ members = context.members.length ? \".\" + context.members.join('.') : '';\n                    var /** @type {?} */ message = e.message + \", resolving symbol \" + context.name + members + \" in \" + context.filePath;\n                    if (e.fileName) {\n                        throw positionalError(message, e.fileName, e.line, e.column);\n                    }\n                    throw new SyntaxError(message);\n                }\n            }\n            var /** @type {?} */ recordedSimplifyInContext = function (context, value, depth) {\n                try {\n                    return simplifyInContext(context, value, depth);\n                }\n                catch (e) {\n                    _this.reportError(e, context);\n                }\n            };\n            var /** @type {?} */ result = this.errorRecorder ? recordedSimplifyInContext(context, value, 0) :\n                simplifyInContext(context, value, 0);\n            if (shouldIgnore(result)) {\n                return undefined;\n            }\n            return result;\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        StaticReflector.prototype.getTypeMetadata = function (type) {\n            var /** @type {?} */ resolvedSymbol = this.symbolResolver.resolveSymbol(type);\n            return resolvedSymbol && resolvedSymbol.metadata ? resolvedSymbol.metadata :\n                { __symbolic: 'class' };\n        };\n        return StaticReflector;\n    }());\n    /**\n     * @param {?} error\n     * @return {?}\n     */\n    function expandedMessage(error) {\n        switch (error.message) {\n            case 'Reference to non-exported class':\n                if (error.context && error.context.className) {\n                    return \"Reference to a non-exported class \" + error.context.className + \". Consider exporting the class\";\n                }\n                break;\n            case 'Variable not initialized':\n                return 'Only initialized variables and constants can be referenced because the value of this variable is needed by the template compiler';\n            case 'Destructuring not supported':\n                return 'Referencing an exported destructured variable or constant is not supported by the template compiler. Consider simplifying this to avoid destructuring';\n            case 'Could not resolve type':\n                if (error.context && error.context.typeName) {\n                    return \"Could not resolve type \" + error.context.typeName;\n                }\n                break;\n            case 'Function call not supported':\n                var /** @type {?} */ prefix = error.context && error.context.name ? \"Calling function '\" + error.context.name + \"', f\" : 'F';\n                return prefix +\n                    'unction calls are not supported. Consider replacing the function or lambda with a reference to an exported function';\n            case 'Reference to a local symbol':\n                if (error.context && error.context.name) {\n                    return \"Reference to a local (non-exported) symbol '\" + error.context.name + \"'. Consider exporting the symbol\";\n                }\n                break;\n        }\n        return error.message;\n    }\n    /**\n     * @param {?} error\n     * @return {?}\n     */\n    function produceErrorMessage(error) {\n        return \"Error encountered resolving symbol values statically. \" + expandedMessage(error);\n    }\n    /**\n     * @param {?} input\n     * @param {?} transform\n     * @return {?}\n     */\n    function mapStringMap(input, transform) {\n        if (!input)\n            return {};\n        var /** @type {?} */ result = {};\n        Object.keys(input).forEach(function (key) {\n            var /** @type {?} */ value = transform(input[key], key);\n            if (!shouldIgnore(value)) {\n                if (HIDDEN_KEY.test(key)) {\n                    Object.defineProperty(result, key, { enumerable: false, configurable: true, value: value });\n                }\n                else {\n                    result[key] = value;\n                }\n            }\n        });\n        return result;\n    }\n    /**\n     * @param {?} o\n     * @return {?}\n     */\n    function isPrimitive$1(o) {\n        return o === null || (typeof o !== 'function' && typeof o !== 'object');\n    }\n    /**\n     * @abstract\n     */\n    var BindingScope = (function () {\n        function BindingScope() {\n        }\n        /**\n         * @abstract\n         * @param {?} name\n         * @return {?}\n         */\n        BindingScope.prototype.resolve = function (name) { };\n        /**\n         * @return {?}\n         */\n        BindingScope.build = function () {\n            var /** @type {?} */ current = new Map();\n            return {\n                define: function (name, value) {\n                    current.set(name, value);\n                    return this;\n                },\n                done: function () {\n                    return current.size > 0 ? new PopulatedScope(current) : BindingScope.empty;\n                }\n            };\n        };\n        BindingScope.missing = {};\n        BindingScope.empty = { resolve: function (name) { return BindingScope.missing; } };\n        return BindingScope;\n    }());\n    var PopulatedScope = (function (_super) {\n        __extends$27(PopulatedScope, _super);\n        /**\n         * @param {?} bindings\n         */\n        function PopulatedScope(bindings) {\n            _super.call(this);\n            this.bindings = bindings;\n        }\n        /**\n         * @param {?} name\n         * @return {?}\n         */\n        PopulatedScope.prototype.resolve = function (name) {\n            return this.bindings.has(name) ? this.bindings.get(name) : BindingScope.missing;\n        };\n        return PopulatedScope;\n    }(BindingScope));\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    function shouldIgnore(value) {\n        return value && value.__symbolic == 'ignore';\n    }\n    /**\n     * @param {?} message\n     * @param {?} fileName\n     * @param {?} line\n     * @param {?} column\n     * @return {?}\n     */\n    function positionalError(message, fileName, line, column) {\n        var /** @type {?} */ result = new Error(message);\n        ((result)).fileName = fileName;\n        ((result)).line = line;\n        ((result)).column = column;\n        return result;\n    }\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$28 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    var ResolvedStaticSymbol = (function () {\n        /**\n         * @param {?} symbol\n         * @param {?} metadata\n         */\n        function ResolvedStaticSymbol(symbol, metadata) {\n            this.symbol = symbol;\n            this.metadata = metadata;\n        }\n        return ResolvedStaticSymbol;\n    }());\n    var /** @type {?} */ SUPPORTED_SCHEMA_VERSION = 3;\n    /**\n     * This class is responsible for loading metadata per symbol,\n     * and normalizing references between symbols.\n     */\n    var StaticSymbolResolver = (function () {\n        /**\n         * @param {?} host\n         * @param {?} staticSymbolCache\n         * @param {?} summaryResolver\n         * @param {?=} errorRecorder\n         */\n        function StaticSymbolResolver(host, staticSymbolCache, summaryResolver, errorRecorder) {\n            this.host = host;\n            this.staticSymbolCache = staticSymbolCache;\n            this.summaryResolver = summaryResolver;\n            this.errorRecorder = errorRecorder;\n            this.metadataCache = new Map();\n            this.resolvedSymbols = new Map();\n            this.resolvedFilePaths = new Set();\n        }\n        /**\n         * @param {?} staticSymbol\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.resolveSymbol = function (staticSymbol) {\n            if (staticSymbol.members.length > 0) {\n                return this._resolveSymbolMembers(staticSymbol);\n            }\n            var /** @type {?} */ result = this._resolveSymbolFromSummary(staticSymbol);\n            if (!result) {\n                // Note: Some users use libraries that were not compiled with ngc, i.e. they don't\n                // have summaries, only .d.ts files. So we always need to check both, the summary\n                // and metadata.\n                this._createSymbolsOf(staticSymbol.filePath);\n                result = this.resolvedSymbols.get(staticSymbol);\n            }\n            return result;\n        };\n        /**\n         * @param {?} staticSymbol\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype._resolveSymbolMembers = function (staticSymbol) {\n            var /** @type {?} */ members = staticSymbol.members;\n            var /** @type {?} */ baseResolvedSymbol = this.resolveSymbol(this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name));\n            if (!baseResolvedSymbol) {\n                return null;\n            }\n            var /** @type {?} */ baseMetadata = baseResolvedSymbol.metadata;\n            if (baseMetadata instanceof StaticSymbol) {\n                return new ResolvedStaticSymbol(staticSymbol, this.getStaticSymbol(baseMetadata.filePath, baseMetadata.name, members));\n            }\n            else if (baseMetadata && baseMetadata.__symbolic === 'class') {\n                if (baseMetadata.statics && members.length === 1) {\n                    return new ResolvedStaticSymbol(staticSymbol, baseMetadata.statics[members[0]]);\n                }\n            }\n            else {\n                var /** @type {?} */ value = baseMetadata;\n                for (var /** @type {?} */ i = 0; i < members.length && value; i++) {\n                    value = value[members[i]];\n                }\n                return new ResolvedStaticSymbol(staticSymbol, value);\n            }\n            return null;\n        };\n        /**\n         * @param {?} staticSymbol\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype._resolveSymbolFromSummary = function (staticSymbol) {\n            var /** @type {?} */ summary = this.summaryResolver.resolveSummary(staticSymbol);\n            return summary ? new ResolvedStaticSymbol(staticSymbol, summary.metadata) : null;\n        };\n        /**\n         * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.\n         * All types passed to the StaticResolver should be pseudo-types returned by this method.\n         *\n         * @param {?} declarationFile the absolute path of the file where the symbol is declared\n         * @param {?} name the name of the type.\n         * @param {?=} members\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.getStaticSymbol = function (declarationFile, name, members) {\n            return this.staticSymbolCache.get(declarationFile, name, members);\n        };\n        /**\n         * @param {?} filePath\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.getSymbolsOf = function (filePath) {\n            // Note: Some users use libraries that were not compiled with ngc, i.e. they don't\n            // have summaries, only .d.ts files. So we always need to check both, the summary\n            // and metadata.\n            var /** @type {?} */ symbols = new Set(this.summaryResolver.getSymbolsOf(filePath));\n            this._createSymbolsOf(filePath);\n            this.resolvedSymbols.forEach(function (resolvedSymbol) {\n                if (resolvedSymbol.symbol.filePath === filePath) {\n                    symbols.add(resolvedSymbol.symbol);\n                }\n            });\n            return Array.from(symbols);\n        };\n        /**\n         * @param {?} filePath\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype._createSymbolsOf = function (filePath) {\n            var _this = this;\n            if (this.resolvedFilePaths.has(filePath)) {\n                return;\n            }\n            this.resolvedFilePaths.add(filePath);\n            var /** @type {?} */ resolvedSymbols = [];\n            var /** @type {?} */ metadata = this.getModuleMetadata(filePath);\n            if (metadata['metadata']) {\n                // handle direct declarations of the symbol\n                Object.keys(metadata['metadata']).forEach(function (symbolName) {\n                    var /** @type {?} */ symbolMeta = metadata['metadata'][symbolName];\n                    resolvedSymbols.push(_this.createResolvedSymbol(_this.getStaticSymbol(filePath, symbolName), symbolMeta));\n                });\n            }\n            // handle the symbols in one of the re-export location\n            if (metadata['exports']) {\n                var _loop_1 = function(moduleExport) {\n                    // handle the symbols in the list of explicitly re-exported symbols.\n                    if (moduleExport.export) {\n                        moduleExport.export.forEach(function (exportSymbol) {\n                            var /** @type {?} */ symbolName;\n                            if (typeof exportSymbol === 'string') {\n                                symbolName = exportSymbol;\n                            }\n                            else {\n                                symbolName = exportSymbol.as;\n                            }\n                            var /** @type {?} */ symName = symbolName;\n                            if (typeof exportSymbol !== 'string') {\n                                symName = exportSymbol.name;\n                            }\n                            var /** @type {?} */ resolvedModule = _this.resolveModule(moduleExport.from, filePath);\n                            if (resolvedModule) {\n                                var /** @type {?} */ targetSymbol = _this.getStaticSymbol(resolvedModule, symName);\n                                var /** @type {?} */ sourceSymbol = _this.getStaticSymbol(filePath, symbolName);\n                                resolvedSymbols.push(new ResolvedStaticSymbol(sourceSymbol, targetSymbol));\n                            }\n                        });\n                    }\n                    else {\n                        // handle the symbols via export * directives.\n                        var /** @type {?} */ resolvedModule = this_1.resolveModule(moduleExport.from, filePath);\n                        if (resolvedModule) {\n                            var /** @type {?} */ nestedExports = this_1.getSymbolsOf(resolvedModule);\n                            nestedExports.forEach(function (targetSymbol) {\n                                var /** @type {?} */ sourceSymbol = _this.getStaticSymbol(filePath, targetSymbol.name);\n                                resolvedSymbols.push(new ResolvedStaticSymbol(sourceSymbol, targetSymbol));\n                            });\n                        }\n                    }\n                };\n                var this_1 = this;\n                for (var _i = 0, _a = metadata['exports']; _i < _a.length; _i++) {\n                    var moduleExport = _a[_i];\n                    _loop_1(moduleExport);\n                }\n            }\n            resolvedSymbols.forEach(function (resolvedSymbol) { return _this.resolvedSymbols.set(resolvedSymbol.symbol, resolvedSymbol); });\n        };\n        /**\n         * @param {?} sourceSymbol\n         * @param {?} metadata\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.createResolvedSymbol = function (sourceSymbol, metadata) {\n            var /** @type {?} */ self = this;\n            var ReferenceTransformer = (function (_super) {\n                __extends$28(ReferenceTransformer, _super);\n                function ReferenceTransformer() {\n                    _super.apply(this, arguments);\n                }\n                /**\n                 * @param {?} map\n                 * @param {?} functionParams\n                 * @return {?}\n                 */\n                ReferenceTransformer.prototype.visitStringMap = function (map, functionParams) {\n                    var /** @type {?} */ symbolic = map['__symbolic'];\n                    if (symbolic === 'function') {\n                        var /** @type {?} */ oldLen = functionParams.length;\n                        functionParams.push.apply(functionParams, (map['parameters'] || []));\n                        var /** @type {?} */ result = _super.prototype.visitStringMap.call(this, map, functionParams);\n                        functionParams.length = oldLen;\n                        return result;\n                    }\n                    else if (symbolic === 'reference') {\n                        var /** @type {?} */ module_1 = map['module'];\n                        var /** @type {?} */ name_1 = map['name'];\n                        if (!name_1) {\n                            return null;\n                        }\n                        var /** @type {?} */ filePath = void 0;\n                        if (module_1) {\n                            filePath = self.resolveModule(module_1, sourceSymbol.filePath);\n                            if (!filePath) {\n                                return {\n                                    __symbolic: 'error',\n                                    message: \"Could not resolve \" + module_1 + \" relative to \" + sourceSymbol.filePath + \".\"\n                                };\n                            }\n                        }\n                        else {\n                            var /** @type {?} */ isFunctionParam = functionParams.indexOf(name_1) >= 0;\n                            if (!isFunctionParam) {\n                                filePath = sourceSymbol.filePath;\n                            }\n                        }\n                        if (filePath) {\n                            return self.getStaticSymbol(filePath, name_1);\n                        }\n                        else {\n                            // reference to a function parameter\n                            return { __symbolic: 'reference', name: name_1 };\n                        }\n                    }\n                    else {\n                        return _super.prototype.visitStringMap.call(this, map, functionParams);\n                    }\n                };\n                return ReferenceTransformer;\n            }(ValueTransformer));\n            var /** @type {?} */ transformedMeta = visitValue(metadata, new ReferenceTransformer(), []);\n            return new ResolvedStaticSymbol(sourceSymbol, transformedMeta);\n        };\n        /**\n         * @param {?} error\n         * @param {?} context\n         * @param {?=} path\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.reportError = function (error, context, path) {\n            if (this.errorRecorder) {\n                this.errorRecorder(error, (context && context.filePath) || path);\n            }\n            else {\n                throw error;\n            }\n        };\n        /**\n         * @param {?} module an absolute path to a module file.\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.getModuleMetadata = function (module) {\n            var /** @type {?} */ moduleMetadata = this.metadataCache.get(module);\n            if (!moduleMetadata) {\n                var /** @type {?} */ moduleMetadatas = this.host.getMetadataFor(module);\n                if (moduleMetadatas) {\n                    var /** @type {?} */ maxVersion_1 = -1;\n                    moduleMetadatas.forEach(function (md) {\n                        if (md['version'] > maxVersion_1) {\n                            maxVersion_1 = md['version'];\n                            moduleMetadata = md;\n                        }\n                    });\n                }\n                if (!moduleMetadata) {\n                    moduleMetadata =\n                        { __symbolic: 'module', version: SUPPORTED_SCHEMA_VERSION, module: module, metadata: {} };\n                }\n                if (moduleMetadata['version'] != SUPPORTED_SCHEMA_VERSION) {\n                    var /** @type {?} */ errorMessage = moduleMetadata['version'] == 2 ?\n                        \"Unsupported metadata version \" + moduleMetadata['version'] + \" for module \" + module + \". This module should be compiled with a newer version of ngc\" :\n                        \"Metadata version mismatch for module \" + module + \", found version \" + moduleMetadata['version'] + \", expected \" + SUPPORTED_SCHEMA_VERSION;\n                    this.reportError(new Error(errorMessage), null);\n                }\n                this.metadataCache.set(module, moduleMetadata);\n            }\n            return moduleMetadata;\n        };\n        /**\n         * @param {?} module\n         * @param {?} symbolName\n         * @param {?=} containingFile\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.getSymbolByModule = function (module, symbolName, containingFile) {\n            var /** @type {?} */ filePath = this.resolveModule(module, containingFile);\n            if (!filePath) {\n                this.reportError(new Error(\"Could not resolve module \" + module + (containingFile ? \" relative to $ {\\n            containingFile\\n          } \" : '')), null);\n                return this.getStaticSymbol(\"ERROR:\" + module, symbolName);\n            }\n            return this.getStaticSymbol(filePath, symbolName);\n        };\n        /**\n         * @param {?} module\n         * @param {?} containingFile\n         * @return {?}\n         */\n        StaticSymbolResolver.prototype.resolveModule = function (module, containingFile) {\n            try {\n                return this.host.moduleNameToFileName(module, containingFile);\n            }\n            catch (e) {\n                console.error(\"Could not resolve module '\" + module + \"' relative to file \" + containingFile);\n                this.reportError(new e, null, containingFile);\n            }\n        };\n        return StaticSymbolResolver;\n    }());\n\n    var AotSummaryResolver = (function () {\n        /**\n         * @param {?} host\n         * @param {?} staticSymbolCache\n         */\n        function AotSummaryResolver(host, staticSymbolCache) {\n            this.host = host;\n            this.staticSymbolCache = staticSymbolCache;\n            this.summaryCache = new Map();\n            this.loadedFilePaths = new Set();\n        }\n        /**\n         * @param {?} symbol\n         * @return {?}\n         */\n        AotSummaryResolver.prototype._assertNoMembers = function (symbol) {\n            if (symbol.members.length) {\n                throw new Error(\"Internal state: StaticSymbols in summaries can't have members! \" + JSON.stringify(symbol));\n            }\n        };\n        /**\n         * @param {?} staticSymbol\n         * @return {?}\n         */\n        AotSummaryResolver.prototype.resolveSummary = function (staticSymbol) {\n            this._assertNoMembers(staticSymbol);\n            var /** @type {?} */ summary = this.summaryCache.get(staticSymbol);\n            if (!summary) {\n                this._loadSummaryFile(staticSymbol.filePath);\n                summary = this.summaryCache.get(staticSymbol);\n            }\n            return summary;\n        };\n        /**\n         * @param {?} filePath\n         * @return {?}\n         */\n        AotSummaryResolver.prototype.getSymbolsOf = function (filePath) {\n            this._loadSummaryFile(filePath);\n            return Array.from(this.summaryCache.keys()).filter(function (symbol) { return symbol.filePath === filePath; });\n        };\n        /**\n         * @param {?} filePath\n         * @return {?}\n         */\n        AotSummaryResolver.prototype._loadSummaryFile = function (filePath) {\n            var _this = this;\n            if (this.loadedFilePaths.has(filePath)) {\n                return;\n            }\n            this.loadedFilePaths.add(filePath);\n            if (!this.host.isSourceFile(filePath)) {\n                var /** @type {?} */ summaryFilePath = summaryFileName(filePath);\n                var /** @type {?} */ json = void 0;\n                try {\n                    json = this.host.loadSummary(summaryFilePath);\n                }\n                catch (e) {\n                    console.error(\"Error loading summary file \" + summaryFilePath);\n                    throw e;\n                }\n                if (json) {\n                    var /** @type {?} */ readSummaries = deserializeSummaries(this.staticSymbolCache, json);\n                    readSummaries.forEach(function (summary) { _this.summaryCache.set(summary.symbol, summary); });\n                }\n            }\n        };\n        return AotSummaryResolver;\n    }());\n\n    /**\n     * Creates a new AotCompiler based on options and a host.\n     * @param {?} compilerHost\n     * @param {?} options\n     * @return {?}\n     */\n    function createAotCompiler(compilerHost, options) {\n        var /** @type {?} */ translations = options.translations || '';\n        var /** @type {?} */ urlResolver = createOfflineCompileUrlResolver();\n        var /** @type {?} */ symbolCache = new StaticSymbolCache();\n        var /** @type {?} */ summaryResolver = new AotSummaryResolver(compilerHost, symbolCache);\n        var /** @type {?} */ symbolResolver = new StaticSymbolResolver(compilerHost, symbolCache, summaryResolver);\n        var /** @type {?} */ staticReflector = new StaticReflector(symbolResolver);\n        StaticAndDynamicReflectionCapabilities.install(staticReflector);\n        var /** @type {?} */ htmlParser = new I18NHtmlParser(new HtmlParser(), translations, options.i18nFormat);\n        var /** @type {?} */ config = new CompilerConfig({\n            genDebugInfo: options.debug === true,\n            defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated,\n            logBindingUpdate: false,\n            useJit: false\n        });\n        var /** @type {?} */ normalizer = new DirectiveNormalizer({ get: function (url) { return compilerHost.loadResource(url); } }, urlResolver, htmlParser, config);\n        var /** @type {?} */ expressionParser = new Parser(new Lexer());\n        var /** @type {?} */ elementSchemaRegistry = new DomElementSchemaRegistry();\n        var /** @type {?} */ console = new Console();\n        var /** @type {?} */ tmplParser = new TemplateParser(expressionParser, elementSchemaRegistry, htmlParser, console, []);\n        var /** @type {?} */ resolver = new CompileMetadataResolver(new NgModuleResolver(staticReflector), new DirectiveResolver(staticReflector), new PipeResolver(staticReflector), summaryResolver, elementSchemaRegistry, normalizer, staticReflector);\n        // TODO(vicb): do not pass options.i18nFormat here\n        var /** @type {?} */ compiler = new AotCompiler(compilerHost, resolver, tmplParser, new StyleCompiler(urlResolver), new ViewCompiler(config, elementSchemaRegistry), new DirectiveWrapperCompiler(config, expressionParser, elementSchemaRegistry, console), new NgModuleCompiler(), new TypeScriptEmitter(compilerHost), summaryResolver, options.locale, options.i18nFormat, new AnimationParser(elementSchemaRegistry), symbolResolver);\n        return { compiler: compiler, reflector: staticReflector };\n    }\n\n    /**\n     * @param {?} statements\n     * @param {?} resultVar\n     * @return {?}\n     */\n    function interpretStatements(statements, resultVar) {\n        var /** @type {?} */ stmtsWithReturn = statements.concat([new ReturnStatement(variable(resultVar))]);\n        var /** @type {?} */ ctx = new _ExecutionContext(null, null, null, new Map());\n        var /** @type {?} */ visitor = new StatementInterpreter();\n        var /** @type {?} */ result = visitor.visitAllStatements(stmtsWithReturn, ctx);\n        return isPresent(result) ? result.value : null;\n    }\n    /**\n     * @param {?} varNames\n     * @param {?} varValues\n     * @param {?} statements\n     * @param {?} ctx\n     * @param {?} visitor\n     * @return {?}\n     */\n    function _executeFunctionStatements(varNames, varValues, statements, ctx, visitor) {\n        var /** @type {?} */ childCtx = ctx.createChildWihtLocalVars();\n        for (var /** @type {?} */ i = 0; i < varNames.length; i++) {\n            childCtx.vars.set(varNames[i], varValues[i]);\n        }\n        var /** @type {?} */ result = visitor.visitAllStatements(statements, childCtx);\n        return isPresent(result) ? result.value : null;\n    }\n    var _ExecutionContext = (function () {\n        /**\n         * @param {?} parent\n         * @param {?} instance\n         * @param {?} className\n         * @param {?} vars\n         */\n        function _ExecutionContext(parent, instance, className, vars) {\n            this.parent = parent;\n            this.instance = instance;\n            this.className = className;\n            this.vars = vars;\n        }\n        /**\n         * @return {?}\n         */\n        _ExecutionContext.prototype.createChildWihtLocalVars = function () {\n            return new _ExecutionContext(this, this.instance, this.className, new Map());\n        };\n        return _ExecutionContext;\n    }());\n    var ReturnValue = (function () {\n        /**\n         * @param {?} value\n         */\n        function ReturnValue(value) {\n            this.value = value;\n        }\n        return ReturnValue;\n    }());\n    /**\n     * @param {?} _classStmt\n     * @param {?} _ctx\n     * @param {?} _visitor\n     * @return {?}\n     */\n    function createDynamicClass(_classStmt, _ctx, _visitor) {\n        var /** @type {?} */ propertyDescriptors = {};\n        _classStmt.getters.forEach(function (getter) {\n            // Note: use `function` instead of arrow function to capture `this`\n            propertyDescriptors[getter.name] = {\n                configurable: false,\n                get: function () {\n                    var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n                    return _executeFunctionStatements([], [], getter.body, instanceCtx, _visitor);\n                }\n            };\n        });\n        _classStmt.methods.forEach(function (method) {\n            var /** @type {?} */ paramNames = method.params.map(function (param) { return param.name; });\n            // Note: use `function` instead of arrow function to capture `this`\n            propertyDescriptors[method.name] = {\n                writable: false,\n                configurable: false,\n                value: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i - 0] = arguments[_i];\n                    }\n                    var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n                    return _executeFunctionStatements(paramNames, args, method.body, instanceCtx, _visitor);\n                }\n            };\n        });\n        var /** @type {?} */ ctorParamNames = _classStmt.constructorMethod.params.map(function (param) { return param.name; });\n        // Note: use `function` instead of arrow function to capture `this`\n        var /** @type {?} */ ctor = function () {\n            var _this = this;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n            _classStmt.fields.forEach(function (field) { _this[field.name] = undefined; });\n            _executeFunctionStatements(ctorParamNames, args, _classStmt.constructorMethod.body, instanceCtx, _visitor);\n        };\n        var /** @type {?} */ superClass = _classStmt.parent ? _classStmt.parent.visitExpression(_visitor, _ctx) : Object;\n        ctor.prototype = Object.create(superClass.prototype, propertyDescriptors);\n        return ctor;\n    }\n    var StatementInterpreter = (function () {\n        function StatementInterpreter() {\n        }\n        /**\n         * @param {?} ast\n         * @return {?}\n         */\n        StatementInterpreter.prototype.debugAst = function (ast) { return debugOutputAstAsTypeScript(ast); };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n            ctx.vars.set(stmt.name, stmt.value.visitExpression(this, ctx));\n            return null;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitWriteVarExpr = function (expr, ctx) {\n            var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n            var /** @type {?} */ currCtx = ctx;\n            while (currCtx != null) {\n                if (currCtx.vars.has(expr.name)) {\n                    currCtx.vars.set(expr.name, value);\n                    return value;\n                }\n                currCtx = currCtx.parent;\n            }\n            throw new Error(\"Not declared variable \" + expr.name);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitReadVarExpr = function (ast, ctx) {\n            var /** @type {?} */ varName = ast.name;\n            if (isPresent(ast.builtin)) {\n                switch (ast.builtin) {\n                    case BuiltinVar.Super:\n                        return ctx.instance.__proto__;\n                    case BuiltinVar.This:\n                        return ctx.instance;\n                    case BuiltinVar.CatchError:\n                        varName = CATCH_ERROR_VAR$2;\n                        break;\n                    case BuiltinVar.CatchStack:\n                        varName = CATCH_STACK_VAR$2;\n                        break;\n                    default:\n                        throw new Error(\"Unknown builtin variable \" + ast.builtin);\n                }\n            }\n            var /** @type {?} */ currCtx = ctx;\n            while (currCtx != null) {\n                if (currCtx.vars.has(varName)) {\n                    return currCtx.vars.get(varName);\n                }\n                currCtx = currCtx.parent;\n            }\n            throw new Error(\"Not declared variable \" + varName);\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitWriteKeyExpr = function (expr, ctx) {\n            var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n            var /** @type {?} */ index = expr.index.visitExpression(this, ctx);\n            var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n            receiver[index] = value;\n            return value;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitWritePropExpr = function (expr, ctx) {\n            var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n            var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n            receiver[expr.name] = value;\n            return value;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitInvokeMethodExpr = function (expr, ctx) {\n            var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n            var /** @type {?} */ args = this.visitAllExpressions(expr.args, ctx);\n            var /** @type {?} */ result;\n            if (isPresent(expr.builtin)) {\n                switch (expr.builtin) {\n                    case BuiltinMethod.ConcatArray:\n                        result = receiver.concat.apply(receiver, args);\n                        break;\n                    case BuiltinMethod.SubscribeObservable:\n                        result = receiver.subscribe({ next: args[0] });\n                        break;\n                    case BuiltinMethod.Bind:\n                        result = receiver.bind.apply(receiver, args);\n                        break;\n                    default:\n                        throw new Error(\"Unknown builtin method \" + expr.builtin);\n                }\n            }\n            else {\n                result = receiver[expr.name].apply(receiver, args);\n            }\n            return result;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitInvokeFunctionExpr = function (stmt, ctx) {\n            var /** @type {?} */ args = this.visitAllExpressions(stmt.args, ctx);\n            var /** @type {?} */ fnExpr = stmt.fn;\n            if (fnExpr instanceof ReadVarExpr && fnExpr.builtin === BuiltinVar.Super) {\n                ctx.instance.constructor.prototype.constructor.apply(ctx.instance, args);\n                return null;\n            }\n            else {\n                var /** @type {?} */ fn = stmt.fn.visitExpression(this, ctx);\n                return fn.apply(null, args);\n            }\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitReturnStmt = function (stmt, ctx) {\n            return new ReturnValue(stmt.value.visitExpression(this, ctx));\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n            var /** @type {?} */ clazz = createDynamicClass(stmt, ctx, this);\n            ctx.vars.set(stmt.name, clazz);\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitExpressionStmt = function (stmt, ctx) {\n            return stmt.expr.visitExpression(this, ctx);\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitIfStmt = function (stmt, ctx) {\n            var /** @type {?} */ condition = stmt.condition.visitExpression(this, ctx);\n            if (condition) {\n                return this.visitAllStatements(stmt.trueCase, ctx);\n            }\n            else if (isPresent(stmt.falseCase)) {\n                return this.visitAllStatements(stmt.falseCase, ctx);\n            }\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitTryCatchStmt = function (stmt, ctx) {\n            try {\n                return this.visitAllStatements(stmt.bodyStmts, ctx);\n            }\n            catch (e) {\n                var /** @type {?} */ childCtx = ctx.createChildWihtLocalVars();\n                childCtx.vars.set(CATCH_ERROR_VAR$2, e);\n                childCtx.vars.set(CATCH_STACK_VAR$2, e.stack);\n                return this.visitAllStatements(stmt.catchStmts, childCtx);\n            }\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitThrowStmt = function (stmt, ctx) {\n            throw stmt.error.visitExpression(this, ctx);\n        };\n        /**\n         * @param {?} stmt\n         * @param {?=} context\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitCommentStmt = function (stmt, context) { return null; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitInstantiateExpr = function (ast, ctx) {\n            var /** @type {?} */ args = this.visitAllExpressions(ast.args, ctx);\n            var /** @type {?} */ clazz = ast.classExpr.visitExpression(this, ctx);\n            return new (clazz.bind.apply(clazz, [void 0].concat(args)))();\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitLiteralExpr = function (ast, ctx) { return ast.value; };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitExternalExpr = function (ast, ctx) {\n            return ast.value.reference;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitConditionalExpr = function (ast, ctx) {\n            if (ast.condition.visitExpression(this, ctx)) {\n                return ast.trueCase.visitExpression(this, ctx);\n            }\n            else if (isPresent(ast.falseCase)) {\n                return ast.falseCase.visitExpression(this, ctx);\n            }\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitNotExpr = function (ast, ctx) {\n            return !ast.condition.visitExpression(this, ctx);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitCastExpr = function (ast, ctx) {\n            return ast.value.visitExpression(this, ctx);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitFunctionExpr = function (ast, ctx) {\n            var /** @type {?} */ paramNames = ast.params.map(function (param) { return param.name; });\n            return _declareFn(paramNames, ast.statements, ctx, this);\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n            var /** @type {?} */ paramNames = stmt.params.map(function (param) { return param.name; });\n            ctx.vars.set(stmt.name, _declareFn(paramNames, stmt.statements, ctx, this));\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitBinaryOperatorExpr = function (ast, ctx) {\n            var _this = this;\n            var /** @type {?} */ lhs = function () { return ast.lhs.visitExpression(_this, ctx); };\n            var /** @type {?} */ rhs = function () { return ast.rhs.visitExpression(_this, ctx); };\n            switch (ast.operator) {\n                case BinaryOperator.Equals:\n                    return lhs() == rhs();\n                case BinaryOperator.Identical:\n                    return lhs() === rhs();\n                case BinaryOperator.NotEquals:\n                    return lhs() != rhs();\n                case BinaryOperator.NotIdentical:\n                    return lhs() !== rhs();\n                case BinaryOperator.And:\n                    return lhs() && rhs();\n                case BinaryOperator.Or:\n                    return lhs() || rhs();\n                case BinaryOperator.Plus:\n                    return lhs() + rhs();\n                case BinaryOperator.Minus:\n                    return lhs() - rhs();\n                case BinaryOperator.Divide:\n                    return lhs() / rhs();\n                case BinaryOperator.Multiply:\n                    return lhs() * rhs();\n                case BinaryOperator.Modulo:\n                    return lhs() % rhs();\n                case BinaryOperator.Lower:\n                    return lhs() < rhs();\n                case BinaryOperator.LowerEquals:\n                    return lhs() <= rhs();\n                case BinaryOperator.Bigger:\n                    return lhs() > rhs();\n                case BinaryOperator.BiggerEquals:\n                    return lhs() >= rhs();\n                default:\n                    throw new Error(\"Unknown operator \" + ast.operator);\n            }\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitReadPropExpr = function (ast, ctx) {\n            var /** @type {?} */ result;\n            var /** @type {?} */ receiver = ast.receiver.visitExpression(this, ctx);\n            result = receiver[ast.name];\n            return result;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitReadKeyExpr = function (ast, ctx) {\n            var /** @type {?} */ receiver = ast.receiver.visitExpression(this, ctx);\n            var /** @type {?} */ prop = ast.index.visitExpression(this, ctx);\n            return receiver[prop];\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n            return this.visitAllExpressions(ast.entries, ctx);\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitLiteralMapExpr = function (ast, ctx) {\n            var _this = this;\n            var /** @type {?} */ result = {};\n            ast.entries.forEach(function (entry) { return ((result))[entry.key] = entry.value.visitExpression(_this, ctx); });\n            return result;\n        };\n        /**\n         * @param {?} expressions\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitAllExpressions = function (expressions, ctx) {\n            var _this = this;\n            return expressions.map(function (expr) { return expr.visitExpression(_this, ctx); });\n        };\n        /**\n         * @param {?} statements\n         * @param {?} ctx\n         * @return {?}\n         */\n        StatementInterpreter.prototype.visitAllStatements = function (statements, ctx) {\n            for (var /** @type {?} */ i = 0; i < statements.length; i++) {\n                var /** @type {?} */ stmt = statements[i];\n                var /** @type {?} */ val = stmt.visitStatement(this, ctx);\n                if (val instanceof ReturnValue) {\n                    return val;\n                }\n            }\n            return null;\n        };\n        return StatementInterpreter;\n    }());\n    /**\n     * @param {?} varNames\n     * @param {?} statements\n     * @param {?} ctx\n     * @param {?} visitor\n     * @return {?}\n     */\n    function _declareFn(varNames, statements, ctx, visitor) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            return _executeFunctionStatements(varNames, args, statements, ctx, visitor);\n        };\n    }\n    var /** @type {?} */ CATCH_ERROR_VAR$2 = 'error';\n    var /** @type {?} */ CATCH_STACK_VAR$2 = 'stack';\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$30 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @abstract\n     */\n    var AbstractJsEmitterVisitor = (function (_super) {\n        __extends$30(AbstractJsEmitterVisitor, _super);\n        function AbstractJsEmitterVisitor() {\n            _super.call(this, false);\n        }\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n            var _this = this;\n            ctx.pushClass(stmt);\n            this._visitClassConstructor(stmt, ctx);\n            if (isPresent(stmt.parent)) {\n                ctx.print(stmt.name + \".prototype = Object.create(\");\n                stmt.parent.visitExpression(this, ctx);\n                ctx.println(\".prototype);\");\n            }\n            stmt.getters.forEach(function (getter) { return _this._visitClassGetter(stmt, getter, ctx); });\n            stmt.methods.forEach(function (method) { return _this._visitClassMethod(stmt, method, ctx); });\n            ctx.popClass();\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {\n            ctx.print(\"function \" + stmt.name + \"(\");\n            if (isPresent(stmt.constructorMethod)) {\n                this._visitParams(stmt.constructorMethod.params, ctx);\n            }\n            ctx.println(\") {\");\n            ctx.incIndent();\n            if (isPresent(stmt.constructorMethod)) {\n                if (stmt.constructorMethod.body.length > 0) {\n                    ctx.println(\"var self = this;\");\n                    this.visitAllStatements(stmt.constructorMethod.body, ctx);\n                }\n            }\n            ctx.decIndent();\n            ctx.println(\"}\");\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} getter\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype._visitClassGetter = function (stmt, getter, ctx) {\n            ctx.println(\"Object.defineProperty(\" + stmt.name + \".prototype, '\" + getter.name + \"', { get: function() {\");\n            ctx.incIndent();\n            if (getter.body.length > 0) {\n                ctx.println(\"var self = this;\");\n                this.visitAllStatements(getter.body, ctx);\n            }\n            ctx.decIndent();\n            ctx.println(\"}});\");\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} method\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype._visitClassMethod = function (stmt, method, ctx) {\n            ctx.print(stmt.name + \".prototype.\" + method.name + \" = function(\");\n            this._visitParams(method.params, ctx);\n            ctx.println(\") {\");\n            ctx.incIndent();\n            if (method.body.length > 0) {\n                ctx.println(\"var self = this;\");\n                this.visitAllStatements(method.body, ctx);\n            }\n            ctx.decIndent();\n            ctx.println(\"};\");\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {\n            if (ast.builtin === BuiltinVar.This) {\n                ctx.print('self');\n            }\n            else if (ast.builtin === BuiltinVar.Super) {\n                throw new Error(\"'super' needs to be handled at a parent ast node, not at the variable level!\");\n            }\n            else {\n                _super.prototype.visitReadVarExpr.call(this, ast, ctx);\n            }\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n            ctx.print(\"var \" + stmt.name + \" = \");\n            stmt.value.visitExpression(this, ctx);\n            ctx.println(\";\");\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {\n            ast.value.visitExpression(this, ctx);\n            return null;\n        };\n        /**\n         * @param {?} expr\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {\n            var /** @type {?} */ fnExpr = expr.fn;\n            if (fnExpr instanceof ReadVarExpr && fnExpr.builtin === BuiltinVar.Super) {\n                ctx.currentClass.parent.visitExpression(this, ctx);\n                ctx.print(\".call(this\");\n                if (expr.args.length > 0) {\n                    ctx.print(\", \");\n                    this.visitAllExpressions(expr.args, ctx, ',');\n                }\n                ctx.print(\")\");\n            }\n            else {\n                _super.prototype.visitInvokeFunctionExpr.call(this, expr, ctx);\n            }\n            return null;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {\n            ctx.print(\"function(\");\n            this._visitParams(ast.params, ctx);\n            ctx.println(\") {\");\n            ctx.incIndent();\n            this.visitAllStatements(ast.statements, ctx);\n            ctx.decIndent();\n            ctx.print(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n            ctx.print(\"function \" + stmt.name + \"(\");\n            this._visitParams(stmt.params, ctx);\n            ctx.println(\") {\");\n            ctx.incIndent();\n            this.visitAllStatements(stmt.statements, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} stmt\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {\n            ctx.println(\"try {\");\n            ctx.incIndent();\n            this.visitAllStatements(stmt.bodyStmts, ctx);\n            ctx.decIndent();\n            ctx.println(\"} catch (\" + CATCH_ERROR_VAR$1.name + \") {\");\n            ctx.incIndent();\n            var /** @type {?} */ catchStmts = [(CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack')).toDeclStmt(null, [\n                    StmtModifier.Final\n                ]))].concat(stmt.catchStmts);\n            this.visitAllStatements(catchStmts, ctx);\n            ctx.decIndent();\n            ctx.println(\"}\");\n            return null;\n        };\n        /**\n         * @param {?} params\n         * @param {?} ctx\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype._visitParams = function (params, ctx) {\n            this.visitAllObjects(function (param) { return ctx.print(param.name); }, params, ctx, ',');\n        };\n        /**\n         * @param {?} method\n         * @return {?}\n         */\n        AbstractJsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {\n            var /** @type {?} */ name;\n            switch (method) {\n                case BuiltinMethod.ConcatArray:\n                    name = 'concat';\n                    break;\n                case BuiltinMethod.SubscribeObservable:\n                    name = 'subscribe';\n                    break;\n                case BuiltinMethod.Bind:\n                    name = 'bind';\n                    break;\n                default:\n                    throw new Error(\"Unknown builtin method: \" + method);\n            }\n            return name;\n        };\n        return AbstractJsEmitterVisitor;\n    }(AbstractEmitterVisitor));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __extends$29 = (this && this.__extends) || function (d, b) {\n        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n    /**\n     * @param {?} sourceUrl\n     * @param {?} expr\n     * @param {?} declarations\n     * @param {?} vars\n     * @return {?}\n     */\n    function evalExpression(sourceUrl, expr, declarations, vars) {\n        var /** @type {?} */ fnBody = declarations + \"\\nreturn \" + expr + \"\\n//# sourceURL=\" + sourceUrl;\n        var /** @type {?} */ fnArgNames = [];\n        var /** @type {?} */ fnArgValues = [];\n        for (var argName in vars) {\n            fnArgNames.push(argName);\n            fnArgValues.push(vars[argName]);\n        }\n        return new (Function.bind.apply(Function, [void 0].concat(fnArgNames.concat(fnBody))))().apply(void 0, fnArgValues);\n    }\n    /**\n     * @param {?} sourceUrl\n     * @param {?} statements\n     * @param {?} resultVar\n     * @return {?}\n     */\n    function jitStatements(sourceUrl, statements, resultVar) {\n        var /** @type {?} */ converter = new JitEmitterVisitor();\n        var /** @type {?} */ ctx = EmitterVisitorContext.createRoot([resultVar]);\n        converter.visitAllStatements(statements, ctx);\n        return evalExpression(sourceUrl, resultVar, ctx.toSource(), converter.getArgs());\n    }\n    var JitEmitterVisitor = (function (_super) {\n        __extends$29(JitEmitterVisitor, _super);\n        function JitEmitterVisitor() {\n            _super.apply(this, arguments);\n            this._evalArgNames = [];\n            this._evalArgValues = [];\n        }\n        /**\n         * @return {?}\n         */\n        JitEmitterVisitor.prototype.getArgs = function () {\n            var /** @type {?} */ result = {};\n            for (var /** @type {?} */ i = 0; i < this._evalArgNames.length; i++) {\n                result[this._evalArgNames[i]] = this._evalArgValues[i];\n            }\n            return result;\n        };\n        /**\n         * @param {?} ast\n         * @param {?} ctx\n         * @return {?}\n         */\n        JitEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {\n            var /** @type {?} */ value = ast.value.reference;\n            var /** @type {?} */ id = this._evalArgValues.indexOf(value);\n            if (id === -1) {\n                id = this._evalArgValues.length;\n                this._evalArgValues.push(value);\n                var /** @type {?} */ name_1 = identifierName(ast.value) || 'val';\n                this._evalArgNames.push(\"jit_\" + name_1 + id);\n            }\n            ctx.print(this._evalArgNames[id]);\n            return null;\n        };\n        return JitEmitterVisitor;\n    }(AbstractJsEmitterVisitor));\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$17 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$17 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    /**\n     * An internal module of the Angular compiler that begins with component types,\n     * extracts templates, and eventually produces a compiled version of the component\n     * ready for linking into an application.\n     *\n     * \\@security When compiling templates at runtime, you must ensure that the entire template comes\n     * from a trusted source. Attacker-controlled data introduced by a template could expose your\n     * application to XSS risks.  For more detail, see the [Security Guide](http://g.co/ng/security).\n     */\n    var JitCompiler = (function () {\n        /**\n         * @param {?} _injector\n         * @param {?} _metadataResolver\n         * @param {?} _templateParser\n         * @param {?} _styleCompiler\n         * @param {?} _viewCompiler\n         * @param {?} _ngModuleCompiler\n         * @param {?} _directiveWrapperCompiler\n         * @param {?} _compilerConfig\n         * @param {?} _animationParser\n         */\n        function JitCompiler(_injector, _metadataResolver, _templateParser, _styleCompiler, _viewCompiler, _ngModuleCompiler, _directiveWrapperCompiler, _compilerConfig, _animationParser) {\n            this._injector = _injector;\n            this._metadataResolver = _metadataResolver;\n            this._templateParser = _templateParser;\n            this._styleCompiler = _styleCompiler;\n            this._viewCompiler = _viewCompiler;\n            this._ngModuleCompiler = _ngModuleCompiler;\n            this._directiveWrapperCompiler = _directiveWrapperCompiler;\n            this._compilerConfig = _compilerConfig;\n            this._animationParser = _animationParser;\n            this._compiledTemplateCache = new Map();\n            this._compiledHostTemplateCache = new Map();\n            this._compiledDirectiveWrapperCache = new Map();\n            this._compiledNgModuleCache = new Map();\n            this._animationCompiler = new AnimationCompiler();\n        }\n        Object.defineProperty(JitCompiler.prototype, \"injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._injector; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        JitCompiler.prototype.compileModuleSync = function (moduleType) {\n            return this._compileModuleAndComponents(moduleType, true).syncResult;\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        JitCompiler.prototype.compileModuleAsync = function (moduleType) {\n            return this._compileModuleAndComponents(moduleType, false).asyncResult;\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        JitCompiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n            return this._compileModuleAndAllComponents(moduleType, true).syncResult;\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        JitCompiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n            return this._compileModuleAndAllComponents(moduleType, false).asyncResult;\n        };\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        JitCompiler.prototype.getNgContentSelectors = function (component) {\n            var /** @type {?} */ template = this._compiledTemplateCache.get(component);\n            if (!template) {\n                throw new Error(\"The component \" + stringify(component) + \" is not yet compiled!\");\n            }\n            return template.compMeta.template.ngContentSelectors;\n        };\n        /**\n         * @param {?} moduleType\n         * @param {?} isSync\n         * @return {?}\n         */\n        JitCompiler.prototype._compileModuleAndComponents = function (moduleType, isSync) {\n            var _this = this;\n            var /** @type {?} */ loadingPromise = this._loadModules(moduleType, isSync);\n            var /** @type {?} */ createResult = function () {\n                _this._compileComponents(moduleType, null);\n                return _this._compileModule(moduleType);\n            };\n            if (isSync) {\n                return new SyncAsyncResult(createResult());\n            }\n            else {\n                return new SyncAsyncResult(null, loadingPromise.then(createResult));\n            }\n        };\n        /**\n         * @param {?} moduleType\n         * @param {?} isSync\n         * @return {?}\n         */\n        JitCompiler.prototype._compileModuleAndAllComponents = function (moduleType, isSync) {\n            var _this = this;\n            var /** @type {?} */ loadingPromise = this._loadModules(moduleType, isSync);\n            var /** @type {?} */ createResult = function () {\n                var /** @type {?} */ componentFactories = [];\n                _this._compileComponents(moduleType, componentFactories);\n                return new _angular_core.ModuleWithComponentFactories(_this._compileModule(moduleType), componentFactories);\n            };\n            if (isSync) {\n                return new SyncAsyncResult(createResult());\n            }\n            else {\n                return new SyncAsyncResult(null, loadingPromise.then(createResult));\n            }\n        };\n        /**\n         * @param {?} mainModule\n         * @param {?} isSync\n         * @return {?}\n         */\n        JitCompiler.prototype._loadModules = function (mainModule, isSync) {\n            var _this = this;\n            var /** @type {?} */ loadingPromises = [];\n            var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(mainModule);\n            // Note: the loadingPromise for a module only includes the loading of the exported directives\n            // of imported modules.\n            // However, for runtime compilation, we want to transitively compile all modules,\n            // so we also need to call loadNgModuleDirectiveAndPipeMetadata for all nested modules.\n            ngModule.transitiveModule.modules.forEach(function (localModuleMeta) {\n                loadingPromises.push(_this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(localModuleMeta.reference, isSync));\n            });\n            return Promise.all(loadingPromises);\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        JitCompiler.prototype._compileModule = function (moduleType) {\n            var _this = this;\n            var /** @type {?} */ ngModuleFactory = this._compiledNgModuleCache.get(moduleType);\n            if (!ngModuleFactory) {\n                var /** @type {?} */ moduleMeta_1 = this._metadataResolver.getNgModuleMetadata(moduleType);\n                // Always provide a bound Compiler\n                var /** @type {?} */ extraProviders = [this._metadataResolver.getProviderMetadata(new ProviderMeta(_angular_core.Compiler, { useFactory: function () { return new ModuleBoundCompiler(_this, moduleMeta_1.type.reference); } }))];\n                var /** @type {?} */ compileResult = this._ngModuleCompiler.compile(moduleMeta_1, extraProviders);\n                compileResult.dependencies.forEach(function (dep) {\n                    dep.placeholder.reference =\n                        _this._assertComponentKnown(dep.comp.reference, true).proxyComponentFactory;\n                });\n                if (!this._compilerConfig.useJit) {\n                    ngModuleFactory =\n                        interpretStatements(compileResult.statements, compileResult.ngModuleFactoryVar);\n                }\n                else {\n                    ngModuleFactory = jitStatements(\"/\" + identifierName(moduleMeta_1.type) + \"/module.ngfactory.js\", compileResult.statements, compileResult.ngModuleFactoryVar);\n                }\n                this._compiledNgModuleCache.set(moduleMeta_1.type.reference, ngModuleFactory);\n            }\n            return ngModuleFactory;\n        };\n        /**\n         * \\@internal\n         * @param {?} mainModule\n         * @param {?} allComponentFactories\n         * @return {?}\n         */\n        JitCompiler.prototype._compileComponents = function (mainModule, allComponentFactories) {\n            var _this = this;\n            var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(mainModule);\n            var /** @type {?} */ moduleByDirective = new Map();\n            var /** @type {?} */ templates = new Set();\n            ngModule.transitiveModule.modules.forEach(function (localModuleSummary) {\n                var /** @type {?} */ localModuleMeta = _this._metadataResolver.getNgModuleMetadata(localModuleSummary.reference);\n                localModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n                    moduleByDirective.set(dirIdentifier.reference, localModuleMeta);\n                    var /** @type {?} */ dirMeta = _this._metadataResolver.getDirectiveMetadata(dirIdentifier.reference);\n                    _this._compileDirectiveWrapper(dirMeta, localModuleMeta);\n                    if (dirMeta.isComponent) {\n                        templates.add(_this._createCompiledTemplate(dirMeta, localModuleMeta));\n                        if (allComponentFactories) {\n                            var /** @type {?} */ template = _this._createCompiledHostTemplate(dirMeta.type.reference, localModuleMeta);\n                            templates.add(template);\n                            allComponentFactories.push(template.proxyComponentFactory);\n                        }\n                    }\n                });\n            });\n            ngModule.transitiveModule.modules.forEach(function (localModuleSummary) {\n                var /** @type {?} */ localModuleMeta = _this._metadataResolver.getNgModuleMetadata(localModuleSummary.reference);\n                localModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n                    var /** @type {?} */ dirMeta = _this._metadataResolver.getDirectiveMetadata(dirIdentifier.reference);\n                    if (dirMeta.isComponent) {\n                        dirMeta.entryComponents.forEach(function (entryComponentType) {\n                            var /** @type {?} */ moduleMeta = moduleByDirective.get(entryComponentType.reference);\n                            templates.add(_this._createCompiledHostTemplate(entryComponentType.reference, moduleMeta));\n                        });\n                    }\n                });\n                localModuleMeta.entryComponents.forEach(function (entryComponentType) {\n                    var /** @type {?} */ moduleMeta = moduleByDirective.get(entryComponentType.reference);\n                    templates.add(_this._createCompiledHostTemplate(entryComponentType.reference, moduleMeta));\n                });\n            });\n            templates.forEach(function (template) { return _this._compileTemplate(template); });\n        };\n        /**\n         * @param {?} type\n         * @return {?}\n         */\n        JitCompiler.prototype.clearCacheFor = function (type) {\n            this._compiledNgModuleCache.delete(type);\n            this._metadataResolver.clearCacheFor(type);\n            this._compiledHostTemplateCache.delete(type);\n            var /** @type {?} */ compiledTemplate = this._compiledTemplateCache.get(type);\n            if (compiledTemplate) {\n                this._compiledTemplateCache.delete(type);\n            }\n        };\n        /**\n         * @return {?}\n         */\n        JitCompiler.prototype.clearCache = function () {\n            this._metadataResolver.clearCache();\n            this._compiledTemplateCache.clear();\n            this._compiledHostTemplateCache.clear();\n            this._compiledNgModuleCache.clear();\n        };\n        /**\n         * @param {?} compType\n         * @param {?} ngModule\n         * @return {?}\n         */\n        JitCompiler.prototype._createCompiledHostTemplate = function (compType, ngModule) {\n            if (!ngModule) {\n                throw new Error(\"Component \" + stringify(compType) + \" is not part of any NgModule or the module has not been imported into your module.\");\n            }\n            var /** @type {?} */ compiledTemplate = this._compiledHostTemplateCache.get(compType);\n            if (!compiledTemplate) {\n                var /** @type {?} */ compMeta = this._metadataResolver.getDirectiveMetadata(compType);\n                assertComponent(compMeta);\n                var /** @type {?} */ HostClass = function HostClass() { };\n                ((HostClass)).overriddenName = identifierName(compMeta.type) + \"_Host\";\n                var /** @type {?} */ hostMeta = createHostComponentMeta(HostClass, compMeta);\n                compiledTemplate = new CompiledTemplate(true, compMeta.selector, compMeta.type, hostMeta, ngModule, [compMeta.type]);\n                this._compiledHostTemplateCache.set(compType, compiledTemplate);\n            }\n            return compiledTemplate;\n        };\n        /**\n         * @param {?} compMeta\n         * @param {?} ngModule\n         * @return {?}\n         */\n        JitCompiler.prototype._createCompiledTemplate = function (compMeta, ngModule) {\n            var /** @type {?} */ compiledTemplate = this._compiledTemplateCache.get(compMeta.type.reference);\n            if (!compiledTemplate) {\n                assertComponent(compMeta);\n                compiledTemplate = new CompiledTemplate(false, compMeta.selector, compMeta.type, compMeta, ngModule, ngModule.transitiveModule.directives);\n                this._compiledTemplateCache.set(compMeta.type.reference, compiledTemplate);\n            }\n            return compiledTemplate;\n        };\n        /**\n         * @param {?} compType\n         * @param {?} isHost\n         * @return {?}\n         */\n        JitCompiler.prototype._assertComponentKnown = function (compType, isHost) {\n            var /** @type {?} */ compiledTemplate = isHost ? this._compiledHostTemplateCache.get(compType) :\n                this._compiledTemplateCache.get(compType);\n            if (!compiledTemplate) {\n                throw new Error(\"Illegal state: Compiled view for component \" + stringify(compType) + \" (host: \" + isHost + \") does not exist!\");\n            }\n            return compiledTemplate;\n        };\n        /**\n         * @param {?} dirType\n         * @return {?}\n         */\n        JitCompiler.prototype._assertDirectiveWrapper = function (dirType) {\n            var /** @type {?} */ dirWrapper = this._compiledDirectiveWrapperCache.get(dirType);\n            if (!dirWrapper) {\n                throw new Error(\"Illegal state: Directive wrapper for \" + stringify(dirType) + \" has not been compiled!\");\n            }\n            return dirWrapper;\n        };\n        /**\n         * @param {?} dirMeta\n         * @param {?} moduleMeta\n         * @return {?}\n         */\n        JitCompiler.prototype._compileDirectiveWrapper = function (dirMeta, moduleMeta) {\n            var /** @type {?} */ compileResult = this._directiveWrapperCompiler.compile(dirMeta);\n            var /** @type {?} */ statements = compileResult.statements;\n            var /** @type {?} */ directiveWrapperClass;\n            if (!this._compilerConfig.useJit) {\n                directiveWrapperClass = interpretStatements(statements, compileResult.dirWrapperClassVar);\n            }\n            else {\n                directiveWrapperClass = jitStatements(\"/\" + identifierName(moduleMeta.type) + \"/\" + identifierName(dirMeta.type) + \"/wrapper.ngfactory.js\", statements, compileResult.dirWrapperClassVar);\n            }\n            this._compiledDirectiveWrapperCache.set(dirMeta.type.reference, directiveWrapperClass);\n        };\n        /**\n         * @param {?} template\n         * @return {?}\n         */\n        JitCompiler.prototype._compileTemplate = function (template) {\n            var _this = this;\n            if (template.isCompiled) {\n                return;\n            }\n            var /** @type {?} */ compMeta = template.compMeta;\n            var /** @type {?} */ externalStylesheetsByModuleUrl = new Map();\n            var /** @type {?} */ stylesCompileResult = this._styleCompiler.compileComponent(compMeta);\n            stylesCompileResult.externalStylesheets.forEach(function (r) { externalStylesheetsByModuleUrl.set(r.meta.moduleUrl, r); });\n            this._resolveStylesCompileResult(stylesCompileResult.componentStylesheet, externalStylesheetsByModuleUrl);\n            var /** @type {?} */ parsedAnimations = this._animationParser.parseComponent(compMeta);\n            var /** @type {?} */ directives = template.directives.map(function (dir) { return _this._metadataResolver.getDirectiveSummary(dir.reference); });\n            var /** @type {?} */ pipes = template.ngModule.transitiveModule.pipes.map(function (pipe) { return _this._metadataResolver.getPipeSummary(pipe.reference); });\n            var /** @type {?} */ parsedTemplate = this._templateParser.parse(compMeta, compMeta.template.template, directives, pipes, template.ngModule.schemas, identifierName(compMeta.type));\n            var /** @type {?} */ compiledAnimations = this._animationCompiler.compile(identifierName(compMeta.type), parsedAnimations);\n            var /** @type {?} */ compileResult = this._viewCompiler.compileComponent(compMeta, parsedTemplate, variable(stylesCompileResult.componentStylesheet.stylesVar), pipes, compiledAnimations);\n            compileResult.dependencies.forEach(function (dep) {\n                var /** @type {?} */ depTemplate;\n                if (dep instanceof ViewClassDependency) {\n                    var /** @type {?} */ vfd = (dep);\n                    depTemplate = _this._assertComponentKnown(vfd.comp.reference, false);\n                    vfd.placeholder.reference = depTemplate.proxyViewClass;\n                }\n                else if (dep instanceof ComponentFactoryDependency$1) {\n                    var /** @type {?} */ cfd = (dep);\n                    depTemplate = _this._assertComponentKnown(cfd.comp.reference, true);\n                    cfd.placeholder.reference = depTemplate.proxyComponentFactory;\n                }\n                else if (dep instanceof DirectiveWrapperDependency) {\n                    var /** @type {?} */ dwd = (dep);\n                    dwd.placeholder.reference = _this._assertDirectiveWrapper(dwd.dir.reference);\n                }\n            });\n            var /** @type {?} */ statements = (_a = stylesCompileResult.componentStylesheet.statements).concat.apply(_a, compiledAnimations.map(function (ca) { return ca.statements; }))\n                .concat(compileResult.statements);\n            var /** @type {?} */ viewClass;\n            if (!this._compilerConfig.useJit) {\n                viewClass = interpretStatements(statements, compileResult.viewClassVar);\n            }\n            else {\n                viewClass = jitStatements(\"/\" + identifierName(template.ngModule.type) + \"/\" + identifierName(template.compType) + \"/\" + (template.isHost ? 'host' : 'component') + \".ngfactory.js\", statements, compileResult.viewClassVar);\n            }\n            template.compiled(viewClass);\n            var _a;\n        };\n        /**\n         * @param {?} result\n         * @param {?} externalStylesheetsByModuleUrl\n         * @return {?}\n         */\n        JitCompiler.prototype._resolveStylesCompileResult = function (result, externalStylesheetsByModuleUrl) {\n            var _this = this;\n            result.dependencies.forEach(function (dep, i) {\n                var /** @type {?} */ nestedCompileResult = externalStylesheetsByModuleUrl.get(dep.moduleUrl);\n                var /** @type {?} */ nestedStylesArr = _this._resolveAndEvalStylesCompileResult(nestedCompileResult, externalStylesheetsByModuleUrl);\n                dep.valuePlaceholder.reference = nestedStylesArr;\n            });\n        };\n        /**\n         * @param {?} result\n         * @param {?} externalStylesheetsByModuleUrl\n         * @return {?}\n         */\n        JitCompiler.prototype._resolveAndEvalStylesCompileResult = function (result, externalStylesheetsByModuleUrl) {\n            this._resolveStylesCompileResult(result, externalStylesheetsByModuleUrl);\n            if (!this._compilerConfig.useJit) {\n                return interpretStatements(result.statements, result.stylesVar);\n            }\n            else {\n                return jitStatements(\"/\" + result.meta.moduleUrl + \".ngstyle.js\", result.statements, result.stylesVar);\n            }\n        };\n        JitCompiler = __decorate$17([\n            CompilerInjectable(), \n            __metadata$17('design:paramtypes', [_angular_core.Injector, CompileMetadataResolver, TemplateParser, StyleCompiler, ViewCompiler, NgModuleCompiler, DirectiveWrapperCompiler, CompilerConfig, AnimationParser])\n        ], JitCompiler);\n        return JitCompiler;\n    }());\n    var CompiledTemplate = (function () {\n        /**\n         * @param {?} isHost\n         * @param {?} selector\n         * @param {?} compType\n         * @param {?} compMeta\n         * @param {?} ngModule\n         * @param {?} directives\n         */\n        function CompiledTemplate(isHost, selector, compType, compMeta, ngModule, directives) {\n            this.isHost = isHost;\n            this.compType = compType;\n            this.compMeta = compMeta;\n            this.ngModule = ngModule;\n            this.directives = directives;\n            this._viewClass = null;\n            this.isCompiled = false;\n            var self = this;\n            this.proxyViewClass = function () {\n                if (!self._viewClass) {\n                    throw new Error(\"Illegal state: CompiledTemplate for \" + stringify(self.compType) + \" is not compiled yet!\");\n                }\n                return self._viewClass.apply(this, arguments);\n            };\n            this.proxyComponentFactory = isHost ?\n                new _angular_core.ComponentFactory(selector, this.proxyViewClass, compType.reference) :\n                null;\n        }\n        /**\n         * @param {?} viewClass\n         * @return {?}\n         */\n        CompiledTemplate.prototype.compiled = function (viewClass) {\n            this._viewClass = viewClass;\n            this.proxyViewClass.prototype = viewClass.prototype;\n            this.isCompiled = true;\n        };\n        return CompiledTemplate;\n    }());\n    /**\n     * @param {?} meta\n     * @return {?}\n     */\n    function assertComponent(meta) {\n        if (!meta.isComponent) {\n            throw new Error(\"Could not compile '\" + identifierName(meta.type) + \"' because it is not a component.\");\n        }\n    }\n    /**\n     * Implements `Compiler` by delegating to the JitCompiler using a known module.\n     */\n    var ModuleBoundCompiler = (function () {\n        /**\n         * @param {?} _delegate\n         * @param {?} _ngModule\n         */\n        function ModuleBoundCompiler(_delegate, _ngModule) {\n            this._delegate = _delegate;\n            this._ngModule = _ngModule;\n        }\n        Object.defineProperty(ModuleBoundCompiler.prototype, \"_injector\", {\n            /**\n             * @return {?}\n             */\n            get: function () { return this._delegate.injector; },\n            enumerable: true,\n            configurable: true\n        });\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.compileModuleSync = function (moduleType) {\n            return this._delegate.compileModuleSync(moduleType);\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.compileModuleAsync = function (moduleType) {\n            return this._delegate.compileModuleAsync(moduleType);\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n            return this._delegate.compileModuleAndAllComponentsSync(moduleType);\n        };\n        /**\n         * @param {?} moduleType\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n            return this._delegate.compileModuleAndAllComponentsAsync(moduleType);\n        };\n        /**\n         * @param {?} component\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.getNgContentSelectors = function (component) {\n            return this._delegate.getNgContentSelectors(component);\n        };\n        /**\n         * Clears all caches\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.clearCache = function () { this._delegate.clearCache(); };\n        /**\n         * Clears the cache for the given component/ngModule.\n         * @param {?} type\n         * @return {?}\n         */\n        ModuleBoundCompiler.prototype.clearCacheFor = function (type) { this._delegate.clearCacheFor(type); };\n        return ModuleBoundCompiler;\n    }());\n\n    /**\n     * A container for message extracted from the templates.\n     */\n    var MessageBundle = (function () {\n        /**\n         * @param {?} _htmlParser\n         * @param {?} _implicitTags\n         * @param {?} _implicitAttrs\n         */\n        function MessageBundle(_htmlParser, _implicitTags, _implicitAttrs) {\n            this._htmlParser = _htmlParser;\n            this._implicitTags = _implicitTags;\n            this._implicitAttrs = _implicitAttrs;\n            this._messages = [];\n        }\n        /**\n         * @param {?} html\n         * @param {?} url\n         * @param {?} interpolationConfig\n         * @return {?}\n         */\n        MessageBundle.prototype.updateFromTemplate = function (html, url, interpolationConfig) {\n            var /** @type {?} */ htmlParserResult = this._htmlParser.parse(html, url, true, interpolationConfig);\n            if (htmlParserResult.errors.length) {\n                return htmlParserResult.errors;\n            }\n            var /** @type {?} */ i18nParserResult = extractMessages(htmlParserResult.rootNodes, interpolationConfig, this._implicitTags, this._implicitAttrs);\n            if (i18nParserResult.errors.length) {\n                return i18nParserResult.errors;\n            }\n            (_a = this._messages).push.apply(_a, i18nParserResult.messages);\n            var _a;\n        };\n        /**\n         * @return {?}\n         */\n        MessageBundle.prototype.getMessages = function () { return this._messages; };\n        /**\n         * @param {?} serializer\n         * @return {?}\n         */\n        MessageBundle.prototype.write = function (serializer) { return serializer.write(this._messages); };\n        return MessageBundle;\n    }());\n\n    var Extractor = (function () {\n        /**\n         * @param {?} host\n         * @param {?} staticSymbolResolver\n         * @param {?} messageBundle\n         * @param {?} metadataResolver\n         */\n        function Extractor(host, staticSymbolResolver, messageBundle, metadataResolver) {\n            this.host = host;\n            this.staticSymbolResolver = staticSymbolResolver;\n            this.messageBundle = messageBundle;\n            this.metadataResolver = metadataResolver;\n        }\n        /**\n         * @param {?} rootFiles\n         * @return {?}\n         */\n        Extractor.prototype.extract = function (rootFiles) {\n            var _this = this;\n            var /** @type {?} */ programSymbols = extractProgramSymbols(this.staticSymbolResolver, rootFiles, this.host);\n            var _a = analyzeAndValidateNgModules(programSymbols, this.host, this.metadataResolver), files = _a.files, ngModules = _a.ngModules;\n            return Promise\n                .all(ngModules.map(function (ngModule) { return _this.metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference, false); }))\n                .then(function () {\n                var /** @type {?} */ errors = [];\n                files.forEach(function (file) {\n                    var /** @type {?} */ compMetas = [];\n                    file.directives.forEach(function (directiveType) {\n                        var /** @type {?} */ dirMeta = _this.metadataResolver.getDirectiveMetadata(directiveType);\n                        if (dirMeta && dirMeta.isComponent) {\n                            compMetas.push(dirMeta);\n                        }\n                    });\n                    compMetas.forEach(function (compMeta) {\n                        var /** @type {?} */ html = compMeta.template.template;\n                        var /** @type {?} */ interpolationConfig = InterpolationConfig.fromArray(compMeta.template.interpolation);\n                        errors.push.apply(errors, _this.messageBundle.updateFromTemplate(html, file.srcUrl, interpolationConfig));\n                    });\n                });\n                if (errors.length) {\n                    throw new Error(errors.map(function (e) { return e.toString(); }).join('\\n'));\n                }\n                return _this.messageBundle;\n            });\n        };\n        /**\n         * @param {?} host\n         * @return {?}\n         */\n        Extractor.create = function (host) {\n            var /** @type {?} */ htmlParser = new I18NHtmlParser(new HtmlParser());\n            var /** @type {?} */ urlResolver = createOfflineCompileUrlResolver();\n            var /** @type {?} */ symbolCache = new StaticSymbolCache();\n            var /** @type {?} */ summaryResolver = new AotSummaryResolver(host, symbolCache);\n            var /** @type {?} */ staticSymbolResolver = new StaticSymbolResolver(host, symbolCache, summaryResolver);\n            var /** @type {?} */ staticReflector = new StaticReflector(staticSymbolResolver);\n            StaticAndDynamicReflectionCapabilities.install(staticReflector);\n            var /** @type {?} */ config = new CompilerConfig({\n                genDebugInfo: false,\n                defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated,\n                logBindingUpdate: false,\n                useJit: false\n            });\n            var /** @type {?} */ normalizer = new DirectiveNormalizer({ get: function (url) { return host.loadResource(url); } }, urlResolver, htmlParser, config);\n            var /** @type {?} */ elementSchemaRegistry = new DomElementSchemaRegistry();\n            var /** @type {?} */ resolver = new CompileMetadataResolver(new NgModuleResolver(staticReflector), new DirectiveResolver(staticReflector), new PipeResolver(staticReflector), summaryResolver, elementSchemaRegistry, normalizer, staticReflector);\n            // TODO(vicb): implicit tags & attributes\n            var /** @type {?} */ messageBundle = new MessageBundle(htmlParser, [], {});\n            var /** @type {?} */ extractor = new Extractor(host, staticSymbolResolver, messageBundle, resolver);\n            return { extractor: extractor, staticReflector: staticReflector };\n        };\n        return Extractor;\n    }());\n\n    /**\n     * @license\n     * Copyright Google Inc. All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var __decorate$18 = (this && this.__decorate) || function (decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    };\n    var __metadata$18 = (this && this.__metadata) || function (k, v) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n    };\n    var /** @type {?} */ _NO_RESOURCE_LOADER = {\n        /**\n         * @param {?} url\n         * @return {?}\n         */\n        get: function (url) {\n            throw new Error(\"No ResourceLoader implementation has been provided. Can't read the url \\\"\" + url + \"\\\"\");\n        }\n    };\n    var /** @type {?} */ baseHtmlParser = new _angular_core.OpaqueToken('HtmlParser');\n    /**\n     * A set of providers that provide `JitCompiler` and its dependencies to use for\n     * template compilation.\n     */\n    var /** @type {?} */ COMPILER_PROVIDERS = [\n        { provide: Reflector, useValue: reflector },\n        { provide: ReflectorReader, useExisting: Reflector },\n        { provide: ResourceLoader, useValue: _NO_RESOURCE_LOADER },\n        SummaryResolver,\n        Console,\n        Lexer,\n        Parser,\n        {\n            provide: baseHtmlParser,\n            useClass: HtmlParser,\n        },\n        {\n            provide: I18NHtmlParser,\n            useFactory: function (parser, translations, format) {\n                return new I18NHtmlParser(parser, translations, format);\n            },\n            deps: [\n                baseHtmlParser,\n                [new _angular_core.Optional(), new _angular_core.Inject(_angular_core.TRANSLATIONS)],\n                [new _angular_core.Optional(), new _angular_core.Inject(_angular_core.TRANSLATIONS_FORMAT)],\n            ]\n        },\n        {\n            provide: HtmlParser,\n            useExisting: I18NHtmlParser,\n        },\n        TemplateParser,\n        DirectiveNormalizer,\n        CompileMetadataResolver,\n        DEFAULT_PACKAGE_URL_PROVIDER,\n        StyleCompiler,\n        ViewCompiler,\n        NgModuleCompiler,\n        DirectiveWrapperCompiler,\n        { provide: CompilerConfig, useValue: new CompilerConfig() },\n        JitCompiler,\n        { provide: _angular_core.Compiler, useExisting: JitCompiler },\n        DomElementSchemaRegistry,\n        { provide: ElementSchemaRegistry, useExisting: DomElementSchemaRegistry },\n        UrlResolver,\n        DirectiveResolver,\n        PipeResolver,\n        NgModuleResolver,\n        AnimationParser\n    ];\n    var JitCompilerFactory = (function () {\n        /**\n         * @param {?} defaultOptions\n         */\n        function JitCompilerFactory(defaultOptions) {\n            this._defaultOptions = [{\n                    useDebug: _angular_core.isDevMode(),\n                    useJit: true,\n                    defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated\n                }].concat(defaultOptions);\n        }\n        /**\n         * @param {?=} options\n         * @return {?}\n         */\n        JitCompilerFactory.prototype.createCompiler = function (options) {\n            if (options === void 0) { options = []; }\n            var /** @type {?} */ mergedOptions = _mergeOptions(this._defaultOptions.concat(options));\n            var /** @type {?} */ injector = _angular_core.ReflectiveInjector.resolveAndCreate([\n                COMPILER_PROVIDERS, {\n                    provide: CompilerConfig,\n                    useFactory: function () {\n                        return new CompilerConfig({\n                            // let explicit values from the compiler options overwrite options\n                            // from the app providers. E.g. important for the testing platform.\n                            genDebugInfo: mergedOptions.useDebug,\n                            // let explicit values from the compiler options overwrite options\n                            // from the app providers\n                            useJit: mergedOptions.useJit,\n                            // let explicit values from the compiler options overwrite options\n                            // from the app providers\n                            defaultEncapsulation: mergedOptions.defaultEncapsulation,\n                            logBindingUpdate: mergedOptions.useDebug\n                        });\n                    },\n                    deps: []\n                },\n                mergedOptions.providers\n            ]);\n            return injector.get(_angular_core.Compiler);\n        };\n        /** @nocollapse */\n        JitCompilerFactory.ctorParameters = function () { return [\n            { type: Array, decorators: [{ type: _angular_core.Inject, args: [_angular_core.COMPILER_OPTIONS,] },] },\n        ]; };\n        JitCompilerFactory = __decorate$18([\n            CompilerInjectable(), \n            __metadata$18('design:paramtypes', [Array])\n        ], JitCompilerFactory);\n        return JitCompilerFactory;\n    }());\n    /**\n     * @return {?}\n     */\n    function _initReflector() {\n        reflector.reflectionCapabilities = new ReflectionCapabilities();\n    }\n    /**\n     * A platform that included corePlatform and the compiler.\n     *\n     * @experimental\n     */\n    var /** @type {?} */ platformCoreDynamic = _angular_core.createPlatformFactory(_angular_core.platformCore, 'coreDynamic', [\n        { provide: _angular_core.COMPILER_OPTIONS, useValue: {}, multi: true },\n        { provide: _angular_core.CompilerFactory, useClass: JitCompilerFactory },\n        { provide: _angular_core.PLATFORM_INITIALIZER, useValue: _initReflector, multi: true },\n    ]);\n    /**\n     * @param {?} optionsArr\n     * @return {?}\n     */\n    function _mergeOptions(optionsArr) {\n        return {\n            useDebug: _lastDefined(optionsArr.map(function (options) { return options.useDebug; })),\n            useJit: _lastDefined(optionsArr.map(function (options) { return options.useJit; })),\n            defaultEncapsulation: _lastDefined(optionsArr.map(function (options) { return options.defaultEncapsulation; })),\n            providers: _mergeArrays(optionsArr.map(function (options) { return options.providers; }))\n        };\n    }\n    /**\n     * @param {?} args\n     * @return {?}\n     */\n    function _lastDefined(args) {\n        for (var /** @type {?} */ i = args.length - 1; i >= 0; i--) {\n            if (args[i] !== undefined) {\n                return args[i];\n            }\n        }\n        return undefined;\n    }\n    /**\n     * @param {?} parts\n     * @return {?}\n     */\n    function _mergeArrays(parts) {\n        var /** @type {?} */ result = [];\n        parts.forEach(function (part) { return part && result.push.apply(result, part); });\n        return result;\n    }\n\n    /**\n     * Interface that defines how import statements should be generated.\n     * @abstract\n     */\n    var ImportResolver = (function () {\n        function ImportResolver() {\n        }\n        /**\n         * Converts a file path to a module name that can be used as an `import.\n         * I.e. `path/to/importedFile.ts` should be imported by `path/to/containingFile.ts`.\n         * @abstract\n         * @param {?} importedFilePath\n         * @param {?} containingFilePath\n         * @return {?}\n         */\n        ImportResolver.prototype.fileNameToModuleName = function (importedFilePath, containingFilePath) { };\n        return ImportResolver;\n    }());\n\n    exports.VERSION = VERSION;\n    exports.TextAst = TextAst;\n    exports.BoundTextAst = BoundTextAst;\n    exports.AttrAst = AttrAst;\n    exports.BoundElementPropertyAst = BoundElementPropertyAst;\n    exports.BoundEventAst = BoundEventAst;\n    exports.ReferenceAst = ReferenceAst;\n    exports.VariableAst = VariableAst;\n    exports.ElementAst = ElementAst;\n    exports.EmbeddedTemplateAst = EmbeddedTemplateAst;\n    exports.BoundDirectivePropertyAst = BoundDirectivePropertyAst;\n    exports.DirectiveAst = DirectiveAst;\n    exports.ProviderAst = ProviderAst;\n    exports.ProviderAstType = ProviderAstType;\n    exports.NgContentAst = NgContentAst;\n    exports.PropertyBindingType = PropertyBindingType;\n    exports.templateVisitAll = templateVisitAll;\n    exports.TEMPLATE_TRANSFORMS = TEMPLATE_TRANSFORMS;\n    exports.CompilerConfig = CompilerConfig;\n    exports.RenderTypes = RenderTypes;\n    exports.CompileAnimationEntryMetadata = CompileAnimationEntryMetadata;\n    exports.CompileAnimationStateMetadata = CompileAnimationStateMetadata;\n    exports.CompileAnimationStateDeclarationMetadata = CompileAnimationStateDeclarationMetadata;\n    exports.CompileAnimationStateTransitionMetadata = CompileAnimationStateTransitionMetadata;\n    exports.CompileAnimationMetadata = CompileAnimationMetadata;\n    exports.CompileAnimationKeyframesSequenceMetadata = CompileAnimationKeyframesSequenceMetadata;\n    exports.CompileAnimationStyleMetadata = CompileAnimationStyleMetadata;\n    exports.CompileAnimationAnimateMetadata = CompileAnimationAnimateMetadata;\n    exports.CompileAnimationWithStepsMetadata = CompileAnimationWithStepsMetadata;\n    exports.CompileAnimationSequenceMetadata = CompileAnimationSequenceMetadata;\n    exports.CompileAnimationGroupMetadata = CompileAnimationGroupMetadata;\n    exports.identifierName = identifierName;\n    exports.identifierModuleUrl = identifierModuleUrl;\n    exports.CompileSummaryKind = CompileSummaryKind;\n    exports.tokenName = tokenName;\n    exports.tokenReference = tokenReference;\n    exports.CompileStylesheetMetadata = CompileStylesheetMetadata;\n    exports.CompileTemplateMetadata = CompileTemplateMetadata;\n    exports.CompileDirectiveMetadata = CompileDirectiveMetadata;\n    exports.createHostComponentMeta = createHostComponentMeta;\n    exports.CompilePipeMetadata = CompilePipeMetadata;\n    exports.CompileNgModuleMetadata = CompileNgModuleMetadata;\n    exports.TransitiveCompileNgModuleMetadata = TransitiveCompileNgModuleMetadata;\n    exports.ProviderMeta = ProviderMeta;\n    exports.createAotCompiler = createAotCompiler;\n    exports.AotCompiler = AotCompiler;\n    exports.analyzeNgModules = analyzeNgModules;\n    exports.analyzeAndValidateNgModules = analyzeAndValidateNgModules;\n    exports.extractProgramSymbols = extractProgramSymbols;\n    exports.StaticReflector = StaticReflector;\n    exports.StaticAndDynamicReflectionCapabilities = StaticAndDynamicReflectionCapabilities;\n    exports.StaticSymbol = StaticSymbol;\n    exports.StaticSymbolCache = StaticSymbolCache;\n    exports.ResolvedStaticSymbol = ResolvedStaticSymbol;\n    exports.StaticSymbolResolver = StaticSymbolResolver;\n    exports.AotSummaryResolver = AotSummaryResolver;\n    exports.SummaryResolver = SummaryResolver;\n    exports.JitCompiler = JitCompiler;\n    exports.COMPILER_PROVIDERS = COMPILER_PROVIDERS;\n    exports.JitCompilerFactory = JitCompilerFactory;\n    exports.platformCoreDynamic = platformCoreDynamic;\n    exports.createUrlResolverWithoutPackagePrefix = createUrlResolverWithoutPackagePrefix;\n    exports.createOfflineCompileUrlResolver = createOfflineCompileUrlResolver;\n    exports.DEFAULT_PACKAGE_URL_PROVIDER = DEFAULT_PACKAGE_URL_PROVIDER;\n    exports.UrlResolver = UrlResolver;\n    exports.getUrlScheme = getUrlScheme;\n    exports.ResourceLoader = ResourceLoader;\n    exports.DirectiveResolver = DirectiveResolver;\n    exports.PipeResolver = PipeResolver;\n    exports.NgModuleResolver = NgModuleResolver;\n    exports.DEFAULT_INTERPOLATION_CONFIG = DEFAULT_INTERPOLATION_CONFIG;\n    exports.InterpolationConfig = InterpolationConfig;\n    exports.ElementSchemaRegistry = ElementSchemaRegistry;\n    exports.Extractor = Extractor;\n    exports.I18NHtmlParser = I18NHtmlParser;\n    exports.MessageBundle = MessageBundle;\n    exports.Serializer = Serializer;\n    exports.Xliff = Xliff;\n    exports.Xmb = Xmb;\n    exports.Xtb = Xtb;\n    exports.DirectiveNormalizer = DirectiveNormalizer;\n    exports.TokenType = TokenType;\n    exports.Lexer = Lexer;\n    exports.Token = Token;\n    exports.EOF = EOF;\n    exports.isIdentifier = isIdentifier;\n    exports.isQuote = isQuote;\n    exports.SplitInterpolation = SplitInterpolation;\n    exports.TemplateBindingParseResult = TemplateBindingParseResult;\n    exports.Parser = Parser;\n    exports._ParseAST = _ParseAST;\n    exports.ERROR_COLLECTOR_TOKEN = ERROR_COLLECTOR_TOKEN;\n    exports.CompileMetadataResolver = CompileMetadataResolver;\n    exports.componentModuleUrl = componentModuleUrl;\n    exports.ParseTreeResult = ParseTreeResult;\n    exports.TreeError = TreeError;\n    exports.HtmlParser = HtmlParser;\n    exports.NgModuleCompiler = NgModuleCompiler;\n    exports.DirectiveWrapperCompiler = DirectiveWrapperCompiler;\n    exports.ImportResolver = ImportResolver;\n    exports.debugOutputAstAsTypeScript = debugOutputAstAsTypeScript;\n    exports.TypeScriptEmitter = TypeScriptEmitter;\n    exports.ParseLocation = ParseLocation;\n    exports.ParseSourceFile = ParseSourceFile;\n    exports.ParseSourceSpan = ParseSourceSpan;\n    exports.ParseErrorLevel = ParseErrorLevel;\n    exports.ParseError = ParseError;\n    exports.DomElementSchemaRegistry = DomElementSchemaRegistry;\n    exports.CssSelector = CssSelector;\n    exports.SelectorMatcher = SelectorMatcher;\n    exports.SelectorListContext = SelectorListContext;\n    exports.SelectorContext = SelectorContext;\n    exports.StylesCompileDependency = StylesCompileDependency;\n    exports.StylesCompileResult = StylesCompileResult;\n    exports.CompiledStylesheet = CompiledStylesheet;\n    exports.StyleCompiler = StyleCompiler;\n    exports.TemplateParseError = TemplateParseError;\n    exports.TemplateParseResult = TemplateParseResult;\n    exports.TemplateParser = TemplateParser;\n    exports.splitClasses = splitClasses;\n    exports.createElementCssSelector = createElementCssSelector;\n    exports.removeSummaryDuplicates = removeSummaryDuplicates;\n    exports.ViewCompiler = ViewCompiler;\n    exports.AnimationParser = AnimationParser;\n    exports.SyntaxError = SyntaxError;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@angular/compiler/bundles/compiler.umd.js\n// module id = 584\n// module chunks = 2","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs/Subscriber'), require('rxjs/operator/pluck'), require('rxjs/operator/map'), require('rxjs/operator/distinctUntilChanged')) :\n    typeof define === 'function' && define.amd ? define(['exports', 'rxjs/Subscriber', 'rxjs/operator/pluck', 'rxjs/operator/map', 'rxjs/operator/distinctUntilChanged'], factory) :\n    (factory((global.ngrx = global.ngrx || {}, global.ngrx.core = global.ngrx.core || {}),global.Rx,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype));\n}(this, (function (exports,rxjs_Subscriber,rxjs_operator_pluck,rxjs_operator_map,rxjs_operator_distinctUntilChanged) { 'use strict';\n\nvar __extends = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nfunction enterZone(zone) {\n    return this.lift(new EnterZoneOperator(zone));\n}\nvar EnterZoneOperator = (function () {\n    function EnterZoneOperator(_zone) {\n        this._zone = _zone;\n    }\n    EnterZoneOperator.prototype.call = function (subscriber, source) {\n        return source._subscribe(new EnterZoneSubscriber(subscriber, this._zone));\n    };\n    return EnterZoneOperator;\n}());\nvar EnterZoneSubscriber = (function (_super) {\n    __extends(EnterZoneSubscriber, _super);\n    function EnterZoneSubscriber(destination, _zone) {\n        _super.call(this, destination);\n        this._zone = _zone;\n    }\n    EnterZoneSubscriber.prototype._next = function (value) {\n        var _this = this;\n        this._zone.run(function () { return _this.destination.next(value); });\n    };\n    return EnterZoneSubscriber;\n}(rxjs_Subscriber.Subscriber));\n\nvar __extends$1 = (undefined && undefined.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nfunction leaveZone(zone) {\n    return this.lift(new LeaveZoneOperator(zone));\n}\nvar LeaveZoneOperator = (function () {\n    function LeaveZoneOperator(_zone) {\n        this._zone = _zone;\n    }\n    LeaveZoneOperator.prototype.call = function (subscriber, source) {\n        return source._subscribe(new LeaveZoneSubscriber(subscriber, this._zone));\n    };\n    return LeaveZoneOperator;\n}());\nvar LeaveZoneSubscriber = (function (_super) {\n    __extends$1(LeaveZoneSubscriber, _super);\n    function LeaveZoneSubscriber(destination, _zone) {\n        _super.call(this, destination);\n        this._zone = _zone;\n    }\n    LeaveZoneSubscriber.prototype._next = function (value) {\n        var _this = this;\n        this._zone.runOutsideAngular(function () { return _this.destination.next(value); });\n    };\n    return LeaveZoneSubscriber;\n}(rxjs_Subscriber.Subscriber));\n\nfunction select(pathOrMapFn) {\n    var paths = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        paths[_i - 1] = arguments[_i];\n    }\n    var mapped$;\n    if (typeof pathOrMapFn === 'string') {\n        mapped$ = rxjs_operator_pluck.pluck.call.apply(rxjs_operator_pluck.pluck, [this, pathOrMapFn].concat(paths));\n    }\n    else if (typeof pathOrMapFn === 'function') {\n        mapped$ = rxjs_operator_map.map.call(this, pathOrMapFn);\n    }\n    else {\n        throw new TypeError((\"Unexpected type \" + typeof pathOrMapFn + \" in select operator,\")\n            + \" expected 'string' or 'function'\");\n    }\n    return rxjs_operator_distinctUntilChanged.distinctUntilChanged.call(mapped$);\n}\n\nvar compose = function () {\n    var functions = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        functions[_i - 0] = arguments[_i];\n    }\n    return function (arg) {\n        if (functions.length === 0) {\n            return arg;\n        }\n        var last = functions[functions.length - 1];\n        var rest = functions.slice(0, -1);\n        return rest.reduceRight(function (composed, fn) { return fn(composed); }, last(arg));\n    };\n};\n\nexports.enterZone = enterZone;\nexports.EnterZoneOperator = EnterZoneOperator;\nexports.leaveZone = leaveZone;\nexports.LeaveZoneOperator = LeaveZoneOperator;\nexports.select = select;\nexports.compose = compose;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/@ngrx/core/bundles/core.umd.js\n// module id = 585\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('./Subscriber');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar InnerSubscriber = (function (_super) {\n    __extends(InnerSubscriber, _super);\n    function InnerSubscriber(parent, outerValue, outerIndex) {\n        _super.call(this);\n        this.parent = parent;\n        this.outerValue = outerValue;\n        this.outerIndex = outerIndex;\n        this.index = 0;\n    }\n    InnerSubscriber.prototype._next = function (value) {\n        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n    };\n    InnerSubscriber.prototype._error = function (error) {\n        this.parent.notifyError(error, this);\n        this.unsubscribe();\n    };\n    InnerSubscriber.prototype._complete = function () {\n        this.parent.notifyComplete(this);\n        this.unsubscribe();\n    };\n    return InnerSubscriber;\n}(Subscriber_1.Subscriber));\nexports.InnerSubscriber = InnerSubscriber;\n//# sourceMappingURL=InnerSubscriber.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/InnerSubscriber.js\n// module id = 1059\n// module chunks = 2","\"use strict\";\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an {@link Action}.\n *\n * ```ts\n * class Scheduler {\n *   now(): number;\n *   schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n */\nvar Scheduler = (function () {\n    function Scheduler(SchedulerAction, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        this.SchedulerAction = SchedulerAction;\n        this.now = now;\n    }\n    /**\n     * Schedules a function, `work`, for execution. May happen at some point in\n     * the future, according to the `delay` parameter, if specified. May be passed\n     * some context object, `state`, which will be passed to the `work` function.\n     *\n     * The given arguments will be processed an stored as an Action object in a\n     * queue of actions.\n     *\n     * @param {function(state: ?T): ?Subscription} work A function representing a\n     * task, or some unit of work to be executed by the Scheduler.\n     * @param {number} [delay] Time to wait before executing the work, where the\n     * time unit is implicit and defined by the Scheduler itself.\n     * @param {T} [state] Some contextual data that the `work` function uses when\n     * called by the Scheduler.\n     * @return {Subscription} A subscription in order to be able to unsubscribe\n     * the scheduled work.\n     */\n    Scheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) { delay = 0; }\n        return new this.SchedulerAction(this, work).schedule(state, delay);\n    };\n    Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };\n    return Scheduler;\n}());\nexports.Scheduler = Scheduler;\n//# sourceMappingURL=Scheduler.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/Scheduler.js\n// module id = 1060\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar ScalarObservable_1 = require('./ScalarObservable');\nvar EmptyObservable_1 = require('./EmptyObservable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayLikeObservable = (function (_super) {\n    __extends(ArrayLikeObservable, _super);\n    function ArrayLikeObservable(arrayLike, scheduler) {\n        _super.call(this);\n        this.arrayLike = arrayLike;\n        this.scheduler = scheduler;\n        if (!scheduler && arrayLike.length === 1) {\n            this._isScalar = true;\n            this.value = arrayLike[0];\n        }\n    }\n    ArrayLikeObservable.create = function (arrayLike, scheduler) {\n        var length = arrayLike.length;\n        if (length === 0) {\n            return new EmptyObservable_1.EmptyObservable();\n        }\n        else if (length === 1) {\n            return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);\n        }\n        else {\n            return new ArrayLikeObservable(arrayLike, scheduler);\n        }\n    };\n    ArrayLikeObservable.dispatch = function (state) {\n        var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;\n        if (subscriber.closed) {\n            return;\n        }\n        if (index >= length) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(arrayLike[index]);\n        state.index = index + 1;\n        this.schedule(state);\n    };\n    ArrayLikeObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;\n        var length = arrayLike.length;\n        if (scheduler) {\n            return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {\n                arrayLike: arrayLike, index: index, length: length, subscriber: subscriber\n            });\n        }\n        else {\n            for (var i = 0; i < length && !subscriber.closed; i++) {\n                subscriber.next(arrayLike[i]);\n            }\n            subscriber.complete();\n        }\n    };\n    return ArrayLikeObservable;\n}(Observable_1.Observable));\nexports.ArrayLikeObservable = ArrayLikeObservable;\n//# sourceMappingURL=ArrayLikeObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/ArrayLikeObservable.js\n// module id = 1170\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Observable_1 = require('../Observable');\nvar iterator_1 = require('../symbol/iterator');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar IteratorObservable = (function (_super) {\n    __extends(IteratorObservable, _super);\n    function IteratorObservable(iterator, scheduler) {\n        _super.call(this);\n        this.scheduler = scheduler;\n        if (iterator == null) {\n            throw new Error('iterator cannot be null.');\n        }\n        this.iterator = getIterator(iterator);\n    }\n    IteratorObservable.create = function (iterator, scheduler) {\n        return new IteratorObservable(iterator, scheduler);\n    };\n    IteratorObservable.dispatch = function (state) {\n        var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;\n        if (hasError) {\n            subscriber.error(state.error);\n            return;\n        }\n        var result = iterator.next();\n        if (result.done) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(result.value);\n        state.index = index + 1;\n        if (subscriber.closed) {\n            if (typeof iterator.return === 'function') {\n                iterator.return();\n            }\n            return;\n        }\n        this.schedule(state);\n    };\n    IteratorObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(IteratorObservable.dispatch, 0, {\n                index: index, iterator: iterator, subscriber: subscriber\n            });\n        }\n        else {\n            do {\n                var result = iterator.next();\n                if (result.done) {\n                    subscriber.complete();\n                    break;\n                }\n                else {\n                    subscriber.next(result.value);\n                }\n                if (subscriber.closed) {\n                    if (typeof iterator.return === 'function') {\n                        iterator.return();\n                    }\n                    break;\n                }\n            } while (true);\n        }\n    };\n    return IteratorObservable;\n}(Observable_1.Observable));\nexports.IteratorObservable = IteratorObservable;\nvar StringIterator = (function () {\n    function StringIterator(str, idx, len) {\n        if (idx === void 0) { idx = 0; }\n        if (len === void 0) { len = str.length; }\n        this.str = str;\n        this.idx = idx;\n        this.len = len;\n    }\n    StringIterator.prototype[iterator_1.$$iterator] = function () { return (this); };\n    StringIterator.prototype.next = function () {\n        return this.idx < this.len ? {\n            done: false,\n            value: this.str.charAt(this.idx++)\n        } : {\n            done: true,\n            value: undefined\n        };\n    };\n    return StringIterator;\n}());\nvar ArrayIterator = (function () {\n    function ArrayIterator(arr, idx, len) {\n        if (idx === void 0) { idx = 0; }\n        if (len === void 0) { len = toLength(arr); }\n        this.arr = arr;\n        this.idx = idx;\n        this.len = len;\n    }\n    ArrayIterator.prototype[iterator_1.$$iterator] = function () { return this; };\n    ArrayIterator.prototype.next = function () {\n        return this.idx < this.len ? {\n            done: false,\n            value: this.arr[this.idx++]\n        } : {\n            done: true,\n            value: undefined\n        };\n    };\n    return ArrayIterator;\n}());\nfunction getIterator(obj) {\n    var i = obj[iterator_1.$$iterator];\n    if (!i && typeof obj === 'string') {\n        return new StringIterator(obj);\n    }\n    if (!i && obj.length !== undefined) {\n        return new ArrayIterator(obj);\n    }\n    if (!i) {\n        throw new TypeError('object is not iterable');\n    }\n    return obj[iterator_1.$$iterator]();\n}\nvar maxSafeInteger = Math.pow(2, 53) - 1;\nfunction toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) {\n        return 0;\n    }\n    if (len === 0 || !numberIsFinite(len)) {\n        return len;\n    }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) {\n        return 0;\n    }\n    if (len > maxSafeInteger) {\n        return maxSafeInteger;\n    }\n    return len;\n}\nfunction numberIsFinite(value) {\n    return typeof value === 'number' && root_1.root.isFinite(value);\n}\nfunction sign(value) {\n    var valueAsNumber = +value;\n    if (valueAsNumber === 0) {\n        return valueAsNumber;\n    }\n    if (isNaN(valueAsNumber)) {\n        return valueAsNumber;\n    }\n    return valueAsNumber < 0 ? -1 : 1;\n}\n//# sourceMappingURL=IteratorObservable.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/IteratorObservable.js\n// module id = 1181\n// module chunks = 2","\"use strict\";\nvar isScheduler_1 = require('../util/isScheduler');\nvar isArray_1 = require('../util/isArray');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar combineLatest_1 = require('../operator/combineLatest');\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from all the Observables passed as\n * arguments. This is done by subscribing to each Observable, in order, and\n * collecting an array of each of the most recent values any time any of the\n * input Observables emits, then either taking that array and passing it as\n * arguments to an optional `project` function and emitting the return value of\n * that, or just emitting the array of recent values directly if there is no\n * `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {Observable} observable1 An input Observable to combine with the\n * source Observable.\n * @param {Observable} observable2 An input Observable to combine with the\n * source Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to\n * each input Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @static true\n * @name combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    var scheduler = null;\n    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {\n        scheduler = observables.pop();\n    }\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\n//# sourceMappingURL=combineLatest.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/combineLatest.js\n// module id = 1190\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('../../Subject');\nvar Subscriber_1 = require('../../Subscriber');\nvar Observable_1 = require('../../Observable');\nvar Subscription_1 = require('../../Subscription');\nvar root_1 = require('../../util/root');\nvar ReplaySubject_1 = require('../../ReplaySubject');\nvar tryCatch_1 = require('../../util/tryCatch');\nvar errorObject_1 = require('../../util/errorObject');\nvar assign_1 = require('../../util/assign');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar WebSocketSubject = (function (_super) {\n    __extends(WebSocketSubject, _super);\n    function WebSocketSubject(urlConfigOrSource, destination) {\n        if (urlConfigOrSource instanceof Observable_1.Observable) {\n            _super.call(this, destination, urlConfigOrSource);\n        }\n        else {\n            _super.call(this);\n            this.WebSocketCtor = root_1.root.WebSocket;\n            this._output = new Subject_1.Subject();\n            if (typeof urlConfigOrSource === 'string') {\n                this.url = urlConfigOrSource;\n            }\n            else {\n                // WARNING: config object could override important members here.\n                assign_1.assign(this, urlConfigOrSource);\n            }\n            if (!this.WebSocketCtor) {\n                throw new Error('no WebSocket constructor can be found');\n            }\n            this.destination = new ReplaySubject_1.ReplaySubject();\n        }\n    }\n    WebSocketSubject.prototype.resultSelector = function (e) {\n        return JSON.parse(e.data);\n    };\n    /**\n     * @param urlConfigOrSource\n     * @return {WebSocketSubject}\n     * @static true\n     * @name webSocket\n     * @owner Observable\n     */\n    WebSocketSubject.create = function (urlConfigOrSource) {\n        return new WebSocketSubject(urlConfigOrSource);\n    };\n    WebSocketSubject.prototype.lift = function (operator) {\n        var sock = new WebSocketSubject(this, this.destination);\n        sock.operator = operator;\n        return sock;\n    };\n    WebSocketSubject.prototype._resetState = function () {\n        this.socket = null;\n        if (!this.source) {\n            this.destination = new ReplaySubject_1.ReplaySubject();\n        }\n        this._output = new Subject_1.Subject();\n    };\n    // TODO: factor this out to be a proper Operator/Subscriber implementation and eliminate closures\n    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {\n        var self = this;\n        return new Observable_1.Observable(function (observer) {\n            var result = tryCatch_1.tryCatch(subMsg)();\n            if (result === errorObject_1.errorObject) {\n                observer.error(errorObject_1.errorObject.e);\n            }\n            else {\n                self.next(result);\n            }\n            var subscription = self.subscribe(function (x) {\n                var result = tryCatch_1.tryCatch(messageFilter)(x);\n                if (result === errorObject_1.errorObject) {\n                    observer.error(errorObject_1.errorObject.e);\n                }\n                else if (result) {\n                    observer.next(x);\n                }\n            }, function (err) { return observer.error(err); }, function () { return observer.complete(); });\n            return function () {\n                var result = tryCatch_1.tryCatch(unsubMsg)();\n                if (result === errorObject_1.errorObject) {\n                    observer.error(errorObject_1.errorObject.e);\n                }\n                else {\n                    self.next(result);\n                }\n                subscription.unsubscribe();\n            };\n        });\n    };\n    WebSocketSubject.prototype._connectSocket = function () {\n        var _this = this;\n        var WebSocketCtor = this.WebSocketCtor;\n        var observer = this._output;\n        var socket = null;\n        try {\n            socket = this.protocol ?\n                new WebSocketCtor(this.url, this.protocol) :\n                new WebSocketCtor(this.url);\n            this.socket = socket;\n        }\n        catch (e) {\n            observer.error(e);\n            return;\n        }\n        var subscription = new Subscription_1.Subscription(function () {\n            _this.socket = null;\n            if (socket && socket.readyState === 1) {\n                socket.close();\n            }\n        });\n        socket.onopen = function (e) {\n            var openObserver = _this.openObserver;\n            if (openObserver) {\n                openObserver.next(e);\n            }\n            var queue = _this.destination;\n            _this.destination = Subscriber_1.Subscriber.create(function (x) { return socket.readyState === 1 && socket.send(x); }, function (e) {\n                var closingObserver = _this.closingObserver;\n                if (closingObserver) {\n                    closingObserver.next(undefined);\n                }\n                if (e && e.code) {\n                    socket.close(e.code, e.reason);\n                }\n                else {\n                    observer.error(new TypeError('WebSocketSubject.error must be called with an object with an error code, ' +\n                        'and an optional reason: { code: number, reason: string }'));\n                }\n                _this._resetState();\n            }, function () {\n                var closingObserver = _this.closingObserver;\n                if (closingObserver) {\n                    closingObserver.next(undefined);\n                }\n                socket.close();\n                _this._resetState();\n            });\n            if (queue && queue instanceof ReplaySubject_1.ReplaySubject) {\n                subscription.add(queue.subscribe(_this.destination));\n            }\n        };\n        socket.onerror = function (e) {\n            _this._resetState();\n            observer.error(e);\n        };\n        socket.onclose = function (e) {\n            _this._resetState();\n            var closeObserver = _this.closeObserver;\n            if (closeObserver) {\n                closeObserver.next(e);\n            }\n            if (e.wasClean) {\n                observer.complete();\n            }\n            else {\n                observer.error(e);\n            }\n        };\n        socket.onmessage = function (e) {\n            var result = tryCatch_1.tryCatch(_this.resultSelector)(e);\n            if (result === errorObject_1.errorObject) {\n                observer.error(errorObject_1.errorObject.e);\n            }\n            else {\n                observer.next(result);\n            }\n        };\n    };\n    WebSocketSubject.prototype._subscribe = function (subscriber) {\n        var _this = this;\n        var source = this.source;\n        if (source) {\n            return source.subscribe(subscriber);\n        }\n        if (!this.socket) {\n            this._connectSocket();\n        }\n        var subscription = new Subscription_1.Subscription();\n        subscription.add(this._output.subscribe(subscriber));\n        subscription.add(function () {\n            var socket = _this.socket;\n            if (_this._output.observers.length === 0) {\n                if (socket && socket.readyState === 1) {\n                    socket.close();\n                }\n                _this._resetState();\n            }\n        });\n        return subscription;\n    };\n    WebSocketSubject.prototype.unsubscribe = function () {\n        var _a = this, source = _a.source, socket = _a.socket;\n        if (socket && socket.readyState === 1) {\n            socket.close();\n            this._resetState();\n        }\n        _super.prototype.unsubscribe.call(this);\n        if (!source) {\n            this.destination = new ReplaySubject_1.ReplaySubject();\n        }\n    };\n    return WebSocketSubject;\n}(Subject_1.AnonymousSubject));\nexports.WebSocketSubject = WebSocketSubject;\n//# sourceMappingURL=WebSocketSubject.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/dom/WebSocketSubject.js\n// module id = 1193\n// module chunks = 2","\"use strict\";\nvar WebSocketSubject_1 = require('./WebSocketSubject');\nexports.webSocket = WebSocketSubject_1.WebSocketSubject.create;\n//# sourceMappingURL=webSocket.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/observable/dom/webSocket.js\n// module id = 1195\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = require('../scheduler/async');\nvar isDate_1 = require('../util/isDate');\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * <span class=\"informal\">Time shifts each item by some specified amount of\n * milliseconds.</span>\n *\n * <img src=\"./img/delay.png\" width=\"100%\">\n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example <caption>Delay each click by one second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example <caption>Delay all clicks until a future date happens</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The Scheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nfunction delay(delay, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    var absoluteDelay = isDate_1.isDate(delay);\n    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n    return this.lift(new DelayOperator(delayFor, scheduler));\n}\nexports.delay = delay;\nvar DelayOperator = (function () {\n    function DelayOperator(delay, scheduler) {\n        this.delay = delay;\n        this.scheduler = scheduler;\n    }\n    DelayOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n    };\n    return DelayOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DelaySubscriber = (function (_super) {\n    __extends(DelaySubscriber, _super);\n    function DelaySubscriber(destination, delay, scheduler) {\n        _super.call(this, destination);\n        this.delay = delay;\n        this.scheduler = scheduler;\n        this.queue = [];\n        this.active = false;\n        this.errored = false;\n    }\n    DelaySubscriber.dispatch = function (state) {\n        var source = state.source;\n        var queue = source.queue;\n        var scheduler = state.scheduler;\n        var destination = state.destination;\n        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n            queue.shift().notification.observe(destination);\n        }\n        if (queue.length > 0) {\n            var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n            this.schedule(state, delay_1);\n        }\n        else {\n            source.active = false;\n        }\n    };\n    DelaySubscriber.prototype._schedule = function (scheduler) {\n        this.active = true;\n        this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n            source: this, destination: this.destination, scheduler: scheduler\n        }));\n    };\n    DelaySubscriber.prototype.scheduleNotification = function (notification) {\n        if (this.errored === true) {\n            return;\n        }\n        var scheduler = this.scheduler;\n        var message = new DelayMessage(scheduler.now() + this.delay, notification);\n        this.queue.push(message);\n        if (this.active === false) {\n            this._schedule(scheduler);\n        }\n    };\n    DelaySubscriber.prototype._next = function (value) {\n        this.scheduleNotification(Notification_1.Notification.createNext(value));\n    };\n    DelaySubscriber.prototype._error = function (err) {\n        this.errored = true;\n        this.queue = [];\n        this.destination.error(err);\n    };\n    DelaySubscriber.prototype._complete = function () {\n        this.scheduleNotification(Notification_1.Notification.createComplete());\n    };\n    return DelaySubscriber;\n}(Subscriber_1.Subscriber));\nvar DelayMessage = (function () {\n    function DelayMessage(time, notification) {\n        this.time = time;\n        this.notification = notification;\n    }\n    return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/delay.js\n// module id = 1221\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('../Subject');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Returns an Observable that emits the same values as the source observable with the exception of an `error`.\n * An `error` will cause the emission of the Throwable that cause the error to the Observable returned from\n * notificationHandler. If that Observable calls onComplete or `error` then retry will call `complete` or `error`\n * on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular\n * Scheduler.\n *\n * <img src=\"./img/retryWhen.png\" width=\"100%\">\n *\n * @param {notificationHandler} receives an Observable of notifications with which a user can `complete` or `error`,\n * aborting the retry.\n * @param {scheduler} the Scheduler on which to subscribe to the source Observable.\n * @return {Observable} the source Observable modified with retry logic.\n * @method retryWhen\n * @owner Observable\n */\nfunction retryWhen(notifier) {\n    return this.lift(new RetryWhenOperator(notifier, this));\n}\nexports.retryWhen = retryWhen;\nvar RetryWhenOperator = (function () {\n    function RetryWhenOperator(notifier, source) {\n        this.notifier = notifier;\n        this.source = source;\n    }\n    RetryWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));\n    };\n    return RetryWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RetryWhenSubscriber = (function (_super) {\n    __extends(RetryWhenSubscriber, _super);\n    function RetryWhenSubscriber(destination, notifier, source) {\n        _super.call(this, destination);\n        this.notifier = notifier;\n        this.source = source;\n    }\n    RetryWhenSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var errors = this.errors;\n            var retries = this.retries;\n            var retriesSubscription = this.retriesSubscription;\n            if (!retries) {\n                errors = new Subject_1.Subject();\n                retries = tryCatch_1.tryCatch(this.notifier)(errors);\n                if (retries === errorObject_1.errorObject) {\n                    return _super.prototype.error.call(this, errorObject_1.errorObject.e);\n                }\n                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);\n            }\n            else {\n                this.errors = null;\n                this.retriesSubscription = null;\n            }\n            this.unsubscribe();\n            this.closed = false;\n            this.errors = errors;\n            this.retries = retries;\n            this.retriesSubscription = retriesSubscription;\n            errors.next(err);\n        }\n    };\n    RetryWhenSubscriber.prototype._unsubscribe = function () {\n        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;\n        if (errors) {\n            errors.unsubscribe();\n            this.errors = null;\n        }\n        if (retriesSubscription) {\n            retriesSubscription.unsubscribe();\n            this.retriesSubscription = null;\n        }\n        this.retries = null;\n    };\n    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var _a = this, errors = _a.errors, retries = _a.retries, retriesSubscription = _a.retriesSubscription;\n        this.errors = null;\n        this.retries = null;\n        this.retriesSubscription = null;\n        this.unsubscribe();\n        this.isStopped = false;\n        this.closed = false;\n        this.errors = errors;\n        this.retries = retries;\n        this.retriesSubscription = retriesSubscription;\n        this.source.subscribe(this);\n    };\n    return RetryWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=retryWhen.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/retryWhen.js\n// module id = 1249\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');\nvar EmptyObservable_1 = require('../observable/EmptyObservable');\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Takes the first `count` values from the source, then\n * completes.</span>\n *\n * <img src=\"./img/take.png\" width=\"100%\">\n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable<T>} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nfunction take(count) {\n    if (count === 0) {\n        return new EmptyObservable_1.EmptyObservable();\n    }\n    else {\n        return this.lift(new TakeOperator(count));\n    }\n}\nexports.take = take;\nvar TakeOperator = (function () {\n    function TakeOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n        }\n    }\n    TakeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeSubscriber(subscriber, this.total));\n    };\n    return TakeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeSubscriber = (function (_super) {\n    __extends(TakeSubscriber, _super);\n    function TakeSubscriber(destination, total) {\n        _super.call(this, destination);\n        this.total = total;\n        this.count = 0;\n    }\n    TakeSubscriber.prototype._next = function (value) {\n        var total = this.total;\n        var count = ++this.count;\n        if (count <= total) {\n            this.destination.next(value);\n            if (count === total) {\n                this.destination.complete();\n                this.unsubscribe();\n            }\n        }\n    };\n    return TakeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=take.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/operator/take.js\n// module id = 1260\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('../Subscription');\n/**\n * A unit of work to be executed in a {@link Scheduler}. An action is typically\n * created from within a Scheduler and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action<T> extends Subscription {\n *   new (scheduler: Scheduler, work: (state?: T) => void);\n *   schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action<T>\n */\nvar Action = (function (_super) {\n    __extends(Action, _super);\n    function Action(scheduler, work) {\n        _super.call(this);\n    }\n    /**\n     * Schedules this action on its parent Scheduler for execution. May be passed\n     * some context object, `state`. May happen at some point in the future,\n     * according to the `delay` parameter, if specified.\n     * @param {T} [state] Some contextual data that the `work` function uses when\n     * called by the Scheduler.\n     * @param {number} [delay] Time to wait before executing the work, where the\n     * time unit is implicit and defined by the Scheduler.\n     * @return {void}\n     */\n    Action.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        return this;\n    };\n    return Action;\n}(Subscription_1.Subscription));\nexports.Action = Action;\n//# sourceMappingURL=Action.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/Action.js\n// module id = 1274\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncAction_1 = require('./AsyncAction');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar QueueAction = (function (_super) {\n    __extends(QueueAction, _super);\n    function QueueAction(scheduler, work) {\n        _super.call(this, scheduler, work);\n        this.scheduler = scheduler;\n        this.work = work;\n    }\n    QueueAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay > 0) {\n            return _super.prototype.schedule.call(this, state, delay);\n        }\n        this.delay = delay;\n        this.state = state;\n        this.scheduler.flush(this);\n        return this;\n    };\n    QueueAction.prototype.execute = function (state, delay) {\n        return (delay > 0 || this.closed) ?\n            _super.prototype.execute.call(this, state, delay) :\n            this._execute(state, delay);\n    };\n    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        // If delay exists and is greater than 0, or if the delay is null (the\n        // action wasn't rescheduled) but was originally scheduled as an async\n        // action, then recycle as an async action.\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        // Otherwise flush the scheduler starting with this action.\n        return scheduler.flush(this);\n    };\n    return QueueAction;\n}(AsyncAction_1.AsyncAction));\nexports.QueueAction = QueueAction;\n//# sourceMappingURL=QueueAction.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/QueueAction.js\n// module id = 1279\n// module chunks = 2","\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncScheduler_1 = require('./AsyncScheduler');\nvar QueueScheduler = (function (_super) {\n    __extends(QueueScheduler, _super);\n    function QueueScheduler() {\n        _super.apply(this, arguments);\n    }\n    return QueueScheduler;\n}(AsyncScheduler_1.AsyncScheduler));\nexports.QueueScheduler = QueueScheduler;\n//# sourceMappingURL=QueueScheduler.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/scheduler/QueueScheduler.js\n// module id = 1280\n// module chunks = 2","\"use strict\";\nvar root_1 = require('./root');\nfunction assignImpl(target) {\n    var sources = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        sources[_i - 1] = arguments[_i];\n    }\n    var len = sources.length;\n    for (var i = 0; i < len; i++) {\n        var source = sources[i];\n        for (var k in source) {\n            if (source.hasOwnProperty(k)) {\n                target[k] = source[k];\n            }\n        }\n    }\n    return target;\n}\nexports.assignImpl = assignImpl;\n;\nfunction getAssign(root) {\n    return root.Object.assign || assignImpl;\n}\nexports.getAssign = getAssign;\nexports.assign = getAssign(root_1.root);\n//# sourceMappingURL=assign.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/assign.js\n// module id = 1291\n// module chunks = 2","\"use strict\";\nvar Subscriber_1 = require('../Subscriber');\nvar rxSubscriber_1 = require('../symbol/rxSubscriber');\nvar Observer_1 = require('../Observer');\nfunction toSubscriber(nextOrObserver, error, complete) {\n    if (nextOrObserver) {\n        if (nextOrObserver instanceof Subscriber_1.Subscriber) {\n            return nextOrObserver;\n        }\n        if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) {\n            return nextOrObserver[rxSubscriber_1.$$rxSubscriber]();\n        }\n    }\n    if (!nextOrObserver && !error && !complete) {\n        return new Subscriber_1.Subscriber(Observer_1.empty);\n    }\n    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n}\nexports.toSubscriber = toSubscriber;\n//# sourceMappingURL=toSubscriber.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/rxjs/util/toSubscriber.js\n// module id = 1293\n// module chunks = 2"],"mappings":";;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AAEA;AACA;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACr+YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7lHA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClBA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtlJA;AACA;AACA;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACngEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1HA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACz/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzDA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjIA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvCA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxHA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnh3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvNA;AACA;AACA;AACA;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;","sourceRoot":""}