UNPKG

@angular/core

Version:

Angular - the core framework

1,047 lines • 87.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { Observable, merge } from 'rxjs'; import { share } from 'rxjs/operators'; import { ApplicationInitStatus } from './application_init'; import { APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER } from './application_tokens'; import { getCompilerFacade } from './compiler/compiler_facade'; import { Console } from './console'; import { Injectable, InjectionToken, Injector } from './di'; import { ErrorHandler } from './error_handler'; import { DEFAULT_LOCALE_ID } from './i18n/localization'; import { LOCALE_ID } from './i18n/tokens'; import { ivyEnabled } from './ivy_switch'; import { COMPILER_OPTIONS, CompilerFactory } from './linker/compiler'; import { ComponentFactory } from './linker/component_factory'; import { ComponentFactoryBoundToModule, ComponentFactoryResolver } from './linker/component_factory_resolver'; import { NgModuleRef } from './linker/ng_module_factory'; import { isComponentResourceResolutionQueueEmpty, resolveComponentResources } from './metadata/resource_loading'; import { wtfCreateScope, wtfLeave } from './profile/profile'; import { assertNgModuleType } from './render3/assert'; import { setLocaleId } from './render3/i18n'; import { NgModuleFactory as R3NgModuleFactory } from './render3/ng_module_ref'; import { Testability, TestabilityRegistry } from './testability/testability'; import { isDevMode } from './util/is_dev_mode'; import { isPromise } from './util/lang'; import { scheduleMicroTask } from './util/microtask'; import { stringify } from './util/stringify'; import { NgZone, NoopNgZone } from './zone/ng_zone'; /** @type {?} */ let _platform; /** @type {?} */ let compileNgModuleFactory = compileNgModuleFactory__PRE_R3__; /** * @template M * @param {?} injector * @param {?} options * @param {?} moduleType * @return {?} */ function compileNgModuleFactory__PRE_R3__(injector, options, moduleType) { /** @type {?} */ const compilerFactory = injector.get(CompilerFactory); /** @type {?} */ const compiler = compilerFactory.createCompiler([options]); return compiler.compileModuleAsync(moduleType); } /** * @template M * @param {?} injector * @param {?} options * @param {?} moduleType * @return {?} */ export function compileNgModuleFactory__POST_R3__(injector, options, moduleType) { ngDevMode && assertNgModuleType(moduleType); /** @type {?} */ const moduleFactory = new R3NgModuleFactory(moduleType); if (isComponentResourceResolutionQueueEmpty()) { return Promise.resolve(moduleFactory); } /** @type {?} */ const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options); /** @type {?} */ const compilerProviders = _mergeArrays(compilerOptions.map((/** * @param {?} o * @return {?} */ o => (/** @type {?} */ (o.providers))))); // In case there are no compiler providers, we just return the module factory as // there won't be any resource loader. This can happen with Ivy, because AOT compiled // modules can be still passed through "bootstrapModule". In that case we shouldn't // unnecessarily require the JIT compiler. if (compilerProviders.length === 0) { return Promise.resolve(moduleFactory); } /** @type {?} */ const compiler = getCompilerFacade(); /** @type {?} */ const compilerInjector = Injector.create({ providers: compilerProviders }); /** @type {?} */ const resourceLoader = compilerInjector.get(compiler.ResourceLoader); // The resource loader can also return a string while the "resolveComponentResources" // always expects a promise. Therefore we need to wrap the returned value in a promise. return resolveComponentResources((/** * @param {?} url * @return {?} */ url => Promise.resolve(resourceLoader.get(url)))) .then((/** * @return {?} */ () => moduleFactory)); } /** @type {?} */ let isBoundToModule = isBoundToModule__PRE_R3__; /** * @template C * @param {?} cf * @return {?} */ export function isBoundToModule__PRE_R3__(cf) { return cf instanceof ComponentFactoryBoundToModule; } /** * @template C * @param {?} cf * @return {?} */ export function isBoundToModule__POST_R3__(cf) { return ((/** @type {?} */ (cf))).isBoundToModule; } /** @type {?} */ export const ALLOW_MULTIPLE_PLATFORMS = new InjectionToken('AllowMultipleToken'); /** * A token for third-party components that can register themselves with NgProbe. * * \@publicApi */ export class NgProbeToken { /** * @param {?} name * @param {?} token */ constructor(name, token) { this.name = name; this.token = token; } } if (false) { /** @type {?} */ NgProbeToken.prototype.name; /** @type {?} */ NgProbeToken.prototype.token; } /** * Creates a platform. * Platforms have to be eagerly created via this function. * * \@publicApi * @param {?} injector * @return {?} */ export function createPlatform(injector) { if (_platform && !_platform.destroyed && !_platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) { throw new Error('There can be only one platform. Destroy the previous one to create a new one.'); } _platform = injector.get(PlatformRef); /** @type {?} */ const inits = injector.get(PLATFORM_INITIALIZER, null); if (inits) inits.forEach((/** * @param {?} init * @return {?} */ (init) => init())); return _platform; } /** * Creates a factory for a platform * * \@publicApi * @param {?} parentPlatformFactory * @param {?} name * @param {?=} providers * @return {?} */ export function createPlatformFactory(parentPlatformFactory, name, providers = []) { /** @type {?} */ const desc = `Platform: ${name}`; /** @type {?} */ const marker = new InjectionToken(desc); return (/** * @param {?=} extraProviders * @return {?} */ (extraProviders = []) => { /** @type {?} */ let platform = getPlatform(); if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) { if (parentPlatformFactory) { parentPlatformFactory(providers.concat(extraProviders).concat({ provide: marker, useValue: true })); } else { /** @type {?} */ const injectedProviders = providers.concat(extraProviders).concat({ provide: marker, useValue: true }); createPlatform(Injector.create({ providers: injectedProviders, name: desc })); } } return assertPlatform(marker); }); } /** * Checks that there currently is a platform which contains the given token as a provider. * * \@publicApi * @param {?} requiredToken * @return {?} */ export function assertPlatform(requiredToken) { /** @type {?} */ const platform = getPlatform(); if (!platform) { throw new Error('No platform exists!'); } if (!platform.injector.get(requiredToken, null)) { throw new Error('A platform with a different configuration has been created. Please destroy it first.'); } return platform; } /** * Destroy the existing platform. * * \@publicApi * @return {?} */ export function destroyPlatform() { if (_platform && !_platform.destroyed) { _platform.destroy(); } } /** * Returns the current platform. * * \@publicApi * @return {?} */ export function getPlatform() { return _platform && !_platform.destroyed ? _platform : null; } /** * Provides additional options to the bootstraping process. * * * @record */ export function BootstrapOptions() { } if (false) { /** * Optionally specify which `NgZone` should be used. * * - Provide your own `NgZone` instance. * - `zone.js` - Use default `NgZone` which requires `Zone.js`. * - `noop` - Use `NoopNgZone` which does nothing. * @type {?|undefined} */ BootstrapOptions.prototype.ngZone; } /** * The Angular platform is the entry point for Angular on a web page. Each page * has exactly one platform, and services (such as reflection) which are common * to every Angular application running on the page are bound in its scope. * * A page's platform is initialized implicitly when a platform is created via a platform factory * (e.g. {\@link platformBrowser}), or explicitly by calling the {\@link createPlatform} function. * * \@publicApi */ export class PlatformRef { /** * \@internal * @param {?} _injector */ constructor(_injector) { this._injector = _injector; this._modules = []; this._destroyListeners = []; this._destroyed = false; } /** * Creates an instance of an `\@NgModule` for the given platform * for offline compilation. * * \@usageNotes * ### Simple Example * * ```typescript * my_module.ts: * * \@NgModule({ * imports: [BrowserModule] * }) * class MyModule {} * * main.ts: * import {MyModuleNgFactory} from './my_module.ngfactory'; * import {platformBrowser} from '\@angular/platform-browser'; * * let moduleRef = platformBrowser().bootstrapModuleFactory(MyModuleNgFactory); * ``` * @template M * @param {?} moduleFactory * @param {?=} options * @return {?} */ bootstrapModuleFactory(moduleFactory, options) { // Note: We need to create the NgZone _before_ we instantiate the module, // as instantiating the module creates some providers eagerly. // So we create a mini parent injector that just contains the new NgZone and // pass that as parent to the NgModuleFactory. /** @type {?} */ const ngZoneOption = options ? options.ngZone : undefined; /** @type {?} */ const ngZone = getNgZone(ngZoneOption); /** @type {?} */ const providers = [{ provide: NgZone, useValue: ngZone }]; // Attention: Don't use ApplicationRef.run here, // as we want to be sure that all possible constructor calls are inside `ngZone.run`! return ngZone.run((/** * @return {?} */ () => { /** @type {?} */ const ngZoneInjector = Injector.create({ providers: providers, parent: this.injector, name: moduleFactory.moduleType.name }); /** @type {?} */ const moduleRef = (/** @type {?} */ (moduleFactory.create(ngZoneInjector))); /** @type {?} */ const exceptionHandler = moduleRef.injector.get(ErrorHandler, null); if (!exceptionHandler) { throw new Error('No ErrorHandler. Is platform module (BrowserModule) included?'); } // If the `LOCALE_ID` provider is defined at bootstrap we set the value for runtime i18n (ivy) if (ivyEnabled) { /** @type {?} */ const localeId = moduleRef.injector.get(LOCALE_ID, DEFAULT_LOCALE_ID); setLocaleId(localeId || DEFAULT_LOCALE_ID); } moduleRef.onDestroy((/** * @return {?} */ () => remove(this._modules, moduleRef))); (/** @type {?} */ (ngZone)).runOutsideAngular((/** * @return {?} */ () => (/** @type {?} */ (ngZone)).onError.subscribe({ next: (/** * @param {?} error * @return {?} */ (error) => { exceptionHandler.handleError(error); }) }))); return _callAndReportToErrorHandler(exceptionHandler, (/** @type {?} */ (ngZone)), (/** * @return {?} */ () => { /** @type {?} */ const initStatus = moduleRef.injector.get(ApplicationInitStatus); initStatus.runInitializers(); return initStatus.donePromise.then((/** * @return {?} */ () => { this._moduleDoBootstrap(moduleRef); return moduleRef; })); })); })); } /** * Creates an instance of an `\@NgModule` for a given platform using the given runtime compiler. * * \@usageNotes * ### Simple Example * * ```typescript * \@NgModule({ * imports: [BrowserModule] * }) * class MyModule {} * * let moduleRef = platformBrowser().bootstrapModule(MyModule); * ``` * * @template M * @param {?} moduleType * @param {?=} compilerOptions * @return {?} */ bootstrapModule(moduleType, compilerOptions = []) { /** @type {?} */ const options = optionsReducer({}, compilerOptions); return compileNgModuleFactory(this.injector, options, moduleType) .then((/** * @param {?} moduleFactory * @return {?} */ moduleFactory => this.bootstrapModuleFactory(moduleFactory, options))); } /** * @private * @param {?} moduleRef * @return {?} */ _moduleDoBootstrap(moduleRef) { /** @type {?} */ const appRef = (/** @type {?} */ (moduleRef.injector.get(ApplicationRef))); if (moduleRef._bootstrapComponents.length > 0) { moduleRef._bootstrapComponents.forEach((/** * @param {?} f * @return {?} */ f => appRef.bootstrap(f))); } else if (moduleRef.instance.ngDoBootstrap) { moduleRef.instance.ngDoBootstrap(appRef); } else { throw new Error(`The module ${stringify(moduleRef.instance.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ` + `Please define one of these.`); } this._modules.push(moduleRef); } /** * Register a listener to be called when the platform is disposed. * @param {?} callback * @return {?} */ onDestroy(callback) { this._destroyListeners.push(callback); } /** * Retrieve the platform {\@link Injector}, which is the parent injector for * every Angular application on the page and provides singleton providers. * @return {?} */ get injector() { return this._injector; } /** * Destroy the Angular platform and all Angular applications on the page. * @return {?} */ destroy() { if (this._destroyed) { throw new Error('The platform has already been destroyed!'); } this._modules.slice().forEach((/** * @param {?} module * @return {?} */ module => module.destroy())); this._destroyListeners.forEach((/** * @param {?} listener * @return {?} */ listener => listener())); this._destroyed = true; } /** * @return {?} */ get destroyed() { return this._destroyed; } } PlatformRef.decorators = [ { type: Injectable } ]; /** @nocollapse */ PlatformRef.ctorParameters = () => [ { type: Injector } ]; if (false) { /** * @type {?} * @private */ PlatformRef.prototype._modules; /** * @type {?} * @private */ PlatformRef.prototype._destroyListeners; /** * @type {?} * @private */ PlatformRef.prototype._destroyed; /** * @type {?} * @private */ PlatformRef.prototype._injector; } /** * @param {?=} ngZoneOption * @return {?} */ function getNgZone(ngZoneOption) { /** @type {?} */ let ngZone; if (ngZoneOption === 'noop') { ngZone = new NoopNgZone(); } else { ngZone = (ngZoneOption === 'zone.js' ? undefined : ngZoneOption) || new NgZone({ enableLongStackTrace: isDevMode() }); } return ngZone; } /** * @param {?} errorHandler * @param {?} ngZone * @param {?} callback * @return {?} */ function _callAndReportToErrorHandler(errorHandler, ngZone, callback) { try { /** @type {?} */ const result = callback(); if (isPromise(result)) { return result.catch((/** * @param {?} e * @return {?} */ (e) => { ngZone.runOutsideAngular((/** * @return {?} */ () => errorHandler.handleError(e))); // rethrow as the exception handler might not do it throw e; })); } return result; } catch (e) { ngZone.runOutsideAngular((/** * @return {?} */ () => errorHandler.handleError(e))); // rethrow as the exception handler might not do it throw e; } } /** * @template T * @param {?} dst * @param {?} objs * @return {?} */ function optionsReducer(dst, objs) { if (Array.isArray(objs)) { dst = objs.reduce(optionsReducer, dst); } else { dst = Object.assign({}, dst, ((/** @type {?} */ (objs)))); } return dst; } /** * A reference to an Angular application running on a page. * * \@usageNotes * * {\@a is-stable-examples} * ### isStable examples and caveats * * Note two important points about `isStable`, demonstrated in the examples below: * - the application will never be stable if you start any kind * of recurrent asynchronous task when the application starts * (for example for a polling process, started with a `setInterval`, a `setTimeout` * or using RxJS operators like `interval`); * - the `isStable` Observable runs outside of the Angular zone. * * Let's imagine that you start a recurrent task * (here incrementing a counter, using RxJS `interval`), * and at the same time subscribe to `isStable`. * * ``` * constructor(appRef: ApplicationRef) { * appRef.isStable.pipe( * filter(stable => stable) * ).subscribe(() => console.log('App is stable now'); * interval(1000).subscribe(counter => console.log(counter)); * } * ``` * In this example, `isStable` will never emit `true`, * and the trace "App is stable now" will never get logged. * * If you want to execute something when the app is stable, * you have to wait for the application to be stable * before starting your polling process. * * ``` * constructor(appRef: ApplicationRef) { * appRef.isStable.pipe( * first(stable => stable), * tap(stable => console.log('App is stable now')), * switchMap(() => interval(1000)) * ).subscribe(counter => console.log(counter)); * } * ``` * In this example, the trace "App is stable now" will be logged * and then the counter starts incrementing every second. * * Note also that this Observable runs outside of the Angular zone, * which means that the code in the subscription * to this Observable will not trigger the change detection. * * Let's imagine that instead of logging the counter value, * you update a field of your component * and display it in its template. * * ``` * constructor(appRef: ApplicationRef) { * appRef.isStable.pipe( * first(stable => stable), * switchMap(() => interval(1000)) * ).subscribe(counter => this.value = counter); * } * ``` * As the `isStable` Observable runs outside the zone, * the `value` field will be updated properly, * but the template will not be refreshed! * * You'll have to manually trigger the change detection to update the template. * * ``` * constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) { * appRef.isStable.pipe( * first(stable => stable), * switchMap(() => interval(1000)) * ).subscribe(counter => { * this.value = counter; * cd.detectChanges(); * }); * } * ``` * * Or make the subscription callback run inside the zone. * * ``` * constructor(appRef: ApplicationRef, zone: NgZone) { * appRef.isStable.pipe( * first(stable => stable), * switchMap(() => interval(1000)) * ).subscribe(counter => zone.run(() => this.value = counter)); * } * ``` * * \@publicApi */ export class ApplicationRef { /** * \@internal * @param {?} _zone * @param {?} _console * @param {?} _injector * @param {?} _exceptionHandler * @param {?} _componentFactoryResolver * @param {?} _initStatus */ constructor(_zone, _console, _injector, _exceptionHandler, _componentFactoryResolver, _initStatus) { this._zone = _zone; this._console = _console; this._injector = _injector; this._exceptionHandler = _exceptionHandler; this._componentFactoryResolver = _componentFactoryResolver; this._initStatus = _initStatus; this._bootstrapListeners = []; this._views = []; this._runningTick = false; this._enforceNoNewChanges = false; this._stable = true; /** * Get a list of component types registered to this application. * This list is populated even before the component is created. */ this.componentTypes = []; /** * Get a list of components registered to this application. */ this.components = []; this._enforceNoNewChanges = isDevMode(); this._zone.onMicrotaskEmpty.subscribe({ next: (/** * @return {?} */ () => { this._zone.run((/** * @return {?} */ () => { this.tick(); })); }) }); /** @type {?} */ const isCurrentlyStable = new Observable((/** * @param {?} observer * @return {?} */ (observer) => { this._stable = this._zone.isStable && !this._zone.hasPendingMacrotasks && !this._zone.hasPendingMicrotasks; this._zone.runOutsideAngular((/** * @return {?} */ () => { observer.next(this._stable); observer.complete(); })); })); /** @type {?} */ const isStable = new Observable((/** * @param {?} observer * @return {?} */ (observer) => { // Create the subscription to onStable outside the Angular Zone so that // the callback is run outside the Angular Zone. /** @type {?} */ let stableSub; this._zone.runOutsideAngular((/** * @return {?} */ () => { stableSub = this._zone.onStable.subscribe((/** * @return {?} */ () => { NgZone.assertNotInAngularZone(); // Check whether there are no pending macro/micro tasks in the next tick // to allow for NgZone to update the state. scheduleMicroTask((/** * @return {?} */ () => { if (!this._stable && !this._zone.hasPendingMacrotasks && !this._zone.hasPendingMicrotasks) { this._stable = true; observer.next(true); } })); })); })); /** @type {?} */ const unstableSub = this._zone.onUnstable.subscribe((/** * @return {?} */ () => { NgZone.assertInAngularZone(); if (this._stable) { this._stable = false; this._zone.runOutsideAngular((/** * @return {?} */ () => { observer.next(false); })); } })); return (/** * @return {?} */ () => { stableSub.unsubscribe(); unstableSub.unsubscribe(); }); })); ((/** @type {?} */ (this))).isStable = merge(isCurrentlyStable, isStable.pipe(share())); } /** * Bootstrap a new component at the root level of the application. * * \@usageNotes * ### Bootstrap process * * When bootstrapping a new root component into an application, Angular mounts the * specified application component onto DOM elements identified by the componentType's * selector and kicks off automatic change detection to finish initializing the component. * * Optionally, a component can be mounted onto a DOM element that does not match the * componentType's selector. * * ### Example * {\@example core/ts/platform/platform.ts region='longform'} * @template C * @param {?} componentOrFactory * @param {?=} rootSelectorOrNode * @return {?} */ bootstrap(componentOrFactory, rootSelectorOrNode) { if (!this._initStatus.done) { throw new Error('Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.'); } /** @type {?} */ let componentFactory; if (componentOrFactory instanceof ComponentFactory) { componentFactory = componentOrFactory; } else { componentFactory = (/** @type {?} */ (this._componentFactoryResolver.resolveComponentFactory(componentOrFactory))); } this.componentTypes.push(componentFactory.componentType); // Create a factory associated with the current module if it's not bound to some other /** @type {?} */ const ngModule = isBoundToModule(componentFactory) ? null : this._injector.get(NgModuleRef); /** @type {?} */ const selectorOrNode = rootSelectorOrNode || componentFactory.selector; /** @type {?} */ const compRef = componentFactory.create(Injector.NULL, [], selectorOrNode, ngModule); compRef.onDestroy((/** * @return {?} */ () => { this._unloadComponent(compRef); })); /** @type {?} */ const testability = compRef.injector.get(Testability, null); if (testability) { compRef.injector.get(TestabilityRegistry) .registerApplication(compRef.location.nativeElement, testability); } this._loadComponent(compRef); if (isDevMode()) { this._console.log(`Angular is running in the development mode. Call enableProdMode() to enable the production mode.`); } return compRef; } /** * Invoke this method to explicitly process change detection and its side-effects. * * In development mode, `tick()` also performs a second change detection cycle to ensure that no * further changes are detected. If additional changes are picked up during this second cycle, * bindings in the app have side-effects that cannot be resolved in a single change detection * pass. * In this case, Angular throws an error, since an Angular application can only have one change * detection pass during which all change detection must complete. * @return {?} */ tick() { if (this._runningTick) { throw new Error('ApplicationRef.tick is called recursively'); } /** @type {?} */ const scope = ApplicationRef._tickScope(); try { this._runningTick = true; for (let view of this._views) { view.detectChanges(); } if (this._enforceNoNewChanges) { for (let view of this._views) { view.checkNoChanges(); } } } catch (e) { // Attention: Don't rethrow as it could cancel subscriptions to Observables! this._zone.runOutsideAngular((/** * @return {?} */ () => this._exceptionHandler.handleError(e))); } finally { this._runningTick = false; wtfLeave(scope); } } /** * Attaches a view so that it will be dirty checked. * The view will be automatically detached when it is destroyed. * This will throw if the view is already attached to a ViewContainer. * @param {?} viewRef * @return {?} */ attachView(viewRef) { /** @type {?} */ const view = ((/** @type {?} */ (viewRef))); this._views.push(view); view.attachToAppRef(this); } /** * Detaches a view from dirty checking again. * @param {?} viewRef * @return {?} */ detachView(viewRef) { /** @type {?} */ const view = ((/** @type {?} */ (viewRef))); remove(this._views, view); view.detachFromAppRef(); } /** * @private * @param {?} componentRef * @return {?} */ _loadComponent(componentRef) { this.attachView(componentRef.hostView); this.tick(); this.components.push(componentRef); // Get the listeners lazily to prevent DI cycles. /** @type {?} */ const listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []).concat(this._bootstrapListeners); listeners.forEach((/** * @param {?} listener * @return {?} */ (listener) => listener(componentRef))); } /** * @private * @param {?} componentRef * @return {?} */ _unloadComponent(componentRef) { this.detachView(componentRef.hostView); remove(this.components, componentRef); } /** * \@internal * @return {?} */ ngOnDestroy() { // TODO(alxhub): Dispose of the NgZone. this._views.slice().forEach((/** * @param {?} view * @return {?} */ (view) => view.destroy())); } /** * Returns the number of attached views. * @return {?} */ get viewCount() { return this._views.length; } } /** * \@internal */ ApplicationRef._tickScope = wtfCreateScope('ApplicationRef#tick()'); ApplicationRef.decorators = [ { type: Injectable } ]; /** @nocollapse */ ApplicationRef.ctorParameters = () => [ { type: NgZone }, { type: Console }, { type: Injector }, { type: ErrorHandler }, { type: ComponentFactoryResolver }, { type: ApplicationInitStatus } ]; if (false) { /** * \@internal * @type {?} */ ApplicationRef._tickScope; /** * @type {?} * @private */ ApplicationRef.prototype._bootstrapListeners; /** * @type {?} * @private */ ApplicationRef.prototype._views; /** * @type {?} * @private */ ApplicationRef.prototype._runningTick; /** * @type {?} * @private */ ApplicationRef.prototype._enforceNoNewChanges; /** * @type {?} * @private */ ApplicationRef.prototype._stable; /** * Get a list of component types registered to this application. * This list is populated even before the component is created. * @type {?} */ ApplicationRef.prototype.componentTypes; /** * Get a list of components registered to this application. * @type {?} */ ApplicationRef.prototype.components; /** * Returns an Observable that indicates when the application is stable or unstable. * * @see [Usage notes](#is-stable-examples) for examples and caveats when using this API. * @type {?} */ ApplicationRef.prototype.isStable; /** * @type {?} * @private */ ApplicationRef.prototype._zone; /** * @type {?} * @private */ ApplicationRef.prototype._console; /** * @type {?} * @private */ ApplicationRef.prototype._injector; /** * @type {?} * @private */ ApplicationRef.prototype._exceptionHandler; /** * @type {?} * @private */ ApplicationRef.prototype._componentFactoryResolver; /** * @type {?} * @private */ ApplicationRef.prototype._initStatus; } /** * @template T * @param {?} list * @param {?} el * @return {?} */ function remove(list, el) { /** @type {?} */ const index = list.indexOf(el); if (index > -1) { list.splice(index, 1); } } /** * @param {?} parts * @return {?} */ function _mergeArrays(parts) { /** @type {?} */ const result = []; parts.forEach((/** * @param {?} part * @return {?} */ (part) => part && result.push(...part))); return result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb25fcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFDLFVBQVUsRUFBMEIsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBaUIsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQ3JGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBZSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzVHLE9BQU8sRUFBdUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFN0YsT0FBTyxFQUFDLHVDQUF1QyxFQUFFLHlCQUF5QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDL0csT0FBTyxFQUFhLGNBQWMsRUFBRSxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGVBQWUsSUFBSSxpQkFBaUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFFOUMsU0FBc0I7O0lBRXRCLHNCQUFzQixHQUVZLGdDQUFnQzs7Ozs7Ozs7QUFFdEUsU0FBUyxnQ0FBZ0MsQ0FDckMsUUFBa0IsRUFBRSxPQUF3QixFQUM1QyxVQUFtQjs7VUFDZixlQUFlLEdBQW9CLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDOztVQUNoRSxRQUFRLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFELE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7Ozs7Ozs7O0FBRUQsTUFBTSxVQUFVLGlDQUFpQyxDQUM3QyxRQUFrQixFQUFFLE9BQXdCLEVBQzVDLFVBQW1CO0lBQ3JCLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7VUFDdEMsYUFBYSxHQUFHLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDO0lBRXZELElBQUksdUNBQXVDLEVBQUUsRUFBRTtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDdkM7O1VBRUssZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7VUFDcEUsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHOzs7O0lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBQSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUMsQ0FBQztJQUUvRSxnRkFBZ0Y7SUFDaEYscUZBQXFGO0lBQ3JGLG1GQUFtRjtJQUNuRiwwQ0FBMEM7SUFDMUMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUN2Qzs7VUFFSyxRQUFRLEdBQUcsaUJBQWlCLEVBQUU7O1VBQzlCLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQzs7VUFDbEUsY0FBYyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQ3BFLHFGQUFxRjtJQUNyRix1RkFBdUY7SUFDdkYsT0FBTyx5QkFBeUI7Ozs7SUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDO1NBQzVFLElBQUk7OztJQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBQyxDQUFDO0FBQ2pDLENBQUM7O0lBRUcsZUFBZSxHQUE0Qyx5QkFBeUI7Ozs7OztBQUV4RixNQUFNLFVBQVUseUJBQXlCLENBQUksRUFBdUI7SUFDbEUsT0FBTyxFQUFFLFlBQVksNkJBQTZCLENBQUM7QUFDckQsQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLDBCQUEwQixDQUFJLEVBQXVCO0lBQ25FLE9BQU8sQ0FBQyxtQkFBQSxFQUFFLEVBQXlCLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFDdkQsQ0FBQzs7QUFFRCxNQUFNLE9BQU8sd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQVUsb0JBQW9CLENBQUM7Ozs7OztBQVN6RixNQUFNLE9BQU8sWUFBWTs7Ozs7SUFDdkIsWUFBbUIsSUFBWSxFQUFTLEtBQVU7UUFBL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQUs7SUFBRyxDQUFDO0NBQ3ZEOzs7SUFEYSw0QkFBbUI7O0lBQUUsNkJBQWlCOzs7Ozs7Ozs7O0FBU3BELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBa0I7SUFDL0MsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztRQUNqQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsK0VBQStFLENBQUMsQ0FBQztLQUN0RjtJQUNELFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDOztVQUNoQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUM7SUFDdEQsSUFBSSxLQUFLO1FBQUUsS0FBSyxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUMsQ0FBQztJQUNoRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDOzs7Ozs7Ozs7O0FBT0QsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxxQkFBa0YsRUFDbEYsSUFBWSxFQUFFLFlBQThCLEVBQUU7O1VBRTFDLElBQUksR0FBRyxhQUFhLElBQUksRUFBRTs7VUFDMUIsTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQztJQUN2Qzs7OztJQUFPLENBQUMsaUJBQW1DLEVBQUUsRUFBRSxFQUFFOztZQUMzQyxRQUFRLEdBQUcsV0FBVyxFQUFFO1FBQzVCLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkUsSUFBSSxxQkFBcUIsRUFBRTtnQkFDekIscUJBQXFCLENBQ2pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pGO2lCQUFNOztzQkFDQyxpQkFBaUIsR0FDbkIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQztnQkFDOUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQzthQUM3RTtTQUNGO1FBQ0QsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxFQUFDO0FBQ0osQ0FBQzs7Ozs7Ozs7QUFPRCxNQUFNLFVBQVUsY0FBYyxDQUFDLGFBQWtCOztVQUN6QyxRQUFRLEdBQUcsV0FBVyxFQUFFO0lBRTlCLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDeEM7SUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0ZBQXNGLENBQUMsQ0FBQztLQUM3RjtJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7Ozs7Ozs7QUFPRCxNQUFNLFVBQVUsZUFBZTtJQUM3QixJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFDckMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQzs7Ozs7OztBQU9ELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDOUQsQ0FBQzs7Ozs7OztBQU9ELHNDQVNDOzs7Ozs7Ozs7O0lBREMsa0NBQWlDOzs7Ozs7Ozs7Ozs7QUFjbkMsTUFBTSxPQUFPLFdBQVc7Ozs7O0lBTXRCLFlBQW9CLFNBQW1CO1FBQW5CLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFML0IsYUFBUSxHQUF1QixFQUFFLENBQUM7UUFDbEMsc0JBQWlCLEdBQWUsRUFBRSxDQUFDO1FBQ25DLGVBQVUsR0FBWSxLQUFLLENBQUM7SUFHTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF3QjNDLHNCQUFzQixDQUFJLGFBQWlDLEVBQUUsT0FBMEI7Ozs7OztjQU0vRSxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTOztjQUNuRCxNQUFNLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQzs7Y0FDaEMsU0FBUyxHQUFxQixDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDekUsZ0RBQWdEO1FBQ2hELHFGQUFxRjtRQUNyRixPQUFPLE1BQU0sQ0FBQyxHQUFHOzs7UUFBQyxHQUFHLEVBQUU7O2tCQUNmLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUNsQyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFDLENBQUM7O2tCQUNqRixTQUFTLEdBQUcsbUJBQXdCLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUE7O2tCQUN4RSxnQkFBZ0IsR0FBaUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztZQUNqRixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQzthQUNsRjtZQUNELDhGQUE4RjtZQUM5RixJQUFJLFVBQVUsRUFBRTs7c0JBQ1IsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztnQkFDckUsV0FBVyxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsU0FBUyxDQUFDLFNBQVM7OztZQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFDLENBQUM7WUFDNUQsbUJBQUEsTUFBTSxFQUFFLENBQUMsaUJBQWlCOzs7WUFDdEIsR0FBRyxFQUFFLENBQUMsbUJBQUEsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDNUIsRUFBQyxJQUFJOzs7O2dCQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBQyxDQUFDLEVBQUMsQ0FBQztZQUMzRSxPQUFPLDRCQUE0QixDQUFDLGdCQUFnQixFQUFFLG1CQUFBLE1BQU0sRUFBRTs7O1lBQUUsR0FBRyxFQUFFOztzQkFDN0QsVUFBVSxHQUEwQixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDdkYsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM3QixPQUFPLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSTs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNuQyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQyxFQUFDLENBQUM7WUFDTCxDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0JELGVBQWUsQ0FDWCxVQUFtQixFQUFFLGtCQUNxQixFQUFFOztjQUN4QyxPQUFPLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUM7UUFDbkQsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUM7YUFDNUQsSUFBSTs7OztRQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBQyxDQUFDO0lBQ2xGLENBQUM7Ozs7OztJQUVPLGtCQUFrQixDQUFDLFNBQW1DOztjQUN0RCxNQUFNLEdBQUcsbUJBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQWtCO1FBQ3ZFLElBQUksU0FBUyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0MsU0FBUyxDQUFDLG9CQUFvQixDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztTQUNsRTthQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7WUFDM0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQ1gsY0FBYyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsNEdBQTRHO2dCQUNuSyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7Ozs7O0lBS0QsU0FBUyxDQUFDLFFBQW9CLElBQVUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7OztJQU1oRixJQUFJLFFBQVEsS0FBZSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOzs7OztJQUtuRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTzs7OztRQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU87Ozs7UUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7OztJQUVELElBQUksU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7OztZQW5JNUMsVUFBVTs7OztZQTFNeUIsUUFBUTs7Ozs7OztJQTRNMUMsK0JBQTBDOzs7OztJQUMxQyx3Q0FBMkM7Ozs7O0lBQzNDLGlDQUFvQzs7Ozs7SUFHeEIsZ0NBQTJCOzs7Ozs7QUErSHpDLFNBQVMsU0FBUyxDQUFDLFlBQTBDOztRQUN2RCxNQUFjO0lBRWxCLElBQUksWUFBWSxLQUFLLE1BQU0sRUFBRTtRQUMzQixNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsTUFBTSxHQUFHLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDNUQsSUFBSSxNQUFNLENBQUMsRUFBQyxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsRUFBQyxDQUFDLENBQUM7S0FDckQ7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDOzs7Ozs7O0FBRUQsU0FBUyw0QkFBNEIsQ0FDakMsWUFBMEIsRUFBRSxNQUFjLEVBQUUsUUFBbUI7SUFDakUsSUFBSTs7Y0FDSSxNQUFNLEdBQUcsUUFBUSxFQUFFO1FBQ3pCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sTUFBTSxDQUFDLEtBQUs7Ozs7WUFBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUM3QixNQUFNLENBQUMsaUJBQWlCOzs7Z0JBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUM1RCxtREFBbUQ7Z0JBQ25ELE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQyxFQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE1BQU0sQ0FBQyxpQkFBaUI7OztRQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztRQUM1RCxtREFBbUQ7UUFDbkQsTUFBTSxDQUFDLENBQUM7S0FDVDtBQUNILENBQUM7Ozs7Ozs7QUFFRCxTQUFTLGNBQWMsQ0FBbUIsR0FBUSxFQUFFLElBQWE7SUFDL0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN4QztTQUFNO1FBQ0wsR0FBRyxxQkFBTyxHQUFHLEVBQUssQ0FBQyxtQkFBQSxJQUFJLEVBQU8sQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnR0QsTUFBTSxPQUFPLGNBQWM7Ozs7Ozs7Ozs7SUE2QnpCLFlBQ1ksS0FBYSxFQUFVLFFBQWlCLEVBQVUsU0FBbUIsRUFDckUsaUJBQStCLEVBQy9CLHlCQUFtRCxFQUNuRCxXQUFrQztRQUhsQyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUFVLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDckUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFjO1FBQy9CLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBOUJ0Qyx3QkFBbUIsR0FBNkMsRUFBRSxDQUFDO1FBQ25FLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBQy9CLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUN0QyxZQUFPLEdBQUcsSUFBSSxDQUFDOzs7OztRQU1QLG1CQUFjLEdBQWdCLEVBQUUsQ0FBQzs7OztRQUtqQyxlQUFVLEdBQXdCLEVBQUUsQ0FBQztRQWdCbkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsRUFBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUNqQyxFQUFDLElBQUk7OztZQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRzs7O1lBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBQyxDQUFDLENBQUM7O2NBRXpELGlCQUFpQixHQUFHLElBQUksVUFBVTs7OztRQUFVLENBQUMsUUFBMkIsRUFBRSxFQUFFO1lBQ2hGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtnQkFDbEUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCOzs7WUFBQyxHQUFHLEVBQUU7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUM7O2NBRUksUUFBUSxHQUFHLElBQUksVUFBVTs7OztRQUFVLENBQUMsUUFBMkIsRUFBRSxFQUFFOzs7O2dCQUduRSxTQUF1QjtZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjs7O1lBQUMsR0FBRyxFQUFFO2dCQUNoQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUzs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDN0MsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBRWhDLHdFQUF3RTtvQkFDeEUsMkNBQTJDO29CQUMzQyxpQkFBaUI7OztvQkFBQyxHQUFHLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7NEJBQ2pELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTs0QkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NEJBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3JCO29CQUNILENBQUMsRUFBQyxDQUFDO2dCQUNMLENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUM7O2tCQUVHLFdBQVcsR0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUzs7O1lBQUMsR0FBRyxFQUFFO2dCQUNyRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUI7OztvQkFBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7aUJBQy9EO1lBQ0gsQ0FBQyxFQUFDO1lBRUY7OztZQUFPLEdBQUcsRUFBRTtnQkFDVixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hCLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQUM7UUFDSixDQUFDLEVBQUM7UUFFRixDQUFDLG1CQUFBLElBQUksRUFBa0MsQ0FBQyxDQUFDLFFBQVE7WUFDN0MsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWtCRCxTQUFTLENBQUksa0JBQStDLEVBQUUsa0JBQStCO1FBRTNGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtZQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLCtJQUErSSxDQUFDLENBQUM7U0FDdEo7O1lBQ0csZ0JBQXFDO1FBQ3pDLElBQUksa0JBQWtCLFlBQVksZ0JBQWdCLEVBQUU7WUFDbEQsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7U0FDdkM7YUFBTTtZQUNMLGdCQUFnQjtnQkFDWixtQkFBQSxJQUFJLENBQUMseUJBQXlCLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1NBQ2xGO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7OztjQUduRCxRQUFRLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDOztjQUNyRixjQUFjLEdBQUcsa0JBQWtCLElBQUksZ0JBQWdCLENBQUMsUUFBUTs7Y0FDaEUsT0FBTyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDO1FBRXBGLE9BQU8sQ0FBQyxTQUFTOzs7UUFBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQzs7Y0FDdkQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7UUFDM0QsSUFBSSxXQUFXLEVBQUU7WUFDZixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDcEMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLElBQUksU0FBUyxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDYixrR0FBa0csQ0FBQyxDQUFDO1NBQ3pHO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7Ozs7Ozs7Ozs7O0lBWUQsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7O2NBRUssS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLEVBQUU7UUFDekMsSUFBSTtZQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzdCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDNUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUN2QjthQUNGO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjs7O1lBQUMsR0FBRyxFQU