{"version":3,"sources":["packages/platform-browser/platform-browser.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","platformBrowser","common","core","this","i0","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","constructor","prototype","create","urlParsingNode","GenericBrowserDomAdapter","_super","call","supportsDOMEvents","ɵDomAdapter","BrowserDomAdapter","apply","arguments","makeCurrent","ɵsetRootDomAdapter","getProperty","el","name","log","error","window","console","logGroup","group","logGroupEnd","groupEnd","onAndCancel","evt","listener","addEventListener","removeEventListener","dispatchEvent","remove","node","parentNode","removeChild","getValue","value","createElement","tagName","doc","getDefaultDocument","createHtmlDocument","document","implementation","createHTMLDocument","isElementNode","nodeType","Node","ELEMENT_NODE","isShadowRoot","DocumentFragment","getGlobalEventTarget","target","body","getHistory","history","getLocation","location","getBaseHref","href","getBaseElementHref","baseElement","querySelector","getAttribute","relativePath","url","setAttribute","pathname","charAt","resetBaseElement","getUserAgent","navigator","userAgent","performanceNow","performance","now","Date","getTime","supportsCookies","getCookie","ɵparseCookieValue","cookie","TRANSITION_ID","InjectionToken","appInitializerFactory","transitionId","injector","get","ApplicationInitStatus","donePromise","then","dom","ɵgetDOM","slice","querySelectorAll","filter","forEach","SERVER_TRANSITION_PROVIDERS","provide","APP_INITIALIZER","useFactory","deps","DOCUMENT","Injector","multi","BrowserGetTestability","init","setTestabilityGetter","addToWindow","registry","ɵglobal","elem","findInAncestors","testability","findTestabilityInTree","Error","getAllTestabilities","getAllRootElements","push","callback","testabilities","count","length","didWork","decrement","didWork_","whenStable","t","getTestability","host","parentElement","exportNgVar","COMPILED","CORE_TOKENS","ApplicationRef","NgZone","inspectNativeElementR2","element","ɵgetDebugNodeR2","_createNgProbeR2","coreTokens","assign","_ngProbeTokensToMap","tokens","reduce","prev","token","ELEMENT_PROBE_PROVIDERS__PRE_R3__","NgProbeToken","Optional","ELEMENT_PROBE_PROVIDERS","EVENT_MANAGER_PLUGINS","EventManager","plugins","_zone","_this","_eventNameToPlugin","Map","manager","_plugins","reverse","eventName","handler","_findPluginFor","addGlobalEventListener","getZone","plugin","i","plugin_1","supports","set","decorators","type","Injectable","ctorParameters","Inject","args","EventManagerPlugin","_doc","SharedStylesHost","_stylesSet","Set","addStyles","styles","additions","style","has","add","onStylesAdded","getAllStyles","from","DomSharedStylesHost","_hostNodes","head","_addStylesToHost","styleNodes","styleEl","textContent","appendChild","addHost","hostNode","removeHost","removeStyle","delete","ngOnDestroy","styleNode","undefined","NAMESPACE_URIS","svg","xhtml","xlink","xml","xmlns","COMPONENT_REGEX","shimContentAttribute","componentShortId","replace","shimHostAttribute","flattenStyles","compId","isArray","decoratePreventDefault","eventHandler","event","preventDefault","returnValue","DomRendererFactory2","eventManager","sharedStylesHost","appId","rendererByCompId","defaultRenderer","DefaultDomRenderer2","createRenderer","encapsulation","ViewEncapsulation","Emulated","renderer","id","EmulatedEncapsulationDomRenderer2","applyToHost","ShadowDom","ShadowDomRenderer","begin","end","String","APP_ID","data","destroy","namespace","createElementNS","createComment","createText","createTextNode","parent","newChild","insertBefore","refChild","oldChild","selectRootElement","selectorOrNode","preserveContent","nextSibling","namespaceUri","setAttributeNS","removeAttribute","removeAttributeNS","addClass","classList","removeClass","setStyle","flags","RendererStyleFlags2","DashCase","Important","setProperty","removeProperty","setValue","nodeValue","listen","charCodeAt","component","contentAttr","hostAttr","hostEl","shadowRoot","attachShadow","mode","nodeOrShadowRoot","DomEventsPlugin","EVENT_NAMES","pan","panstart","panmove","panend","pancancel","panleft","panright","panup","pandown","pinch","pinchstart","pinchmove","pinchend","pinchcancel","pinchin","pinchout","press","pressup","rotate","rotatestart","rotatemove","rotateend","rotatecancel","swipe","swipeleft","swiperight","swipeup","swipedown","tap","doubletap","HAMMER_GESTURE_CONFIG","HAMMER_LOADER","HammerGestureConfig","events","overrides","buildHammer","mc","Hammer","options","enable","HammerGesturesPlugin","_config","loader","_loaderPromise","toLowerCase","isCustomEvent","zone","cancelRegistration_1","deregister_1","catch","runOutsideAngular","eventObj","runGuarded","on","off","indexOf","ɵConsole","HammerModule","HAMMER_PROVIDERS__PRE_R3__","useClass","HAMMER_PROVIDERS","NgModule","providers","DomSanitizer","MODIFIER_KEYS","_keyMap","\b","\t","","\u001b","Del","Esc","Left","Right","Up","Down","Menu","Scroll","Win","_chromeNumKeyPadMap","A","B","C","D","E","F","G","H","I","J","K","M","N","O","`","","MODIFIER_KEY_GETTERS","alt","altKey","control","ctrlKey","meta","metaKey","shift","shiftKey","KeyEventsPlugin","parseEventName","parsedEvent","outsideHandler","eventCallback","parts","split","domEventName","key","_normalizeKey","pop","fullKey","modifierName","index","splice","result","getEventFullKey","getEventKey","keyIdentifier","startsWith","fromCharCode","parseInt","substring","modifierGetter","keyName","domSanitizerImplFactory","DomSanitizerImpl","ɵprov","ɵɵdefineInjectable","DomSanitizer_Factory","ɵɵinject","providedIn","useExisting","forwardRef","sanitize","ctx","SecurityContext","NONE","HTML","ɵallowSanitizationBypassAndThrow","ɵunwrapSafeValue","ɵ_sanitizeHtml","toString","STYLE","SCRIPT","URL","ɵgetSanitizationBypassType","ɵ_sanitizeUrl","RESOURCE_URL","bypassSecurityTrustHtml","ɵbypassSanitizationTrustHtml","bypassSecurityTrustStyle","ɵbypassSanitizationTrustStyle","bypassSecurityTrustScript","ɵbypassSanitizationTrustScript","bypassSecurityTrustUrl","ɵbypassSanitizationTrustUrl","bypassSecurityTrustResourceUrl","ɵbypassSanitizationTrustResourceUrl","initDomAdapter","errorHandler","ErrorHandler","_document","ɵsetDocument","DomSanitizerImpl_Factory","INJECTOR","INTERNAL_BROWSER_PLATFORM_PROVIDERS","PLATFORM_ID","useValue","ɵPLATFORM_BROWSER_ID","PLATFORM_INITIALIZER","BROWSER_SANITIZATION_PROVIDERS","Sanitizer","createPlatformFactory","platformCore","BROWSER_MODULE_PROVIDERS","ɵINJECTOR_SCOPE","RendererFactory2","Testability","BrowserModule","parentModule","withServerTransition","params","ngModule","createMeta","Meta","CommonModule","ApplicationModule","SkipSelf","_dom","addTag","tag","forceCreation","_getOrCreateElement","addTags","tags","getTag","attrSelector","getTags","list","updateTag","selector","_parseSelector","_setMetaElementAttributes","removeTag","removeTagElement","_containsAttributes","getElementsByTagName","keys","prop","_getMetaKeyMap","attr","every","META_KEYS_MAP","httpEquiv","createTitle","Title","getTitle","title","setTitle","newTitle","BrowserTransferStateModule","win","ChangeDetectionPerfRecord","msPerTick","numTicks","AngularProfiler","ref","appRef","timeChangeDetection","config","record","isProfilerAvailable","profile","start","tick","profileEnd","toFixed","TransferState","store","onSerializeCallbacks","initState","transferState","defaultValue","hasKey","onSerialize","toJson","e","warn","JSON","stringify","initTransferState","script","getElementById","initialState","parse","unescapeHtml","text","unescapedText","&a;","&q;","&s;","&l;","&g;","s","By","all","css","debugElement","nativeElement","elementMatches","n","matches","msMatchesSelector","webkitMatchesSelector","directive","debugNode","providerTokens","VERSION","Version","defineProperty","enumerable","disableDebugTools","enableDebugTools","makeStateKey","ɵBROWSER_SANITIZATION_PROVIDERS","ɵBROWSER_SANITIZATION_PROVIDERS__POST_R3__","ɵBrowserDomAdapter","ɵBrowserGetTestability","ɵDomEventsPlugin","ɵDomRendererFactory2","ɵDomSanitizerImpl","ɵDomSharedStylesHost","ɵELEMENT_PROBE_PROVIDERS","ɵELEMENT_PROBE_PROVIDERS__POST_R3__","ɵHAMMER_PROVIDERS__POST_R3__","ɵHammerGesturesPlugin","ɵINTERNAL_BROWSER_PLATFORM_PROVIDERS","ɵKeyEventsPlugin","ɵNAMESPACE_URIS","ɵSharedStylesHost","ɵTRANSITION_ID","ɵangular_packages_platform_browser_platform_browser_a","ɵangular_packages_platform_browser_platform_browser_b","ɵangular_packages_platform_browser_platform_browser_c","ɵangular_packages_platform_browser_platform_browser_d","ɵangular_packages_platform_browser_platform_browser_e","ɵangular_packages_platform_browser_platform_browser_f","ɵangular_packages_platform_browser_platform_browser_g","ɵangular_packages_platform_browser_platform_browser_h","ɵangular_packages_platform_browser_platform_browser_i","ɵangular_packages_platform_browser_platform_browser_j","ɵangular_packages_platform_browser_platform_browser_k","ɵangular_packages_platform_browser_platform_browser_l","ɵangular_packages_platform_browser_platform_browser_m","ɵangular_packages_platform_browser_platform_browser_n","ɵangular_packages_platform_browser_platform_browser_o","ɵescapeHtml","escapeHtml","escapedText","&","\"","'","<",">","ɵflattenStyles","ɵinitDomAdapter","ɵshimContentAttribute","ɵshimHostAttribute"],"mappings":"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","sourcesContent":["/**\n * @license Angular v11.2.14\n * (c) 2010-2021 Google LLC. https://angular.io/\n * License: MIT\n */\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('@angular/platform-browser', ['exports', '@angular/common', '@angular/core'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.platformBrowser = {}), global.ng.common, global.ng.core));\n}(this, (function (exports, common, i0) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (b.hasOwnProperty(p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(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\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    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    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, exports) {\n        for (var p in m)\n            if (p !== \"default\" && !exports.hasOwnProperty(p))\n                __createBinding(exports, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    ;\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (Object.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\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     */\n    var GenericBrowserDomAdapter = /** @class */ (function (_super) {\n        __extends(GenericBrowserDomAdapter, _super);\n        function GenericBrowserDomAdapter() {\n            return _super.call(this) || this;\n        }\n        GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () {\n            return true;\n        };\n        return GenericBrowserDomAdapter;\n    }(common.ɵDomAdapter));\n\n    var ɵ0 = function () {\n        if (i0.ɵglobal['Node']) {\n            return i0.ɵglobal['Node'].prototype.contains || function (node) {\n                return !!(this.compareDocumentPosition(node) & 16);\n            };\n        }\n        return undefined;\n    };\n    var nodeContains = (ɵ0)();\n    /**\n     * A `DomAdapter` powered by full browser DOM APIs.\n     *\n     * @security Tread carefully! Interacting with the DOM directly is dangerous and\n     * can introduce XSS risks.\n     */\n    /* tslint:disable:requireParameterType no-console */\n    var BrowserDomAdapter = /** @class */ (function (_super) {\n        __extends(BrowserDomAdapter, _super);\n        function BrowserDomAdapter() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        BrowserDomAdapter.makeCurrent = function () {\n            common.ɵsetRootDomAdapter(new BrowserDomAdapter());\n        };\n        BrowserDomAdapter.prototype.getProperty = function (el, name) {\n            return el[name];\n        };\n        BrowserDomAdapter.prototype.log = function (error) {\n            if (window.console) {\n                window.console.log && window.console.log(error);\n            }\n        };\n        BrowserDomAdapter.prototype.logGroup = function (error) {\n            if (window.console) {\n                window.console.group && window.console.group(error);\n            }\n        };\n        BrowserDomAdapter.prototype.logGroupEnd = function () {\n            if (window.console) {\n                window.console.groupEnd && window.console.groupEnd();\n            }\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 () {\n                el.removeEventListener(evt, listener, false);\n            };\n        };\n        BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) {\n            el.dispatchEvent(evt);\n        };\n        BrowserDomAdapter.prototype.remove = function (node) {\n            if (node.parentNode) {\n                node.parentNode.removeChild(node);\n            }\n            return node;\n        };\n        BrowserDomAdapter.prototype.getValue = function (el) {\n            return el.value;\n        };\n        BrowserDomAdapter.prototype.createElement = function (tagName, doc) {\n            doc = doc || this.getDefaultDocument();\n            return doc.createElement(tagName);\n        };\n        BrowserDomAdapter.prototype.createHtmlDocument = function () {\n            return document.implementation.createHTMLDocument('fakeTitle');\n        };\n        BrowserDomAdapter.prototype.getDefaultDocument = function () {\n            return document;\n        };\n        BrowserDomAdapter.prototype.isElementNode = function (node) {\n            return node.nodeType === Node.ELEMENT_NODE;\n        };\n        BrowserDomAdapter.prototype.isShadowRoot = function (node) {\n            return node instanceof DocumentFragment;\n        };\n        BrowserDomAdapter.prototype.getGlobalEventTarget = function (doc, target) {\n            if (target === 'window') {\n                return window;\n            }\n            if (target === 'document') {\n                return doc;\n            }\n            if (target === 'body') {\n                return doc.body;\n            }\n            return null;\n        };\n        BrowserDomAdapter.prototype.getHistory = function () {\n            return window.history;\n        };\n        BrowserDomAdapter.prototype.getLocation = function () {\n            return window.location;\n        };\n        BrowserDomAdapter.prototype.getBaseHref = function (doc) {\n            var href = getBaseElementHref();\n            return href == null ? null : relativePath(href);\n        };\n        BrowserDomAdapter.prototype.resetBaseElement = function () {\n            baseElement = null;\n        };\n        BrowserDomAdapter.prototype.getUserAgent = function () {\n            return window.navigator.userAgent;\n        };\n        BrowserDomAdapter.prototype.performanceNow = function () {\n            // performance.now() is not available in all browsers, see\n            // https://caniuse.com/high-resolution-time\n            return window.performance && window.performance.now ? window.performance.now() :\n                new Date().getTime();\n        };\n        BrowserDomAdapter.prototype.supportsCookies = function () {\n            return true;\n        };\n        BrowserDomAdapter.prototype.getCookie = function (name) {\n            return common.ɵparseCookieValue(document.cookie, name);\n        };\n        return BrowserDomAdapter;\n    }(GenericBrowserDomAdapter));\n    var baseElement = null;\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 urlParsingNode;\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    /**\n     * @license\n     * Copyright Google LLC 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     * An id that identifies a particular application being bootstrapped, that should\n     * match across the client/server boundary.\n     */\n    var TRANSITION_ID = new i0.InjectionToken('TRANSITION_ID');\n    function appInitializerFactory(transitionId, document, injector) {\n        return function () {\n            // Wait for all application initializers to be completed before removing the styles set by\n            // the server.\n            injector.get(i0.ApplicationInitStatus).donePromise.then(function () {\n                var dom = common.ɵgetDOM();\n                var styles = Array.prototype.slice.apply(document.querySelectorAll(\"style[ng-transition]\"));\n                styles.filter(function (el) { return el.getAttribute('ng-transition') === transitionId; })\n                    .forEach(function (el) { return dom.remove(el); });\n            });\n        };\n    }\n    var SERVER_TRANSITION_PROVIDERS = [\n        {\n            provide: i0.APP_INITIALIZER,\n            useFactory: appInitializerFactory,\n            deps: [TRANSITION_ID, common.DOCUMENT, i0.Injector],\n            multi: true\n        },\n    ];\n\n    /**\n     * @license\n     * Copyright Google LLC 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 BrowserGetTestability = /** @class */ (function () {\n        function BrowserGetTestability() {\n        }\n        BrowserGetTestability.init = function () {\n            i0.setTestabilityGetter(new BrowserGetTestability());\n        };\n        BrowserGetTestability.prototype.addToWindow = function (registry) {\n            i0.ɵglobal['getAngularTestability'] = function (elem, findInAncestors) {\n                if (findInAncestors === void 0) { findInAncestors = true; }\n                var 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            i0.ɵglobal['getAllAngularTestabilities'] = function () { return registry.getAllTestabilities(); };\n            i0.ɵglobal['getAllAngularRootElements'] = function () { return registry.getAllRootElements(); };\n            var whenAllStable = function (callback /** TODO #9100 */) {\n                var testabilities = i0.ɵglobal['getAllAngularTestabilities']();\n                var count = testabilities.length;\n                var didWork = false;\n                var 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 (!i0.ɵglobal['frameworkStabilizers']) {\n                i0.ɵglobal['frameworkStabilizers'] = [];\n            }\n            i0.ɵglobal['frameworkStabilizers'].push(whenAllStable);\n        };\n        BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {\n            if (elem == null) {\n                return null;\n            }\n            var t = registry.getTestability(elem);\n            if (t != null) {\n                return t;\n            }\n            else if (!findInAncestors) {\n                return null;\n            }\n            if (common.ɵgetDOM().isShadowRoot(elem)) {\n                return this.findTestabilityInTree(registry, elem.host, true);\n            }\n            return this.findTestabilityInTree(registry, elem.parentElement, true);\n        };\n        return BrowserGetTestability;\n    }());\n\n    /**\n     * @license\n     * Copyright Google LLC 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 CAMEL_CASE_REGEXP = /([A-Z])/g;\n    var DASH_CASE_REGEXP = /-([a-z])/g;\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] = arguments[_i];\n            }\n            return '-' + m[1].toLowerCase();\n        });\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] = arguments[_i];\n            }\n            return m[1].toUpperCase();\n        });\n    }\n    /**\n     * Exports the value under a given `name` in the global property `ng`. For example `ng.probe` if\n     * `name` is `'probe'`.\n     * @param name Name under which it will be exported. Keep in mind this will be a property of the\n     * global `ng` object.\n     * @param value The value to export.\n     */\n    function exportNgVar(name, value) {\n        if (typeof COMPILED === 'undefined' || !COMPILED) {\n            // Note: we can't export `ng` when using closure enhanced optimization as:\n            // - closure declares globals itself for minified names, which sometimes clobber our `ng` global\n            // - we can't declare a closure extern as the namespace `ng` is already used within Google\n            //   for typings for angularJS (via `goog.provide('ng....')`).\n            var ng = i0.ɵglobal['ng'] = i0.ɵglobal['ng'] || {};\n            ng[name] = value;\n        }\n    }\n\n    /**\n     * @license\n     * Copyright Google LLC 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 ɵ0$1 = function () { return ({\n        'ApplicationRef': i0.ApplicationRef,\n        'NgZone': i0.NgZone,\n    }); };\n    var CORE_TOKENS = (ɵ0$1)();\n    var INSPECT_GLOBAL_NAME = 'probe';\n    var CORE_TOKENS_GLOBAL_NAME = '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     */\n    function inspectNativeElementR2(element) {\n        return i0.ɵgetDebugNodeR2(element);\n    }\n    function _createNgProbeR2(coreTokens) {\n        exportNgVar(INSPECT_GLOBAL_NAME, inspectNativeElementR2);\n        exportNgVar(CORE_TOKENS_GLOBAL_NAME, Object.assign(Object.assign({}, CORE_TOKENS), _ngProbeTokensToMap(coreTokens || [])));\n        return function () { return inspectNativeElementR2; };\n    }\n    function _ngProbeTokensToMap(tokens) {\n        return tokens.reduce(function (prev, t) { return (prev[t.name] = t.token, prev); }, {});\n    }\n    /**\n     * In Ivy, we don't support NgProbe because we have our own set of testing utilities\n     * with more robust functionality.\n     *\n     * We shouldn't bring in NgProbe because it prevents DebugNode and friends from\n     * tree-shaking properly.\n     */\n    var ELEMENT_PROBE_PROVIDERS__POST_R3__ = [];\n    /**\n     * Providers which support debugging Angular applications (e.g. via `ng.probe`).\n     */\n    var ELEMENT_PROBE_PROVIDERS__PRE_R3__ = [\n        {\n            provide: i0.APP_INITIALIZER,\n            useFactory: _createNgProbeR2,\n            deps: [\n                [i0.NgProbeToken, new i0.Optional()],\n            ],\n            multi: true,\n        },\n    ];\n    var ELEMENT_PROBE_PROVIDERS = ELEMENT_PROBE_PROVIDERS__PRE_R3__;\n\n    /**\n     * @license\n     * Copyright Google LLC 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     * The injection token for the event-manager plug-in service.\n     *\n     * @publicApi\n     */\n    var EVENT_MANAGER_PLUGINS = new i0.InjectionToken('EventManagerPlugins');\n    /**\n     * An injectable service that provides event management for Angular\n     * through a browser plug-in.\n     *\n     * @publicApi\n     */\n    var EventManager = /** @class */ (function () {\n        /**\n         * Initializes an instance of the event-manager service.\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         * Registers a handler for a specific element and event.\n         *\n         * @param element The HTML element to receive event notifications.\n         * @param eventName The name of the event to listen for.\n         * @param handler A function to call when the notification occurs. Receives the\n         * event object as an argument.\n         * @returns  A callback function that can be used to remove the handler.\n         */\n        EventManager.prototype.addEventListener = function (element, eventName, handler) {\n            var plugin = this._findPluginFor(eventName);\n            return plugin.addEventListener(element, eventName, handler);\n        };\n        /**\n         * Registers a global handler for an event in a target view.\n         *\n         * @param target A target for global event notifications. One of \"window\", \"document\", or \"body\".\n         * @param eventName The name of the event to listen for.\n         * @param handler A function to call when the notification occurs. Receives the\n         * event object as an argument.\n         * @returns A callback function that can be used to remove the handler.\n         */\n        EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {\n            var plugin = this._findPluginFor(eventName);\n            return plugin.addGlobalEventListener(target, eventName, handler);\n        };\n        /**\n         * Retrieves the compilation zone in which event listeners are registered.\n         */\n        EventManager.prototype.getZone = function () {\n            return this._zone;\n        };\n        /** @internal */\n        EventManager.prototype._findPluginFor = function (eventName) {\n            var plugin = this._eventNameToPlugin.get(eventName);\n            if (plugin) {\n                return plugin;\n            }\n            var plugins = this._plugins;\n            for (var i = 0; i < plugins.length; i++) {\n                var 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        return EventManager;\n    }());\n    EventManager.decorators = [\n        { type: i0.Injectable }\n    ];\n    EventManager.ctorParameters = function () { return [\n        { type: Array, decorators: [{ type: i0.Inject, args: [EVENT_MANAGER_PLUGINS,] }] },\n        { type: i0.NgZone }\n    ]; };\n    var EventManagerPlugin = /** @class */ (function () {\n        function EventManagerPlugin(_doc) {\n            this._doc = _doc;\n        }\n        EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {\n            var target = common.ɵgetDOM().getGlobalEventTarget(this._doc, 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        return EventManagerPlugin;\n    }());\n\n    var SharedStylesHost = /** @class */ (function () {\n        function SharedStylesHost() {\n            /** @internal */\n            this._stylesSet = new Set();\n        }\n        SharedStylesHost.prototype.addStyles = function (styles) {\n            var _this = this;\n            var 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        SharedStylesHost.prototype.onStylesAdded = function (additions) { };\n        SharedStylesHost.prototype.getAllStyles = function () {\n            return Array.from(this._stylesSet);\n        };\n        return SharedStylesHost;\n    }());\n    SharedStylesHost.decorators = [\n        { type: i0.Injectable }\n    ];\n    var DomSharedStylesHost = /** @class */ (function (_super) {\n        __extends(DomSharedStylesHost, _super);\n        function DomSharedStylesHost(_doc) {\n            var _this = _super.call(this) || this;\n            _this._doc = _doc;\n            // Maps all registered host nodes to a list of style nodes that have been added to the host node.\n            _this._hostNodes = new Map();\n            _this._hostNodes.set(_doc.head, []);\n            return _this;\n        }\n        DomSharedStylesHost.prototype._addStylesToHost = function (styles, host, styleNodes) {\n            var _this = this;\n            styles.forEach(function (style) {\n                var styleEl = _this._doc.createElement('style');\n                styleEl.textContent = style;\n                styleNodes.push(host.appendChild(styleEl));\n            });\n        };\n        DomSharedStylesHost.prototype.addHost = function (hostNode) {\n            var styleNodes = [];\n            this._addStylesToHost(this._stylesSet, hostNode, styleNodes);\n            this._hostNodes.set(hostNode, styleNodes);\n        };\n        DomSharedStylesHost.prototype.removeHost = function (hostNode) {\n            var styleNodes = this._hostNodes.get(hostNode);\n            if (styleNodes) {\n                styleNodes.forEach(removeStyle);\n            }\n            this._hostNodes.delete(hostNode);\n        };\n        DomSharedStylesHost.prototype.onStylesAdded = function (additions) {\n            var _this = this;\n            this._hostNodes.forEach(function (styleNodes, hostNode) {\n                _this._addStylesToHost(additions, hostNode, styleNodes);\n            });\n        };\n        DomSharedStylesHost.prototype.ngOnDestroy = function () {\n            this._hostNodes.forEach(function (styleNodes) { return styleNodes.forEach(removeStyle); });\n        };\n        return DomSharedStylesHost;\n    }(SharedStylesHost));\n    DomSharedStylesHost.decorators = [\n        { type: i0.Injectable }\n    ];\n    DomSharedStylesHost.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n    function removeStyle(styleNode) {\n        common.ɵgetDOM().remove(styleNode);\n    }\n\n    var NAMESPACE_URIS = {\n        'svg': 'http://www.w3.org/2000/svg',\n        'xhtml': 'http://www.w3.org/1999/xhtml',\n        'xlink': 'http://www.w3.org/1999/xlink',\n        'xml': 'http://www.w3.org/XML/1998/namespace',\n        'xmlns': 'http://www.w3.org/2000/xmlns/',\n    };\n    var COMPONENT_REGEX = /%COMP%/g;\n    var NG_DEV_MODE = typeof ngDevMode === 'undefined' || !!ngDevMode;\n    var COMPONENT_VARIABLE = '%COMP%';\n    var HOST_ATTR = \"_nghost-\" + COMPONENT_VARIABLE;\n    var CONTENT_ATTR = \"_ngcontent-\" + COMPONENT_VARIABLE;\n    function shimContentAttribute(componentShortId) {\n        return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);\n    }\n    function shimHostAttribute(componentShortId) {\n        return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);\n    }\n    function flattenStyles(compId, styles, target) {\n        for (var i = 0; i < styles.length; i++) {\n            var 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    function decoratePreventDefault(eventHandler) {\n        // `DebugNode.triggerEventHandler` needs to know if the listener was created with\n        // decoratePreventDefault or is a listener added outside the Angular context so it can handle the\n        // two differently. In the first case, the special '__ngUnwrap__' token is passed to the unwrap\n        // the listener (see below).\n        return function (event) {\n            // Ivy uses '__ngUnwrap__' as a special token that allows us to unwrap the function\n            // so that it can be invoked programmatically by `DebugNode.triggerEventHandler`. The debug_node\n            // can inspect the listener toString contents for the existence of this special token. Because\n            // the token is a string literal, it is ensured to not be modified by compiled code.\n            if (event === '__ngUnwrap__') {\n                return eventHandler;\n            }\n            var allowDefaultBehavior = eventHandler(event);\n            if (allowDefaultBehavior === false) {\n                // TODO(tbosch): move preventDefault into event plugins...\n                event.preventDefault();\n                event.returnValue = false;\n            }\n            return undefined;\n        };\n    }\n    var hasLoggedNativeEncapsulationWarning = false;\n    var DomRendererFactory2 = /** @class */ (function () {\n        function DomRendererFactory2(eventManager, sharedStylesHost, appId) {\n            this.eventManager = eventManager;\n            this.sharedStylesHost = sharedStylesHost;\n            this.appId = appId;\n            this.rendererByCompId = new Map();\n            this.defaultRenderer = new DefaultDomRenderer2(eventManager);\n        }\n        DomRendererFactory2.prototype.createRenderer = function (element, type) {\n            if (!element || !type) {\n                return this.defaultRenderer;\n            }\n            switch (type.encapsulation) {\n                case i0.ViewEncapsulation.Emulated: {\n                    var renderer = this.rendererByCompId.get(type.id);\n                    if (!renderer) {\n                        renderer = new EmulatedEncapsulationDomRenderer2(this.eventManager, this.sharedStylesHost, type, this.appId);\n                        this.rendererByCompId.set(type.id, renderer);\n                    }\n                    renderer.applyToHost(element);\n                    return renderer;\n                }\n                case 1:\n                case i0.ViewEncapsulation.ShadowDom:\n                    // TODO(FW-2290): remove the `case 1:` fallback logic and the warning in v12.\n                    if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n                        !hasLoggedNativeEncapsulationWarning && type.encapsulation === 1) {\n                        hasLoggedNativeEncapsulationWarning = true;\n                        console.warn('ViewEncapsulation.Native is no longer supported. Falling back to ViewEncapsulation.ShadowDom. The fallback will be removed in v12.');\n                    }\n                    return new ShadowDomRenderer(this.eventManager, this.sharedStylesHost, element, type);\n                default: {\n                    if (!this.rendererByCompId.has(type.id)) {\n                        var styles = flattenStyles(type.id, type.styles, []);\n                        this.sharedStylesHost.addStyles(styles);\n                        this.rendererByCompId.set(type.id, this.defaultRenderer);\n                    }\n                    return this.defaultRenderer;\n                }\n            }\n        };\n        DomRendererFactory2.prototype.begin = function () { };\n        DomRendererFactory2.prototype.end = function () { };\n        return DomRendererFactory2;\n    }());\n    DomRendererFactory2.decorators = [\n        { type: i0.Injectable }\n    ];\n    DomRendererFactory2.ctorParameters = function () { return [\n        { type: EventManager },\n        { type: DomSharedStylesHost },\n        { type: String, decorators: [{ type: i0.Inject, args: [i0.APP_ID,] }] }\n    ]; };\n    var DefaultDomRenderer2 = /** @class */ (function () {\n        function DefaultDomRenderer2(eventManager) {\n            this.eventManager = eventManager;\n            this.data = Object.create(null);\n        }\n        DefaultDomRenderer2.prototype.destroy = function () { };\n        DefaultDomRenderer2.prototype.createElement = function (name, namespace) {\n            if (namespace) {\n                // In cases where Ivy (not ViewEngine) is giving us the actual namespace, the look up by key\n                // will result in undefined, so we just return the namespace here.\n                return document.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);\n            }\n            return document.createElement(name);\n        };\n        DefaultDomRenderer2.prototype.createComment = function (value) {\n            return document.createComment(value);\n        };\n        DefaultDomRenderer2.prototype.createText = function (value) {\n            return document.createTextNode(value);\n        };\n        DefaultDomRenderer2.prototype.appendChild = function (parent, newChild) {\n            parent.appendChild(newChild);\n        };\n        DefaultDomRenderer2.prototype.insertBefore = function (parent, newChild, refChild) {\n            if (parent) {\n                parent.insertBefore(newChild, refChild);\n            }\n        };\n        DefaultDomRenderer2.prototype.removeChild = function (parent, oldChild) {\n            if (parent) {\n                parent.removeChild(oldChild);\n            }\n        };\n        DefaultDomRenderer2.prototype.selectRootElement = function (selectorOrNode, preserveContent) {\n            var el = typeof selectorOrNode === 'string' ? document.querySelector(selectorOrNode) :\n                selectorOrNode;\n            if (!el) {\n                throw new Error(\"The selector \\\"\" + selectorOrNode + \"\\\" did not match any elements\");\n            }\n            if (!preserveContent) {\n                el.textContent = '';\n            }\n            return el;\n        };\n        DefaultDomRenderer2.prototype.parentNode = function (node) {\n            return node.parentNode;\n        };\n        DefaultDomRenderer2.prototype.nextSibling = function (node) {\n            return node.nextSibling;\n        };\n        DefaultDomRenderer2.prototype.setAttribute = function (el, name, value, namespace) {\n            if (namespace) {\n                name = namespace + ':' + name;\n                // TODO(FW-811): Ivy may cause issues here because it's passing around\n                // full URIs for namespaces, therefore this lookup will fail.\n                var namespaceUri = NAMESPACE_URIS[namespace];\n                if (namespaceUri) {\n                    el.setAttributeNS(namespaceUri, name, value);\n                }\n                else {\n                    el.setAttribute(name, value);\n                }\n            }\n            else {\n                el.setAttribute(name, value);\n            }\n        };\n        DefaultDomRenderer2.prototype.removeAttribute = function (el, name, namespace) {\n            if (namespace) {\n                // TODO(FW-811): Ivy may cause issues here because it's passing around\n                // full URIs for namespaces, therefore this lookup will fail.\n                var namespaceUri = NAMESPACE_URIS[namespace];\n                if (namespaceUri) {\n                    el.removeAttributeNS(namespaceUri, name);\n                }\n                else {\n                    // TODO(FW-811): Since ivy is passing around full URIs for namespaces\n                    // this could result in properties like `http://www.w3.org/2000/svg:cx=\"123\"`,\n                    // which is wrong.\n                    el.removeAttribute(namespace + \":\" + name);\n                }\n            }\n            else {\n                el.removeAttribute(name);\n            }\n        };\n        DefaultDomRenderer2.prototype.addClass = function (el, name) {\n            el.classList.add(name);\n        };\n        DefaultDomRenderer2.prototype.removeClass = function (el, name) {\n            el.classList.remove(name);\n        };\n        DefaultDomRenderer2.prototype.setStyle = function (el, style, value, flags) {\n            if (flags & (i0.RendererStyleFlags2.DashCase | i0.RendererStyleFlags2.Important)) {\n                el.style.setProperty(style, value, flags & i0.RendererStyleFlags2.Important ? 'important' : '');\n            }\n            else {\n                el.style[style] = value;\n            }\n        };\n        DefaultDomRenderer2.prototype.removeStyle = function (el, style, flags) {\n            if (flags & i0.RendererStyleFlags2.DashCase) {\n                el.style.removeProperty(style);\n            }\n            else {\n                // IE requires '' instead of null\n                // see https://github.com/angular/angular/issues/7916\n                el.style[style] = '';\n            }\n        };\n        DefaultDomRenderer2.prototype.setProperty = function (el, name, value) {\n            NG_DEV_MODE && checkNoSyntheticProp(name, 'property');\n            el[name] = value;\n        };\n        DefaultDomRenderer2.prototype.setValue = function (node, value) {\n            node.nodeValue = value;\n        };\n        DefaultDomRenderer2.prototype.listen = function (target, event, callback) {\n            NG_DEV_MODE && checkNoSyntheticProp(event, 'listener');\n            if (typeof target === 'string') {\n                return this.eventManager.addGlobalEventListener(target, event, decoratePreventDefault(callback));\n            }\n            return this.eventManager.addEventListener(target, event, decoratePreventDefault(callback));\n        };\n        return DefaultDomRenderer2;\n    }());\n    var ɵ0$2 = function () { return '@'.charCodeAt(0); };\n    var AT_CHARCODE = (ɵ0$2)();\n    function checkNoSyntheticProp(name, nameKind) {\n        if (name.charCodeAt(0) === AT_CHARCODE) {\n            throw new Error(\"Found the synthetic \" + nameKind + \" \" + name + \". Please include either \\\"BrowserAnimationsModule\\\" or \\\"NoopAnimationsModule\\\" in your application.\");\n        }\n    }\n    var EmulatedEncapsulationDomRenderer2 = /** @class */ (function (_super) {\n        __extends(EmulatedEncapsulationDomRenderer2, _super);\n        function EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, component, appId) {\n            var _this = _super.call(this, eventManager) || this;\n            _this.component = component;\n            var styles = flattenStyles(appId + '-' + component.id, component.styles, []);\n            sharedStylesHost.addStyles(styles);\n            _this.contentAttr = shimContentAttribute(appId + '-' + component.id);\n            _this.hostAttr = shimHostAttribute(appId + '-' + component.id);\n            return _this;\n        }\n        EmulatedEncapsulationDomRenderer2.prototype.applyToHost = function (element) {\n            _super.prototype.setAttribute.call(this, element, this.hostAttr, '');\n        };\n        EmulatedEncapsulationDomRenderer2.prototype.createElement = function (parent, name) {\n            var el = _super.prototype.createElement.call(this, parent, name);\n            _super.prototype.setAttribute.call(this, el, this.contentAttr, '');\n            return el;\n        };\n        return EmulatedEncapsulationDomRenderer2;\n    }(DefaultDomRenderer2));\n    var ShadowDomRenderer = /** @class */ (function (_super) {\n        __extends(ShadowDomRenderer, _super);\n        function ShadowDomRenderer(eventManager, sharedStylesHost, hostEl, component) {\n            var _this = _super.call(this, eventManager) || this;\n            _this.sharedStylesHost = sharedStylesHost;\n            _this.hostEl = hostEl;\n            _this.shadowRoot = hostEl.attachShadow({ mode: 'open' });\n            _this.sharedStylesHost.addHost(_this.shadowRoot);\n            var styles = flattenStyles(component.id, component.styles, []);\n            for (var i = 0; i < styles.length; i++) {\n                var styleEl = document.createElement('style');\n                styleEl.textContent = styles[i];\n                _this.shadowRoot.appendChild(styleEl);\n            }\n            return _this;\n        }\n        ShadowDomRenderer.prototype.nodeOrShadowRoot = function (node) {\n            return node === this.hostEl ? this.shadowRoot : node;\n        };\n        ShadowDomRenderer.prototype.destroy = function () {\n            this.sharedStylesHost.removeHost(this.shadowRoot);\n        };\n        ShadowDomRenderer.prototype.appendChild = function (parent, newChild) {\n            return _super.prototype.appendChild.call(this, this.nodeOrShadowRoot(parent), newChild);\n        };\n        ShadowDomRenderer.prototype.insertBefore = function (parent, newChild, refChild) {\n            return _super.prototype.insertBefore.call(this, this.nodeOrShadowRoot(parent), newChild, refChild);\n        };\n        ShadowDomRenderer.prototype.removeChild = function (parent, oldChild) {\n            return _super.prototype.removeChild.call(this, this.nodeOrShadowRoot(parent), oldChild);\n        };\n        ShadowDomRenderer.prototype.parentNode = function (node) {\n            return this.nodeOrShadowRoot(_super.prototype.parentNode.call(this, this.nodeOrShadowRoot(node)));\n        };\n        return ShadowDomRenderer;\n    }(DefaultDomRenderer2));\n\n    var DomEventsPlugin = /** @class */ (function (_super) {\n        __extends(DomEventsPlugin, _super);\n        function DomEventsPlugin(doc) {\n            return _super.call(this, doc) || this;\n        }\n        // This plugin should come last in the list of plugins, because it accepts all\n        // events.\n        DomEventsPlugin.prototype.supports = function (eventName) {\n            return true;\n        };\n        DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            var _this = this;\n            element.addEventListener(eventName, handler, false);\n            return function () { return _this.removeEventListener(element, eventName, handler); };\n        };\n        DomEventsPlugin.prototype.removeEventListener = function (target, eventName, callback) {\n            return target.removeEventListener(eventName, callback);\n        };\n        return DomEventsPlugin;\n    }(EventManagerPlugin));\n    DomEventsPlugin.decorators = [\n        { type: i0.Injectable }\n    ];\n    DomEventsPlugin.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n\n    /**\n     * Supported HammerJS recognizer event names.\n     */\n    var 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        'doubletap': true\n    };\n    /**\n     * DI token for providing [HammerJS](https://hammerjs.github.io/) support to Angular.\n     * @see `HammerGestureConfig`\n     *\n     * @ngModule HammerModule\n     * @publicApi\n     */\n    var HAMMER_GESTURE_CONFIG = new i0.InjectionToken('HammerGestureConfig');\n    /**\n     * Injection token used to provide a {@link HammerLoader} to Angular.\n     *\n     * @publicApi\n     */\n    var HAMMER_LOADER = new i0.InjectionToken('HammerLoader');\n    /**\n     * An injectable [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n     * for gesture recognition. Configures specific event recognition.\n     * @publicApi\n     */\n    var HammerGestureConfig = /** @class */ (function () {\n        function HammerGestureConfig() {\n            /**\n             * A set of supported event names for gestures to be used in Angular.\n             * Angular supports all built-in recognizers, as listed in\n             * [HammerJS documentation](https://hammerjs.github.io/).\n             */\n            this.events = [];\n            /**\n             * Maps gesture event names to a set of configuration options\n             * that specify overrides to the default values for specific properties.\n             *\n             * The key is a supported event name to be configured,\n             * and the options object contains a set of properties, with override values\n             * to be applied to the named recognizer event.\n             * For example, to disable recognition of the rotate event, specify\n             *  `{\"rotate\": {\"enable\": false}}`.\n             *\n             * Properties that are not present take the HammerJS default values.\n             * For information about which properties are supported for which events,\n             * and their allowed and default values, see\n             * [HammerJS documentation](https://hammerjs.github.io/).\n             *\n             */\n            this.overrides = {};\n        }\n        /**\n         * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)\n         * and attaches it to a given HTML element.\n         * @param element The element that will recognize gestures.\n         * @returns A HammerJS event-manager object.\n         */\n        HammerGestureConfig.prototype.buildHammer = function (element) {\n            var mc = new Hammer(element, this.options);\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        return HammerGestureConfig;\n    }());\n    HammerGestureConfig.decorators = [\n        { type: i0.Injectable }\n    ];\n    /**\n     * Event plugin that adds Hammer support to an application.\n     *\n     * @ngModule HammerModule\n     */\n    var HammerGesturesPlugin = /** @class */ (function (_super) {\n        __extends(HammerGesturesPlugin, _super);\n        function HammerGesturesPlugin(doc, _config, console, loader) {\n            var _this = _super.call(this, doc) || this;\n            _this._config = _config;\n            _this.console = console;\n            _this.loader = loader;\n            _this._loaderPromise = null;\n            return _this;\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 && !this.loader) {\n                if (typeof ngDevMode === 'undefined' || ngDevMode) {\n                    this.console.warn(\"The \\\"\" + eventName + \"\\\" event cannot be bound because Hammer.JS is not \" +\n                        \"loaded and no custom loader has been specified.\");\n                }\n                return false;\n            }\n            return true;\n        };\n        HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            var _this = this;\n            var zone = this.manager.getZone();\n            eventName = eventName.toLowerCase();\n            // If Hammer is not present but a loader is specified, we defer adding the event listener\n            // until Hammer is loaded.\n            if (!window.Hammer && this.loader) {\n                this._loaderPromise = this._loaderPromise || this.loader();\n                // This `addEventListener` method returns a function to remove the added listener.\n                // Until Hammer is loaded, the returned function needs to *cancel* the registration rather\n                // than remove anything.\n                var cancelRegistration_1 = false;\n                var deregister_1 = function () {\n                    cancelRegistration_1 = true;\n                };\n                this._loaderPromise\n                    .then(function () {\n                    // If Hammer isn't actually loaded when the custom loader resolves, give up.\n                    if (!window.Hammer) {\n                        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n                            _this.console.warn(\"The custom HAMMER_LOADER completed, but Hammer.JS is not present.\");\n                        }\n                        deregister_1 = function () { };\n                        return;\n                    }\n                    if (!cancelRegistration_1) {\n                        // Now that Hammer is loaded and the listener is being loaded for real,\n                        // the deregistration function changes from canceling registration to removal.\n                        deregister_1 = _this.addEventListener(element, eventName, handler);\n                    }\n                })\n                    .catch(function () {\n                    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n                        _this.console.warn(\"The \\\"\" + eventName + \"\\\" event cannot be bound because the custom \" +\n                            \"Hammer.JS loader failed.\");\n                    }\n                    deregister_1 = function () { };\n                });\n                // Return a function that *executes* `deregister` (and not `deregister` itself) so that we\n                // can change the behavior of `deregister` once the listener is added. Using a closure in\n                // this way allows us to avoid any additional data structures to track listener removal.\n                return function () {\n                    deregister_1();\n                };\n            }\n            return zone.runOutsideAngular(function () {\n                // Creating the manager bind events, must be done outside of angular\n                var mc = _this._config.buildHammer(element);\n                var callback = function (eventObj) {\n                    zone.runGuarded(function () {\n                        handler(eventObj);\n                    });\n                };\n                mc.on(eventName, callback);\n                return function () {\n                    mc.off(eventName, callback);\n                    // destroy mc to prevent memory leak\n                    if (typeof mc.destroy === 'function') {\n                        mc.destroy();\n                    }\n                };\n            });\n        };\n        HammerGesturesPlugin.prototype.isCustomEvent = function (eventName) {\n            return this._config.events.indexOf(eventName) > -1;\n        };\n        return HammerGesturesPlugin;\n    }(EventManagerPlugin));\n    HammerGesturesPlugin.decorators = [\n        { type: i0.Injectable }\n    ];\n    HammerGesturesPlugin.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] },\n        { type: HammerGestureConfig, decorators: [{ type: i0.Inject, args: [HAMMER_GESTURE_CONFIG,] }] },\n        { type: i0.ɵConsole },\n        { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [HAMMER_LOADER,] }] }\n    ]; };\n    /**\n     * In Ivy, support for Hammer gestures is optional, so applications must\n     * import the `HammerModule` at root to turn on support. This means that\n     * Hammer-specific code can be tree-shaken away if not needed.\n     */\n    var HAMMER_PROVIDERS__POST_R3__ = [];\n    /**\n     * In View Engine, support for Hammer gestures is built-in by default.\n     */\n    var HAMMER_PROVIDERS__PRE_R3__ = [\n        {\n            provide: EVENT_MANAGER_PLUGINS,\n            useClass: HammerGesturesPlugin,\n            multi: true,\n            deps: [common.DOCUMENT, HAMMER_GESTURE_CONFIG, i0.ɵConsole, [new i0.Optional(), HAMMER_LOADER]]\n        },\n        { provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig, deps: [] },\n    ];\n    var HAMMER_PROVIDERS = HAMMER_PROVIDERS__PRE_R3__;\n    /**\n     * Adds support for HammerJS.\n     *\n     * Import this module at the root of your application so that Angular can work with\n     * HammerJS to detect gesture events.\n     *\n     * Note that applications still need to include the HammerJS script itself. This module\n     * simply sets up the coordination layer between HammerJS and Angular's EventManager.\n     *\n     * @publicApi\n     */\n    var HammerModule = /** @class */ (function () {\n        function HammerModule() {\n        }\n        return HammerModule;\n    }());\n    HammerModule.decorators = [\n        { type: i0.NgModule, args: [{ providers: HAMMER_PROVIDERS__PRE_R3__ },] }\n    ];\n\n    /**\n     * Defines supported modifiers for key events.\n     */\n    var MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];\n    var DOM_KEY_LOCATION_NUMPAD = 3;\n    // Map to convert some key or keyIdentifier values to what will be returned by getEventKey\n    var _keyMap = {\n        // The following values are here for cross-browser compatibility and to match the W3C standard\n        // cf https://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 _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 ɵ0$3 = function (event) { return event.altKey; }, ɵ1 = function (event) { return event.ctrlKey; }, ɵ2 = function (event) { return event.metaKey; }, ɵ3 = function (event) { return event.shiftKey; };\n    /**\n     * Retrieves modifiers from key-event objects.\n     */\n    var MODIFIER_KEY_GETTERS = {\n        'alt': ɵ0$3,\n        'control': ɵ1,\n        'meta': ɵ2,\n        'shift': ɵ3\n    };\n    /**\n     * @publicApi\n     * A browser plug-in that provides support for handling of key events in Angular.\n     */\n    var KeyEventsPlugin = /** @class */ (function (_super) {\n        __extends(KeyEventsPlugin, _super);\n        /**\n         * Initializes an instance of the browser plug-in.\n         * @param doc The document in which key events will be detected.\n         */\n        function KeyEventsPlugin(doc) {\n            return _super.call(this, doc) || this;\n        }\n        /**\n         * Reports whether a named key event is supported.\n         * @param eventName The event name to query.\n         * @return True if the named key event is supported.\n         */\n        KeyEventsPlugin.prototype.supports = function (eventName) {\n            return KeyEventsPlugin.parseEventName(eventName) != null;\n        };\n        /**\n         * Registers a handler for a specific element and key event.\n         * @param element The HTML element to receive event notifications.\n         * @param eventName The name of the key event to listen for.\n         * @param handler A function to call when the notification occurs. Receives the\n         * event object as an argument.\n         * @returns The key event that was registered.\n         */\n        KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n            var parsedEvent = KeyEventsPlugin.parseEventName(eventName);\n            var outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());\n            return this.manager.getZone().runOutsideAngular(function () {\n                return common.ɵgetDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler);\n            });\n        };\n        KeyEventsPlugin.parseEventName = function (eventName) {\n            var parts = eventName.toLowerCase().split('.');\n            var domEventName = parts.shift();\n            if ((parts.length === 0) || !(domEventName === 'keydown' || domEventName === 'keyup')) {\n                return null;\n            }\n            var key = KeyEventsPlugin._normalizeKey(parts.pop());\n            var fullKey = '';\n            MODIFIER_KEYS.forEach(function (modifierName) {\n                var 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            // NOTE: Please don't rewrite this as so, as it will break JSCompiler property renaming.\n            //       The code must remain in the `result['domEventName']` form.\n            // return {domEventName, fullKey};\n            var result = {};\n            result['domEventName'] = domEventName;\n            result['fullKey'] = fullKey;\n            return result;\n        };\n        KeyEventsPlugin.getEventFullKey = function (event) {\n            var fullKey = '';\n            var key = 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 modifierGetter = MODIFIER_KEY_GETTERS[modifierName];\n                    if (modifierGetter(event)) {\n                        fullKey += modifierName + '.';\n                    }\n                }\n            });\n            fullKey += key;\n            return fullKey;\n        };\n        /**\n         * Configures a handler callback for a key event.\n         * @param fullKey The event name that combines all simultaneous keystrokes.\n         * @param handler The function that responds to the key event.\n         * @param zone The zone in which the event occurred.\n         * @returns A callback function.\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        /** @internal */\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        return KeyEventsPlugin;\n    }(EventManagerPlugin));\n    KeyEventsPlugin.decorators = [\n        { type: i0.Injectable }\n    ];\n    KeyEventsPlugin.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n    function getEventKey(event) {\n        var key = event.key;\n        if (key == null) {\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            // https://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces\n            if (key == null) {\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    /**\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](https://g.co/ng/security).\n     *\n     * @publicApi\n     */\n    var DomSanitizer = /** @class */ (function () {\n        function DomSanitizer() {\n        }\n        return DomSanitizer;\n    }());\n    DomSanitizer.ɵprov = i0.ɵɵdefineInjectable({ factory: function DomSanitizer_Factory() { return i0.ɵɵinject(DomSanitizerImpl); }, token: DomSanitizer, providedIn: \"root\" });\n    DomSanitizer.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root', useExisting: i0.forwardRef(function () { return DomSanitizerImpl; }) },] }\n    ];\n    function domSanitizerImplFactory(injector) {\n        return new DomSanitizerImpl(injector.get(common.DOCUMENT));\n    }\n    var DomSanitizerImpl = /** @class */ (function (_super) {\n        __extends(DomSanitizerImpl, _super);\n        function DomSanitizerImpl(_doc) {\n            var _this = _super.call(this) || this;\n            _this._doc = _doc;\n            return _this;\n        }\n        DomSanitizerImpl.prototype.sanitize = function (ctx, value) {\n            if (value == null)\n                return null;\n            switch (ctx) {\n                case i0.SecurityContext.NONE:\n                    return value;\n                case i0.SecurityContext.HTML:\n                    if (i0.ɵallowSanitizationBypassAndThrow(value, \"HTML\" /* Html */)) {\n                        return i0.ɵunwrapSafeValue(value);\n                    }\n                    return i0.ɵ_sanitizeHtml(this._doc, String(value)).toString();\n                case i0.SecurityContext.STYLE:\n                    if (i0.ɵallowSanitizationBypassAndThrow(value, \"Style\" /* Style */)) {\n                        return i0.ɵunwrapSafeValue(value);\n                    }\n                    return value;\n                case i0.SecurityContext.SCRIPT:\n                    if (i0.ɵallowSanitizationBypassAndThrow(value, \"Script\" /* Script */)) {\n                        return i0.ɵunwrapSafeValue(value);\n                    }\n                    throw new Error('unsafe value used in a script context');\n                case i0.SecurityContext.URL:\n                    var type = i0.ɵgetSanitizationBypassType(value);\n                    if (i0.ɵallowSanitizationBypassAndThrow(value, \"URL\" /* Url */)) {\n                        return i0.ɵunwrapSafeValue(value);\n                    }\n                    return i0.ɵ_sanitizeUrl(String(value));\n                case i0.SecurityContext.RESOURCE_URL:\n                    if (i0.ɵallowSanitizationBypassAndThrow(value, \"ResourceURL\" /* ResourceUrl */)) {\n                        return i0.ɵunwrapSafeValue(value);\n                    }\n                    throw new Error('unsafe value used in a resource URL context (see https://g.co/ng/security#xss)');\n                default:\n                    throw new Error(\"Unexpected SecurityContext \" + ctx + \" (see https://g.co/ng/security#xss)\");\n            }\n        };\n        DomSanitizerImpl.prototype.bypassSecurityTrustHtml = function (value) {\n            return i0.ɵbypassSanitizationTrustHtml(value);\n        };\n        DomSanitizerImpl.prototype.bypassSecurityTrustStyle = function (value) {\n            return i0.ɵbypassSanitizationTrustStyle(value);\n        };\n        DomSanitizerImpl.prototype.bypassSecurityTrustScript = function (value) {\n            return i0.ɵbypassSanitizationTrustScript(value);\n        };\n        DomSanitizerImpl.prototype.bypassSecurityTrustUrl = function (value) {\n            return i0.ɵbypassSanitizationTrustUrl(value);\n        };\n        DomSanitizerImpl.prototype.bypassSecurityTrustResourceUrl = function (value) {\n            return i0.ɵbypassSanitizationTrustResourceUrl(value);\n        };\n        return DomSanitizerImpl;\n    }(DomSanitizer));\n    DomSanitizerImpl.ɵprov = i0.ɵɵdefineInjectable({ factory: function DomSanitizerImpl_Factory() { return domSanitizerImplFactory(i0.ɵɵinject(i0.INJECTOR)); }, token: DomSanitizerImpl, providedIn: \"root\" });\n    DomSanitizerImpl.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root', useFactory: domSanitizerImplFactory, deps: [i0.Injector] },] }\n    ];\n    DomSanitizerImpl.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n\n    /**\n     * @license\n     * Copyright Google LLC 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    function initDomAdapter() {\n        BrowserDomAdapter.makeCurrent();\n        BrowserGetTestability.init();\n    }\n    function errorHandler() {\n        return new i0.ErrorHandler();\n    }\n    function _document() {\n        // Tell ivy about the global document\n        i0.ɵsetDocument(document);\n        return document;\n    }\n    var ɵ0$4 = common.ɵPLATFORM_BROWSER_ID;\n    var INTERNAL_BROWSER_PLATFORM_PROVIDERS = [\n        { provide: i0.PLATFORM_ID, useValue: ɵ0$4 },\n        { provide: i0.PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true },\n        { provide: common.DOCUMENT, useFactory: _document, deps: [] },\n    ];\n    var BROWSER_SANITIZATION_PROVIDERS__PRE_R3__ = [\n        { provide: i0.Sanitizer, useExisting: DomSanitizer },\n        { provide: DomSanitizer, useClass: DomSanitizerImpl, deps: [common.DOCUMENT] },\n    ];\n    var BROWSER_SANITIZATION_PROVIDERS__POST_R3__ = [];\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](https://g.co/ng/security).\n     * @publicApi\n     */\n    var BROWSER_SANITIZATION_PROVIDERS = BROWSER_SANITIZATION_PROVIDERS__PRE_R3__;\n    /**\n     * A factory function that returns a `PlatformRef` instance associated with browser service\n     * providers.\n     *\n     * @publicApi\n     */\n    var platformBrowser = i0.createPlatformFactory(i0.platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);\n    var BROWSER_MODULE_PROVIDERS = [\n        BROWSER_SANITIZATION_PROVIDERS,\n        { provide: i0.ɵINJECTOR_SCOPE, useValue: 'root' },\n        { provide: i0.ErrorHandler, useFactory: errorHandler, deps: [] },\n        {\n            provide: EVENT_MANAGER_PLUGINS,\n            useClass: DomEventsPlugin,\n            multi: true,\n            deps: [common.DOCUMENT, i0.NgZone, i0.PLATFORM_ID]\n        },\n        { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [common.DOCUMENT] },\n        HAMMER_PROVIDERS,\n        {\n            provide: DomRendererFactory2,\n            useClass: DomRendererFactory2,\n            deps: [EventManager, DomSharedStylesHost, i0.APP_ID]\n        },\n        { provide: i0.RendererFactory2, useExisting: DomRendererFactory2 },\n        { provide: SharedStylesHost, useExisting: DomSharedStylesHost },\n        { provide: DomSharedStylesHost, useClass: DomSharedStylesHost, deps: [common.DOCUMENT] },\n        { provide: i0.Testability, useClass: i0.Testability, deps: [i0.NgZone] },\n        { provide: EventManager, useClass: EventManager, deps: [EVENT_MANAGER_PLUGINS, i0.NgZone] },\n        ELEMENT_PROBE_PROVIDERS,\n    ];\n    /**\n     * Exports required infrastructure for all Angular apps.\n     * Included by default in all Angular apps created with the CLI\n     * `new` command.\n     * Re-exports `CommonModule` and `ApplicationModule`, making their\n     * exports and providers available to all apps.\n     *\n     * @publicApi\n     */\n    var BrowserModule = /** @class */ (function () {\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        /**\n         * Configures a browser-based app to transition from a server-rendered app, if\n         * one is present on the page.\n         *\n         * @param params An object containing an identifier for the app to transition.\n         * The ID must match between the client and server versions of the app.\n         * @returns The reconfigured `BrowserModule` to import into the app's root `AppModule`.\n         */\n        BrowserModule.withServerTransition = function (params) {\n            return {\n                ngModule: BrowserModule,\n                providers: [\n                    { provide: i0.APP_ID, useValue: params.appId },\n                    { provide: TRANSITION_ID, useExisting: i0.APP_ID },\n                    SERVER_TRANSITION_PROVIDERS,\n                ],\n            };\n        };\n        return BrowserModule;\n    }());\n    BrowserModule.decorators = [\n        { type: i0.NgModule, args: [{ providers: BROWSER_MODULE_PROVIDERS, exports: [common.CommonModule, i0.ApplicationModule] },] }\n    ];\n    BrowserModule.ctorParameters = function () { return [\n        { type: BrowserModule, decorators: [{ type: i0.Optional }, { type: i0.SkipSelf }, { type: i0.Inject, args: [BrowserModule,] }] }\n    ]; };\n\n    /**\n     * @license\n     * Copyright Google LLC 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     * Factory to create a `Meta` service instance for the current DOM document.\n     */\n    function createMeta() {\n        return new Meta(i0.ɵɵinject(common.DOCUMENT));\n    }\n    /**\n     * A service for managing HTML `<meta>` tags.\n     *\n     * Properties of the `MetaDefinition` object match the attributes of the\n     * HTML `<meta>` tag. These tags define document metadata that is important for\n     * things like configuring a Content Security Policy, defining browser compatibility\n     * and security settings, setting HTTP Headers, defining rich content for social sharing,\n     * and Search Engine Optimization (SEO).\n     *\n     * To identify specific `<meta>` tags in a document, use an attribute selection\n     * string in the format `\"tag_attribute='value string'\"`.\n     * For example, an `attrSelector` value of `\"name='description'\"` matches a tag\n     * whose `name` attribute has the value `\"description\"`.\n     * Selectors are used with the `querySelector()` Document method,\n     * in the format `meta[{attrSelector}]`.\n     *\n     * @see [HTML meta tag](https://developer.mozilla.org/docs/Web/HTML/Element/meta)\n     * @see [Document.querySelector()](https://developer.mozilla.org/docs/Web/API/Document/querySelector)\n     *\n     *\n     * @publicApi\n     */\n    var Meta = /** @class */ (function () {\n        function Meta(_doc) {\n            this._doc = _doc;\n            this._dom = common.ɵgetDOM();\n        }\n        /**\n         * Retrieves or creates a specific `<meta>` tag element in the current HTML document.\n         * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n         * values in the provided tag definition, and verifies that all other attribute values are equal.\n         * If an existing element is found, it is returned and is not modified in any way.\n         * @param tag The definition of a `<meta>` element to match or create.\n         * @param forceCreation True to create a new element without checking whether one already exists.\n         * @returns The existing element with the same attributes and values if found,\n         * the new element if no match is found, or `null` if the tag parameter is not defined.\n         */\n        Meta.prototype.addTag = function (tag, forceCreation) {\n            if (forceCreation === void 0) { forceCreation = false; }\n            if (!tag)\n                return null;\n            return this._getOrCreateElement(tag, forceCreation);\n        };\n        /**\n         * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.\n         * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute\n         * values in the provided tag definition, and verifies that all other attribute values are equal.\n         * @param tags An array of tag definitions to match or create.\n         * @param forceCreation True to create new elements without checking whether they already exist.\n         * @returns The matching elements if found, or the new elements.\n         */\n        Meta.prototype.addTags = function (tags, forceCreation) {\n            var _this = this;\n            if (forceCreation === void 0) { forceCreation = false; }\n            if (!tags)\n                return [];\n            return tags.reduce(function (result, tag) {\n                if (tag) {\n                    result.push(_this._getOrCreateElement(tag, forceCreation));\n                }\n                return result;\n            }, []);\n        };\n        /**\n         * Retrieves a `<meta>` tag element in the current HTML document.\n         * @param attrSelector The tag attribute and value to match against, in the format\n         * `\"tag_attribute='value string'\"`.\n         * @returns The matching element, if any.\n         */\n        Meta.prototype.getTag = function (attrSelector) {\n            if (!attrSelector)\n                return null;\n            return this._doc.querySelector(\"meta[\" + attrSelector + \"]\") || null;\n        };\n        /**\n         * Retrieves a set of `<meta>` tag elements in the current HTML document.\n         * @param attrSelector The tag attribute and value to match against, in the format\n         * `\"tag_attribute='value string'\"`.\n         * @returns The matching elements, if any.\n         */\n        Meta.prototype.getTags = function (attrSelector) {\n            if (!attrSelector)\n                return [];\n            var list /*NodeList*/ = this._doc.querySelectorAll(\"meta[\" + attrSelector + \"]\");\n            return list ? [].slice.call(list) : [];\n        };\n        /**\n         * Modifies an existing `<meta>` tag element in the current HTML document.\n         * @param tag The tag description with which to replace the existing tag content.\n         * @param selector A tag attribute and value to match against, to identify\n         * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n         * If not supplied, matches a tag with the same `name` or `property` attribute value as the\n         * replacement tag.\n         * @return The modified element.\n         */\n        Meta.prototype.updateTag = function (tag, selector) {\n            if (!tag)\n                return null;\n            selector = selector || this._parseSelector(tag);\n            var meta = this.getTag(selector);\n            if (meta) {\n                return this._setMetaElementAttributes(tag, meta);\n            }\n            return this._getOrCreateElement(tag, true);\n        };\n        /**\n         * Removes an existing `<meta>` tag element from the current HTML document.\n         * @param attrSelector A tag attribute and value to match against, to identify\n         * an existing tag. A string in the format `\"tag_attribute=`value string`\"`.\n         */\n        Meta.prototype.removeTag = function (attrSelector) {\n            this.removeTagElement(this.getTag(attrSelector));\n        };\n        /**\n         * Removes an existing `<meta>` tag element from the current HTML document.\n         * @param meta The tag definition to match against to identify an existing tag.\n         */\n        Meta.prototype.removeTagElement = function (meta) {\n            if (meta) {\n                this._dom.remove(meta);\n            }\n        };\n        Meta.prototype._getOrCreateElement = function (meta, forceCreation) {\n            if (forceCreation === void 0) { forceCreation = false; }\n            if (!forceCreation) {\n                var selector = this._parseSelector(meta);\n                var elem = this.getTag(selector);\n                // It's allowed to have multiple elements with the same name so it's not enough to\n                // just check that element with the same name already present on the page. We also need to\n                // check if element has tag attributes\n                if (elem && this._containsAttributes(meta, elem))\n                    return elem;\n            }\n            var element = this._dom.createElement('meta');\n            this._setMetaElementAttributes(meta, element);\n            var head = this._doc.getElementsByTagName('head')[0];\n            head.appendChild(element);\n            return element;\n        };\n        Meta.prototype._setMetaElementAttributes = function (tag, el) {\n            var _this = this;\n            Object.keys(tag).forEach(function (prop) { return el.setAttribute(_this._getMetaKeyMap(prop), tag[prop]); });\n            return el;\n        };\n        Meta.prototype._parseSelector = function (tag) {\n            var attr = tag.name ? 'name' : 'property';\n            return attr + \"=\\\"\" + tag[attr] + \"\\\"\";\n        };\n        Meta.prototype._containsAttributes = function (tag, elem) {\n            var _this = this;\n            return Object.keys(tag).every(function (key) { return elem.getAttribute(_this._getMetaKeyMap(key)) === tag[key]; });\n        };\n        Meta.prototype._getMetaKeyMap = function (prop) {\n            return META_KEYS_MAP[prop] || prop;\n        };\n        return Meta;\n    }());\n    Meta.ɵprov = i0.ɵɵdefineInjectable({ factory: createMeta, token: Meta, providedIn: \"root\" });\n    Meta.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root', useFactory: createMeta, deps: [] },] }\n    ];\n    Meta.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n    /**\n     * Mapping for MetaDefinition properties with their correct meta attribute names\n     */\n    var META_KEYS_MAP = {\n        httpEquiv: 'http-equiv'\n    };\n\n    /**\n     * @license\n     * Copyright Google LLC 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     * Factory to create Title service.\n     */\n    function createTitle() {\n        return new Title(i0.ɵɵinject(common.DOCUMENT));\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 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     * @publicApi\n     */\n    var Title = /** @class */ (function () {\n        function Title(_doc) {\n            this._doc = _doc;\n        }\n        /**\n         * Get the title of the current HTML document.\n         */\n        Title.prototype.getTitle = function () {\n            return this._doc.title;\n        };\n        /**\n         * Set the title of the current HTML document.\n         * @param newTitle\n         */\n        Title.prototype.setTitle = function (newTitle) {\n            this._doc.title = newTitle || '';\n        };\n        return Title;\n    }());\n    Title.ɵprov = i0.ɵɵdefineInjectable({ factory: createTitle, token: Title, providedIn: \"root\" });\n    Title.decorators = [\n        { type: i0.Injectable, args: [{ providedIn: 'root', useFactory: createTitle, deps: [] },] }\n    ];\n    Title.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: i0.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n\n    /**\n     * @license\n     * Copyright Google LLC 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 win = typeof window !== 'undefined' && window || {};\n\n    /**\n     * @license\n     * Copyright Google LLC 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 ChangeDetectionPerfRecord = /** @class */ (function () {\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 profiling-related debug tools. This object\n     * corresponds to the `ng.profiler` in the dev console.\n     */\n    var AngularProfiler = /** @class */ (function () {\n        function AngularProfiler(ref) {\n            this.appRef = ref.injector.get(i0.ApplicationRef);\n        }\n        // tslint:disable:no-console\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         */\n        AngularProfiler.prototype.timeChangeDetection = function (config) {\n            var record = config && config['record'];\n            var profileName = 'Change Detection';\n            // Profiler is not available in Android browsers without dev tools opened\n            var isProfilerAvailable = win.console.profile != null;\n            if (record && isProfilerAvailable) {\n                win.console.profile(profileName);\n            }\n            var start = common.ɵgetDOM().performanceNow();\n            var numTicks = 0;\n            while (numTicks < 5 || (common.ɵgetDOM().performanceNow() - start) < 500) {\n                this.appRef.tick();\n                numTicks++;\n            }\n            var end = common.ɵgetDOM().performanceNow();\n            if (record && isProfilerAvailable) {\n                win.console.profileEnd(profileName);\n            }\n            var 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    /**\n     * @license\n     * Copyright Google LLC 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 PROFILER_GLOBAL_NAME = 'profiler';\n    /**\n     * Enabled Angular 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     * @publicApi\n     */\n    function enableDebugTools(ref) {\n        exportNgVar(PROFILER_GLOBAL_NAME, new AngularProfiler(ref));\n        return ref;\n    }\n    /**\n     * Disables Angular tools.\n     *\n     * @publicApi\n     */\n    function disableDebugTools() {\n        exportNgVar(PROFILER_GLOBAL_NAME, null);\n    }\n\n    /**\n     * @license\n     * Copyright Google LLC 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    function escapeHtml(text) {\n        var escapedText = {\n            '&': '&a;',\n            '\"': '&q;',\n            '\\'': '&s;',\n            '<': '&l;',\n            '>': '&g;',\n        };\n        return text.replace(/[&\"'<>]/g, function (s) { return escapedText[s]; });\n    }\n    function unescapeHtml(text) {\n        var unescapedText = {\n            '&a;': '&',\n            '&q;': '\"',\n            '&s;': '\\'',\n            '&l;': '<',\n            '&g;': '>',\n        };\n        return text.replace(/&[^;]+;/g, function (s) { return unescapedText[s]; });\n    }\n    /**\n     * Create a `StateKey<T>` that can be used to store value of type T with `TransferState`.\n     *\n     * Example:\n     *\n     * ```\n     * const COUNTER_KEY = makeStateKey<number>('counter');\n     * let value = 10;\n     *\n     * transferState.set(COUNTER_KEY, value);\n     * ```\n     *\n     * @publicApi\n     */\n    function makeStateKey(key) {\n        return key;\n    }\n    /**\n     * A key value store that is transferred from the application on the server side to the application\n     * on the client side.\n     *\n     * `TransferState` will be available as an injectable token. To use it import\n     * `ServerTransferStateModule` on the server and `BrowserTransferStateModule` on the client.\n     *\n     * The values in the store are serialized/deserialized using JSON.stringify/JSON.parse. So only\n     * boolean, number, string, null and non-class objects will be serialized and deserialized in a\n     * non-lossy manner.\n     *\n     * @publicApi\n     */\n    var TransferState = /** @class */ (function () {\n        function TransferState() {\n            this.store = {};\n            this.onSerializeCallbacks = {};\n        }\n        /** @internal */\n        TransferState.init = function (initState) {\n            var transferState = new TransferState();\n            transferState.store = initState;\n            return transferState;\n        };\n        /**\n         * Get the value corresponding to a key. Return `defaultValue` if key is not found.\n         */\n        TransferState.prototype.get = function (key, defaultValue) {\n            return this.store[key] !== undefined ? this.store[key] : defaultValue;\n        };\n        /**\n         * Set the value corresponding to a key.\n         */\n        TransferState.prototype.set = function (key, value) {\n            this.store[key] = value;\n        };\n        /**\n         * Remove a key from the store.\n         */\n        TransferState.prototype.remove = function (key) {\n            delete this.store[key];\n        };\n        /**\n         * Test whether a key exists in the store.\n         */\n        TransferState.prototype.hasKey = function (key) {\n            return this.store.hasOwnProperty(key);\n        };\n        /**\n         * Register a callback to provide the value for a key when `toJson` is called.\n         */\n        TransferState.prototype.onSerialize = function (key, callback) {\n            this.onSerializeCallbacks[key] = callback;\n        };\n        /**\n         * Serialize the current state of the store to JSON.\n         */\n        TransferState.prototype.toJson = function () {\n            // Call the onSerialize callbacks and put those values into the store.\n            for (var key in this.onSerializeCallbacks) {\n                if (this.onSerializeCallbacks.hasOwnProperty(key)) {\n                    try {\n                        this.store[key] = this.onSerializeCallbacks[key]();\n                    }\n                    catch (e) {\n                        console.warn('Exception in onSerialize callback: ', e);\n                    }\n                }\n            }\n            return JSON.stringify(this.store);\n        };\n        return TransferState;\n    }());\n    TransferState.decorators = [\n        { type: i0.Injectable }\n    ];\n    function initTransferState(doc, appId) {\n        // Locate the script tag with the JSON data transferred from the server.\n        // The id of the script tag is set to the Angular appId + 'state'.\n        var script = doc.getElementById(appId + '-state');\n        var initialState = {};\n        if (script && script.textContent) {\n            try {\n                // Avoid using any here as it triggers lint errors in google3 (any is not allowed).\n                initialState = JSON.parse(unescapeHtml(script.textContent));\n            }\n            catch (e) {\n                console.warn('Exception while restoring TransferState for app ' + appId, e);\n            }\n        }\n        return TransferState.init(initialState);\n    }\n    /**\n     * NgModule to install on the client side while using the `TransferState` to transfer state from\n     * server to client.\n     *\n     * @publicApi\n     */\n    var BrowserTransferStateModule = /** @class */ (function () {\n        function BrowserTransferStateModule() {\n        }\n        return BrowserTransferStateModule;\n    }());\n    BrowserTransferStateModule.decorators = [\n        { type: i0.NgModule, args: [{\n                    providers: [{ provide: TransferState, useFactory: initTransferState, deps: [common.DOCUMENT, i0.APP_ID] }],\n                },] }\n    ];\n\n    /**\n     * @license\n     * Copyright Google LLC 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     * Predicates for use with {@link DebugElement}'s query functions.\n     *\n     * @publicApi\n     */\n    var By = /** @class */ (function () {\n        function By() {\n        }\n        /**\n         * Match all nodes.\n         *\n         * @usageNotes\n         * ### Example\n         *\n         * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}\n         */\n        By.all = function () {\n            return function () { return true; };\n        };\n        /**\n         * Match elements by the given CSS selector.\n         *\n         * @usageNotes\n         * ### Example\n         *\n         * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}\n         */\n        By.css = function (selector) {\n            return function (debugElement) {\n                return debugElement.nativeElement != null ?\n                    elementMatches(debugElement.nativeElement, selector) :\n                    false;\n            };\n        };\n        /**\n         * Match nodes that have the given directive present.\n         *\n         * @usageNotes\n         * ### Example\n         *\n         * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}\n         */\n        By.directive = function (type) {\n            return function (debugNode) { return debugNode.providerTokens.indexOf(type) !== -1; };\n        };\n        return By;\n    }());\n    function elementMatches(n, selector) {\n        if (common.ɵgetDOM().isElementNode(n)) {\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    /**\n     * @license\n     * Copyright Google LLC 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    /**\n     * @license\n     * Copyright Google LLC 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     * @publicApi\n     */\n    var VERSION = new i0.Version('11.2.14');\n\n    /**\n     * @license\n     * Copyright Google LLC 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    /**\n     * @license\n     * Copyright Google LLC 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    // This file only reexports content of the `src` folder. Keep it that way.\n\n    /**\n     * @license\n     * Copyright Google LLC 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    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    Object.defineProperty(exports, 'ɵgetDOM', {\n        enumerable: true,\n        get: function () {\n            return common.ɵgetDOM;\n        }\n    });\n    exports.BrowserModule = BrowserModule;\n    exports.BrowserTransferStateModule = BrowserTransferStateModule;\n    exports.By = By;\n    exports.DomSanitizer = DomSanitizer;\n    exports.EVENT_MANAGER_PLUGINS = EVENT_MANAGER_PLUGINS;\n    exports.EventManager = EventManager;\n    exports.HAMMER_GESTURE_CONFIG = HAMMER_GESTURE_CONFIG;\n    exports.HAMMER_LOADER = HAMMER_LOADER;\n    exports.HammerGestureConfig = HammerGestureConfig;\n    exports.HammerModule = HammerModule;\n    exports.Meta = Meta;\n    exports.Title = Title;\n    exports.TransferState = TransferState;\n    exports.VERSION = VERSION;\n    exports.disableDebugTools = disableDebugTools;\n    exports.enableDebugTools = enableDebugTools;\n    exports.makeStateKey = makeStateKey;\n    exports.platformBrowser = platformBrowser;\n    exports.ɵBROWSER_SANITIZATION_PROVIDERS = BROWSER_SANITIZATION_PROVIDERS;\n    exports.ɵBROWSER_SANITIZATION_PROVIDERS__POST_R3__ = BROWSER_SANITIZATION_PROVIDERS__POST_R3__;\n    exports.ɵBrowserDomAdapter = BrowserDomAdapter;\n    exports.ɵBrowserGetTestability = BrowserGetTestability;\n    exports.ɵDomEventsPlugin = DomEventsPlugin;\n    exports.ɵDomRendererFactory2 = DomRendererFactory2;\n    exports.ɵDomSanitizerImpl = DomSanitizerImpl;\n    exports.ɵDomSharedStylesHost = DomSharedStylesHost;\n    exports.ɵELEMENT_PROBE_PROVIDERS = ELEMENT_PROBE_PROVIDERS;\n    exports.ɵELEMENT_PROBE_PROVIDERS__POST_R3__ = ELEMENT_PROBE_PROVIDERS__POST_R3__;\n    exports.ɵHAMMER_PROVIDERS__POST_R3__ = HAMMER_PROVIDERS__POST_R3__;\n    exports.ɵHammerGesturesPlugin = HammerGesturesPlugin;\n    exports.ɵINTERNAL_BROWSER_PLATFORM_PROVIDERS = INTERNAL_BROWSER_PLATFORM_PROVIDERS;\n    exports.ɵKeyEventsPlugin = KeyEventsPlugin;\n    exports.ɵNAMESPACE_URIS = NAMESPACE_URIS;\n    exports.ɵSharedStylesHost = SharedStylesHost;\n    exports.ɵTRANSITION_ID = TRANSITION_ID;\n    exports.ɵangular_packages_platform_browser_platform_browser_a = errorHandler;\n    exports.ɵangular_packages_platform_browser_platform_browser_b = _document;\n    exports.ɵangular_packages_platform_browser_platform_browser_c = BROWSER_MODULE_PROVIDERS;\n    exports.ɵangular_packages_platform_browser_platform_browser_d = createMeta;\n    exports.ɵangular_packages_platform_browser_platform_browser_e = createTitle;\n    exports.ɵangular_packages_platform_browser_platform_browser_f = initTransferState;\n    exports.ɵangular_packages_platform_browser_platform_browser_g = EventManagerPlugin;\n    exports.ɵangular_packages_platform_browser_platform_browser_h = HAMMER_PROVIDERS__PRE_R3__;\n    exports.ɵangular_packages_platform_browser_platform_browser_i = HAMMER_PROVIDERS;\n    exports.ɵangular_packages_platform_browser_platform_browser_j = domSanitizerImplFactory;\n    exports.ɵangular_packages_platform_browser_platform_browser_k = appInitializerFactory;\n    exports.ɵangular_packages_platform_browser_platform_browser_l = SERVER_TRANSITION_PROVIDERS;\n    exports.ɵangular_packages_platform_browser_platform_browser_m = _createNgProbeR2;\n    exports.ɵangular_packages_platform_browser_platform_browser_n = ELEMENT_PROBE_PROVIDERS__PRE_R3__;\n    exports.ɵangular_packages_platform_browser_platform_browser_o = GenericBrowserDomAdapter;\n    exports.ɵescapeHtml = escapeHtml;\n    exports.ɵflattenStyles = flattenStyles;\n    exports.ɵinitDomAdapter = initDomAdapter;\n    exports.ɵshimContentAttribute = shimContentAttribute;\n    exports.ɵshimHostAttribute = shimHostAttribute;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=platform-browser.umd.js.map\n"]}