+ For this part, you should load the Pokemon example data.
+
+
+
+
+ We will start by simply fetching all nodes in the database. Because there might be a lot of them, we limit the number of results.
+
+ The MATCH keyword tells the database we want to fetch some data according to a certain pattern which is/are given afterwards.
+ All elements matching parts of the pattern are stored in a variable if one is given, in our case it is called node.
+ The last part of the query is the RETURN after which all variables we want in our result are specified, in our case only node.
+ The optional LIMIT caps the results after the given number.
+ Without this, our database would return us 916 elements for the Pokemon test dataset.
+
+
+
+ If we only want a specific type of nodes, we can specify this by adding a label to the pattern.
+
+
+
+
+ To show the difference, we now query the types Pokemon can have.
+
+ Because there are only 18, we can omit the LIMIT.
+
+
+
+ In this example we combine the previous two queries by specifying two patterns.
+
+ We now limit the number of results again to 25.
+ This query is a very bad example (and Neo4J Browser warns about this one), because we are actually building the Cartesian product of the two sets of results.
+ According to Neo4J Browser, the number of records would be 16164.
+ A better query is to ask for a Pokemon and its adjacent type:
+
+ Here, the label HAS_TYPE is the label of an edge connecting a Pokemon with its type.
+ And because we both of the variables returned, we can replace p, t with an asterisk.
+
+
+
+
+ Nodes and edges can also have multiple labels.
+ For example there are normal Pokemon and legendary ones (which are unique).
+ The latter ones have two labels and can be queried accordingly.
+
+
+
+ All three queries yield the same result.
+
+
+
Filtering with Properties
+ So far, we only selected nodes based on the labels. Most of the time, we also want to filter based on the stored properties.
+
+
+ We now want to find the most famous Pokemon.
+ Please be aware that the string comparison is case sensitive and the name is given in lower case.
+
+ The filtering is like in SQL done with the WHERE part.
+ Here, we access the property name and compare it against 'pikachu'.
+ Another possibilily is to include the name already in the pattern:
+
+
+
+
+ We can also filter for an internal id
+
+ Please note that the id is not really predictable and this query might not yield a meaningful result.
+
+
+
+ We can also filter using all kinds of functions and combinations.
+
+
+
+
+
+
Filtering with Paths
+
+
+ We can also use the paths to enhance our filtering.
+ For example, we want only fire Pokemon from the first generation (which means a pokedexId <= 150).
+
+ Because we did not assign a variable to :Type, we could use RETURN * and only got the Pokemon.
+
+
+
+ Also edges can have properties.
+ Pokemon might have more than one type.
+ We now query all Pokemon with fire as secondary type.
+
+
+
+
+ We can also check for the absence of a certain path.
+ In the next example, we want all pokemon which cannot evolve further.
+
+ The () here stands for an arbitrary node we do not restrict in any way and also do not store in a variable.
+ Please note that we used -[]-> which is a directed edge instead of the -[]- we used earlier.
+ All edges in Neo4J are directed and we can care about the direction or not.
+
+
+
+ Path patterns can be arbitrary complex.
+ To find all pokemon having only two evolution states, we can use this query:
+
+
+
+
+ For Pokemon with three evolutionary levels, we can use an abbreviation:
+
+ Where we do not see the full path but only start end end.
+ If we again store the paths in a variable, we get all three Pokemon.
+
+
+
+
Path finding
+
+ For this part, you should load the Sinnoh example map.
+
+ Please note I did some simplifications to the map.
+
+
+
+ First of all, let's have a look at the whole map.
+
+ Another way of querying with labels.
+
+
+
+ We can now find paths from Snowpoint City to Hearthome City.
+
+ And get the lengths of each route.
+
+ And also both
+
+
+
+
+ Neo4J also offers some interesting functions like shortestPath() which finds the shortest instance of an path in an (according to the documentation) efficient way.
+ Neo4J Browser advices to use an upper limit here to avoid long execution times
+
+
+
+
+
+
+
+
+
+
+ Sources
+
+
+
Pokemon data
+ Many thanks to GitHub user Eevee/Veekun for providing a lot of data about Pokemon in CSV data under MIT License
+ https://github.com/veekun/pokedex
+
+
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
BSD 3-Clause License
+
+Copyright (c) 2006, Ivan Sagalaev.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts
new file mode 100644
index 0000000..9d6b2f1
--- /dev/null
+++ b/frontend/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-root',
+ templateUrl: './app.component.html',
+ styleUrls: ['./app.component.css']
+})
+export class AppComponent {
+ title = 'frontend';
+}
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
new file mode 100644
index 0000000..79dd8ba
--- /dev/null
+++ b/frontend/src/app/app.module.ts
@@ -0,0 +1,46 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+
+import { AppComponent } from './app.component';
+import {MatToolbarModule} from '@angular/material/toolbar';
+import {MatExpansionModule} from '@angular/material/expansion';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import {MatDividerModule} from '@angular/material/divider';
+import { BrowserComponent } from './components/browser/browser.component';
+import { DatabaseControlComponent } from './components/database-control/database-control.component';
+import {MatButtonModule} from '@angular/material/button';
+import {HttpClientModule} from '@angular/common/http';
+import { SnippetComponent } from './components/snippset/snippet.component';
+import {HIGHLIGHT_OPTIONS, HighlightModule} from 'ngx-highlightjs';
+import {ClipboardModule} from '@angular/cdk/clipboard';
+
+@NgModule({
+ declarations: [
+ AppComponent,
+ BrowserComponent,
+ DatabaseControlComponent,
+ SnippetComponent
+ ],
+ imports: [
+ BrowserModule,
+ MatToolbarModule,
+ MatExpansionModule,
+ BrowserAnimationsModule,
+ MatDividerModule,
+ MatButtonModule,
+ HttpClientModule,
+ HighlightModule,
+ ClipboardModule
+ ],
+ providers: [{
+ provide: HIGHLIGHT_OPTIONS,
+ useValue: {
+ coreLibraryLoader: () => import('highlight.js/lib/core'),
+ languages: {
+ cypher: () => import('../assets/cypher.js'),
+ }
+ }
+ }],
+ bootstrap: [AppComponent]
+})
+export class AppModule { }
diff --git a/frontend/src/app/components/browser/browser.component.css b/frontend/src/app/components/browser/browser.component.css
new file mode 100644
index 0000000..054f35f
--- /dev/null
+++ b/frontend/src/app/components/browser/browser.component.css
@@ -0,0 +1,7 @@
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-bottom: 10px;
+}
diff --git a/frontend/src/app/components/browser/browser.component.html b/frontend/src/app/components/browser/browser.component.html
new file mode 100644
index 0000000..068018e
--- /dev/null
+++ b/frontend/src/app/components/browser/browser.component.html
@@ -0,0 +1,18 @@
+
diff --git a/frontend/src/app/components/snippset/snippet.component.ts b/frontend/src/app/components/snippset/snippet.component.ts
new file mode 100644
index 0000000..fbec92b
--- /dev/null
+++ b/frontend/src/app/components/snippset/snippet.component.ts
@@ -0,0 +1,31 @@
+import {Component, ElementRef, Input, OnInit, Renderer2} from '@angular/core';
+
+
+@Component({
+ selector: 'app-snippset',
+ templateUrl: './snippet.component.html',
+ styleUrls: ['./snippet.component.css']
+})
+export class SnippetComponent implements OnInit {
+
+ @Input()
+ query: string;
+
+ copy_ = true;
+
+ constructor() {
+ }
+
+ ngOnInit(): void {
+ }
+
+ @Input()
+ set copy(value: string) {
+ if (value === 'false') {
+ this.copy_ = false;
+ } else {
+ this.copy_ = true;
+ }
+ }
+
+}
diff --git a/frontend/src/app/services/database.service.ts b/frontend/src/app/services/database.service.ts
new file mode 100644
index 0000000..1acc1e2
--- /dev/null
+++ b/frontend/src/app/services/database.service.ts
@@ -0,0 +1,24 @@
+import {Injectable} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import {Observable} from 'rxjs';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class DatabaseService {
+
+ constructor(private http: HttpClient) {
+ }
+
+ public loadPokemon(): Observable {
+ return this.http.post('http://localhost:8080/api/pokemon/load', null);
+ }
+
+ public loadSinnohMap(): Observable {
+ return this.http.post('http://localhost:8080/api/sinnoh-map/load', null);
+ }
+
+ public clearDatabase(): Observable {
+ return this.http.delete('http://localhost:8080/api/database');
+ }
+}
diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/assets/cypher.js b/frontend/src/assets/cypher.js
new file mode 100644
index 0000000..b549fdb
--- /dev/null
+++ b/frontend/src/assets/cypher.js
@@ -0,0 +1,52 @@
+/**
+ * Language: Cypher
+ * Contributors:
+ * Johannes Wienke
+ * Gustavo Reis
+ */
+module.exports = function (hljs)
+{
+ return {
+ case_insensitive: true,
+ keywords:
+ {
+ keyword: 'as asc ascending assert by call case commit constraint create csv cypher delete desc descending detach distinct drop else end ends explain fieldterminator foreach from headers in index is join limit load match merge on optional order periodic profile remove return scan set skip start starts then union unique unwind using when where with yield',
+ literal: 'true false null'
+ },
+ contains:
+ [
+ hljs.QUOTE_STRING_MODE,
+ hljs.APOS_STRING_MODE,
+ hljs.C_NUMBER_MODE,
+ {
+ className: 'string',
+ begin: '`',
+ end: '`',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ },
+ {
+ className: 'type',
+ begin: /((-|>)?\s?\(|-\[)\w*:/,
+ excludeBegin: true,
+ end: '\\W',
+ excludeEnd: true,
+ },
+ {
+ className: 'functionCall',
+ begin: /(\s+|,)\w+\(/,
+ end: /\)/,
+ keywords: {
+ built_in: 'all any exists none single coalesce endNode head id last length properties size startNode timestamp toBoolean toFloat toInteger type avg collect count max min percentileCont percentileDisc stDev stDevP sum extract filter keys labels nodes range reduce relationships reverse tail abs ceil floor rand round sign e exp log log10 sqrt acos asin atan atan2 cos cot degrees haversin pi radians sin tan left ltrim replace reverse right rtrim split substring toLower toString toUpper trim distance'
+ }
+ },
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ {
+ begin: '//',
+ ends: '//',
+ }
+ ]
+ }
+}
+
diff --git a/frontend/src/assets/dracula.css b/frontend/src/assets/dracula.css
new file mode 100644
index 0000000..d591db6
--- /dev/null
+++ b/frontend/src/assets/dracula.css
@@ -0,0 +1,76 @@
+/*
+
+Dracula Theme v1.2.0
+
+https://github.com/zenorocha/dracula-theme
+
+Copyright 2015, All rights reserved
+
+Code licensed under the MIT license
+http://zenorocha.mit-license.org
+
+@author Éverton Ribeiro
+@author Zeno Rocha
+
+*/
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282a36;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-section,
+.hljs-link {
+ color: #8be9fd;
+}
+
+.hljs-function .hljs-keyword {
+ color: #ff79c6;
+}
+
+.hljs,
+.hljs-subst {
+ color: #f8f8f2;
+}
+
+.hljs-string,
+.hljs-title,
+.hljs-name,
+.hljs-type,
+.hljs-attribute,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-variable,
+.hljs-template-tag,
+.hljs-template-variable {
+ color: #f1fa8c;
+}
+
+.hljs-comment,
+.hljs-quote,
+.hljs-deletion,
+.hljs-meta {
+ color: #6272a4;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-type,
+.hljs-name,
+.hljs-strong {
+ font-weight: bold;
+}
+
+.hljs-emphasis {
+ font-style: italic;
+}
diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/frontend/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ production: true
+};
diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts
new file mode 100644
index 0000000..7b4f817
--- /dev/null
+++ b/frontend/src/environments/environment.ts
@@ -0,0 +1,16 @@
+// This file can be replaced during build by using the `fileReplacements` array.
+// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
+// The list of file replacements can be found in `angular.json`.
+
+export const environment = {
+ production: false
+};
+
+/*
+ * For easier debugging in development mode, you can import the following file
+ * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
+ *
+ * This import should be commented out in production mode because it will have a negative impact
+ * on performance if an error is thrown.
+ */
+// import 'zone.js/dist/zone-error'; // Included with Angular CLI.
diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico
new file mode 100644
index 0000000..997406a
Binary files /dev/null and b/frontend/src/favicon.ico differ
diff --git a/frontend/src/index.html b/frontend/src/index.html
new file mode 100644
index 0000000..3af61ec
--- /dev/null
+++ b/frontend/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Frontend
+
+
+
+
+
+
+
+
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
new file mode 100644
index 0000000..c7b673c
--- /dev/null
+++ b/frontend/src/main.ts
@@ -0,0 +1,12 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+ .catch(err => console.error(err));
diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts
new file mode 100644
index 0000000..d5f67bd
--- /dev/null
+++ b/frontend/src/polyfills.ts
@@ -0,0 +1,65 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/guide/browser-support
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/**
+ * IE11 requires the following for NgClass support on SVG elements
+ */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+
+/**
+ * Web Animations `@angular/platform-browser/animations`
+ * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
+ * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
+ */
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ * because those flags need to be set before `zone.js` being loaded, and webpack
+ * will put import in the top of bundle, so user need to create a separate file
+ * in this directory (for example: zone-flags.ts), and put the following flags
+ * into that file, and then add the following code before importing zone.js.
+ * import './zone-flags';
+ *
+ * The flags allowed in zone-flags.ts are listed here.
+ *
+ * The following flags will work for all browsers.
+ *
+ * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+ *
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ *
+ * (window as any).__Zone_enable_cross_context_check = true;
+ *
+ */
+
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+import 'zone.js/dist/zone'; // Included with Angular CLI.
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
new file mode 100644
index 0000000..28dfbb2
--- /dev/null
+++ b/frontend/src/styles.css
@@ -0,0 +1,11 @@
+/* You can add global styles to this file, and also import other style files */
+@import "~@angular/material/prebuilt-themes/indigo-pink.css";
+@import "assets/dracula.css";
+
+html, body {
+ height: 100%;
+}
+
+body {
+ margin: 0;
+}
diff --git a/frontend/src/test.ts b/frontend/src/test.ts
new file mode 100644
index 0000000..50193eb
--- /dev/null
+++ b/frontend/src/test.ts
@@ -0,0 +1,25 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/zone-testing';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+declare const require: {
+ context(path: string, deep?: boolean, filter?: RegExp): {
+ keys(): string[];
+ (id: string): T;
+ };
+};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json
new file mode 100644
index 0000000..82d91dc
--- /dev/null
+++ b/frontend/tsconfig.app.json
@@ -0,0 +1,15 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/app",
+ "types": []
+ },
+ "files": [
+ "src/main.ts",
+ "src/polyfills.ts"
+ ],
+ "include": [
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 0000000..4a4dc62
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,23 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./",
+ "outDir": "./dist/out-tsc",
+ "sourceMap": true,
+ "declaration": false,
+ "downlevelIteration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "node",
+ "importHelpers": true,
+ "target": "es2015",
+ "module": "es2020",
+ "lib": [
+ "es2018",
+ "dom"
+ ]
+ },
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false
+ }
+}
diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json
new file mode 100644
index 0000000..092345b
--- /dev/null
+++ b/frontend/tsconfig.spec.json
@@ -0,0 +1,18 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jasmine"
+ ]
+ },
+ "files": [
+ "src/test.ts",
+ "src/polyfills.ts"
+ ],
+ "include": [
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/frontend/tslint.json b/frontend/tslint.json
new file mode 100644
index 0000000..277c8eb
--- /dev/null
+++ b/frontend/tslint.json
@@ -0,0 +1,152 @@
+{
+ "extends": "tslint:recommended",
+ "rulesDirectory": [
+ "codelyzer"
+ ],
+ "rules": {
+ "align": {
+ "options": [
+ "parameters",
+ "statements"
+ ]
+ },
+ "array-type": false,
+ "arrow-return-shorthand": true,
+ "curly": true,
+ "deprecation": {
+ "severity": "warning"
+ },
+ "eofline": true,
+ "import-blacklist": [
+ true,
+ "rxjs/Rx"
+ ],
+ "import-spacing": true,
+ "indent": {
+ "options": [
+ "spaces"
+ ]
+ },
+ "max-classes-per-file": false,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-ordering": [
+ true,
+ {
+ "order": [
+ "static-field",
+ "instance-field",
+ "static-method",
+ "instance-method"
+ ]
+ }
+ ],
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-empty": false,
+ "no-inferrable-types": [
+ true,
+ "ignore-params"
+ ],
+ "no-non-null-assertion": true,
+ "no-redundant-jsdoc": true,
+ "no-switch-case-fall-through": true,
+ "no-var-requires": false,
+ "object-literal-key-quotes": [
+ true,
+ "as-needed"
+ ],
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "semicolon": {
+ "options": [
+ "always"
+ ]
+ },
+ "space-before-function-paren": {
+ "options": {
+ "anonymous": "never",
+ "asyncArrow": "always",
+ "constructor": "never",
+ "method": "never",
+ "named": "never"
+ }
+ },
+ "typedef": [
+ true,
+ "call-signature"
+ ],
+ "typedef-whitespace": {
+ "options": [
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ },
+ {
+ "call-signature": "onespace",
+ "index-signature": "onespace",
+ "parameter": "onespace",
+ "property-declaration": "onespace",
+ "variable-declaration": "onespace"
+ }
+ ]
+ },
+ "variable-name": {
+ "options": [
+ "ban-keywords",
+ "check-format",
+ "allow-pascal-case"
+ ]
+ },
+ "whitespace": {
+ "options": [
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type",
+ "check-typecast"
+ ]
+ },
+ "component-class-suffix": true,
+ "contextual-lifecycle": true,
+ "directive-class-suffix": true,
+ "no-conflicting-lifecycle": true,
+ "no-host-metadata-property": true,
+ "no-input-rename": true,
+ "no-inputs-metadata-property": true,
+ "no-output-native": true,
+ "no-output-on-prefix": true,
+ "no-output-rename": true,
+ "no-outputs-metadata-property": true,
+ "template-banana-in-box": true,
+ "template-no-negated-async": true,
+ "use-lifecycle-interface": true,
+ "use-pipe-transform-interface": true,
+ "directive-selector": [
+ true,
+ "attribute",
+ "app",
+ "camelCase"
+ ],
+ "component-selector": [
+ true,
+ "element",
+ "app",
+ "kebab-case"
+ ]
+ }
+}
diff --git a/mvnw b/mvnw
new file mode 100755
index 0000000..a16b543
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..c8d4337
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e2be51c
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,83 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.4
+
+
+ at.jku.faw
+ neo4jdemo
+ 0.0.1-SNAPSHOT
+ Neo4J Demo
+ Demo project for Spring Boot
+
+ 11
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-neo4j
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.neo4j
+ neo4j
+ 4.2.5
+
+
+
+ org.neo4j.client
+ neo4j-browser
+ 4.2.5
+
+
+
+ org.neo4j
+ neo4j-ogm-core
+ 3.2.18
+
+
+
+ org.neo4j
+ neo4j-ogm-bolt-driver
+ 3.2.18
+
+
+
+ com.opencsv
+ opencsv
+ 4.6
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/src/main/java/at/jku/faw/neo4jdemo/Neo4JDemoApplication.java b/src/main/java/at/jku/faw/neo4jdemo/Neo4JDemoApplication.java
new file mode 100644
index 0000000..c92045a
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/Neo4JDemoApplication.java
@@ -0,0 +1,13 @@
+package at.jku.faw.neo4jdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Neo4JDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Neo4JDemoApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/config/Neo4JAccessConfig.java b/src/main/java/at/jku/faw/neo4jdemo/config/Neo4JAccessConfig.java
new file mode 100644
index 0000000..71c8ef1
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/config/Neo4JAccessConfig.java
@@ -0,0 +1,24 @@
+package at.jku.faw.neo4jdemo.config;
+
+import org.neo4j.ogm.session.SessionFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class Neo4JAccessConfig {
+ @Value("${neo4j.uri}")
+ private String neo4jUri;
+
+ @Bean
+ public org.neo4j.ogm.config.Configuration getConfiguration() {
+ return new org.neo4j.ogm.config.Configuration.Builder()
+ .uri(neo4jUri)
+ .build();
+ }
+
+ @Bean
+ public SessionFactory getSessionFactory(org.neo4j.ogm.config.Configuration config) {
+ return new SessionFactory( config, "at.jku.faw.neo4jdemo.model.neo4j" );
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/config/WebConfig.java b/src/main/java/at/jku/faw/neo4jdemo/config/WebConfig.java
new file mode 100644
index 0000000..9b5c9d5
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/config/WebConfig.java
@@ -0,0 +1,22 @@
+package at.jku.faw.neo4jdemo.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/browser/**").addResourceLocations("classpath:browser/");
+ registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
+ }
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH")
+ .allowedOrigins("*");
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/controller/MainController.java b/src/main/java/at/jku/faw/neo4jdemo/controller/MainController.java
new file mode 100644
index 0000000..69befeb
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/controller/MainController.java
@@ -0,0 +1,69 @@
+package at.jku.faw.neo4jdemo.controller;
+
+import at.jku.faw.neo4jdemo.service.PokemonService;
+import org.neo4j.ogm.session.Session;
+import org.neo4j.ogm.session.SessionFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class MainController {
+
+ @Value("classpath:data/map.cypher")
+ private Resource sinnohMapQueryResource;
+
+ private final SessionFactory sessionFactory;
+ private final PokemonService pokemonService;
+
+ public MainController(SessionFactory sessionFactory, PokemonService pokemonService) {
+ this.sessionFactory = sessionFactory;
+ this.pokemonService = pokemonService;
+ }
+
+ @PostMapping({"/pokemon/load"})
+ @ResponseBody
+ public Map loadPokemon() throws IOException {
+ pokemonService.importAllPokemon();
+ Map result = new HashMap<>();
+ result.put("result", "Pokemon imported successfully");
+ return result;
+ }
+
+ @PostMapping("/sinnoh-map/load")
+ public Map loadSinnohMap() throws IOException {
+ Session session = sessionFactory.openSession();
+
+ try(Reader reader = new InputStreamReader(sinnohMapQueryResource.getInputStream())) {
+ String query = FileCopyUtils.copyToString(reader);
+ session.query(query, new HashMap<>());
+
+ Map result = new HashMap<>();
+ result.put("result", "Sinnoh map loaded successfully.");
+ return result;
+ }
+ }
+
+ @DeleteMapping("/database")
+ public Map clearDatabase() {
+ sessionFactory.openSession().purgeDatabase();
+
+ Map result = new HashMap<>();
+ result.put("result", "Database cleared successfully.");
+ return result;
+ }
+
+
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvEvolution.java b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvEvolution.java
new file mode 100644
index 0000000..222b47e
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvEvolution.java
@@ -0,0 +1,48 @@
+package at.jku.faw.neo4jdemo.model.csv;
+
+
+import java.util.Objects;
+
+public class CsvEvolution {
+ private int id;
+ private int evolved_species_id;
+ private int evolution_trigger_id;
+
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getEvolved_species_id() {
+ return evolved_species_id;
+ }
+
+ public void setEvolved_species_id(int evolved_species_id) {
+ this.evolved_species_id = evolved_species_id;
+ }
+
+ public int getEvolution_trigger_id() {
+ return evolution_trigger_id;
+ }
+
+ public void setEvolution_trigger_id(int evolution_trigger_id) {
+ this.evolution_trigger_id = evolution_trigger_id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CsvEvolution that = (CsvEvolution) o;
+ return id == that.id && evolved_species_id == that.evolved_species_id && evolution_trigger_id == that.evolution_trigger_id;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, evolved_species_id, evolution_trigger_id);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvPokemon.java b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvPokemon.java
new file mode 100644
index 0000000..aa266b6
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvPokemon.java
@@ -0,0 +1,65 @@
+package at.jku.faw.neo4jdemo.model.csv;
+
+import java.util.Objects;
+
+public class CsvPokemon {
+ private int id;
+ private String identifier;
+ private String evolves_from_species_id;
+ private int is_legendary;
+
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+
+
+ public int getIs_legendary() {
+ return is_legendary;
+ }
+
+ public void setIs_legendary(int is_legendary) {
+ this.is_legendary = is_legendary;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CsvPokemon pokemon = (CsvPokemon) o;
+ return id == pokemon.id && evolves_from_species_id == pokemon.evolves_from_species_id && is_legendary == pokemon.is_legendary && Objects.equals(identifier, pokemon.identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, identifier, evolves_from_species_id, is_legendary);
+ }
+
+ public void setEvolves_from_species_id(String evolves_from_species_id) {
+ this.evolves_from_species_id = evolves_from_species_id;
+ }
+
+ public Integer getEvolvesFromId() {
+ if(evolves_from_species_id == null || evolves_from_species_id.equals("")) {
+ return null;
+ }
+ return Integer.valueOf(evolves_from_species_id);
+ }
+
+ public boolean isLegendary() {
+ return is_legendary == 1;
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvType.java b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvType.java
new file mode 100644
index 0000000..edc852a
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvType.java
@@ -0,0 +1,55 @@
+package at.jku.faw.neo4jdemo.model.csv;
+
+import java.util.Objects;
+
+public class CsvType {
+ private int id;
+ private String identifier;
+ private int generation_id;
+ private int damage_class_id;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public int getGeneration_id() {
+ return generation_id;
+ }
+
+ public void setGeneration_id(int generation_id) {
+ this.generation_id = generation_id;
+ }
+
+ public int getDamage_class_id() {
+ return damage_class_id;
+ }
+
+ public void setDamage_class_id(int damage_class_id) {
+ this.damage_class_id = damage_class_id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CsvType csvType = (CsvType) o;
+ return id == csvType.id && generation_id == csvType.generation_id && damage_class_id == csvType.damage_class_id && identifier.equals(csvType.identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, identifier, generation_id, damage_class_id);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvTypeMapping.java b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvTypeMapping.java
new file mode 100644
index 0000000..cea42ca
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/csv/CsvTypeMapping.java
@@ -0,0 +1,46 @@
+package at.jku.faw.neo4jdemo.model.csv;
+
+import java.util.Objects;
+
+public class CsvTypeMapping {
+ int pokemon_id;
+ int type_id;
+ int slot;
+
+ public int getPokemon_id() {
+ return pokemon_id;
+ }
+
+ public void setPokemon_id(int pokemon_id) {
+ this.pokemon_id = pokemon_id;
+ }
+
+ public int getType_id() {
+ return type_id;
+ }
+
+ public void setType_id(int type_id) {
+ this.type_id = type_id;
+ }
+
+ public int getSlot() {
+ return slot;
+ }
+
+ public void setSlot(int slot) {
+ this.slot = slot;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CsvTypeMapping csvType = (CsvTypeMapping) o;
+ return pokemon_id == csvType.pokemon_id && type_id == csvType.type_id && slot == csvType.slot;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(pokemon_id, type_id, slot);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Legendary.java b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Legendary.java
new file mode 100644
index 0000000..44ce690
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Legendary.java
@@ -0,0 +1,4 @@
+package at.jku.faw.neo4jdemo.model.neo4j;
+
+public class Legendary extends Pokemon {
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Pokemon.java b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Pokemon.java
new file mode 100644
index 0000000..57ce1be
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Pokemon.java
@@ -0,0 +1,65 @@
+package at.jku.faw.neo4jdemo.model.neo4j;
+
+import org.neo4j.ogm.annotation.GeneratedValue;
+import org.neo4j.ogm.annotation.Id;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.Set;
+
+public class Pokemon {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private Integer pokedexId;
+
+ private String name;
+
+ @Relationship(value = "HAS_TYPE")
+ private Set type;
+
+ @Relationship(value = "EVOLVES_TO", direction = Relationship.INCOMING)
+ private Pokemon evolvesTo;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getPokedexId() {
+ return pokedexId;
+ }
+
+ public void setPokedexId(Integer pokedexId) {
+ this.pokedexId = pokedexId;
+ }
+
+
+ public Set getType() {
+ return type;
+ }
+
+ public void setType(Set type) {
+ this.type = type;
+ }
+
+ public Pokemon getEvolvesTo() {
+ return evolvesTo;
+ }
+
+ public void setEvolvesTo(Pokemon evolvesTo) {
+ this.evolvesTo = evolvesTo;
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Type.java b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Type.java
new file mode 100644
index 0000000..8f80c65
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/Type.java
@@ -0,0 +1,28 @@
+package at.jku.faw.neo4jdemo.model.neo4j;
+
+import org.neo4j.ogm.annotation.GeneratedValue;
+import org.neo4j.ogm.annotation.Id;
+
+public class Type {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/TypeRelation.java b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/TypeRelation.java
new file mode 100644
index 0000000..7c8a4aa
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/model/neo4j/TypeRelation.java
@@ -0,0 +1,54 @@
+package at.jku.faw.neo4jdemo.model.neo4j;
+
+import org.neo4j.ogm.annotation.EndNode;
+import org.neo4j.ogm.annotation.GeneratedValue;
+import org.neo4j.ogm.annotation.Id;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+import org.neo4j.ogm.annotation.StartNode;
+
+@RelationshipEntity
+public class TypeRelation {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @StartNode
+ private Pokemon pokemon;
+
+ @EndNode
+ private Type type;
+
+ private int slot;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Pokemon getPokemon() {
+ return pokemon;
+ }
+
+ public void setPokemon(Pokemon pokemon) {
+ this.pokemon = pokemon;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+
+ public int getSlot() {
+ return slot;
+ }
+
+ public void setSlot(int slot) {
+ this.slot = slot;
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepository.java b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepository.java
new file mode 100644
index 0000000..c9095b2
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepository.java
@@ -0,0 +1,11 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvPokemon;
+
+import java.util.List;
+
+public interface CsvPokemonRepository {
+ CsvPokemon getPokemonById(int dexId);
+
+ List getAll();
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepositoryImpl.java
new file mode 100644
index 0000000..a8f2c1d
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvPokemonRepositoryImpl.java
@@ -0,0 +1,28 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvPokemon;
+import org.springframework.stereotype.Repository;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Repository
+public class CsvPokemonRepositoryImpl extends GenericCsvRepositoryImpl implements CsvPokemonRepository {
+
+ private final List csvPokemon = new ArrayList<>();
+
+ public CsvPokemonRepositoryImpl() throws IOException {
+ csvPokemon.addAll(getCsvEntities("data/pokemon_species.csv", CsvPokemon.class));
+ }
+
+ @Override
+ public CsvPokemon getPokemonById(int dexId) {
+ return csvPokemon.stream().filter(p -> p.getId() == dexId).findFirst().orElse(null);
+ }
+
+ @Override
+ public List getAll() {
+ return new ArrayList<>(csvPokemon);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepository.java b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepository.java
new file mode 100644
index 0000000..eacb12a
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepository.java
@@ -0,0 +1,7 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvType;
+
+public interface CsvTypeRepository {
+ CsvType getType(int id, int slot);
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepositoryImpl.java
new file mode 100644
index 0000000..12a88cc
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/CsvTypeRepositoryImpl.java
@@ -0,0 +1,41 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvType;
+import at.jku.faw.neo4jdemo.model.csv.CsvTypeMapping;
+import com.opencsv.CSVReader;
+import com.opencsv.bean.CsvToBean;
+import com.opencsv.bean.CsvToBeanBuilder;
+import com.opencsv.bean.HeaderColumnNameMappingStrategy;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.ResourceUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Repository
+public class CsvTypeRepositoryImpl extends GenericCsvRepositoryImpl implements CsvTypeRepository {
+
+ private final Set typeMappings = new HashSet<>();
+ private final Set types = new HashSet<>();
+
+ public CsvTypeRepositoryImpl() throws IOException {
+ this.typeMappings.addAll(getCsvEntities("data/pokemon_types.csv", CsvTypeMapping.class));
+ this.types.addAll(getCsvEntities("data/types.csv", CsvType.class));
+ }
+
+ @Override
+ public CsvType getType(int id, int slot) {
+ CsvTypeMapping mapping = typeMappings.stream().filter(tm -> tm.getPokemon_id() == id && tm.getSlot() == slot).findFirst().orElse(null);
+ if(mapping == null) {
+ return null;
+ }
+ return types.stream().filter(t -> t.getId() == mapping.getType_id()).findFirst().orElse(null);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/GenericCsvRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericCsvRepositoryImpl.java
new file mode 100644
index 0000000..e646720
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericCsvRepositoryImpl.java
@@ -0,0 +1,41 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvType;
+import com.opencsv.CSVReader;
+import com.opencsv.bean.CsvToBean;
+import com.opencsv.bean.CsvToBeanBuilder;
+import com.opencsv.bean.CsvToBeanFilter;
+import com.opencsv.bean.HeaderColumnNameMappingStrategy;
+import com.opencsv.enums.CSVReaderNullFieldIndicator;
+import org.springframework.util.ResourceUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.List;
+
+public abstract class GenericCsvRepositoryImpl {
+ private File getCsvFile(String path) throws FileNotFoundException {
+ return ResourceUtils.getFile("classpath:" + path);
+ }
+
+ protected List getCsvEntities(String csvFilePath, Class entity) throws IOException {
+ try(CSVReader reader = new CSVReader(new BufferedReader(new InputStreamReader(new FileInputStream(getCsvFile(csvFilePath)))))) {
+
+ HeaderColumnNameMappingStrategy ms = new HeaderColumnNameMappingStrategy<>();
+ ms.setType(entity);
+
+ CsvToBean cb = new CsvToBeanBuilder(reader)
+ .withType(entity)
+ .withMappingStrategy(ms)
+ .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
+ .build();
+
+ return cb.parse();
+ }
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepository.java b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepository.java
new file mode 100644
index 0000000..45ef186
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepository.java
@@ -0,0 +1,5 @@
+package at.jku.faw.neo4jdemo.repository;
+
+public interface GenericNeo4JRepository {
+ T save(T type);
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepositoryImpl.java
new file mode 100644
index 0000000..35e6fdc
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/GenericNeo4JRepositoryImpl.java
@@ -0,0 +1,22 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+import org.neo4j.ogm.session.Session;
+import org.neo4j.ogm.session.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class GenericNeo4JRepositoryImpl {
+ @Autowired
+ protected SessionFactory sessionFactory;
+
+ protected Session getSession() {
+ return sessionFactory.openSession();
+ }
+
+
+ public T save(T entity) {
+ Session session = getSession();
+ session.save(entity);
+ return entity;
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepository.java b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepository.java
new file mode 100644
index 0000000..52d1d7c
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepository.java
@@ -0,0 +1,7 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Pokemon;
+
+public interface Neo4JPokemonRepository extends GenericNeo4JRepository {
+ Pokemon findByDexId(int dexId);
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepositoryImpl.java
new file mode 100644
index 0000000..b2785e2
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JPokemonRepositoryImpl.java
@@ -0,0 +1,21 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Pokemon;
+import org.neo4j.ogm.session.Session;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Repository
+public class Neo4JPokemonRepositoryImpl extends GenericNeo4JRepositoryImpl implements Neo4JPokemonRepository {
+
+ @Override
+ public Pokemon findByDexId(int dexId) {
+ Session session = getSession();
+ Map params = new HashMap<>();
+ params.put("dexId", dexId);
+
+ return session.queryForObject(Pokemon.class, "MATCH (p:Pokemon{pokedexId: $dexId}) RETURN p", params);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepository.java b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepository.java
new file mode 100644
index 0000000..f86795d
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepository.java
@@ -0,0 +1,8 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+
+public interface Neo4JTypeRepository extends GenericNeo4JRepository {
+ Type findByName(String identifier);
+
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepositoryImpl.java b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepositoryImpl.java
new file mode 100644
index 0000000..f8a7f57
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/repository/Neo4JTypeRepositoryImpl.java
@@ -0,0 +1,23 @@
+package at.jku.faw.neo4jdemo.repository;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+import org.neo4j.ogm.session.Session;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Repository
+public class Neo4JTypeRepositoryImpl extends GenericNeo4JRepositoryImpl implements Neo4JTypeRepository {
+ @Override
+ public Type findByName(String name) {
+ Session session = getSession();
+ Map params = new HashMap<>();
+ params.put("name", name);
+
+ return session.queryForObject(Type.class, "MATCH (t:Type{name: $name}) RETURN t", params);
+ }
+
+
+
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/runner/Neo4JRunner.java b/src/main/java/at/jku/faw/neo4jdemo/runner/Neo4JRunner.java
new file mode 100644
index 0000000..9bc3fd7
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/runner/Neo4JRunner.java
@@ -0,0 +1,78 @@
+package at.jku.faw.neo4jdemo.runner;
+
+import org.neo4j.configuration.connectors.BoltConnector;
+import org.neo4j.dbms.api.DatabaseManagementService;
+import org.neo4j.dbms.api.DatabaseManagementServiceBuilder;
+import org.neo4j.graphdb.GraphDatabaseService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ResourceUtils;
+
+import javax.annotation.PreDestroy;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Stack;
+
+@Component
+public class Neo4JRunner implements ApplicationRunner {
+ private static final Logger logger = LoggerFactory.getLogger(Neo4JRunner.class);
+
+ private File dbDir;
+ private DatabaseManagementService dbms;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ dbDir = new File("database");
+ if (!dbDir.exists()) {
+ Files.createDirectory(dbDir.toPath());
+ }
+
+ logger.warn("Database location is {}", dbDir.toPath().toAbsolutePath());
+
+ dbms = new DatabaseManagementServiceBuilder(dbDir.toPath())
+ .setConfig(BoltConnector.enabled, true)
+ .build();
+
+ GraphDatabaseService db = dbms.database("neo4j");
+ if(db.isAvailable(10*1000)) {
+ logger.info("Neo4J is now available.");
+ }
+ logger.warn("Press [CTRL]+[C] to shutdown.");
+ }
+
+ @PreDestroy
+ public void onExit() {
+ logger.warn("Shutting database down.");
+ dbms.shutdown();
+
+ logger.warn("Deleting database directory.");
+ try {
+ Stack files = new Stack<>();
+ files.add(dbDir);
+
+ while (!files.empty()) {
+ File file = files.pop();
+ if(file.isDirectory()) {
+ File[] childFiles = file.listFiles();
+ if(childFiles != null && childFiles.length > 0) {
+ files.add(file);
+ for(File f: childFiles) {
+ files.push(f);
+ }
+ } else {
+ Files.deleteIfExists(file.toPath());
+ }
+ } else {
+ Files.deleteIfExists(file.toPath());
+ }
+ }
+
+ } catch (IOException e) {
+ logger.error("Could not cleanup database directory {}: {}", dbDir.getAbsolutePath(), e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/service/PokemonService.java b/src/main/java/at/jku/faw/neo4jdemo/service/PokemonService.java
new file mode 100644
index 0000000..667ff25
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/service/PokemonService.java
@@ -0,0 +1,9 @@
+package at.jku.faw.neo4jdemo.service;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Pokemon;
+
+public interface PokemonService {
+ Pokemon getPokemonById(int dexId);
+
+ void importAllPokemon();
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/service/PokemonServiceImpl.java b/src/main/java/at/jku/faw/neo4jdemo/service/PokemonServiceImpl.java
new file mode 100644
index 0000000..f548930
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/service/PokemonServiceImpl.java
@@ -0,0 +1,83 @@
+package at.jku.faw.neo4jdemo.service;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvPokemon;
+import at.jku.faw.neo4jdemo.model.neo4j.Legendary;
+import at.jku.faw.neo4jdemo.model.neo4j.Pokemon;
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+import at.jku.faw.neo4jdemo.model.neo4j.TypeRelation;
+import at.jku.faw.neo4jdemo.repository.CsvPokemonRepository;
+import at.jku.faw.neo4jdemo.repository.Neo4JPokemonRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Service
+public class PokemonServiceImpl implements PokemonService {
+ private final CsvPokemonRepository csvPokemonRepository;
+ private final Neo4JPokemonRepository neo4JPokemonRepository;
+ private final TypeService typeService;
+
+ public PokemonServiceImpl(CsvPokemonRepository csvPokemonRepository, Neo4JPokemonRepository neo4JPokemonRepository, TypeService typeService) {
+ this.csvPokemonRepository = csvPokemonRepository;
+ this.neo4JPokemonRepository = neo4JPokemonRepository;
+ this.typeService = typeService;
+ }
+
+ @Override
+ public Pokemon getPokemonById(int dexId) {
+ Pokemon pokemon = neo4JPokemonRepository.findByDexId(dexId);
+ if(pokemon == null) {
+ pokemon = buildPokemonByDexId(dexId);
+ pokemon = neo4JPokemonRepository.save(pokemon);
+ }
+ return pokemon;
+ }
+
+ @Override
+ public void importAllPokemon() {
+ List csvPokemon = csvPokemonRepository.getAll();
+ csvPokemon.forEach(p -> getPokemonById(p.getId()));
+ }
+
+ private Pokemon buildPokemonByDexId(int dexId) {
+ CsvPokemon csvPokemon = csvPokemonRepository.getPokemonById(dexId);
+ Pokemon pokemon = new Pokemon();
+
+ if(csvPokemon.isLegendary()) {
+ pokemon = new Legendary();
+ }
+
+ pokemon.setPokedexId(dexId);
+ pokemon.setName(csvPokemon.getIdentifier());
+
+ Set typeRelations = new HashSet<>();
+ addTypes(typeRelations, pokemon, csvPokemon, 1);
+ addTypes(typeRelations, pokemon, csvPokemon, 2);
+ pokemon.setType(typeRelations);
+
+ Integer evolvesFromId = csvPokemon.getEvolvesFromId();
+ if (evolvesFromId != null) {
+ Pokemon evolvedPokemon = getPokemonById(evolvesFromId);
+ pokemon.setEvolvesTo(evolvedPokemon);
+ }
+
+ return pokemon;
+ }
+
+ private void addTypes(Set typeRelations, Pokemon pokemon, CsvPokemon csvPokemon, int slot) {
+ Type type = typeService.getType(csvPokemon.getId(), slot);
+
+ if(type == null) {
+ return;
+ }
+
+ TypeRelation typeRelation = new TypeRelation();
+ typeRelation.setPokemon(pokemon);
+ typeRelation.setType(type);
+ typeRelation.setSlot(slot);
+
+ typeRelations.add(typeRelation);
+ }
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/service/TypeService.java b/src/main/java/at/jku/faw/neo4jdemo/service/TypeService.java
new file mode 100644
index 0000000..6d81921
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/service/TypeService.java
@@ -0,0 +1,7 @@
+package at.jku.faw.neo4jdemo.service;
+
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+
+public interface TypeService {
+ Type getType(int csvId, int slot);
+}
diff --git a/src/main/java/at/jku/faw/neo4jdemo/service/TypeServiceImpl.java b/src/main/java/at/jku/faw/neo4jdemo/service/TypeServiceImpl.java
new file mode 100644
index 0000000..9827cc7
--- /dev/null
+++ b/src/main/java/at/jku/faw/neo4jdemo/service/TypeServiceImpl.java
@@ -0,0 +1,36 @@
+package at.jku.faw.neo4jdemo.service;
+
+import at.jku.faw.neo4jdemo.model.csv.CsvType;
+import at.jku.faw.neo4jdemo.model.neo4j.Type;
+import at.jku.faw.neo4jdemo.repository.CsvTypeRepository;
+import at.jku.faw.neo4jdemo.repository.Neo4JTypeRepository;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TypeServiceImpl implements TypeService {
+ private final CsvTypeRepository csvTypeRepository;
+ private final Neo4JTypeRepository neo4JTypeRepository;
+
+ public TypeServiceImpl(CsvTypeRepository csvTypeRepository, Neo4JTypeRepository neo4JTypeRepository) {
+ this.csvTypeRepository = csvTypeRepository;
+ this.neo4JTypeRepository = neo4JTypeRepository;
+ }
+
+ @Override
+ public Type getType(int csvId, int slot) {
+ CsvType csvType = csvTypeRepository.getType(csvId, slot);
+ if (csvType == null) {
+ return null;
+ }
+
+ Type type = neo4JTypeRepository.findByName(csvType.getIdentifier());
+
+ if(type == null) {
+ type = new Type();
+ type.setName(csvType.getIdentifier());
+ type = neo4JTypeRepository.save(type);
+ }
+
+ return type;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..1255bfe
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1 @@
+neo4j.uri=bolt://127.0.0.1:7687/
diff --git a/src/main/resources/data/map.cypher b/src/main/resources/data/map.cypher
new file mode 100644
index 0000000..146c92a
--- /dev/null
+++ b/src/main/resources/data/map.cypher
@@ -0,0 +1,46 @@
+CREATE
+ (snowpoint_city:City{name:"Snowpoint City"}),
+ (eterna_city:City{name:"Eterna City"}),
+ (celestic_city:City{name:"Celestic City"}),
+ (floaroma_city:City{name:"Floaroma City"}),
+ (veilstone_city:City{name:"Veilstone City"}),
+ (solaceon_city:City{name:"Solaceon City"}),
+ (hearthome_city:City{name:"Hearthome City"}),
+ (canalave_city:City{name:"Canalave City"}),
+ (jubilife_city:City{name:"Jubilife City"}),
+ (oreburgh_city:City{name:"Oreburgh City"}),
+ (sunyshore_city:City{name:"Sunyshore City"}),
+ (pastoria_city:City{name:"Pastoria City"}),
+ (sand_gem_town:Town{name:"Sand Gem Town"}),
+ (twinleaf_town:Town{name:"TwinLeaf Town"}),
+ (lake_acuity:Lake{name:"Lake Acuity"}),
+ (lake_varity:Lake{name:"Lake Varity"}),
+ (lake_valor:Lake{name:"Lake Valor"}),
+
+ (canalave_city)-[:ROUTE{number: 218}]->(jubilife_city),
+ (jubilife_city)-[:ROUTE{number: 205}]->(floaroma_city),
+ (jubilife_city)-[:ROUTE{number: 203}]->(oreburgh_city),
+ (jubilife_city)-[:ROUTE{number: 202}]->(sand_gem_town),
+ (sand_gem_town)-[:ROUTE{number: 201}]->(lake_varity),
+ (sand_gem_town)-[:ROUTE{number: 201}]->(twinleaf_town),
+ (oreburgh_city)-[:ROUTE{number: 206}]->(eterna_city),
+ (oreburgh_city)-[:ROUTE{number: 208}]->(hearthome_city),
+ (eterna_city)-[:ROUTE{number: 211}]->(celestic_city),
+ (eterna_city)-[:ROUTE{number: 216}]->(lake_acuity),
+ (eterna_city)-[:ROUTE{number: 216}]->(snowpoint_city),
+ (celestic_city)-[:ROUTE{number: 210}]->(solaceon_city),
+ (celestic_city)-[:ROUTE{number: 215}]->(veilstone_city),
+ (solaceon_city)-[:ROUTE{number: 209}]->(hearthome_city),
+ (hearthome_city)-[:ROUTE{number: 212}]->(pastoria_city),
+ (pastoria_city)-[:ROUTE{number: 213}]->(lake_valor),
+ (lake_valor)-[:ROUTE{number: 222}]->(sunyshore_city),
+ (lake_valor)-[:ROUTE{number: 214}]->(veilstone_city),
+
+ (snowpoint_city)-[:ROUTE{number: 217}]->(hearthome_city)
+
+
+
+//match p=(start:CITY{name:"Snowpoint City"})-[:ROUTE*]-(end:CITY{name:"Hearthome City"}) return p
+//match p=(start:CITY{name:"Snowpoint City"})-[:ROUTE*]->(end:CITY{name:"Hearthome City"}) return p
+//match p=shortestPath((start:CITY{name:"Snowpoint City"})-[:ROUTE*]-(end:CITY{name:"Hearthome City"})) return p
+//match p=shortestPath((start:CITY{name:"Snowpoint City"})-[:ROUTE*..10]-(end:CITY{name:"Hearthome City"})) return p
diff --git a/src/main/resources/data/pokemon.csv b/src/main/resources/data/pokemon.csv
new file mode 100644
index 0000000..780a1d6
--- /dev/null
+++ b/src/main/resources/data/pokemon.csv
@@ -0,0 +1,1093 @@
+id,identifier,species_id,height,weight,base_experience,order,is_default
+1,bulbasaur,1,7,69,64,1,1
+2,ivysaur,2,10,130,142,2,1
+3,venusaur,3,20,1000,263,3,1
+4,charmander,4,6,85,62,5,1
+5,charmeleon,5,11,190,142,6,1
+6,charizard,6,17,905,267,7,1
+7,squirtle,7,5,90,63,10,1
+8,wartortle,8,10,225,142,11,1
+9,blastoise,9,16,855,265,12,1
+10,caterpie,10,3,29,39,14,1
+11,metapod,11,7,99,72,15,1
+12,butterfree,12,11,320,198,16,1
+13,weedle,13,3,32,39,17,1
+14,kakuna,14,6,100,72,18,1
+15,beedrill,15,10,295,178,19,1
+16,pidgey,16,3,18,50,21,1
+17,pidgeotto,17,11,300,122,22,1
+18,pidgeot,18,15,395,216,23,1
+19,rattata,19,3,35,51,25,1
+20,raticate,20,7,185,145,27,1
+21,spearow,21,3,20,52,30,1
+22,fearow,22,12,380,155,31,1
+23,ekans,23,20,69,58,32,1
+24,arbok,24,35,650,157,33,1
+25,pikachu,25,4,60,112,35,1
+26,raichu,26,8,300,243,51,1
+27,sandshrew,27,6,120,60,53,1
+28,sandslash,28,10,295,158,55,1
+29,nidoran-f,29,4,70,55,57,1
+30,nidorina,30,8,200,128,58,1
+31,nidoqueen,31,13,600,253,59,1
+32,nidoran-m,32,5,90,55,60,1
+33,nidorino,33,9,195,128,61,1
+34,nidoking,34,14,620,253,62,1
+35,clefairy,35,6,75,113,64,1
+36,clefable,36,13,400,242,65,1
+37,vulpix,37,6,99,60,66,1
+38,ninetales,38,11,199,177,68,1
+39,jigglypuff,39,5,55,95,71,1
+40,wigglytuff,40,10,120,218,72,1
+41,zubat,41,8,75,49,73,1
+42,golbat,42,16,550,159,74,1
+43,oddish,43,5,54,64,76,1
+44,gloom,44,8,86,138,77,1
+45,vileplume,45,12,186,245,78,1
+46,paras,46,3,54,57,80,1
+47,parasect,47,10,295,142,81,1
+48,venonat,48,10,300,61,82,1
+49,venomoth,49,15,125,158,83,1
+50,diglett,50,2,8,53,84,1
+51,dugtrio,51,7,333,149,86,1
+52,meowth,52,4,42,58,88,1
+53,persian,53,10,320,154,91,1
+54,psyduck,54,8,196,64,93,1
+55,golduck,55,17,766,175,94,1
+56,mankey,56,5,280,61,95,1
+57,primeape,57,10,320,159,96,1
+58,growlithe,58,7,190,70,97,1
+59,arcanine,59,19,1550,194,98,1
+60,poliwag,60,6,124,60,99,1
+61,poliwhirl,61,10,200,135,100,1
+62,poliwrath,62,13,540,255,101,1
+63,abra,63,9,195,62,103,1
+64,kadabra,64,13,565,140,104,1
+65,alakazam,65,15,480,250,105,1
+66,machop,66,8,195,61,107,1
+67,machoke,67,15,705,142,108,1
+68,machamp,68,16,1300,253,109,1
+69,bellsprout,69,7,40,60,110,1
+70,weepinbell,70,10,64,137,111,1
+71,victreebel,71,17,155,221,112,1
+72,tentacool,72,9,455,67,113,1
+73,tentacruel,73,16,550,180,114,1
+74,geodude,74,4,200,60,115,1
+75,graveler,75,10,1050,137,117,1
+76,golem,76,14,3000,223,119,1
+77,ponyta,77,10,300,82,121,1
+78,rapidash,78,17,950,175,123,1
+79,slowpoke,79,12,360,63,125,1
+80,slowbro,80,16,785,172,127,1
+81,magnemite,81,3,60,65,132,1
+82,magneton,82,10,600,163,133,1
+83,farfetchd,83,8,150,132,135,1
+84,doduo,84,14,392,62,137,1
+85,dodrio,85,18,852,165,138,1
+86,seel,86,11,900,65,139,1
+87,dewgong,87,17,1200,166,140,1
+88,grimer,88,9,300,65,141,1
+89,muk,89,12,300,175,143,1
+90,shellder,90,3,40,61,145,1
+91,cloyster,91,15,1325,184,146,1
+92,gastly,92,13,1,62,147,1
+93,haunter,93,16,1,142,148,1
+94,gengar,94,15,405,250,149,1
+95,onix,95,88,2100,77,151,1
+96,drowzee,96,10,324,66,154,1
+97,hypno,97,16,756,169,155,1
+98,krabby,98,4,65,65,156,1
+99,kingler,99,13,600,166,157,1
+100,voltorb,100,5,104,66,158,1
+101,electrode,101,12,666,172,159,1
+102,exeggcute,102,4,25,65,160,1
+103,exeggutor,103,20,1200,186,161,1
+104,cubone,104,4,65,64,163,1
+105,marowak,105,10,450,149,164,1
+106,hitmonlee,106,15,498,159,168,1
+107,hitmonchan,107,14,502,159,169,1
+108,lickitung,108,12,655,77,171,1
+109,koffing,109,6,10,68,173,1
+110,weezing,110,12,95,172,174,1
+111,rhyhorn,111,10,1150,69,176,1
+112,rhydon,112,19,1200,170,177,1
+113,chansey,113,11,346,395,180,1
+114,tangela,114,10,350,87,182,1
+115,kangaskhan,115,22,800,172,184,1
+116,horsea,116,4,80,59,186,1
+117,seadra,117,12,250,154,187,1
+118,goldeen,118,6,150,64,189,1
+119,seaking,119,13,390,158,190,1
+120,staryu,120,8,345,68,191,1
+121,starmie,121,11,800,182,192,1
+122,mr-mime,122,13,545,161,194,1
+123,scyther,123,15,560,100,196,1
+124,jynx,124,14,406,159,200,1
+125,electabuzz,125,11,300,172,202,1
+126,magmar,126,13,445,173,205,1
+127,pinsir,127,15,550,175,207,1
+128,tauros,128,14,884,172,209,1
+129,magikarp,129,9,100,40,210,1
+130,gyarados,130,65,2350,189,211,1
+131,lapras,131,25,2200,187,213,1
+132,ditto,132,3,40,101,214,1
+133,eevee,133,3,65,65,215,1
+134,vaporeon,134,10,290,184,217,1
+135,jolteon,135,8,245,184,218,1
+136,flareon,136,9,250,184,219,1
+137,porygon,137,8,365,79,225,1
+138,omanyte,138,4,75,71,228,1
+139,omastar,139,10,350,173,229,1
+140,kabuto,140,5,115,71,230,1
+141,kabutops,141,13,405,173,231,1
+142,aerodactyl,142,18,590,180,232,1
+143,snorlax,143,21,4600,189,235,1
+144,articuno,144,17,554,290,236,1
+145,zapdos,145,16,526,290,238,1
+146,moltres,146,20,600,290,240,1
+147,dratini,147,18,33,60,242,1
+148,dragonair,148,40,165,147,243,1
+149,dragonite,149,22,2100,300,244,1
+150,mewtwo,150,20,1220,340,245,1
+151,mew,151,4,40,300,248,1
+152,chikorita,152,9,64,64,249,1
+153,bayleef,153,12,158,142,250,1
+154,meganium,154,18,1005,236,251,1
+155,cyndaquil,155,5,79,62,252,1
+156,quilava,156,9,190,142,253,1
+157,typhlosion,157,17,795,240,254,1
+158,totodile,158,6,95,63,255,1
+159,croconaw,159,11,250,142,256,1
+160,feraligatr,160,23,888,239,257,1
+161,sentret,161,8,60,43,258,1
+162,furret,162,18,325,145,259,1
+163,hoothoot,163,7,212,52,260,1
+164,noctowl,164,16,408,158,261,1
+165,ledyba,165,10,108,53,262,1
+166,ledian,166,14,356,137,263,1
+167,spinarak,167,5,85,50,264,1
+168,ariados,168,11,335,140,265,1
+169,crobat,169,18,750,268,75,1
+170,chinchou,170,5,120,66,266,1
+171,lanturn,171,12,225,161,267,1
+172,pichu,172,3,20,41,34,1
+173,cleffa,173,3,30,44,63,1
+174,igglybuff,174,3,10,42,70,1
+175,togepi,175,3,15,49,268,1
+176,togetic,176,6,32,142,269,1
+177,natu,177,2,20,64,271,1
+178,xatu,178,15,150,165,272,1
+179,mareep,179,6,78,56,273,1
+180,flaaffy,180,8,133,128,274,1
+181,ampharos,181,14,615,230,275,1
+182,bellossom,182,4,58,245,79,1
+183,marill,183,4,85,88,278,1
+184,azumarill,184,8,285,210,279,1
+185,sudowoodo,185,12,380,144,281,1
+186,politoed,186,11,339,250,102,1
+187,hoppip,187,4,5,50,282,1
+188,skiploom,188,6,10,119,283,1
+189,jumpluff,189,8,30,207,284,1
+190,aipom,190,8,115,72,285,1
+191,sunkern,191,3,18,36,287,1
+192,sunflora,192,8,85,149,288,1
+193,yanma,193,12,380,78,289,1
+194,wooper,194,4,85,42,291,1
+195,quagsire,195,14,750,151,292,1
+196,espeon,196,9,265,184,220,1
+197,umbreon,197,10,270,184,221,1
+198,murkrow,198,5,21,81,293,1
+199,slowking,199,20,795,172,130,1
+200,misdreavus,200,7,10,87,295,1
+201,unown,201,5,50,118,297,1
+202,wobbuffet,202,13,285,142,299,1
+203,girafarig,203,15,415,159,300,1
+204,pineco,204,6,72,58,301,1
+205,forretress,205,12,1258,163,302,1
+206,dunsparce,206,15,140,145,303,1
+207,gligar,207,11,648,86,304,1
+208,steelix,208,92,4000,179,152,1
+209,snubbull,209,6,78,60,306,1
+210,granbull,210,14,487,158,307,1
+211,qwilfish,211,5,39,88,308,1
+212,scizor,212,18,1180,175,197,1
+213,shuckle,213,6,205,177,309,1
+214,heracross,214,15,540,175,310,1
+215,sneasel,215,9,280,86,312,1
+216,teddiursa,216,6,88,66,314,1
+217,ursaring,217,18,1258,175,315,1
+218,slugma,218,7,350,50,316,1
+219,magcargo,219,8,550,151,317,1
+220,swinub,220,4,65,50,318,1
+221,piloswine,221,11,558,158,319,1
+222,corsola,222,6,50,144,321,1
+223,remoraid,223,6,120,60,323,1
+224,octillery,224,9,285,168,324,1
+225,delibird,225,9,160,116,325,1
+226,mantine,226,21,2200,170,327,1
+227,skarmory,227,17,505,163,328,1
+228,houndour,228,6,108,66,329,1
+229,houndoom,229,14,350,175,330,1
+230,kingdra,230,18,1520,270,188,1
+231,phanpy,231,5,335,66,332,1
+232,donphan,232,11,1200,175,333,1
+233,porygon2,233,6,325,180,226,1
+234,stantler,234,14,712,163,334,1
+235,smeargle,235,12,580,88,335,1
+236,tyrogue,236,7,210,42,167,1
+237,hitmontop,237,14,480,159,170,1
+238,smoochum,238,4,60,61,199,1
+239,elekid,239,6,235,72,201,1
+240,magby,240,7,214,73,204,1
+241,miltank,241,12,755,172,336,1
+242,blissey,242,15,468,635,181,1
+243,raikou,243,19,1780,290,337,1
+244,entei,244,21,1980,290,338,1
+245,suicune,245,20,1870,290,339,1
+246,larvitar,246,6,720,60,340,1
+247,pupitar,247,12,1520,144,341,1
+248,tyranitar,248,20,2020,300,342,1
+249,lugia,249,52,2160,340,344,1
+250,ho-oh,250,38,1990,340,345,1
+251,celebi,251,6,50,300,346,1
+252,treecko,252,5,50,62,347,1
+253,grovyle,253,9,216,142,348,1
+254,sceptile,254,17,522,265,349,1
+255,torchic,255,4,25,62,351,1
+256,combusken,256,9,195,142,352,1
+257,blaziken,257,19,520,265,353,1
+258,mudkip,258,4,76,62,355,1
+259,marshtomp,259,7,280,142,356,1
+260,swampert,260,15,819,268,357,1
+261,poochyena,261,5,136,56,359,1
+262,mightyena,262,10,370,147,360,1
+263,zigzagoon,263,4,175,56,361,1
+264,linoone,264,5,325,147,363,1
+265,wurmple,265,3,36,56,365,1
+266,silcoon,266,6,100,72,366,1
+267,beautifly,267,10,284,178,367,1
+268,cascoon,268,7,115,72,368,1
+269,dustox,269,12,316,173,369,1
+270,lotad,270,5,26,44,370,1
+271,lombre,271,12,325,119,371,1
+272,ludicolo,272,15,550,240,372,1
+273,seedot,273,5,40,44,373,1
+274,nuzleaf,274,10,280,119,374,1
+275,shiftry,275,13,596,240,375,1
+276,taillow,276,3,23,54,376,1
+277,swellow,277,7,198,159,377,1
+278,wingull,278,6,95,54,378,1
+279,pelipper,279,12,280,154,379,1
+280,ralts,280,4,66,40,380,1
+281,kirlia,281,8,202,97,381,1
+282,gardevoir,282,16,484,259,382,1
+283,surskit,283,5,17,54,386,1
+284,masquerain,284,8,36,159,387,1
+285,shroomish,285,4,45,59,388,1
+286,breloom,286,12,392,161,389,1
+287,slakoth,287,8,240,56,390,1
+288,vigoroth,288,14,465,154,391,1
+289,slaking,289,20,1305,252,392,1
+290,nincada,290,5,55,53,393,1
+291,ninjask,291,8,120,160,394,1
+292,shedinja,292,8,12,83,395,1
+293,whismur,293,6,163,48,396,1
+294,loudred,294,10,405,126,397,1
+295,exploud,295,15,840,245,398,1
+296,makuhita,296,10,864,47,399,1
+297,hariyama,297,23,2538,166,400,1
+298,azurill,298,2,20,38,277,1
+299,nosepass,299,10,970,75,401,1
+300,skitty,300,6,110,52,403,1
+301,delcatty,301,11,326,140,404,1
+302,sableye,302,5,110,133,405,1
+303,mawile,303,6,115,133,407,1
+304,aron,304,4,600,66,409,1
+305,lairon,305,9,1200,151,410,1
+306,aggron,306,21,3600,265,411,1
+307,meditite,307,6,112,56,413,1
+308,medicham,308,13,315,144,414,1
+309,electrike,309,6,152,59,416,1
+310,manectric,310,15,402,166,417,1
+311,plusle,311,4,42,142,419,1
+312,minun,312,4,42,142,420,1
+313,volbeat,313,7,177,151,421,1
+314,illumise,314,6,177,151,422,1
+315,roselia,315,3,20,140,424,1
+316,gulpin,316,4,103,60,426,1
+317,swalot,317,17,800,163,427,1
+318,carvanha,318,8,208,61,428,1
+319,sharpedo,319,18,888,161,429,1
+320,wailmer,320,20,1300,80,431,1
+321,wailord,321,145,3980,175,432,1
+322,numel,322,7,240,61,433,1
+323,camerupt,323,19,2200,161,434,1
+324,torkoal,324,5,804,165,436,1
+325,spoink,325,7,306,66,437,1
+326,grumpig,326,9,715,165,438,1
+327,spinda,327,11,50,126,439,1
+328,trapinch,328,7,150,58,440,1
+329,vibrava,329,11,153,119,441,1
+330,flygon,330,20,820,260,442,1
+331,cacnea,331,4,513,67,443,1
+332,cacturne,332,13,774,166,444,1
+333,swablu,333,4,12,62,445,1
+334,altaria,334,11,206,172,446,1
+335,zangoose,335,13,403,160,448,1
+336,seviper,336,27,525,160,449,1
+337,lunatone,337,10,1680,161,450,1
+338,solrock,338,12,1540,161,451,1
+339,barboach,339,4,19,58,452,1
+340,whiscash,340,9,236,164,453,1
+341,corphish,341,6,115,62,454,1
+342,crawdaunt,342,11,328,164,455,1
+343,baltoy,343,5,215,60,456,1
+344,claydol,344,15,1080,175,457,1
+345,lileep,345,10,238,71,458,1
+346,cradily,346,15,604,173,459,1
+347,anorith,347,7,125,71,460,1
+348,armaldo,348,15,682,173,461,1
+349,feebas,349,6,74,40,462,1
+350,milotic,350,62,1620,189,463,1
+351,castform,351,3,8,147,464,1
+352,kecleon,352,10,220,154,468,1
+353,shuppet,353,6,23,59,469,1
+354,banette,354,11,125,159,470,1
+355,duskull,355,8,150,59,472,1
+356,dusclops,356,16,306,159,473,1
+357,tropius,357,20,1000,161,475,1
+358,chimecho,358,6,10,159,477,1
+359,absol,359,12,470,163,478,1
+360,wynaut,360,6,140,52,298,1
+361,snorunt,361,7,168,60,480,1
+362,glalie,362,15,2565,168,481,1
+363,spheal,363,8,395,58,484,1
+364,sealeo,364,11,876,144,485,1
+365,walrein,365,14,1506,265,486,1
+366,clamperl,366,4,525,69,487,1
+367,huntail,367,17,270,170,488,1
+368,gorebyss,368,18,226,170,489,1
+369,relicanth,369,10,234,170,490,1
+370,luvdisc,370,6,87,116,491,1
+371,bagon,371,6,421,60,492,1
+372,shelgon,372,11,1105,147,493,1
+373,salamence,373,15,1026,300,494,1
+374,beldum,374,6,952,60,496,1
+375,metang,375,12,2025,147,497,1
+376,metagross,376,16,5500,300,498,1
+377,regirock,377,17,2300,290,500,1
+378,regice,378,18,1750,290,501,1
+379,registeel,379,19,2050,290,502,1
+380,latias,380,14,400,300,503,1
+381,latios,381,20,600,300,505,1
+382,kyogre,382,45,3520,335,507,1
+383,groudon,383,35,9500,335,509,1
+384,rayquaza,384,70,2065,340,511,1
+385,jirachi,385,3,11,300,513,1
+386,deoxys-normal,386,17,608,270,514,1
+387,turtwig,387,4,102,64,518,1
+388,grotle,388,11,970,142,519,1
+389,torterra,389,22,3100,236,520,1
+390,chimchar,390,5,62,62,521,1
+391,monferno,391,9,220,142,522,1
+392,infernape,392,12,550,240,523,1
+393,piplup,393,4,52,63,524,1
+394,prinplup,394,8,230,142,525,1
+395,empoleon,395,17,845,239,526,1
+396,starly,396,3,20,49,527,1
+397,staravia,397,6,155,119,528,1
+398,staraptor,398,12,249,218,529,1
+399,bidoof,399,5,200,50,530,1
+400,bibarel,400,10,315,144,531,1
+401,kricketot,401,3,22,39,532,1
+402,kricketune,402,10,255,134,533,1
+403,shinx,403,5,95,53,534,1
+404,luxio,404,9,305,127,535,1
+405,luxray,405,14,420,262,536,1
+406,budew,406,2,12,56,423,1
+407,roserade,407,9,145,258,425,1
+408,cranidos,408,9,315,70,537,1
+409,rampardos,409,16,1025,173,538,1
+410,shieldon,410,5,570,70,539,1
+411,bastiodon,411,13,1495,173,540,1
+412,burmy,412,2,34,45,541,1
+413,wormadam-plant,413,5,65,148,542,1
+414,mothim,414,9,233,148,545,1
+415,combee,415,3,55,49,546,1
+416,vespiquen,416,12,385,166,547,1
+417,pachirisu,417,4,39,142,548,1
+418,buizel,418,7,295,66,549,1
+419,floatzel,419,11,335,173,550,1
+420,cherubi,420,4,33,55,551,1
+421,cherrim,421,5,93,158,552,1
+422,shellos,422,3,63,65,553,1
+423,gastrodon,423,9,299,166,554,1
+424,ambipom,424,12,203,169,286,1
+425,drifloon,425,4,12,70,555,1
+426,drifblim,426,12,150,174,556,1
+427,buneary,427,4,55,70,557,1
+428,lopunny,428,12,333,168,558,1
+429,mismagius,429,9,44,173,296,1
+430,honchkrow,430,9,273,177,294,1
+431,glameow,431,5,39,62,560,1
+432,purugly,432,10,438,158,561,1
+433,chingling,433,2,6,57,476,1
+434,stunky,434,4,192,66,562,1
+435,skuntank,435,10,380,168,563,1
+436,bronzor,436,5,605,60,564,1
+437,bronzong,437,13,1870,175,565,1
+438,bonsly,438,5,150,58,280,1
+439,mime-jr,439,6,130,62,193,1
+440,happiny,440,6,244,110,179,1
+441,chatot,441,5,19,144,566,1
+442,spiritomb,442,10,1080,170,567,1
+443,gible,443,7,205,60,568,1
+444,gabite,444,14,560,144,569,1
+445,garchomp,445,19,950,300,570,1
+446,munchlax,446,6,1050,78,234,1
+447,riolu,447,7,202,57,572,1
+448,lucario,448,12,540,184,573,1
+449,hippopotas,449,8,495,66,575,1
+450,hippowdon,450,20,3000,184,576,1
+451,skorupi,451,8,120,66,577,1
+452,drapion,452,13,615,175,578,1
+453,croagunk,453,7,230,60,579,1
+454,toxicroak,454,13,444,172,580,1
+455,carnivine,455,14,270,159,581,1
+456,finneon,456,4,70,66,582,1
+457,lumineon,457,12,240,161,583,1
+458,mantyke,458,10,650,69,326,1
+459,snover,459,10,505,67,584,1
+460,abomasnow,460,22,1355,173,585,1
+461,weavile,461,11,340,179,313,1
+462,magnezone,462,12,1800,268,134,1
+463,lickilicky,463,17,1400,180,172,1
+464,rhyperior,464,24,2828,268,178,1
+465,tangrowth,465,20,1286,187,183,1
+466,electivire,466,18,1386,270,203,1
+467,magmortar,467,16,680,270,206,1
+468,togekiss,468,15,380,273,270,1
+469,yanmega,469,19,515,180,290,1
+470,leafeon,470,10,255,184,222,1
+471,glaceon,471,8,259,184,223,1
+472,gliscor,472,20,425,179,305,1
+473,mamoswine,473,25,2910,265,320,1
+474,porygon-z,474,9,340,268,227,1
+475,gallade,475,16,520,259,384,1
+476,probopass,476,14,3400,184,402,1
+477,dusknoir,477,22,1066,263,474,1
+478,froslass,478,13,266,168,483,1
+479,rotom,479,3,3,154,587,1
+480,uxie,480,3,3,290,593,1
+481,mesprit,481,3,3,290,594,1
+482,azelf,482,3,3,290,595,1
+483,dialga,483,54,6830,340,596,1
+484,palkia,484,42,3360,340,597,1
+485,heatran,485,17,4300,300,598,1
+486,regigigas,486,37,4200,335,599,1
+487,giratina-altered,487,45,7500,340,600,1
+488,cresselia,488,15,856,300,602,1
+489,phione,489,4,31,216,603,1
+490,manaphy,490,3,14,270,604,1
+491,darkrai,491,15,505,270,605,1
+492,shaymin-land,492,2,21,270,606,1
+493,arceus,493,32,3200,324,608,1
+494,victini,494,4,40,300,609,1
+495,snivy,495,6,81,62,610,1
+496,servine,496,8,160,145,611,1
+497,serperior,497,33,630,238,612,1
+498,tepig,498,5,99,62,613,1
+499,pignite,499,10,555,146,614,1
+500,emboar,500,16,1500,238,615,1
+501,oshawott,501,5,59,62,616,1
+502,dewott,502,8,245,145,617,1
+503,samurott,503,15,946,238,618,1
+504,patrat,504,5,116,51,619,1
+505,watchog,505,11,270,147,620,1
+506,lillipup,506,4,41,55,621,1
+507,herdier,507,9,147,130,622,1
+508,stoutland,508,12,610,250,623,1
+509,purrloin,509,4,101,56,624,1
+510,liepard,510,11,375,156,625,1
+511,pansage,511,6,105,63,626,1
+512,simisage,512,11,305,174,627,1
+513,pansear,513,6,110,63,628,1
+514,simisear,514,10,280,174,629,1
+515,panpour,515,6,135,63,630,1
+516,simipour,516,10,290,174,631,1
+517,munna,517,6,233,58,632,1
+518,musharna,518,11,605,170,633,1
+519,pidove,519,3,21,53,634,1
+520,tranquill,520,6,150,125,635,1
+521,unfezant,521,12,290,244,636,1
+522,blitzle,522,8,298,59,637,1
+523,zebstrika,523,16,795,174,638,1
+524,roggenrola,524,4,180,56,639,1
+525,boldore,525,9,1020,137,640,1
+526,gigalith,526,17,2600,258,641,1
+527,woobat,527,4,21,65,642,1
+528,swoobat,528,9,105,149,643,1
+529,drilbur,529,3,85,66,644,1
+530,excadrill,530,7,404,178,645,1
+531,audino,531,11,310,390,646,1
+532,timburr,532,6,125,61,648,1
+533,gurdurr,533,12,400,142,649,1
+534,conkeldurr,534,14,870,253,650,1
+535,tympole,535,5,45,59,651,1
+536,palpitoad,536,8,170,134,652,1
+537,seismitoad,537,15,620,255,653,1
+538,throh,538,13,555,163,654,1
+539,sawk,539,14,510,163,655,1
+540,sewaddle,540,3,25,62,656,1
+541,swadloon,541,5,73,133,657,1
+542,leavanny,542,12,205,225,658,1
+543,venipede,543,4,53,52,659,1
+544,whirlipede,544,12,585,126,660,1
+545,scolipede,545,25,2005,243,661,1
+546,cottonee,546,3,6,56,662,1
+547,whimsicott,547,7,66,168,663,1
+548,petilil,548,5,66,56,664,1
+549,lilligant,549,11,163,168,665,1
+550,basculin-red-striped,550,10,180,161,666,1
+551,sandile,551,7,152,58,668,1
+552,krokorok,552,10,334,123,669,1
+553,krookodile,553,15,963,260,670,1
+554,darumaka,554,6,375,63,671,1
+555,darmanitan-standard,555,13,929,168,673,1
+556,maractus,556,10,280,161,677,1
+557,dwebble,557,3,145,65,678,1
+558,crustle,558,14,2000,170,679,1
+559,scraggy,559,6,118,70,680,1
+560,scrafty,560,11,300,171,681,1
+561,sigilyph,561,14,140,172,682,1
+562,yamask,562,5,15,61,683,1
+563,cofagrigus,563,17,765,169,685,1
+564,tirtouga,564,7,165,71,686,1
+565,carracosta,565,12,810,173,687,1
+566,archen,566,5,95,71,688,1
+567,archeops,567,14,320,177,689,1
+568,trubbish,568,6,310,66,690,1
+569,garbodor,569,19,1073,166,691,1
+570,zorua,570,7,125,66,692,1
+571,zoroark,571,16,811,179,693,1
+572,minccino,572,4,58,60,694,1
+573,cinccino,573,5,75,165,695,1
+574,gothita,574,4,58,58,696,1
+575,gothorita,575,7,180,137,697,1
+576,gothitelle,576,15,440,245,698,1
+577,solosis,577,3,10,58,699,1
+578,duosion,578,6,80,130,700,1
+579,reuniclus,579,10,201,245,701,1
+580,ducklett,580,5,55,61,702,1
+581,swanna,581,13,242,166,703,1
+582,vanillite,582,4,57,61,704,1
+583,vanillish,583,11,410,138,705,1
+584,vanilluxe,584,13,575,268,706,1
+585,deerling,585,6,195,67,707,1
+586,sawsbuck,586,19,925,166,708,1
+587,emolga,587,4,50,150,709,1
+588,karrablast,588,5,59,63,710,1
+589,escavalier,589,10,330,173,711,1
+590,foongus,590,2,10,59,712,1
+591,amoonguss,591,6,105,162,713,1
+592,frillish,592,12,330,67,714,1
+593,jellicent,593,22,1350,168,715,1
+594,alomomola,594,12,316,165,716,1
+595,joltik,595,1,6,64,717,1
+596,galvantula,596,8,143,165,718,1
+597,ferroseed,597,6,188,61,719,1
+598,ferrothorn,598,10,1100,171,720,1
+599,klink,599,3,210,60,721,1
+600,klang,600,6,510,154,722,1
+601,klinklang,601,6,810,260,723,1
+602,tynamo,602,2,3,55,724,1
+603,eelektrik,603,12,220,142,725,1
+604,eelektross,604,21,805,232,726,1
+605,elgyem,605,5,90,67,727,1
+606,beheeyem,606,10,345,170,728,1
+607,litwick,607,3,31,55,729,1
+608,lampent,608,6,130,130,730,1
+609,chandelure,609,10,343,260,731,1
+610,axew,610,6,180,64,732,1
+611,fraxure,611,10,360,144,733,1
+612,haxorus,612,18,1055,270,734,1
+613,cubchoo,613,5,85,61,735,1
+614,beartic,614,26,2600,177,736,1
+615,cryogonal,615,11,1480,180,737,1
+616,shelmet,616,4,77,61,738,1
+617,accelgor,617,8,253,173,739,1
+618,stunfisk,618,7,110,165,740,1
+619,mienfoo,619,9,200,70,742,1
+620,mienshao,620,14,355,179,743,1
+621,druddigon,621,16,1390,170,744,1
+622,golett,622,10,920,61,745,1
+623,golurk,623,28,3300,169,746,1
+624,pawniard,624,5,102,68,747,1
+625,bisharp,625,16,700,172,748,1
+626,bouffalant,626,16,946,172,749,1
+627,rufflet,627,5,105,70,750,1
+628,braviary,628,15,410,179,751,1
+629,vullaby,629,5,90,74,752,1
+630,mandibuzz,630,12,395,179,753,1
+631,heatmor,631,14,580,169,754,1
+632,durant,632,3,330,169,755,1
+633,deino,633,8,173,60,756,1
+634,zweilous,634,14,500,147,757,1
+635,hydreigon,635,18,1600,300,758,1
+636,larvesta,636,11,288,72,759,1
+637,volcarona,637,16,460,275,760,1
+638,cobalion,638,21,2500,290,761,1
+639,terrakion,639,19,2600,290,762,1
+640,virizion,640,20,2000,290,763,1
+641,tornadus-incarnate,641,15,630,290,764,1
+642,thundurus-incarnate,642,15,610,290,766,1
+643,reshiram,643,32,3300,340,768,1
+644,zekrom,644,29,3450,340,769,1
+645,landorus-incarnate,645,15,680,300,770,1
+646,kyurem,646,30,3250,330,772,1
+647,keldeo-ordinary,647,14,485,290,775,1
+648,meloetta-aria,648,6,65,270,777,1
+649,genesect,649,15,825,300,779,1
+650,chespin,650,4,90,63,780,1
+651,quilladin,651,7,290,142,781,1
+652,chesnaught,652,16,900,239,782,1
+653,fennekin,653,4,94,61,783,1
+654,braixen,654,10,145,143,784,1
+655,delphox,655,15,390,240,785,1
+656,froakie,656,3,70,63,786,1
+657,frogadier,657,6,109,142,787,1
+658,greninja,658,15,400,239,788,1
+659,bunnelby,659,4,50,47,791,1
+660,diggersby,660,10,424,148,792,1
+661,fletchling,661,3,17,56,793,1
+662,fletchinder,662,7,160,134,794,1
+663,talonflame,663,12,245,175,795,1
+664,scatterbug,664,3,25,40,796,1
+665,spewpa,665,3,84,75,797,1
+666,vivillon,666,12,170,185,798,1
+667,litleo,667,6,135,74,799,1
+668,pyroar,668,15,815,177,800,1
+669,flabebe,669,1,1,61,801,1
+670,floette,670,2,9,130,802,1
+671,florges,671,11,100,248,804,1
+672,skiddo,672,9,310,70,805,1
+673,gogoat,673,17,910,186,806,1
+674,pancham,674,6,80,70,807,1
+675,pangoro,675,21,1360,173,808,1
+676,furfrou,676,12,280,165,809,1
+677,espurr,677,3,35,71,810,1
+678,meowstic-male,678,6,85,163,811,1
+679,honedge,679,8,20,65,813,1
+680,doublade,680,8,45,157,814,1
+681,aegislash-shield,681,17,530,250,815,1
+682,spritzee,682,2,5,68,817,1
+683,aromatisse,683,8,155,162,818,1
+684,swirlix,684,4,35,68,819,1
+685,slurpuff,685,8,50,168,820,1
+686,inkay,686,4,35,58,821,1
+687,malamar,687,15,470,169,822,1
+688,binacle,688,5,310,61,823,1
+689,barbaracle,689,13,960,175,824,1
+690,skrelp,690,5,73,64,825,1
+691,dragalge,691,18,815,173,826,1
+692,clauncher,692,5,83,66,827,1
+693,clawitzer,693,13,353,100,828,1
+694,helioptile,694,5,60,58,829,1
+695,heliolisk,695,10,210,168,830,1
+696,tyrunt,696,8,260,72,831,1
+697,tyrantrum,697,25,2700,182,832,1
+698,amaura,698,13,252,72,833,1
+699,aurorus,699,27,2250,104,834,1
+700,sylveon,700,10,235,184,224,1
+701,hawlucha,701,8,215,175,835,1
+702,dedenne,702,2,22,151,836,1
+703,carbink,703,3,57,100,837,1
+704,goomy,704,3,28,60,838,1
+705,sliggoo,705,8,175,158,839,1
+706,goodra,706,20,1505,300,840,1
+707,klefki,707,2,30,165,841,1
+708,phantump,708,4,70,62,842,1
+709,trevenant,709,15,710,166,843,1
+710,pumpkaboo-average,710,4,50,67,844,1
+711,gourgeist-average,711,9,125,173,848,1
+712,bergmite,712,10,995,61,852,1
+713,avalugg,713,20,5050,180,853,1
+714,noibat,714,5,80,49,854,1
+715,noivern,715,15,850,187,855,1
+716,xerneas,716,30,2150,340,856,1
+717,yveltal,717,58,2030,340,857,1
+718,zygarde-50,718,50,3050,300,858,1
+719,diancie,719,7,88,300,863,1
+720,hoopa,720,5,90,270,865,1
+721,volcanion,721,17,1950,300,867,1
+722,rowlet,722,3,15,64,868,1
+723,dartrix,723,7,160,147,869,1
+724,decidueye,724,16,366,265,870,1
+725,litten,725,4,43,64,871,1
+726,torracat,726,7,250,147,872,1
+727,incineroar,727,18,830,265,873,1
+728,popplio,728,4,75,64,874,1
+729,brionne,729,6,175,147,875,1
+730,primarina,730,18,440,265,876,1
+731,pikipek,731,3,12,53,877,1
+732,trumbeak,732,6,148,124,878,1
+733,toucannon,733,11,260,218,879,1
+734,yungoos,734,4,60,51,880,1
+735,gumshoos,735,7,142,146,881,1
+736,grubbin,736,4,44,60,883,1
+737,charjabug,737,5,105,140,884,1
+738,vikavolt,738,15,450,250,885,1
+739,crabrawler,739,6,70,68,887,1
+740,crabominable,740,17,1800,167,888,1
+741,oricorio-baile,741,6,34,167,889,1
+742,cutiefly,742,1,2,61,893,1
+743,ribombee,743,2,5,162,894,1
+744,rockruff,744,5,92,56,896,1
+745,lycanroc-midday,745,8,250,170,898,1
+746,wishiwashi-solo,746,2,3,61,901,1
+747,mareanie,747,4,80,61,903,1
+748,toxapex,748,7,145,173,904,1
+749,mudbray,749,10,1100,77,905,1
+750,mudsdale,750,25,9200,175,906,1
+751,dewpider,751,3,40,54,907,1
+752,araquanid,752,18,820,159,908,1
+753,fomantis,753,3,15,50,910,1
+754,lurantis,754,9,185,168,911,1
+755,morelull,755,2,15,57,913,1
+756,shiinotic,756,10,115,142,914,1
+757,salandit,757,6,48,64,915,1
+758,salazzle,758,12,222,168,916,1
+759,stufful,759,5,68,68,918,1
+760,bewear,760,21,1350,175,919,1
+761,bounsweet,761,3,32,42,920,1
+762,steenee,762,7,82,102,921,1
+763,tsareena,763,12,214,255,922,1
+764,comfey,764,1,3,170,923,1
+765,oranguru,765,15,760,172,924,1
+766,passimian,766,20,828,172,925,1
+767,wimpod,767,5,120,46,926,1
+768,golisopod,768,20,1080,186,927,1
+769,sandygast,769,5,700,64,928,1
+770,palossand,770,13,2500,168,929,1
+771,pyukumuku,771,3,12,144,930,1
+772,type-null,772,19,1205,107,931,1
+773,silvally,773,23,1005,285,932,1
+774,minior-red-meteor,774,3,400,154,933,1
+775,komala,775,4,199,168,947,1
+776,turtonator,776,20,2120,170,948,1
+777,togedemaru,777,3,33,152,949,1
+778,mimikyu-disguised,778,2,7,167,951,1
+779,bruxish,779,9,190,166,955,1
+780,drampa,780,30,1850,170,956,1
+781,dhelmise,781,39,2100,181,957,1
+782,jangmo-o,782,6,297,60,958,1
+783,hakamo-o,783,12,470,147,959,1
+784,kommo-o,784,16,782,300,960,1
+785,tapu-koko,785,18,205,285,962,1
+786,tapu-lele,786,12,186,285,963,1
+787,tapu-bulu,787,19,455,285,964,1
+788,tapu-fini,788,13,212,285,965,1
+789,cosmog,789,2,1,40,966,1
+790,cosmoem,790,1,9999,140,967,1
+791,solgaleo,791,34,2300,340,968,1
+792,lunala,792,40,1200,340,969,1
+793,nihilego,793,12,555,285,970,1
+794,buzzwole,794,24,3336,285,971,1
+795,pheromosa,795,18,250,285,972,1
+796,xurkitree,796,38,1000,285,973,1
+797,celesteela,797,92,9999,285,974,1
+798,kartana,798,3,1,285,975,1
+799,guzzlord,799,55,8880,285,976,1
+800,necrozma,800,24,2300,300,977,1
+801,magearna,801,10,805,300,981,1
+802,marshadow,802,7,222,300,983,1
+803,poipole,803,6,18,210,984,1
+804,naganadel,804,36,1500,270,985,1
+805,stakataka,805,55,8200,285,986,1
+806,blacephalon,806,18,130,285,987,1
+807,zeraora,807,15,445,300,988,1
+808,meltan,808,2,80,150,989,1
+809,melmetal,809,25,8000,300,990,1
+810,grookey,810,3,50,62,991,1
+811,thwackey,811,7,140,147,992,1
+812,rillaboom,812,21,900,265,993,1
+813,scorbunny,813,3,45,62,994,1
+814,raboot,814,6,90,147,995,1
+815,cinderace,815,14,330,265,996,1
+816,sobble,816,3,40,62,997,1
+817,drizzile,817,7,115,147,998,1
+818,inteleon,818,19,452,265,999,1
+819,skwovet,819,3,25,55,1000,1
+820,greedent,820,6,60,161,1001,1
+821,rookidee,821,2,18,49,1002,1
+822,corvisquire,822,8,160,128,1003,1
+823,corviknight,823,22,750,248,1004,1
+824,blipbug,824,4,80,36,1005,1
+825,dottler,825,4,195,117,1006,1
+826,orbeetle,826,4,408,253,1007,1
+827,nickit,827,6,89,49,1008,1
+828,thievul,828,12,199,159,1009,1
+829,gossifleur,829,4,22,50,1010,1
+830,eldegoss,830,5,25,161,1011,1
+831,wooloo,831,6,60,122,1012,1
+832,dubwool,832,13,430,172,1013,1
+833,chewtle,833,3,85,57,1014,1
+834,drednaw,834,10,1155,170,1015,1
+835,yamper,835,3,135,54,1016,1
+836,boltund,836,10,340,172,1017,1
+837,rolycoly,837,3,120,48,1018,1
+838,carkol,838,11,780,144,1019,1
+839,coalossal,839,28,3105,255,1020,1
+840,applin,840,2,5,52,1021,1
+841,flapple,841,3,10,170,1022,1
+842,appletun,842,4,130,170,1023,1
+843,silicobra,843,22,76,63,1024,1
+844,sandaconda,844,38,655,179,1025,1
+845,cramorant,845,8,180,166,1026,1
+846,arrokuda,846,5,10,56,1029,1
+847,barraskewda,847,13,300,172,1030,1
+848,toxel,848,4,110,48,1031,1
+849,toxtricity-amped,849,16,400,176,1032,1
+850,sizzlipede,850,7,10,61,1034,1
+851,centiskorch,851,30,1200,184,1035,1
+852,clobbopus,852,6,40,62,1036,1
+853,grapploct,853,16,390,168,1037,1
+854,sinistea,854,1,2,62,1038,1
+855,polteageist,855,2,4,178,1039,1
+856,hatenna,856,4,34,53,1040,1
+857,hattrem,857,6,48,130,1041,1
+858,hatterene,858,21,51,255,1042,1
+859,impidimp,859,4,55,53,1043,1
+860,morgrem,860,8,125,130,1044,1
+861,grimmsnarl,861,15,610,255,1045,1
+862,obstagoon,862,16,460,260,1046,1
+863,perrserker,863,8,280,154,1047,1
+864,cursola,864,10,4,179,1048,1
+865,sirfetchd,865,8,1170,177,1049,1
+866,mr-rime,866,15,582,182,1050,1
+867,runerigus,867,16,666,169,1051,1
+868,milcery,868,2,3,54,1052,1
+869,alcremie,869,3,5,173,1053,1
+870,falinks,870,30,620,165,1054,1
+871,pincurchin,871,3,10,152,1055,1
+872,snom,872,3,38,37,1056,1
+873,frosmoth,873,13,420,166,1057,1
+874,stonjourner,874,25,5200,165,1058,1
+875,eiscue-ice,875,14,890,165,1059,1
+876,indeedee-male,876,9,280,166,1061,1
+877,morpeko-full-belly,877,3,30,153,1063,1
+878,cufant,878,12,1000,66,1065,1
+879,copperajah,879,30,6500,175,1066,1
+880,dracozolt,880,18,1900,177,1067,1
+881,arctozolt,881,23,1500,177,1068,1
+882,dracovish,882,23,2150,177,1069,1
+883,arctovish,883,20,1750,177,1070,1
+884,duraludon,884,18,400,187,1071,1
+885,dreepy,885,5,20,54,1072,1
+886,drakloak,886,14,110,144,1073,1
+887,dragapult,887,30,500,300,1074,1
+888,zacian,888,28,1100,335,1075,1
+889,zamazenta,889,29,2100,335,1077,1
+890,eternatus,890,200,9500,345,1079,1
+891,kubfu,891,6,120,77,1081,1
+892,urshifu-single-strike,892,19,1050,275,1082,1
+893,zarude,893,18,700,300,1084,1
+894,regieleki,894,12,1450,290,1086,1
+895,regidrago,895,21,2000,290,1087,1
+896,glastrier,896,22,8000,290,1088,1
+897,spectrier,897,20,445,290,1089,1
+898,calyrex,898,11,77,250,1090,1
+10001,deoxys-attack,386,17,608,270,515,0
+10002,deoxys-defense,386,17,608,270,516,0
+10003,deoxys-speed,386,17,608,270,517,0
+10004,wormadam-sandy,413,5,65,148,543,0
+10005,wormadam-trash,413,5,65,148,544,0
+10006,shaymin-sky,492,4,52,270,607,0
+10007,giratina-origin,487,69,6500,340,601,0
+10008,rotom-heat,479,3,3,182,588,0
+10009,rotom-wash,479,3,3,182,589,0
+10010,rotom-frost,479,3,3,182,590,0
+10011,rotom-fan,479,3,3,182,591,0
+10012,rotom-mow,479,3,3,182,592,0
+10013,castform-sunny,351,3,8,147,465,0
+10014,castform-rainy,351,3,8,147,466,0
+10015,castform-snowy,351,3,8,147,467,0
+10016,basculin-blue-striped,550,10,180,161,667,0
+10017,darmanitan-zen,555,13,929,189,674,0
+10018,meloetta-pirouette,648,6,65,270,778,0
+10019,tornadus-therian,641,14,630,290,765,0
+10020,thundurus-therian,642,30,610,290,767,0
+10021,landorus-therian,645,13,680,300,771,0
+10022,kyurem-black,646,33,3250,350,774,0
+10023,kyurem-white,646,36,3250,350,773,0
+10024,keldeo-resolute,647,14,485,290,776,0
+10025,meowstic-female,678,6,85,163,812,0
+10026,aegislash-blade,681,17,530,250,816,0
+10027,pumpkaboo-small,710,3,35,67,845,0
+10028,pumpkaboo-large,710,5,75,67,846,0
+10029,pumpkaboo-super,710,8,150,67,847,0
+10030,gourgeist-small,711,7,95,173,849,0
+10031,gourgeist-large,711,11,140,173,850,0
+10032,gourgeist-super,711,17,390,173,851,0
+10033,venusaur-mega,3,24,1555,281,4,0
+10034,charizard-mega-x,6,17,1105,285,8,0
+10035,charizard-mega-y,6,17,1005,285,9,0
+10036,blastoise-mega,9,16,1011,284,13,0
+10037,alakazam-mega,65,12,480,270,106,0
+10038,gengar-mega,94,14,405,270,150,0
+10039,kangaskhan-mega,115,22,1000,207,185,0
+10040,pinsir-mega,127,17,590,210,208,0
+10041,gyarados-mega,130,65,3050,224,212,0
+10042,aerodactyl-mega,142,21,790,215,233,0
+10043,mewtwo-mega-x,150,23,1270,351,246,0
+10044,mewtwo-mega-y,150,15,330,351,247,0
+10045,ampharos-mega,181,14,615,275,276,0
+10046,scizor-mega,212,20,1250,210,198,0
+10047,heracross-mega,214,17,625,210,311,0
+10048,houndoom-mega,229,19,495,210,331,0
+10049,tyranitar-mega,248,25,2550,315,343,0
+10050,blaziken-mega,257,19,520,284,354,0
+10051,gardevoir-mega,282,16,484,278,383,0
+10052,mawile-mega,303,10,235,168,408,0
+10053,aggron-mega,306,22,3950,284,412,0
+10054,medicham-mega,308,13,315,179,415,0
+10055,manectric-mega,310,18,440,201,418,0
+10056,banette-mega,354,12,130,194,471,0
+10057,absol-mega,359,12,490,198,479,0
+10058,garchomp-mega,445,19,950,315,571,0
+10059,lucario-mega,448,13,575,219,574,0
+10060,abomasnow-mega,460,27,1850,208,586,0
+10061,floette-eternal,670,2,9,243,803,0
+10062,latias-mega,380,18,520,315,504,0
+10063,latios-mega,381,23,700,315,506,0
+10064,swampert-mega,260,19,1020,286,358,0
+10065,sceptile-mega,254,19,552,284,350,0
+10066,sableye-mega,302,5,1610,168,406,0
+10067,altaria-mega,334,15,206,207,447,0
+10068,gallade-mega,475,16,564,278,385,0
+10069,audino-mega,531,15,320,425,647,0
+10070,sharpedo-mega,319,25,1303,196,430,0
+10071,slowbro-mega,80,20,1200,207,128,0
+10072,steelix-mega,208,105,7400,214,153,0
+10073,pidgeot-mega,18,22,505,261,24,0
+10074,glalie-mega,362,21,3502,203,482,0
+10075,diancie-mega,719,11,278,315,864,0
+10076,metagross-mega,376,25,9429,315,499,0
+10077,kyogre-primal,382,98,4300,347,508,0
+10078,groudon-primal,383,50,9997,347,510,0
+10079,rayquaza-mega,384,108,3920,351,512,0
+10080,pikachu-rock-star,25,4,60,112,37,0
+10081,pikachu-belle,25,4,60,112,38,0
+10082,pikachu-pop-star,25,4,60,112,39,0
+10083,pikachu-phd,25,4,60,112,40,0
+10084,pikachu-libre,25,4,60,112,41,0
+10085,pikachu-cosplay,25,4,60,112,36,0
+10086,hoopa-unbound,720,65,4900,306,866,0
+10087,camerupt-mega,323,25,3205,196,435,0
+10088,lopunny-mega,428,13,283,203,559,0
+10089,salamence-mega,373,18,1126,315,495,0
+10090,beedrill-mega,15,14,405,223,20,0
+10091,rattata-alola,19,3,38,51,26,0
+10092,raticate-alola,20,7,255,145,28,0
+10093,raticate-totem-alola,20,14,1050,145,29,0
+10094,pikachu-original-cap,25,4,60,112,42,0
+10095,pikachu-hoenn-cap,25,4,60,112,43,0
+10096,pikachu-sinnoh-cap,25,4,60,112,44,0
+10097,pikachu-unova-cap,25,4,60,112,45,0
+10098,pikachu-kalos-cap,25,4,60,112,46,0
+10099,pikachu-alola-cap,25,4,60,112,47,0
+10100,raichu-alola,26,7,210,243,52,0
+10101,sandshrew-alola,27,7,400,60,54,0
+10102,sandslash-alola,28,12,550,158,56,0
+10103,vulpix-alola,37,6,99,60,67,0
+10104,ninetales-alola,38,11,199,177,69,0
+10105,diglett-alola,50,2,10,53,85,0
+10106,dugtrio-alola,51,7,666,149,87,0
+10107,meowth-alola,52,4,42,58,89,0
+10108,persian-alola,53,11,330,154,92,0
+10109,geodude-alola,74,4,203,60,116,0
+10110,graveler-alola,75,10,1100,137,118,0
+10111,golem-alola,76,17,3160,223,120,0
+10112,grimer-alola,88,7,420,65,142,0
+10113,muk-alola,89,10,520,175,144,0
+10114,exeggutor-alola,103,109,4156,186,162,0
+10115,marowak-alola,105,10,340,149,165,0
+10116,greninja-battle-bond,658,15,400,239,789,0
+10117,greninja-ash,658,15,400,288,790,0
+10118,zygarde-10-power-construct,718,12,335,243,860,0
+10119,zygarde-50-power-construct,718,50,3050,300,861,0
+10120,zygarde-complete,718,45,6100,354,862,0
+10121,gumshoos-totem,735,14,600,146,882,0
+10122,vikavolt-totem,738,26,1475,225,886,0
+10123,oricorio-pom-pom,741,6,34,167,890,0
+10124,oricorio-pau,741,6,34,167,891,0
+10125,oricorio-sensu,741,6,34,167,892,0
+10126,lycanroc-midnight,745,11,250,170,899,0
+10127,wishiwashi-school,746,82,786,217,902,0
+10128,lurantis-totem,754,15,580,168,912,0
+10129,salazzle-totem,758,21,810,168,917,0
+10130,minior-orange-meteor,774,3,400,154,934,0
+10131,minior-yellow-meteor,774,3,400,154,935,0
+10132,minior-green-meteor,774,3,400,154,936,0
+10133,minior-blue-meteor,774,3,400,154,937,0
+10134,minior-indigo-meteor,774,3,400,154,938,0
+10135,minior-violet-meteor,774,3,400,154,939,0
+10136,minior-red,774,3,3,175,940,0
+10137,minior-orange,774,3,3,175,941,0
+10138,minior-yellow,774,3,3,175,942,0
+10139,minior-green,774,3,3,175,943,0
+10140,minior-blue,774,3,3,175,944,0
+10141,minior-indigo,774,3,3,175,945,0
+10142,minior-violet,774,3,3,175,946,0
+10143,mimikyu-busted,778,2,7,167,952,0
+10144,mimikyu-totem-disguised,778,4,28,167,953,0
+10145,mimikyu-totem-busted,778,4,28,167,954,0
+10146,kommo-o-totem,784,24,2075,270,961,0
+10147,magearna-original,801,10,805,300,982,0
+10148,pikachu-partner-cap,25,4,60,112,48,0
+10149,marowak-totem,105,17,980,149,166,0
+10150,ribombee-totem,743,4,20,162,895,0
+10151,rockruff-own-tempo,744,5,92,56,897,0
+10152,lycanroc-dusk,745,8,250,170,900,0
+10153,araquanid-totem,752,31,2175,159,909,0
+10154,togedemaru-totem,777,6,130,152,950,0
+10155,necrozma-dusk,800,38,4600,340,978,0
+10156,necrozma-dawn,800,42,3500,340,979,0
+10157,necrozma-ultra,800,75,2300,339,980,0
+10158,pikachu-starter,25,4,60,86,49,0
+10159,eevee-starter,133,3,65,87,216,0
+10160,pikachu-world-cap,25,4,60,112,50,0
+10161,meowth-galar,52,4,75,58,90,0
+10162,ponyta-galar,77,8,240,82,122,0
+10163,rapidash-galar,78,17,800,175,124,0
+10164,slowpoke-galar,79,12,360,63,126,0
+10165,slowbro-galar,80,16,705,172,129,0
+10166,farfetchd-galar,83,8,420,132,136,0
+10167,weezing-galar,110,30,160,172,175,0
+10168,mr-mime-galar,122,14,568,161,195,0
+10169,articuno-galar,144,17,509,290,237,0
+10170,zapdos-galar,145,16,582,290,239,0
+10171,moltres-galar,146,20,660,290,241,0
+10172,slowking-galar,199,18,795,172,131,0
+10173,corsola-galar,222,6,5,144,322,0
+10174,zigzagoon-galar,263,4,175,56,362,0
+10175,linoone-galar,264,5,325,147,364,0
+10176,darumaka-galar,554,7,400,63,672,0
+10177,darmanitan-galar-standard,555,17,1200,168,675,0
+10178,darmanitan-galar-zen,555,17,1200,189,676,0
+10179,yamask-galar,562,5,15,61,684,0
+10180,stunfisk-galar,618,7,205,165,741,0
+10181,zygarde-10,718,12,335,243,859,0
+10182,cramorant-gulping,845,8,180,166,1027,0
+10183,cramorant-gorging,845,8,180,166,1028,0
+10184,toxtricity-low-key,849,16,400,176,1033,0
+10185,eiscue-noice,875,14,890,165,1060,0
+10186,indeedee-female,876,9,280,166,1062,0
+10187,morpeko-hangry,877,3,30,153,1064,0
+10188,zacian-crowned,888,28,3550,360,1076,0
+10189,zamazenta-crowned,889,29,7850,360,1078,0
+10190,eternatus-eternamax,890,1000,0,563,1080,0
+10191,urshifu-rapid-strike,892,19,1050,275,1083,0
+10192,zarude-dada,893,18,700,300,1085,0
+10193,calyrex-ice,898,24,8091,340,1091,0
+10194,calyrex-shadow,898,24,536,340,1092,0
diff --git a/src/main/resources/data/pokemon_species.csv b/src/main/resources/data/pokemon_species.csv
new file mode 100644
index 0000000..7c97411
--- /dev/null
+++ b/src/main/resources/data/pokemon_species.csv
@@ -0,0 +1,899 @@
+id,identifier,generation_id,evolves_from_species_id,evolution_chain_id,color_id,shape_id,habitat_id,gender_rate,capture_rate,base_happiness,is_baby,hatch_counter,has_gender_differences,growth_rate_id,forms_switchable,is_legendary,is_mythical,order,conquest_order
+1,bulbasaur,1,,1,5,8,3,1,45,50,0,20,0,4,0,0,0,1,
+2,ivysaur,1,1,1,5,8,3,1,45,50,0,20,0,4,0,0,0,2,
+3,venusaur,1,2,1,5,8,3,1,45,50,0,20,1,4,1,0,0,3,
+4,charmander,1,,2,8,6,4,1,45,50,0,20,0,4,0,0,0,4,109
+5,charmeleon,1,4,2,8,6,4,1,45,50,0,20,0,4,0,0,0,5,110
+6,charizard,1,5,2,8,6,4,1,45,50,0,20,0,4,1,0,0,6,111
+7,squirtle,1,,3,2,6,9,1,45,50,0,20,0,4,0,0,0,7,
+8,wartortle,1,7,3,2,6,9,1,45,50,0,20,0,4,0,0,0,8,
+9,blastoise,1,8,3,2,6,9,1,45,50,0,20,0,4,1,0,0,9,
+10,caterpie,1,,4,5,14,2,4,255,50,0,15,0,2,0,0,0,10,
+11,metapod,1,10,4,5,2,2,4,120,50,0,15,0,2,0,0,0,11,
+12,butterfree,1,11,4,9,13,2,4,45,50,0,15,1,2,0,0,0,12,
+13,weedle,1,,5,3,14,2,4,255,70,0,15,0,2,0,0,0,13,
+14,kakuna,1,13,5,10,2,2,4,120,70,0,15,0,2,0,0,0,14,
+15,beedrill,1,14,5,10,13,2,4,45,70,0,15,0,2,1,0,0,15,177
+16,pidgey,1,,6,3,9,2,4,255,70,0,15,0,4,0,0,0,16,
+17,pidgeotto,1,16,6,3,9,2,4,120,70,0,15,0,4,0,0,0,17,
+18,pidgeot,1,17,6,3,9,2,4,45,70,0,15,0,4,1,0,0,18,
+19,rattata,1,,7,7,8,3,4,255,70,0,15,1,2,0,0,0,19,
+20,raticate,1,19,7,3,8,3,4,127,70,0,15,1,2,0,0,0,20,
+21,spearow,1,,8,3,9,6,4,255,70,0,15,0,2,0,0,0,21,
+22,fearow,1,21,8,3,9,6,4,90,70,0,15,0,2,0,0,0,22,
+23,ekans,1,,9,7,2,3,4,255,70,0,20,0,2,0,0,0,23,54
+24,arbok,1,23,9,7,2,3,4,90,70,0,20,0,2,0,0,0,24,55
+25,pikachu,1,172,10,10,8,2,4,190,50,0,10,1,2,0,0,0,26,16
+26,raichu,1,25,10,10,6,2,4,75,50,0,10,1,2,0,0,0,27,17
+27,sandshrew,1,,11,10,6,6,4,255,50,0,20,0,2,0,0,0,28,
+28,sandslash,1,27,11,10,6,6,4,90,50,0,20,0,2,0,0,0,29,
+29,nidoran-f,1,,12,2,8,3,8,235,50,0,20,0,4,0,0,0,30,
+30,nidorina,1,29,12,2,8,3,8,120,50,0,20,0,4,0,0,0,31,
+31,nidoqueen,1,30,12,2,6,3,8,45,50,0,20,0,4,0,0,0,32,
+32,nidoran-m,1,,13,7,8,3,0,235,50,0,20,0,4,0,0,0,33,
+33,nidorino,1,32,13,7,8,3,0,120,50,0,20,0,4,0,0,0,34,
+34,nidoking,1,33,13,7,6,3,0,45,50,0,20,0,4,0,0,0,35,
+35,clefairy,1,173,14,6,6,4,6,150,140,0,10,0,3,0,0,0,37,
+36,clefable,1,35,14,6,6,4,6,25,140,0,10,0,3,0,0,0,38,
+37,vulpix,1,,15,3,8,3,6,190,50,0,20,0,2,0,0,0,39,
+38,ninetales,1,37,15,10,8,3,6,75,50,0,20,0,2,0,0,0,40,
+39,jigglypuff,1,174,16,6,12,3,6,170,50,0,10,0,3,0,0,0,42,21
+40,wigglytuff,1,39,16,6,12,3,6,50,50,0,10,0,3,0,0,0,43,22
+41,zubat,1,,17,7,9,1,4,255,50,0,15,1,2,0,0,0,44,23
+42,golbat,1,41,17,7,9,1,4,90,50,0,15,1,2,0,0,0,45,24
+43,oddish,1,,18,2,7,3,4,255,50,0,20,0,4,0,0,0,47,
+44,gloom,1,43,18,2,12,3,4,120,50,0,20,1,4,0,0,0,48,
+45,vileplume,1,44,18,8,12,3,4,45,50,0,20,1,4,0,0,0,49,
+46,paras,1,,19,8,14,2,4,190,70,0,20,0,2,0,0,0,51,
+47,parasect,1,46,19,8,14,2,4,75,70,0,20,0,2,0,0,0,52,
+48,venonat,1,,20,7,12,2,4,190,70,0,20,0,2,0,0,0,53,
+49,venomoth,1,48,20,7,13,2,4,75,70,0,20,0,2,0,0,0,54,
+50,diglett,1,,21,3,5,1,4,255,50,0,20,0,2,0,0,0,55,
+51,dugtrio,1,50,21,3,11,1,4,50,50,0,20,0,2,0,0,0,56,
+52,meowth,1,,22,10,8,8,4,255,50,0,20,0,2,0,0,0,57,58
+53,persian,1,52,22,10,8,8,4,90,50,0,20,0,2,0,0,0,58,59
+54,psyduck,1,,23,10,6,9,4,190,50,0,20,0,2,0,0,0,59,
+55,golduck,1,54,23,2,6,9,4,75,50,0,20,0,2,0,0,0,60,
+56,mankey,1,,24,3,6,4,4,190,70,0,20,0,2,0,0,0,61,
+57,primeape,1,56,24,3,6,4,4,75,70,0,20,0,2,0,0,0,62,
+58,growlithe,1,,25,3,8,3,2,190,50,0,20,0,1,0,0,0,63,
+59,arcanine,1,58,25,3,8,3,2,75,50,0,20,0,1,0,0,0,64,
+60,poliwag,1,,26,2,7,9,4,255,50,0,20,0,4,0,0,0,65,
+61,poliwhirl,1,60,26,2,12,9,4,120,50,0,20,0,4,0,0,0,66,
+62,poliwrath,1,61,26,2,12,9,4,45,50,0,20,0,4,0,0,0,67,
+63,abra,1,,27,3,6,8,2,200,50,0,20,0,4,0,0,0,69,127
+64,kadabra,1,63,27,3,6,8,2,100,50,0,20,1,4,0,0,0,70,128
+65,alakazam,1,64,27,3,12,8,2,50,50,0,20,1,4,1,0,0,71,129
+66,machop,1,,28,4,6,4,2,180,50,0,20,0,4,0,0,0,72,98
+67,machoke,1,66,28,4,12,4,2,90,50,0,20,0,4,0,0,0,73,99
+68,machamp,1,67,28,4,12,4,2,45,50,0,20,0,4,0,0,0,74,100
+69,bellsprout,1,,29,5,12,2,4,255,70,0,20,0,4,0,0,0,75,
+70,weepinbell,1,69,29,5,5,2,4,120,70,0,20,0,4,0,0,0,76,
+71,victreebel,1,70,29,5,5,2,4,45,70,0,20,0,4,0,0,0,77,
+72,tentacool,1,,30,2,10,7,4,190,50,0,20,0,1,0,0,0,78,
+73,tentacruel,1,72,30,2,10,7,4,60,50,0,20,0,1,0,0,0,79,
+74,geodude,1,,31,3,4,4,4,255,70,0,15,0,4,0,0,0,80,
+75,graveler,1,74,31,3,12,4,4,120,70,0,15,0,4,0,0,0,81,
+76,golem,1,75,31,3,12,4,4,45,70,0,15,0,4,0,0,0,82,
+77,ponyta,1,,32,10,8,3,4,190,50,0,20,0,2,0,0,0,83,
+78,rapidash,1,77,32,10,8,3,4,60,50,0,20,0,2,0,0,0,84,
+79,slowpoke,1,,33,6,8,9,4,190,50,0,20,0,2,0,0,0,85,
+80,slowbro,1,79,33,6,6,9,4,75,50,0,20,0,2,1,0,0,86,
+81,magnemite,1,,34,4,4,6,-1,190,50,0,20,0,2,0,0,0,88,
+82,magneton,1,81,34,4,11,6,-1,60,50,0,20,0,2,0,0,0,89,
+83,farfetchd,1,,35,3,9,3,4,45,50,0,20,0,2,0,0,0,91,
+84,doduo,1,,36,3,7,3,4,190,70,0,20,1,2,0,0,0,92,
+85,dodrio,1,84,36,3,7,3,4,45,70,0,20,1,2,0,0,0,93,
+86,seel,1,,37,9,3,7,4,190,70,0,20,0,2,0,0,0,94,
+87,dewgong,1,86,37,9,3,7,4,75,70,0,20,0,2,0,0,0,95,
+88,grimer,1,,38,7,4,8,4,190,70,0,20,0,2,0,0,0,96,
+89,muk,1,88,38,7,4,8,4,75,70,0,20,0,2,0,0,0,97,
+90,shellder,1,,39,7,1,7,4,190,50,0,20,0,1,0,0,0,98,
+91,cloyster,1,90,39,7,1,7,4,60,50,0,20,0,1,0,0,0,99,
+92,gastly,1,,40,7,1,1,4,190,50,0,20,0,4,0,0,0,100,112
+93,haunter,1,92,40,7,4,1,4,90,50,0,20,0,4,0,0,0,101,113
+94,gengar,1,93,40,7,6,1,4,45,50,0,20,0,4,1,0,0,102,114
+95,onix,1,,41,4,2,1,4,45,50,0,25,0,2,0,0,0,103,175
+96,drowzee,1,,42,10,12,3,4,190,70,0,20,0,2,0,0,0,105,
+97,hypno,1,96,42,10,12,3,4,75,70,0,20,1,2,0,0,0,106,
+98,krabby,1,,43,8,14,9,4,225,50,0,20,0,2,0,0,0,107,
+99,kingler,1,98,43,8,14,9,4,60,50,0,20,0,2,0,0,0,108,
+100,voltorb,1,,44,8,1,8,-1,190,70,0,20,0,2,0,0,0,109,
+101,electrode,1,100,44,8,1,8,-1,60,70,0,20,0,2,0,0,0,110,
+102,exeggcute,1,,45,6,11,2,4,90,50,0,20,0,1,0,0,0,111,
+103,exeggutor,1,102,45,10,7,2,4,45,50,0,20,0,1,0,0,0,112,
+104,cubone,1,,46,3,6,4,4,190,50,0,20,0,2,0,0,0,113,
+105,marowak,1,104,46,3,6,4,4,75,50,0,20,0,2,0,0,0,114,
+106,hitmonlee,1,236,47,3,12,8,0,45,50,0,25,0,2,0,0,0,116,
+107,hitmonchan,1,236,47,3,12,8,0,45,50,0,25,0,2,0,0,0,117,
+108,lickitung,1,,48,6,6,3,4,45,50,0,20,0,2,0,0,0,119,
+109,koffing,1,,49,7,1,8,4,190,50,0,20,0,2,0,0,0,121,
+110,weezing,1,109,49,7,11,8,4,60,50,0,20,0,2,0,0,0,122,
+111,rhyhorn,1,,50,4,8,6,4,120,50,0,20,1,1,0,0,0,123,160
+112,rhydon,1,111,50,4,6,6,4,60,50,0,20,1,1,0,0,0,124,161
+113,chansey,1,440,51,6,6,8,8,30,140,0,40,0,3,0,0,0,127,
+114,tangela,1,,52,2,7,3,4,45,50,0,20,0,2,0,0,0,129,
+115,kangaskhan,1,,53,3,6,3,8,45,50,0,20,0,2,1,0,0,131,
+116,horsea,1,,54,2,5,7,4,225,50,0,20,0,2,0,0,0,132,
+117,seadra,1,116,54,2,5,7,4,75,50,0,20,0,2,0,0,0,133,
+118,goldeen,1,,55,8,3,9,4,225,50,0,20,1,2,0,0,0,135,
+119,seaking,1,118,55,8,3,9,4,60,50,0,20,1,2,0,0,0,136,
+120,staryu,1,,56,3,5,7,-1,225,50,0,20,0,1,0,0,0,137,
+121,starmie,1,120,56,7,5,7,-1,60,50,0,20,0,1,0,0,0,138,
+122,mr-mime,1,439,57,6,12,8,4,45,50,0,25,0,2,0,0,0,140,
+123,scyther,1,,58,5,13,3,4,45,50,0,25,1,2,0,0,0,141,188
+124,jynx,1,238,59,8,12,8,8,45,50,0,25,0,2,0,0,0,144,
+125,electabuzz,1,239,60,10,6,3,2,45,50,0,25,0,2,0,0,0,146,
+126,magmar,1,240,61,8,6,4,2,45,50,0,25,0,2,0,0,0,149,
+127,pinsir,1,,62,3,12,2,4,45,50,0,25,0,1,1,0,0,151,
+128,tauros,1,,63,3,8,3,0,45,50,0,20,0,1,0,0,0,152,
+129,magikarp,1,,64,8,3,9,4,255,50,0,5,1,1,0,0,0,153,13
+130,gyarados,1,129,64,2,2,9,4,45,50,0,5,1,1,1,0,0,154,14
+131,lapras,1,,65,2,3,7,4,45,50,0,40,0,1,0,0,0,155,190
+132,ditto,1,,66,7,1,8,-1,35,50,0,20,0,2,0,0,0,156,
+133,eevee,1,,67,3,8,8,1,45,50,0,35,0,2,0,0,0,157,1
+134,vaporeon,1,133,67,2,8,8,1,45,50,0,35,0,2,0,0,0,158,2
+135,jolteon,1,133,67,10,8,8,1,45,50,0,35,0,2,0,0,0,159,3
+136,flareon,1,133,67,8,8,8,1,45,50,0,35,0,2,0,0,0,160,4
+137,porygon,1,,68,6,7,8,-1,45,50,0,20,0,2,0,0,0,166,
+138,omanyte,1,,69,2,10,7,1,45,50,0,30,0,2,0,0,0,169,
+139,omastar,1,138,69,2,10,7,1,45,50,0,30,0,2,0,0,0,170,
+140,kabuto,1,,70,3,14,7,1,45,50,0,30,0,2,0,0,0,171,
+141,kabutops,1,140,70,3,6,7,1,45,50,0,30,0,2,0,0,0,172,
+142,aerodactyl,1,,71,7,9,4,1,45,50,0,35,0,1,1,0,0,173,
+143,snorlax,1,446,72,1,12,4,1,25,50,0,40,0,1,0,0,0,175,179
+144,articuno,1,,73,2,9,5,-1,3,35,0,80,0,1,0,1,0,176,192
+145,zapdos,1,,74,10,9,5,-1,3,35,0,80,0,1,0,1,0,177,
+146,moltres,1,,75,10,9,5,-1,3,35,0,80,0,1,0,1,0,178,
+147,dratini,1,,76,2,2,9,4,45,35,0,40,0,1,0,0,0,179,76
+148,dragonair,1,147,76,2,2,9,4,45,35,0,40,0,1,0,0,0,180,77
+149,dragonite,1,148,76,3,6,9,4,45,35,0,40,0,1,0,0,0,181,78
+150,mewtwo,1,,77,7,6,5,-1,3,0,0,120,0,1,1,1,0,182,196
+151,mew,1,,78,6,6,5,-1,45,100,0,120,0,4,0,0,1,183,
+152,chikorita,2,,79,5,8,3,1,45,70,0,20,0,4,0,0,0,184,
+153,bayleef,2,152,79,5,8,3,1,45,70,0,20,0,4,0,0,0,185,
+154,meganium,2,153,79,5,8,3,1,45,70,0,20,1,4,0,0,0,186,
+155,cyndaquil,2,,80,10,12,3,1,45,70,0,20,0,4,0,0,0,187,
+156,quilava,2,155,80,10,8,3,1,45,70,0,20,0,4,0,0,0,188,
+157,typhlosion,2,156,80,10,8,3,1,45,70,0,20,0,4,0,0,0,189,
+158,totodile,2,,81,2,6,9,1,45,70,0,20,0,4,0,0,0,190,
+159,croconaw,2,158,81,2,6,9,1,45,70,0,20,0,4,0,0,0,191,
+160,feraligatr,2,159,81,2,6,9,1,45,70,0,20,0,4,0,0,0,192,
+161,sentret,2,,82,3,8,3,4,255,70,0,15,0,2,0,0,0,193,
+162,furret,2,161,82,3,8,3,4,90,70,0,15,0,2,0,0,0,194,
+163,hoothoot,2,,83,3,9,2,4,255,50,0,15,0,2,0,0,0,195,
+164,noctowl,2,163,83,3,9,2,4,90,50,0,15,0,2,0,0,0,196,
+165,ledyba,2,,84,8,9,2,4,255,70,0,15,1,3,0,0,0,197,
+166,ledian,2,165,84,8,9,2,4,90,70,0,15,1,3,0,0,0,198,
+167,spinarak,2,,85,5,14,2,4,255,70,0,15,0,3,0,0,0,199,
+168,ariados,2,167,85,8,14,2,4,90,70,0,15,0,3,0,0,0,200,
+169,crobat,2,42,17,7,13,1,4,90,50,0,15,0,2,0,0,0,46,25
+170,chinchou,2,,86,2,3,7,4,190,50,0,20,0,1,0,0,0,201,
+171,lanturn,2,170,86,2,3,7,4,75,50,0,20,0,1,0,0,0,202,
+172,pichu,2,,10,10,8,2,4,190,50,1,10,0,2,0,0,0,25,15
+173,cleffa,2,,14,6,6,4,6,150,140,1,10,0,3,0,0,0,36,
+174,igglybuff,2,,16,6,12,3,6,170,50,1,10,0,3,0,0,0,41,20
+175,togepi,2,,87,9,12,2,1,190,50,1,10,0,3,0,0,0,203,
+176,togetic,2,175,87,9,12,2,1,75,50,0,10,0,3,0,0,0,204,
+177,natu,2,,88,5,9,2,4,190,50,0,20,0,2,0,0,0,206,
+178,xatu,2,177,88,5,9,2,4,75,50,0,20,1,2,0,0,0,207,
+179,mareep,2,,89,9,8,3,4,235,70,0,20,0,4,0,0,0,208,45
+180,flaaffy,2,179,89,6,6,3,4,120,70,0,20,0,4,0,0,0,209,46
+181,ampharos,2,180,89,10,6,3,4,45,70,0,20,0,4,1,0,0,210,47
+182,bellossom,2,44,18,5,12,3,4,45,50,0,20,0,4,0,0,0,50,
+183,marill,2,298,90,2,6,9,4,190,50,0,10,0,3,0,0,0,212,
+184,azumarill,2,183,90,2,6,9,4,75,50,0,10,0,3,0,0,0,213,
+185,sudowoodo,2,438,91,3,12,2,4,65,50,0,20,1,2,0,0,0,215,
+186,politoed,2,61,26,5,12,9,4,45,50,0,20,1,4,0,0,0,68,
+187,hoppip,2,,92,6,6,3,4,255,70,0,20,0,4,0,0,0,216,
+188,skiploom,2,187,92,5,6,3,4,120,70,0,20,0,4,0,0,0,217,
+189,jumpluff,2,188,92,2,6,3,4,45,70,0,20,0,4,0,0,0,218,
+190,aipom,2,,93,7,6,2,4,45,70,0,20,1,3,0,0,0,219,
+191,sunkern,2,,94,10,1,3,4,235,70,0,20,0,4,0,0,0,221,
+192,sunflora,2,191,94,10,12,3,4,120,70,0,20,0,4,0,0,0,222,
+193,yanma,2,,95,8,13,2,4,75,70,0,20,0,2,0,0,0,223,
+194,wooper,2,,96,2,7,9,4,255,50,0,20,1,2,0,0,0,225,18
+195,quagsire,2,194,96,2,6,9,4,90,50,0,20,1,2,0,0,0,226,19
+196,espeon,2,133,67,7,8,8,1,45,50,0,35,0,2,0,0,0,161,5
+197,umbreon,2,133,67,1,8,8,1,45,35,0,35,0,2,0,0,0,162,6
+198,murkrow,2,,97,1,9,2,4,30,35,0,20,1,4,0,0,0,227,
+199,slowking,2,79,33,6,6,9,4,70,50,0,20,0,2,0,0,0,87,
+200,misdreavus,2,,98,4,1,1,4,45,35,0,25,0,3,0,0,0,229,183
+201,unown,2,,99,1,1,5,-1,225,70,0,40,0,2,0,0,0,231,
+202,wobbuffet,2,360,100,2,5,1,4,45,50,0,20,1,2,0,0,0,233,
+203,girafarig,2,,101,10,8,3,4,60,70,0,20,1,2,0,0,0,234,
+204,pineco,2,,102,4,1,2,4,190,70,0,20,0,2,0,0,0,235,56
+205,forretress,2,204,102,7,1,2,4,75,70,0,20,0,2,0,0,0,236,57
+206,dunsparce,2,,103,10,2,1,4,190,50,0,20,0,2,0,0,0,237,
+207,gligar,2,,104,7,9,4,4,60,70,0,20,1,4,0,0,0,238,
+208,steelix,2,95,41,4,2,1,4,25,50,0,25,1,2,1,0,0,104,176
+209,snubbull,2,,105,6,12,8,6,190,70,0,20,0,3,0,0,0,240,
+210,granbull,2,209,105,7,6,8,6,75,70,0,20,0,3,0,0,0,241,
+211,qwilfish,2,,106,4,3,7,4,45,50,0,20,0,2,0,0,0,242,
+212,scizor,2,123,58,8,13,3,4,25,50,0,25,1,2,1,0,0,142,189
+213,shuckle,2,,107,10,14,4,4,190,50,0,20,0,4,0,0,0,243,
+214,heracross,2,,108,2,12,2,4,45,50,0,25,1,1,1,0,0,244,
+215,sneasel,2,,109,1,6,2,4,60,35,0,20,1,4,0,0,0,245,181
+216,teddiursa,2,,110,3,6,4,4,120,70,0,20,0,2,0,0,0,247,
+217,ursaring,2,216,110,3,6,4,4,60,70,0,20,1,2,0,0,0,248,
+218,slugma,2,,111,8,2,4,4,190,70,0,20,0,2,0,0,0,249,
+219,magcargo,2,218,111,8,2,4,4,75,70,0,20,0,2,0,0,0,250,
+220,swinub,2,,112,3,8,1,4,225,50,0,20,0,1,0,0,0,251,
+221,piloswine,2,220,112,3,8,1,4,75,50,0,20,1,1,0,0,0,252,
+222,corsola,2,,113,6,14,7,6,60,50,0,20,0,3,0,0,0,254,
+223,remoraid,2,,114,4,3,7,4,190,50,0,20,0,2,0,0,0,255,
+224,octillery,2,223,114,8,10,7,4,75,50,0,20,1,2,0,0,0,256,
+225,delibird,2,,115,8,9,4,4,45,50,0,20,0,3,0,0,0,257,
+226,mantine,2,458,116,7,9,7,4,25,50,0,25,0,1,0,0,0,259,
+227,skarmory,2,,117,4,9,6,4,25,50,0,25,0,1,0,0,0,260,
+228,houndour,2,,118,1,8,6,4,120,35,0,20,0,1,0,0,0,261,
+229,houndoom,2,228,118,1,8,6,4,45,35,0,20,1,1,1,0,0,262,
+230,kingdra,2,117,54,2,5,7,4,45,50,0,20,0,2,0,0,0,134,
+231,phanpy,2,,119,2,8,6,4,120,70,0,20,0,2,0,0,0,263,
+232,donphan,2,231,119,4,8,6,4,60,70,0,20,1,2,0,0,0,264,
+233,porygon2,2,137,68,8,7,8,-1,45,50,0,20,0,2,0,0,0,167,
+234,stantler,2,,120,3,8,2,4,45,70,0,20,0,1,0,0,0,265,
+235,smeargle,2,,121,9,6,8,4,45,70,0,20,0,3,0,0,0,266,
+236,tyrogue,2,,47,7,12,8,0,75,50,1,25,0,2,0,0,0,115,
+237,hitmontop,2,236,47,3,6,8,0,45,50,0,25,0,2,0,0,0,118,
+238,smoochum,2,,59,6,12,8,8,45,50,1,25,0,2,0,0,0,143,
+239,elekid,2,,60,10,12,3,2,45,50,1,25,0,2,0,0,0,145,
+240,magby,2,,61,8,6,4,2,45,50,1,25,0,2,0,0,0,148,
+241,miltank,2,,122,6,6,3,8,45,50,0,20,0,1,0,0,0,267,
+242,blissey,2,113,51,6,12,8,8,30,140,0,40,0,3,0,0,0,128,
+243,raikou,2,,123,10,8,3,-1,3,35,0,80,0,1,0,1,0,268,
+244,entei,2,,124,3,8,3,-1,3,35,0,80,0,1,0,1,0,269,
+245,suicune,2,,125,2,8,3,-1,3,35,0,80,0,1,0,1,0,270,
+246,larvitar,2,,126,5,6,4,4,45,35,0,40,0,1,0,0,0,271,79
+247,pupitar,2,246,126,4,2,4,4,45,35,0,40,0,1,0,0,0,272,80
+248,tyranitar,2,247,126,5,6,4,4,45,35,0,40,0,1,1,0,0,273,81
+249,lugia,2,,127,9,9,5,-1,3,0,0,120,0,1,0,1,0,274,
+250,ho-oh,2,,128,8,9,5,-1,3,0,0,120,0,1,0,1,0,275,
+251,celebi,2,,129,5,12,2,-1,45,100,0,120,0,4,0,0,1,276,
+252,treecko,3,,130,5,6,2,1,45,50,0,20,0,4,0,0,0,277,130
+253,grovyle,3,252,130,5,6,2,1,45,50,0,20,0,4,0,0,0,278,131
+254,sceptile,3,253,130,5,6,2,1,45,50,0,20,0,4,1,0,0,279,132
+255,torchic,3,,131,8,7,3,1,45,50,0,20,1,4,0,0,0,280,
+256,combusken,3,255,131,8,6,3,1,45,50,0,20,1,4,0,0,0,281,
+257,blaziken,3,256,131,8,6,3,1,45,50,0,20,1,4,1,0,0,282,
+258,mudkip,3,,132,2,8,9,1,45,50,0,20,0,4,0,0,0,283,
+259,marshtomp,3,258,132,2,6,9,1,45,50,0,20,0,4,0,0,0,284,
+260,swampert,3,259,132,2,6,9,1,45,50,0,20,0,4,1,0,0,285,
+261,poochyena,3,,133,4,8,3,4,255,70,0,15,0,2,0,0,0,286,
+262,mightyena,3,261,133,4,8,3,4,127,70,0,15,0,2,0,0,0,287,
+263,zigzagoon,3,,134,3,8,3,4,255,50,0,15,0,2,0,0,0,288,
+264,linoone,3,263,134,9,8,3,4,90,50,0,15,0,2,0,0,0,289,
+265,wurmple,3,,135,8,14,2,4,255,70,0,15,0,2,0,0,0,290,
+266,silcoon,3,265,135,9,1,2,4,120,70,0,15,0,2,0,0,0,291,
+267,beautifly,3,266,135,10,13,2,4,45,70,0,15,1,2,0,0,0,292,
+268,cascoon,3,265,135,7,1,2,4,120,70,0,15,0,2,0,0,0,293,
+269,dustox,3,268,135,5,13,2,4,45,70,0,15,1,2,0,0,0,294,
+270,lotad,3,,136,5,14,9,4,255,50,0,15,0,4,0,0,0,295,
+271,lombre,3,270,136,5,12,9,4,120,50,0,15,0,4,0,0,0,296,
+272,ludicolo,3,271,136,5,12,9,4,45,50,0,15,1,4,0,0,0,297,
+273,seedot,3,,137,3,7,2,4,255,50,0,15,0,4,0,0,0,298,
+274,nuzleaf,3,273,137,3,12,2,4,120,50,0,15,1,4,0,0,0,299,
+275,shiftry,3,274,137,3,12,2,4,45,50,0,15,1,4,0,0,0,300,
+276,taillow,3,,138,2,9,3,4,200,70,0,15,0,4,0,0,0,301,
+277,swellow,3,276,138,2,9,3,4,45,70,0,15,0,4,0,0,0,302,
+278,wingull,3,,139,9,9,7,4,190,50,0,20,0,2,0,0,0,303,
+279,pelipper,3,278,139,10,9,7,4,45,50,0,20,0,2,0,0,0,304,
+280,ralts,3,,140,9,12,8,4,235,35,0,20,0,1,0,0,0,305,9
+281,kirlia,3,280,140,9,12,8,4,120,35,0,20,0,1,0,0,0,306,10
+282,gardevoir,3,281,140,9,12,8,4,45,35,0,20,0,1,1,0,0,307,11
+283,surskit,3,,141,2,14,9,4,200,70,0,15,0,2,0,0,0,309,
+284,masquerain,3,283,141,2,13,9,4,75,70,0,15,0,2,0,0,0,310,
+285,shroomish,3,,142,3,7,2,4,255,70,0,15,0,6,0,0,0,311,
+286,breloom,3,285,142,5,6,2,4,90,70,0,15,0,6,0,0,0,312,
+287,slakoth,3,,143,3,8,2,4,255,70,0,15,0,1,0,0,0,313,
+288,vigoroth,3,287,143,9,6,2,4,120,70,0,15,0,1,0,0,0,314,
+289,slaking,3,288,143,3,12,2,4,45,70,0,15,0,1,0,0,0,315,
+290,nincada,3,,144,4,14,2,4,255,50,0,15,0,5,0,0,0,316,
+291,ninjask,3,290,144,10,13,2,4,120,50,0,15,0,5,0,0,0,317,
+292,shedinja,3,290,144,3,5,2,-1,45,50,0,15,0,5,0,0,0,318,
+293,whismur,3,,145,6,6,1,4,190,50,0,20,0,4,0,0,0,319,
+294,loudred,3,293,145,2,6,1,4,120,50,0,20,0,4,0,0,0,320,
+295,exploud,3,294,145,2,6,1,4,45,50,0,20,0,4,0,0,0,321,
+296,makuhita,3,,146,10,12,4,2,180,70,0,20,0,6,0,0,0,322,
+297,hariyama,3,296,146,3,12,4,2,200,70,0,20,0,6,0,0,0,323,
+298,azurill,3,,90,2,7,9,6,150,50,1,10,0,3,0,0,0,211,
+299,nosepass,3,,147,4,12,1,4,255,70,0,20,0,2,0,0,0,324,
+300,skitty,3,,148,6,8,2,6,255,70,0,15,0,3,0,0,0,326,
+301,delcatty,3,300,148,7,8,2,6,60,70,0,15,0,3,0,0,0,327,
+302,sableye,3,,149,7,12,1,4,45,35,0,25,0,4,1,0,0,328,
+303,mawile,3,,150,1,12,1,4,45,50,0,20,0,3,1,0,0,329,
+304,aron,3,,151,4,8,4,4,180,35,0,35,0,1,0,0,0,330,149
+305,lairon,3,304,151,4,8,4,4,90,35,0,35,0,1,0,0,0,331,150
+306,aggron,3,305,151,4,6,4,4,45,35,0,35,0,1,1,0,0,332,151
+307,meditite,3,,152,2,12,4,4,180,70,0,20,1,2,0,0,0,333,
+308,medicham,3,307,152,8,12,4,4,90,70,0,20,1,2,1,0,0,334,
+309,electrike,3,,153,5,8,3,4,120,50,0,20,0,1,0,0,0,335,
+310,manectric,3,309,153,10,8,3,4,45,50,0,20,0,1,1,0,0,336,
+311,plusle,3,,154,10,6,3,4,200,70,0,20,0,2,0,0,0,337,
+312,minun,3,,155,10,6,3,4,200,70,0,20,0,2,0,0,0,338,
+313,volbeat,3,,156,4,6,2,0,150,70,0,15,0,5,0,0,0,339,
+314,illumise,3,,157,7,12,2,8,150,70,0,15,0,6,0,0,0,340,
+315,roselia,3,406,158,5,12,3,4,150,50,0,20,1,4,0,0,0,342,
+316,gulpin,3,,159,5,4,3,4,225,70,0,20,1,6,0,0,0,344,
+317,swalot,3,316,159,7,4,3,4,75,70,0,20,1,6,0,0,0,345,
+318,carvanha,3,,160,8,3,7,4,225,35,0,20,0,1,0,0,0,346,
+319,sharpedo,3,318,160,2,3,7,4,60,35,0,20,0,1,1,0,0,347,
+320,wailmer,3,,161,2,3,7,4,125,50,0,40,0,6,0,0,0,348,
+321,wailord,3,320,161,2,3,7,4,60,50,0,40,0,6,0,0,0,349,
+322,numel,3,,162,10,8,4,4,255,70,0,20,1,2,0,0,0,350,
+323,camerupt,3,322,162,8,8,4,4,150,70,0,20,1,2,1,0,0,351,
+324,torkoal,3,,163,3,8,4,4,90,50,0,20,0,2,0,0,0,352,
+325,spoink,3,,164,1,4,4,4,255,70,0,20,0,3,0,0,0,353,
+326,grumpig,3,325,164,7,6,4,4,60,70,0,20,0,3,0,0,0,354,
+327,spinda,3,,165,3,6,4,4,255,70,0,15,0,3,0,0,0,355,
+328,trapinch,3,,166,3,14,6,4,255,50,0,20,0,4,0,0,0,356,
+329,vibrava,3,328,166,5,13,6,4,120,50,0,20,0,4,0,0,0,357,
+330,flygon,3,329,166,5,9,6,4,45,50,0,20,0,4,0,0,0,358,
+331,cacnea,3,,167,5,12,6,4,190,35,0,20,0,4,0,0,0,359,
+332,cacturne,3,331,167,5,12,6,4,60,35,0,20,1,4,0,0,0,360,
+333,swablu,3,,168,2,9,2,4,255,50,0,20,0,5,0,0,0,361,
+334,altaria,3,333,168,2,9,2,4,45,50,0,20,0,5,1,0,0,362,
+335,zangoose,3,,169,9,6,3,4,90,70,0,20,0,5,0,0,0,363,
+336,seviper,3,,170,1,2,3,4,90,70,0,20,0,6,0,0,0,364,
+337,lunatone,3,,171,10,1,1,-1,45,50,0,25,0,3,0,0,0,365,
+338,solrock,3,,172,8,1,1,-1,45,50,0,25,0,3,0,0,0,366,
+339,barboach,3,,173,4,3,9,4,190,50,0,20,0,2,0,0,0,367,
+340,whiscash,3,339,173,2,3,9,4,75,50,0,20,0,2,0,0,0,368,
+341,corphish,3,,174,8,14,9,4,205,50,0,15,0,6,0,0,0,369,
+342,crawdaunt,3,341,174,8,14,9,4,155,50,0,15,0,6,0,0,0,370,
+343,baltoy,3,,175,3,4,6,-1,255,50,0,20,0,2,0,0,0,371,
+344,claydol,3,343,175,1,4,6,-1,90,50,0,20,0,2,0,0,0,372,
+345,lileep,3,,176,7,5,7,1,45,50,0,30,0,5,0,0,0,373,
+346,cradily,3,345,176,5,5,7,1,45,50,0,30,0,5,0,0,0,374,
+347,anorith,3,,177,4,14,9,1,45,50,0,30,0,5,0,0,0,375,171
+348,armaldo,3,347,177,4,6,9,1,45,50,0,30,0,5,0,0,0,376,172
+349,feebas,3,,178,3,3,9,4,255,50,0,20,0,5,0,0,0,377,
+350,milotic,3,349,178,6,2,9,4,60,50,0,20,1,5,0,0,0,378,
+351,castform,3,,179,4,1,3,4,45,70,0,25,0,2,1,0,0,379,
+352,kecleon,3,,180,5,6,2,4,200,70,0,20,0,4,0,0,0,380,
+353,shuppet,3,,181,1,1,8,4,225,35,0,25,0,3,0,0,0,381,
+354,banette,3,353,181,1,6,8,4,45,35,0,25,0,3,1,0,0,382,
+355,duskull,3,,182,1,4,2,4,190,35,0,25,0,3,0,0,0,383,69
+356,dusclops,3,355,182,1,12,2,4,90,35,0,25,0,3,0,0,0,384,70
+357,tropius,3,,183,5,8,2,4,200,70,0,25,0,1,0,0,0,386,
+358,chimecho,3,433,184,2,4,3,4,45,70,0,25,0,3,0,0,0,388,53
+359,absol,3,,185,9,8,4,4,30,35,0,25,0,4,1,0,0,389,
+360,wynaut,3,,100,2,6,1,4,125,50,1,20,0,2,0,0,0,232,
+361,snorunt,3,,186,4,12,1,4,190,50,0,20,0,2,0,0,0,390,93
+362,glalie,3,361,186,4,1,1,4,75,50,0,20,0,2,1,0,0,391,94
+363,spheal,3,,187,2,3,7,4,255,50,0,20,0,4,0,0,0,393,60
+364,sealeo,3,363,187,2,3,7,4,120,50,0,20,0,4,0,0,0,394,61
+365,walrein,3,364,187,2,8,7,4,45,50,0,20,0,4,0,0,0,395,62
+366,clamperl,3,,188,2,1,7,4,255,70,0,20,0,5,0,0,0,396,
+367,huntail,3,366,188,2,2,7,4,60,70,0,20,0,5,0,0,0,397,
+368,gorebyss,3,366,188,6,2,7,4,60,70,0,20,0,5,0,0,0,398,
+369,relicanth,3,,189,4,3,7,1,25,50,0,40,1,1,0,0,0,399,
+370,luvdisc,3,,190,6,3,7,6,225,70,0,20,0,3,0,0,0,400,
+371,bagon,3,,191,2,12,6,4,45,35,0,40,0,1,0,0,0,401,
+372,shelgon,3,371,191,9,8,6,4,45,35,0,40,0,1,0,0,0,402,
+373,salamence,3,372,191,2,8,6,4,45,35,0,40,0,1,1,0,0,403,
+374,beldum,3,,192,2,5,6,-1,3,35,0,40,0,1,0,0,0,404,82
+375,metang,3,374,192,2,4,6,-1,3,35,0,40,0,1,0,0,0,405,83
+376,metagross,3,375,192,2,11,6,-1,3,35,0,40,0,1,1,0,0,406,84
+377,regirock,3,,193,3,12,1,-1,3,35,0,80,0,1,0,1,0,407,
+378,regice,3,,194,2,12,1,-1,3,35,0,80,0,1,0,1,0,408,
+379,registeel,3,,195,4,12,1,-1,3,35,0,80,0,1,0,1,0,409,193
+380,latias,3,,196,8,9,9,8,3,90,0,120,0,1,1,1,0,410,
+381,latios,3,,197,2,9,9,0,3,90,0,120,0,1,1,1,0,411,
+382,kyogre,3,,198,2,3,7,-1,3,0,0,120,0,1,1,1,0,412,
+383,groudon,3,,199,8,6,6,-1,3,0,0,120,0,1,1,1,0,413,194
+384,rayquaza,3,,200,5,2,5,-1,45,0,0,120,0,1,1,1,0,414,200
+385,jirachi,3,,201,10,12,4,-1,3,100,0,120,0,1,0,0,1,415,
+386,deoxys,3,,202,8,12,5,-1,3,0,0,120,0,1,1,0,1,416,
+387,turtwig,4,,203,5,8,,1,45,70,0,20,0,4,0,0,0,417,
+388,grotle,4,387,203,5,8,,1,45,70,0,20,0,4,0,0,0,418,
+389,torterra,4,388,203,5,8,,1,45,70,0,20,0,4,0,0,0,419,
+390,chimchar,4,,204,3,6,,1,45,70,0,20,0,4,0,0,0,420,115
+391,monferno,4,390,204,3,6,,1,45,70,0,20,0,4,0,0,0,421,116
+392,infernape,4,391,204,3,6,,1,45,70,0,20,0,4,0,0,0,422,117
+393,piplup,4,,205,2,12,,1,45,70,0,20,0,4,0,0,0,423,133
+394,prinplup,4,393,205,2,6,,1,45,70,0,20,0,4,0,0,0,424,134
+395,empoleon,4,394,205,2,6,,1,45,70,0,20,0,4,0,0,0,425,135
+396,starly,4,,206,3,9,,4,255,70,0,15,1,4,0,0,0,426,26
+397,staravia,4,396,206,3,9,,4,120,70,0,15,1,4,0,0,0,427,27
+398,staraptor,4,397,206,3,9,,4,45,70,0,15,1,4,0,0,0,428,28
+399,bidoof,4,,207,3,8,,4,255,70,0,15,1,2,0,0,0,429,29
+400,bibarel,4,399,207,3,6,,4,127,70,0,15,1,2,0,0,0,430,30
+401,kricketot,4,,208,8,12,,4,255,70,0,15,1,4,0,0,0,431,
+402,kricketune,4,401,208,8,13,,4,45,70,0,15,1,4,0,0,0,432,
+403,shinx,4,,209,2,8,,4,235,50,0,20,1,4,0,0,0,433,34
+404,luxio,4,403,209,2,8,,4,120,100,0,20,1,4,0,0,0,434,35
+405,luxray,4,404,209,2,8,,4,45,50,0,20,1,4,0,0,0,435,36
+406,budew,4,,158,5,12,,4,255,50,1,20,0,4,0,0,0,341,
+407,roserade,4,315,158,5,12,,4,75,50,0,20,1,4,0,0,0,343,
+408,cranidos,4,,211,2,6,,1,45,70,0,30,0,5,0,0,0,436,
+409,rampardos,4,408,211,2,6,,1,45,70,0,30,0,5,0,0,0,437,
+410,shieldon,4,,212,4,8,,1,45,70,0,30,0,5,0,0,0,438,163
+411,bastiodon,4,410,212,4,8,,1,45,70,0,30,0,5,0,0,0,439,164
+412,burmy,4,,213,5,5,,4,120,70,0,15,0,2,1,0,0,440,
+413,wormadam,4,412,213,5,5,,8,45,70,0,15,0,2,0,0,0,441,
+414,mothim,4,412,213,10,13,,0,45,70,0,15,0,2,0,0,0,442,
+415,combee,4,,214,10,11,,1,120,50,0,15,1,4,0,0,0,443,
+416,vespiquen,4,415,214,10,13,,8,45,50,0,15,0,4,0,0,0,444,
+417,pachirisu,4,,215,9,8,,4,200,100,0,10,1,2,0,0,0,445,
+418,buizel,4,,216,3,8,,4,190,70,0,20,1,2,0,0,0,446,
+419,floatzel,4,418,216,3,8,,4,75,70,0,20,1,2,0,0,0,447,
+420,cherubi,4,,217,6,11,,4,190,50,0,20,0,2,0,0,0,448,
+421,cherrim,4,420,217,7,7,,4,75,50,0,20,0,2,1,0,0,449,
+422,shellos,4,,218,7,2,,4,190,50,0,20,0,2,0,0,0,450,
+423,gastrodon,4,422,218,7,2,,4,75,50,0,20,0,2,0,0,0,451,
+424,ambipom,4,190,93,7,6,,4,45,100,0,20,1,3,0,0,0,220,
+425,drifloon,4,,219,7,4,,4,125,50,0,30,0,6,0,0,0,452,167
+426,drifblim,4,425,219,7,4,,4,60,50,0,30,0,6,0,0,0,453,168
+427,buneary,4,,220,3,6,,4,190,0,0,20,0,2,0,0,0,454,
+428,lopunny,4,427,220,3,6,,4,60,140,0,20,0,2,1,0,0,455,
+429,mismagius,4,200,98,7,1,,4,45,35,0,25,0,3,0,0,0,230,184
+430,honchkrow,4,198,97,1,9,,4,30,35,0,20,0,4,0,0,0,228,
+431,glameow,4,,221,4,8,,6,190,70,0,20,0,3,0,0,0,456,
+432,purugly,4,431,221,4,8,,6,75,70,0,20,0,3,0,0,0,457,
+433,chingling,4,,184,10,12,,4,120,70,1,25,0,3,0,0,0,387,52
+434,stunky,4,,223,7,8,,4,225,50,0,20,0,2,0,0,0,458,
+435,skuntank,4,434,223,7,8,,4,60,50,0,20,0,2,0,0,0,459,
+436,bronzor,4,,224,5,1,,-1,255,50,0,20,0,2,0,0,0,460,
+437,bronzong,4,436,224,5,4,,-1,90,50,0,20,0,2,0,0,0,461,
+438,bonsly,4,,91,3,7,,4,255,50,1,20,0,2,0,0,0,214,
+439,mime-jr,4,,57,6,12,,4,145,50,1,25,0,2,0,0,0,139,
+440,happiny,4,,51,6,12,,8,130,140,1,40,0,3,0,0,0,126,
+441,chatot,4,,228,1,9,,4,30,35,0,20,0,4,0,0,0,462,
+442,spiritomb,4,,229,7,5,,4,100,50,0,30,0,2,0,0,0,463,187
+443,gible,4,,230,2,6,,4,45,50,0,40,1,1,0,0,0,464,85
+444,gabite,4,443,230,2,6,,4,45,50,0,40,1,1,0,0,0,465,86
+445,garchomp,4,444,230,2,6,,4,45,50,0,40,1,1,1,0,0,466,87
+446,munchlax,4,,72,1,12,,1,50,50,1,40,0,1,0,0,0,174,178
+447,riolu,4,,232,2,6,,1,75,50,1,25,0,4,0,0,0,467,50
+448,lucario,4,447,232,2,6,,1,45,50,0,25,0,4,1,0,0,468,51
+449,hippopotas,4,,233,3,8,,4,140,50,0,30,1,1,0,0,0,469,
+450,hippowdon,4,449,233,3,8,,4,60,50,0,30,1,1,0,0,0,470,
+451,skorupi,4,,234,7,14,,4,120,50,0,20,0,1,0,0,0,471,156
+452,drapion,4,451,234,7,14,,4,45,50,0,20,0,1,0,0,0,472,157
+453,croagunk,4,,235,2,12,,4,140,100,0,10,1,2,0,0,0,473,88
+454,toxicroak,4,453,235,2,12,,4,75,50,0,20,1,2,0,0,0,474,89
+455,carnivine,4,,236,5,10,,4,200,70,0,25,0,1,0,0,0,475,186
+456,finneon,4,,237,2,3,,4,190,70,0,20,1,5,0,0,0,476,
+457,lumineon,4,456,237,2,3,,4,75,70,0,20,1,5,0,0,0,477,
+458,mantyke,4,,116,2,9,,4,25,50,1,25,0,1,0,0,0,258,
+459,snover,4,,239,9,6,,4,120,50,0,20,1,1,0,0,0,478,
+460,abomasnow,4,459,239,9,6,,4,60,50,0,20,1,1,1,0,0,479,
+461,weavile,4,215,109,1,6,,4,45,35,0,20,1,4,0,0,0,246,182
+462,magnezone,4,82,34,4,4,,-1,30,50,0,20,0,2,0,0,0,90,
+463,lickilicky,4,108,48,6,12,,4,30,50,0,20,0,2,0,0,0,120,
+464,rhyperior,4,112,50,4,6,,4,30,50,0,20,1,1,0,0,0,125,162
+465,tangrowth,4,114,52,2,12,,4,30,50,0,20,1,2,0,0,0,130,
+466,electivire,4,125,60,10,6,,2,30,50,0,25,0,2,0,0,0,147,
+467,magmortar,4,126,61,8,6,,2,30,50,0,25,0,2,0,0,0,150,
+468,togekiss,4,176,87,9,9,,1,30,50,0,10,0,3,0,0,0,205,
+469,yanmega,4,193,95,5,13,,4,30,70,0,20,0,2,0,0,0,224,
+470,leafeon,4,133,67,5,8,,1,45,35,0,35,0,2,0,0,0,163,7
+471,glaceon,4,133,67,2,8,,1,45,35,0,35,0,2,0,0,0,164,8
+472,gliscor,4,207,104,7,9,,4,30,70,0,20,0,4,0,0,0,239,
+473,mamoswine,4,221,112,3,8,,4,50,50,0,20,1,1,0,0,0,253,
+474,porygon-z,4,233,68,8,4,,-1,30,50,0,20,0,2,0,0,0,168,
+475,gallade,4,281,140,9,12,,0,45,35,0,20,0,1,1,0,0,308,12
+476,probopass,4,299,147,4,11,,4,60,70,0,20,0,2,0,0,0,325,
+477,dusknoir,4,356,182,1,4,,4,45,35,0,25,0,3,0,0,0,385,71
+478,froslass,4,361,186,9,4,,8,75,50,0,20,0,2,0,0,0,392,95
+479,rotom,4,,240,8,1,,-1,45,50,0,20,0,2,1,0,0,480,
+480,uxie,4,,241,10,6,,-1,3,140,0,80,0,1,0,1,0,481,
+481,mesprit,4,,242,6,6,,-1,3,140,0,80,0,1,0,1,0,482,
+482,azelf,4,,243,2,6,,-1,3,140,0,80,0,1,0,1,0,483,
+483,dialga,4,,244,9,8,,-1,3,0,0,120,0,1,0,1,0,484,195
+484,palkia,4,,245,7,6,,-1,3,0,0,120,0,1,0,1,0,485,
+485,heatran,4,,246,3,8,,4,3,100,0,10,0,1,0,1,0,486,
+486,regigigas,4,,247,9,12,,-1,3,0,0,120,0,1,0,1,0,487,
+487,giratina,4,,248,1,10,,-1,3,0,0,120,0,1,1,1,0,488,
+488,cresselia,4,,249,10,2,,8,3,100,0,120,0,1,0,1,0,489,
+489,phione,4,,250,2,4,,-1,30,70,0,40,0,1,0,0,1,490,
+490,manaphy,4,,250,2,12,,-1,3,70,0,10,0,1,0,0,1,491,
+491,darkrai,4,,252,1,12,,-1,3,0,0,120,0,1,0,0,1,492,
+492,shaymin,4,,253,5,8,,-1,45,100,0,120,0,4,1,0,1,493,
+493,arceus,4,,254,9,8,,-1,3,0,0,120,0,1,1,0,1,494,199
+494,victini,5,,255,10,12,,-1,3,100,0,120,0,1,0,0,1,495,
+495,snivy,5,,256,5,6,,1,45,70,0,20,0,4,0,0,0,496,118
+496,servine,5,495,256,5,6,,1,45,70,0,20,0,4,0,0,0,497,119
+497,serperior,5,496,256,5,2,,1,45,70,0,20,0,4,0,0,0,498,120
+498,tepig,5,,257,8,8,,1,45,70,0,20,0,4,0,0,0,499,121
+499,pignite,5,498,257,8,6,,1,45,70,0,20,0,4,0,0,0,500,122
+500,emboar,5,499,257,8,6,,1,45,70,0,20,0,4,0,0,0,501,123
+501,oshawott,5,,258,2,6,,1,45,70,0,20,0,4,0,0,0,502,106
+502,dewott,5,501,258,2,6,,1,45,70,0,20,0,4,0,0,0,503,107
+503,samurott,5,502,258,2,8,,1,45,70,0,20,0,4,0,0,0,504,108
+504,patrat,5,,259,3,8,,4,255,70,0,15,0,2,0,0,0,505,
+505,watchog,5,504,259,3,6,,4,255,70,0,20,0,2,0,0,0,506,
+506,lillipup,5,,260,3,8,,4,255,50,0,15,0,4,0,0,0,507,
+507,herdier,5,506,260,4,8,,4,120,50,0,15,0,4,0,0,0,508,
+508,stoutland,5,507,260,4,8,,4,45,50,0,15,0,4,0,0,0,509,
+509,purrloin,5,,261,7,8,,4,255,50,0,20,0,2,0,0,0,510,
+510,liepard,5,509,261,7,8,,4,90,50,0,20,0,2,0,0,0,511,
+511,pansage,5,,262,5,6,,1,190,70,0,20,0,2,0,0,0,512,136
+512,simisage,5,511,262,5,6,,1,75,70,0,20,0,2,0,0,0,513,137
+513,pansear,5,,263,8,6,,1,190,70,0,20,0,2,0,0,0,514,138
+514,simisear,5,513,263,8,6,,1,75,70,0,20,0,2,0,0,0,515,139
+515,panpour,5,,264,2,6,,1,190,70,0,20,0,2,0,0,0,516,140
+516,simipour,5,515,264,2,6,,1,75,70,0,20,0,2,0,0,0,517,141
+517,munna,5,,265,6,8,,4,190,50,0,10,0,3,0,0,0,518,72
+518,musharna,5,517,265,6,12,,4,75,50,0,10,0,3,0,0,0,519,73
+519,pidove,5,,266,4,9,,4,255,50,0,15,0,4,0,0,0,520,
+520,tranquill,5,519,266,4,9,,4,120,50,0,15,0,4,0,0,0,521,
+521,unfezant,5,520,266,4,9,,4,45,50,0,15,1,4,0,0,0,522,
+522,blitzle,5,,267,1,8,,4,190,70,0,20,0,2,0,0,0,523,74
+523,zebstrika,5,522,267,1,8,,4,75,70,0,20,0,2,0,0,0,524,75
+524,roggenrola,5,,268,2,7,,4,255,50,0,15,0,4,0,0,0,525,40
+525,boldore,5,524,268,2,10,,4,120,50,0,15,0,4,0,0,0,526,41
+526,gigalith,5,525,268,2,10,,4,45,50,0,15,0,4,0,0,0,527,42
+527,woobat,5,,269,2,9,,4,190,50,0,15,0,2,0,0,0,528,
+528,swoobat,5,527,269,2,9,,4,45,50,0,15,0,2,0,0,0,529,
+529,drilbur,5,,270,4,6,,4,120,50,0,20,0,2,0,0,0,530,152
+530,excadrill,5,529,270,4,12,,4,60,50,0,20,0,2,0,0,0,531,153
+531,audino,5,,271,6,6,,4,255,50,0,20,0,3,1,0,0,532,185
+532,timburr,5,,272,4,12,,2,180,70,0,20,0,4,0,0,0,533,101
+533,gurdurr,5,532,272,4,12,,2,90,50,0,20,0,4,0,0,0,534,102
+534,conkeldurr,5,533,272,3,12,,2,45,50,0,20,0,4,0,0,0,535,103
+535,tympole,5,,273,2,3,,4,255,50,0,20,0,4,0,0,0,536,
+536,palpitoad,5,535,273,2,6,,4,120,50,0,20,0,4,0,0,0,537,
+537,seismitoad,5,536,273,2,12,,4,45,50,0,20,0,4,0,0,0,538,
+538,throh,5,,274,8,12,,0,45,50,0,20,0,2,0,0,0,539,
+539,sawk,5,,275,2,12,,0,45,50,0,20,0,2,0,0,0,540,
+540,sewaddle,5,,276,10,14,,4,255,70,0,15,0,4,0,0,0,541,124
+541,swadloon,5,540,276,5,4,,4,120,70,0,15,0,4,0,0,0,542,125
+542,leavanny,5,541,276,10,12,,4,45,70,0,15,0,4,0,0,0,543,126
+543,venipede,5,,277,8,14,,4,255,50,0,15,0,4,0,0,0,544,31
+544,whirlipede,5,543,277,4,1,,4,120,50,0,15,0,4,0,0,0,545,32
+545,scolipede,5,544,277,8,14,,4,45,50,0,20,0,4,0,0,0,546,33
+546,cottonee,5,,278,5,1,,4,190,50,0,20,0,2,0,0,0,547,48
+547,whimsicott,5,546,278,5,12,,4,75,50,0,20,0,2,0,0,0,548,49
+548,petilil,5,,279,5,5,,8,190,50,0,20,0,2,0,0,0,549,43
+549,lilligant,5,548,279,5,5,,8,75,50,0,20,0,2,0,0,0,550,44
+550,basculin,5,,280,5,3,,4,25,50,0,40,0,2,0,0,0,551,
+551,sandile,5,,281,3,8,,4,180,50,0,20,0,4,0,0,0,552,66
+552,krokorok,5,551,281,3,8,,4,90,50,0,20,0,4,0,0,0,553,67
+553,krookodile,5,552,281,8,6,,4,45,50,0,20,0,4,0,0,0,554,68
+554,darumaka,5,,282,8,12,,4,120,50,0,20,0,4,0,0,0,555,142
+555,darmanitan,5,554,282,8,8,,4,60,50,0,20,0,4,1,0,0,556,143
+556,maractus,5,,283,5,5,,4,255,50,0,20,0,2,0,0,0,557,
+557,dwebble,5,,284,8,14,,4,190,50,0,20,0,2,0,0,0,558,
+558,crustle,5,557,284,8,14,,4,75,50,0,20,0,2,0,0,0,559,
+559,scraggy,5,,285,10,6,,4,180,35,0,15,0,2,0,0,0,560,165
+560,scrafty,5,559,285,8,6,,4,90,50,0,15,0,2,0,0,0,561,166
+561,sigilyph,5,,286,1,9,,4,45,50,0,20,0,2,0,0,0,562,
+562,yamask,5,,287,1,4,,4,190,50,0,25,0,2,0,0,0,563,
+563,cofagrigus,5,562,287,10,5,,4,90,50,0,25,0,2,0,0,0,564,
+564,tirtouga,5,,288,2,8,,1,45,50,0,30,0,2,0,0,0,565,
+565,carracosta,5,564,288,2,6,,1,45,50,0,30,0,2,0,0,0,566,
+566,archen,5,,289,10,9,,1,45,50,0,30,0,2,0,0,0,567,
+567,archeops,5,566,289,10,9,,1,45,50,0,30,0,2,0,0,0,568,
+568,trubbish,5,,290,5,12,,4,190,50,0,20,0,2,0,0,0,569,
+569,garbodor,5,568,290,5,12,,4,60,50,0,20,0,2,0,0,0,570,
+570,zorua,5,,291,4,8,,1,75,50,0,25,0,4,0,0,0,571,154
+571,zoroark,5,570,291,4,6,,1,45,50,0,20,0,4,0,0,0,572,155
+572,minccino,5,,292,4,8,,6,255,50,0,15,0,3,0,0,0,573,96
+573,cinccino,5,572,292,4,8,,6,60,50,0,15,0,3,0,0,0,574,97
+574,gothita,5,,293,7,12,,6,200,50,0,20,0,4,0,0,0,575,63
+575,gothorita,5,574,293,7,12,,6,100,50,0,20,0,4,0,0,0,576,64
+576,gothitelle,5,575,293,7,12,,6,50,50,0,20,0,4,0,0,0,577,65
+577,solosis,5,,294,5,1,,4,200,50,0,20,0,4,0,0,0,578,
+578,duosion,5,577,294,5,1,,4,100,50,0,20,0,4,0,0,0,579,
+579,reuniclus,5,578,294,5,4,,4,50,50,0,20,0,4,0,0,0,580,
+580,ducklett,5,,295,2,9,,4,190,70,0,20,0,2,0,0,0,581,
+581,swanna,5,580,295,9,9,,4,45,70,0,20,0,2,0,0,0,582,
+582,vanillite,5,,296,9,5,,4,255,50,0,20,0,1,0,0,0,583,
+583,vanillish,5,582,296,9,5,,4,120,50,0,20,0,1,0,0,0,584,
+584,vanilluxe,5,583,296,9,11,,4,45,50,0,20,0,1,0,0,0,585,
+585,deerling,5,,297,6,8,,4,190,70,0,20,0,2,1,0,0,586,
+586,sawsbuck,5,585,297,3,8,,4,75,70,0,20,0,2,1,0,0,587,
+587,emolga,5,,298,9,8,,4,200,50,0,20,0,2,0,0,0,588,180
+588,karrablast,5,,299,2,12,,4,200,50,0,15,0,2,0,0,0,589,
+589,escavalier,5,588,299,4,4,,4,75,50,0,15,0,2,0,0,0,590,
+590,foongus,5,,300,9,4,,4,190,50,0,20,0,2,0,0,0,591,
+591,amoonguss,5,590,300,9,4,,4,75,50,0,20,0,2,0,0,0,592,
+592,frillish,5,,301,9,10,,4,190,50,0,20,1,2,0,0,0,593,
+593,jellicent,5,592,301,9,10,,4,60,50,0,20,1,2,0,0,0,594,
+594,alomomola,5,,302,6,3,,4,75,70,0,40,0,3,0,0,0,595,
+595,joltik,5,,303,10,14,,4,190,50,0,20,0,2,0,0,0,596,147
+596,galvantula,5,595,303,10,14,,4,75,50,0,20,0,2,0,0,0,597,148
+597,ferroseed,5,,304,4,1,,4,255,50,0,20,0,2,0,0,0,598,
+598,ferrothorn,5,597,304,4,10,,4,90,50,0,20,0,2,0,0,0,599,
+599,klink,5,,305,4,11,,-1,130,50,0,20,0,4,0,0,0,600,
+600,klang,5,599,305,4,11,,-1,60,50,0,20,0,4,0,0,0,601,
+601,klinklang,5,600,305,4,11,,-1,30,50,0,20,0,4,0,0,0,602,
+602,tynamo,5,,306,9,3,,4,190,70,0,20,0,1,0,0,0,603,
+603,eelektrik,5,602,306,2,3,,4,60,70,0,20,0,1,0,0,0,604,
+604,eelektross,5,603,306,2,3,,4,30,70,0,20,0,1,0,0,0,605,
+605,elgyem,5,,307,2,6,,4,255,50,0,20,0,2,0,0,0,606,
+606,beheeyem,5,605,307,3,12,,4,90,50,0,20,0,2,0,0,0,607,
+607,litwick,5,,308,9,5,,4,190,50,0,20,0,4,0,0,0,608,37
+608,lampent,5,607,308,1,4,,4,90,50,0,20,0,4,0,0,0,609,38
+609,chandelure,5,608,308,1,4,,4,45,50,0,20,0,4,0,0,0,610,39
+610,axew,5,,309,5,6,,4,75,35,0,40,0,1,0,0,0,611,144
+611,fraxure,5,610,309,5,6,,4,60,35,0,40,0,1,0,0,0,612,145
+612,haxorus,5,611,309,10,6,,4,45,35,0,40,0,1,0,0,0,613,146
+613,cubchoo,5,,310,9,6,,4,120,50,0,20,0,2,0,0,0,614,104
+614,beartic,5,613,310,9,8,,4,60,50,0,20,0,2,0,0,0,615,105
+615,cryogonal,5,,311,2,1,,-1,25,50,0,25,0,2,0,0,0,616,
+616,shelmet,5,,312,8,1,,4,200,50,0,15,0,2,0,0,0,617,
+617,accelgor,5,616,312,8,4,,4,75,50,0,15,0,2,0,0,0,618,
+618,stunfisk,5,,313,3,3,,4,75,70,0,20,0,2,0,0,0,619,
+619,mienfoo,5,,314,10,6,,4,180,50,0,25,0,4,0,0,0,620,
+620,mienshao,5,619,314,7,6,,4,45,50,0,25,0,4,0,0,0,621,
+621,druddigon,5,,315,8,6,,4,45,50,0,30,0,2,0,0,0,622,
+622,golett,5,,316,5,12,,-1,190,50,0,25,0,2,0,0,0,623,
+623,golurk,5,622,316,5,12,,-1,90,50,0,25,0,2,0,0,0,624,
+624,pawniard,5,,317,8,12,,4,120,35,0,20,0,2,0,0,0,625,158
+625,bisharp,5,624,317,8,12,,4,45,35,0,20,0,2,0,0,0,626,159
+626,bouffalant,5,,318,3,8,,4,45,50,0,20,0,2,0,0,0,627,
+627,rufflet,5,,319,9,9,,0,190,50,0,20,0,1,0,0,0,628,169
+628,braviary,5,627,319,8,9,,0,60,50,0,20,0,1,0,0,0,629,170
+629,vullaby,5,,320,3,9,,8,190,35,0,20,0,1,0,0,0,630,
+630,mandibuzz,5,629,320,3,9,,8,60,35,0,20,0,1,0,0,0,631,
+631,heatmor,5,,321,8,6,,4,90,50,0,20,0,2,0,0,0,632,
+632,durant,5,,322,4,14,,4,90,50,0,20,0,2,0,0,0,633,
+633,deino,5,,323,2,8,,4,45,35,0,40,0,1,0,0,0,634,90
+634,zweilous,5,633,323,2,8,,4,45,35,0,40,0,1,0,0,0,635,91
+635,hydreigon,5,634,323,2,6,,4,45,35,0,40,0,1,0,0,0,636,92
+636,larvesta,5,,324,9,14,,4,45,50,0,40,0,1,0,0,0,637,173
+637,volcarona,5,636,324,9,13,,4,15,50,0,40,0,1,0,0,0,638,174
+638,cobalion,5,,325,2,8,,-1,3,35,0,80,0,1,0,1,0,639,
+639,terrakion,5,,326,4,8,,-1,3,35,0,80,0,1,0,1,0,640,191
+640,virizion,5,,327,5,8,,-1,3,35,0,80,0,1,0,1,0,641,
+641,tornadus,5,,328,5,4,,0,3,90,0,120,0,1,1,1,0,642,
+642,thundurus,5,,329,2,4,,0,3,90,0,120,0,1,1,1,0,643,
+643,reshiram,5,,330,9,9,,-1,3,0,0,120,0,1,0,1,0,644,197
+644,zekrom,5,,331,1,6,,-1,3,0,0,120,0,1,0,1,0,645,198
+645,landorus,5,,332,3,4,,0,3,90,0,120,0,1,1,1,0,646,
+646,kyurem,5,,333,4,6,,-1,3,0,0,120,0,1,1,1,0,647,
+647,keldeo,5,,334,10,8,,-1,3,35,0,80,0,1,1,0,1,648,
+648,meloetta,5,,335,9,12,,-1,3,100,0,120,0,1,1,0,1,649,
+649,genesect,5,,336,7,12,,-1,3,0,0,120,0,1,1,0,1,650,
+650,chespin,6,,337,5,6,,1,45,70,0,20,0,4,0,0,0,651,
+651,quilladin,6,650,337,5,6,,1,45,70,0,20,0,4,0,0,0,652,
+652,chesnaught,6,651,337,5,6,,1,45,70,0,20,0,4,0,0,0,653,
+653,fennekin,6,,338,8,8,,1,45,70,0,20,0,4,0,0,0,654,
+654,braixen,6,653,338,8,6,,1,45,70,0,20,0,4,0,0,0,655,
+655,delphox,6,654,338,8,6,,1,45,70,0,20,0,4,0,0,0,656,
+656,froakie,6,,339,2,8,,1,45,70,0,20,0,4,0,0,0,657,
+657,frogadier,6,656,339,2,12,,1,45,70,0,20,0,4,0,0,0,658,
+658,greninja,6,657,339,2,12,,1,45,70,0,20,0,4,0,0,0,659,
+659,bunnelby,6,,340,3,6,,4,255,50,0,15,0,2,0,0,0,660,
+660,diggersby,6,659,340,3,6,,4,127,50,0,15,0,2,0,0,0,661,
+661,fletchling,6,,341,8,9,,4,255,50,0,15,0,4,0,0,0,662,
+662,fletchinder,6,661,341,8,9,,4,120,50,0,15,0,4,0,0,0,663,
+663,talonflame,6,662,341,8,9,,4,45,50,0,15,0,4,0,0,0,664,
+664,scatterbug,6,,342,1,14,,4,255,70,0,15,0,2,0,0,0,665,
+665,spewpa,6,664,342,1,5,,4,120,70,0,15,0,2,0,0,0,666,
+666,vivillon,6,665,342,9,13,,4,45,70,0,15,0,2,0,0,0,667,
+667,litleo,6,,343,3,8,,7,220,70,0,20,0,4,0,0,0,668,
+668,pyroar,6,667,343,3,8,,7,65,70,0,20,1,4,0,0,0,669,
+669,flabebe,6,,344,9,4,,8,225,70,0,20,0,2,0,0,0,670,
+670,floette,6,669,344,9,4,,8,120,70,0,20,0,2,0,0,0,671,
+671,florges,6,670,344,9,4,,8,45,70,0,20,0,2,0,0,0,672,
+672,skiddo,6,,345,3,8,,4,200,70,0,20,0,2,0,0,0,673,
+673,gogoat,6,672,345,3,8,,4,45,70,0,20,0,2,0,0,0,674,
+674,pancham,6,,346,9,6,,4,220,50,0,25,0,2,0,0,0,675,
+675,pangoro,6,674,346,9,12,,4,65,50,0,25,0,2,0,0,0,676,
+676,furfrou,6,,347,9,8,,4,160,70,0,20,0,2,1,0,0,677,
+677,espurr,6,,348,4,6,,4,190,50,0,20,0,2,0,0,0,678,
+678,meowstic,6,677,348,2,6,,0,75,50,0,20,1,2,0,0,0,679,
+679,honedge,6,,349,3,5,,4,180,50,0,20,0,2,0,0,0,680,
+680,doublade,6,679,349,3,11,,4,90,50,0,20,0,2,0,0,0,681,
+681,aegislash,6,680,349,3,5,,4,45,50,0,20,0,2,1,0,0,682,
+682,spritzee,6,,350,6,4,,4,200,50,0,20,0,2,0,0,0,683,
+683,aromatisse,6,682,350,6,12,,4,140,50,0,20,0,2,0,0,0,684,
+684,swirlix,6,,351,9,7,,4,200,50,0,20,0,2,0,0,0,685,
+685,slurpuff,6,684,351,9,12,,4,140,50,0,20,0,2,0,0,0,686,
+686,inkay,6,,352,2,10,,4,190,50,0,20,0,2,0,0,0,687,
+687,malamar,6,686,352,2,5,,4,80,50,0,20,0,2,0,0,0,688,
+688,binacle,6,,353,3,11,,4,120,50,0,20,0,2,0,0,0,689,
+689,barbaracle,6,688,353,3,11,,4,45,50,0,20,0,2,0,0,0,690,
+690,skrelp,6,,354,3,5,,4,225,50,0,20,0,2,0,0,0,691,
+691,dragalge,6,690,354,3,5,,4,55,50,0,20,0,2,0,0,0,692,
+692,clauncher,6,,355,2,14,,4,225,50,0,15,0,1,0,0,0,693,
+693,clawitzer,6,692,355,2,2,,4,55,50,0,15,0,1,0,0,0,694,
+694,helioptile,6,,356,10,6,,4,190,50,0,20,0,2,0,0,0,695,
+695,heliolisk,6,694,356,10,6,,4,75,50,0,20,0,2,0,0,0,696,
+696,tyrunt,6,,357,3,6,,1,45,50,0,30,0,2,0,0,0,697,
+697,tyrantrum,6,696,357,8,6,,1,45,50,0,30,0,2,0,0,0,698,
+698,amaura,6,,358,2,8,,1,45,50,0,30,0,2,0,0,0,699,
+699,aurorus,6,698,358,2,8,,1,45,50,0,30,0,2,0,0,0,700,
+700,sylveon,6,133,67,6,8,,1,45,50,0,35,0,2,0,0,0,165,
+701,hawlucha,6,,359,5,12,,4,100,50,0,20,0,2,0,0,0,701,
+702,dedenne,6,,360,10,6,,4,180,50,0,20,0,2,0,0,0,702,
+703,carbink,6,,361,4,1,,-1,60,50,0,25,0,1,0,0,0,703,
+704,goomy,6,,362,7,2,,4,45,35,0,40,0,1,0,0,0,704,
+705,sliggoo,6,704,362,7,2,,4,45,35,0,40,0,1,0,0,0,705,
+706,goodra,6,705,362,7,6,,4,45,35,0,40,0,1,0,0,0,706,
+707,klefki,6,,363,4,1,,4,75,50,0,20,0,3,0,0,0,707,
+708,phantump,6,,364,3,4,,4,120,50,0,20,0,2,0,0,0,708,
+709,trevenant,6,708,364,3,10,,4,60,50,0,20,0,2,0,0,0,709,
+710,pumpkaboo,6,,365,3,1,,4,120,50,0,20,0,2,0,0,0,710,
+711,gourgeist,6,710,365,3,5,,4,60,50,0,20,0,2,0,0,0,711,
+712,bergmite,6,,366,2,8,,4,190,50,0,20,0,2,0,0,0,712,
+713,avalugg,6,712,366,2,8,,4,55,50,0,20,0,2,0,0,0,713,
+714,noibat,6,,367,7,9,,4,190,50,0,20,0,2,0,0,0,714,
+715,noivern,6,714,367,7,9,,4,45,50,0,20,0,2,0,0,0,715,
+716,xerneas,6,,368,2,8,,-1,45,0,0,120,0,1,1,1,0,716,
+717,yveltal,6,,369,8,9,,-1,45,0,0,120,0,1,0,1,0,717,
+718,zygarde,6,,370,5,2,,-1,3,0,0,120,0,1,0,1,0,718,
+719,diancie,6,,371,6,4,,-1,3,50,0,25,0,1,1,0,1,719,
+720,hoopa,6,,372,7,4,,-1,3,100,0,120,0,1,0,0,1,720,
+721,volcanion,6,,373,3,8,,-1,3,100,0,120,0,1,0,0,1,721,
+722,rowlet,7,,374,3,9,,1,45,50,0,15,0,4,0,0,0,722,
+723,dartrix,7,722,374,3,9,,1,45,50,0,15,0,4,0,0,0,723,
+724,decidueye,7,723,374,3,9,,1,45,50,0,15,0,4,0,0,0,724,
+725,litten,7,,375,8,8,,1,45,50,0,15,0,4,0,0,0,725,
+726,torracat,7,725,375,8,8,,1,45,50,0,15,0,4,0,0,0,726,
+727,incineroar,7,726,375,8,6,,1,45,50,0,15,0,4,0,0,0,727,
+728,popplio,7,,376,2,3,,1,45,50,0,15,0,4,0,0,0,728,
+729,brionne,7,728,376,2,3,,1,45,50,0,15,0,4,0,0,0,729,
+730,primarina,7,729,376,2,3,,1,45,50,0,15,0,4,0,0,0,730,
+731,pikipek,7,,377,1,9,,4,255,70,0,15,0,2,0,0,0,731,
+732,trumbeak,7,731,377,1,9,,4,120,70,0,15,0,2,0,0,0,732,
+733,toucannon,7,732,377,1,9,,4,45,70,0,15,0,2,0,0,0,733,
+734,yungoos,7,,378,3,8,,4,255,70,0,15,0,2,0,0,0,734,
+735,gumshoos,7,734,378,3,8,,4,127,70,0,15,0,2,0,0,0,735,
+736,grubbin,7,,379,4,14,,4,255,50,0,15,0,2,0,0,0,736,
+737,charjabug,7,736,379,5,2,,4,120,50,0,15,0,2,0,0,0,737,
+738,vikavolt,7,737,379,2,14,,4,45,50,0,15,0,2,0,0,0,738,
+739,crabrawler,7,,380,7,14,,4,225,70,0,20,0,2,0,0,0,739,
+740,crabominable,7,739,380,9,14,,4,60,70,0,20,0,2,0,0,0,740,
+741,oricorio,7,,381,8,9,,6,45,70,0,20,0,2,0,0,0,741,
+742,cutiefly,7,,382,10,14,,4,190,50,0,20,0,2,0,0,0,742,
+743,ribombee,7,742,382,10,13,,4,75,50,0,20,0,2,0,0,0,743,
+744,rockruff,7,,383,3,8,,4,190,50,0,15,0,2,0,0,0,744,
+745,lycanroc,7,744,383,3,8,,4,90,50,0,15,0,2,0,0,0,745,
+746,wishiwashi,7,,384,2,3,,4,60,50,0,15,0,3,0,0,0,746,
+747,mareanie,7,,385,2,5,,4,190,50,0,20,0,2,0,0,0,747,
+748,toxapex,7,747,385,2,10,,4,75,50,0,20,0,2,0,0,0,748,
+749,mudbray,7,,386,3,8,,4,190,50,0,20,0,2,0,0,0,749,
+750,mudsdale,7,749,386,3,8,,4,60,50,0,20,0,2,0,0,0,750,
+751,dewpider,7,,387,5,7,,4,200,50,0,15,0,2,0,0,0,751,
+752,araquanid,7,751,387,5,14,,4,100,50,0,15,0,2,0,0,0,752,
+753,fomantis,7,,388,6,6,,4,190,50,0,20,0,2,0,0,0,753,
+754,lurantis,7,753,388,6,12,,4,75,50,0,20,0,2,0,0,0,754,
+755,morelull,7,,389,7,5,,4,190,50,0,20,0,2,0,0,0,755,
+756,shiinotic,7,755,389,7,12,,4,75,50,0,20,0,2,0,0,0,756,
+757,salandit,7,,390,1,8,,1,120,50,0,20,0,2,0,0,0,757,
+758,salazzle,7,757,390,1,8,,8,45,50,0,20,0,2,0,0,0,758,
+759,stufful,7,,391,6,8,,4,140,50,0,15,0,2,0,0,0,759,
+760,bewear,7,759,391,6,6,,4,70,50,0,15,0,2,0,0,0,760,
+761,bounsweet,7,,392,7,7,,8,235,50,0,20,0,4,0,0,0,761,
+762,steenee,7,761,392,7,12,,8,120,50,0,20,0,4,0,0,0,762,
+763,tsareena,7,762,392,7,12,,8,45,50,0,20,0,4,0,0,0,763,
+764,comfey,7,,393,5,1,,6,60,50,0,20,0,3,0,0,0,764,
+765,oranguru,7,,394,9,12,,4,45,50,0,20,0,1,0,0,0,765,
+766,passimian,7,,395,9,6,,4,45,50,0,20,0,1,0,0,0,766,
+767,wimpod,7,,396,4,10,,4,90,50,0,20,0,2,0,0,0,767,
+768,golisopod,7,767,396,4,12,,4,45,50,0,20,0,2,0,0,0,768,
+769,sandygast,7,,397,3,2,,4,140,50,0,15,0,2,0,0,0,769,
+770,palossand,7,769,397,3,2,,4,60,50,0,15,0,2,0,0,0,770,
+771,pyukumuku,7,,398,1,2,,4,60,50,0,15,0,3,0,0,0,771,
+772,type-null,7,,399,4,8,,-1,3,0,0,120,0,1,0,0,0,772,
+773,silvally,7,772,399,4,8,,-1,3,0,0,120,0,1,0,0,0,773,
+774,minior,7,,400,3,1,,-1,30,70,0,25,0,4,0,0,0,774,
+775,komala,7,,401,2,12,,4,45,70,0,20,0,1,0,0,0,775,
+776,turtonator,7,,402,8,6,,4,70,50,0,20,0,2,0,0,0,776,
+777,togedemaru,7,,403,4,6,,4,180,50,0,10,0,2,0,0,0,777,
+778,mimikyu,7,,404,10,2,,4,45,50,0,20,0,2,0,0,0,778,
+779,bruxish,7,,405,6,3,,4,80,70,0,15,0,2,0,0,0,779,
+780,drampa,7,,406,9,2,,4,70,50,0,20,0,2,0,0,0,780,
+781,dhelmise,7,,407,5,5,,-1,25,50,0,25,0,2,0,0,0,781,
+782,jangmo-o,7,,408,4,8,,4,45,50,0,40,0,1,0,0,0,782,
+783,hakamo-o,7,782,408,4,6,,4,45,50,0,40,0,1,0,0,0,783,
+784,kommo-o,7,783,408,4,6,,4,45,50,0,40,0,1,0,0,0,784,
+785,tapu-koko,7,,409,10,4,,-1,3,50,0,15,0,1,0,1,0,785,
+786,tapu-lele,7,,410,6,4,,-1,3,50,0,15,0,1,0,1,0,786,
+787,tapu-bulu,7,,411,8,4,,-1,3,50,0,15,0,1,0,1,0,787,
+788,tapu-fini,7,,412,7,4,,-1,3,50,0,15,0,1,0,1,0,788,
+789,cosmog,7,,413,2,1,,-1,45,0,0,120,0,1,0,1,0,789,
+790,cosmoem,7,789,413,2,1,,-1,45,0,0,120,0,1,0,1,0,790,
+791,solgaleo,7,790,413,9,8,,-1,45,0,0,120,0,1,0,1,0,791,
+792,lunala,7,790,413,7,9,,-1,45,0,0,120,0,1,0,1,0,792,
+793,nihilego,7,,414,9,10,,-1,45,0,0,120,0,1,0,0,0,793,
+794,buzzwole,7,,415,8,10,,-1,45,0,0,120,0,1,0,0,0,794,
+795,pheromosa,7,,416,9,12,,-1,45,0,0,120,0,1,0,0,0,795,
+796,xurkitree,7,,417,1,6,,-1,45,0,0,120,0,1,0,0,0,796,
+797,celesteela,7,,418,5,12,,-1,45,0,0,120,0,1,0,0,0,797,
+798,kartana,7,,419,9,12,,-1,45,0,0,120,0,1,0,0,0,798,
+799,guzzlord,7,,420,1,6,,-1,45,0,0,120,0,1,0,0,0,799,
+800,necrozma,7,,421,1,4,,-1,255,0,0,120,0,1,0,1,0,800,
+801,magearna,7,,422,4,12,,-1,3,0,0,120,0,1,0,0,1,801,
+802,marshadow,7,,423,4,12,,-1,3,0,0,120,0,1,0,0,1,802,
+803,poipole,7,,424,7,6,,-1,45,0,0,120,0,1,0,0,0,803,
+804,naganadel,7,803,424,7,9,,-1,45,0,0,120,0,1,0,0,0,804,
+805,stakataka,7,,425,4,8,,-1,30,0,0,120,0,1,0,0,0,805,
+806,blacephalon,7,,426,9,12,,-1,30,0,0,120,0,1,0,0,0,806,
+807,zeraora,7,,427,10,12,,-1,3,0,0,120,0,1,0,0,1,807,
+808,meltan,7,,428,4,,,-1,3,0,0,120,0,1,0,0,1,808,
+809,melmetal,7,,429,4,,,-1,3,0,0,120,0,1,0,0,1,809,
+810,grookey,8,,430,5,,,1,45,50,0,20,0,4,0,0,0,810,
+811,thwackey,8,810,430,5,,,1,45,50,0,20,0,4,0,0,0,811,
+812,rillaboom,8,811,430,5,,,1,45,50,0,20,0,4,0,0,0,812,
+813,scorbunny,8,,431,9,,,1,45,50,0,20,0,4,0,0,0,813,
+814,raboot,8,813,431,4,,,1,45,50,0,20,0,4,0,0,0,814,
+815,cinderace,8,814,431,9,,,1,45,50,0,20,0,4,0,0,0,815,
+816,sobble,8,,432,2,,,1,45,50,0,20,0,4,0,0,0,816,
+817,drizzile,8,816,432,2,,,1,45,50,0,20,0,4,0,0,0,817,
+818,inteleon,8,817,432,2,,,1,45,50,0,20,0,4,0,0,0,818,
+819,skwovet,8,,433,3,,,4,255,50,0,20,0,2,0,0,0,819,
+820,greedent,8,819,433,3,,,4,90,50,0,20,0,2,0,0,0,820,
+821,rookidee,8,,434,2,,,4,255,50,0,15,0,4,0,0,0,821,
+822,corvisquire,8,821,434,2,,,4,120,50,0,15,0,4,0,0,0,822,
+823,corviknight,8,822,434,7,,,4,45,50,0,15,0,4,0,0,0,823,
+824,blipbug,8,,435,2,,,4,255,50,0,15,0,2,0,0,0,824,
+825,dottler,8,824,435,10,,,4,120,50,0,15,0,2,0,0,0,825,
+826,orbeetle,8,825,435,8,,,4,45,50,0,15,0,2,0,0,0,826,
+827,nickit,8,,436,3,,,4,255,50,0,15,0,3,0,0,0,827,
+828,thievul,8,827,436,3,,,4,127,50,0,15,0,3,0,0,0,828,
+829,gossifleur,8,,437,5,,,4,190,50,0,20,0,2,0,0,0,829,
+830,eldegoss,8,829,437,5,,,4,75,50,0,20,0,2,0,0,0,830,
+831,wooloo,8,,438,9,,,4,255,50,0,15,0,2,0,0,0,831,
+832,dubwool,8,831,438,9,,,4,127,50,0,15,0,2,0,0,0,832,
+833,chewtle,8,,439,5,,,4,255,50,0,20,0,2,0,0,0,833,
+834,drednaw,8,833,439,5,,,4,75,50,0,20,0,2,0,0,0,834,
+835,yamper,8,,440,10,,,4,255,50,0,20,0,3,0,0,0,835,
+836,boltund,8,835,440,10,,,4,45,50,0,20,0,3,0,0,0,836,
+837,rolycoly,8,,441,1,,,4,255,50,0,15,0,4,0,0,0,837,
+838,carkol,8,837,441,1,,,4,120,50,0,15,0,4,0,0,0,838,
+839,coalossal,8,838,441,1,,,4,45,50,0,15,0,4,0,0,0,839,
+840,applin,8,,442,5,,,4,255,50,0,20,0,5,0,0,0,840,
+841,flapple,8,840,442,5,,,4,45,50,0,20,0,5,0,0,0,841,
+842,appletun,8,840,442,5,,,4,45,50,0,20,0,5,0,0,0,842,
+843,silicobra,8,,443,5,,,4,255,50,0,20,0,2,0,0,0,843,
+844,sandaconda,8,843,443,5,,,4,120,50,0,20,0,2,0,0,0,844,
+845,cramorant,8,,444,2,,,4,45,50,0,20,0,2,0,0,0,845,
+846,arrokuda,8,,445,3,,,4,255,50,0,20,0,1,0,0,0,846,
+847,barraskewda,8,846,445,3,,,4,60,50,0,20,0,1,0,0,0,847,
+848,toxel,8,,446,7,,,4,75,50,1,25,0,4,0,0,0,848,
+849,toxtricity,8,848,446,7,,,4,45,50,0,25,0,4,0,0,0,849,
+850,sizzlipede,8,,447,8,,,4,190,50,0,20,0,2,0,0,0,850,
+851,centiskorch,8,850,447,8,,,4,75,50,0,20,0,2,0,0,0,851,
+852,clobbopus,8,,448,3,,,4,180,50,0,25,0,4,0,0,0,852,
+853,grapploct,8,852,448,2,,,4,45,50,0,25,0,4,0,0,0,853,
+854,sinistea,8,,449,7,,,-1,120,50,0,20,0,2,0,0,0,854,
+855,polteageist,8,854,449,7,,,-1,60,50,0,20,0,2,0,0,0,855,
+856,hatenna,8,,450,6,,,8,235,50,0,20,0,1,0,0,0,856,
+857,hattrem,8,856,450,6,,,8,120,50,0,20,0,1,0,0,0,857,
+858,hatterene,8,857,450,6,,,8,45,50,0,20,0,1,0,0,0,858,
+859,impidimp,8,,451,6,,,0,255,50,0,20,0,2,0,0,0,859,
+860,morgrem,8,859,451,6,,,0,120,50,0,20,0,2,0,0,0,860,
+861,grimmsnarl,8,860,451,7,,,0,45,50,0,20,0,2,0,0,0,861,
+862,obstagoon,8,264,134,4,,,4,45,50,0,15,0,2,0,0,0,862,
+863,perrserker,8,52,22,3,,,4,90,50,0,20,0,2,0,0,0,863,
+864,cursola,8,222,113,9,,,6,30,50,0,20,0,3,0,0,0,864,
+865,sirfetchd,8,83,35,9,,,4,45,50,0,20,0,2,0,0,0,865,
+866,mr-rime,8,122,57,7,,,4,45,50,0,25,0,2,0,0,0,866,
+867,runerigus,8,562,287,4,,,4,90,50,0,25,0,2,0,0,0,867,
+868,milcery,8,,452,9,,,8,200,50,0,20,0,2,0,0,0,868,
+869,alcremie,8,868,452,9,,,8,100,50,0,20,0,2,0,0,0,869,
+870,falinks,8,,453,10,,,-1,45,50,0,25,0,2,0,0,0,870,
+871,pincurchin,8,,454,7,,,4,75,50,0,20,0,2,0,0,0,871,
+872,snom,8,,455,9,,,4,190,50,0,20,0,2,0,0,0,872,
+873,frosmoth,8,872,455,9,,,4,75,50,0,20,0,2,0,0,0,873,
+874,stonjourner,8,,456,4,,,4,60,50,0,25,0,1,0,0,0,874,
+875,eiscue,8,,457,2,,,4,60,50,0,25,0,1,0,0,0,875,
+876,indeedee,8,,458,7,,,0,30,140,0,40,0,3,0,0,0,876,
+877,morpeko,8,,459,10,,,4,180,50,0,10,0,2,0,0,0,877,
+878,cufant,8,,460,10,,,4,190,50,0,25,0,2,0,0,0,878,
+879,copperajah,8,878,460,5,,,4,90,50,0,25,0,2,0,0,0,879,
+880,dracozolt,8,,461,5,,,-1,45,50,0,35,0,1,0,0,0,880,
+881,arctozolt,8,,462,2,,,-1,45,50,0,35,0,1,0,0,0,881,
+882,dracovish,8,,463,5,,,-1,45,50,0,35,0,1,0,0,0,882,
+883,arctovish,8,,464,2,,,-1,45,50,0,35,0,1,0,0,0,883,
+884,duraludon,8,,465,9,,,4,45,50,0,30,0,2,0,0,0,884,
+885,dreepy,8,,466,5,,,4,45,50,0,40,0,1,0,0,0,885,
+886,drakloak,8,885,466,5,,,4,45,50,0,40,0,1,0,0,0,886,
+887,dragapult,8,886,466,5,,,4,45,50,0,40,0,1,0,0,0,887,
+888,zacian,8,,467,2,,,-1,10,0,0,120,0,1,0,1,0,888,
+889,zamazenta,8,,468,8,,,-1,10,0,0,120,0,1,0,1,0,889,
+890,eternatus,8,,469,7,,,-1,255,0,0,120,0,1,0,1,0,890,
+891,kubfu,8,,470,4,,,1,3,50,0,120,0,1,0,1,0,891,
+892,urshifu,8,891,470,4,,,1,3,50,0,120,0,1,0,1,0,892,
+893,zarude,8,,471,5,,,-1,3,0,0,120,0,1,0,0,1,893,
+894,regieleki,8,,472,10,,,-1,3,35,0,120,0,1,0,1,0,894,
+895,regidrago,8,,473,5,,,-1,3,35,0,120,0,1,0,1,0,895,
+896,glastrier,8,,474,9,,,-1,3,35,0,120,0,1,0,1,0,896,
+897,spectrier,8,,475,1,,,-1,3,35,0,120,0,1,0,1,0,897,
+898,calyrex,8,,476,5,,,-1,3,100,0,120,0,1,0,1,0,898,
diff --git a/src/main/resources/data/pokemon_types.csv b/src/main/resources/data/pokemon_types.csv
new file mode 100644
index 0000000..3ec0e96
--- /dev/null
+++ b/src/main/resources/data/pokemon_types.csv
@@ -0,0 +1,1676 @@
+pokemon_id,type_id,slot
+1,12,1
+1,4,2
+2,12,1
+2,4,2
+3,12,1
+3,4,2
+4,10,1
+5,10,1
+6,10,1
+6,3,2
+7,11,1
+8,11,1
+9,11,1
+10,7,1
+11,7,1
+12,7,1
+12,3,2
+13,7,1
+13,4,2
+14,7,1
+14,4,2
+15,7,1
+15,4,2
+16,1,1
+16,3,2
+17,1,1
+17,3,2
+18,1,1
+18,3,2
+19,1,1
+20,1,1
+21,1,1
+21,3,2
+22,1,1
+22,3,2
+23,4,1
+24,4,1
+25,13,1
+26,13,1
+27,5,1
+28,5,1
+29,4,1
+30,4,1
+31,4,1
+31,5,2
+32,4,1
+33,4,1
+34,4,1
+34,5,2
+35,18,1
+36,18,1
+37,10,1
+38,10,1
+39,1,1
+39,18,2
+40,1,1
+40,18,2
+41,4,1
+41,3,2
+42,4,1
+42,3,2
+43,12,1
+43,4,2
+44,12,1
+44,4,2
+45,12,1
+45,4,2
+46,7,1
+46,12,2
+47,7,1
+47,12,2
+48,7,1
+48,4,2
+49,7,1
+49,4,2
+50,5,1
+51,5,1
+52,1,1
+53,1,1
+54,11,1
+55,11,1
+56,2,1
+57,2,1
+58,10,1
+59,10,1
+60,11,1
+61,11,1
+62,11,1
+62,2,2
+63,14,1
+64,14,1
+65,14,1
+66,2,1
+67,2,1
+68,2,1
+69,12,1
+69,4,2
+70,12,1
+70,4,2
+71,12,1
+71,4,2
+72,11,1
+72,4,2
+73,11,1
+73,4,2
+74,6,1
+74,5,2
+75,6,1
+75,5,2
+76,6,1
+76,5,2
+77,10,1
+78,10,1
+79,11,1
+79,14,2
+80,11,1
+80,14,2
+81,13,1
+81,9,2
+82,13,1
+82,9,2
+83,1,1
+83,3,2
+84,1,1
+84,3,2
+85,1,1
+85,3,2
+86,11,1
+87,11,1
+87,15,2
+88,4,1
+89,4,1
+90,11,1
+91,11,1
+91,15,2
+92,8,1
+92,4,2
+93,8,1
+93,4,2
+94,8,1
+94,4,2
+95,6,1
+95,5,2
+96,14,1
+97,14,1
+98,11,1
+99,11,1
+100,13,1
+101,13,1
+102,12,1
+102,14,2
+103,12,1
+103,14,2
+104,5,1
+105,5,1
+106,2,1
+107,2,1
+108,1,1
+109,4,1
+110,4,1
+111,5,1
+111,6,2
+112,5,1
+112,6,2
+113,1,1
+114,12,1
+115,1,1
+116,11,1
+117,11,1
+118,11,1
+119,11,1
+120,11,1
+121,11,1
+121,14,2
+122,14,1
+122,18,2
+123,7,1
+123,3,2
+124,15,1
+124,14,2
+125,13,1
+126,10,1
+127,7,1
+128,1,1
+129,11,1
+130,11,1
+130,3,2
+131,11,1
+131,15,2
+132,1,1
+133,1,1
+134,11,1
+135,13,1
+136,10,1
+137,1,1
+138,6,1
+138,11,2
+139,6,1
+139,11,2
+140,6,1
+140,11,2
+141,6,1
+141,11,2
+142,6,1
+142,3,2
+143,1,1
+144,15,1
+144,3,2
+145,13,1
+145,3,2
+146,10,1
+146,3,2
+147,16,1
+148,16,1
+149,16,1
+149,3,2
+150,14,1
+151,14,1
+152,12,1
+153,12,1
+154,12,1
+155,10,1
+156,10,1
+157,10,1
+158,11,1
+159,11,1
+160,11,1
+161,1,1
+162,1,1
+163,1,1
+163,3,2
+164,1,1
+164,3,2
+165,7,1
+165,3,2
+166,7,1
+166,3,2
+167,7,1
+167,4,2
+168,7,1
+168,4,2
+169,4,1
+169,3,2
+170,11,1
+170,13,2
+171,11,1
+171,13,2
+172,13,1
+173,18,1
+174,1,1
+174,18,2
+175,18,1
+176,18,1
+176,3,2
+177,14,1
+177,3,2
+178,14,1
+178,3,2
+179,13,1
+180,13,1
+181,13,1
+182,12,1
+183,11,1
+183,18,2
+184,11,1
+184,18,2
+185,6,1
+186,11,1
+187,12,1
+187,3,2
+188,12,1
+188,3,2
+189,12,1
+189,3,2
+190,1,1
+191,12,1
+192,12,1
+193,7,1
+193,3,2
+194,11,1
+194,5,2
+195,11,1
+195,5,2
+196,14,1
+197,17,1
+198,17,1
+198,3,2
+199,11,1
+199,14,2
+200,8,1
+201,14,1
+202,14,1
+203,1,1
+203,14,2
+204,7,1
+205,7,1
+205,9,2
+206,1,1
+207,5,1
+207,3,2
+208,9,1
+208,5,2
+209,18,1
+210,18,1
+211,11,1
+211,4,2
+212,7,1
+212,9,2
+213,7,1
+213,6,2
+214,7,1
+214,2,2
+215,17,1
+215,15,2
+216,1,1
+217,1,1
+218,10,1
+219,10,1
+219,6,2
+220,15,1
+220,5,2
+221,15,1
+221,5,2
+222,11,1
+222,6,2
+223,11,1
+224,11,1
+225,15,1
+225,3,2
+226,11,1
+226,3,2
+227,9,1
+227,3,2
+228,17,1
+228,10,2
+229,17,1
+229,10,2
+230,11,1
+230,16,2
+231,5,1
+232,5,1
+233,1,1
+234,1,1
+235,1,1
+236,2,1
+237,2,1
+238,15,1
+238,14,2
+239,13,1
+240,10,1
+241,1,1
+242,1,1
+243,13,1
+244,10,1
+245,11,1
+246,6,1
+246,5,2
+247,6,1
+247,5,2
+248,6,1
+248,17,2
+249,14,1
+249,3,2
+250,10,1
+250,3,2
+251,14,1
+251,12,2
+252,12,1
+253,12,1
+254,12,1
+255,10,1
+256,10,1
+256,2,2
+257,10,1
+257,2,2
+258,11,1
+259,11,1
+259,5,2
+260,11,1
+260,5,2
+261,17,1
+262,17,1
+263,1,1
+264,1,1
+265,7,1
+266,7,1
+267,7,1
+267,3,2
+268,7,1
+269,7,1
+269,4,2
+270,11,1
+270,12,2
+271,11,1
+271,12,2
+272,11,1
+272,12,2
+273,12,1
+274,12,1
+274,17,2
+275,12,1
+275,17,2
+276,1,1
+276,3,2
+277,1,1
+277,3,2
+278,11,1
+278,3,2
+279,11,1
+279,3,2
+280,14,1
+280,18,2
+281,14,1
+281,18,2
+282,14,1
+282,18,2
+283,7,1
+283,11,2
+284,7,1
+284,3,2
+285,12,1
+286,12,1
+286,2,2
+287,1,1
+288,1,1
+289,1,1
+290,7,1
+290,5,2
+291,7,1
+291,3,2
+292,7,1
+292,8,2
+293,1,1
+294,1,1
+295,1,1
+296,2,1
+297,2,1
+298,1,1
+298,18,2
+299,6,1
+300,1,1
+301,1,1
+302,17,1
+302,8,2
+303,9,1
+303,18,2
+304,9,1
+304,6,2
+305,9,1
+305,6,2
+306,9,1
+306,6,2
+307,2,1
+307,14,2
+308,2,1
+308,14,2
+309,13,1
+310,13,1
+311,13,1
+312,13,1
+313,7,1
+314,7,1
+315,12,1
+315,4,2
+316,4,1
+317,4,1
+318,11,1
+318,17,2
+319,11,1
+319,17,2
+320,11,1
+321,11,1
+322,10,1
+322,5,2
+323,10,1
+323,5,2
+324,10,1
+325,14,1
+326,14,1
+327,1,1
+328,5,1
+329,5,1
+329,16,2
+330,5,1
+330,16,2
+331,12,1
+332,12,1
+332,17,2
+333,1,1
+333,3,2
+334,16,1
+334,3,2
+335,1,1
+336,4,1
+337,6,1
+337,14,2
+338,6,1
+338,14,2
+339,11,1
+339,5,2
+340,11,1
+340,5,2
+341,11,1
+342,11,1
+342,17,2
+343,5,1
+343,14,2
+344,5,1
+344,14,2
+345,6,1
+345,12,2
+346,6,1
+346,12,2
+347,6,1
+347,7,2
+348,6,1
+348,7,2
+349,11,1
+350,11,1
+351,1,1
+352,1,1
+353,8,1
+354,8,1
+355,8,1
+356,8,1
+357,12,1
+357,3,2
+358,14,1
+359,17,1
+360,14,1
+361,15,1
+362,15,1
+363,15,1
+363,11,2
+364,15,1
+364,11,2
+365,15,1
+365,11,2
+366,11,1
+367,11,1
+368,11,1
+369,11,1
+369,6,2
+370,11,1
+371,16,1
+372,16,1
+373,16,1
+373,3,2
+374,9,1
+374,14,2
+375,9,1
+375,14,2
+376,9,1
+376,14,2
+377,6,1
+378,15,1
+379,9,1
+380,16,1
+380,14,2
+381,16,1
+381,14,2
+382,11,1
+383,5,1
+384,16,1
+384,3,2
+385,9,1
+385,14,2
+386,14,1
+387,12,1
+388,12,1
+389,12,1
+389,5,2
+390,10,1
+391,10,1
+391,2,2
+392,10,1
+392,2,2
+393,11,1
+394,11,1
+395,11,1
+395,9,2
+396,1,1
+396,3,2
+397,1,1
+397,3,2
+398,1,1
+398,3,2
+399,1,1
+400,1,1
+400,11,2
+401,7,1
+402,7,1
+403,13,1
+404,13,1
+405,13,1
+406,12,1
+406,4,2
+407,12,1
+407,4,2
+408,6,1
+409,6,1
+410,6,1
+410,9,2
+411,6,1
+411,9,2
+412,7,1
+413,7,1
+413,12,2
+414,7,1
+414,3,2
+415,7,1
+415,3,2
+416,7,1
+416,3,2
+417,13,1
+418,11,1
+419,11,1
+420,12,1
+421,12,1
+422,11,1
+423,11,1
+423,5,2
+424,1,1
+425,8,1
+425,3,2
+426,8,1
+426,3,2
+427,1,1
+428,1,1
+429,8,1
+430,17,1
+430,3,2
+431,1,1
+432,1,1
+433,14,1
+434,4,1
+434,17,2
+435,4,1
+435,17,2
+436,9,1
+436,14,2
+437,9,1
+437,14,2
+438,6,1
+439,14,1
+439,18,2
+440,1,1
+441,1,1
+441,3,2
+442,8,1
+442,17,2
+443,16,1
+443,5,2
+444,16,1
+444,5,2
+445,16,1
+445,5,2
+446,1,1
+447,2,1
+448,2,1
+448,9,2
+449,5,1
+450,5,1
+451,4,1
+451,7,2
+452,4,1
+452,17,2
+453,4,1
+453,2,2
+454,4,1
+454,2,2
+455,12,1
+456,11,1
+457,11,1
+458,11,1
+458,3,2
+459,12,1
+459,15,2
+460,12,1
+460,15,2
+461,17,1
+461,15,2
+462,13,1
+462,9,2
+463,1,1
+464,5,1
+464,6,2
+465,12,1
+466,13,1
+467,10,1
+468,18,1
+468,3,2
+469,7,1
+469,3,2
+470,12,1
+471,15,1
+472,5,1
+472,3,2
+473,15,1
+473,5,2
+474,1,1
+475,14,1
+475,2,2
+476,6,1
+476,9,2
+477,8,1
+478,15,1
+478,8,2
+479,13,1
+479,8,2
+480,14,1
+481,14,1
+482,14,1
+483,9,1
+483,16,2
+484,11,1
+484,16,2
+485,10,1
+485,9,2
+486,1,1
+487,8,1
+487,16,2
+488,14,1
+489,11,1
+490,11,1
+491,17,1
+492,12,1
+493,1,1
+494,14,1
+494,10,2
+495,12,1
+496,12,1
+497,12,1
+498,10,1
+499,10,1
+499,2,2
+500,10,1
+500,2,2
+501,11,1
+502,11,1
+503,11,1
+504,1,1
+505,1,1
+506,1,1
+507,1,1
+508,1,1
+509,17,1
+510,17,1
+511,12,1
+512,12,1
+513,10,1
+514,10,1
+515,11,1
+516,11,1
+517,14,1
+518,14,1
+519,1,1
+519,3,2
+520,1,1
+520,3,2
+521,1,1
+521,3,2
+522,13,1
+523,13,1
+524,6,1
+525,6,1
+526,6,1
+527,14,1
+527,3,2
+528,14,1
+528,3,2
+529,5,1
+530,5,1
+530,9,2
+531,1,1
+532,2,1
+533,2,1
+534,2,1
+535,11,1
+536,11,1
+536,5,2
+537,11,1
+537,5,2
+538,2,1
+539,2,1
+540,7,1
+540,12,2
+541,7,1
+541,12,2
+542,7,1
+542,12,2
+543,7,1
+543,4,2
+544,7,1
+544,4,2
+545,7,1
+545,4,2
+546,12,1
+546,18,2
+547,12,1
+547,18,2
+548,12,1
+549,12,1
+550,11,1
+551,5,1
+551,17,2
+552,5,1
+552,17,2
+553,5,1
+553,17,2
+554,10,1
+555,10,1
+556,12,1
+557,7,1
+557,6,2
+558,7,1
+558,6,2
+559,17,1
+559,2,2
+560,17,1
+560,2,2
+561,14,1
+561,3,2
+562,8,1
+563,8,1
+564,11,1
+564,6,2
+565,11,1
+565,6,2
+566,6,1
+566,3,2
+567,6,1
+567,3,2
+568,4,1
+569,4,1
+570,17,1
+571,17,1
+572,1,1
+573,1,1
+574,14,1
+575,14,1
+576,14,1
+577,14,1
+578,14,1
+579,14,1
+580,11,1
+580,3,2
+581,11,1
+581,3,2
+582,15,1
+583,15,1
+584,15,1
+585,1,1
+585,12,2
+586,1,1
+586,12,2
+587,13,1
+587,3,2
+588,7,1
+589,7,1
+589,9,2
+590,12,1
+590,4,2
+591,12,1
+591,4,2
+592,11,1
+592,8,2
+593,11,1
+593,8,2
+594,11,1
+595,7,1
+595,13,2
+596,7,1
+596,13,2
+597,12,1
+597,9,2
+598,12,1
+598,9,2
+599,9,1
+600,9,1
+601,9,1
+602,13,1
+603,13,1
+604,13,1
+605,14,1
+606,14,1
+607,8,1
+607,10,2
+608,8,1
+608,10,2
+609,8,1
+609,10,2
+610,16,1
+611,16,1
+612,16,1
+613,15,1
+614,15,1
+615,15,1
+616,7,1
+617,7,1
+618,5,1
+618,13,2
+619,2,1
+620,2,1
+621,16,1
+622,5,1
+622,8,2
+623,5,1
+623,8,2
+624,17,1
+624,9,2
+625,17,1
+625,9,2
+626,1,1
+627,1,1
+627,3,2
+628,1,1
+628,3,2
+629,17,1
+629,3,2
+630,17,1
+630,3,2
+631,10,1
+632,7,1
+632,9,2
+633,17,1
+633,16,2
+634,17,1
+634,16,2
+635,17,1
+635,16,2
+636,7,1
+636,10,2
+637,7,1
+637,10,2
+638,9,1
+638,2,2
+639,6,1
+639,2,2
+640,12,1
+640,2,2
+641,3,1
+642,13,1
+642,3,2
+643,16,1
+643,10,2
+644,16,1
+644,13,2
+645,5,1
+645,3,2
+646,16,1
+646,15,2
+647,11,1
+647,2,2
+648,1,1
+648,14,2
+649,7,1
+649,9,2
+650,12,1
+651,12,1
+652,12,1
+652,2,2
+653,10,1
+654,10,1
+655,10,1
+655,14,2
+656,11,1
+657,11,1
+658,11,1
+658,17,2
+659,1,1
+660,1,1
+660,5,2
+661,1,1
+661,3,2
+662,10,1
+662,3,2
+663,10,1
+663,3,2
+664,7,1
+665,7,1
+666,7,1
+666,3,2
+667,10,1
+667,1,2
+668,10,1
+668,1,2
+669,18,1
+670,18,1
+671,18,1
+672,12,1
+673,12,1
+674,2,1
+675,2,1
+675,17,2
+676,1,1
+677,14,1
+678,14,1
+679,9,1
+679,8,2
+680,9,1
+680,8,2
+681,9,1
+681,8,2
+682,18,1
+683,18,1
+684,18,1
+685,18,1
+686,17,1
+686,14,2
+687,17,1
+687,14,2
+688,6,1
+688,11,2
+689,6,1
+689,11,2
+690,4,1
+690,11,2
+691,4,1
+691,16,2
+692,11,1
+693,11,1
+694,13,1
+694,1,2
+695,13,1
+695,1,2
+696,6,1
+696,16,2
+697,6,1
+697,16,2
+698,6,1
+698,15,2
+699,6,1
+699,15,2
+700,18,1
+701,2,1
+701,3,2
+702,13,1
+702,18,2
+703,6,1
+703,18,2
+704,16,1
+705,16,1
+706,16,1
+707,9,1
+707,18,2
+708,8,1
+708,12,2
+709,8,1
+709,12,2
+710,8,1
+710,12,2
+711,8,1
+711,12,2
+712,15,1
+713,15,1
+714,3,1
+714,16,2
+715,3,1
+715,16,2
+716,18,1
+717,17,1
+717,3,2
+718,16,1
+718,5,2
+719,6,1
+719,18,2
+720,14,1
+720,8,2
+721,10,1
+721,11,2
+722,12,1
+722,3,2
+723,12,1
+723,3,2
+724,12,1
+724,8,2
+725,10,1
+726,10,1
+727,10,1
+727,17,2
+728,11,1
+729,11,1
+730,11,1
+730,18,2
+731,1,1
+731,3,2
+732,1,1
+732,3,2
+733,1,1
+733,3,2
+734,1,1
+735,1,1
+736,7,1
+737,7,1
+737,13,2
+738,7,1
+738,13,2
+739,2,1
+740,2,1
+740,15,2
+741,10,1
+741,3,2
+742,7,1
+742,18,2
+743,7,1
+743,18,2
+744,6,1
+745,6,1
+746,11,1
+747,4,1
+747,11,2
+748,4,1
+748,11,2
+749,5,1
+750,5,1
+751,11,1
+751,7,2
+752,11,1
+752,7,2
+753,12,1
+754,12,1
+755,12,1
+755,18,2
+756,12,1
+756,18,2
+757,4,1
+757,10,2
+758,4,1
+758,10,2
+759,1,1
+759,2,2
+760,1,1
+760,2,2
+761,12,1
+762,12,1
+763,12,1
+764,18,1
+765,1,1
+765,14,2
+766,2,1
+767,7,1
+767,11,2
+768,7,1
+768,11,2
+769,8,1
+769,5,2
+770,8,1
+770,5,2
+771,11,1
+772,1,1
+773,1,1
+774,6,1
+774,3,2
+775,1,1
+776,10,1
+776,16,2
+777,13,1
+777,9,2
+778,8,1
+778,18,2
+779,11,1
+779,14,2
+780,1,1
+780,16,2
+781,8,1
+781,12,2
+782,16,1
+783,16,1
+783,2,2
+784,16,1
+784,2,2
+785,13,1
+785,18,2
+786,14,1
+786,18,2
+787,12,1
+787,18,2
+788,11,1
+788,18,2
+789,14,1
+790,14,1
+791,14,1
+791,9,2
+792,14,1
+792,8,2
+793,6,1
+793,4,2
+794,7,1
+794,2,2
+795,7,1
+795,2,2
+796,13,1
+797,9,1
+797,3,2
+798,12,1
+798,9,2
+799,17,1
+799,16,2
+800,14,1
+801,9,1
+801,18,2
+802,2,1
+802,8,2
+803,4,1
+804,4,1
+804,16,2
+805,6,1
+805,9,2
+806,10,1
+806,8,2
+807,13,1
+808,9,1
+809,9,1
+810,12,1
+811,12,1
+812,12,1
+813,10,1
+814,10,1
+815,10,1
+816,11,1
+817,11,1
+818,11,1
+819,1,1
+820,1,1
+821,3,1
+822,3,1
+823,3,1
+823,9,2
+824,7,1
+825,7,1
+825,14,2
+826,7,1
+826,14,2
+827,17,1
+828,17,1
+829,12,1
+830,12,1
+831,1,1
+832,1,1
+833,11,1
+834,11,1
+834,6,2
+835,13,1
+836,13,1
+837,6,1
+838,6,1
+838,10,2
+839,6,1
+839,10,2
+840,12,1
+840,16,2
+841,12,1
+841,16,2
+842,12,1
+842,16,2
+843,5,1
+844,5,1
+845,3,1
+845,11,2
+846,11,1
+847,11,1
+848,13,1
+848,4,2
+849,13,1
+849,4,2
+850,10,1
+850,7,2
+851,10,1
+851,7,2
+852,2,1
+853,2,1
+854,8,1
+855,8,1
+856,14,1
+857,14,1
+858,14,1
+858,18,2
+859,17,1
+859,18,2
+860,17,1
+860,18,2
+861,17,1
+861,18,2
+862,17,1
+862,1,2
+863,9,1
+864,8,1
+865,2,1
+866,15,1
+866,14,2
+867,5,1
+867,8,2
+868,18,1
+869,18,1
+870,2,1
+871,13,1
+872,15,1
+872,7,2
+873,15,1
+873,7,2
+874,6,1
+875,15,1
+876,14,1
+876,1,2
+877,13,1
+877,17,2
+878,9,1
+879,9,1
+880,13,1
+880,16,2
+881,13,1
+881,15,2
+882,11,1
+882,16,2
+883,11,1
+883,15,2
+884,9,1
+884,16,2
+885,16,1
+885,8,2
+886,16,1
+886,8,2
+887,16,1
+887,8,2
+888,18,1
+889,2,1
+890,4,1
+890,16,2
+891,2,1
+892,2,1
+892,17,2
+893,17,1
+893,12,2
+894,13,1
+895,16,1
+896,15,1
+897,8,1
+898,14,1
+898,12,2
+10001,14,1
+10002,14,1
+10003,14,1
+10004,7,1
+10004,5,2
+10005,7,1
+10005,9,2
+10006,12,1
+10006,3,2
+10007,8,1
+10007,16,2
+10008,13,1
+10008,10,2
+10009,13,1
+10009,11,2
+10010,13,1
+10010,15,2
+10011,13,1
+10011,3,2
+10012,13,1
+10012,12,2
+10013,10,1
+10014,11,1
+10015,15,1
+10016,11,1
+10017,10,1
+10017,14,2
+10018,1,1
+10018,2,2
+10019,3,1
+10020,13,1
+10020,3,2
+10021,5,1
+10021,3,2
+10022,16,1
+10022,15,2
+10023,16,1
+10023,15,2
+10024,11,1
+10024,2,2
+10025,14,1
+10026,9,1
+10026,8,2
+10027,8,1
+10027,12,2
+10028,8,1
+10028,12,2
+10029,8,1
+10029,12,2
+10030,8,1
+10030,12,2
+10031,8,1
+10031,12,2
+10032,8,1
+10032,12,2
+10033,12,1
+10033,4,2
+10034,10,1
+10034,16,2
+10035,10,1
+10035,3,2
+10036,11,1
+10037,14,1
+10038,8,1
+10038,4,2
+10039,1,1
+10040,7,1
+10040,3,2
+10041,11,1
+10041,17,2
+10042,6,1
+10042,3,2
+10043,14,1
+10043,2,2
+10044,14,1
+10045,13,1
+10045,16,2
+10046,7,1
+10046,9,2
+10047,7,1
+10047,2,2
+10048,17,1
+10048,10,2
+10049,6,1
+10049,17,2
+10050,10,1
+10050,2,2
+10051,14,1
+10051,18,2
+10052,9,1
+10052,18,2
+10053,9,1
+10054,2,1
+10054,14,2
+10055,13,1
+10056,8,1
+10057,17,1
+10058,16,1
+10058,5,2
+10059,2,1
+10059,9,2
+10060,12,1
+10060,15,2
+10061,18,1
+10062,16,1
+10062,14,2
+10063,16,1
+10063,14,2
+10064,11,1
+10064,5,2
+10065,12,1
+10065,16,2
+10066,17,1
+10066,8,2
+10067,16,1
+10067,18,2
+10068,14,1
+10068,2,2
+10069,1,1
+10069,18,2
+10070,11,1
+10070,17,2
+10071,11,1
+10071,14,2
+10072,9,1
+10072,5,2
+10073,1,1
+10073,3,2
+10074,15,1
+10075,6,1
+10075,18,2
+10076,9,1
+10076,14,2
+10077,11,1
+10078,5,1
+10078,10,2
+10079,16,1
+10079,3,2
+10080,13,1
+10081,13,1
+10082,13,1
+10083,13,1
+10084,13,1
+10085,13,1
+10086,14,1
+10086,17,2
+10087,10,1
+10087,5,2
+10088,1,1
+10088,2,2
+10089,16,1
+10089,3,2
+10090,7,1
+10090,4,2
+10091,17,1
+10091,1,2
+10092,17,1
+10092,1,2
+10093,17,1
+10093,1,2
+10094,13,1
+10095,13,1
+10096,13,1
+10097,13,1
+10098,13,1
+10099,13,1
+10100,13,1
+10100,14,2
+10101,15,1
+10101,9,2
+10102,15,1
+10102,9,2
+10103,15,1
+10104,15,1
+10104,18,2
+10105,5,1
+10105,9,2
+10106,5,1
+10106,9,2
+10107,17,1
+10108,17,1
+10109,6,1
+10109,13,2
+10110,6,1
+10110,13,2
+10111,6,1
+10111,13,2
+10112,4,1
+10112,17,2
+10113,4,1
+10113,17,2
+10114,12,1
+10114,16,2
+10115,10,1
+10115,8,2
+10116,11,1
+10116,17,2
+10117,11,1
+10117,17,2
+10118,16,1
+10118,5,2
+10119,16,1
+10119,5,2
+10120,16,1
+10120,5,2
+10121,1,1
+10122,7,1
+10122,13,2
+10123,13,1
+10123,3,2
+10124,14,1
+10124,3,2
+10125,8,1
+10125,3,2
+10126,6,1
+10127,11,1
+10128,12,1
+10129,4,1
+10129,10,2
+10130,6,1
+10130,3,2
+10131,6,1
+10131,3,2
+10132,6,1
+10132,3,2
+10133,6,1
+10133,3,2
+10134,6,1
+10134,3,2
+10135,6,1
+10135,3,2
+10136,6,1
+10136,3,2
+10137,6,1
+10137,3,2
+10138,6,1
+10138,3,2
+10139,6,1
+10139,3,2
+10140,6,1
+10140,3,2
+10141,6,1
+10141,3,2
+10142,6,1
+10142,3,2
+10143,8,1
+10143,18,2
+10144,8,1
+10144,18,2
+10145,8,1
+10145,18,2
+10146,16,1
+10146,2,2
+10147,9,1
+10147,18,2
+10148,13,1
+10149,10,1
+10149,8,2
+10150,7,1
+10150,18,2
+10151,6,1
+10152,6,1
+10153,11,1
+10153,7,2
+10154,13,1
+10154,9,2
+10155,14,1
+10155,9,2
+10156,14,1
+10156,8,2
+10157,14,1
+10157,16,2
+10158,13,1
+10159,1,1
+10160,13,1
+10161,9,1
+10162,14,1
+10163,14,1
+10163,18,2
+10164,14,1
+10165,4,1
+10165,14,2
+10166,2,1
+10167,4,1
+10167,18,2
+10168,15,1
+10168,14,2
+10169,14,1
+10169,3,2
+10170,2,1
+10170,3,2
+10171,17,1
+10171,3,2
+10172,4,1
+10172,14,2
+10173,8,1
+10174,17,1
+10174,1,2
+10175,17,1
+10175,1,2
+10176,15,1
+10177,15,1
+10178,15,1
+10178,10,2
+10179,5,1
+10179,8,2
+10180,5,1
+10180,9,2
+10181,16,1
+10181,5,2
+10182,3,1
+10182,11,2
+10183,3,1
+10183,11,2
+10184,13,1
+10184,4,2
+10185,15,1
+10186,14,1
+10186,1,2
+10187,13,1
+10187,17,2
+10188,18,1
+10188,9,2
+10189,2,1
+10189,9,2
+10190,4,1
+10190,16,2
+10191,2,1
+10191,11,2
+10192,17,1
+10192,12,2
+10193,14,1
+10193,15,2
+10194,14,1
+10194,8,2
diff --git a/src/main/resources/data/types.csv b/src/main/resources/data/types.csv
new file mode 100644
index 0000000..764011d
--- /dev/null
+++ b/src/main/resources/data/types.csv
@@ -0,0 +1,21 @@
+id,identifier,generation_id,damage_class_id
+1,normal,1,2
+2,fighting,1,2
+3,flying,1,2
+4,poison,1,2
+5,ground,1,2
+6,rock,1,2
+7,bug,1,2
+8,ghost,1,2
+9,steel,2,2
+10,fire,1,3
+11,water,1,3
+12,grass,1,3
+13,electric,1,3
+14,psychic,1,3
+15,ice,1,3
+16,dragon,1,3
+17,dark,2,3
+18,fairy,6,0
+10001,unknown,2,0
+10002,shadow,3,0
diff --git a/src/main/resources/static/assets-cypher-js.js b/src/main/resources/static/assets-cypher-js.js
new file mode 100644
index 0000000..264cbf4
--- /dev/null
+++ b/src/main/resources/static/assets-cypher-js.js
@@ -0,0 +1,67 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["assets-cypher-js"],{
+
+/***/ "cw3D":
+/*!******************************!*\
+ !*** ./src/assets/cypher.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Language: Cypher
+ * Contributors:
+ * Johannes Wienke
+ * Gustavo Reis
+ */
+module.exports = function (hljs)
+{
+ return {
+ case_insensitive: true,
+ keywords:
+ {
+ keyword: 'as asc ascending assert by call case commit constraint create csv cypher delete desc descending detach distinct drop else end ends explain fieldterminator foreach from headers in index is join limit load match merge on optional order periodic profile remove return scan set skip start starts then union unique unwind using when where with yield',
+ literal: 'true false null'
+ },
+ contains:
+ [
+ hljs.QUOTE_STRING_MODE,
+ hljs.APOS_STRING_MODE,
+ hljs.C_NUMBER_MODE,
+ {
+ className: 'string',
+ begin: '`',
+ end: '`',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ },
+ {
+ className: 'type',
+ begin: /((-|>)?\s?\(|-\[)\w*:/,
+ excludeBegin: true,
+ end: '\\W',
+ excludeEnd: true,
+ },
+ {
+ className: 'functionCall',
+ begin: /(\s+|,)\w+\(/,
+ end: /\)/,
+ keywords: {
+ built_in: 'all any exists none single coalesce endNode head id last length properties size startNode timestamp toBoolean toFloat toInteger type avg collect count max min percentileCont percentileDisc stDev stDevP sum extract filter keys labels nodes range reduce relationships reverse tail abs ceil floor rand round sign e exp log log10 sqrt acos asin atan atan2 cos cot degrees haversin pi radians sin tan left ltrim replace reverse right rtrim split substring toLower toString toUpper trim distance'
+ }
+ },
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ {
+ begin: '//',
+ ends: '//',
+ }
+ ]
+ }
+}
+
+
+
+/***/ })
+
+}]);
+//# sourceMappingURL=assets-cypher-js.js.map
\ No newline at end of file
diff --git a/src/main/resources/static/assets-cypher-js.js.map b/src/main/resources/static/assets-cypher-js.js.map
new file mode 100644
index 0000000..50ca471
--- /dev/null
+++ b/src/main/resources/static/assets-cypher-js.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["./src/assets/cypher.js"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"assets-cypher-js.js","sourcesContent":["/**\n * Language: Cypher\n * Contributors:\n * Johannes Wienke \n * Gustavo Reis \n */\nmodule.exports = function (hljs)\n{\n return {\n case_insensitive: true,\n keywords:\n {\n keyword: 'as asc ascending assert by call case commit constraint create csv cypher delete desc descending detach distinct drop else end ends explain fieldterminator foreach from headers in index is join limit load match merge on optional order periodic profile remove return scan set skip start starts then union unique unwind using when where with yield',\n literal: 'true false null'\n },\n contains:\n [\n hljs.QUOTE_STRING_MODE,\n hljs.APOS_STRING_MODE,\n hljs.C_NUMBER_MODE,\n {\n className: 'string',\n begin: '`',\n end: '`',\n illegal: '\\\\n',\n contains: [hljs.BACKSLASH_ESCAPE]\n },\n {\n className: 'type',\n begin: /((-|>)?\\s?\\(|-\\[)\\w*:/,\n excludeBegin: true,\n end: '\\\\W',\n excludeEnd: true,\n },\n {\n className: 'functionCall',\n begin: /(\\s+|,)\\w+\\(/,\n end: /\\)/,\n keywords: {\n built_in: 'all any exists none single coalesce endNode head id last length properties size startNode timestamp toBoolean toFloat toInteger type avg collect count max min percentileCont percentileDisc stDev stDevP sum extract filter keys labels nodes range reduce relationships reverse tail abs ceil floor rand round sign e exp log log10 sqrt acos asin atan atan2 cos cot degrees haversin pi radians sin tan left ltrim replace reverse right rtrim split substring toLower toString toUpper trim distance'\n }\n },\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE,\n {\n begin: '//',\n ends: '//',\n }\n ]\n }\n}\n\n"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/assets/cypher.js b/src/main/resources/static/assets/cypher.js
new file mode 100644
index 0000000..b549fdb
--- /dev/null
+++ b/src/main/resources/static/assets/cypher.js
@@ -0,0 +1,52 @@
+/**
+ * Language: Cypher
+ * Contributors:
+ * Johannes Wienke
+ * Gustavo Reis
+ */
+module.exports = function (hljs)
+{
+ return {
+ case_insensitive: true,
+ keywords:
+ {
+ keyword: 'as asc ascending assert by call case commit constraint create csv cypher delete desc descending detach distinct drop else end ends explain fieldterminator foreach from headers in index is join limit load match merge on optional order periodic profile remove return scan set skip start starts then union unique unwind using when where with yield',
+ literal: 'true false null'
+ },
+ contains:
+ [
+ hljs.QUOTE_STRING_MODE,
+ hljs.APOS_STRING_MODE,
+ hljs.C_NUMBER_MODE,
+ {
+ className: 'string',
+ begin: '`',
+ end: '`',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ },
+ {
+ className: 'type',
+ begin: /((-|>)?\s?\(|-\[)\w*:/,
+ excludeBegin: true,
+ end: '\\W',
+ excludeEnd: true,
+ },
+ {
+ className: 'functionCall',
+ begin: /(\s+|,)\w+\(/,
+ end: /\)/,
+ keywords: {
+ built_in: 'all any exists none single coalesce endNode head id last length properties size startNode timestamp toBoolean toFloat toInteger type avg collect count max min percentileCont percentileDisc stDev stDevP sum extract filter keys labels nodes range reduce relationships reverse tail abs ceil floor rand round sign e exp log log10 sqrt acos asin atan atan2 cos cot degrees haversin pi radians sin tan left ltrim replace reverse right rtrim split substring toLower toString toUpper trim distance'
+ }
+ },
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ {
+ begin: '//',
+ ends: '//',
+ }
+ ]
+ }
+}
+
diff --git a/src/main/resources/static/assets/dracula.css b/src/main/resources/static/assets/dracula.css
new file mode 100644
index 0000000..d591db6
--- /dev/null
+++ b/src/main/resources/static/assets/dracula.css
@@ -0,0 +1,76 @@
+/*
+
+Dracula Theme v1.2.0
+
+https://github.com/zenorocha/dracula-theme
+
+Copyright 2015, All rights reserved
+
+Code licensed under the MIT license
+http://zenorocha.mit-license.org
+
+@author Éverton Ribeiro
+@author Zeno Rocha
+
+*/
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282a36;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-section,
+.hljs-link {
+ color: #8be9fd;
+}
+
+.hljs-function .hljs-keyword {
+ color: #ff79c6;
+}
+
+.hljs,
+.hljs-subst {
+ color: #f8f8f2;
+}
+
+.hljs-string,
+.hljs-title,
+.hljs-name,
+.hljs-type,
+.hljs-attribute,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-variable,
+.hljs-template-tag,
+.hljs-template-variable {
+ color: #f1fa8c;
+}
+
+.hljs-comment,
+.hljs-quote,
+.hljs-deletion,
+.hljs-meta {
+ color: #6272a4;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-type,
+.hljs-name,
+.hljs-strong {
+ font-weight: bold;
+}
+
+.hljs-emphasis {
+ font-style: italic;
+}
diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico
new file mode 100644
index 0000000..997406a
Binary files /dev/null and b/src/main/resources/static/favicon.ico differ
diff --git a/src/main/resources/static/highlight-js-lib-core.js b/src/main/resources/static/highlight-js-lib-core.js
new file mode 100644
index 0000000..df235d7
--- /dev/null
+++ b/src/main/resources/static/highlight-js-lib-core.js
@@ -0,0 +1,2532 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["highlight-js-lib-core"],{
+
+/***/ "ECCn":
+/*!***********************************************!*\
+ !*** ./node_modules/highlight.js/lib/core.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function deepFreeze(obj) {
+ if (obj instanceof Map) {
+ obj.clear = obj.delete = obj.set = function () {
+ throw new Error('map is read-only');
+ };
+ } else if (obj instanceof Set) {
+ obj.add = obj.clear = obj.delete = function () {
+ throw new Error('set is read-only');
+ };
+ }
+
+ // Freeze self
+ Object.freeze(obj);
+
+ Object.getOwnPropertyNames(obj).forEach(function (name) {
+ var prop = obj[name];
+
+ // Freeze prop if it is an object
+ if (typeof prop == 'object' && !Object.isFrozen(prop)) {
+ deepFreeze(prop);
+ }
+ });
+
+ return obj;
+}
+
+var deepFreezeEs6 = deepFreeze;
+var _default = deepFreeze;
+deepFreezeEs6.default = _default;
+
+/** @implements CallbackResponse */
+class Response {
+ /**
+ * @param {CompiledMode} mode
+ */
+ constructor(mode) {
+ // eslint-disable-next-line no-undefined
+ if (mode.data === undefined) mode.data = {};
+
+ this.data = mode.data;
+ this.isMatchIgnored = false;
+ }
+
+ ignoreMatch() {
+ this.isMatchIgnored = true;
+ }
+}
+
+/**
+ * @param {string} value
+ * @returns {string}
+ */
+function escapeHTML(value) {
+ return value
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+}
+
+/**
+ * performs a shallow merge of multiple objects into one
+ *
+ * @template T
+ * @param {T} original
+ * @param {Record[]} objects
+ * @returns {T} a single new object
+ */
+function inherit(original, ...objects) {
+ /** @type Record */
+ const result = Object.create(null);
+
+ for (const key in original) {
+ result[key] = original[key];
+ }
+ objects.forEach(function(obj) {
+ for (const key in obj) {
+ result[key] = obj[key];
+ }
+ });
+ return /** @type {T} */ (result);
+}
+
+/**
+ * @typedef {object} Renderer
+ * @property {(text: string) => void} addText
+ * @property {(node: Node) => void} openNode
+ * @property {(node: Node) => void} closeNode
+ * @property {() => string} value
+ */
+
+/** @typedef {{kind?: string, sublanguage?: boolean}} Node */
+/** @typedef {{walk: (r: Renderer) => void}} Tree */
+/** */
+
+const SPAN_CLOSE = '';
+
+/**
+ * Determines if a node needs to be wrapped in
+ *
+ * @param {Node} node */
+const emitsWrappingTags = (node) => {
+ return !!node.kind;
+};
+
+/** @type {Renderer} */
+class HTMLRenderer {
+ /**
+ * Creates a new HTMLRenderer
+ *
+ * @param {Tree} parseTree - the parse tree (must support `walk` API)
+ * @param {{classPrefix: string}} options
+ */
+ constructor(parseTree, options) {
+ this.buffer = "";
+ this.classPrefix = options.classPrefix;
+ parseTree.walk(this);
+ }
+
+ /**
+ * Adds texts to the output stream
+ *
+ * @param {string} text */
+ addText(text) {
+ this.buffer += escapeHTML(text);
+ }
+
+ /**
+ * Adds a node open to the output stream (if needed)
+ *
+ * @param {Node} node */
+ openNode(node) {
+ if (!emitsWrappingTags(node)) return;
+
+ let className = node.kind;
+ if (!node.sublanguage) {
+ className = `${this.classPrefix}${className}`;
+ }
+ this.span(className);
+ }
+
+ /**
+ * Adds a node close to the output stream (if needed)
+ *
+ * @param {Node} node */
+ closeNode(node) {
+ if (!emitsWrappingTags(node)) return;
+
+ this.buffer += SPAN_CLOSE;
+ }
+
+ /**
+ * returns the accumulated buffer
+ */
+ value() {
+ return this.buffer;
+ }
+
+ // helpers
+
+ /**
+ * Builds a span element
+ *
+ * @param {string} className */
+ span(className) {
+ this.buffer += ``;
+ }
+}
+
+/** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} | string} Node */
+/** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} } DataNode */
+/** */
+
+class TokenTree {
+ constructor() {
+ /** @type DataNode */
+ this.rootNode = { children: [] };
+ this.stack = [this.rootNode];
+ }
+
+ get top() {
+ return this.stack[this.stack.length - 1];
+ }
+
+ get root() { return this.rootNode; }
+
+ /** @param {Node} node */
+ add(node) {
+ this.top.children.push(node);
+ }
+
+ /** @param {string} kind */
+ openNode(kind) {
+ /** @type Node */
+ const node = { kind, children: [] };
+ this.add(node);
+ this.stack.push(node);
+ }
+
+ closeNode() {
+ if (this.stack.length > 1) {
+ return this.stack.pop();
+ }
+ // eslint-disable-next-line no-undefined
+ return undefined;
+ }
+
+ closeAllNodes() {
+ while (this.closeNode());
+ }
+
+ toJSON() {
+ return JSON.stringify(this.rootNode, null, 4);
+ }
+
+ /**
+ * @typedef { import("./html_renderer").Renderer } Renderer
+ * @param {Renderer} builder
+ */
+ walk(builder) {
+ // this does not
+ return this.constructor._walk(builder, this.rootNode);
+ // this works
+ // return TokenTree._walk(builder, this.rootNode);
+ }
+
+ /**
+ * @param {Renderer} builder
+ * @param {Node} node
+ */
+ static _walk(builder, node) {
+ if (typeof node === "string") {
+ builder.addText(node);
+ } else if (node.children) {
+ builder.openNode(node);
+ node.children.forEach((child) => this._walk(builder, child));
+ builder.closeNode(node);
+ }
+ return builder;
+ }
+
+ /**
+ * @param {Node} node
+ */
+ static _collapse(node) {
+ if (typeof node === "string") return;
+ if (!node.children) return;
+
+ if (node.children.every(el => typeof el === "string")) {
+ // node.text = node.children.join("");
+ // delete node.children;
+ node.children = [node.children.join("")];
+ } else {
+ node.children.forEach((child) => {
+ TokenTree._collapse(child);
+ });
+ }
+ }
+}
+
+/**
+ Currently this is all private API, but this is the minimal API necessary
+ that an Emitter must implement to fully support the parser.
+
+ Minimal interface:
+
+ - addKeyword(text, kind)
+ - addText(text)
+ - addSublanguage(emitter, subLanguageName)
+ - finalize()
+ - openNode(kind)
+ - closeNode()
+ - closeAllNodes()
+ - toHTML()
+
+*/
+
+/**
+ * @implements {Emitter}
+ */
+class TokenTreeEmitter extends TokenTree {
+ /**
+ * @param {*} options
+ */
+ constructor(options) {
+ super();
+ this.options = options;
+ }
+
+ /**
+ * @param {string} text
+ * @param {string} kind
+ */
+ addKeyword(text, kind) {
+ if (text === "") { return; }
+
+ this.openNode(kind);
+ this.addText(text);
+ this.closeNode();
+ }
+
+ /**
+ * @param {string} text
+ */
+ addText(text) {
+ if (text === "") { return; }
+
+ this.add(text);
+ }
+
+ /**
+ * @param {Emitter & {root: DataNode}} emitter
+ * @param {string} name
+ */
+ addSublanguage(emitter, name) {
+ /** @type DataNode */
+ const node = emitter.root;
+ node.kind = name;
+ node.sublanguage = true;
+ this.add(node);
+ }
+
+ toHTML() {
+ const renderer = new HTMLRenderer(this, this.options);
+ return renderer.value();
+ }
+
+ finalize() {
+ return true;
+ }
+}
+
+/**
+ * @param {string} value
+ * @returns {RegExp}
+ * */
+function escape(value) {
+ return new RegExp(value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'm');
+}
+
+/**
+ * @param {RegExp | string } re
+ * @returns {string}
+ */
+function source(re) {
+ if (!re) return null;
+ if (typeof re === "string") return re;
+
+ return re.source;
+}
+
+/**
+ * @param {...(RegExp | string) } args
+ * @returns {string}
+ */
+function concat(...args) {
+ const joined = args.map((x) => source(x)).join("");
+ return joined;
+}
+
+/**
+ * Any of the passed expresssions may match
+ *
+ * Creates a huge this | this | that | that match
+ * @param {(RegExp | string)[] } args
+ * @returns {string}
+ */
+function either(...args) {
+ const joined = '(' + args.map((x) => source(x)).join("|") + ")";
+ return joined;
+}
+
+/**
+ * @param {RegExp} re
+ * @returns {number}
+ */
+function countMatchGroups(re) {
+ return (new RegExp(re.toString() + '|')).exec('').length - 1;
+}
+
+/**
+ * Does lexeme start with a regular expression match at the beginning
+ * @param {RegExp} re
+ * @param {string} lexeme
+ */
+function startsWith(re, lexeme) {
+ const match = re && re.exec(lexeme);
+ return match && match.index === 0;
+}
+
+// BACKREF_RE matches an open parenthesis or backreference. To avoid
+// an incorrect parse, it additionally matches the following:
+// - [...] elements, where the meaning of parentheses and escapes change
+// - other escape sequences, so we do not misparse escape sequences as
+// interesting elements
+// - non-matching or lookahead parentheses, which do not capture. These
+// follow the '(' with a '?'.
+const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
+
+// join logically computes regexps.join(separator), but fixes the
+// backreferences so they continue to match.
+// it also places each individual regular expression into it's own
+// match group, keeping track of the sequencing of those match groups
+// is currently an exercise for the caller. :-)
+/**
+ * @param {(string | RegExp)[]} regexps
+ * @param {string} separator
+ * @returns {string}
+ */
+function join(regexps, separator = "|") {
+ let numCaptures = 0;
+
+ return regexps.map((regex) => {
+ numCaptures += 1;
+ const offset = numCaptures;
+ let re = source(regex);
+ let out = '';
+
+ while (re.length > 0) {
+ const match = BACKREF_RE.exec(re);
+ if (!match) {
+ out += re;
+ break;
+ }
+ out += re.substring(0, match.index);
+ re = re.substring(match.index + match[0].length);
+ if (match[0][0] === '\\' && match[1]) {
+ // Adjust the backreference.
+ out += '\\' + String(Number(match[1]) + offset);
+ } else {
+ out += match[0];
+ if (match[0] === '(') {
+ numCaptures++;
+ }
+ }
+ }
+ return out;
+ }).map(re => `(${re})`).join(separator);
+}
+
+// Common regexps
+const MATCH_NOTHING_RE = /\b\B/;
+const IDENT_RE = '[a-zA-Z]\\w*';
+const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
+const NUMBER_RE = '\\b\\d+(\\.\\d+)?';
+const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
+const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
+const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
+
+/**
+* @param { Partial & {binary?: string | RegExp} } opts
+*/
+const SHEBANG = (opts = {}) => {
+ const beginShebang = /^#![ ]*\//;
+ if (opts.binary) {
+ opts.begin = concat(
+ beginShebang,
+ /.*\b/,
+ opts.binary,
+ /\b.*/);
+ }
+ return inherit({
+ className: 'meta',
+ begin: beginShebang,
+ end: /$/,
+ relevance: 0,
+ /** @type {ModeCallback} */
+ "on:begin": (m, resp) => {
+ if (m.index !== 0) resp.ignoreMatch();
+ }
+ }, opts);
+};
+
+// Common modes
+const BACKSLASH_ESCAPE = {
+ begin: '\\\\[\\s\\S]', relevance: 0
+};
+const APOS_STRING_MODE = {
+ className: 'string',
+ begin: '\'',
+ end: '\'',
+ illegal: '\\n',
+ contains: [BACKSLASH_ESCAPE]
+};
+const QUOTE_STRING_MODE = {
+ className: 'string',
+ begin: '"',
+ end: '"',
+ illegal: '\\n',
+ contains: [BACKSLASH_ESCAPE]
+};
+const PHRASAL_WORDS_MODE = {
+ begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
+};
+/**
+ * Creates a comment mode
+ *
+ * @param {string | RegExp} begin
+ * @param {string | RegExp} end
+ * @param {Mode | {}} [modeOptions]
+ * @returns {Partial}
+ */
+const COMMENT = function(begin, end, modeOptions = {}) {
+ const mode = inherit(
+ {
+ className: 'comment',
+ begin,
+ end,
+ contains: []
+ },
+ modeOptions
+ );
+ mode.contains.push(PHRASAL_WORDS_MODE);
+ mode.contains.push({
+ className: 'doctag',
+ begin: '(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):',
+ relevance: 0
+ });
+ return mode;
+};
+const C_LINE_COMMENT_MODE = COMMENT('//', '$');
+const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/');
+const HASH_COMMENT_MODE = COMMENT('#', '$');
+const NUMBER_MODE = {
+ className: 'number',
+ begin: NUMBER_RE,
+ relevance: 0
+};
+const C_NUMBER_MODE = {
+ className: 'number',
+ begin: C_NUMBER_RE,
+ relevance: 0
+};
+const BINARY_NUMBER_MODE = {
+ className: 'number',
+ begin: BINARY_NUMBER_RE,
+ relevance: 0
+};
+const CSS_NUMBER_MODE = {
+ className: 'number',
+ begin: NUMBER_RE + '(' +
+ '%|em|ex|ch|rem' +
+ '|vw|vh|vmin|vmax' +
+ '|cm|mm|in|pt|pc|px' +
+ '|deg|grad|rad|turn' +
+ '|s|ms' +
+ '|Hz|kHz' +
+ '|dpi|dpcm|dppx' +
+ ')?',
+ relevance: 0
+};
+const REGEXP_MODE = {
+ // this outer rule makes sure we actually have a WHOLE regex and not simply
+ // an expression such as:
+ //
+ // 3 / something
+ //
+ // (which will then blow up when regex's `illegal` sees the newline)
+ begin: /(?=\/[^/\n]*\/)/,
+ contains: [{
+ className: 'regexp',
+ begin: /\//,
+ end: /\/[gimuy]*/,
+ illegal: /\n/,
+ contains: [
+ BACKSLASH_ESCAPE,
+ {
+ begin: /\[/,
+ end: /\]/,
+ relevance: 0,
+ contains: [BACKSLASH_ESCAPE]
+ }
+ ]
+ }]
+};
+const TITLE_MODE = {
+ className: 'title',
+ begin: IDENT_RE,
+ relevance: 0
+};
+const UNDERSCORE_TITLE_MODE = {
+ className: 'title',
+ begin: UNDERSCORE_IDENT_RE,
+ relevance: 0
+};
+const METHOD_GUARD = {
+ // excludes method names from keyword processing
+ begin: '\\.\\s*' + UNDERSCORE_IDENT_RE,
+ relevance: 0
+};
+
+/**
+ * Adds end same as begin mechanics to a mode
+ *
+ * Your mode must include at least a single () match group as that first match
+ * group is what is used for comparison
+ * @param {Partial} mode
+ */
+const END_SAME_AS_BEGIN = function(mode) {
+ return Object.assign(mode,
+ {
+ /** @type {ModeCallback} */
+ 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },
+ /** @type {ModeCallback} */
+ 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }
+ });
+};
+
+var MODES = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ MATCH_NOTHING_RE: MATCH_NOTHING_RE,
+ IDENT_RE: IDENT_RE,
+ UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,
+ NUMBER_RE: NUMBER_RE,
+ C_NUMBER_RE: C_NUMBER_RE,
+ BINARY_NUMBER_RE: BINARY_NUMBER_RE,
+ RE_STARTERS_RE: RE_STARTERS_RE,
+ SHEBANG: SHEBANG,
+ BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,
+ APOS_STRING_MODE: APOS_STRING_MODE,
+ QUOTE_STRING_MODE: QUOTE_STRING_MODE,
+ PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,
+ COMMENT: COMMENT,
+ C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,
+ C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,
+ HASH_COMMENT_MODE: HASH_COMMENT_MODE,
+ NUMBER_MODE: NUMBER_MODE,
+ C_NUMBER_MODE: C_NUMBER_MODE,
+ BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,
+ CSS_NUMBER_MODE: CSS_NUMBER_MODE,
+ REGEXP_MODE: REGEXP_MODE,
+ TITLE_MODE: TITLE_MODE,
+ UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE,
+ METHOD_GUARD: METHOD_GUARD,
+ END_SAME_AS_BEGIN: END_SAME_AS_BEGIN
+});
+
+// Grammar extensions / plugins
+// See: https://github.com/highlightjs/highlight.js/issues/2833
+
+// Grammar extensions allow "syntactic sugar" to be added to the grammar modes
+// without requiring any underlying changes to the compiler internals.
+
+// `compileMatch` being the perfect small example of now allowing a grammar
+// author to write `match` when they desire to match a single expression rather
+// than being forced to use `begin`. The extension then just moves `match` into
+// `begin` when it runs. Ie, no features have been added, but we've just made
+// the experience of writing (and reading grammars) a little bit nicer.
+
+// ------
+
+// TODO: We need negative look-behind support to do this properly
+/**
+ * Skip a match if it has a preceding dot
+ *
+ * This is used for `beginKeywords` to prevent matching expressions such as
+ * `bob.keyword.do()`. The mode compiler automatically wires this up as a
+ * special _internal_ 'on:begin' callback for modes with `beginKeywords`
+ * @param {RegExpMatchArray} match
+ * @param {CallbackResponse} response
+ */
+function skipIfhasPrecedingDot(match, response) {
+ const before = match.input[match.index - 1];
+ if (before === ".") {
+ response.ignoreMatch();
+ }
+}
+
+
+/**
+ * `beginKeywords` syntactic sugar
+ * @type {CompilerExt}
+ */
+function beginKeywords(mode, parent) {
+ if (!parent) return;
+ if (!mode.beginKeywords) return;
+
+ // for languages with keywords that include non-word characters checking for
+ // a word boundary is not sufficient, so instead we check for a word boundary
+ // or whitespace - this does no harm in any case since our keyword engine
+ // doesn't allow spaces in keywords anyways and we still check for the boundary
+ // first
+ mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)';
+ mode.__beforeBegin = skipIfhasPrecedingDot;
+ mode.keywords = mode.keywords || mode.beginKeywords;
+ delete mode.beginKeywords;
+
+ // prevents double relevance, the keywords themselves provide
+ // relevance, the mode doesn't need to double it
+ // eslint-disable-next-line no-undefined
+ if (mode.relevance === undefined) mode.relevance = 0;
+}
+
+/**
+ * Allow `illegal` to contain an array of illegal values
+ * @type {CompilerExt}
+ */
+function compileIllegal(mode, _parent) {
+ if (!Array.isArray(mode.illegal)) return;
+
+ mode.illegal = either(...mode.illegal);
+}
+
+/**
+ * `match` to match a single expression for readability
+ * @type {CompilerExt}
+ */
+function compileMatch(mode, _parent) {
+ if (!mode.match) return;
+ if (mode.begin || mode.end) throw new Error("begin & end are not supported with match");
+
+ mode.begin = mode.match;
+ delete mode.match;
+}
+
+/**
+ * provides the default 1 relevance to all modes
+ * @type {CompilerExt}
+ */
+function compileRelevance(mode, _parent) {
+ // eslint-disable-next-line no-undefined
+ if (mode.relevance === undefined) mode.relevance = 1;
+}
+
+// keywords that should have no default relevance value
+const COMMON_KEYWORDS = [
+ 'of',
+ 'and',
+ 'for',
+ 'in',
+ 'not',
+ 'or',
+ 'if',
+ 'then',
+ 'parent', // common variable name
+ 'list', // common variable name
+ 'value' // common variable name
+];
+
+const DEFAULT_KEYWORD_CLASSNAME = "keyword";
+
+/**
+ * Given raw keywords from a language definition, compile them.
+ *
+ * @param {string | Record | Array} rawKeywords
+ * @param {boolean} caseInsensitive
+ */
+function compileKeywords(rawKeywords, caseInsensitive, className = DEFAULT_KEYWORD_CLASSNAME) {
+ /** @type KeywordDict */
+ const compiledKeywords = {};
+
+ // input can be a string of keywords, an array of keywords, or a object with
+ // named keys representing className (which can then point to a string or array)
+ if (typeof rawKeywords === 'string') {
+ compileList(className, rawKeywords.split(" "));
+ } else if (Array.isArray(rawKeywords)) {
+ compileList(className, rawKeywords);
+ } else {
+ Object.keys(rawKeywords).forEach(function(className) {
+ // collapse all our objects back into the parent object
+ Object.assign(
+ compiledKeywords,
+ compileKeywords(rawKeywords[className], caseInsensitive, className)
+ );
+ });
+ }
+ return compiledKeywords;
+
+ // ---
+
+ /**
+ * Compiles an individual list of keywords
+ *
+ * Ex: "for if when while|5"
+ *
+ * @param {string} className
+ * @param {Array} keywordList
+ */
+ function compileList(className, keywordList) {
+ if (caseInsensitive) {
+ keywordList = keywordList.map(x => x.toLowerCase());
+ }
+ keywordList.forEach(function(keyword) {
+ const pair = keyword.split('|');
+ compiledKeywords[pair[0]] = [className, scoreForKeyword(pair[0], pair[1])];
+ });
+ }
+}
+
+/**
+ * Returns the proper score for a given keyword
+ *
+ * Also takes into account comment keywords, which will be scored 0 UNLESS
+ * another score has been manually assigned.
+ * @param {string} keyword
+ * @param {string} [providedScore]
+ */
+function scoreForKeyword(keyword, providedScore) {
+ // manual scores always win over common keywords
+ // so you can force a score of 1 if you really insist
+ if (providedScore) {
+ return Number(providedScore);
+ }
+
+ return commonKeyword(keyword) ? 0 : 1;
+}
+
+/**
+ * Determines if a given keyword is common or not
+ *
+ * @param {string} keyword */
+function commonKeyword(keyword) {
+ return COMMON_KEYWORDS.includes(keyword.toLowerCase());
+}
+
+// compilation
+
+/**
+ * Compiles a language definition result
+ *
+ * Given the raw result of a language definition (Language), compiles this so
+ * that it is ready for highlighting code.
+ * @param {Language} language
+ * @param {{plugins: HLJSPlugin[]}} opts
+ * @returns {CompiledLanguage}
+ */
+function compileLanguage(language, { plugins }) {
+ /**
+ * Builds a regex with the case sensativility of the current language
+ *
+ * @param {RegExp | string} value
+ * @param {boolean} [global]
+ */
+ function langRe(value, global) {
+ return new RegExp(
+ source(value),
+ 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')
+ );
+ }
+
+ /**
+ Stores multiple regular expressions and allows you to quickly search for
+ them all in a string simultaneously - returning the first match. It does
+ this by creating a huge (a|b|c) regex - each individual item wrapped with ()
+ and joined by `|` - using match groups to track position. When a match is
+ found checking which position in the array has content allows us to figure
+ out which of the original regexes / match groups triggered the match.
+
+ The match object itself (the result of `Regex.exec`) is returned but also
+ enhanced by merging in any meta-data that was registered with the regex.
+ This is how we keep track of which mode matched, and what type of rule
+ (`illegal`, `begin`, end, etc).
+ */
+ class MultiRegex {
+ constructor() {
+ this.matchIndexes = {};
+ // @ts-ignore
+ this.regexes = [];
+ this.matchAt = 1;
+ this.position = 0;
+ }
+
+ // @ts-ignore
+ addRule(re, opts) {
+ opts.position = this.position++;
+ // @ts-ignore
+ this.matchIndexes[this.matchAt] = opts;
+ this.regexes.push([opts, re]);
+ this.matchAt += countMatchGroups(re) + 1;
+ }
+
+ compile() {
+ if (this.regexes.length === 0) {
+ // avoids the need to check length every time exec is called
+ // @ts-ignore
+ this.exec = () => null;
+ }
+ const terminators = this.regexes.map(el => el[1]);
+ this.matcherRe = langRe(join(terminators), true);
+ this.lastIndex = 0;
+ }
+
+ /** @param {string} s */
+ exec(s) {
+ this.matcherRe.lastIndex = this.lastIndex;
+ const match = this.matcherRe.exec(s);
+ if (!match) { return null; }
+
+ // eslint-disable-next-line no-undefined
+ const i = match.findIndex((el, i) => i > 0 && el !== undefined);
+ // @ts-ignore
+ const matchData = this.matchIndexes[i];
+ // trim off any earlier non-relevant match groups (ie, the other regex
+ // match groups that make up the multi-matcher)
+ match.splice(0, i);
+
+ return Object.assign(match, matchData);
+ }
+ }
+
+ /*
+ Created to solve the key deficiently with MultiRegex - there is no way to
+ test for multiple matches at a single location. Why would we need to do
+ that? In the future a more dynamic engine will allow certain matches to be
+ ignored. An example: if we matched say the 3rd regex in a large group but
+ decided to ignore it - we'd need to started testing again at the 4th
+ regex... but MultiRegex itself gives us no real way to do that.
+
+ So what this class creates MultiRegexs on the fly for whatever search
+ position they are needed.
+
+ NOTE: These additional MultiRegex objects are created dynamically. For most
+ grammars most of the time we will never actually need anything more than the
+ first MultiRegex - so this shouldn't have too much overhead.
+
+ Say this is our search group, and we match regex3, but wish to ignore it.
+
+ regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0
+
+ What we need is a new MultiRegex that only includes the remaining
+ possibilities:
+
+ regex4 | regex5 ' ie, startAt = 3
+
+ This class wraps all that complexity up in a simple API... `startAt` decides
+ where in the array of expressions to start doing the matching. It
+ auto-increments, so if a match is found at position 2, then startAt will be
+ set to 3. If the end is reached startAt will return to 0.
+
+ MOST of the time the parser will be setting startAt manually to 0.
+ */
+ class ResumableMultiRegex {
+ constructor() {
+ // @ts-ignore
+ this.rules = [];
+ // @ts-ignore
+ this.multiRegexes = [];
+ this.count = 0;
+
+ this.lastIndex = 0;
+ this.regexIndex = 0;
+ }
+
+ // @ts-ignore
+ getMatcher(index) {
+ if (this.multiRegexes[index]) return this.multiRegexes[index];
+
+ const matcher = new MultiRegex();
+ this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));
+ matcher.compile();
+ this.multiRegexes[index] = matcher;
+ return matcher;
+ }
+
+ resumingScanAtSamePosition() {
+ return this.regexIndex !== 0;
+ }
+
+ considerAll() {
+ this.regexIndex = 0;
+ }
+
+ // @ts-ignore
+ addRule(re, opts) {
+ this.rules.push([re, opts]);
+ if (opts.type === "begin") this.count++;
+ }
+
+ /** @param {string} s */
+ exec(s) {
+ const m = this.getMatcher(this.regexIndex);
+ m.lastIndex = this.lastIndex;
+ let result = m.exec(s);
+
+ // The following is because we have no easy way to say "resume scanning at the
+ // existing position but also skip the current rule ONLY". What happens is
+ // all prior rules are also skipped which can result in matching the wrong
+ // thing. Example of matching "booger":
+
+ // our matcher is [string, "booger", number]
+ //
+ // ....booger....
+
+ // if "booger" is ignored then we'd really need a regex to scan from the
+ // SAME position for only: [string, number] but ignoring "booger" (if it
+ // was the first match), a simple resume would scan ahead who knows how
+ // far looking only for "number", ignoring potential string matches (or
+ // future "booger" matches that might be valid.)
+
+ // So what we do: We execute two matchers, one resuming at the same
+ // position, but the second full matcher starting at the position after:
+
+ // /--- resume first regex match here (for [number])
+ // |/---- full match here for [string, "booger", number]
+ // vv
+ // ....booger....
+
+ // Which ever results in a match first is then used. So this 3-4 step
+ // process essentially allows us to say "match at this position, excluding
+ // a prior rule that was ignored".
+ //
+ // 1. Match "booger" first, ignore. Also proves that [string] does non match.
+ // 2. Resume matching for [number]
+ // 3. Match at index + 1 for [string, "booger", number]
+ // 4. If #2 and #3 result in matches, which came first?
+ if (this.resumingScanAtSamePosition()) {
+ if (result && result.index === this.lastIndex) ; else { // use the second matcher result
+ const m2 = this.getMatcher(0);
+ m2.lastIndex = this.lastIndex + 1;
+ result = m2.exec(s);
+ }
+ }
+
+ if (result) {
+ this.regexIndex += result.position + 1;
+ if (this.regexIndex === this.count) {
+ // wrap-around to considering all matches again
+ this.considerAll();
+ }
+ }
+
+ return result;
+ }
+ }
+
+ /**
+ * Given a mode, builds a huge ResumableMultiRegex that can be used to walk
+ * the content and find matches.
+ *
+ * @param {CompiledMode} mode
+ * @returns {ResumableMultiRegex}
+ */
+ function buildModeRegex(mode) {
+ const mm = new ResumableMultiRegex();
+
+ mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" }));
+
+ if (mode.terminatorEnd) {
+ mm.addRule(mode.terminatorEnd, { type: "end" });
+ }
+ if (mode.illegal) {
+ mm.addRule(mode.illegal, { type: "illegal" });
+ }
+
+ return mm;
+ }
+
+ /** skip vs abort vs ignore
+ *
+ * @skip - The mode is still entered and exited normally (and contains rules apply),
+ * but all content is held and added to the parent buffer rather than being
+ * output when the mode ends. Mostly used with `sublanguage` to build up
+ * a single large buffer than can be parsed by sublanguage.
+ *
+ * - The mode begin ands ends normally.
+ * - Content matched is added to the parent mode buffer.
+ * - The parser cursor is moved forward normally.
+ *
+ * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it
+ * never matched) but DOES NOT continue to match subsequent `contains`
+ * modes. Abort is bad/suboptimal because it can result in modes
+ * farther down not getting applied because an earlier rule eats the
+ * content but then aborts.
+ *
+ * - The mode does not begin.
+ * - Content matched by `begin` is added to the mode buffer.
+ * - The parser cursor is moved forward accordingly.
+ *
+ * @ignore - Ignores the mode (as if it never matched) and continues to match any
+ * subsequent `contains` modes. Ignore isn't technically possible with
+ * the current parser implementation.
+ *
+ * - The mode does not begin.
+ * - Content matched by `begin` is ignored.
+ * - The parser cursor is not moved forward.
+ */
+
+ /**
+ * Compiles an individual mode
+ *
+ * This can raise an error if the mode contains certain detectable known logic
+ * issues.
+ * @param {Mode} mode
+ * @param {CompiledMode | null} [parent]
+ * @returns {CompiledMode | never}
+ */
+ function compileMode(mode, parent) {
+ const cmode = /** @type CompiledMode */ (mode);
+ if (mode.isCompiled) return cmode;
+
+ [
+ // do this early so compiler extensions generally don't have to worry about
+ // the distinction between match/begin
+ compileMatch
+ ].forEach(ext => ext(mode, parent));
+
+ language.compilerExtensions.forEach(ext => ext(mode, parent));
+
+ // __beforeBegin is considered private API, internal use only
+ mode.__beforeBegin = null;
+
+ [
+ beginKeywords,
+ // do this later so compiler extensions that come earlier have access to the
+ // raw array if they wanted to perhaps manipulate it, etc.
+ compileIllegal,
+ // default to 1 relevance if not specified
+ compileRelevance
+ ].forEach(ext => ext(mode, parent));
+
+ mode.isCompiled = true;
+
+ let keywordPattern = null;
+ if (typeof mode.keywords === "object") {
+ keywordPattern = mode.keywords.$pattern;
+ delete mode.keywords.$pattern;
+ }
+
+ if (mode.keywords) {
+ mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);
+ }
+
+ // both are not allowed
+ if (mode.lexemes && keywordPattern) {
+ throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");
+ }
+
+ // `mode.lexemes` was the old standard before we added and now recommend
+ // using `keywords.$pattern` to pass the keyword pattern
+ keywordPattern = keywordPattern || mode.lexemes || /\w+/;
+ cmode.keywordPatternRe = langRe(keywordPattern, true);
+
+ if (parent) {
+ if (!mode.begin) mode.begin = /\B|\b/;
+ cmode.beginRe = langRe(mode.begin);
+ if (mode.endSameAsBegin) mode.end = mode.begin;
+ if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/;
+ if (mode.end) cmode.endRe = langRe(mode.end);
+ cmode.terminatorEnd = source(mode.end) || '';
+ if (mode.endsWithParent && parent.terminatorEnd) {
+ cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;
+ }
+ }
+ if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));
+ if (!mode.contains) mode.contains = [];
+
+ mode.contains = [].concat(...mode.contains.map(function(c) {
+ return expandOrCloneMode(c === 'self' ? mode : c);
+ }));
+ mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });
+
+ if (mode.starts) {
+ compileMode(mode.starts, parent);
+ }
+
+ cmode.matcher = buildModeRegex(cmode);
+ return cmode;
+ }
+
+ if (!language.compilerExtensions) language.compilerExtensions = [];
+
+ // self is not valid at the top-level
+ if (language.contains && language.contains.includes('self')) {
+ throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");
+ }
+
+ // we need a null object, which inherit will guarantee
+ language.classNameAliases = inherit(language.classNameAliases || {});
+
+ return compileMode(/** @type Mode */ (language));
+}
+
+/**
+ * Determines if a mode has a dependency on it's parent or not
+ *
+ * If a mode does have a parent dependency then often we need to clone it if
+ * it's used in multiple places so that each copy points to the correct parent,
+ * where-as modes without a parent can often safely be re-used at the bottom of
+ * a mode chain.
+ *
+ * @param {Mode | null} mode
+ * @returns {boolean} - is there a dependency on the parent?
+ * */
+function dependencyOnParent(mode) {
+ if (!mode) return false;
+
+ return mode.endsWithParent || dependencyOnParent(mode.starts);
+}
+
+/**
+ * Expands a mode or clones it if necessary
+ *
+ * This is necessary for modes with parental dependenceis (see notes on
+ * `dependencyOnParent`) and for nodes that have `variants` - which must then be
+ * exploded into their own individual modes at compile time.
+ *
+ * @param {Mode} mode
+ * @returns {Mode | Mode[]}
+ * */
+function expandOrCloneMode(mode) {
+ if (mode.variants && !mode.cachedVariants) {
+ mode.cachedVariants = mode.variants.map(function(variant) {
+ return inherit(mode, { variants: null }, variant);
+ });
+ }
+
+ // EXPAND
+ // if we have variants then essentially "replace" the mode with the variants
+ // this happens in compileMode, where this function is called from
+ if (mode.cachedVariants) {
+ return mode.cachedVariants;
+ }
+
+ // CLONE
+ // if we have dependencies on parents then we need a unique
+ // instance of ourselves, so we can be reused with many
+ // different parents without issue
+ if (dependencyOnParent(mode)) {
+ return inherit(mode, { starts: mode.starts ? inherit(mode.starts) : null });
+ }
+
+ if (Object.isFrozen(mode)) {
+ return inherit(mode);
+ }
+
+ // no special dependency issues, just return ourselves
+ return mode;
+}
+
+var version = "10.7.2";
+
+// @ts-nocheck
+
+function hasValueOrEmptyAttribute(value) {
+ return Boolean(value || value === "");
+}
+
+function BuildVuePlugin(hljs) {
+ const Component = {
+ props: ["language", "code", "autodetect"],
+ data: function() {
+ return {
+ detectedLanguage: "",
+ unknownLanguage: false
+ };
+ },
+ computed: {
+ className() {
+ if (this.unknownLanguage) return "";
+
+ return "hljs " + this.detectedLanguage;
+ },
+ highlighted() {
+ // no idea what language to use, return raw code
+ if (!this.autoDetect && !hljs.getLanguage(this.language)) {
+ console.warn(`The language "${this.language}" you specified could not be found.`);
+ this.unknownLanguage = true;
+ return escapeHTML(this.code);
+ }
+
+ let result = {};
+ if (this.autoDetect) {
+ result = hljs.highlightAuto(this.code);
+ this.detectedLanguage = result.language;
+ } else {
+ result = hljs.highlight(this.language, this.code, this.ignoreIllegals);
+ this.detectedLanguage = this.language;
+ }
+ return result.value;
+ },
+ autoDetect() {
+ return !this.language || hasValueOrEmptyAttribute(this.autodetect);
+ },
+ ignoreIllegals() {
+ return true;
+ }
+ },
+ // this avoids needing to use a whole Vue compilation pipeline just
+ // to build Highlight.js
+ render(createElement) {
+ return createElement("pre", {}, [
+ createElement("code", {
+ class: this.className,
+ domProps: { innerHTML: this.highlighted }
+ })
+ ]);
+ }
+ // template: `
`
+ };
+
+ const VuePlugin = {
+ install(Vue) {
+ Vue.component('highlightjs', Component);
+ }
+ };
+
+ return { Component, VuePlugin };
+}
+
+/* plugin itself */
+
+/** @type {HLJSPlugin} */
+const mergeHTMLPlugin = {
+ "after:highlightElement": ({ el, result, text }) => {
+ const originalStream = nodeStream(el);
+ if (!originalStream.length) return;
+
+ const resultNode = document.createElement('div');
+ resultNode.innerHTML = result.value;
+ result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
+ }
+};
+
+/* Stream merging support functions */
+
+/**
+ * @typedef Event
+ * @property {'start'|'stop'} event
+ * @property {number} offset
+ * @property {Node} node
+ */
+
+/**
+ * @param {Node} node
+ */
+function tag(node) {
+ return node.nodeName.toLowerCase();
+}
+
+/**
+ * @param {Node} node
+ */
+function nodeStream(node) {
+ /** @type Event[] */
+ const result = [];
+ (function _nodeStream(node, offset) {
+ for (let child = node.firstChild; child; child = child.nextSibling) {
+ if (child.nodeType === 3) {
+ offset += child.nodeValue.length;
+ } else if (child.nodeType === 1) {
+ result.push({
+ event: 'start',
+ offset: offset,
+ node: child
+ });
+ offset = _nodeStream(child, offset);
+ // Prevent void elements from having an end tag that would actually
+ // double them in the output. There are more void elements in HTML
+ // but we list only those realistically expected in code display.
+ if (!tag(child).match(/br|hr|img|input/)) {
+ result.push({
+ event: 'stop',
+ offset: offset,
+ node: child
+ });
+ }
+ }
+ }
+ return offset;
+ })(node, 0);
+ return result;
+}
+
+/**
+ * @param {any} original - the original stream
+ * @param {any} highlighted - stream of the highlighted source
+ * @param {string} value - the original source itself
+ */
+function mergeStreams(original, highlighted, value) {
+ let processed = 0;
+ let result = '';
+ const nodeStack = [];
+
+ function selectStream() {
+ if (!original.length || !highlighted.length) {
+ return original.length ? original : highlighted;
+ }
+ if (original[0].offset !== highlighted[0].offset) {
+ return (original[0].offset < highlighted[0].offset) ? original : highlighted;
+ }
+
+ /*
+ To avoid starting the stream just before it should stop the order is
+ ensured that original always starts first and closes last:
+
+ if (event1 == 'start' && event2 == 'start')
+ return original;
+ if (event1 == 'start' && event2 == 'stop')
+ return highlighted;
+ if (event1 == 'stop' && event2 == 'start')
+ return original;
+ if (event1 == 'stop' && event2 == 'stop')
+ return highlighted;
+
+ ... which is collapsed to:
+ */
+ return highlighted[0].event === 'start' ? original : highlighted;
+ }
+
+ /**
+ * @param {Node} node
+ */
+ function open(node) {
+ /** @param {Attr} attr */
+ function attributeString(attr) {
+ return ' ' + attr.nodeName + '="' + escapeHTML(attr.value) + '"';
+ }
+ // @ts-ignore
+ result += '<' + tag(node) + [].map.call(node.attributes, attributeString).join('') + '>';
+ }
+
+ /**
+ * @param {Node} node
+ */
+ function close(node) {
+ result += '' + tag(node) + '>';
+ }
+
+ /**
+ * @param {Event} event
+ */
+ function render(event) {
+ (event.event === 'start' ? open : close)(event.node);
+ }
+
+ while (original.length || highlighted.length) {
+ let stream = selectStream();
+ result += escapeHTML(value.substring(processed, stream[0].offset));
+ processed = stream[0].offset;
+ if (stream === original) {
+ /*
+ On any opening or closing tag of the original markup we first close
+ the entire highlighted node stack, then render the original tag along
+ with all the following original tags at the same offset and then
+ reopen all the tags on the highlighted stack.
+ */
+ nodeStack.reverse().forEach(close);
+ do {
+ render(stream.splice(0, 1)[0]);
+ stream = selectStream();
+ } while (stream === original && stream.length && stream[0].offset === processed);
+ nodeStack.reverse().forEach(open);
+ } else {
+ if (stream[0].event === 'start') {
+ nodeStack.push(stream[0].node);
+ } else {
+ nodeStack.pop();
+ }
+ render(stream.splice(0, 1)[0]);
+ }
+ }
+ return result + escapeHTML(value.substr(processed));
+}
+
+/*
+
+For the reasoning behind this please see:
+https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419
+
+*/
+
+/**
+ * @type {Record}
+ */
+const seenDeprecations = {};
+
+/**
+ * @param {string} message
+ */
+const error = (message) => {
+ console.error(message);
+};
+
+/**
+ * @param {string} message
+ * @param {any} args
+ */
+const warn = (message, ...args) => {
+ console.log(`WARN: ${message}`, ...args);
+};
+
+/**
+ * @param {string} version
+ * @param {string} message
+ */
+const deprecated = (version, message) => {
+ if (seenDeprecations[`${version}/${message}`]) return;
+
+ console.log(`Deprecated as of ${version}. ${message}`);
+ seenDeprecations[`${version}/${message}`] = true;
+};
+
+/*
+Syntax highlighting with language autodetection.
+https://highlightjs.org/
+*/
+
+const escape$1 = escapeHTML;
+const inherit$1 = inherit;
+const NO_MATCH = Symbol("nomatch");
+
+/**
+ * @param {any} hljs - object that is extended (legacy)
+ * @returns {HLJSApi}
+ */
+const HLJS = function(hljs) {
+ // Global internal variables used within the highlight.js library.
+ /** @type {Record} */
+ const languages = Object.create(null);
+ /** @type {Record} */
+ const aliases = Object.create(null);
+ /** @type {HLJSPlugin[]} */
+ const plugins = [];
+
+ // safe/production mode - swallows more errors, tries to keep running
+ // even if a single syntax or parse hits a fatal error
+ let SAFE_MODE = true;
+ const fixMarkupRe = /(^(<[^>]+>|\t|)+|\n)/gm;
+ const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?";
+ /** @type {Language} */
+ const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };
+
+ // Global options used when within external APIs. This is modified when
+ // calling the `hljs.configure` function.
+ /** @type HLJSOptions */
+ let options = {
+ noHighlightRe: /^(no-?highlight)$/i,
+ languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i,
+ classPrefix: 'hljs-',
+ tabReplace: null,
+ useBR: false,
+ languages: null,
+ // beta configuration options, subject to change, welcome to discuss
+ // https://github.com/highlightjs/highlight.js/issues/1086
+ __emitter: TokenTreeEmitter
+ };
+
+ /* Utility functions */
+
+ /**
+ * Tests a language name to see if highlighting should be skipped
+ * @param {string} languageName
+ */
+ function shouldNotHighlight(languageName) {
+ return options.noHighlightRe.test(languageName);
+ }
+
+ /**
+ * @param {HighlightedHTMLElement} block - the HTML element to determine language for
+ */
+ function blockLanguage(block) {
+ let classes = block.className + ' ';
+
+ classes += block.parentNode ? block.parentNode.className : '';
+
+ // language-* takes precedence over non-prefixed class names.
+ const match = options.languageDetectRe.exec(classes);
+ if (match) {
+ const language = getLanguage(match[1]);
+ if (!language) {
+ warn(LANGUAGE_NOT_FOUND.replace("{}", match[1]));
+ warn("Falling back to no-highlight mode for this block.", block);
+ }
+ return language ? match[1] : 'no-highlight';
+ }
+
+ return classes
+ .split(/\s+/)
+ .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));
+ }
+
+ /**
+ * Core highlighting function.
+ *
+ * OLD API
+ * highlight(lang, code, ignoreIllegals, continuation)
+ *
+ * NEW API
+ * highlight(code, {lang, ignoreIllegals})
+ *
+ * @param {string} codeOrlanguageName - the language to use for highlighting
+ * @param {string | HighlightOptions} optionsOrCode - the code to highlight
+ * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
+ * @param {CompiledMode} [continuation] - current continuation mode, if any
+ *
+ * @returns {HighlightResult} Result - an object that represents the result
+ * @property {string} language - the language name
+ * @property {number} relevance - the relevance score
+ * @property {string} value - the highlighted HTML code
+ * @property {string} code - the original raw code
+ * @property {CompiledMode} top - top of the current mode stack
+ * @property {boolean} illegal - indicates whether any illegal matches were found
+ */
+ function highlight(codeOrlanguageName, optionsOrCode, ignoreIllegals, continuation) {
+ let code = "";
+ let languageName = "";
+ if (typeof optionsOrCode === "object") {
+ code = codeOrlanguageName;
+ ignoreIllegals = optionsOrCode.ignoreIllegals;
+ languageName = optionsOrCode.language;
+ // continuation not supported at all via the new API
+ // eslint-disable-next-line no-undefined
+ continuation = undefined;
+ } else {
+ // old API
+ deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated.");
+ deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277");
+ languageName = codeOrlanguageName;
+ code = optionsOrCode;
+ }
+
+ /** @type {BeforeHighlightContext} */
+ const context = {
+ code,
+ language: languageName
+ };
+ // the plugin can change the desired language or the code to be highlighted
+ // just be changing the object it was passed
+ fire("before:highlight", context);
+
+ // a before plugin can usurp the result completely by providing it's own
+ // in which case we don't even need to call highlight
+ const result = context.result
+ ? context.result
+ : _highlight(context.language, context.code, ignoreIllegals, continuation);
+
+ result.code = context.code;
+ // the plugin can change anything in result to suite it
+ fire("after:highlight", result);
+
+ return result;
+ }
+
+ /**
+ * private highlight that's used internally and does not fire callbacks
+ *
+ * @param {string} languageName - the language to use for highlighting
+ * @param {string} codeToHighlight - the code to highlight
+ * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
+ * @param {CompiledMode?} [continuation] - current continuation mode, if any
+ * @returns {HighlightResult} - result of the highlight operation
+ */
+ function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {
+ /**
+ * Return keyword data if a match is a keyword
+ * @param {CompiledMode} mode - current mode
+ * @param {RegExpMatchArray} match - regexp match data
+ * @returns {KeywordData | false}
+ */
+ function keywordData(mode, match) {
+ const matchText = language.case_insensitive ? match[0].toLowerCase() : match[0];
+ return Object.prototype.hasOwnProperty.call(mode.keywords, matchText) && mode.keywords[matchText];
+ }
+
+ function processKeywords() {
+ if (!top.keywords) {
+ emitter.addText(modeBuffer);
+ return;
+ }
+
+ let lastIndex = 0;
+ top.keywordPatternRe.lastIndex = 0;
+ let match = top.keywordPatternRe.exec(modeBuffer);
+ let buf = "";
+
+ while (match) {
+ buf += modeBuffer.substring(lastIndex, match.index);
+ const data = keywordData(top, match);
+ if (data) {
+ const [kind, keywordRelevance] = data;
+ emitter.addText(buf);
+ buf = "";
+
+ relevance += keywordRelevance;
+ if (kind.startsWith("_")) {
+ // _ implied for relevance only, do not highlight
+ // by applying a class name
+ buf += match[0];
+ } else {
+ const cssClass = language.classNameAliases[kind] || kind;
+ emitter.addKeyword(match[0], cssClass);
+ }
+ } else {
+ buf += match[0];
+ }
+ lastIndex = top.keywordPatternRe.lastIndex;
+ match = top.keywordPatternRe.exec(modeBuffer);
+ }
+ buf += modeBuffer.substr(lastIndex);
+ emitter.addText(buf);
+ }
+
+ function processSubLanguage() {
+ if (modeBuffer === "") return;
+ /** @type HighlightResult */
+ let result = null;
+
+ if (typeof top.subLanguage === 'string') {
+ if (!languages[top.subLanguage]) {
+ emitter.addText(modeBuffer);
+ return;
+ }
+ result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);
+ continuations[top.subLanguage] = /** @type {CompiledMode} */ (result.top);
+ } else {
+ result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);
+ }
+
+ // Counting embedded language score towards the host language may be disabled
+ // with zeroing the containing mode relevance. Use case in point is Markdown that
+ // allows XML everywhere and makes every XML snippet to have a much larger Markdown
+ // score.
+ if (top.relevance > 0) {
+ relevance += result.relevance;
+ }
+ emitter.addSublanguage(result.emitter, result.language);
+ }
+
+ function processBuffer() {
+ if (top.subLanguage != null) {
+ processSubLanguage();
+ } else {
+ processKeywords();
+ }
+ modeBuffer = '';
+ }
+
+ /**
+ * @param {Mode} mode - new mode to start
+ */
+ function startNewMode(mode) {
+ if (mode.className) {
+ emitter.openNode(language.classNameAliases[mode.className] || mode.className);
+ }
+ top = Object.create(mode, { parent: { value: top } });
+ return top;
+ }
+
+ /**
+ * @param {CompiledMode } mode - the mode to potentially end
+ * @param {RegExpMatchArray} match - the latest match
+ * @param {string} matchPlusRemainder - match plus remainder of content
+ * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode
+ */
+ function endOfMode(mode, match, matchPlusRemainder) {
+ let matched = startsWith(mode.endRe, matchPlusRemainder);
+
+ if (matched) {
+ if (mode["on:end"]) {
+ const resp = new Response(mode);
+ mode["on:end"](match, resp);
+ if (resp.isMatchIgnored) matched = false;
+ }
+
+ if (matched) {
+ while (mode.endsParent && mode.parent) {
+ mode = mode.parent;
+ }
+ return mode;
+ }
+ }
+ // even if on:end fires an `ignore` it's still possible
+ // that we might trigger the end node because of a parent mode
+ if (mode.endsWithParent) {
+ return endOfMode(mode.parent, match, matchPlusRemainder);
+ }
+ }
+
+ /**
+ * Handle matching but then ignoring a sequence of text
+ *
+ * @param {string} lexeme - string containing full match text
+ */
+ function doIgnore(lexeme) {
+ if (top.matcher.regexIndex === 0) {
+ // no more regexs to potentially match here, so we move the cursor forward one
+ // space
+ modeBuffer += lexeme[0];
+ return 1;
+ } else {
+ // no need to move the cursor, we still have additional regexes to try and
+ // match at this very spot
+ resumeScanAtSamePosition = true;
+ return 0;
+ }
+ }
+
+ /**
+ * Handle the start of a new potential mode match
+ *
+ * @param {EnhancedMatch} match - the current match
+ * @returns {number} how far to advance the parse cursor
+ */
+ function doBeginMatch(match) {
+ const lexeme = match[0];
+ const newMode = match.rule;
+
+ const resp = new Response(newMode);
+ // first internal before callbacks, then the public ones
+ const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]];
+ for (const cb of beforeCallbacks) {
+ if (!cb) continue;
+ cb(match, resp);
+ if (resp.isMatchIgnored) return doIgnore(lexeme);
+ }
+
+ if (newMode && newMode.endSameAsBegin) {
+ newMode.endRe = escape(lexeme);
+ }
+
+ if (newMode.skip) {
+ modeBuffer += lexeme;
+ } else {
+ if (newMode.excludeBegin) {
+ modeBuffer += lexeme;
+ }
+ processBuffer();
+ if (!newMode.returnBegin && !newMode.excludeBegin) {
+ modeBuffer = lexeme;
+ }
+ }
+ startNewMode(newMode);
+ // if (mode["after:begin"]) {
+ // let resp = new Response(mode);
+ // mode["after:begin"](match, resp);
+ // }
+ return newMode.returnBegin ? 0 : lexeme.length;
+ }
+
+ /**
+ * Handle the potential end of mode
+ *
+ * @param {RegExpMatchArray} match - the current match
+ */
+ function doEndMatch(match) {
+ const lexeme = match[0];
+ const matchPlusRemainder = codeToHighlight.substr(match.index);
+
+ const endMode = endOfMode(top, match, matchPlusRemainder);
+ if (!endMode) { return NO_MATCH; }
+
+ const origin = top;
+ if (origin.skip) {
+ modeBuffer += lexeme;
+ } else {
+ if (!(origin.returnEnd || origin.excludeEnd)) {
+ modeBuffer += lexeme;
+ }
+ processBuffer();
+ if (origin.excludeEnd) {
+ modeBuffer = lexeme;
+ }
+ }
+ do {
+ if (top.className) {
+ emitter.closeNode();
+ }
+ if (!top.skip && !top.subLanguage) {
+ relevance += top.relevance;
+ }
+ top = top.parent;
+ } while (top !== endMode.parent);
+ if (endMode.starts) {
+ if (endMode.endSameAsBegin) {
+ endMode.starts.endRe = endMode.endRe;
+ }
+ startNewMode(endMode.starts);
+ }
+ return origin.returnEnd ? 0 : lexeme.length;
+ }
+
+ function processContinuations() {
+ const list = [];
+ for (let current = top; current !== language; current = current.parent) {
+ if (current.className) {
+ list.unshift(current.className);
+ }
+ }
+ list.forEach(item => emitter.openNode(item));
+ }
+
+ /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */
+ let lastMatch = {};
+
+ /**
+ * Process an individual match
+ *
+ * @param {string} textBeforeMatch - text preceeding the match (since the last match)
+ * @param {EnhancedMatch} [match] - the match itself
+ */
+ function processLexeme(textBeforeMatch, match) {
+ const lexeme = match && match[0];
+
+ // add non-matched text to the current mode buffer
+ modeBuffer += textBeforeMatch;
+
+ if (lexeme == null) {
+ processBuffer();
+ return 0;
+ }
+
+ // we've found a 0 width match and we're stuck, so we need to advance
+ // this happens when we have badly behaved rules that have optional matchers to the degree that
+ // sometimes they can end up matching nothing at all
+ // Ref: https://github.com/highlightjs/highlight.js/issues/2140
+ if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") {
+ // spit the "skipped" character that our regex choked on back into the output sequence
+ modeBuffer += codeToHighlight.slice(match.index, match.index + 1);
+ if (!SAFE_MODE) {
+ /** @type {AnnotatedError} */
+ const err = new Error('0 width match regex');
+ err.languageName = languageName;
+ err.badRule = lastMatch.rule;
+ throw err;
+ }
+ return 1;
+ }
+ lastMatch = match;
+
+ if (match.type === "begin") {
+ return doBeginMatch(match);
+ } else if (match.type === "illegal" && !ignoreIllegals) {
+ // illegal match, we do not continue processing
+ /** @type {AnnotatedError} */
+ const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '') + '"');
+ err.mode = top;
+ throw err;
+ } else if (match.type === "end") {
+ const processed = doEndMatch(match);
+ if (processed !== NO_MATCH) {
+ return processed;
+ }
+ }
+
+ // edge case for when illegal matches $ (end of line) which is technically
+ // a 0 width match but not a begin/end match so it's not caught by the
+ // first handler (when ignoreIllegals is true)
+ if (match.type === "illegal" && lexeme === "") {
+ // advance so we aren't stuck in an infinite loop
+ return 1;
+ }
+
+ // infinite loops are BAD, this is a last ditch catch all. if we have a
+ // decent number of iterations yet our index (cursor position in our
+ // parsing) still 3x behind our index then something is very wrong
+ // so we bail
+ if (iterations > 100000 && iterations > match.index * 3) {
+ const err = new Error('potential infinite loop, way more iterations than matches');
+ throw err;
+ }
+
+ /*
+ Why might be find ourselves here? Only one occasion now. An end match that was
+ triggered but could not be completed. When might this happen? When an `endSameasBegin`
+ rule sets the end rule to a specific match. Since the overall mode termination rule that's
+ being used to scan the text isn't recompiled that means that any match that LOOKS like
+ the end (but is not, because it is not an exact match to the beginning) will
+ end up here. A definite end match, but when `doEndMatch` tries to "reapply"
+ the end rule and fails to match, we wind up here, and just silently ignore the end.
+
+ This causes no real harm other than stopping a few times too many.
+ */
+
+ modeBuffer += lexeme;
+ return lexeme.length;
+ }
+
+ const language = getLanguage(languageName);
+ if (!language) {
+ error(LANGUAGE_NOT_FOUND.replace("{}", languageName));
+ throw new Error('Unknown language: "' + languageName + '"');
+ }
+
+ const md = compileLanguage(language, { plugins });
+ let result = '';
+ /** @type {CompiledMode} */
+ let top = continuation || md;
+ /** @type Record */
+ const continuations = {}; // keep continuations for sub-languages
+ const emitter = new options.__emitter(options);
+ processContinuations();
+ let modeBuffer = '';
+ let relevance = 0;
+ let index = 0;
+ let iterations = 0;
+ let resumeScanAtSamePosition = false;
+
+ try {
+ top.matcher.considerAll();
+
+ for (;;) {
+ iterations++;
+ if (resumeScanAtSamePosition) {
+ // only regexes not matched previously will now be
+ // considered for a potential match
+ resumeScanAtSamePosition = false;
+ } else {
+ top.matcher.considerAll();
+ }
+ top.matcher.lastIndex = index;
+
+ const match = top.matcher.exec(codeToHighlight);
+ // console.log("match", match[0], match.rule && match.rule.begin)
+
+ if (!match) break;
+
+ const beforeMatch = codeToHighlight.substring(index, match.index);
+ const processedCount = processLexeme(beforeMatch, match);
+ index = match.index + processedCount;
+ }
+ processLexeme(codeToHighlight.substr(index));
+ emitter.closeAllNodes();
+ emitter.finalize();
+ result = emitter.toHTML();
+
+ return {
+ // avoid possible breakage with v10 clients expecting
+ // this to always be an integer
+ relevance: Math.floor(relevance),
+ value: result,
+ language: languageName,
+ illegal: false,
+ emitter: emitter,
+ top: top
+ };
+ } catch (err) {
+ if (err.message && err.message.includes('Illegal')) {
+ return {
+ illegal: true,
+ illegalBy: {
+ msg: err.message,
+ context: codeToHighlight.slice(index - 100, index + 100),
+ mode: err.mode
+ },
+ sofar: result,
+ relevance: 0,
+ value: escape$1(codeToHighlight),
+ emitter: emitter
+ };
+ } else if (SAFE_MODE) {
+ return {
+ illegal: false,
+ relevance: 0,
+ value: escape$1(codeToHighlight),
+ emitter: emitter,
+ language: languageName,
+ top: top,
+ errorRaised: err
+ };
+ } else {
+ throw err;
+ }
+ }
+ }
+
+ /**
+ * returns a valid highlight result, without actually doing any actual work,
+ * auto highlight starts with this and it's possible for small snippets that
+ * auto-detection may not find a better match
+ * @param {string} code
+ * @returns {HighlightResult}
+ */
+ function justTextHighlightResult(code) {
+ const result = {
+ relevance: 0,
+ emitter: new options.__emitter(options),
+ value: escape$1(code),
+ illegal: false,
+ top: PLAINTEXT_LANGUAGE
+ };
+ result.emitter.addText(code);
+ return result;
+ }
+
+ /**
+ Highlighting with language detection. Accepts a string with the code to
+ highlight. Returns an object with the following properties:
+
+ - language (detected language)
+ - relevance (int)
+ - value (an HTML string with highlighting markup)
+ - second_best (object with the same structure for second-best heuristically
+ detected language, may be absent)
+
+ @param {string} code
+ @param {Array} [languageSubset]
+ @returns {AutoHighlightResult}
+ */
+ function highlightAuto(code, languageSubset) {
+ languageSubset = languageSubset || options.languages || Object.keys(languages);
+ const plaintext = justTextHighlightResult(code);
+
+ const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>
+ _highlight(name, code, false)
+ );
+ results.unshift(plaintext); // plaintext is always an option
+
+ const sorted = results.sort((a, b) => {
+ // sort base on relevance
+ if (a.relevance !== b.relevance) return b.relevance - a.relevance;
+
+ // always award the tie to the base language
+ // ie if C++ and Arduino are tied, it's more likely to be C++
+ if (a.language && b.language) {
+ if (getLanguage(a.language).supersetOf === b.language) {
+ return 1;
+ } else if (getLanguage(b.language).supersetOf === a.language) {
+ return -1;
+ }
+ }
+
+ // otherwise say they are equal, which has the effect of sorting on
+ // relevance while preserving the original ordering - which is how ties
+ // have historically been settled, ie the language that comes first always
+ // wins in the case of a tie
+ return 0;
+ });
+
+ const [best, secondBest] = sorted;
+
+ /** @type {AutoHighlightResult} */
+ const result = best;
+ result.second_best = secondBest;
+
+ return result;
+ }
+
+ /**
+ Post-processing of the highlighted markup:
+
+ - replace TABs with something more useful
+ - replace real line-breaks with ' ' for non-pre containers
+
+ @param {string} html
+ @returns {string}
+ */
+ function fixMarkup(html) {
+ if (!(options.tabReplace || options.useBR)) {
+ return html;
+ }
+
+ return html.replace(fixMarkupRe, match => {
+ if (match === '\n') {
+ return options.useBR ? ' ' : match;
+ } else if (options.tabReplace) {
+ return match.replace(/\t/g, options.tabReplace);
+ }
+ return match;
+ });
+ }
+
+ /**
+ * Builds new class name for block given the language name
+ *
+ * @param {HTMLElement} element
+ * @param {string} [currentLang]
+ * @param {string} [resultLang]
+ */
+ function updateClassName(element, currentLang, resultLang) {
+ const language = currentLang ? aliases[currentLang] : resultLang;
+
+ element.classList.add("hljs");
+ if (language) element.classList.add(language);
+ }
+
+ /** @type {HLJSPlugin} */
+ const brPlugin = {
+ "before:highlightElement": ({ el }) => {
+ if (options.useBR) {
+ el.innerHTML = el.innerHTML.replace(/\n/g, '').replace(/ /g, '\n');
+ }
+ },
+ "after:highlightElement": ({ result }) => {
+ if (options.useBR) {
+ result.value = result.value.replace(/\n/g, " ");
+ }
+ }
+ };
+
+ const TAB_REPLACE_RE = /^(<[^>]+>|\t)+/gm;
+ /** @type {HLJSPlugin} */
+ const tabReplacePlugin = {
+ "after:highlightElement": ({ result }) => {
+ if (options.tabReplace) {
+ result.value = result.value.replace(TAB_REPLACE_RE, (m) =>
+ m.replace(/\t/g, options.tabReplace)
+ );
+ }
+ }
+ };
+
+ /**
+ * Applies highlighting to a DOM node containing code. Accepts a DOM node and
+ * two optional parameters for fixMarkup.
+ *
+ * @param {HighlightedHTMLElement} element - the HTML element to highlight
+ */
+ function highlightElement(element) {
+ /** @type HTMLElement */
+ let node = null;
+ const language = blockLanguage(element);
+
+ if (shouldNotHighlight(language)) return;
+
+ // support for v10 API
+ fire("before:highlightElement",
+ { el: element, language: language });
+
+ node = element;
+ const text = node.textContent;
+ const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);
+
+ // support for v10 API
+ fire("after:highlightElement", { el: element, result, text });
+
+ element.innerHTML = result.value;
+ updateClassName(element, language, result.language);
+ element.result = {
+ language: result.language,
+ // TODO: remove with version 11.0
+ re: result.relevance,
+ relavance: result.relevance
+ };
+ if (result.second_best) {
+ element.second_best = {
+ language: result.second_best.language,
+ // TODO: remove with version 11.0
+ re: result.second_best.relevance,
+ relavance: result.second_best.relevance
+ };
+ }
+ }
+
+ /**
+ * Updates highlight.js global options with the passed options
+ *
+ * @param {Partial} userOptions
+ */
+ function configure(userOptions) {
+ if (userOptions.useBR) {
+ deprecated("10.3.0", "'useBR' will be removed entirely in v11.0");
+ deprecated("10.3.0", "Please see https://github.com/highlightjs/highlight.js/issues/2559");
+ }
+ options = inherit$1(options, userOptions);
+ }
+
+ /**
+ * Highlights to all
blocks on a page
+ *
+ * @type {Function & {called?: boolean}}
+ */
+ // TODO: remove v12, deprecated
+ const initHighlighting = () => {
+ if (initHighlighting.called) return;
+ initHighlighting.called = true;
+
+ deprecated("10.6.0", "initHighlighting() is deprecated. Use highlightAll() instead.");
+
+ const blocks = document.querySelectorAll('pre code');
+ blocks.forEach(highlightElement);
+ };
+
+ // Higlights all when DOMContentLoaded fires
+ // TODO: remove v12, deprecated
+ function initHighlightingOnLoad() {
+ deprecated("10.6.0", "initHighlightingOnLoad() is deprecated. Use highlightAll() instead.");
+ wantsHighlight = true;
+ }
+
+ let wantsHighlight = false;
+
+ /**
+ * auto-highlights all pre>code elements on the page
+ */
+ function highlightAll() {
+ // if we are called too early in the loading process
+ if (document.readyState === "loading") {
+ wantsHighlight = true;
+ return;
+ }
+
+ const blocks = document.querySelectorAll('pre code');
+ blocks.forEach(highlightElement);
+ }
+
+ function boot() {
+ // if a highlight was requested before DOM was loaded, do now
+ if (wantsHighlight) highlightAll();
+ }
+
+ // make sure we are in the browser environment
+ if (typeof window !== 'undefined' && window.addEventListener) {
+ window.addEventListener('DOMContentLoaded', boot, false);
+ }
+
+ /**
+ * Register a language grammar module
+ *
+ * @param {string} languageName
+ * @param {LanguageFn} languageDefinition
+ */
+ function registerLanguage(languageName, languageDefinition) {
+ let lang = null;
+ try {
+ lang = languageDefinition(hljs);
+ } catch (error$1) {
+ error("Language definition for '{}' could not be registered.".replace("{}", languageName));
+ // hard or soft error
+ if (!SAFE_MODE) { throw error$1; } else { error(error$1); }
+ // languages that have serious errors are replaced with essentially a
+ // "plaintext" stand-in so that the code blocks will still get normal
+ // css classes applied to them - and one bad language won't break the
+ // entire highlighter
+ lang = PLAINTEXT_LANGUAGE;
+ }
+ // give it a temporary name if it doesn't have one in the meta-data
+ if (!lang.name) lang.name = languageName;
+ languages[languageName] = lang;
+ lang.rawDefinition = languageDefinition.bind(null, hljs);
+
+ if (lang.aliases) {
+ registerAliases(lang.aliases, { languageName });
+ }
+ }
+
+ /**
+ * Remove a language grammar module
+ *
+ * @param {string} languageName
+ */
+ function unregisterLanguage(languageName) {
+ delete languages[languageName];
+ for (const alias of Object.keys(aliases)) {
+ if (aliases[alias] === languageName) {
+ delete aliases[alias];
+ }
+ }
+ }
+
+ /**
+ * @returns {string[]} List of language internal names
+ */
+ function listLanguages() {
+ return Object.keys(languages);
+ }
+
+ /**
+ intended usage: When one language truly requires another
+
+ Unlike `getLanguage`, this will throw when the requested language
+ is not available.
+
+ @param {string} name - name of the language to fetch/require
+ @returns {Language | never}
+ */
+ function requireLanguage(name) {
+ deprecated("10.4.0", "requireLanguage will be removed entirely in v11.");
+ deprecated("10.4.0", "Please see https://github.com/highlightjs/highlight.js/pull/2844");
+
+ const lang = getLanguage(name);
+ if (lang) { return lang; }
+
+ const err = new Error('The \'{}\' language is required, but not loaded.'.replace('{}', name));
+ throw err;
+ }
+
+ /**
+ * @param {string} name - name of the language to retrieve
+ * @returns {Language | undefined}
+ */
+ function getLanguage(name) {
+ name = (name || '').toLowerCase();
+ return languages[name] || languages[aliases[name]];
+ }
+
+ /**
+ *
+ * @param {string|string[]} aliasList - single alias or list of aliases
+ * @param {{languageName: string}} opts
+ */
+ function registerAliases(aliasList, { languageName }) {
+ if (typeof aliasList === 'string') {
+ aliasList = [aliasList];
+ }
+ aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });
+ }
+
+ /**
+ * Determines if a given language has auto-detection enabled
+ * @param {string} name - name of the language
+ */
+ function autoDetection(name) {
+ const lang = getLanguage(name);
+ return lang && !lang.disableAutodetect;
+ }
+
+ /**
+ * Upgrades the old highlightBlock plugins to the new
+ * highlightElement API
+ * @param {HLJSPlugin} plugin
+ */
+ function upgradePluginAPI(plugin) {
+ // TODO: remove with v12
+ if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) {
+ plugin["before:highlightElement"] = (data) => {
+ plugin["before:highlightBlock"](
+ Object.assign({ block: data.el }, data)
+ );
+ };
+ }
+ if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) {
+ plugin["after:highlightElement"] = (data) => {
+ plugin["after:highlightBlock"](
+ Object.assign({ block: data.el }, data)
+ );
+ };
+ }
+ }
+
+ /**
+ * @param {HLJSPlugin} plugin
+ */
+ function addPlugin(plugin) {
+ upgradePluginAPI(plugin);
+ plugins.push(plugin);
+ }
+
+ /**
+ *
+ * @param {PluginEvent} event
+ * @param {any} args
+ */
+ function fire(event, args) {
+ const cb = event;
+ plugins.forEach(function(plugin) {
+ if (plugin[cb]) {
+ plugin[cb](args);
+ }
+ });
+ }
+
+ /**
+ Note: fixMarkup is deprecated and will be removed entirely in v11
+
+ @param {string} arg
+ @returns {string}
+ */
+ function deprecateFixMarkup(arg) {
+ deprecated("10.2.0", "fixMarkup will be removed entirely in v11.0");
+ deprecated("10.2.0", "Please see https://github.com/highlightjs/highlight.js/issues/2534");
+
+ return fixMarkup(arg);
+ }
+
+ /**
+ *
+ * @param {HighlightedHTMLElement} el
+ */
+ function deprecateHighlightBlock(el) {
+ deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0");
+ deprecated("10.7.0", "Please use highlightElement now.");
+
+ return highlightElement(el);
+ }
+
+ /* Interface definition */
+ Object.assign(hljs, {
+ highlight,
+ highlightAuto,
+ highlightAll,
+ fixMarkup: deprecateFixMarkup,
+ highlightElement,
+ // TODO: Remove with v12 API
+ highlightBlock: deprecateHighlightBlock,
+ configure,
+ initHighlighting,
+ initHighlightingOnLoad,
+ registerLanguage,
+ unregisterLanguage,
+ listLanguages,
+ getLanguage,
+ registerAliases,
+ requireLanguage,
+ autoDetection,
+ inherit: inherit$1,
+ addPlugin,
+ // plugins for frameworks
+ vuePlugin: BuildVuePlugin(hljs).VuePlugin
+ });
+
+ hljs.debugMode = function() { SAFE_MODE = false; };
+ hljs.safeMode = function() { SAFE_MODE = true; };
+ hljs.versionString = version;
+
+ for (const key in MODES) {
+ // @ts-ignore
+ if (typeof MODES[key] === "object") {
+ // @ts-ignore
+ deepFreezeEs6(MODES[key]);
+ }
+ }
+
+ // merge all the modes/regexs into our main object
+ Object.assign(hljs, MODES);
+
+ // built-in plugins, likely to be moved out of core in the future
+ hljs.addPlugin(brPlugin); // slated to be removed in v11
+ hljs.addPlugin(mergeHTMLPlugin);
+ hljs.addPlugin(tabReplacePlugin);
+ return hljs;
+};
+
+// export an "instance" of the highlighter
+var highlight = HLJS({});
+
+module.exports = highlight;
+
+
+/***/ })
+
+}]);
+//# sourceMappingURL=highlight-js-lib-core.js.map
\ No newline at end of file
diff --git a/src/main/resources/static/highlight-js-lib-core.js.map b/src/main/resources/static/highlight-js-lib-core.js.map
new file mode 100644
index 0000000..0ffb0cf
--- /dev/null
+++ b/src/main/resources/static/highlight-js-lib-core.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["./node_modules/highlight.js/lib/core.js"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;AACA,yBAAyB;AACzB,wBAAwB;AACxB,wBAAwB;AACxB,0BAA0B;AAC1B,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,qBAAqB;AAChC,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,oBAAoB,EAAE;AACtB;;AAEA;AACA,aAAa,OAAO;AACpB,cAAc,uBAAuB;AACrC,cAAc,qBAAqB;AACnC,cAAc,qBAAqB;AACnC,cAAc,aAAa;AAC3B;;AAEA,eAAe,sCAAsC;AACrD,eAAe,6BAA6B;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,KAAK;AAChB;AACA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA,aAAa,KAAK;AAClB,cAAc,qBAAqB;AACnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,KAAK;AAClB;AACA;;AAEA;AACA;AACA,qBAAqB,iBAAiB,EAAE,UAAU;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,KAAK;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA,eAAe,uDAAuD,UAAU;AAChF,eAAe,uDAAuD,EAAE;AACxE;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA,cAAc,sBAAsB;;AAEpC,cAAc,KAAK;AACnB;AACA;AACA;;AAEA,cAAc,OAAO;AACrB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,qCAAqC;AACpD,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,SAAS;AACtB,aAAa,KAAK;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,KAAK;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA,sBAAsB,QAAQ;;AAE9B;AACA;AACA;AACA;;AAEA;AACA,aAAa,OAAO;AACpB;AACA;AACA,sBAAsB,QAAQ;;AAE9B;AACA;;AAEA;AACA,aAAa,WAAW,gBAAgB;AACxC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA,sDAAsD;AACtD;;AAEA;AACA,WAAW,iBAAiB;AAC5B,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,WAAW,sBAAsB;AACjC,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,GAAG;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,6FAA6F;AAC7F,wCAAwC;AACxC,+EAA+E,sDAAsD;;AAErI;AACA,UAAU,kBAAkB,yBAAyB,EAAE;AACvD;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,gBAAgB;AAC3B,WAAW,UAAU;AACrB,aAAa;AACb;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B,gCAAgC,8BAA8B,EAAE;AAChE,iBAAiB,aAAa;AAC9B,8BAA8B,wDAAwD;AACtF,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B,WAAW,iBAAiB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,wDAAwD;AACnE,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,uBAAuB;AACnC,aAAa;AACb;AACA,oCAAoC,UAAU;AAC9C;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,mBAAmB,aAAa;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B,eAAe;AACf;AACA;AACA;;AAEA,0DAA0D,4BAA4B;;AAEtF;AACA,sCAAsC,cAAc;AACpD;AACA;AACA,gCAAgC,kBAAkB;AAClD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,KAAK;AAClB,aAAa,oBAAoB;AACjC,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gBAAgB;AAC1E;;AAEA;AACA;AACA,KAAK;AACL,uCAAuC,2CAA2C,EAAE;;AAEpF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE;;AAErE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,YAAY;AACvB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,KAAK;AAChB,aAAa;AACb;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oDAAoD;AAC9E;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,qBAAqB;AACrB,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,UAAU;AACV;;AAEA;;AAEA,WAAW,WAAW;AACtB;AACA,8BAA8B,mBAAmB;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc,eAAe;AAC7B,cAAc,OAAO;AACrB,cAAc,KAAK;AACnB;;AAEA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;;AAEA;AACA,WAAW,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA,WAAW,IAAI;AACf,WAAW,IAAI;AACf,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,KAAK;AAClB;AACA;AACA,gBAAgB,KAAK;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,KAAK;AAClB;AACA;AACA;AACA;;AAEA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW,IAAI;AACf;AACA;AACA,uBAAuB,QAAQ;AAC/B;;AAEA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA,0BAA0B,QAAQ,GAAG,QAAQ;;AAE7C,kCAAkC,QAAQ,IAAI,QAAQ;AACtD,sBAAsB,QAAQ,GAAG,QAAQ;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW,IAAI;AACf,aAAa;AACb;AACA;AACA;AACA,aAAa,yBAAyB;AACtC;AACA,aAAa,uBAAuB;AACpC;AACA,aAAa,aAAa;AAC1B;;AAEA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D,aAAa,SAAS;AACtB,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA,aAAa,uBAAuB;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA,aAAa,OAAO;AACpB,aAAa,0BAA0B;AACvC,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B;AACA,eAAe,gBAAgB;AAC/B,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,aAAa;AAC7B,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,SAAS;AACtB,aAAa,cAAc;AAC3B,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B,eAAe,iBAAiB;AAChC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,aAAa;AACjE,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU,aAAa,EAAE;AAC1D;AACA;;AAEA;AACA,eAAe,cAAc;AAC7B,eAAe,iBAAiB;AAChC,eAAe,OAAO;AACtB,iBAAiB,oBAAoB;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,iBAAiB;;AAEtC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,gDAAgD;AAChE;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,cAAc;AAC7B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C;AAC1C;AACA;;AAEA,0CAA0C,UAAU;AACpD;AACA,eAAe,aAAa;AAC5B;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,YAAY,OAAO;AACnB,YAAY,cAAc;AAC1B,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,eAAe,oBAAoB;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,YAAY,OAAO;AACnB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA,aAAa,WAAW;AACxB;AACA,iCAAiC,KAAK;AACtC;AACA;AACA;AACA,KAAK;AACL,gCAAgC,SAAS;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,WAAW;AACxB;AACA,gCAAgC,SAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO,kCAAkC;;AAEzC;AACA;AACA,+CAA+C,iCAAiC;;AAEhF;AACA,oCAAoC,4BAA4B;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wCAAwC,uCAAuC;AAC/E;AACA,uBAAuB,eAAe,EAAE,OAAO,gBAAgB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,eAAe;AACpD;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,YAAY,OAAO;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;;AAE5B,mCAAmC,qDAAqD;AACxF;AACA;;AAEA;AACA,aAAa,OAAO;AACpB,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,gBAAgB;AAC7B,cAAc,sBAAsB;AACpC;AACA,uCAAuC,eAAe;AACtD;AACA;AACA;AACA,gCAAgC,6CAA6C,EAAE;AAC/E;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;;AAEA;AACA,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,IAAI;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,UAAU,OAAO;AACjB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,+BAA+B,mBAAmB;AAClD,8BAA8B,kBAAkB;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;;AAEvB","file":"highlight-js-lib-core.js","sourcesContent":["function deepFreeze(obj) {\n if (obj instanceof Map) {\n obj.clear = obj.delete = obj.set = function () {\n throw new Error('map is read-only');\n };\n } else if (obj instanceof Set) {\n obj.add = obj.clear = obj.delete = function () {\n throw new Error('set is read-only');\n };\n }\n\n // Freeze self\n Object.freeze(obj);\n\n Object.getOwnPropertyNames(obj).forEach(function (name) {\n var prop = obj[name];\n\n // Freeze prop if it is an object\n if (typeof prop == 'object' && !Object.isFrozen(prop)) {\n deepFreeze(prop);\n }\n });\n\n return obj;\n}\n\nvar deepFreezeEs6 = deepFreeze;\nvar _default = deepFreeze;\ndeepFreezeEs6.default = _default;\n\n/** @implements CallbackResponse */\nclass Response {\n /**\n * @param {CompiledMode} mode\n */\n constructor(mode) {\n // eslint-disable-next-line no-undefined\n if (mode.data === undefined) mode.data = {};\n\n this.data = mode.data;\n this.isMatchIgnored = false;\n }\n\n ignoreMatch() {\n this.isMatchIgnored = true;\n }\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHTML(value) {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * performs a shallow merge of multiple objects into one\n *\n * @template T\n * @param {T} original\n * @param {Record[]} objects\n * @returns {T} a single new object\n */\nfunction inherit(original, ...objects) {\n /** @type Record */\n const result = Object.create(null);\n\n for (const key in original) {\n result[key] = original[key];\n }\n objects.forEach(function(obj) {\n for (const key in obj) {\n result[key] = obj[key];\n }\n });\n return /** @type {T} */ (result);\n}\n\n/**\n * @typedef {object} Renderer\n * @property {(text: string) => void} addText\n * @property {(node: Node) => void} openNode\n * @property {(node: Node) => void} closeNode\n * @property {() => string} value\n */\n\n/** @typedef {{kind?: string, sublanguage?: boolean}} Node */\n/** @typedef {{walk: (r: Renderer) => void}} Tree */\n/** */\n\nconst SPAN_CLOSE = '
';\n\n/**\n * Determines if a node needs to be wrapped in \n *\n * @param {Node} node */\nconst emitsWrappingTags = (node) => {\n return !!node.kind;\n};\n\n/** @type {Renderer} */\nclass HTMLRenderer {\n /**\n * Creates a new HTMLRenderer\n *\n * @param {Tree} parseTree - the parse tree (must support `walk` API)\n * @param {{classPrefix: string}} options\n */\n constructor(parseTree, options) {\n this.buffer = \"\";\n this.classPrefix = options.classPrefix;\n parseTree.walk(this);\n }\n\n /**\n * Adds texts to the output stream\n *\n * @param {string} text */\n addText(text) {\n this.buffer += escapeHTML(text);\n }\n\n /**\n * Adds a node open to the output stream (if needed)\n *\n * @param {Node} node */\n openNode(node) {\n if (!emitsWrappingTags(node)) return;\n\n let className = node.kind;\n if (!node.sublanguage) {\n className = `${this.classPrefix}${className}`;\n }\n this.span(className);\n }\n\n /**\n * Adds a node close to the output stream (if needed)\n *\n * @param {Node} node */\n closeNode(node) {\n if (!emitsWrappingTags(node)) return;\n\n this.buffer += SPAN_CLOSE;\n }\n\n /**\n * returns the accumulated buffer\n */\n value() {\n return this.buffer;\n }\n\n // helpers\n\n /**\n * Builds a span element\n *\n * @param {string} className */\n span(className) {\n this.buffer += ``;\n }\n}\n\n/** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} | string} Node */\n/** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} } DataNode */\n/** */\n\nclass TokenTree {\n constructor() {\n /** @type DataNode */\n this.rootNode = { children: [] };\n this.stack = [this.rootNode];\n }\n\n get top() {\n return this.stack[this.stack.length - 1];\n }\n\n get root() { return this.rootNode; }\n\n /** @param {Node} node */\n add(node) {\n this.top.children.push(node);\n }\n\n /** @param {string} kind */\n openNode(kind) {\n /** @type Node */\n const node = { kind, children: [] };\n this.add(node);\n this.stack.push(node);\n }\n\n closeNode() {\n if (this.stack.length > 1) {\n return this.stack.pop();\n }\n // eslint-disable-next-line no-undefined\n return undefined;\n }\n\n closeAllNodes() {\n while (this.closeNode());\n }\n\n toJSON() {\n return JSON.stringify(this.rootNode, null, 4);\n }\n\n /**\n * @typedef { import(\"./html_renderer\").Renderer } Renderer\n * @param {Renderer} builder\n */\n walk(builder) {\n // this does not\n return this.constructor._walk(builder, this.rootNode);\n // this works\n // return TokenTree._walk(builder, this.rootNode);\n }\n\n /**\n * @param {Renderer} builder\n * @param {Node} node\n */\n static _walk(builder, node) {\n if (typeof node === \"string\") {\n builder.addText(node);\n } else if (node.children) {\n builder.openNode(node);\n node.children.forEach((child) => this._walk(builder, child));\n builder.closeNode(node);\n }\n return builder;\n }\n\n /**\n * @param {Node} node\n */\n static _collapse(node) {\n if (typeof node === \"string\") return;\n if (!node.children) return;\n\n if (node.children.every(el => typeof el === \"string\")) {\n // node.text = node.children.join(\"\");\n // delete node.children;\n node.children = [node.children.join(\"\")];\n } else {\n node.children.forEach((child) => {\n TokenTree._collapse(child);\n });\n }\n }\n}\n\n/**\n Currently this is all private API, but this is the minimal API necessary\n that an Emitter must implement to fully support the parser.\n\n Minimal interface:\n\n - addKeyword(text, kind)\n - addText(text)\n - addSublanguage(emitter, subLanguageName)\n - finalize()\n - openNode(kind)\n - closeNode()\n - closeAllNodes()\n - toHTML()\n\n*/\n\n/**\n * @implements {Emitter}\n */\nclass TokenTreeEmitter extends TokenTree {\n /**\n * @param {*} options\n */\n constructor(options) {\n super();\n this.options = options;\n }\n\n /**\n * @param {string} text\n * @param {string} kind\n */\n addKeyword(text, kind) {\n if (text === \"\") { return; }\n\n this.openNode(kind);\n this.addText(text);\n this.closeNode();\n }\n\n /**\n * @param {string} text\n */\n addText(text) {\n if (text === \"\") { return; }\n\n this.add(text);\n }\n\n /**\n * @param {Emitter & {root: DataNode}} emitter\n * @param {string} name\n */\n addSublanguage(emitter, name) {\n /** @type DataNode */\n const node = emitter.root;\n node.kind = name;\n node.sublanguage = true;\n this.add(node);\n }\n\n toHTML() {\n const renderer = new HTMLRenderer(this, this.options);\n return renderer.value();\n }\n\n finalize() {\n return true;\n }\n}\n\n/**\n * @param {string} value\n * @returns {RegExp}\n * */\nfunction escape(value) {\n return new RegExp(value.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'm');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n if (!re) return null;\n if (typeof re === \"string\") return re;\n\n return re.source;\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n const joined = args.map((x) => source(x)).join(\"\");\n return joined;\n}\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] } args\n * @returns {string}\n */\nfunction either(...args) {\n const joined = '(' + args.map((x) => source(x)).join(\"|\") + \")\";\n return joined;\n}\n\n/**\n * @param {RegExp} re\n * @returns {number}\n */\nfunction countMatchGroups(re) {\n return (new RegExp(re.toString() + '|')).exec('').length - 1;\n}\n\n/**\n * Does lexeme start with a regular expression match at the beginning\n * @param {RegExp} re\n * @param {string} lexeme\n */\nfunction startsWith(re, lexeme) {\n const match = re && re.exec(lexeme);\n return match && match.index === 0;\n}\n\n// BACKREF_RE matches an open parenthesis or backreference. To avoid\n// an incorrect parse, it additionally matches the following:\n// - [...] elements, where the meaning of parentheses and escapes change\n// - other escape sequences, so we do not misparse escape sequences as\n// interesting elements\n// - non-matching or lookahead parentheses, which do not capture. These\n// follow the '(' with a '?'.\nconst BACKREF_RE = /\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;\n\n// join logically computes regexps.join(separator), but fixes the\n// backreferences so they continue to match.\n// it also places each individual regular expression into it's own\n// match group, keeping track of the sequencing of those match groups\n// is currently an exercise for the caller. :-)\n/**\n * @param {(string | RegExp)[]} regexps\n * @param {string} separator\n * @returns {string}\n */\nfunction join(regexps, separator = \"|\") {\n let numCaptures = 0;\n\n return regexps.map((regex) => {\n numCaptures += 1;\n const offset = numCaptures;\n let re = source(regex);\n let out = '';\n\n while (re.length > 0) {\n const match = BACKREF_RE.exec(re);\n if (!match) {\n out += re;\n break;\n }\n out += re.substring(0, match.index);\n re = re.substring(match.index + match[0].length);\n if (match[0][0] === '\\\\' && match[1]) {\n // Adjust the backreference.\n out += '\\\\' + String(Number(match[1]) + offset);\n } else {\n out += match[0];\n if (match[0] === '(') {\n numCaptures++;\n }\n }\n }\n return out;\n }).map(re => `(${re})`).join(separator);\n}\n\n// Common regexps\nconst MATCH_NOTHING_RE = /\\b\\B/;\nconst IDENT_RE = '[a-zA-Z]\\\\w*';\nconst UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\nconst NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\nconst C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\nconst BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\nconst RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n/**\n* @param { Partial & {binary?: string | RegExp} } opts\n*/\nconst SHEBANG = (opts = {}) => {\n const beginShebang = /^#![ ]*\\//;\n if (opts.binary) {\n opts.begin = concat(\n beginShebang,\n /.*\\b/,\n opts.binary,\n /\\b.*/);\n }\n return inherit({\n className: 'meta',\n begin: beginShebang,\n end: /$/,\n relevance: 0,\n /** @type {ModeCallback} */\n \"on:begin\": (m, resp) => {\n if (m.index !== 0) resp.ignoreMatch();\n }\n }, opts);\n};\n\n// Common modes\nconst BACKSLASH_ESCAPE = {\n begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n};\nconst APOS_STRING_MODE = {\n className: 'string',\n begin: '\\'',\n end: '\\'',\n illegal: '\\\\n',\n contains: [BACKSLASH_ESCAPE]\n};\nconst QUOTE_STRING_MODE = {\n className: 'string',\n begin: '\"',\n end: '\"',\n illegal: '\\\\n',\n contains: [BACKSLASH_ESCAPE]\n};\nconst PHRASAL_WORDS_MODE = {\n begin: /\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n};\n/**\n * Creates a comment mode\n *\n * @param {string | RegExp} begin\n * @param {string | RegExp} end\n * @param {Mode | {}} [modeOptions]\n * @returns {Partial}\n */\nconst COMMENT = function(begin, end, modeOptions = {}) {\n const mode = inherit(\n {\n className: 'comment',\n begin,\n end,\n contains: []\n },\n modeOptions\n );\n mode.contains.push(PHRASAL_WORDS_MODE);\n mode.contains.push({\n className: 'doctag',\n begin: '(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):',\n relevance: 0\n });\n return mode;\n};\nconst C_LINE_COMMENT_MODE = COMMENT('//', '$');\nconst C_BLOCK_COMMENT_MODE = COMMENT('/\\\\*', '\\\\*/');\nconst HASH_COMMENT_MODE = COMMENT('#', '$');\nconst NUMBER_MODE = {\n className: 'number',\n begin: NUMBER_RE,\n relevance: 0\n};\nconst C_NUMBER_MODE = {\n className: 'number',\n begin: C_NUMBER_RE,\n relevance: 0\n};\nconst BINARY_NUMBER_MODE = {\n className: 'number',\n begin: BINARY_NUMBER_RE,\n relevance: 0\n};\nconst CSS_NUMBER_MODE = {\n className: 'number',\n begin: NUMBER_RE + '(' +\n '%|em|ex|ch|rem' +\n '|vw|vh|vmin|vmax' +\n '|cm|mm|in|pt|pc|px' +\n '|deg|grad|rad|turn' +\n '|s|ms' +\n '|Hz|kHz' +\n '|dpi|dpcm|dppx' +\n ')?',\n relevance: 0\n};\nconst REGEXP_MODE = {\n // this outer rule makes sure we actually have a WHOLE regex and not simply\n // an expression such as:\n //\n // 3 / something\n //\n // (which will then blow up when regex's `illegal` sees the newline)\n begin: /(?=\\/[^/\\n]*\\/)/,\n contains: [{\n className: 'regexp',\n begin: /\\//,\n end: /\\/[gimuy]*/,\n illegal: /\\n/,\n contains: [\n BACKSLASH_ESCAPE,\n {\n begin: /\\[/,\n end: /\\]/,\n relevance: 0,\n contains: [BACKSLASH_ESCAPE]\n }\n ]\n }]\n};\nconst TITLE_MODE = {\n className: 'title',\n begin: IDENT_RE,\n relevance: 0\n};\nconst UNDERSCORE_TITLE_MODE = {\n className: 'title',\n begin: UNDERSCORE_IDENT_RE,\n relevance: 0\n};\nconst METHOD_GUARD = {\n // excludes method names from keyword processing\n begin: '\\\\.\\\\s*' + UNDERSCORE_IDENT_RE,\n relevance: 0\n};\n\n/**\n * Adds end same as begin mechanics to a mode\n *\n * Your mode must include at least a single () match group as that first match\n * group is what is used for comparison\n * @param {Partial} mode\n */\nconst END_SAME_AS_BEGIN = function(mode) {\n return Object.assign(mode,\n {\n /** @type {ModeCallback} */\n 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },\n /** @type {ModeCallback} */\n 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }\n });\n};\n\nvar MODES = /*#__PURE__*/Object.freeze({\n __proto__: null,\n MATCH_NOTHING_RE: MATCH_NOTHING_RE,\n IDENT_RE: IDENT_RE,\n UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,\n NUMBER_RE: NUMBER_RE,\n C_NUMBER_RE: C_NUMBER_RE,\n BINARY_NUMBER_RE: BINARY_NUMBER_RE,\n RE_STARTERS_RE: RE_STARTERS_RE,\n SHEBANG: SHEBANG,\n BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,\n APOS_STRING_MODE: APOS_STRING_MODE,\n QUOTE_STRING_MODE: QUOTE_STRING_MODE,\n PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,\n COMMENT: COMMENT,\n C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,\n C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,\n HASH_COMMENT_MODE: HASH_COMMENT_MODE,\n NUMBER_MODE: NUMBER_MODE,\n C_NUMBER_MODE: C_NUMBER_MODE,\n BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,\n CSS_NUMBER_MODE: CSS_NUMBER_MODE,\n REGEXP_MODE: REGEXP_MODE,\n TITLE_MODE: TITLE_MODE,\n UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE,\n METHOD_GUARD: METHOD_GUARD,\n END_SAME_AS_BEGIN: END_SAME_AS_BEGIN\n});\n\n// Grammar extensions / plugins\n// See: https://github.com/highlightjs/highlight.js/issues/2833\n\n// Grammar extensions allow \"syntactic sugar\" to be added to the grammar modes\n// without requiring any underlying changes to the compiler internals.\n\n// `compileMatch` being the perfect small example of now allowing a grammar\n// author to write `match` when they desire to match a single expression rather\n// than being forced to use `begin`. The extension then just moves `match` into\n// `begin` when it runs. Ie, no features have been added, but we've just made\n// the experience of writing (and reading grammars) a little bit nicer.\n\n// ------\n\n// TODO: We need negative look-behind support to do this properly\n/**\n * Skip a match if it has a preceding dot\n *\n * This is used for `beginKeywords` to prevent matching expressions such as\n * `bob.keyword.do()`. The mode compiler automatically wires this up as a\n * special _internal_ 'on:begin' callback for modes with `beginKeywords`\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\nfunction skipIfhasPrecedingDot(match, response) {\n const before = match.input[match.index - 1];\n if (before === \".\") {\n response.ignoreMatch();\n }\n}\n\n\n/**\n * `beginKeywords` syntactic sugar\n * @type {CompilerExt}\n */\nfunction beginKeywords(mode, parent) {\n if (!parent) return;\n if (!mode.beginKeywords) return;\n\n // for languages with keywords that include non-word characters checking for\n // a word boundary is not sufficient, so instead we check for a word boundary\n // or whitespace - this does no harm in any case since our keyword engine\n // doesn't allow spaces in keywords anyways and we still check for the boundary\n // first\n mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\\\.)(?=\\\\b|\\\\s)';\n mode.__beforeBegin = skipIfhasPrecedingDot;\n mode.keywords = mode.keywords || mode.beginKeywords;\n delete mode.beginKeywords;\n\n // prevents double relevance, the keywords themselves provide\n // relevance, the mode doesn't need to double it\n // eslint-disable-next-line no-undefined\n if (mode.relevance === undefined) mode.relevance = 0;\n}\n\n/**\n * Allow `illegal` to contain an array of illegal values\n * @type {CompilerExt}\n */\nfunction compileIllegal(mode, _parent) {\n if (!Array.isArray(mode.illegal)) return;\n\n mode.illegal = either(...mode.illegal);\n}\n\n/**\n * `match` to match a single expression for readability\n * @type {CompilerExt}\n */\nfunction compileMatch(mode, _parent) {\n if (!mode.match) return;\n if (mode.begin || mode.end) throw new Error(\"begin & end are not supported with match\");\n\n mode.begin = mode.match;\n delete mode.match;\n}\n\n/**\n * provides the default 1 relevance to all modes\n * @type {CompilerExt}\n */\nfunction compileRelevance(mode, _parent) {\n // eslint-disable-next-line no-undefined\n if (mode.relevance === undefined) mode.relevance = 1;\n}\n\n// keywords that should have no default relevance value\nconst COMMON_KEYWORDS = [\n 'of',\n 'and',\n 'for',\n 'in',\n 'not',\n 'or',\n 'if',\n 'then',\n 'parent', // common variable name\n 'list', // common variable name\n 'value' // common variable name\n];\n\nconst DEFAULT_KEYWORD_CLASSNAME = \"keyword\";\n\n/**\n * Given raw keywords from a language definition, compile them.\n *\n * @param {string | Record | Array} rawKeywords\n * @param {boolean} caseInsensitive\n */\nfunction compileKeywords(rawKeywords, caseInsensitive, className = DEFAULT_KEYWORD_CLASSNAME) {\n /** @type KeywordDict */\n const compiledKeywords = {};\n\n // input can be a string of keywords, an array of keywords, or a object with\n // named keys representing className (which can then point to a string or array)\n if (typeof rawKeywords === 'string') {\n compileList(className, rawKeywords.split(\" \"));\n } else if (Array.isArray(rawKeywords)) {\n compileList(className, rawKeywords);\n } else {\n Object.keys(rawKeywords).forEach(function(className) {\n // collapse all our objects back into the parent object\n Object.assign(\n compiledKeywords,\n compileKeywords(rawKeywords[className], caseInsensitive, className)\n );\n });\n }\n return compiledKeywords;\n\n // ---\n\n /**\n * Compiles an individual list of keywords\n *\n * Ex: \"for if when while|5\"\n *\n * @param {string} className\n * @param {Array} keywordList\n */\n function compileList(className, keywordList) {\n if (caseInsensitive) {\n keywordList = keywordList.map(x => x.toLowerCase());\n }\n keywordList.forEach(function(keyword) {\n const pair = keyword.split('|');\n compiledKeywords[pair[0]] = [className, scoreForKeyword(pair[0], pair[1])];\n });\n }\n}\n\n/**\n * Returns the proper score for a given keyword\n *\n * Also takes into account comment keywords, which will be scored 0 UNLESS\n * another score has been manually assigned.\n * @param {string} keyword\n * @param {string} [providedScore]\n */\nfunction scoreForKeyword(keyword, providedScore) {\n // manual scores always win over common keywords\n // so you can force a score of 1 if you really insist\n if (providedScore) {\n return Number(providedScore);\n }\n\n return commonKeyword(keyword) ? 0 : 1;\n}\n\n/**\n * Determines if a given keyword is common or not\n *\n * @param {string} keyword */\nfunction commonKeyword(keyword) {\n return COMMON_KEYWORDS.includes(keyword.toLowerCase());\n}\n\n// compilation\n\n/**\n * Compiles a language definition result\n *\n * Given the raw result of a language definition (Language), compiles this so\n * that it is ready for highlighting code.\n * @param {Language} language\n * @param {{plugins: HLJSPlugin[]}} opts\n * @returns {CompiledLanguage}\n */\nfunction compileLanguage(language, { plugins }) {\n /**\n * Builds a regex with the case sensativility of the current language\n *\n * @param {RegExp | string} value\n * @param {boolean} [global]\n */\n function langRe(value, global) {\n return new RegExp(\n source(value),\n 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')\n );\n }\n\n /**\n Stores multiple regular expressions and allows you to quickly search for\n them all in a string simultaneously - returning the first match. It does\n this by creating a huge (a|b|c) regex - each individual item wrapped with ()\n and joined by `|` - using match groups to track position. When a match is\n found checking which position in the array has content allows us to figure\n out which of the original regexes / match groups triggered the match.\n\n The match object itself (the result of `Regex.exec`) is returned but also\n enhanced by merging in any meta-data that was registered with the regex.\n This is how we keep track of which mode matched, and what type of rule\n (`illegal`, `begin`, end, etc).\n */\n class MultiRegex {\n constructor() {\n this.matchIndexes = {};\n // @ts-ignore\n this.regexes = [];\n this.matchAt = 1;\n this.position = 0;\n }\n\n // @ts-ignore\n addRule(re, opts) {\n opts.position = this.position++;\n // @ts-ignore\n this.matchIndexes[this.matchAt] = opts;\n this.regexes.push([opts, re]);\n this.matchAt += countMatchGroups(re) + 1;\n }\n\n compile() {\n if (this.regexes.length === 0) {\n // avoids the need to check length every time exec is called\n // @ts-ignore\n this.exec = () => null;\n }\n const terminators = this.regexes.map(el => el[1]);\n this.matcherRe = langRe(join(terminators), true);\n this.lastIndex = 0;\n }\n\n /** @param {string} s */\n exec(s) {\n this.matcherRe.lastIndex = this.lastIndex;\n const match = this.matcherRe.exec(s);\n if (!match) { return null; }\n\n // eslint-disable-next-line no-undefined\n const i = match.findIndex((el, i) => i > 0 && el !== undefined);\n // @ts-ignore\n const matchData = this.matchIndexes[i];\n // trim off any earlier non-relevant match groups (ie, the other regex\n // match groups that make up the multi-matcher)\n match.splice(0, i);\n\n return Object.assign(match, matchData);\n }\n }\n\n /*\n Created to solve the key deficiently with MultiRegex - there is no way to\n test for multiple matches at a single location. Why would we need to do\n that? In the future a more dynamic engine will allow certain matches to be\n ignored. An example: if we matched say the 3rd regex in a large group but\n decided to ignore it - we'd need to started testing again at the 4th\n regex... but MultiRegex itself gives us no real way to do that.\n\n So what this class creates MultiRegexs on the fly for whatever search\n position they are needed.\n\n NOTE: These additional MultiRegex objects are created dynamically. For most\n grammars most of the time we will never actually need anything more than the\n first MultiRegex - so this shouldn't have too much overhead.\n\n Say this is our search group, and we match regex3, but wish to ignore it.\n\n regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0\n\n What we need is a new MultiRegex that only includes the remaining\n possibilities:\n\n regex4 | regex5 ' ie, startAt = 3\n\n This class wraps all that complexity up in a simple API... `startAt` decides\n where in the array of expressions to start doing the matching. It\n auto-increments, so if a match is found at position 2, then startAt will be\n set to 3. If the end is reached startAt will return to 0.\n\n MOST of the time the parser will be setting startAt manually to 0.\n */\n class ResumableMultiRegex {\n constructor() {\n // @ts-ignore\n this.rules = [];\n // @ts-ignore\n this.multiRegexes = [];\n this.count = 0;\n\n this.lastIndex = 0;\n this.regexIndex = 0;\n }\n\n // @ts-ignore\n getMatcher(index) {\n if (this.multiRegexes[index]) return this.multiRegexes[index];\n\n const matcher = new MultiRegex();\n this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));\n matcher.compile();\n this.multiRegexes[index] = matcher;\n return matcher;\n }\n\n resumingScanAtSamePosition() {\n return this.regexIndex !== 0;\n }\n\n considerAll() {\n this.regexIndex = 0;\n }\n\n // @ts-ignore\n addRule(re, opts) {\n this.rules.push([re, opts]);\n if (opts.type === \"begin\") this.count++;\n }\n\n /** @param {string} s */\n exec(s) {\n const m = this.getMatcher(this.regexIndex);\n m.lastIndex = this.lastIndex;\n let result = m.exec(s);\n\n // The following is because we have no easy way to say \"resume scanning at the\n // existing position but also skip the current rule ONLY\". What happens is\n // all prior rules are also skipped which can result in matching the wrong\n // thing. Example of matching \"booger\":\n\n // our matcher is [string, \"booger\", number]\n //\n // ....booger....\n\n // if \"booger\" is ignored then we'd really need a regex to scan from the\n // SAME position for only: [string, number] but ignoring \"booger\" (if it\n // was the first match), a simple resume would scan ahead who knows how\n // far looking only for \"number\", ignoring potential string matches (or\n // future \"booger\" matches that might be valid.)\n\n // So what we do: We execute two matchers, one resuming at the same\n // position, but the second full matcher starting at the position after:\n\n // /--- resume first regex match here (for [number])\n // |/---- full match here for [string, \"booger\", number]\n // vv\n // ....booger....\n\n // Which ever results in a match first is then used. So this 3-4 step\n // process essentially allows us to say \"match at this position, excluding\n // a prior rule that was ignored\".\n //\n // 1. Match \"booger\" first, ignore. Also proves that [string] does non match.\n // 2. Resume matching for [number]\n // 3. Match at index + 1 for [string, \"booger\", number]\n // 4. If #2 and #3 result in matches, which came first?\n if (this.resumingScanAtSamePosition()) {\n if (result && result.index === this.lastIndex) ; else { // use the second matcher result\n const m2 = this.getMatcher(0);\n m2.lastIndex = this.lastIndex + 1;\n result = m2.exec(s);\n }\n }\n\n if (result) {\n this.regexIndex += result.position + 1;\n if (this.regexIndex === this.count) {\n // wrap-around to considering all matches again\n this.considerAll();\n }\n }\n\n return result;\n }\n }\n\n /**\n * Given a mode, builds a huge ResumableMultiRegex that can be used to walk\n * the content and find matches.\n *\n * @param {CompiledMode} mode\n * @returns {ResumableMultiRegex}\n */\n function buildModeRegex(mode) {\n const mm = new ResumableMultiRegex();\n\n mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: \"begin\" }));\n\n if (mode.terminatorEnd) {\n mm.addRule(mode.terminatorEnd, { type: \"end\" });\n }\n if (mode.illegal) {\n mm.addRule(mode.illegal, { type: \"illegal\" });\n }\n\n return mm;\n }\n\n /** skip vs abort vs ignore\n *\n * @skip - The mode is still entered and exited normally (and contains rules apply),\n * but all content is held and added to the parent buffer rather than being\n * output when the mode ends. Mostly used with `sublanguage` to build up\n * a single large buffer than can be parsed by sublanguage.\n *\n * - The mode begin ands ends normally.\n * - Content matched is added to the parent mode buffer.\n * - The parser cursor is moved forward normally.\n *\n * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it\n * never matched) but DOES NOT continue to match subsequent `contains`\n * modes. Abort is bad/suboptimal because it can result in modes\n * farther down not getting applied because an earlier rule eats the\n * content but then aborts.\n *\n * - The mode does not begin.\n * - Content matched by `begin` is added to the mode buffer.\n * - The parser cursor is moved forward accordingly.\n *\n * @ignore - Ignores the mode (as if it never matched) and continues to match any\n * subsequent `contains` modes. Ignore isn't technically possible with\n * the current parser implementation.\n *\n * - The mode does not begin.\n * - Content matched by `begin` is ignored.\n * - The parser cursor is not moved forward.\n */\n\n /**\n * Compiles an individual mode\n *\n * This can raise an error if the mode contains certain detectable known logic\n * issues.\n * @param {Mode} mode\n * @param {CompiledMode | null} [parent]\n * @returns {CompiledMode | never}\n */\n function compileMode(mode, parent) {\n const cmode = /** @type CompiledMode */ (mode);\n if (mode.isCompiled) return cmode;\n\n [\n // do this early so compiler extensions generally don't have to worry about\n // the distinction between match/begin\n compileMatch\n ].forEach(ext => ext(mode, parent));\n\n language.compilerExtensions.forEach(ext => ext(mode, parent));\n\n // __beforeBegin is considered private API, internal use only\n mode.__beforeBegin = null;\n\n [\n beginKeywords,\n // do this later so compiler extensions that come earlier have access to the\n // raw array if they wanted to perhaps manipulate it, etc.\n compileIllegal,\n // default to 1 relevance if not specified\n compileRelevance\n ].forEach(ext => ext(mode, parent));\n\n mode.isCompiled = true;\n\n let keywordPattern = null;\n if (typeof mode.keywords === \"object\") {\n keywordPattern = mode.keywords.$pattern;\n delete mode.keywords.$pattern;\n }\n\n if (mode.keywords) {\n mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);\n }\n\n // both are not allowed\n if (mode.lexemes && keywordPattern) {\n throw new Error(\"ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) \");\n }\n\n // `mode.lexemes` was the old standard before we added and now recommend\n // using `keywords.$pattern` to pass the keyword pattern\n keywordPattern = keywordPattern || mode.lexemes || /\\w+/;\n cmode.keywordPatternRe = langRe(keywordPattern, true);\n\n if (parent) {\n if (!mode.begin) mode.begin = /\\B|\\b/;\n cmode.beginRe = langRe(mode.begin);\n if (mode.endSameAsBegin) mode.end = mode.begin;\n if (!mode.end && !mode.endsWithParent) mode.end = /\\B|\\b/;\n if (mode.end) cmode.endRe = langRe(mode.end);\n cmode.terminatorEnd = source(mode.end) || '';\n if (mode.endsWithParent && parent.terminatorEnd) {\n cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;\n }\n }\n if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));\n if (!mode.contains) mode.contains = [];\n\n mode.contains = [].concat(...mode.contains.map(function(c) {\n return expandOrCloneMode(c === 'self' ? mode : c);\n }));\n mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });\n\n if (mode.starts) {\n compileMode(mode.starts, parent);\n }\n\n cmode.matcher = buildModeRegex(cmode);\n return cmode;\n }\n\n if (!language.compilerExtensions) language.compilerExtensions = [];\n\n // self is not valid at the top-level\n if (language.contains && language.contains.includes('self')) {\n throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");\n }\n\n // we need a null object, which inherit will guarantee\n language.classNameAliases = inherit(language.classNameAliases || {});\n\n return compileMode(/** @type Mode */ (language));\n}\n\n/**\n * Determines if a mode has a dependency on it's parent or not\n *\n * If a mode does have a parent dependency then often we need to clone it if\n * it's used in multiple places so that each copy points to the correct parent,\n * where-as modes without a parent can often safely be re-used at the bottom of\n * a mode chain.\n *\n * @param {Mode | null} mode\n * @returns {boolean} - is there a dependency on the parent?\n * */\nfunction dependencyOnParent(mode) {\n if (!mode) return false;\n\n return mode.endsWithParent || dependencyOnParent(mode.starts);\n}\n\n/**\n * Expands a mode or clones it if necessary\n *\n * This is necessary for modes with parental dependenceis (see notes on\n * `dependencyOnParent`) and for nodes that have `variants` - which must then be\n * exploded into their own individual modes at compile time.\n *\n * @param {Mode} mode\n * @returns {Mode | Mode[]}\n * */\nfunction expandOrCloneMode(mode) {\n if (mode.variants && !mode.cachedVariants) {\n mode.cachedVariants = mode.variants.map(function(variant) {\n return inherit(mode, { variants: null }, variant);\n });\n }\n\n // EXPAND\n // if we have variants then essentially \"replace\" the mode with the variants\n // this happens in compileMode, where this function is called from\n if (mode.cachedVariants) {\n return mode.cachedVariants;\n }\n\n // CLONE\n // if we have dependencies on parents then we need a unique\n // instance of ourselves, so we can be reused with many\n // different parents without issue\n if (dependencyOnParent(mode)) {\n return inherit(mode, { starts: mode.starts ? inherit(mode.starts) : null });\n }\n\n if (Object.isFrozen(mode)) {\n return inherit(mode);\n }\n\n // no special dependency issues, just return ourselves\n return mode;\n}\n\nvar version = \"10.7.2\";\n\n// @ts-nocheck\n\nfunction hasValueOrEmptyAttribute(value) {\n return Boolean(value || value === \"\");\n}\n\nfunction BuildVuePlugin(hljs) {\n const Component = {\n props: [\"language\", \"code\", \"autodetect\"],\n data: function() {\n return {\n detectedLanguage: \"\",\n unknownLanguage: false\n };\n },\n computed: {\n className() {\n if (this.unknownLanguage) return \"\";\n\n return \"hljs \" + this.detectedLanguage;\n },\n highlighted() {\n // no idea what language to use, return raw code\n if (!this.autoDetect && !hljs.getLanguage(this.language)) {\n console.warn(`The language \"${this.language}\" you specified could not be found.`);\n this.unknownLanguage = true;\n return escapeHTML(this.code);\n }\n\n let result = {};\n if (this.autoDetect) {\n result = hljs.highlightAuto(this.code);\n this.detectedLanguage = result.language;\n } else {\n result = hljs.highlight(this.language, this.code, this.ignoreIllegals);\n this.detectedLanguage = this.language;\n }\n return result.value;\n },\n autoDetect() {\n return !this.language || hasValueOrEmptyAttribute(this.autodetect);\n },\n ignoreIllegals() {\n return true;\n }\n },\n // this avoids needing to use a whole Vue compilation pipeline just\n // to build Highlight.js\n render(createElement) {\n return createElement(\"pre\", {}, [\n createElement(\"code\", {\n class: this.className,\n domProps: { innerHTML: this.highlighted }\n })\n ]);\n }\n // template: `
`\n };\n\n const VuePlugin = {\n install(Vue) {\n Vue.component('highlightjs', Component);\n }\n };\n\n return { Component, VuePlugin };\n}\n\n/* plugin itself */\n\n/** @type {HLJSPlugin} */\nconst mergeHTMLPlugin = {\n \"after:highlightElement\": ({ el, result, text }) => {\n const originalStream = nodeStream(el);\n if (!originalStream.length) return;\n\n const resultNode = document.createElement('div');\n resultNode.innerHTML = result.value;\n result.value = mergeStreams(originalStream, nodeStream(resultNode), text);\n }\n};\n\n/* Stream merging support functions */\n\n/**\n * @typedef Event\n * @property {'start'|'stop'} event\n * @property {number} offset\n * @property {Node} node\n */\n\n/**\n * @param {Node} node\n */\nfunction tag(node) {\n return node.nodeName.toLowerCase();\n}\n\n/**\n * @param {Node} node\n */\nfunction nodeStream(node) {\n /** @type Event[] */\n const result = [];\n (function _nodeStream(node, offset) {\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 3) {\n offset += child.nodeValue.length;\n } else if (child.nodeType === 1) {\n result.push({\n event: 'start',\n offset: offset,\n node: child\n });\n offset = _nodeStream(child, offset);\n // Prevent void elements from having an end tag that would actually\n // double them in the output. There are more void elements in HTML\n // but we list only those realistically expected in code display.\n if (!tag(child).match(/br|hr|img|input/)) {\n result.push({\n event: 'stop',\n offset: offset,\n node: child\n });\n }\n }\n }\n return offset;\n })(node, 0);\n return result;\n}\n\n/**\n * @param {any} original - the original stream\n * @param {any} highlighted - stream of the highlighted source\n * @param {string} value - the original source itself\n */\nfunction mergeStreams(original, highlighted, value) {\n let processed = 0;\n let result = '';\n const nodeStack = [];\n\n function selectStream() {\n if (!original.length || !highlighted.length) {\n return original.length ? original : highlighted;\n }\n if (original[0].offset !== highlighted[0].offset) {\n return (original[0].offset < highlighted[0].offset) ? original : highlighted;\n }\n\n /*\n To avoid starting the stream just before it should stop the order is\n ensured that original always starts first and closes last:\n\n if (event1 == 'start' && event2 == 'start')\n return original;\n if (event1 == 'start' && event2 == 'stop')\n return highlighted;\n if (event1 == 'stop' && event2 == 'start')\n return original;\n if (event1 == 'stop' && event2 == 'stop')\n return highlighted;\n\n ... which is collapsed to:\n */\n return highlighted[0].event === 'start' ? original : highlighted;\n }\n\n /**\n * @param {Node} node\n */\n function open(node) {\n /** @param {Attr} attr */\n function attributeString(attr) {\n return ' ' + attr.nodeName + '=\"' + escapeHTML(attr.value) + '\"';\n }\n // @ts-ignore\n result += '<' + tag(node) + [].map.call(node.attributes, attributeString).join('') + '>';\n }\n\n /**\n * @param {Node} node\n */\n function close(node) {\n result += '' + tag(node) + '>';\n }\n\n /**\n * @param {Event} event\n */\n function render(event) {\n (event.event === 'start' ? open : close)(event.node);\n }\n\n while (original.length || highlighted.length) {\n let stream = selectStream();\n result += escapeHTML(value.substring(processed, stream[0].offset));\n processed = stream[0].offset;\n if (stream === original) {\n /*\n On any opening or closing tag of the original markup we first close\n the entire highlighted node stack, then render the original tag along\n with all the following original tags at the same offset and then\n reopen all the tags on the highlighted stack.\n */\n nodeStack.reverse().forEach(close);\n do {\n render(stream.splice(0, 1)[0]);\n stream = selectStream();\n } while (stream === original && stream.length && stream[0].offset === processed);\n nodeStack.reverse().forEach(open);\n } else {\n if (stream[0].event === 'start') {\n nodeStack.push(stream[0].node);\n } else {\n nodeStack.pop();\n }\n render(stream.splice(0, 1)[0]);\n }\n }\n return result + escapeHTML(value.substr(processed));\n}\n\n/*\n\nFor the reasoning behind this please see:\nhttps://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419\n\n*/\n\n/**\n * @type {Record}\n */\nconst seenDeprecations = {};\n\n/**\n * @param {string} message\n */\nconst error = (message) => {\n console.error(message);\n};\n\n/**\n * @param {string} message\n * @param {any} args\n */\nconst warn = (message, ...args) => {\n console.log(`WARN: ${message}`, ...args);\n};\n\n/**\n * @param {string} version\n * @param {string} message\n */\nconst deprecated = (version, message) => {\n if (seenDeprecations[`${version}/${message}`]) return;\n\n console.log(`Deprecated as of ${version}. ${message}`);\n seenDeprecations[`${version}/${message}`] = true;\n};\n\n/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\nconst escape$1 = escapeHTML;\nconst inherit$1 = inherit;\nconst NO_MATCH = Symbol(\"nomatch\");\n\n/**\n * @param {any} hljs - object that is extended (legacy)\n * @returns {HLJSApi}\n */\nconst HLJS = function(hljs) {\n // Global internal variables used within the highlight.js library.\n /** @type {Record} */\n const languages = Object.create(null);\n /** @type {Record} */\n const aliases = Object.create(null);\n /** @type {HLJSPlugin[]} */\n const plugins = [];\n\n // safe/production mode - swallows more errors, tries to keep running\n // even if a single syntax or parse hits a fatal error\n let SAFE_MODE = true;\n const fixMarkupRe = /(^(<[^>]+>|\\t|)+|\\n)/gm;\n const LANGUAGE_NOT_FOUND = \"Could not find the language '{}', did you forget to load/include a language module?\";\n /** @type {Language} */\n const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };\n\n // Global options used when within external APIs. This is modified when\n // calling the `hljs.configure` function.\n /** @type HLJSOptions */\n let options = {\n noHighlightRe: /^(no-?highlight)$/i,\n languageDetectRe: /\\blang(?:uage)?-([\\w-]+)\\b/i,\n classPrefix: 'hljs-',\n tabReplace: null,\n useBR: false,\n languages: null,\n // beta configuration options, subject to change, welcome to discuss\n // https://github.com/highlightjs/highlight.js/issues/1086\n __emitter: TokenTreeEmitter\n };\n\n /* Utility functions */\n\n /**\n * Tests a language name to see if highlighting should be skipped\n * @param {string} languageName\n */\n function shouldNotHighlight(languageName) {\n return options.noHighlightRe.test(languageName);\n }\n\n /**\n * @param {HighlightedHTMLElement} block - the HTML element to determine language for\n */\n function blockLanguage(block) {\n let classes = block.className + ' ';\n\n classes += block.parentNode ? block.parentNode.className : '';\n\n // language-* takes precedence over non-prefixed class names.\n const match = options.languageDetectRe.exec(classes);\n if (match) {\n const language = getLanguage(match[1]);\n if (!language) {\n warn(LANGUAGE_NOT_FOUND.replace(\"{}\", match[1]));\n warn(\"Falling back to no-highlight mode for this block.\", block);\n }\n return language ? match[1] : 'no-highlight';\n }\n\n return classes\n .split(/\\s+/)\n .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));\n }\n\n /**\n * Core highlighting function.\n *\n * OLD API\n * highlight(lang, code, ignoreIllegals, continuation)\n *\n * NEW API\n * highlight(code, {lang, ignoreIllegals})\n *\n * @param {string} codeOrlanguageName - the language to use for highlighting\n * @param {string | HighlightOptions} optionsOrCode - the code to highlight\n * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n * @param {CompiledMode} [continuation] - current continuation mode, if any\n *\n * @returns {HighlightResult} Result - an object that represents the result\n * @property {string} language - the language name\n * @property {number} relevance - the relevance score\n * @property {string} value - the highlighted HTML code\n * @property {string} code - the original raw code\n * @property {CompiledMode} top - top of the current mode stack\n * @property {boolean} illegal - indicates whether any illegal matches were found\n */\n function highlight(codeOrlanguageName, optionsOrCode, ignoreIllegals, continuation) {\n let code = \"\";\n let languageName = \"\";\n if (typeof optionsOrCode === \"object\") {\n code = codeOrlanguageName;\n ignoreIllegals = optionsOrCode.ignoreIllegals;\n languageName = optionsOrCode.language;\n // continuation not supported at all via the new API\n // eslint-disable-next-line no-undefined\n continuation = undefined;\n } else {\n // old API\n deprecated(\"10.7.0\", \"highlight(lang, code, ...args) has been deprecated.\");\n deprecated(\"10.7.0\", \"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\");\n languageName = codeOrlanguageName;\n code = optionsOrCode;\n }\n\n /** @type {BeforeHighlightContext} */\n const context = {\n code,\n language: languageName\n };\n // the plugin can change the desired language or the code to be highlighted\n // just be changing the object it was passed\n fire(\"before:highlight\", context);\n\n // a before plugin can usurp the result completely by providing it's own\n // in which case we don't even need to call highlight\n const result = context.result\n ? context.result\n : _highlight(context.language, context.code, ignoreIllegals, continuation);\n\n result.code = context.code;\n // the plugin can change anything in result to suite it\n fire(\"after:highlight\", result);\n\n return result;\n }\n\n /**\n * private highlight that's used internally and does not fire callbacks\n *\n * @param {string} languageName - the language to use for highlighting\n * @param {string} codeToHighlight - the code to highlight\n * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n * @param {CompiledMode?} [continuation] - current continuation mode, if any\n * @returns {HighlightResult} - result of the highlight operation\n */\n function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {\n /**\n * Return keyword data if a match is a keyword\n * @param {CompiledMode} mode - current mode\n * @param {RegExpMatchArray} match - regexp match data\n * @returns {KeywordData | false}\n */\n function keywordData(mode, match) {\n const matchText = language.case_insensitive ? match[0].toLowerCase() : match[0];\n return Object.prototype.hasOwnProperty.call(mode.keywords, matchText) && mode.keywords[matchText];\n }\n\n function processKeywords() {\n if (!top.keywords) {\n emitter.addText(modeBuffer);\n return;\n }\n\n let lastIndex = 0;\n top.keywordPatternRe.lastIndex = 0;\n let match = top.keywordPatternRe.exec(modeBuffer);\n let buf = \"\";\n\n while (match) {\n buf += modeBuffer.substring(lastIndex, match.index);\n const data = keywordData(top, match);\n if (data) {\n const [kind, keywordRelevance] = data;\n emitter.addText(buf);\n buf = \"\";\n\n relevance += keywordRelevance;\n if (kind.startsWith(\"_\")) {\n // _ implied for relevance only, do not highlight\n // by applying a class name\n buf += match[0];\n } else {\n const cssClass = language.classNameAliases[kind] || kind;\n emitter.addKeyword(match[0], cssClass);\n }\n } else {\n buf += match[0];\n }\n lastIndex = top.keywordPatternRe.lastIndex;\n match = top.keywordPatternRe.exec(modeBuffer);\n }\n buf += modeBuffer.substr(lastIndex);\n emitter.addText(buf);\n }\n\n function processSubLanguage() {\n if (modeBuffer === \"\") return;\n /** @type HighlightResult */\n let result = null;\n\n if (typeof top.subLanguage === 'string') {\n if (!languages[top.subLanguage]) {\n emitter.addText(modeBuffer);\n return;\n }\n result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);\n continuations[top.subLanguage] = /** @type {CompiledMode} */ (result.top);\n } else {\n result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);\n }\n\n // Counting embedded language score towards the host language may be disabled\n // with zeroing the containing mode relevance. Use case in point is Markdown that\n // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n // score.\n if (top.relevance > 0) {\n relevance += result.relevance;\n }\n emitter.addSublanguage(result.emitter, result.language);\n }\n\n function processBuffer() {\n if (top.subLanguage != null) {\n processSubLanguage();\n } else {\n processKeywords();\n }\n modeBuffer = '';\n }\n\n /**\n * @param {Mode} mode - new mode to start\n */\n function startNewMode(mode) {\n if (mode.className) {\n emitter.openNode(language.classNameAliases[mode.className] || mode.className);\n }\n top = Object.create(mode, { parent: { value: top } });\n return top;\n }\n\n /**\n * @param {CompiledMode } mode - the mode to potentially end\n * @param {RegExpMatchArray} match - the latest match\n * @param {string} matchPlusRemainder - match plus remainder of content\n * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode\n */\n function endOfMode(mode, match, matchPlusRemainder) {\n let matched = startsWith(mode.endRe, matchPlusRemainder);\n\n if (matched) {\n if (mode[\"on:end\"]) {\n const resp = new Response(mode);\n mode[\"on:end\"](match, resp);\n if (resp.isMatchIgnored) matched = false;\n }\n\n if (matched) {\n while (mode.endsParent && mode.parent) {\n mode = mode.parent;\n }\n return mode;\n }\n }\n // even if on:end fires an `ignore` it's still possible\n // that we might trigger the end node because of a parent mode\n if (mode.endsWithParent) {\n return endOfMode(mode.parent, match, matchPlusRemainder);\n }\n }\n\n /**\n * Handle matching but then ignoring a sequence of text\n *\n * @param {string} lexeme - string containing full match text\n */\n function doIgnore(lexeme) {\n if (top.matcher.regexIndex === 0) {\n // no more regexs to potentially match here, so we move the cursor forward one\n // space\n modeBuffer += lexeme[0];\n return 1;\n } else {\n // no need to move the cursor, we still have additional regexes to try and\n // match at this very spot\n resumeScanAtSamePosition = true;\n return 0;\n }\n }\n\n /**\n * Handle the start of a new potential mode match\n *\n * @param {EnhancedMatch} match - the current match\n * @returns {number} how far to advance the parse cursor\n */\n function doBeginMatch(match) {\n const lexeme = match[0];\n const newMode = match.rule;\n\n const resp = new Response(newMode);\n // first internal before callbacks, then the public ones\n const beforeCallbacks = [newMode.__beforeBegin, newMode[\"on:begin\"]];\n for (const cb of beforeCallbacks) {\n if (!cb) continue;\n cb(match, resp);\n if (resp.isMatchIgnored) return doIgnore(lexeme);\n }\n\n if (newMode && newMode.endSameAsBegin) {\n newMode.endRe = escape(lexeme);\n }\n\n if (newMode.skip) {\n modeBuffer += lexeme;\n } else {\n if (newMode.excludeBegin) {\n modeBuffer += lexeme;\n }\n processBuffer();\n if (!newMode.returnBegin && !newMode.excludeBegin) {\n modeBuffer = lexeme;\n }\n }\n startNewMode(newMode);\n // if (mode[\"after:begin\"]) {\n // let resp = new Response(mode);\n // mode[\"after:begin\"](match, resp);\n // }\n return newMode.returnBegin ? 0 : lexeme.length;\n }\n\n /**\n * Handle the potential end of mode\n *\n * @param {RegExpMatchArray} match - the current match\n */\n function doEndMatch(match) {\n const lexeme = match[0];\n const matchPlusRemainder = codeToHighlight.substr(match.index);\n\n const endMode = endOfMode(top, match, matchPlusRemainder);\n if (!endMode) { return NO_MATCH; }\n\n const origin = top;\n if (origin.skip) {\n modeBuffer += lexeme;\n } else {\n if (!(origin.returnEnd || origin.excludeEnd)) {\n modeBuffer += lexeme;\n }\n processBuffer();\n if (origin.excludeEnd) {\n modeBuffer = lexeme;\n }\n }\n do {\n if (top.className) {\n emitter.closeNode();\n }\n if (!top.skip && !top.subLanguage) {\n relevance += top.relevance;\n }\n top = top.parent;\n } while (top !== endMode.parent);\n if (endMode.starts) {\n if (endMode.endSameAsBegin) {\n endMode.starts.endRe = endMode.endRe;\n }\n startNewMode(endMode.starts);\n }\n return origin.returnEnd ? 0 : lexeme.length;\n }\n\n function processContinuations() {\n const list = [];\n for (let current = top; current !== language; current = current.parent) {\n if (current.className) {\n list.unshift(current.className);\n }\n }\n list.forEach(item => emitter.openNode(item));\n }\n\n /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */\n let lastMatch = {};\n\n /**\n * Process an individual match\n *\n * @param {string} textBeforeMatch - text preceeding the match (since the last match)\n * @param {EnhancedMatch} [match] - the match itself\n */\n function processLexeme(textBeforeMatch, match) {\n const lexeme = match && match[0];\n\n // add non-matched text to the current mode buffer\n modeBuffer += textBeforeMatch;\n\n if (lexeme == null) {\n processBuffer();\n return 0;\n }\n\n // we've found a 0 width match and we're stuck, so we need to advance\n // this happens when we have badly behaved rules that have optional matchers to the degree that\n // sometimes they can end up matching nothing at all\n // Ref: https://github.com/highlightjs/highlight.js/issues/2140\n if (lastMatch.type === \"begin\" && match.type === \"end\" && lastMatch.index === match.index && lexeme === \"\") {\n // spit the \"skipped\" character that our regex choked on back into the output sequence\n modeBuffer += codeToHighlight.slice(match.index, match.index + 1);\n if (!SAFE_MODE) {\n /** @type {AnnotatedError} */\n const err = new Error('0 width match regex');\n err.languageName = languageName;\n err.badRule = lastMatch.rule;\n throw err;\n }\n return 1;\n }\n lastMatch = match;\n\n if (match.type === \"begin\") {\n return doBeginMatch(match);\n } else if (match.type === \"illegal\" && !ignoreIllegals) {\n // illegal match, we do not continue processing\n /** @type {AnnotatedError} */\n const err = new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.className || '') + '\"');\n err.mode = top;\n throw err;\n } else if (match.type === \"end\") {\n const processed = doEndMatch(match);\n if (processed !== NO_MATCH) {\n return processed;\n }\n }\n\n // edge case for when illegal matches $ (end of line) which is technically\n // a 0 width match but not a begin/end match so it's not caught by the\n // first handler (when ignoreIllegals is true)\n if (match.type === \"illegal\" && lexeme === \"\") {\n // advance so we aren't stuck in an infinite loop\n return 1;\n }\n\n // infinite loops are BAD, this is a last ditch catch all. if we have a\n // decent number of iterations yet our index (cursor position in our\n // parsing) still 3x behind our index then something is very wrong\n // so we bail\n if (iterations > 100000 && iterations > match.index * 3) {\n const err = new Error('potential infinite loop, way more iterations than matches');\n throw err;\n }\n\n /*\n Why might be find ourselves here? Only one occasion now. An end match that was\n triggered but could not be completed. When might this happen? When an `endSameasBegin`\n rule sets the end rule to a specific match. Since the overall mode termination rule that's\n being used to scan the text isn't recompiled that means that any match that LOOKS like\n the end (but is not, because it is not an exact match to the beginning) will\n end up here. A definite end match, but when `doEndMatch` tries to \"reapply\"\n the end rule and fails to match, we wind up here, and just silently ignore the end.\n\n This causes no real harm other than stopping a few times too many.\n */\n\n modeBuffer += lexeme;\n return lexeme.length;\n }\n\n const language = getLanguage(languageName);\n if (!language) {\n error(LANGUAGE_NOT_FOUND.replace(\"{}\", languageName));\n throw new Error('Unknown language: \"' + languageName + '\"');\n }\n\n const md = compileLanguage(language, { plugins });\n let result = '';\n /** @type {CompiledMode} */\n let top = continuation || md;\n /** @type Record */\n const continuations = {}; // keep continuations for sub-languages\n const emitter = new options.__emitter(options);\n processContinuations();\n let modeBuffer = '';\n let relevance = 0;\n let index = 0;\n let iterations = 0;\n let resumeScanAtSamePosition = false;\n\n try {\n top.matcher.considerAll();\n\n for (;;) {\n iterations++;\n if (resumeScanAtSamePosition) {\n // only regexes not matched previously will now be\n // considered for a potential match\n resumeScanAtSamePosition = false;\n } else {\n top.matcher.considerAll();\n }\n top.matcher.lastIndex = index;\n\n const match = top.matcher.exec(codeToHighlight);\n // console.log(\"match\", match[0], match.rule && match.rule.begin)\n\n if (!match) break;\n\n const beforeMatch = codeToHighlight.substring(index, match.index);\n const processedCount = processLexeme(beforeMatch, match);\n index = match.index + processedCount;\n }\n processLexeme(codeToHighlight.substr(index));\n emitter.closeAllNodes();\n emitter.finalize();\n result = emitter.toHTML();\n\n return {\n // avoid possible breakage with v10 clients expecting\n // this to always be an integer\n relevance: Math.floor(relevance),\n value: result,\n language: languageName,\n illegal: false,\n emitter: emitter,\n top: top\n };\n } catch (err) {\n if (err.message && err.message.includes('Illegal')) {\n return {\n illegal: true,\n illegalBy: {\n msg: err.message,\n context: codeToHighlight.slice(index - 100, index + 100),\n mode: err.mode\n },\n sofar: result,\n relevance: 0,\n value: escape$1(codeToHighlight),\n emitter: emitter\n };\n } else if (SAFE_MODE) {\n return {\n illegal: false,\n relevance: 0,\n value: escape$1(codeToHighlight),\n emitter: emitter,\n language: languageName,\n top: top,\n errorRaised: err\n };\n } else {\n throw err;\n }\n }\n }\n\n /**\n * returns a valid highlight result, without actually doing any actual work,\n * auto highlight starts with this and it's possible for small snippets that\n * auto-detection may not find a better match\n * @param {string} code\n * @returns {HighlightResult}\n */\n function justTextHighlightResult(code) {\n const result = {\n relevance: 0,\n emitter: new options.__emitter(options),\n value: escape$1(code),\n illegal: false,\n top: PLAINTEXT_LANGUAGE\n };\n result.emitter.addText(code);\n return result;\n }\n\n /**\n Highlighting with language detection. Accepts a string with the code to\n highlight. Returns an object with the following properties:\n\n - language (detected language)\n - relevance (int)\n - value (an HTML string with highlighting markup)\n - second_best (object with the same structure for second-best heuristically\n detected language, may be absent)\n\n @param {string} code\n @param {Array} [languageSubset]\n @returns {AutoHighlightResult}\n */\n function highlightAuto(code, languageSubset) {\n languageSubset = languageSubset || options.languages || Object.keys(languages);\n const plaintext = justTextHighlightResult(code);\n\n const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>\n _highlight(name, code, false)\n );\n results.unshift(plaintext); // plaintext is always an option\n\n const sorted = results.sort((a, b) => {\n // sort base on relevance\n if (a.relevance !== b.relevance) return b.relevance - a.relevance;\n\n // always award the tie to the base language\n // ie if C++ and Arduino are tied, it's more likely to be C++\n if (a.language && b.language) {\n if (getLanguage(a.language).supersetOf === b.language) {\n return 1;\n } else if (getLanguage(b.language).supersetOf === a.language) {\n return -1;\n }\n }\n\n // otherwise say they are equal, which has the effect of sorting on\n // relevance while preserving the original ordering - which is how ties\n // have historically been settled, ie the language that comes first always\n // wins in the case of a tie\n return 0;\n });\n\n const [best, secondBest] = sorted;\n\n /** @type {AutoHighlightResult} */\n const result = best;\n result.second_best = secondBest;\n\n return result;\n }\n\n /**\n Post-processing of the highlighted markup:\n\n - replace TABs with something more useful\n - replace real line-breaks with ' ' for non-pre containers\n\n @param {string} html\n @returns {string}\n */\n function fixMarkup(html) {\n if (!(options.tabReplace || options.useBR)) {\n return html;\n }\n\n return html.replace(fixMarkupRe, match => {\n if (match === '\\n') {\n return options.useBR ? ' ' : match;\n } else if (options.tabReplace) {\n return match.replace(/\\t/g, options.tabReplace);\n }\n return match;\n });\n }\n\n /**\n * Builds new class name for block given the language name\n *\n * @param {HTMLElement} element\n * @param {string} [currentLang]\n * @param {string} [resultLang]\n */\n function updateClassName(element, currentLang, resultLang) {\n const language = currentLang ? aliases[currentLang] : resultLang;\n\n element.classList.add(\"hljs\");\n if (language) element.classList.add(language);\n }\n\n /** @type {HLJSPlugin} */\n const brPlugin = {\n \"before:highlightElement\": ({ el }) => {\n if (options.useBR) {\n el.innerHTML = el.innerHTML.replace(/\\n/g, '').replace(/ /g, '\\n');\n }\n },\n \"after:highlightElement\": ({ result }) => {\n if (options.useBR) {\n result.value = result.value.replace(/\\n/g, \" \");\n }\n }\n };\n\n const TAB_REPLACE_RE = /^(<[^>]+>|\\t)+/gm;\n /** @type {HLJSPlugin} */\n const tabReplacePlugin = {\n \"after:highlightElement\": ({ result }) => {\n if (options.tabReplace) {\n result.value = result.value.replace(TAB_REPLACE_RE, (m) =>\n m.replace(/\\t/g, options.tabReplace)\n );\n }\n }\n };\n\n /**\n * Applies highlighting to a DOM node containing code. Accepts a DOM node and\n * two optional parameters for fixMarkup.\n *\n * @param {HighlightedHTMLElement} element - the HTML element to highlight\n */\n function highlightElement(element) {\n /** @type HTMLElement */\n let node = null;\n const language = blockLanguage(element);\n\n if (shouldNotHighlight(language)) return;\n\n // support for v10 API\n fire(\"before:highlightElement\",\n { el: element, language: language });\n\n node = element;\n const text = node.textContent;\n const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);\n\n // support for v10 API\n fire(\"after:highlightElement\", { el: element, result, text });\n\n element.innerHTML = result.value;\n updateClassName(element, language, result.language);\n element.result = {\n language: result.language,\n // TODO: remove with version 11.0\n re: result.relevance,\n relavance: result.relevance\n };\n if (result.second_best) {\n element.second_best = {\n language: result.second_best.language,\n // TODO: remove with version 11.0\n re: result.second_best.relevance,\n relavance: result.second_best.relevance\n };\n }\n }\n\n /**\n * Updates highlight.js global options with the passed options\n *\n * @param {Partial} userOptions\n */\n function configure(userOptions) {\n if (userOptions.useBR) {\n deprecated(\"10.3.0\", \"'useBR' will be removed entirely in v11.0\");\n deprecated(\"10.3.0\", \"Please see https://github.com/highlightjs/highlight.js/issues/2559\");\n }\n options = inherit$1(options, userOptions);\n }\n\n /**\n * Highlights to all
blocks on a page\n *\n * @type {Function & {called?: boolean}}\n */\n // TODO: remove v12, deprecated\n const initHighlighting = () => {\n if (initHighlighting.called) return;\n initHighlighting.called = true;\n\n deprecated(\"10.6.0\", \"initHighlighting() is deprecated. Use highlightAll() instead.\");\n\n const blocks = document.querySelectorAll('pre code');\n blocks.forEach(highlightElement);\n };\n\n // Higlights all when DOMContentLoaded fires\n // TODO: remove v12, deprecated\n function initHighlightingOnLoad() {\n deprecated(\"10.6.0\", \"initHighlightingOnLoad() is deprecated. Use highlightAll() instead.\");\n wantsHighlight = true;\n }\n\n let wantsHighlight = false;\n\n /**\n * auto-highlights all pre>code elements on the page\n */\n function highlightAll() {\n // if we are called too early in the loading process\n if (document.readyState === \"loading\") {\n wantsHighlight = true;\n return;\n }\n\n const blocks = document.querySelectorAll('pre code');\n blocks.forEach(highlightElement);\n }\n\n function boot() {\n // if a highlight was requested before DOM was loaded, do now\n if (wantsHighlight) highlightAll();\n }\n\n // make sure we are in the browser environment\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('DOMContentLoaded', boot, false);\n }\n\n /**\n * Register a language grammar module\n *\n * @param {string} languageName\n * @param {LanguageFn} languageDefinition\n */\n function registerLanguage(languageName, languageDefinition) {\n let lang = null;\n try {\n lang = languageDefinition(hljs);\n } catch (error$1) {\n error(\"Language definition for '{}' could not be registered.\".replace(\"{}\", languageName));\n // hard or soft error\n if (!SAFE_MODE) { throw error$1; } else { error(error$1); }\n // languages that have serious errors are replaced with essentially a\n // \"plaintext\" stand-in so that the code blocks will still get normal\n // css classes applied to them - and one bad language won't break the\n // entire highlighter\n lang = PLAINTEXT_LANGUAGE;\n }\n // give it a temporary name if it doesn't have one in the meta-data\n if (!lang.name) lang.name = languageName;\n languages[languageName] = lang;\n lang.rawDefinition = languageDefinition.bind(null, hljs);\n\n if (lang.aliases) {\n registerAliases(lang.aliases, { languageName });\n }\n }\n\n /**\n * Remove a language grammar module\n *\n * @param {string} languageName\n */\n function unregisterLanguage(languageName) {\n delete languages[languageName];\n for (const alias of Object.keys(aliases)) {\n if (aliases[alias] === languageName) {\n delete aliases[alias];\n }\n }\n }\n\n /**\n * @returns {string[]} List of language internal names\n */\n function listLanguages() {\n return Object.keys(languages);\n }\n\n /**\n intended usage: When one language truly requires another\n\n Unlike `getLanguage`, this will throw when the requested language\n is not available.\n\n @param {string} name - name of the language to fetch/require\n @returns {Language | never}\n */\n function requireLanguage(name) {\n deprecated(\"10.4.0\", \"requireLanguage will be removed entirely in v11.\");\n deprecated(\"10.4.0\", \"Please see https://github.com/highlightjs/highlight.js/pull/2844\");\n\n const lang = getLanguage(name);\n if (lang) { return lang; }\n\n const err = new Error('The \\'{}\\' language is required, but not loaded.'.replace('{}', name));\n throw err;\n }\n\n /**\n * @param {string} name - name of the language to retrieve\n * @returns {Language | undefined}\n */\n function getLanguage(name) {\n name = (name || '').toLowerCase();\n return languages[name] || languages[aliases[name]];\n }\n\n /**\n *\n * @param {string|string[]} aliasList - single alias or list of aliases\n * @param {{languageName: string}} opts\n */\n function registerAliases(aliasList, { languageName }) {\n if (typeof aliasList === 'string') {\n aliasList = [aliasList];\n }\n aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });\n }\n\n /**\n * Determines if a given language has auto-detection enabled\n * @param {string} name - name of the language\n */\n function autoDetection(name) {\n const lang = getLanguage(name);\n return lang && !lang.disableAutodetect;\n }\n\n /**\n * Upgrades the old highlightBlock plugins to the new\n * highlightElement API\n * @param {HLJSPlugin} plugin\n */\n function upgradePluginAPI(plugin) {\n // TODO: remove with v12\n if (plugin[\"before:highlightBlock\"] && !plugin[\"before:highlightElement\"]) {\n plugin[\"before:highlightElement\"] = (data) => {\n plugin[\"before:highlightBlock\"](\n Object.assign({ block: data.el }, data)\n );\n };\n }\n if (plugin[\"after:highlightBlock\"] && !plugin[\"after:highlightElement\"]) {\n plugin[\"after:highlightElement\"] = (data) => {\n plugin[\"after:highlightBlock\"](\n Object.assign({ block: data.el }, data)\n );\n };\n }\n }\n\n /**\n * @param {HLJSPlugin} plugin\n */\n function addPlugin(plugin) {\n upgradePluginAPI(plugin);\n plugins.push(plugin);\n }\n\n /**\n *\n * @param {PluginEvent} event\n * @param {any} args\n */\n function fire(event, args) {\n const cb = event;\n plugins.forEach(function(plugin) {\n if (plugin[cb]) {\n plugin[cb](args);\n }\n });\n }\n\n /**\n Note: fixMarkup is deprecated and will be removed entirely in v11\n\n @param {string} arg\n @returns {string}\n */\n function deprecateFixMarkup(arg) {\n deprecated(\"10.2.0\", \"fixMarkup will be removed entirely in v11.0\");\n deprecated(\"10.2.0\", \"Please see https://github.com/highlightjs/highlight.js/issues/2534\");\n\n return fixMarkup(arg);\n }\n\n /**\n *\n * @param {HighlightedHTMLElement} el\n */\n function deprecateHighlightBlock(el) {\n deprecated(\"10.7.0\", \"highlightBlock will be removed entirely in v12.0\");\n deprecated(\"10.7.0\", \"Please use highlightElement now.\");\n\n return highlightElement(el);\n }\n\n /* Interface definition */\n Object.assign(hljs, {\n highlight,\n highlightAuto,\n highlightAll,\n fixMarkup: deprecateFixMarkup,\n highlightElement,\n // TODO: Remove with v12 API\n highlightBlock: deprecateHighlightBlock,\n configure,\n initHighlighting,\n initHighlightingOnLoad,\n registerLanguage,\n unregisterLanguage,\n listLanguages,\n getLanguage,\n registerAliases,\n requireLanguage,\n autoDetection,\n inherit: inherit$1,\n addPlugin,\n // plugins for frameworks\n vuePlugin: BuildVuePlugin(hljs).VuePlugin\n });\n\n hljs.debugMode = function() { SAFE_MODE = false; };\n hljs.safeMode = function() { SAFE_MODE = true; };\n hljs.versionString = version;\n\n for (const key in MODES) {\n // @ts-ignore\n if (typeof MODES[key] === \"object\") {\n // @ts-ignore\n deepFreezeEs6(MODES[key]);\n }\n }\n\n // merge all the modes/regexs into our main object\n Object.assign(hljs, MODES);\n\n // built-in plugins, likely to be moved out of core in the future\n hljs.addPlugin(brPlugin); // slated to be removed in v11\n hljs.addPlugin(mergeHTMLPlugin);\n hljs.addPlugin(tabReplacePlugin);\n return hljs;\n};\n\n// export an \"instance\" of the highlighter\nvar highlight = HLJS({});\n\nmodule.exports = highlight;\n"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html
new file mode 100644
index 0000000..4aec99c
--- /dev/null
+++ b/src/main/resources/static/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ Frontend
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/static/main.js b/src/main/resources/static/main.js
new file mode 100644
index 0000000..fddab0d
--- /dev/null
+++ b/src/main/resources/static/main.js
@@ -0,0 +1,797 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{
+
+/***/ 0:
+/*!***************************!*\
+ !*** multi ./src/main.ts ***!
+ \***************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! /home/daniel/IdeaProjects/Neo4JDemo/frontend/src/main.ts */"zUnb");
+
+
+/***/ }),
+
+/***/ "04Es":
+/*!*********************************************************!*\
+ !*** ./src/app/components/browser/browser.component.ts ***!
+ \*********************************************************/
+/*! exports provided: BrowserComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserComponent", function() { return BrowserComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+
+class BrowserComponent {
+ constructor() { }
+ ngOnInit() {
+ }
+}
+BrowserComponent.ɵfac = function BrowserComponent_Factory(t) { return new (t || BrowserComponent)(); };
+BrowserComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: BrowserComponent, selectors: [["app-browser"]], decls: 25, vars: 0, consts: [["href", "http://localhost:8080/browser/index.html", "target", "_blank"], ["onclick", "alert('Not here, in the Neo4J Browser...');"]], template: function BrowserComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "Neo4J Browser");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "a", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "http://localhost:8080/browser/index.html");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "dl");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "dt");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "Connect URL");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "dd");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "bolt://localhost");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "dt");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "Authentication type");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "dd");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "Username / Password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "dt");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "Username");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "dd");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "dt");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "Password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "dd");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, " Basically, just click ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "Connect");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ } }, styles: ["dt[_ngcontent-%COMP%] {\n font-weight: bold;\n}\n\ndd[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJyb3dzZXIuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQiIsImZpbGUiOiJicm93c2VyLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJkdCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5kZCB7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG4iXX0= */"] });
+
+
+/***/ }),
+
+/***/ "AytR":
+/*!*****************************************!*\
+ !*** ./src/environments/environment.ts ***!
+ \*****************************************/
+/*! exports provided: environment */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; });
+// This file can be replaced during build by using the `fileReplacements` array.
+// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
+// The list of file replacements can be found in `angular.json`.
+const environment = {
+ production: false
+};
+/*
+ * For easier debugging in development mode, you can import the following file
+ * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
+ *
+ * This import should be commented out in production mode because it will have a negative impact
+ * on performance if an error is thrown.
+ */
+// import 'zone.js/dist/zone-error'; // Included with Angular CLI.
+
+
+/***/ }),
+
+/***/ "F2G7":
+/*!***************************************************************************!*\
+ !*** ./src/app/components/database-control/database-control.component.ts ***!
+ \***************************************************************************/
+/*! exports provided: DatabaseControlComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DatabaseControlComponent", function() { return DatabaseControlComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _services_database_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../services/database.service */ "ZJFI");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "ofXK");
+/* harmony import */ var _angular_material_button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material/button */ "bTqV");
+
+
+
+
+function DatabaseControlComponent_h2_0_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "Database Control");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} }
+function DatabaseControlComponent_div_1_span_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r4.clearDatabaseMessage);
+} }
+function DatabaseControlComponent_div_1_Template(rf, ctx) { if (rf & 1) {
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](1, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function DatabaseControlComponent_div_1_Template_button_click_1_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r6); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r5.clearDatabase(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "Clear Database");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, DatabaseControlComponent_div_1_span_3_Template, 2, 1, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx_r1.transactionInProgress);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r1.clearDatabaseMessage);
+} }
+function DatabaseControlComponent_div_2_span_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r7.loadPokemonMessage);
+} }
+function DatabaseControlComponent_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](1, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function DatabaseControlComponent_div_2_Template_button_click_1_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r9); const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r8.loadPokemon(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "Load Pokemon");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, DatabaseControlComponent_div_2_span_3_Template, 2, 1, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx_r2.transactionInProgress);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.loadPokemonMessage);
+} }
+function DatabaseControlComponent_div_3_span_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r10.loadSinnohMapMessage);
+} }
+function DatabaseControlComponent_div_3_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](1, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function DatabaseControlComponent_div_3_Template_button_click_1_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.loadSinnohMap(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "Load Sinnoh Map");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, DatabaseControlComponent_div_3_span_3_Template, 2, 1, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx_r3.transactionInProgress);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r3.loadSinnohMapMessage);
+} }
+class DatabaseControlComponent {
+ constructor(databaseService) {
+ this.databaseService = databaseService;
+ this.clearDatabaseMessage = null;
+ this.loadPokemonMessage = null;
+ this.loadSinnohMapMessage = null;
+ this.transactionInProgress = false;
+ this.button = null;
+ }
+ ngOnInit() {
+ }
+ loadPokemon() {
+ this.transactionInProgress = true;
+ this.loadPokemonMessage = 'Running...';
+ this.databaseService.loadPokemon().subscribe(res => {
+ this.loadPokemonMessage = res.result;
+ this.transactionInProgress = false;
+ }, error => {
+ this.loadPokemonMessage = null;
+ this.transactionInProgress = false;
+ console.error(error);
+ alert('An error occured, see the console.');
+ });
+ }
+ loadSinnohMap() {
+ this.transactionInProgress = true;
+ this.loadSinnohMapMessage = 'Running...';
+ this.databaseService.loadSinnohMap().subscribe(res => {
+ this.loadSinnohMapMessage = res.result;
+ this.transactionInProgress = false;
+ }, error => {
+ this.loadSinnohMapMessage = null;
+ this.transactionInProgress = false;
+ console.error(error);
+ alert('An error occured, see the console.');
+ });
+ }
+ clearDatabase() {
+ this.transactionInProgress = true;
+ this.clearDatabaseMessage = 'Running...';
+ this.loadPokemonMessage = null;
+ this.loadSinnohMapMessage = null;
+ this.databaseService.clearDatabase().subscribe(res => {
+ this.clearDatabaseMessage = res.result;
+ this.transactionInProgress = false;
+ }, error => {
+ this.clearDatabaseMessage = null;
+ this.transactionInProgress = false;
+ console.error(error);
+ alert('An error occured, see the console.');
+ });
+ }
+}
+DatabaseControlComponent.ɵfac = function DatabaseControlComponent_Factory(t) { return new (t || DatabaseControlComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_database_service__WEBPACK_IMPORTED_MODULE_1__["DatabaseService"])); };
+DatabaseControlComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: DatabaseControlComponent, selectors: [["app-database-control"]], inputs: { button: "button" }, decls: 4, vars: 4, consts: [[4, "ngIf"], ["class", "control-button", 4, "ngIf"], [1, "control-button"], ["mat-raised-button", "", "color", "warn", 3, "disabled", "click"]], template: function DatabaseControlComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, DatabaseControlComponent_h2_0_Template, 2, 0, "h2", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](1, DatabaseControlComponent_div_1_Template, 4, 2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, DatabaseControlComponent_div_2_Template, 4, 2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, DatabaseControlComponent_div_3_Template, 4, 2, "div", 1);
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.button);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.button || ctx.button == "clear");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.button || ctx.button == "pokemon");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.button || ctx.button == "sinnohMap");
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["NgIf"], _angular_material_button__WEBPACK_IMPORTED_MODULE_3__["MatButton"]], styles: [".control-button[_ngcontent-%COMP%] {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n\nbutton[_ngcontent-%COMP%] {\n margin-right: 10px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRhdGFiYXNlLWNvbnRyb2wuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGdCQUFnQjtFQUNoQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEIiLCJmaWxlIjoiZGF0YWJhc2UtY29udHJvbC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmNvbnRyb2wtYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuYnV0dG9uIHtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xufVxuIl19 */"] });
+
+
+/***/ }),
+
+/***/ "KUUM":
+/*!**********************************************************!*\
+ !*** ./src/app/components/snippset/snippet.component.ts ***!
+ \**********************************************************/
+/*! exports provided: SnippetComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SnippetComponent", function() { return SnippetComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var ngx_highlightjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ngx-highlightjs */ "OtPg");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "ofXK");
+/* harmony import */ var _angular_material_button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material/button */ "bTqV");
+/* harmony import */ var _angular_cdk_clipboard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/cdk/clipboard */ "UXJo");
+
+
+
+
+
+function SnippetComponent_button_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "Copy");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cdkCopyToClipboard", ctx_r0.query);
+} }
+const _c0 = function () { return ["cypher"]; };
+class SnippetComponent {
+ constructor() {
+ this.copy_ = true;
+ }
+ ngOnInit() {
+ }
+ set copy(value) {
+ if (value === 'false') {
+ this.copy_ = false;
+ }
+ else {
+ this.copy_ = true;
+ }
+ }
+}
+SnippetComponent.ɵfac = function SnippetComponent_Factory(t) { return new (t || SnippetComponent)(); };
+SnippetComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SnippetComponent, selectors: [["app-snippset"]], inputs: { query: "query", copy: "copy" }, decls: 5, vars: 4, consts: [[1, "snippet"], [3, "languages", "highlight"], ["mat-raised-button", "", "color", "primary", 3, "cdkCopyToClipboard", 4, "ngIf"], ["mat-raised-button", "", "color", "primary", 3, "cdkCopyToClipboard"]], template: function SnippetComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](1, "pre");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "code", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "public static int main();");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, SnippetComponent_button_4_Template, 2, 1, "button", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("languages", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction0"](3, _c0))("highlight", ctx.query);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.copy_);
+ } }, directives: [ngx_highlightjs__WEBPACK_IMPORTED_MODULE_1__["Highlight"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["NgIf"], _angular_material_button__WEBPACK_IMPORTED_MODULE_3__["MatButton"], _angular_cdk_clipboard__WEBPACK_IMPORTED_MODULE_4__["CdkCopyToClipboard"]], styles: [".snippet[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNuaXBwZXQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLG1CQUFtQjtBQUNyQiIsImZpbGUiOiJzbmlwcGV0LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc25pcHBldCB7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG4iXX0= */"] });
+
+
+/***/ }),
+
+/***/ "Sy1n":
+/*!**********************************!*\
+ !*** ./src/app/app.component.ts ***!
+ \**********************************/
+/*! exports provided: AppComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_material_toolbar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/material/toolbar */ "/t3+");
+/* harmony import */ var _components_browser_browser_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/browser/browser.component */ "04Es");
+/* harmony import */ var _angular_material_divider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material/divider */ "f0Cb");
+/* harmony import */ var _components_database_control_database_control_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/database-control/database-control.component */ "F2G7");
+/* harmony import */ var _components_snippset_snippet_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/snippset/snippet.component */ "KUUM");
+/* harmony import */ var _angular_material_expansion__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/material/expansion */ "7EHt");
+
+
+
+
+
+
+
+class AppComponent {
+ constructor() {
+ this.title = 'frontend';
+ }
+}
+AppComponent.ɵfac = function AppComponent_Factory(t) { return new (t || AppComponent)(); };
+AppComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: AppComponent, selectors: [["app-root"]], decls: 199, vars: 0, consts: [["color", "primary"], [1, "content"], [1, "lecture-part"], ["query", "()", "copy", "false"], ["query", "[]", "copy", "false"], ["query", "-- -> <-", "copy", "false"], ["query", ":Label1 :Label1:Label2 :LABEL_FOR_AN_EDGE"], ["href", "https://neo4j.com/docs/cypher-manual/current/", "target", "_blank"], ["button", "pokemon"], ["query", "MATCH (node) RETURN node LIMIT 25"], ["query", "MATCH (pokemon:Pokemon) RETURN pokemon LIMIT 25"], ["query", "MATCH (t:Type) RETURN t"], ["query", "MATCH (p:Pokemon), (t:Type) RETURN p, t LIMIT 25"], ["query", "MATCH (p:Pokemon)-[:HAS_TYPE]-(t:Type) RETURN p, t LIMIT 25"], ["query", "MATCH (p:Pokemon)-[:HAS_TYPE]-(t:Type) RETURN * LIMIT 25"], ["query", "MATCH (p:Legendary) RETURN p"], ["query", "MATCH (p:Pokemon:Legendary) RETURN p"], ["query", "MATCH (p:Legendary:Pokemon) RETURN p"], ["query", "MATCH (p:Pokemon) WHERE p.name = 'pikachu' RETURN p"], ["query", "MATCH (p:Pokemon{name: 'pikachu'}) RETURN *"], ["copy", "false", "query", "MATCH (n) WHERE id(n) = 42 RETURN n"], ["query", "MATCH (n:Pokemon) WHERE n.name starts with 'pi' RETURN n"], ["query", "MATCH (n:Pokemon) WHERE n.name starts with 'pi' or n.name = 'charizard' RETURN n"], ["query", "MATCH (n:Pokemon) WHERE n.name starts with 'c' and n.pokedexId <= 150 RETURN n"], ["query", "MATCH (p:Pokemon)-[:HAS_TYPE]-(:Type{name: 'fire'}) WHERE p.pokedexId <= 150 RETURN *"], ["query", "MATCH (p:Pokemon)-[:HAS_TYPE{slot: 2}]-(t:Type) WHERE t.name = 'fire' RETURN *"], ["query", "MATCH (p:Pokemon) WHERE NOT (p)-[:EVOLVES_TO]->() RETURN p LIMIT 25"], ["query", "MATCH chain=(p1:Pokemon)-[:EVOLVES_TO]->(p2:Pokemon) WHERE NOT (p2)-[:EVOLVES_TO]->() RETURN chain"], ["query", "MATCH (p1:Pokemon)-[:EVOLVES_TO*3]->(p3:Pokemon) WHERE NOT (p3)-[:EVOLVES_TO]->() RETURN *"], ["query", "MATCH chain=(p1:Pokemon)-[:EVOLVES_TO*2]->(p3:Pokemon) WHERE NOT (p3)-[:EVOLVES_TO]->() RETURN *"], ["button", "sinnohMap"], ["query", "MATCH (n) WHERE n:City or n:Town or n:Lake RETURN n"], ["query", "MATCH p=(start:City{name:'Snowpoint City'})-[:ROUTE*]-(end:City{name:'Hearthome City'}) RETURN p"], ["query", "MATCH p=(start:City{name:'Snowpoint City'})-[:ROUTE*]-(end:City{name:'Hearthome City'}) RETURN length(p)"], ["query", "MATCH p=(start:City{name:'Snowpoint City'})-[:ROUTE*]-(end:City{name:'Hearthome City'}) RETURN length(p), p"], ["query", "MATCH p=shortestPath((start:City{name:'Snowpoint City'})-[:ROUTE*..10]-(end:City{name:'Hearthome City'})) RETURN length(p), p"], ["href", "https://github.com/veekun/pokedex"], ["href", "https://github.com/jquery/jquery"], ["href", "https://github.com/highlightjs/highlight.js"]], template: function AppComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "mat-toolbar", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "Neo4J Demo Control Panel");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "app-browser");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "mat-divider");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "app-database-control");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](6, "mat-divider");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "Basic building blocks");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, " Two parenthesis denote a node in cypher ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](11, "app-snippset", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, " Two brackets are used for referencing edges ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](14, "app-snippset", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, " Nodes and edges are connected by dashes and less/greater signs ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](17, "app-snippset", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, " Nodes and edges can have multiple labels which are each started by a colon. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](20, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, " The case is not mandatory but significant. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](22, "app-snippset", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](23, "mat-divider");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "Official Cypher Manual");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](26, "a", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "https://neo4j.com/docs/cypher-manual/current/");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "Simple MATCH queries");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, " For this part, you should load the Pokemon example data. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](32, "app-database-control", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, " We will start by simply fetching all nodes in the database. Because there might be a lot of them, we limit the number of results. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](35, "app-snippset", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, " The ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](37, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "MATCH");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, " keyword tells the database we want to fetch some data according to a certain pattern which is/are given afterwards. All elements matching parts of the pattern are stored in a variable if one is given, in our case it is called ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "node");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, ". The last part of the query is the ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](43, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "RETURN");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, " after which all variables we want in our result are specified, in our case only ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](46, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "node");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, ". The optional ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "LIMIT");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, " caps the results after the given number. Without this, our database would return us 916 elements for the Pokemon test dataset. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](52, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, " If we only want a specific type of nodes, we can specify this by adding a label to the pattern. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](54, "app-snippset", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, " To show the difference, we now query the types Pokemon can have. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](57, "app-snippset", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, " Because there are only 18, we can omit the ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "LIMIT");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, ". ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](62, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, " In this example we combine the previous two queries by specifying two patterns. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](64, "app-snippset", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, " We now limit the number of results again to 25. This query is a very bad example (and Neo4J Browser warns about this one), because we are actually building the Cartesian product of the two sets of results. According to Neo4J Browser, the number of records would be 16164. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](66, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, " A better query is to ask for a Pokemon and its adjacent type: ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](68, "app-snippset", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, " Here, the label ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](70, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "HAS_TYPE");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](72, " is the label of an edge connecting a Pokemon with its type. And because we both of the variables returned, we can replace ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](73, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74, "p, t");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](75, " with an asterisk. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](76, "app-snippset", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](77, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78, " Nodes and edges can also have multiple labels. For example there are normal Pokemon and legendary ones (which are unique). The latter ones have two labels and can be queried accordingly. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](79, "app-snippset", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](80, "app-snippset", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](81, "app-snippset", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, " All three queries yield the same result. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](83, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84, "Filtering with Properties");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](85, " So far, we only selected nodes based on the labels. Most of the time, we also want to filter based on the stored properties. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](86, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87, " We now want to find the most famous Pokemon. Please be aware that the string comparison is case sensitive and the name is given in lower case. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](88, "app-snippset", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, " The filtering is like in SQL done with the ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](90, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "WHERE");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](92, " part. Here, we access the property ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](93, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](94, "name");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](95, " and compare it against ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](96, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "'pikachu'");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](98, ". Another possibilily is to include the name already in the pattern: ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](99, "app-snippset", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](100, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](101, " We can also filter for an internal id ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](102, "app-snippset", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](103, " Please note that the id is not really predictable and this query might not yield a meaningful result. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](104, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](105, " We can also filter using all kinds of functions and combinations. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](106, "app-snippset", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](107, "app-snippset", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](108, "app-snippset", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](109, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](110, "Filtering with Paths");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](111, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](112, " We can also use the paths to enhance our filtering. For example, we want only fire Pokemon from the first generation (which means a pokedexId <= 150). ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](113, "app-snippset", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](114, " Because we did not assign a variable to ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](115, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](116, ":Type");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](117, ", we could use ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](118, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](119, "RETURN *");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](120, " and only got the Pokemon. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](121, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](122, " Also edges can have properties. Pokemon might have more than one type. We now query all Pokemon with fire as secondary type. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](123, "app-snippset", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](124, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](125, " We can also check for the absence of a certain path. In the next example, we want all pokemon which cannot evolve further. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](126, "app-snippset", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](127, " The ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](128, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](129, "()");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](130, " here stands for an arbitrary node we do not restrict in any way and also do not store in a variable. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](131, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](132, " Please note that we used ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](133, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](134, "-[]->");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](135, " which is a directed edge instead of the ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](136, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](137, "-[]-");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](138, " we used earlier. All edges in Neo4J are directed and we can care about the direction or not. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](139, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](140, " Path patterns can be arbitrary complex. To find all pokemon having only two evolution states, we can use this query: ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](141, "app-snippset", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](142, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](143, " For Pokemon with three evolutionary levels, we can use an abbreviation: ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](144, "app-snippset", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](145, " Where we do not see the full path but only start end end. If we again store the paths in a variable, we get all three Pokemon. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](146, "app-snippset", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](147, "h2");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](148, "Path finding");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](149, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](150, " For this part, you should load the Sinnoh example map. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](151, "app-database-control", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](152, " Please note I did some simplifications to the map. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](153, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](154, " First of all, let's have a look at the whole map. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](155, "app-snippset", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](156, " Another way of querying with labels. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](157, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](158, " We can now find paths from ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](159, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](160, "Snowpoint City");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](161, " to ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](162, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](163, "Hearthome City");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](164, ". ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](165, "app-snippset", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](166, " And get the lengths of each route. ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](167, "app-snippset", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](168, " And also both ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](169, "app-snippset", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](170, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](171, " Neo4J also offers some interesting functions like ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](172, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](173, "shortestPath()");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](174, " which finds the shortest instance of an path in an (according to the documentation) efficient way. Neo4J Browser advices to use an upper limit here to avoid long execution times ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](175, "app-snippset", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](176, "mat-expansion-panel");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](177, "mat-expansion-panel-header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](178, "mat-panel-title");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](179, " Sources ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](180, "h3");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](181, "Pokemon data");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](182, " Many thanks to GitHub user Eevee/Veekun for providing a lot of data about Pokemon in CSV data under MIT License ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](183, "a", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](184, "https://github.com/veekun/pokedex");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](185, "pre");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](186, "Copyright \u00A9 2009 Alex Munroe (Eevee)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](187, "h3");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](188, "jQuery");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](189, "a", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](190, "https://github.com/jquery/jquery");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](191, "pre");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](192, "Copyright OpenJS Foundation and other contributors, https://openjsf.org/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](193, "h3");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](194, "highlight.js");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](195, "a", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](196, "https://github.com/highlightjs/highlight.js");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](197, "pre");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](198, "BSD 3-Clause License\n\nCopyright (c) 2006, Ivan Sagalaev.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ } }, directives: [_angular_material_toolbar__WEBPACK_IMPORTED_MODULE_1__["MatToolbar"], _components_browser_browser_component__WEBPACK_IMPORTED_MODULE_2__["BrowserComponent"], _angular_material_divider__WEBPACK_IMPORTED_MODULE_3__["MatDivider"], _components_database_control_database_control_component__WEBPACK_IMPORTED_MODULE_4__["DatabaseControlComponent"], _components_snippset_snippet_component__WEBPACK_IMPORTED_MODULE_5__["SnippetComponent"], _angular_material_expansion__WEBPACK_IMPORTED_MODULE_6__["MatExpansionPanel"], _angular_material_expansion__WEBPACK_IMPORTED_MODULE_6__["MatExpansionPanelHeader"], _angular_material_expansion__WEBPACK_IMPORTED_MODULE_6__["MatExpansionPanelTitle"]], styles: [".content[_ngcontent-%COMP%] {\n margin: auto;\n max-width: 1200px;\n padding-bottom: 100px;\n}\n\nmat-divider[_ngcontent-%COMP%] {\n margin-top: 10px;\n margin-bottom: 15px;\n}\n\n.lecture-part[_ngcontent-%COMP%] {\n margin-bottom: 30px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCIiwiZmlsZSI6ImFwcC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmNvbnRlbnQge1xuICBtYXJnaW46IGF1dG87XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMTAwcHg7XG59XG5cbm1hdC1kaXZpZGVyIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLmxlY3R1cmUtcGFydCB7XG4gIG1hcmdpbi1ib3R0b206IDMwcHg7XG59XG4iXX0= */"] });
+
+
+/***/ }),
+
+/***/ "ZAI4":
+/*!*******************************!*\
+ !*** ./src/app/app.module.ts ***!
+ \*******************************/
+/*! exports provided: AppModule */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; });
+/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "jhN1");
+/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app.component */ "Sy1n");
+/* harmony import */ var _angular_material_toolbar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/material/toolbar */ "/t3+");
+/* harmony import */ var _angular_material_expansion__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material/expansion */ "7EHt");
+/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/platform-browser/animations */ "R1ws");
+/* harmony import */ var _angular_material_divider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/material/divider */ "f0Cb");
+/* harmony import */ var _components_browser_browser_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/browser/browser.component */ "04Es");
+/* harmony import */ var _components_database_control_database_control_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/database-control/database-control.component */ "F2G7");
+/* harmony import */ var _angular_material_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/material/button */ "bTqV");
+/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/common/http */ "tk/3");
+/* harmony import */ var _components_snippset_snippet_component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/snippset/snippet.component */ "KUUM");
+/* harmony import */ var ngx_highlightjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ngx-highlightjs */ "OtPg");
+/* harmony import */ var _angular_cdk_clipboard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/cdk/clipboard */ "UXJo");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @angular/core */ "fXoL");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AppModule {
+}
+AppModule.ɵfac = function AppModule_Factory(t) { return new (t || AppModule)(); };
+AppModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_13__["ɵɵdefineNgModule"]({ type: AppModule, bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_1__["AppComponent"]] });
+AppModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_13__["ɵɵdefineInjector"]({ providers: [{
+ provide: ngx_highlightjs__WEBPACK_IMPORTED_MODULE_11__["HIGHLIGHT_OPTIONS"],
+ useValue: {
+ coreLibraryLoader: () => __webpack_require__.e(/*! import() | highlight-js-lib-core */ "highlight-js-lib-core").then(__webpack_require__.t.bind(null, /*! highlight.js/lib/core */ "ECCn", 7)),
+ languages: {
+ cypher: () => __webpack_require__.e(/*! import() | assets-cypher-js */ "assets-cypher-js").then(__webpack_require__.t.bind(null, /*! ../assets/cypher.js */ "cw3D", 7)),
+ }
+ }
+ }], imports: [[
+ _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"],
+ _angular_material_toolbar__WEBPACK_IMPORTED_MODULE_2__["MatToolbarModule"],
+ _angular_material_expansion__WEBPACK_IMPORTED_MODULE_3__["MatExpansionModule"],
+ _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_4__["BrowserAnimationsModule"],
+ _angular_material_divider__WEBPACK_IMPORTED_MODULE_5__["MatDividerModule"],
+ _angular_material_button__WEBPACK_IMPORTED_MODULE_8__["MatButtonModule"],
+ _angular_common_http__WEBPACK_IMPORTED_MODULE_9__["HttpClientModule"],
+ ngx_highlightjs__WEBPACK_IMPORTED_MODULE_11__["HighlightModule"],
+ _angular_cdk_clipboard__WEBPACK_IMPORTED_MODULE_12__["ClipboardModule"]
+ ]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_13__["ɵɵsetNgModuleScope"](AppModule, { declarations: [_app_component__WEBPACK_IMPORTED_MODULE_1__["AppComponent"],
+ _components_browser_browser_component__WEBPACK_IMPORTED_MODULE_6__["BrowserComponent"],
+ _components_database_control_database_control_component__WEBPACK_IMPORTED_MODULE_7__["DatabaseControlComponent"],
+ _components_snippset_snippet_component__WEBPACK_IMPORTED_MODULE_10__["SnippetComponent"]], imports: [_angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"],
+ _angular_material_toolbar__WEBPACK_IMPORTED_MODULE_2__["MatToolbarModule"],
+ _angular_material_expansion__WEBPACK_IMPORTED_MODULE_3__["MatExpansionModule"],
+ _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_4__["BrowserAnimationsModule"],
+ _angular_material_divider__WEBPACK_IMPORTED_MODULE_5__["MatDividerModule"],
+ _angular_material_button__WEBPACK_IMPORTED_MODULE_8__["MatButtonModule"],
+ _angular_common_http__WEBPACK_IMPORTED_MODULE_9__["HttpClientModule"],
+ ngx_highlightjs__WEBPACK_IMPORTED_MODULE_11__["HighlightModule"],
+ _angular_cdk_clipboard__WEBPACK_IMPORTED_MODULE_12__["ClipboardModule"]] }); })();
+
+
+/***/ }),
+
+/***/ "ZJFI":
+/*!**********************************************!*\
+ !*** ./src/app/services/database.service.ts ***!
+ \**********************************************/
+/*! exports provided: DatabaseService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DatabaseService", function() { return DatabaseService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common/http */ "tk/3");
+
+
+class DatabaseService {
+ constructor(http) {
+ this.http = http;
+ }
+ loadPokemon() {
+ return this.http.post('http://localhost:8080/api/pokemon/load', null);
+ }
+ loadSinnohMap() {
+ return this.http.post('http://localhost:8080/api/sinnoh-map/load', null);
+ }
+ clearDatabase() {
+ return this.http.delete('http://localhost:8080/api/database');
+ }
+}
+DatabaseService.ɵfac = function DatabaseService_Factory(t) { return new (t || DatabaseService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_common_http__WEBPACK_IMPORTED_MODULE_1__["HttpClient"])); };
+DatabaseService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: DatabaseService, factory: DatabaseService.ɵfac, providedIn: 'root' });
+
+
+/***/ }),
+
+/***/ "zUnb":
+/*!*********************!*\
+ !*** ./src/main.ts ***!
+ \*********************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "jhN1");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _app_app_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/app.module */ "ZAI4");
+/* harmony import */ var _environments_environment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environments/environment */ "AytR");
+
+
+
+
+if (_environments_environment__WEBPACK_IMPORTED_MODULE_3__["environment"].production) {
+ Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["enableProdMode"])();
+}
+_angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["platformBrowser"]().bootstrapModule(_app_app_module__WEBPACK_IMPORTED_MODULE_2__["AppModule"])
+ .catch(err => console.error(err));
+
+
+/***/ }),
+
+/***/ "zn8P":
+/*!******************************************************!*\
+ !*** ./$$_lazy_route_resource lazy namespace object ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function webpackEmptyAsyncContext(req) {
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
+ // uncaught exception popping up in devtools
+ return Promise.resolve().then(function() {
+ var e = new Error("Cannot find module '" + req + "'");
+ e.code = 'MODULE_NOT_FOUND';
+ throw e;
+ });
+}
+webpackEmptyAsyncContext.keys = function() { return []; };
+webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
+module.exports = webpackEmptyAsyncContext;
+webpackEmptyAsyncContext.id = "zn8P";
+
+/***/ })
+
+},[[0,"runtime","vendor"]]]);
+//# sourceMappingURL=main.js.map
\ No newline at end of file
diff --git a/src/main/resources/static/main.js.map b/src/main/resources/static/main.js.map
new file mode 100644
index 0000000..0be6cc6
--- /dev/null
+++ b/src/main/resources/static/main.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["./src/app/components/browser/browser.component.ts","./src/app/components/browser/browser.component.html","./src/environments/environment.ts","./src/app/components/database-control/database-control.component.html","./src/app/components/database-control/database-control.component.ts","./src/app/components/snippset/snippet.component.html","./src/app/components/snippset/snippet.component.ts","./src/app/app.component.ts","./src/app/app.component.html","./src/app/app.module.ts","./src/app/services/database.service.ts","./src/main.ts","./$_lazy_route_resource lazy namespace object"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,gBAAgB;IAE3B,gBAAgB,CAAC;IAEjB,QAAQ;IACR,CAAC;;gFALU,gBAAgB;gGAAhB,gBAAgB;QCP7B,qEAAI;QAAA,wEAAa;QAAA,4DAAK;QACtB,sEAAK;QACH,uEAAmE;QAAA,mGAAwC;QAAA,4DAAI;QAC/G,qEAAI;QACF,qEAAI;QAAA,sEAAW;QAAA,4DAAK;QACpB,qEAAI;QAAA,2EAAgB;QAAA,4DAAK;QAEzB,sEAAI;QAAA,+EAAmB;QAAA,4DAAK;QAC5B,sEAAI;QAAA,+EAAmB;QAAA,4DAAK;QAE5B,sEAAI;QAAA,oEAAQ;QAAA,4DAAK;QACjB,sEAAI;QAAA,mEAAa;QAAA,4DAAK;QAEtB,sEAAI;QAAA,oEAAQ;QAAA,4DAAK;QACjB,sEAAI;QAAA,mEAAa;QAAA,4DAAK;QACxB,4DAAK;QACL,mFAAsB;QAAA,6EAA8D;QAAA,mEAAO;QAAA,4DAAS;QACtG,4DAAM;;;;;;;;;;;;;;ACjBN;AAAA;AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,gEAAgE;AAEzD,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF;;;;;;GAMG;AACH,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;ICfnE,qEAAoB;IAAA,2EAAgB;IAAA,4DAAK;;;IAIvC,uEAAmC;IAAA,uDAAwB;IAAA,4DAAO;;;IAA/B,0DAAwB;IAAxB,4FAAwB;;;;IAF7D,yEAA+D;IAC7D,4EAAoG;IAA7D,gUAAyB;IAAoC,yEAAc;IAAA,4DAAS;IAC3H,4HAAkE;IACpE,4DAAM;;;IAF6D,0DAAkC;IAAlC,kGAAkC;IAC5F,0DAA0B;IAA1B,6FAA0B;;;IAIjC,uEAAiC;IAAA,uDAAsB;IAAA,4DAAO;;;IAA7B,0DAAsB;IAAtB,0FAAsB;;;;IAFzD,yEAAiE;IAC/D,4EAAkG;IAA3D,8TAAuB;IAAoC,uEAAY;IAAA,4DAAS;IACvH,4HAA8D;IAChE,4DAAM;;;IAF2D,0DAAkC;IAAlC,kGAAkC;IAC1F,0DAAwB;IAAxB,2FAAwB;;;IAI/B,uEAAmC;IAAA,uDAAwB;IAAA,4DAAO;;;IAA/B,0DAAwB;IAAxB,6FAAwB;;;;IAF7D,yEAAmE;IACjE,4EAAoG;IAA7D,mUAAyB;IAAoC,0EAAe;IAAA,4DAAS;IAC5H,4HAAkE;IACpE,4DAAM;;;IAF6D,0DAAkC;IAAlC,kGAAkC;IAC5F,0DAA0B;IAA1B,6FAA0B;;ACJ5B,MAAM,wBAAwB;IASnC,YAAoB,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;QARpD,yBAAoB,GAAW,IAAI,CAAC;QACpC,uBAAkB,GAAW,IAAI,CAAC;QAClC,yBAAoB,GAAW,IAAI,CAAC;QACpC,0BAAqB,GAAG,KAAK,CAAC;QAG9B,WAAM,GAAW,IAAI,CAAC;IAGtB,CAAC;IAED,QAAQ;IACR,CAAC;IAED,WAAW;QACT,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;QACvC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YAC/C,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC;YACrC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACrC,CAAC,EACD,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,aAAa;QACX,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YACjD,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACrC,CAAC,EACD,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,aAAa;QACX,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;QACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YACjD,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACrC,CAAC,EACD,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;;gGA5DU,wBAAwB;wGAAxB,wBAAwB;QDRrC,kHAAyC;QAEzC,oHAGM;QACN,oHAGM;QACN,oHAGM;;QAbD,6EAAa;QAEW,0DAAgC;QAAhC,sGAAgC;QAIhC,0DAAkC;QAAlC,wGAAkC;QAIlC,0DAAoC;QAApC,0GAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;IER/D,4EAAqF;IAAA,+DAAI;IAAA,4DAAS;;;IAA1C,4FAA4B;;;ACM/E,MAAM,gBAAgB;IAO3B;QAFA,UAAK,GAAG,IAAI,CAAC;IAGb,CAAC;IAED,QAAQ;IACR,CAAC;IAED,IACI,IAAI,CAAC,KAAa;QACpB,IAAI,KAAK,KAAK,OAAO,EAAE;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;SACnB;IACH,CAAC;;gFApBU,gBAAgB;gGAAhB,gBAAgB;QDR7B,yEAAqB;QACnB,sEAAK;QAAA,0EAAmD;QAAA,oFAAyB;QAAA,4DAAO;QAAA,4DAAM;QAC9F,kHAAkG;QACpG,4DAAM;;QAFO,0DAAwB;QAAxB,4IAAwB;QAC1B,0DAAW;QAAX,2EAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEKf,MAAM,YAAY;IALzB;QAME,UAAK,GAAG,UAAU,CAAC;KACpB;;wEAFY,YAAY;4FAAZ,YAAY;QCPzB,iFAA6B;QAAA,mFAAwB;QAAA,4DAAc;QAEnE,yEAAqB;QACnB,yEAA2B;QAC3B,yEAA2B;QAC3B,kFAA6C;QAE7C,yEAA2B;QAC3B,qEAAI;QAAA,gFAAqB;QAAA,4DAAK;QAE9B,yEAA0B;QACxB,qGACA;QAAA,8EAAqD;QACvD,4DAAM;QAEN,0EAA0B;QACxB,yGACA;QAAA,8EAAqD;QACvD,4DAAM;QAGN,0EAA0B;QACxB,4HACA;QAAA,8EAA2D;QAC7D,4DAAM;QAEN,0EAA0B;QACxB,yIAA4E;QAAA,iEAAM;QAClF,wGACA;QAAA,8EAA+E;QACjF,4DAAM;QAGN,0EAA2B;QAC3B,sEAAI;QAAA,kFAAsB;QAAA,4DAAK;QAC/B,wEAAwE;QAAA,yGAA6C;QAAA,4DAAI;QAGzH,sEAAI;QAAA,gFAAoB;QAAA,4DAAK;QAE7B,0EAA0B;QACxB,sHACA;QAAA,sFAA8D;QAChE,4DAAM;QAEN,0EAA0B;QACxB,+LACA;QAAA,8EAAuE;QACvE,iEAAI;QAAA,qEAAG;QAAA,iEAAK;QAAA,4DAAI;QAAC,+RAC6F;QAAA,qEAAG;QAAA,gEAAI;QAAA,4DAAI;QAAA,gGACvF;QAAA,qEAAG;QAAA,kEAAM;QAAA,4DAAI;QAAC,6IAAgF;QAAA,qEAAG;QAAA,gEAAI;QAAA,4DAAI;QAAA,2EAC9H;QAAA,qEAAG;QAAA,iEAAK;QAAA,4DAAI;QAAC,4LAE5B;QAAA,4DAAM;QAEN,0EAA0B;QACxB,6JACA;QAAA,+EAAqF;QACvF,4DAAM;QAEN,0EAA0B;QACxB,8HACA;QAAA,+EAA6D;QAC7D,wGAA2C;QAAA,qEAAG;QAAA,iEAAK;QAAA,4DAAI;QAAA,8DACzD;QAAA,4DAAM;QAEN,0EAA0B;QACxB,6IACA;QAAA,+EAAsF;QACtF,6UAEkE;QAAA,iEAAM;QACxE,2HACA;QAAA,+EAAiG;QACjG,6EAAgB;QAAA,qEAAG;QAAA,oEAAQ;QAAA,4DAAI;QAAC,uLAC8B;QAAA,qEAAG;QAAA,gEAAI;QAAA,4DAAI;QAAC,+EAC1E;QAAA,+EAA8F;QAChG,4DAAM;QAEN,0EAA0B;QACxB,wPAGA;QAAA,+EAAkE;QAClE,+EAA0E;QAC1E,+EAA0E;QAC1E,sGACF;QAAA,4DAAM;QAEN,sEAAI;QAAA,qFAAyB;QAAA,4DAAK;QAClC,0LAEA;QAAA,0EAA0B;QACxB,4MAEA;QAAA,+EAAyF;QACzF,wGAA2C;QAAA,qEAAG;QAAA,iEAAK;QAAA,4DAAI;QAAC,gGAC3B;QAAA,qEAAG;QAAA,gEAAI;QAAA,4DAAI;QAAC,oFAAuB;QAAA,qEAAG;QAAA,qEAAS;QAAA,4DAAI;QAAA,iIAEhF;QAAA,+EAAiF;QACnF,4DAAM;QAEN,2EAA0B;QACxB,oGACA;QAAA,gFAAsF;QACtF,oKACF;QAAA,4DAAM;QAEN,2EAA0B;QACxB,gIACA;QAAA,gFAA8F;QAC9F,gFAAsH;QACtH,gFAAoH;QACtH,4DAAM;QAEN,uEAAI;QAAA,iFAAoB;QAAA,4DAAK;QAE7B,2EAA0B;QACxB,qNAEA;QAAA,gFAA2H;QAC3H,sGAAwC;QAAA,sEAAG;QAAA,kEAAK;QAAA,4DAAI;QAAA,4EAAe;QAAA,sEAAG;QAAA,qEAAQ;QAAA,4DAAI;QAAC,wFACrF;QAAA,4DAAM;QAEN,2EAA0B;QACxB,2LAGA;QAAA,gFAAoH;QACtH,4DAAM;QAEN,2EAA0B;QACxB,yLAEA;QAAA,gFAAyG;QACzG,kEAAI;QAAA,sEAAG;QAAA,+DAAE;QAAA,4DAAI;QAAC,mKAAqG;QAAA,kEAAM;QACzH,uFAAyB;QAAA,sEAAG;QAAA,kEAAK;QAAA,4DAAI;QAAC,sGAAwC;QAAA,sEAAG;QAAA,iEAAI;QAAA,4DAAI;QAAC,2JAE5F;QAAA,4DAAM;QAEN,2EAA0B;QACxB,mLAEA;QAAA,gFAAwI;QAC1I,4DAAM;QAEN,2EAA0B;QACxB,sIACA;QAAA,gFAAgI;QAChI,6LAEA;QAAA,gFAAsI;QACxI,4DAAM;QAEN,uEAAI;QAAA,yEAAY;QAAA,4DAAK;QACrB,2EAA0B;QACxB,qHACA;QAAA,wFAAgE;QAChE,iHACF;QAAA,4DAAM;QAEN,2EAA0B;QACxB,gHACA;QAAA,gFAAyF;QACzF,mGACF;QAAA,4DAAM;QAEN,2EAA0B;QACxB,yFAA2B;QAAA,sEAAG;QAAA,2EAAc;QAAA,4DAAI;QAAC,iEAAG;QAAA,sEAAG;QAAA,2EAAc;QAAA,4DAAI;QAAA,+DACzE;QAAA,gFAAsI;QACtI,iGACA;QAAA,gFAA8I;QAC9I,4EACA;QAAA,gFAAiJ;QACnJ,4DAAM;QAEN,2EAA0B;QACxB,gHAAkD;QAAA,sEAAG;QAAA,2EAAc;QAAA,4DAAI;QAAC,gPAExE;QAAA,gFAAmK;QACrK,4DAAM;QAIR,4DAAM;QAEN,wFAAqB;QACnB,+FAA4B;QAC1B,oFAAiB;QACf,sEACF;QAAA,4DAAkB;QACpB,4DAA6B;QAC7B,uEAAI;QAAA,yEAAY;QAAA,4DAAK;QACrB,8KACA;QAAA,0EAA4C;QAAA,8FAAiC;QAAA,4DAAI;QAEjF,wEAAK;QAAA,4nCAkBM;QAAA,4DAAM;QAEjB,uEAAI;QAAA,mEAAM;QAAA,4DAAK;QACf,0EAA2C;QAAA,6FAAgC;QAAA,4DAAI;QAC/E,wEAAK;QAAA,4pCAmBwD;QAAA,4DAAM;QAEnE,uEAAI;QAAA,yEAAY;QAAA,4DAAK;QACrB,0EAAsD;QAAA,wGAA2C;QAAA,4DAAI;QACrG,wEAAK;QAAA,okDA4B6D;QAAA,4DAAM;QAC1E,4DAAsB;;;;;;;;;;;;;;AC7QtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA0D;AAEX;AACY;AACI;AACc;AAClB;AACe;AAC0B;AAC3C;AACH;AACqB;AACR;AACZ;;AA+BhD,MAAM,SAAS;;kEAAT,SAAS;yFAAT,SAAS,cAFR,2DAAY;8FATb,CAAC;YACV,OAAO,EAAE,kEAAiB;YAC1B,QAAQ,EAAE;gBACR,iBAAiB,EAAE,GAAG,EAAE,CAAC,qKAA+B;gBACxD,SAAS,EAAE;oBACT,MAAM,EAAE,GAAG,EAAE,CAAC,yJAA6B;iBAC5C;aACF;SACF,CAAC,YAnBO;YACP,uEAAa;YACb,0EAAgB;YAChB,8EAAkB;YAClB,4FAAuB;YACvB,0EAAgB;YAChB,wEAAe;YACf,qEAAgB;YAChB,gEAAe;YACf,uEAAe;SAChB;oIAYU,SAAS,mBA3BlB,2DAAY;QACZ,sFAAgB;QAChB,gHAAwB;QACxB,wFAAgB,aAGhB,uEAAa;QACb,0EAAgB;QAChB,8EAAkB;QAClB,4FAAuB;QACvB,0EAAgB;QAChB,wEAAe;QACf,qEAAgB;QAChB,gEAAe;QACf,uEAAe;;;;;;;;;;;;;;;;;;;ACzBZ,MAAM,eAAe;IAE1B,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IACpC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAM,wCAAwC,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAM,2CAA2C,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAM,oCAAoC,CAAC,CAAC;IACrE,CAAC;;8EAfU,eAAe;kGAAf,eAAe,WAAf,eAAe,mBAFd,MAAM;;;;;;;;;;;;;;;;;;;ACL2B;AAGF;AACY;AAEzD,IAAI,qEAAW,CAAC,UAAU,EAAE;IAC1B,oEAAc,EAAE,CAAC;CAClB;AAED,2EAAwB,CAAC,eAAe,CAAC,yDAAS,CAAC;KAChD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;;;;;;;;;;;;ACXpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,4CAA4C,WAAW;AACvD;AACA;AACA,qC","file":"main.js","sourcesContent":["import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-browser',\n templateUrl: './browser.component.html',\n styleUrls: ['./browser.component.css']\n})\nexport class BrowserComponent implements OnInit {\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","
\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nexport const environment = {\n production: false\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/dist/zone-error'; // Included with Angular CLI.\n","
\n For this part, you should load the Pokemon example data.\n \n
\n\n
\n We will start by simply fetching all nodes in the database. Because there might be a lot of them, we limit the number of results.\n \n The MATCH keyword tells the database we want to fetch some data according to a certain pattern which is/are given afterwards.\n All elements matching parts of the pattern are stored in a variable if one is given, in our case it is called node.\n The last part of the query is the RETURN after which all variables we want in our result are specified, in our case only node.\n The optional LIMIT caps the results after the given number.\n Without this, our database would return us 916 elements for the Pokemon test dataset.\n
\n\n
\n If we only want a specific type of nodes, we can specify this by adding a label to the pattern.\n \n
\n\n
\n To show the difference, we now query the types Pokemon can have.\n \n Because there are only 18, we can omit the LIMIT.\n
\n\n
\n In this example we combine the previous two queries by specifying two patterns.\n \n We now limit the number of results again to 25.\n This query is a very bad example (and Neo4J Browser warns about this one), because we are actually building the Cartesian product of the two sets of results.\n According to Neo4J Browser, the number of records would be 16164. \n A better query is to ask for a Pokemon and its adjacent type:\n \n Here, the label HAS_TYPE is the label of an edge connecting a Pokemon with its type.\n And because we both of the variables returned, we can replace p, t with an asterisk.\n \n
\n\n
\n Nodes and edges can also have multiple labels.\n For example there are normal Pokemon and legendary ones (which are unique).\n The latter ones have two labels and can be queried accordingly.\n \n \n \n All three queries yield the same result.\n
\n\n
Filtering with Properties
\n So far, we only selected nodes based on the labels. Most of the time, we also want to filter based on the stored properties.\n\n
\n We now want to find the most famous Pokemon.\n Please be aware that the string comparison is case sensitive and the name is given in lower case.\n \n The filtering is like in SQL done with the WHERE part.\n Here, we access the property name and compare it against 'pikachu'.\n Another possibilily is to include the name already in the pattern:\n \n
\n\n
\n We can also filter for an internal id\n \n Please note that the id is not really predictable and this query might not yield a meaningful result.\n
\n\n
\n We can also filter using all kinds of functions and combinations.\n \n \n \n
\n\n
Filtering with Paths
\n\n
\n We can also use the paths to enhance our filtering.\n For example, we want only fire Pokemon from the first generation (which means a pokedexId <= 150).\n \n Because we did not assign a variable to :Type, we could use RETURN * and only got the Pokemon.\n
\n\n
\n Also edges can have properties.\n Pokemon might have more than one type.\n We now query all Pokemon with fire as secondary type.\n \n
\n\n
\n We can also check for the absence of a certain path.\n In the next example, we want all pokemon which cannot evolve further.\n () RETURN p LIMIT 25\">\n The () here stands for an arbitrary node we do not restrict in any way and also do not store in a variable. \n Please note that we used -[]-> which is a directed edge instead of the -[]- we used earlier.\n All edges in Neo4J are directed and we can care about the direction or not.\n
\n\n
\n Path patterns can be arbitrary complex.\n To find all pokemon having only two evolution states, we can use this query:\n (p2:Pokemon) WHERE NOT (p2)-[:EVOLVES_TO]->() RETURN chain\">\n
\n\n
\n For Pokemon with three evolutionary levels, we can use an abbreviation:\n (p3:Pokemon) WHERE NOT (p3)-[:EVOLVES_TO]->() RETURN *\">\n Where we do not see the full path but only start end end.\n If we again store the paths in a variable, we get all three Pokemon.\n (p3:Pokemon) WHERE NOT (p3)-[:EVOLVES_TO]->() RETURN *\">\n
\n\n
Path finding
\n
\n For this part, you should load the Sinnoh example map.\n \n Please note I did some simplifications to the map.\n
\n\n
\n First of all, let's have a look at the whole map.\n \n Another way of querying with labels.\n
\n\n
\n We can now find paths from Snowpoint City to Hearthome City.\n \n And get the lengths of each route.\n \n And also both\n \n
\n\n
\n Neo4J also offers some interesting functions like shortestPath() which finds the shortest instance of an path in an (according to the documentation) efficient way.\n Neo4J Browser advices to use an upper limit here to avoid long execution times\n \n
\n\n\n\n
\n\n\n \n \n Sources\n \n \n
Pokemon data
\n Many thanks to GitHub user Eevee/Veekun for providing a lot of data about Pokemon in CSV data under MIT License\n https://github.com/veekun/pokedex\n\n
Copyright OpenJS Foundation and other contributors, https://openjsf.org/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
BSD 3-Clause License\n\nCopyright (c) 2006, Ivan Sagalaev.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\n\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\n\nimport { AppComponent } from './app.component';\nimport {MatToolbarModule} from '@angular/material/toolbar';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {BrowserAnimationsModule} from '@angular/platform-browser/animations';\nimport {MatDividerModule} from '@angular/material/divider';\nimport { BrowserComponent } from './components/browser/browser.component';\nimport { DatabaseControlComponent } from './components/database-control/database-control.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {HttpClientModule} from '@angular/common/http';\nimport { SnippetComponent } from './components/snippset/snippet.component';\nimport {HIGHLIGHT_OPTIONS, HighlightModule} from 'ngx-highlightjs';\nimport {ClipboardModule} from '@angular/cdk/clipboard';\n\n@NgModule({\n declarations: [\n AppComponent,\n BrowserComponent,\n DatabaseControlComponent,\n SnippetComponent\n ],\n imports: [\n BrowserModule,\n MatToolbarModule,\n MatExpansionModule,\n BrowserAnimationsModule,\n MatDividerModule,\n MatButtonModule,\n HttpClientModule,\n HighlightModule,\n ClipboardModule\n ],\n providers: [{\n provide: HIGHLIGHT_OPTIONS,\n useValue: {\n coreLibraryLoader: () => import('highlight.js/lib/core'),\n languages: {\n cypher: () => import('../assets/cypher.js'),\n }\n }\n }],\n bootstrap: [AppComponent]\n})\nexport class AppModule { }\n","import {Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {Observable} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatabaseService {\n\n constructor(private http: HttpClient) {\n }\n\n public loadPokemon(): Observable {\n return this.http.post('http://localhost:8080/api/pokemon/load', null);\n }\n\n public loadSinnohMap(): Observable {\n return this.http.post('http://localhost:8080/api/sinnoh-map/load', null);\n }\n\n public clearDatabase(): Observable {\n return this.http.delete('http://localhost:8080/api/database');\n }\n}\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"zn8P\";"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/polyfills.js b/src/main/resources/static/polyfills.js
new file mode 100644
index 0000000..cca2717
--- /dev/null
+++ b/src/main/resources/static/polyfills.js
@@ -0,0 +1,3057 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["polyfills"],{
+
+/***/ 1:
+/*!********************************!*\
+ !*** multi ./src/polyfills.ts ***!
+ \********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! /home/daniel/IdeaProjects/Neo4JDemo/frontend/src/polyfills.ts */"hN/g");
+
+
+/***/ }),
+
+/***/ "hN/g":
+/*!**************************!*\
+ !*** ./src/polyfills.ts ***!
+ \**************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zone.js/dist/zone */ "pDpN");
+/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_0__);
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/guide/browser-support
+ */
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+/**
+ * IE11 requires the following for NgClass support on SVG elements
+ */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+/**
+ * Web Animations `@angular/platform-browser/animations`
+ * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
+ * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
+ */
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ * because those flags need to be set before `zone.js` being loaded, and webpack
+ * will put import in the top of bundle, so user need to create a separate file
+ * in this directory (for example: zone-flags.ts), and put the following flags
+ * into that file, and then add the following code before importing zone.js.
+ * import './zone-flags';
+ *
+ * The flags allowed in zone-flags.ts are listed here.
+ *
+ * The following flags will work for all browsers.
+ *
+ * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+ *
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ *
+ * (window as any).__Zone_enable_cross_context_check = true;
+ *
+ */
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+ // Included with Angular CLI.
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+
+/***/ }),
+
+/***/ "pDpN":
+/*!*****************************************************!*\
+ !*** ./node_modules/zone.js/dist/zone-evergreen.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/**
+ * @license Angular v12.0.0-next.0
+ * (c) 2010-2020 Google LLC. https://angular.io/
+ * License: MIT
+ */
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const Zone$1 = (function (global) {
+ const performance = global['performance'];
+ function mark(name) {
+ performance && performance['mark'] && performance['mark'](name);
+ }
+ function performanceMeasure(name, label) {
+ performance && performance['measure'] && performance['measure'](name, label);
+ }
+ mark('Zone');
+ // Initialize before it's accessed below.
+ // __Zone_symbol_prefix global can be used to override the default zone
+ // symbol prefix with a custom one if needed.
+ const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
+ function __symbol__(name) {
+ return symbolPrefix + name;
+ }
+ const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
+ if (global['Zone']) {
+ // if global['Zone'] already exists (maybe zone.js was already loaded or
+ // some other lib also registered a global object named Zone), we may need
+ // to throw an error, but sometimes user may not want this error.
+ // For example,
+ // we have two web pages, page1 includes zone.js, page2 doesn't.
+ // and the 1st time user load page1 and page2, everything work fine,
+ // but when user load page2 again, error occurs because global['Zone'] already exists.
+ // so we add a flag to let user choose whether to throw this error or not.
+ // By default, if existing Zone is from zone.js, we will not throw the error.
+ if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') {
+ throw new Error('Zone already loaded.');
+ }
+ else {
+ return global['Zone'];
+ }
+ }
+ class Zone {
+ constructor(parent, zoneSpec) {
+ this._parent = parent;
+ this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '';
+ this._properties = zoneSpec && zoneSpec.properties || {};
+ this._zoneDelegate =
+ new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
+ }
+ static assertZonePatched() {
+ if (global['Promise'] !== patches['ZoneAwarePromise']) {
+ throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
+ 'has been overwritten.\n' +
+ 'Most likely cause is that a Promise polyfill has been loaded ' +
+ 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
+ 'If you must load one, do so before loading zone.js.)');
+ }
+ }
+ static get root() {
+ let zone = Zone.current;
+ while (zone.parent) {
+ zone = zone.parent;
+ }
+ return zone;
+ }
+ static get current() {
+ return _currentZoneFrame.zone;
+ }
+ static get currentTask() {
+ return _currentTask;
+ }
+ // tslint:disable-next-line:require-internal-with-underscore
+ static __load_patch(name, fn, ignoreDuplicate = false) {
+ if (patches.hasOwnProperty(name)) {
+ // `checkDuplicate` option is defined from global variable
+ // so it works for all modules.
+ // `ignoreDuplicate` can work for the specified module
+ if (!ignoreDuplicate && checkDuplicate) {
+ throw Error('Already loaded patch: ' + name);
+ }
+ }
+ else if (!global['__Zone_disable_' + name]) {
+ const perfName = 'Zone:' + name;
+ mark(perfName);
+ patches[name] = fn(global, Zone, _api);
+ performanceMeasure(perfName, perfName);
+ }
+ }
+ get parent() {
+ return this._parent;
+ }
+ get name() {
+ return this._name;
+ }
+ get(key) {
+ const zone = this.getZoneWith(key);
+ if (zone)
+ return zone._properties[key];
+ }
+ getZoneWith(key) {
+ let current = this;
+ while (current) {
+ if (current._properties.hasOwnProperty(key)) {
+ return current;
+ }
+ current = current._parent;
+ }
+ return null;
+ }
+ fork(zoneSpec) {
+ if (!zoneSpec)
+ throw new Error('ZoneSpec required!');
+ return this._zoneDelegate.fork(this, zoneSpec);
+ }
+ wrap(callback, source) {
+ if (typeof callback !== 'function') {
+ throw new Error('Expecting function got: ' + callback);
+ }
+ const _callback = this._zoneDelegate.intercept(this, callback, source);
+ const zone = this;
+ return function () {
+ return zone.runGuarded(_callback, this, arguments, source);
+ };
+ }
+ run(callback, applyThis, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ }
+ runGuarded(callback, applyThis = null, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ }
+ runTask(task, applyThis, applyArgs) {
+ if (task.zone != this) {
+ throw new Error('A task can only be run in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ }
+ // https://github.com/angular/zone.js/issues/778, sometimes eventTask
+ // will run in notScheduled(canceled) state, we should not try to
+ // run such kind of task but just return
+ if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {
+ return;
+ }
+ const reEntryGuard = task.state != running;
+ reEntryGuard && task._transitionTo(running, scheduled);
+ task.runCount++;
+ const previousTask = _currentTask;
+ _currentTask = task;
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ if (task.type == macroTask && task.data && !task.data.isPeriodic) {
+ task.cancelFn = undefined;
+ }
+ try {
+ return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ // if the task's state is notScheduled or unknown, then it has already been cancelled
+ // we should not reset the state to scheduled
+ if (task.state !== notScheduled && task.state !== unknown) {
+ if (task.type == eventTask || (task.data && task.data.isPeriodic)) {
+ reEntryGuard && task._transitionTo(scheduled, running);
+ }
+ else {
+ task.runCount = 0;
+ this._updateTaskCount(task, -1);
+ reEntryGuard &&
+ task._transitionTo(notScheduled, running, notScheduled);
+ }
+ }
+ _currentZoneFrame = _currentZoneFrame.parent;
+ _currentTask = previousTask;
+ }
+ }
+ scheduleTask(task) {
+ if (task.zone && task.zone !== this) {
+ // check if the task was rescheduled, the newZone
+ // should not be the children of the original zone
+ let newZone = this;
+ while (newZone) {
+ if (newZone === task.zone) {
+ throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
+ }
+ newZone = newZone.parent;
+ }
+ }
+ task._transitionTo(scheduling, notScheduled);
+ const zoneDelegates = [];
+ task._zoneDelegates = zoneDelegates;
+ task._zone = this;
+ try {
+ task = this._zoneDelegate.scheduleTask(this, task);
+ }
+ catch (err) {
+ // should set task's state to unknown when scheduleTask throw error
+ // because the err may from reschedule, so the fromState maybe notScheduled
+ task._transitionTo(unknown, scheduling, notScheduled);
+ // TODO: @JiaLiPassion, should we check the result from handleError?
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ if (task._zoneDelegates === zoneDelegates) {
+ // we have to check because internally the delegate can reschedule the task.
+ this._updateTaskCount(task, 1);
+ }
+ if (task.state == scheduling) {
+ task._transitionTo(scheduled, scheduling);
+ }
+ return task;
+ }
+ scheduleMicroTask(source, callback, data, customSchedule) {
+ return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
+ }
+ scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
+ }
+ scheduleEventTask(source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
+ }
+ cancelTask(task) {
+ if (task.zone != this)
+ throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ task._transitionTo(canceling, scheduled, running);
+ try {
+ this._zoneDelegate.cancelTask(this, task);
+ }
+ catch (err) {
+ // if error occurs when cancelTask, transit the state to unknown
+ task._transitionTo(unknown, canceling);
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ this._updateTaskCount(task, -1);
+ task._transitionTo(notScheduled, canceling);
+ task.runCount = 0;
+ return task;
+ }
+ _updateTaskCount(task, count) {
+ const zoneDelegates = task._zoneDelegates;
+ if (count == -1) {
+ task._zoneDelegates = null;
+ }
+ for (let i = 0; i < zoneDelegates.length; i++) {
+ zoneDelegates[i]._updateTaskCount(task.type, count);
+ }
+ }
+ }
+ // tslint:disable-next-line:require-internal-with-underscore
+ Zone.__symbol__ = __symbol__;
+ const DELEGATE_ZS = {
+ name: '',
+ onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
+ onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
+ onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
+ onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task)
+ };
+ class ZoneDelegate {
+ constructor(zone, parentDelegate, zoneSpec) {
+ this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };
+ this.zone = zone;
+ this._parentDelegate = parentDelegate;
+ this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
+ this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
+ this._forkCurrZone =
+ zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate._forkCurrZone);
+ this._interceptZS =
+ zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
+ this._interceptDlgt =
+ zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
+ this._interceptCurrZone =
+ zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate._interceptCurrZone);
+ this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
+ this._invokeDlgt =
+ zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
+ this._invokeCurrZone =
+ zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate._invokeCurrZone);
+ this._handleErrorZS =
+ zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
+ this._handleErrorDlgt =
+ zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
+ this._handleErrorCurrZone =
+ zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate._handleErrorCurrZone);
+ this._scheduleTaskZS =
+ zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
+ this._scheduleTaskDlgt = zoneSpec &&
+ (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
+ this._scheduleTaskCurrZone =
+ zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate._scheduleTaskCurrZone);
+ this._invokeTaskZS =
+ zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
+ this._invokeTaskDlgt =
+ zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
+ this._invokeTaskCurrZone =
+ zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate._invokeTaskCurrZone);
+ this._cancelTaskZS =
+ zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
+ this._cancelTaskDlgt =
+ zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
+ this._cancelTaskCurrZone =
+ zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate._cancelTaskCurrZone);
+ this._hasTaskZS = null;
+ this._hasTaskDlgt = null;
+ this._hasTaskDlgtOwner = null;
+ this._hasTaskCurrZone = null;
+ const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
+ const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
+ if (zoneSpecHasTask || parentHasTask) {
+ // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
+ // a case all task related interceptors must go through this ZD. We can't short circuit it.
+ this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
+ this._hasTaskDlgt = parentDelegate;
+ this._hasTaskDlgtOwner = this;
+ this._hasTaskCurrZone = zone;
+ if (!zoneSpec.onScheduleTask) {
+ this._scheduleTaskZS = DELEGATE_ZS;
+ this._scheduleTaskDlgt = parentDelegate;
+ this._scheduleTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onInvokeTask) {
+ this._invokeTaskZS = DELEGATE_ZS;
+ this._invokeTaskDlgt = parentDelegate;
+ this._invokeTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onCancelTask) {
+ this._cancelTaskZS = DELEGATE_ZS;
+ this._cancelTaskDlgt = parentDelegate;
+ this._cancelTaskCurrZone = this.zone;
+ }
+ }
+ }
+ fork(targetZone, zoneSpec) {
+ return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :
+ new Zone(targetZone, zoneSpec);
+ }
+ intercept(targetZone, callback, source) {
+ return this._interceptZS ?
+ this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :
+ callback;
+ }
+ invoke(targetZone, callback, applyThis, applyArgs, source) {
+ return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :
+ callback.apply(applyThis, applyArgs);
+ }
+ handleError(targetZone, error) {
+ return this._handleErrorZS ?
+ this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :
+ true;
+ }
+ scheduleTask(targetZone, task) {
+ let returnTask = task;
+ if (this._scheduleTaskZS) {
+ if (this._hasTaskZS) {
+ returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
+ }
+ // clang-format off
+ returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
+ // clang-format on
+ if (!returnTask)
+ returnTask = task;
+ }
+ else {
+ if (task.scheduleFn) {
+ task.scheduleFn(task);
+ }
+ else if (task.type == microTask) {
+ scheduleMicroTask(task);
+ }
+ else {
+ throw new Error('Task is missing scheduleFn.');
+ }
+ }
+ return returnTask;
+ }
+ invokeTask(targetZone, task, applyThis, applyArgs) {
+ return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :
+ task.callback.apply(applyThis, applyArgs);
+ }
+ cancelTask(targetZone, task) {
+ let value;
+ if (this._cancelTaskZS) {
+ value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
+ }
+ else {
+ if (!task.cancelFn) {
+ throw Error('Task is not cancelable');
+ }
+ value = task.cancelFn(task);
+ }
+ return value;
+ }
+ hasTask(targetZone, isEmpty) {
+ // hasTask should not throw error so other ZoneDelegate
+ // can still trigger hasTask callback
+ try {
+ this._hasTaskZS &&
+ this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
+ }
+ catch (err) {
+ this.handleError(targetZone, err);
+ }
+ }
+ // tslint:disable-next-line:require-internal-with-underscore
+ _updateTaskCount(type, count) {
+ const counts = this._taskCounts;
+ const prev = counts[type];
+ const next = counts[type] = prev + count;
+ if (next < 0) {
+ throw new Error('More tasks executed then were scheduled.');
+ }
+ if (prev == 0 || next == 0) {
+ const isEmpty = {
+ microTask: counts['microTask'] > 0,
+ macroTask: counts['macroTask'] > 0,
+ eventTask: counts['eventTask'] > 0,
+ change: type
+ };
+ this.hasTask(this.zone, isEmpty);
+ }
+ }
+ }
+ class ZoneTask {
+ constructor(type, source, callback, options, scheduleFn, cancelFn) {
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._zone = null;
+ this.runCount = 0;
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._zoneDelegates = null;
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._state = 'notScheduled';
+ this.type = type;
+ this.source = source;
+ this.data = options;
+ this.scheduleFn = scheduleFn;
+ this.cancelFn = cancelFn;
+ if (!callback) {
+ throw new Error('callback is not defined');
+ }
+ this.callback = callback;
+ const self = this;
+ // TODO: @JiaLiPassion options should have interface
+ if (type === eventTask && options && options.useG) {
+ this.invoke = ZoneTask.invokeTask;
+ }
+ else {
+ this.invoke = function () {
+ return ZoneTask.invokeTask.call(global, self, this, arguments);
+ };
+ }
+ }
+ static invokeTask(task, target, args) {
+ if (!task) {
+ task = this;
+ }
+ _numberOfNestedTaskFrames++;
+ try {
+ task.runCount++;
+ return task.zone.runTask(task, target, args);
+ }
+ finally {
+ if (_numberOfNestedTaskFrames == 1) {
+ drainMicroTaskQueue();
+ }
+ _numberOfNestedTaskFrames--;
+ }
+ }
+ get zone() {
+ return this._zone;
+ }
+ get state() {
+ return this._state;
+ }
+ cancelScheduleRequest() {
+ this._transitionTo(notScheduled, scheduling);
+ }
+ // tslint:disable-next-line:require-internal-with-underscore
+ _transitionTo(toState, fromState1, fromState2) {
+ if (this._state === fromState1 || this._state === fromState2) {
+ this._state = toState;
+ if (toState == notScheduled) {
+ this._zoneDelegates = null;
+ }
+ }
+ else {
+ throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? ' or \'' + fromState2 + '\'' : ''}, was '${this._state}'.`);
+ }
+ }
+ toString() {
+ if (this.data && typeof this.data.handleId !== 'undefined') {
+ return this.data.handleId.toString();
+ }
+ else {
+ return Object.prototype.toString.call(this);
+ }
+ }
+ // add toJSON method to prevent cyclic error when
+ // call JSON.stringify(zoneTask)
+ toJSON() {
+ return {
+ type: this.type,
+ state: this.state,
+ source: this.source,
+ zone: this.zone.name,
+ runCount: this.runCount
+ };
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// MICROTASK QUEUE
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ const symbolSetTimeout = __symbol__('setTimeout');
+ const symbolPromise = __symbol__('Promise');
+ const symbolThen = __symbol__('then');
+ let _microTaskQueue = [];
+ let _isDrainingMicrotaskQueue = false;
+ let nativeMicroTaskQueuePromise;
+ function scheduleMicroTask(task) {
+ // if we are not running in any task, and there has not been anything scheduled
+ // we must bootstrap the initial task creation by manually scheduling the drain
+ if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
+ // We are not running in Task, so we need to kickstart the microtask queue.
+ if (!nativeMicroTaskQueuePromise) {
+ if (global[symbolPromise]) {
+ nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
+ }
+ }
+ if (nativeMicroTaskQueuePromise) {
+ let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
+ if (!nativeThen) {
+ // native Promise is not patchable, we need to use `then` directly
+ // issue 1078
+ nativeThen = nativeMicroTaskQueuePromise['then'];
+ }
+ nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue);
+ }
+ else {
+ global[symbolSetTimeout](drainMicroTaskQueue, 0);
+ }
+ }
+ task && _microTaskQueue.push(task);
+ }
+ function drainMicroTaskQueue() {
+ if (!_isDrainingMicrotaskQueue) {
+ _isDrainingMicrotaskQueue = true;
+ while (_microTaskQueue.length) {
+ const queue = _microTaskQueue;
+ _microTaskQueue = [];
+ for (let i = 0; i < queue.length; i++) {
+ const task = queue[i];
+ try {
+ task.zone.runTask(task, null, null);
+ }
+ catch (error) {
+ _api.onUnhandledError(error);
+ }
+ }
+ }
+ _api.microtaskDrainDone();
+ _isDrainingMicrotaskQueue = false;
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// BOOTSTRAP
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ const NO_ZONE = { name: 'NO ZONE' };
+ const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
+ const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
+ const patches = {};
+ const _api = {
+ symbol: __symbol__,
+ currentZoneFrame: () => _currentZoneFrame,
+ onUnhandledError: noop,
+ microtaskDrainDone: noop,
+ scheduleMicroTask: scheduleMicroTask,
+ showUncaughtError: () => !Zone[__symbol__('ignoreConsoleErrorUncaughtError')],
+ patchEventTarget: () => [],
+ patchOnProperties: noop,
+ patchMethod: () => noop,
+ bindArguments: () => [],
+ patchThen: () => noop,
+ patchMacroTask: () => noop,
+ patchEventPrototype: () => noop,
+ isIEOrEdge: () => false,
+ getGlobalObjects: () => undefined,
+ ObjectDefineProperty: () => noop,
+ ObjectGetOwnPropertyDescriptor: () => undefined,
+ ObjectCreate: () => undefined,
+ ArraySlice: () => [],
+ patchClass: () => noop,
+ wrapWithCurrentZone: () => noop,
+ filterProperties: () => [],
+ attachOriginToPatched: () => noop,
+ _redefineProperty: () => noop,
+ patchCallbacks: () => noop
+ };
+ let _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
+ let _currentTask = null;
+ let _numberOfNestedTaskFrames = 0;
+ function noop() { }
+ performanceMeasure('Zone', 'Zone');
+ return global['Zone'] = Zone;
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Suppress closure compiler errors about unknown 'Zone' variable
+ * @fileoverview
+ * @suppress {undefinedVars,globalThis,missingRequire}
+ */
+///
+// issue #989, to reduce bundle size, use short name
+/** Object.getOwnPropertyDescriptor */
+const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+/** Object.defineProperty */
+const ObjectDefineProperty = Object.defineProperty;
+/** Object.getPrototypeOf */
+const ObjectGetPrototypeOf = Object.getPrototypeOf;
+/** Object.create */
+const ObjectCreate = Object.create;
+/** Array.prototype.slice */
+const ArraySlice = Array.prototype.slice;
+/** addEventListener string const */
+const ADD_EVENT_LISTENER_STR = 'addEventListener';
+/** removeEventListener string const */
+const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
+/** zoneSymbol addEventListener */
+const ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);
+/** zoneSymbol removeEventListener */
+const ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);
+/** true string const */
+const TRUE_STR = 'true';
+/** false string const */
+const FALSE_STR = 'false';
+/** Zone symbol prefix string const. */
+const ZONE_SYMBOL_PREFIX = Zone.__symbol__('');
+function wrapWithCurrentZone(callback, source) {
+ return Zone.current.wrap(callback, source);
+}
+function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
+ return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
+}
+const zoneSymbol = Zone.__symbol__;
+const isWindowExists = typeof window !== 'undefined';
+const internalWindow = isWindowExists ? window : undefined;
+const _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;
+const REMOVE_ATTRIBUTE = 'removeAttribute';
+const NULL_ON_PROP_VALUE = [null];
+function bindArguments(args, source) {
+ for (let i = args.length - 1; i >= 0; i--) {
+ if (typeof args[i] === 'function') {
+ args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
+ }
+ }
+ return args;
+}
+function patchPrototype(prototype, fnNames) {
+ const source = prototype.constructor['name'];
+ for (let i = 0; i < fnNames.length; i++) {
+ const name = fnNames[i];
+ const delegate = prototype[name];
+ if (delegate) {
+ const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
+ if (!isPropertyWritable(prototypeDesc)) {
+ continue;
+ }
+ prototype[name] = ((delegate) => {
+ const patched = function () {
+ return delegate.apply(this, bindArguments(arguments, source + '.' + name));
+ };
+ attachOriginToPatched(patched, delegate);
+ return patched;
+ })(delegate);
+ }
+ }
+}
+function isPropertyWritable(propertyDesc) {
+ if (!propertyDesc) {
+ return true;
+ }
+ if (propertyDesc.writable === false) {
+ return false;
+ }
+ return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
+}
+const isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+const isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]');
+const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
+// we are in electron of nw, so we are both browser and nodejs
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+const isMix = typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&
+ !!(isWindowExists && internalWindow['HTMLElement']);
+const zoneSymbolEventNames = {};
+const wrapFn = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ let eventNameSymbol = zoneSymbolEventNames[event.type];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
+ }
+ const target = this || event.target || _global;
+ const listener = target[eventNameSymbol];
+ let result;
+ if (isBrowser && target === internalWindow && event.type === 'error') {
+ // window.onerror have different signiture
+ // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
+ // and onerror callback will prevent default when callback return true
+ const errorEvent = event;
+ result = listener &&
+ listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
+ if (result === true) {
+ event.preventDefault();
+ }
+ }
+ else {
+ result = listener && listener.apply(this, arguments);
+ if (result != undefined && !result) {
+ event.preventDefault();
+ }
+ }
+ return result;
+};
+function patchProperty(obj, prop, prototype) {
+ let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
+ if (!desc && prototype) {
+ // when patch window object, use prototype to check prop exist or not
+ const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
+ if (prototypeDesc) {
+ desc = { enumerable: true, configurable: true };
+ }
+ }
+ // if the descriptor not exists or is not configurable
+ // just return
+ if (!desc || !desc.configurable) {
+ return;
+ }
+ const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
+ if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
+ return;
+ }
+ // A property descriptor cannot have getter/setter and be writable
+ // deleting the writable and value properties avoids this error:
+ //
+ // TypeError: property descriptors must not specify a value or be writable when a
+ // getter or setter has been specified
+ delete desc.writable;
+ delete desc.value;
+ const originalDescGet = desc.get;
+ const originalDescSet = desc.set;
+ // substr(2) cuz 'onclick' -> 'click', etc
+ const eventName = prop.substr(2);
+ let eventNameSymbol = zoneSymbolEventNames[eventName];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
+ }
+ desc.set = function (newValue) {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ let target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return;
+ }
+ let previousValue = target[eventNameSymbol];
+ if (previousValue) {
+ target.removeEventListener(eventName, wrapFn);
+ }
+ // issue #978, when onload handler was added before loading zone.js
+ // we should remove it with originalDescSet
+ if (originalDescSet) {
+ originalDescSet.apply(target, NULL_ON_PROP_VALUE);
+ }
+ if (typeof newValue === 'function') {
+ target[eventNameSymbol] = newValue;
+ target.addEventListener(eventName, wrapFn, false);
+ }
+ else {
+ target[eventNameSymbol] = null;
+ }
+ };
+ // The getter would return undefined for unassigned properties but the default value of an
+ // unassigned property is null
+ desc.get = function () {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ let target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return null;
+ }
+ const listener = target[eventNameSymbol];
+ if (listener) {
+ return listener;
+ }
+ else if (originalDescGet) {
+ // result will be null when use inline event attribute,
+ // such as
+ // because the onclick function is internal raw uncompiled handler
+ // the onclick will be evaluated when first time event was triggered or
+ // the property is accessed, https://github.com/angular/zone.js/issues/525
+ // so we should use original native get to retrieve the handler
+ let value = originalDescGet && originalDescGet.call(this);
+ if (value) {
+ desc.set.call(this, value);
+ if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
+ target.removeAttribute(prop);
+ }
+ return value;
+ }
+ }
+ return null;
+ };
+ ObjectDefineProperty(obj, prop, desc);
+ obj[onPropPatchedSymbol] = true;
+}
+function patchOnProperties(obj, properties, prototype) {
+ if (properties) {
+ for (let i = 0; i < properties.length; i++) {
+ patchProperty(obj, 'on' + properties[i], prototype);
+ }
+ }
+ else {
+ const onProperties = [];
+ for (const prop in obj) {
+ if (prop.substr(0, 2) == 'on') {
+ onProperties.push(prop);
+ }
+ }
+ for (let j = 0; j < onProperties.length; j++) {
+ patchProperty(obj, onProperties[j], prototype);
+ }
+ }
+}
+const originalInstanceKey = zoneSymbol('originalInstance');
+// wrap some native API on `window`
+function patchClass(className) {
+ const OriginalClass = _global[className];
+ if (!OriginalClass)
+ return;
+ // keep original class in global
+ _global[zoneSymbol(className)] = OriginalClass;
+ _global[className] = function () {
+ const a = bindArguments(arguments, className);
+ switch (a.length) {
+ case 0:
+ this[originalInstanceKey] = new OriginalClass();
+ break;
+ case 1:
+ this[originalInstanceKey] = new OriginalClass(a[0]);
+ break;
+ case 2:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
+ break;
+ case 3:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
+ break;
+ case 4:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
+ break;
+ default:
+ throw new Error('Arg list too long.');
+ }
+ };
+ // attach original delegate to patched function
+ attachOriginToPatched(_global[className], OriginalClass);
+ const instance = new OriginalClass(function () { });
+ let prop;
+ for (prop in instance) {
+ // https://bugs.webkit.org/show_bug.cgi?id=44721
+ if (className === 'XMLHttpRequest' && prop === 'responseBlob')
+ continue;
+ (function (prop) {
+ if (typeof instance[prop] === 'function') {
+ _global[className].prototype[prop] = function () {
+ return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
+ };
+ }
+ else {
+ ObjectDefineProperty(_global[className].prototype, prop, {
+ set: function (fn) {
+ if (typeof fn === 'function') {
+ this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
+ // keep callback in wrapped function so we can
+ // use it in Function.prototype.toString to return
+ // the native one.
+ attachOriginToPatched(this[originalInstanceKey][prop], fn);
+ }
+ else {
+ this[originalInstanceKey][prop] = fn;
+ }
+ },
+ get: function () {
+ return this[originalInstanceKey][prop];
+ }
+ });
+ }
+ }(prop));
+ }
+ for (prop in OriginalClass) {
+ if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
+ _global[className][prop] = OriginalClass[prop];
+ }
+ }
+}
+function patchMethod(target, name, patchFn) {
+ let proto = target;
+ while (proto && !proto.hasOwnProperty(name)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && target[name]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = target;
+ }
+ const delegateName = zoneSymbol(name);
+ let delegate = null;
+ if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
+ delegate = proto[delegateName] = proto[name];
+ // check whether proto[name] is writable
+ // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
+ const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
+ if (isPropertyWritable(desc)) {
+ const patchDelegate = patchFn(delegate, delegateName, name);
+ proto[name] = function () {
+ return patchDelegate(this, arguments);
+ };
+ attachOriginToPatched(proto[name], delegate);
+ }
+ }
+ return delegate;
+}
+// TODO: @JiaLiPassion, support cancel task later if necessary
+function patchMacroTask(obj, funcName, metaCreator) {
+ let setNative = null;
+ function scheduleTask(task) {
+ const data = task.data;
+ data.args[data.cbIdx] = function () {
+ task.invoke.apply(this, arguments);
+ };
+ setNative.apply(data.target, data.args);
+ return task;
+ }
+ setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
+ const meta = metaCreator(self, args);
+ if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
+ return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(self, args);
+ }
+ });
+}
+function attachOriginToPatched(patched, original) {
+ patched[zoneSymbol('OriginalDelegate')] = original;
+}
+let isDetectedIEOrEdge = false;
+let ieOrEdge = false;
+function isIE() {
+ try {
+ const ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {
+ return true;
+ }
+ }
+ catch (error) {
+ }
+ return false;
+}
+function isIEOrEdge() {
+ if (isDetectedIEOrEdge) {
+ return ieOrEdge;
+ }
+ isDetectedIEOrEdge = true;
+ try {
+ const ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
+ ieOrEdge = true;
+ }
+ }
+ catch (error) {
+ }
+ return ieOrEdge;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
+ const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ const ObjectDefineProperty = Object.defineProperty;
+ function readableObjectToString(obj) {
+ if (obj && obj.toString === Object.prototype.toString) {
+ const className = obj.constructor && obj.constructor.name;
+ return (className ? className : '') + ': ' + JSON.stringify(obj);
+ }
+ return obj ? obj.toString() : Object.prototype.toString.call(obj);
+ }
+ const __symbol__ = api.symbol;
+ const _uncaughtPromiseErrors = [];
+ const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] === true;
+ const symbolPromise = __symbol__('Promise');
+ const symbolThen = __symbol__('then');
+ const creationTrace = '__creationTrace__';
+ api.onUnhandledError = (e) => {
+ if (api.showUncaughtError()) {
+ const rejection = e && e.rejection;
+ if (rejection) {
+ console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
+ }
+ else {
+ console.error(e);
+ }
+ }
+ };
+ api.microtaskDrainDone = () => {
+ while (_uncaughtPromiseErrors.length) {
+ const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
+ try {
+ uncaughtPromiseError.zone.runGuarded(() => {
+ if (uncaughtPromiseError.throwOriginal) {
+ throw uncaughtPromiseError.rejection;
+ }
+ throw uncaughtPromiseError;
+ });
+ }
+ catch (error) {
+ handleUnhandledRejection(error);
+ }
+ }
+ };
+ const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
+ function handleUnhandledRejection(e) {
+ api.onUnhandledError(e);
+ try {
+ const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
+ if (typeof handler === 'function') {
+ handler.call(this, e);
+ }
+ }
+ catch (err) {
+ }
+ }
+ function isThenable(value) {
+ return value && value.then;
+ }
+ function forwardResolution(value) {
+ return value;
+ }
+ function forwardRejection(rejection) {
+ return ZoneAwarePromise.reject(rejection);
+ }
+ const symbolState = __symbol__('state');
+ const symbolValue = __symbol__('value');
+ const symbolFinally = __symbol__('finally');
+ const symbolParentPromiseValue = __symbol__('parentPromiseValue');
+ const symbolParentPromiseState = __symbol__('parentPromiseState');
+ const source = 'Promise.then';
+ const UNRESOLVED = null;
+ const RESOLVED = true;
+ const REJECTED = false;
+ const REJECTED_NO_CATCH = 0;
+ function makeResolver(promise, state) {
+ return (v) => {
+ try {
+ resolvePromise(promise, state, v);
+ }
+ catch (err) {
+ resolvePromise(promise, false, err);
+ }
+ // Do not return value or you will break the Promise spec.
+ };
+ }
+ const once = function () {
+ let wasCalled = false;
+ return function wrapper(wrappedFunction) {
+ return function () {
+ if (wasCalled) {
+ return;
+ }
+ wasCalled = true;
+ wrappedFunction.apply(null, arguments);
+ };
+ };
+ };
+ const TYPE_ERROR = 'Promise resolved with itself';
+ const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
+ // Promise Resolution
+ function resolvePromise(promise, state, value) {
+ const onceWrapper = once();
+ if (promise === value) {
+ throw new TypeError(TYPE_ERROR);
+ }
+ if (promise[symbolState] === UNRESOLVED) {
+ // should only get value.then once based on promise spec.
+ let then = null;
+ try {
+ if (typeof value === 'object' || typeof value === 'function') {
+ then = value && value.then;
+ }
+ }
+ catch (err) {
+ onceWrapper(() => {
+ resolvePromise(promise, false, err);
+ })();
+ return promise;
+ }
+ // if (value instanceof ZoneAwarePromise) {
+ if (state !== REJECTED && value instanceof ZoneAwarePromise &&
+ value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&
+ value[symbolState] !== UNRESOLVED) {
+ clearRejectedNoCatch(value);
+ resolvePromise(promise, value[symbolState], value[symbolValue]);
+ }
+ else if (state !== REJECTED && typeof then === 'function') {
+ try {
+ then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
+ }
+ catch (err) {
+ onceWrapper(() => {
+ resolvePromise(promise, false, err);
+ })();
+ }
+ }
+ else {
+ promise[symbolState] = state;
+ const queue = promise[symbolValue];
+ promise[symbolValue] = value;
+ if (promise[symbolFinally] === symbolFinally) {
+ // the promise is generated by Promise.prototype.finally
+ if (state === RESOLVED) {
+ // the state is resolved, should ignore the value
+ // and use parent promise value
+ promise[symbolState] = promise[symbolParentPromiseState];
+ promise[symbolValue] = promise[symbolParentPromiseValue];
+ }
+ }
+ // record task information in value when error occurs, so we can
+ // do some additional work such as render longStackTrace
+ if (state === REJECTED && value instanceof Error) {
+ // check if longStackTraceZone is here
+ const trace = Zone.currentTask && Zone.currentTask.data &&
+ Zone.currentTask.data[creationTrace];
+ if (trace) {
+ // only keep the long stack trace into error when in longStackTraceZone
+ ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });
+ }
+ }
+ for (let i = 0; i < queue.length;) {
+ scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
+ }
+ if (queue.length == 0 && state == REJECTED) {
+ promise[symbolState] = REJECTED_NO_CATCH;
+ let uncaughtPromiseError = value;
+ try {
+ // Here we throws a new Error to print more readable error log
+ // and if the value is not an error, zone.js builds an `Error`
+ // Object here to attach the stack information.
+ throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +
+ (value && value.stack ? '\n' + value.stack : ''));
+ }
+ catch (err) {
+ uncaughtPromiseError = err;
+ }
+ if (isDisableWrappingUncaughtPromiseRejection) {
+ // If disable wrapping uncaught promise reject
+ // use the value instead of wrapping it.
+ uncaughtPromiseError.throwOriginal = true;
+ }
+ uncaughtPromiseError.rejection = value;
+ uncaughtPromiseError.promise = promise;
+ uncaughtPromiseError.zone = Zone.current;
+ uncaughtPromiseError.task = Zone.currentTask;
+ _uncaughtPromiseErrors.push(uncaughtPromiseError);
+ api.scheduleMicroTask(); // to make sure that it is running
+ }
+ }
+ }
+ // Resolving an already resolved promise is a noop.
+ return promise;
+ }
+ const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
+ function clearRejectedNoCatch(promise) {
+ if (promise[symbolState] === REJECTED_NO_CATCH) {
+ // if the promise is rejected no catch status
+ // and queue.length > 0, means there is a error handler
+ // here to handle the rejected promise, we should trigger
+ // windows.rejectionhandled eventHandler or nodejs rejectionHandled
+ // eventHandler
+ try {
+ const handler = Zone[REJECTION_HANDLED_HANDLER];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, { rejection: promise[symbolValue], promise: promise });
+ }
+ }
+ catch (err) {
+ }
+ promise[symbolState] = REJECTED;
+ for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
+ if (promise === _uncaughtPromiseErrors[i].promise) {
+ _uncaughtPromiseErrors.splice(i, 1);
+ }
+ }
+ }
+ }
+ function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
+ clearRejectedNoCatch(promise);
+ const promiseState = promise[symbolState];
+ const delegate = promiseState ?
+ (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :
+ (typeof onRejected === 'function') ? onRejected : forwardRejection;
+ zone.scheduleMicroTask(source, () => {
+ try {
+ const parentPromiseValue = promise[symbolValue];
+ const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
+ if (isFinallyPromise) {
+ // if the promise is generated from finally call, keep parent promise's state and value
+ chainPromise[symbolParentPromiseValue] = parentPromiseValue;
+ chainPromise[symbolParentPromiseState] = promiseState;
+ }
+ // should not pass value to finally callback
+ const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?
+ [] :
+ [parentPromiseValue]);
+ resolvePromise(chainPromise, true, value);
+ }
+ catch (error) {
+ // if error occurs, should always return this error
+ resolvePromise(chainPromise, false, error);
+ }
+ }, chainPromise);
+ }
+ const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
+ const noop = function () { };
+ class ZoneAwarePromise {
+ static toString() {
+ return ZONE_AWARE_PROMISE_TO_STRING;
+ }
+ static resolve(value) {
+ return resolvePromise(new this(null), RESOLVED, value);
+ }
+ static reject(error) {
+ return resolvePromise(new this(null), REJECTED, error);
+ }
+ static race(values) {
+ let resolve;
+ let reject;
+ let promise = new this((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ function onResolve(value) {
+ resolve(value);
+ }
+ function onReject(error) {
+ reject(error);
+ }
+ for (let value of values) {
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ value.then(onResolve, onReject);
+ }
+ return promise;
+ }
+ static all(values) {
+ return ZoneAwarePromise.allWithCallback(values);
+ }
+ static allSettled(values) {
+ const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
+ return P.allWithCallback(values, {
+ thenCallback: (value) => ({ status: 'fulfilled', value }),
+ errorCallback: (err) => ({ status: 'rejected', reason: err })
+ });
+ }
+ static allWithCallback(values, callback) {
+ let resolve;
+ let reject;
+ let promise = new this((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ // Start at 2 to prevent prematurely resolving if .then is called immediately.
+ let unresolvedCount = 2;
+ let valueIndex = 0;
+ const resolvedValues = [];
+ for (let value of values) {
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ const curValueIndex = valueIndex;
+ try {
+ value.then((value) => {
+ resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }, (err) => {
+ if (!callback) {
+ reject(err);
+ }
+ else {
+ resolvedValues[curValueIndex] = callback.errorCallback(err);
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }
+ });
+ }
+ catch (thenErr) {
+ reject(thenErr);
+ }
+ unresolvedCount++;
+ valueIndex++;
+ }
+ // Make the unresolvedCount zero-based again.
+ unresolvedCount -= 2;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ return promise;
+ }
+ constructor(executor) {
+ const promise = this;
+ if (!(promise instanceof ZoneAwarePromise)) {
+ throw new Error('Must be an instanceof Promise.');
+ }
+ promise[symbolState] = UNRESOLVED;
+ promise[symbolValue] = []; // queue;
+ try {
+ executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED));
+ }
+ catch (error) {
+ resolvePromise(promise, false, error);
+ }
+ }
+ get [Symbol.toStringTag]() {
+ return 'Promise';
+ }
+ get [Symbol.species]() {
+ return ZoneAwarePromise;
+ }
+ then(onFulfilled, onRejected) {
+ let C = this.constructor[Symbol.species];
+ if (!C || typeof C !== 'function') {
+ C = this.constructor || ZoneAwarePromise;
+ }
+ const chainPromise = new C(noop);
+ const zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
+ }
+ return chainPromise;
+ }
+ catch(onRejected) {
+ return this.then(null, onRejected);
+ }
+ finally(onFinally) {
+ let C = this.constructor[Symbol.species];
+ if (!C || typeof C !== 'function') {
+ C = ZoneAwarePromise;
+ }
+ const chainPromise = new C(noop);
+ chainPromise[symbolFinally] = symbolFinally;
+ const zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
+ }
+ return chainPromise;
+ }
+ }
+ // Protect against aggressive optimizers dropping seemingly unused properties.
+ // E.g. Closure Compiler in advanced mode.
+ ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
+ ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
+ ZoneAwarePromise['race'] = ZoneAwarePromise.race;
+ ZoneAwarePromise['all'] = ZoneAwarePromise.all;
+ const NativePromise = global[symbolPromise] = global['Promise'];
+ global['Promise'] = ZoneAwarePromise;
+ const symbolThenPatched = __symbol__('thenPatched');
+ function patchThen(Ctor) {
+ const proto = Ctor.prototype;
+ const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
+ if (prop && (prop.writable === false || !prop.configurable)) {
+ // check Ctor.prototype.then propertyDescriptor is writable or not
+ // in meteor env, writable is false, we should ignore such case
+ return;
+ }
+ const originalThen = proto.then;
+ // Keep a reference to the original method.
+ proto[symbolThen] = originalThen;
+ Ctor.prototype.then = function (onResolve, onReject) {
+ const wrapped = new ZoneAwarePromise((resolve, reject) => {
+ originalThen.call(this, resolve, reject);
+ });
+ return wrapped.then(onResolve, onReject);
+ };
+ Ctor[symbolThenPatched] = true;
+ }
+ api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function (self, args) {
+ let resultPromise = fn.apply(self, args);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ let ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
+ if (NativePromise) {
+ patchThen(NativePromise);
+ patchMethod(global, 'fetch', delegate => zoneify(delegate));
+ }
+ // This is not part of public API, but it is useful for tests, so we expose it.
+ Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
+ return ZoneAwarePromise;
+});
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// override Function.prototype.toString to make zone.js patched function
+// look like native function
+Zone.__load_patch('toString', (global) => {
+ // patch Func.prototype.toString to let them look like native
+ const originalFunctionToString = Function.prototype.toString;
+ const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
+ const PROMISE_SYMBOL = zoneSymbol('Promise');
+ const ERROR_SYMBOL = zoneSymbol('Error');
+ const newFunctionToString = function toString() {
+ if (typeof this === 'function') {
+ const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
+ if (originalDelegate) {
+ if (typeof originalDelegate === 'function') {
+ return originalFunctionToString.call(originalDelegate);
+ }
+ else {
+ return Object.prototype.toString.call(originalDelegate);
+ }
+ }
+ if (this === Promise) {
+ const nativePromise = global[PROMISE_SYMBOL];
+ if (nativePromise) {
+ return originalFunctionToString.call(nativePromise);
+ }
+ }
+ if (this === Error) {
+ const nativeError = global[ERROR_SYMBOL];
+ if (nativeError) {
+ return originalFunctionToString.call(nativeError);
+ }
+ }
+ }
+ return originalFunctionToString.call(this);
+ };
+ newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
+ Function.prototype.toString = newFunctionToString;
+ // patch Object.prototype.toString to let them look like native
+ const originalObjectToString = Object.prototype.toString;
+ const PROMISE_OBJECT_TO_STRING = '[object Promise]';
+ Object.prototype.toString = function () {
+ if (typeof Promise === 'function' && this instanceof Promise) {
+ return PROMISE_OBJECT_TO_STRING;
+ }
+ return originalObjectToString.call(this);
+ };
+});
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+let passiveSupported = false;
+if (typeof window !== 'undefined') {
+ try {
+ const options = Object.defineProperty({}, 'passive', {
+ get: function () {
+ passiveSupported = true;
+ }
+ });
+ window.addEventListener('test', options, options);
+ window.removeEventListener('test', options, options);
+ }
+ catch (err) {
+ passiveSupported = false;
+ }
+}
+// an identifier to tell ZoneTask do not create a new invoke closure
+const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
+ useG: true
+};
+const zoneSymbolEventNames$1 = {};
+const globalSources = {};
+const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
+const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
+function prepareEventNames(eventName, eventNameToString) {
+ const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
+ const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
+ const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames$1[eventName] = {};
+ zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+}
+function patchEventTarget(_global, apis, patchOptions) {
+ const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
+ const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
+ const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
+ const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
+ const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
+ const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
+ const PREPEND_EVENT_LISTENER = 'prependListener';
+ const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
+ const invokeTask = function (task, target, event) {
+ // for better performance, check isRemoved which is set
+ // by removeEventListener
+ if (task.isRemoved) {
+ return;
+ }
+ const delegate = task.callback;
+ if (typeof delegate === 'object' && delegate.handleEvent) {
+ // create the bind version of handleEvent when invoke
+ task.callback = (event) => delegate.handleEvent(event);
+ task.originalDelegate = delegate;
+ }
+ // invoke static task.invoke
+ task.invoke(task, target, [event]);
+ const options = task.options;
+ if (options && typeof options === 'object' && options.once) {
+ // if options.once is true, after invoke once remove listener here
+ // only browser need to do this, nodejs eventEmitter will cal removeListener
+ // inside EventEmitter.once
+ const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = false
+ const globalZoneAwareCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ const target = this || event.target || _global;
+ const tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ const copyTasks = tasks.slice();
+ for (let i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = true
+ const globalZoneAwareCaptureCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ const target = this || event.target || _global;
+ const tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ const copyTasks = tasks.slice();
+ for (let i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ function patchEventTargetMethods(obj, patchOptions) {
+ if (!obj) {
+ return false;
+ }
+ let useGlobalCallback = true;
+ if (patchOptions && patchOptions.useG !== undefined) {
+ useGlobalCallback = patchOptions.useG;
+ }
+ const validateHandler = patchOptions && patchOptions.vh;
+ let checkDuplicate = true;
+ if (patchOptions && patchOptions.chkDup !== undefined) {
+ checkDuplicate = patchOptions.chkDup;
+ }
+ let returnTarget = false;
+ if (patchOptions && patchOptions.rt !== undefined) {
+ returnTarget = patchOptions.rt;
+ }
+ let proto = obj;
+ while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && obj[ADD_EVENT_LISTENER]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = obj;
+ }
+ if (!proto) {
+ return false;
+ }
+ if (proto[zoneSymbolAddEventListener]) {
+ return false;
+ }
+ const eventNameToString = patchOptions && patchOptions.eventNameToString;
+ // a shared global taskData to pass data for scheduleEventTask
+ // so we do not need to create a new object just for pass some data
+ const taskData = {};
+ const nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
+ const nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
+ proto[REMOVE_EVENT_LISTENER];
+ const nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
+ proto[LISTENERS_EVENT_LISTENER];
+ const nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
+ let nativePrependEventListener;
+ if (patchOptions && patchOptions.prepend) {
+ nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
+ proto[patchOptions.prepend];
+ }
+ /**
+ * This util function will build an option object with passive option
+ * to handle all possible input from the user.
+ */
+ function buildEventListenerOptions(options, passive) {
+ if (!passiveSupported && typeof options === 'object' && options) {
+ // doesn't support passive but user want to pass an object as options.
+ // this will not work on some old browser, so we just pass a boolean
+ // as useCapture parameter
+ return !!options.capture;
+ }
+ if (!passiveSupported || !passive) {
+ return options;
+ }
+ if (typeof options === 'boolean') {
+ return { capture: options, passive: true };
+ }
+ if (!options) {
+ return { passive: true };
+ }
+ if (typeof options === 'object' && options.passive !== false) {
+ return Object.assign(Object.assign({}, options), { passive: true });
+ }
+ return options;
+ }
+ const customScheduleGlobal = function (task) {
+ // if there is already a task for the eventName + capture,
+ // just return, because we use the shared globalZoneAwareCallback here.
+ if (taskData.isExisting) {
+ return;
+ }
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
+ };
+ const customCancelGlobal = function (task) {
+ // if task is not marked as isRemoved, this call is directly
+ // from Zone.prototype.cancelTask, we should remove the task
+ // from tasksList of target first
+ if (!task.isRemoved) {
+ const symbolEventNames = zoneSymbolEventNames$1[task.eventName];
+ let symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
+ }
+ const existingTasks = symbolEventName && task.target[symbolEventName];
+ if (existingTasks) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ const existingTask = existingTasks[i];
+ if (existingTask === task) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ task.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ task.allRemoved = true;
+ task.target[symbolEventName] = null;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // if all tasks for the eventName + capture have gone,
+ // we will really remove the global event callback,
+ // if not, return
+ if (!task.allRemoved) {
+ return;
+ }
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
+ };
+ const customScheduleNonGlobal = function (task) {
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ const customSchedulePrepend = function (task) {
+ return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ const customCancelNonGlobal = function (task) {
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
+ };
+ const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
+ const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
+ const compareTaskCallbackVsDelegate = function (task, delegate) {
+ const typeOfDelegate = typeof delegate;
+ return (typeOfDelegate === 'function' && task.callback === delegate) ||
+ (typeOfDelegate === 'object' && task.originalDelegate === delegate);
+ };
+ const compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
+ const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
+ const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
+ const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
+ return function () {
+ const target = this || _global;
+ let eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ let delegate = arguments[1];
+ if (!delegate) {
+ return nativeListener.apply(this, arguments);
+ }
+ if (isNode && eventName === 'uncaughtException') {
+ // don't patch uncaughtException of nodejs to prevent endless loop
+ return nativeListener.apply(this, arguments);
+ }
+ // don't create the bind delegate function for handleEvent
+ // case here to improve addEventListener performance
+ // we will create the bind delegate when invoke
+ let isHandleEvent = false;
+ if (typeof delegate !== 'function') {
+ if (!delegate.handleEvent) {
+ return nativeListener.apply(this, arguments);
+ }
+ isHandleEvent = true;
+ }
+ if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
+ return;
+ }
+ const passive = passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
+ const options = buildEventListenerOptions(arguments[2], passive);
+ if (unpatchedEvents) {
+ // check upatched list
+ for (let i = 0; i < unpatchedEvents.length; i++) {
+ if (eventName === unpatchedEvents[i]) {
+ if (passive) {
+ return nativeListener.call(target, eventName, delegate, options);
+ }
+ else {
+ return nativeListener.apply(this, arguments);
+ }
+ }
+ }
+ }
+ const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
+ const once = options && typeof options === 'object' ? options.once : false;
+ const zone = Zone.current;
+ let symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (!symbolEventNames) {
+ prepareEventNames(eventName, eventNameToString);
+ symbolEventNames = zoneSymbolEventNames$1[eventName];
+ }
+ const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ let existingTasks = target[symbolEventName];
+ let isExisting = false;
+ if (existingTasks) {
+ // already have task registered
+ isExisting = true;
+ if (checkDuplicate) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ if (compare(existingTasks[i], delegate)) {
+ // same callback, same capture, same event name, just return
+ return;
+ }
+ }
+ }
+ }
+ else {
+ existingTasks = target[symbolEventName] = [];
+ }
+ let source;
+ const constructorName = target.constructor['name'];
+ const targetSource = globalSources[constructorName];
+ if (targetSource) {
+ source = targetSource[eventName];
+ }
+ if (!source) {
+ source = constructorName + addSource +
+ (eventNameToString ? eventNameToString(eventName) : eventName);
+ }
+ // do not create a new object as task.data to pass those things
+ // just use the global shared one
+ taskData.options = options;
+ if (once) {
+ // if addEventListener with once options, we don't pass it to
+ // native addEventListener, instead we keep the once setting
+ // and handle ourselves.
+ taskData.options.once = false;
+ }
+ taskData.target = target;
+ taskData.capture = capture;
+ taskData.eventName = eventName;
+ taskData.isExisting = isExisting;
+ const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
+ // keep taskData into data to allow onScheduleEventTask to access the task information
+ if (data) {
+ data.taskData = taskData;
+ }
+ const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
+ // should clear taskData.target to avoid memory leak
+ // issue, https://github.com/angular/angular/issues/20442
+ taskData.target = null;
+ // need to clear up taskData because it is a global object
+ if (data) {
+ data.taskData = null;
+ }
+ // have to save those information to task in case
+ // application may call task.zone.cancelTask() directly
+ if (once) {
+ options.once = true;
+ }
+ if (!(!passiveSupported && typeof task.options === 'boolean')) {
+ // if not support passive, and we pass an option object
+ // to addEventListener, we should save the options to task
+ task.options = options;
+ }
+ task.target = target;
+ task.capture = capture;
+ task.eventName = eventName;
+ if (isHandleEvent) {
+ // save original delegate for compare to check duplicate
+ task.originalDelegate = delegate;
+ }
+ if (!prepend) {
+ existingTasks.push(task);
+ }
+ else {
+ existingTasks.unshift(task);
+ }
+ if (returnTarget) {
+ return target;
+ }
+ };
+ };
+ proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
+ if (nativePrependEventListener) {
+ proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
+ }
+ proto[REMOVE_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ let eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ const options = arguments[2];
+ const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
+ const delegate = arguments[1];
+ if (!delegate) {
+ return nativeRemoveEventListener.apply(this, arguments);
+ }
+ if (validateHandler &&
+ !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
+ return;
+ }
+ const symbolEventNames = zoneSymbolEventNames$1[eventName];
+ let symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ const existingTasks = symbolEventName && target[symbolEventName];
+ if (existingTasks) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ const existingTask = existingTasks[i];
+ if (compare(existingTask, delegate)) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ existingTask.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ existingTask.allRemoved = true;
+ target[symbolEventName] = null;
+ // in the target, we have an event listener which is added by on_property
+ // such as target.onclick = function() {}, so we need to clear this internal
+ // property too if all delegates all removed
+ if (typeof eventName === 'string') {
+ const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
+ target[onPropertySymbol] = null;
+ }
+ }
+ existingTask.zone.cancelTask(existingTask);
+ if (returnTarget) {
+ return target;
+ }
+ return;
+ }
+ }
+ }
+ // issue 930, didn't find the event name or callback
+ // from zone kept existingTasks, the callback maybe
+ // added outside of zone, we need to call native removeEventListener
+ // to try to remove it.
+ return nativeRemoveEventListener.apply(this, arguments);
+ };
+ proto[LISTENERS_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ let eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ const listeners = [];
+ const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
+ for (let i = 0; i < tasks.length; i++) {
+ const task = tasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ listeners.push(delegate);
+ }
+ return listeners;
+ };
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ let eventName = arguments[0];
+ if (!eventName) {
+ const keys = Object.keys(target);
+ for (let i = 0; i < keys.length; i++) {
+ const prop = keys[i];
+ const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ let evtName = match && match[1];
+ // in nodejs EventEmitter, removeListener event is
+ // used for monitoring the removeListener call,
+ // so just keep removeListener eventListener until
+ // all other eventListeners are removed
+ if (evtName && evtName !== 'removeListener') {
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
+ }
+ }
+ // remove removeListener listener finally
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
+ }
+ else {
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ const symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (symbolEventNames) {
+ const symbolEventName = symbolEventNames[FALSE_STR];
+ const symbolCaptureEventName = symbolEventNames[TRUE_STR];
+ const tasks = target[symbolEventName];
+ const captureTasks = target[symbolCaptureEventName];
+ if (tasks) {
+ const removeTasks = tasks.slice();
+ for (let i = 0; i < removeTasks.length; i++) {
+ const task = removeTasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ if (captureTasks) {
+ const removeTasks = captureTasks.slice();
+ for (let i = 0; i < removeTasks.length; i++) {
+ const task = removeTasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ }
+ }
+ if (returnTarget) {
+ return this;
+ }
+ };
+ // for native toString patch
+ attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
+ attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
+ if (nativeRemoveAllListeners) {
+ attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
+ }
+ if (nativeListeners) {
+ attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
+ }
+ return true;
+ }
+ let results = [];
+ for (let i = 0; i < apis.length; i++) {
+ results[i] = patchEventTargetMethods(apis[i], patchOptions);
+ }
+ return results;
+}
+function findEventTasks(target, eventName) {
+ if (!eventName) {
+ const foundTasks = [];
+ for (let prop in target) {
+ const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ let evtName = match && match[1];
+ if (evtName && (!eventName || evtName === eventName)) {
+ const tasks = target[prop];
+ if (tasks) {
+ for (let i = 0; i < tasks.length; i++) {
+ foundTasks.push(tasks[i]);
+ }
+ }
+ }
+ }
+ return foundTasks;
+ }
+ let symbolEventName = zoneSymbolEventNames$1[eventName];
+ if (!symbolEventName) {
+ prepareEventNames(eventName);
+ symbolEventName = zoneSymbolEventNames$1[eventName];
+ }
+ const captureFalseTasks = target[symbolEventName[FALSE_STR]];
+ const captureTrueTasks = target[symbolEventName[TRUE_STR]];
+ if (!captureFalseTasks) {
+ return captureTrueTasks ? captureTrueTasks.slice() : [];
+ }
+ else {
+ return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
+ captureFalseTasks.slice();
+ }
+}
+function patchEventPrototype(global, api) {
+ const Event = global['Event'];
+ if (Event && Event.prototype) {
+ api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {
+ self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
+ // we need to call the native stopImmediatePropagation
+ // in case in some hybrid application, some part of
+ // application will be controlled by zone, some are not
+ delegate && delegate.apply(self, args);
+ });
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCallbacks(api, target, targetName, method, callbacks) {
+ const symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
+ }
+ const nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ const source = `${targetName}.${method}::` + callback;
+ const prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const globalEventHandlersEventNames = [
+ 'abort',
+ 'animationcancel',
+ 'animationend',
+ 'animationiteration',
+ 'auxclick',
+ 'beforeinput',
+ 'blur',
+ 'cancel',
+ 'canplay',
+ 'canplaythrough',
+ 'change',
+ 'compositionstart',
+ 'compositionupdate',
+ 'compositionend',
+ 'cuechange',
+ 'click',
+ 'close',
+ 'contextmenu',
+ 'curechange',
+ 'dblclick',
+ 'drag',
+ 'dragend',
+ 'dragenter',
+ 'dragexit',
+ 'dragleave',
+ 'dragover',
+ 'drop',
+ 'durationchange',
+ 'emptied',
+ 'ended',
+ 'error',
+ 'focus',
+ 'focusin',
+ 'focusout',
+ 'gotpointercapture',
+ 'input',
+ 'invalid',
+ 'keydown',
+ 'keypress',
+ 'keyup',
+ 'load',
+ 'loadstart',
+ 'loadeddata',
+ 'loadedmetadata',
+ 'lostpointercapture',
+ 'mousedown',
+ 'mouseenter',
+ 'mouseleave',
+ 'mousemove',
+ 'mouseout',
+ 'mouseover',
+ 'mouseup',
+ 'mousewheel',
+ 'orientationchange',
+ 'pause',
+ 'play',
+ 'playing',
+ 'pointercancel',
+ 'pointerdown',
+ 'pointerenter',
+ 'pointerleave',
+ 'pointerlockchange',
+ 'mozpointerlockchange',
+ 'webkitpointerlockerchange',
+ 'pointerlockerror',
+ 'mozpointerlockerror',
+ 'webkitpointerlockerror',
+ 'pointermove',
+ 'pointout',
+ 'pointerover',
+ 'pointerup',
+ 'progress',
+ 'ratechange',
+ 'reset',
+ 'resize',
+ 'scroll',
+ 'seeked',
+ 'seeking',
+ 'select',
+ 'selectionchange',
+ 'selectstart',
+ 'show',
+ 'sort',
+ 'stalled',
+ 'submit',
+ 'suspend',
+ 'timeupdate',
+ 'volumechange',
+ 'touchcancel',
+ 'touchmove',
+ 'touchstart',
+ 'touchend',
+ 'transitioncancel',
+ 'transitionend',
+ 'waiting',
+ 'wheel'
+];
+const documentEventNames = [
+ 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange',
+ 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror',
+ 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange',
+ 'visibilitychange', 'resume'
+];
+const windowEventNames = [
+ 'absolutedeviceorientation',
+ 'afterinput',
+ 'afterprint',
+ 'appinstalled',
+ 'beforeinstallprompt',
+ 'beforeprint',
+ 'beforeunload',
+ 'devicelight',
+ 'devicemotion',
+ 'deviceorientation',
+ 'deviceorientationabsolute',
+ 'deviceproximity',
+ 'hashchange',
+ 'languagechange',
+ 'message',
+ 'mozbeforepaint',
+ 'offline',
+ 'online',
+ 'paint',
+ 'pageshow',
+ 'pagehide',
+ 'popstate',
+ 'rejectionhandled',
+ 'storage',
+ 'unhandledrejection',
+ 'unload',
+ 'userproximity',
+ 'vrdisplayconnected',
+ 'vrdisplaydisconnected',
+ 'vrdisplaypresentchange'
+];
+const htmlElementEventNames = [
+ 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend',
+ 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend',
+ 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend'
+];
+const mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend'];
+const ieElementEventNames = [
+ 'activate',
+ 'afterupdate',
+ 'ariarequest',
+ 'beforeactivate',
+ 'beforedeactivate',
+ 'beforeeditfocus',
+ 'beforeupdate',
+ 'cellchange',
+ 'controlselect',
+ 'dataavailable',
+ 'datasetchanged',
+ 'datasetcomplete',
+ 'errorupdate',
+ 'filterchange',
+ 'layoutcomplete',
+ 'losecapture',
+ 'move',
+ 'moveend',
+ 'movestart',
+ 'propertychange',
+ 'resizeend',
+ 'resizestart',
+ 'rowenter',
+ 'rowexit',
+ 'rowsdelete',
+ 'rowsinserted',
+ 'command',
+ 'compassneedscalibration',
+ 'deactivate',
+ 'help',
+ 'mscontentzoom',
+ 'msmanipulationstatechanged',
+ 'msgesturechange',
+ 'msgesturedoubletap',
+ 'msgestureend',
+ 'msgesturehold',
+ 'msgesturestart',
+ 'msgesturetap',
+ 'msgotpointercapture',
+ 'msinertiastart',
+ 'mslostpointercapture',
+ 'mspointercancel',
+ 'mspointerdown',
+ 'mspointerenter',
+ 'mspointerhover',
+ 'mspointerleave',
+ 'mspointermove',
+ 'mspointerout',
+ 'mspointerover',
+ 'mspointerup',
+ 'pointerout',
+ 'mssitemodejumplistitemremoved',
+ 'msthumbnailclick',
+ 'stop',
+ 'storagecommit'
+];
+const webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
+const formEventNames = ['autocomplete', 'autocompleteerror'];
+const detailEventNames = ['toggle'];
+const frameEventNames = ['load'];
+const frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror'];
+const marqueeEventNames = ['bounce', 'finish', 'start'];
+const XMLHttpRequestEventNames = [
+ 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend',
+ 'readystatechange'
+];
+const IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close'];
+const websocketEventNames = ['close', 'error', 'open', 'message'];
+const workerEventNames = ['error', 'message'];
+const eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames);
+function filterProperties(target, onProperties, ignoreProperties) {
+ if (!ignoreProperties || ignoreProperties.length === 0) {
+ return onProperties;
+ }
+ const tip = ignoreProperties.filter(ip => ip.target === target);
+ if (!tip || tip.length === 0) {
+ return onProperties;
+ }
+ const targetIgnoreProperties = tip[0].ignoreProperties;
+ return onProperties.filter(op => targetIgnoreProperties.indexOf(op) === -1);
+}
+function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
+ // check whether target is available, sometimes target will be undefined
+ // because different browser or some 3rd party plugin.
+ if (!target) {
+ return;
+ }
+ const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
+ patchOnProperties(target, filteredProperties, prototype);
+}
+function propertyDescriptorPatch(api, _global) {
+ if (isNode && !isMix) {
+ return;
+ }
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
+ }
+ const supportsWebSocket = typeof WebSocket !== 'undefined';
+ const ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ const internalWindow = window;
+ const ignoreErrorProperties = isIE() ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ const HTMLMarqueeElement = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement) {
+ patchFilteredProperties(HTMLMarqueeElement.prototype, marqueeEventNames, ignoreProperties);
+ }
+ const Worker = internalWindow['Worker'];
+ if (Worker) {
+ patchFilteredProperties(Worker.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ const XMLHttpRequest = _global['XMLHttpRequest'];
+ if (XMLHttpRequest) {
+ // XMLHttpRequest is not available in ServiceWorker, so we need to check here
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ const XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('util', (global, Zone, api) => {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
+ }
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
+ }
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = Object.defineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = () => ({
+ globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames,
+ isBrowser,
+ isMix,
+ isNode,
+ TRUE_STR,
+ FALSE_STR,
+ ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR
+ });
+});
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const taskSymbol = zoneSymbol('zoneTask');
+function patchTimer(window, setName, cancelName, nameSuffix) {
+ let setNative = null;
+ let clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ const tasksByHandleId = {};
+ function scheduleTask(task) {
+ const data = task.data;
+ data.args[0] = function () {
+ return task.invoke.apply(this, arguments);
+ };
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative.call(window, task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, (delegate) => function (self, args) {
+ if (typeof args[0] === 'function') {
+ const options = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ const callback = args[0];
+ args[0] = function timer() {
+ try {
+ return callback.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ // https://github.com/angular/angular/issues/40387
+ // Cleanup tasksByHandleId should be handled before scheduleTask
+ // Since some zoneSpec may intercept and doesn't trigger
+ // scheduleFn(scheduleTask) provided here.
+ if (!(options.isPeriodic)) {
+ if (typeof options.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[options.handleId];
+ }
+ else if (options.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ options.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ };
+ const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ const handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ });
+ clearNative =
+ patchMethod(window, cancelName, (delegate) => function (self, args) {
+ const id = args[0];
+ let task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ });
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCustomElements(_global, api) {
+ const { isBrowser, isMix } = api.getGlobalObjects();
+ if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
+ return;
+ }
+ const callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetPatch(_global, api) {
+ if (Zone[api.symbol('patchEventTarget')]) {
+ // EventTarget is already patched.
+ return;
+ }
+ const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (let i = 0; i < eventNames.length; i++) {
+ const eventName = eventNames[i];
+ const falseEventName = eventName + FALSE_STR;
+ const trueEventName = eventName + TRUE_STR;
+ const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ const EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent(global, api) {
+ api.patchEventPrototype(global, api);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('legacy', (global) => {
+ const legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
+});
+Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
+ api.patchMethod(global, 'queueMicrotask', delegate => {
+ return function (self, args) {
+ Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
+ };
+ });
+});
+Zone.__load_patch('timers', (global) => {
+ const set = 'set';
+ const clear = 'clear';
+ patchTimer(global, set, clear, 'Timeout');
+ patchTimer(global, set, clear, 'Interval');
+ patchTimer(global, set, clear, 'Immediate');
+});
+Zone.__load_patch('requestAnimationFrame', (global) => {
+ patchTimer(global, 'request', 'cancel', 'AnimationFrame');
+ patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
+ patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
+});
+Zone.__load_patch('blocking', (global, Zone) => {
+ const blockingMethods = ['alert', 'prompt', 'confirm'];
+ for (let i = 0; i < blockingMethods.length; i++) {
+ const name = blockingMethods[i];
+ patchMethod(global, name, (delegate, symbol, name) => {
+ return function (s, args) {
+ return Zone.current.run(delegate, global, args, name);
+ };
+ });
+ }
+});
+Zone.__load_patch('EventTarget', (global, Zone, api) => {
+ patchEvent(global, api);
+ eventTargetPatch(global, api);
+ // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
+ const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
+ api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]);
+ }
+});
+Zone.__load_patch('MutationObserver', (global, Zone, api) => {
+ patchClass('MutationObserver');
+ patchClass('WebKitMutationObserver');
+});
+Zone.__load_patch('IntersectionObserver', (global, Zone, api) => {
+ patchClass('IntersectionObserver');
+});
+Zone.__load_patch('FileReader', (global, Zone, api) => {
+ patchClass('FileReader');
+});
+Zone.__load_patch('on_property', (global, Zone, api) => {
+ propertyDescriptorPatch(api, global);
+});
+Zone.__load_patch('customElements', (global, Zone, api) => {
+ patchCustomElements(global, api);
+});
+Zone.__load_patch('XHR', (global, Zone) => {
+ // Treat XMLHttpRequest as a macrotask.
+ patchXHR(global);
+ const XHR_TASK = zoneSymbol('xhrTask');
+ const XHR_SYNC = zoneSymbol('xhrSync');
+ const XHR_LISTENER = zoneSymbol('xhrListener');
+ const XHR_SCHEDULED = zoneSymbol('xhrScheduled');
+ const XHR_URL = zoneSymbol('xhrURL');
+ const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
+ function patchXHR(window) {
+ const XMLHttpRequest = window['XMLHttpRequest'];
+ if (!XMLHttpRequest) {
+ // XMLHttpRequest is not available in service worker
+ return;
+ }
+ const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ function findPendingTask(target) {
+ return target[XHR_TASK];
+ }
+ let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ if (!oriAddListener) {
+ const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
+ oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ }
+ const READY_STATE_CHANGE = 'readystatechange';
+ const SCHEDULED = 'scheduled';
+ function scheduleTask(task) {
+ const data = task.data;
+ const target = data.target;
+ target[XHR_SCHEDULED] = false;
+ target[XHR_ERROR_BEFORE_SCHEDULED] = false;
+ // remove existing event listener
+ const listener = target[XHR_LISTENER];
+ if (!oriAddListener) {
+ oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ if (listener) {
+ oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
+ }
+ const newListener = target[XHR_LISTENER] = () => {
+ if (target.readyState === target.DONE) {
+ // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
+ // readyState=4 multiple times, so we need to check task state here
+ if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
+ // check whether the xhr has registered onload listener
+ // if that is the case, the task should invoke after all
+ // onload listeners finish.
+ // Also if the request failed without response (status = 0), the load event handler
+ // will not be triggered, in that case, we should also invoke the placeholder callback
+ // to close the XMLHttpRequest::send macroTask.
+ // https://github.com/angular/angular/issues/38795
+ const loadTasks = target[Zone.__symbol__('loadfalse')];
+ if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
+ const oriInvoke = task.invoke;
+ task.invoke = function () {
+ // need to load the tasks again, because in other
+ // load listener, they may remove themselves
+ const loadTasks = target[Zone.__symbol__('loadfalse')];
+ for (let i = 0; i < loadTasks.length; i++) {
+ if (loadTasks[i] === task) {
+ loadTasks.splice(i, 1);
+ }
+ }
+ if (!data.aborted && task.state === SCHEDULED) {
+ oriInvoke.call(task);
+ }
+ };
+ loadTasks.push(task);
+ }
+ else {
+ task.invoke();
+ }
+ }
+ else if (!data.aborted && target[XHR_SCHEDULED] === false) {
+ // error occurs when xhr.send()
+ target[XHR_ERROR_BEFORE_SCHEDULED] = true;
+ }
+ }
+ };
+ oriAddListener.call(target, READY_STATE_CHANGE, newListener);
+ const storedTask = target[XHR_TASK];
+ if (!storedTask) {
+ target[XHR_TASK] = task;
+ }
+ sendNative.apply(target, data.args);
+ target[XHR_SCHEDULED] = true;
+ return task;
+ }
+ function placeholderCallback() { }
+ function clearTask(task) {
+ const data = task.data;
+ // Note - ideally, we would call data.target.removeEventListener here, but it's too late
+ // to prevent it from firing. So instead, we store info for the event listener.
+ data.aborted = true;
+ return abortNative.apply(data.target, data.args);
+ }
+ const openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {
+ self[XHR_SYNC] = args[2] == false;
+ self[XHR_URL] = args[1];
+ return openNative.apply(self, args);
+ });
+ const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
+ const fetchTaskAborting = zoneSymbol('fetchTaskAborting');
+ const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
+ const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {
+ if (Zone.current[fetchTaskScheduling] === true) {
+ // a fetch is scheduling, so we are using xhr to polyfill fetch
+ // and because we already schedule macroTask for fetch, we should
+ // not schedule a macroTask for xhr again
+ return sendNative.apply(self, args);
+ }
+ if (self[XHR_SYNC]) {
+ // if the XHR is sync there is no task to schedule, just execute the code.
+ return sendNative.apply(self, args);
+ }
+ else {
+ const options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };
+ const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
+ if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&
+ task.state === SCHEDULED) {
+ // xhr request throw error when send
+ // we should invoke task instead of leaving a scheduled
+ // pending macroTask
+ task.invoke();
+ }
+ }
+ });
+ const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {
+ const task = findPendingTask(self);
+ if (task && typeof task.type == 'string') {
+ // If the XHR has already completed, do nothing.
+ // If the XHR has already been aborted, do nothing.
+ // Fix #569, call abort multiple times before done will cause
+ // macroTask task count be negative number
+ if (task.cancelFn == null || (task.data && task.data.aborted)) {
+ return;
+ }
+ task.zone.cancelTask(task);
+ }
+ else if (Zone.current[fetchTaskAborting] === true) {
+ // the abort is called from fetch polyfill, we need to call native abort of XHR.
+ return abortNative.apply(self, args);
+ }
+ // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
+ // task
+ // to cancel. Do nothing.
+ });
+ }
+});
+Zone.__load_patch('geolocation', (global) => {
+ /// GEO_LOCATION
+ if (global['navigator'] && global['navigator'].geolocation) {
+ patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
+ }
+});
+Zone.__load_patch('PromiseRejectionEvent', (global, Zone) => {
+ // handle unhandled promise rejection
+ function findPromiseRejectionHandler(evtName) {
+ return function (e) {
+ const eventTasks = findEventTasks(global, evtName);
+ eventTasks.forEach(eventTask => {
+ // windows has added unhandledrejection event listener
+ // trigger the event listener
+ const PromiseRejectionEvent = global['PromiseRejectionEvent'];
+ if (PromiseRejectionEvent) {
+ const evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection });
+ eventTask.invoke(evt);
+ }
+ });
+ };
+ }
+ if (global['PromiseRejectionEvent']) {
+ Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
+ findPromiseRejectionHandler('unhandledrejection');
+ Zone[zoneSymbol('rejectionHandledHandler')] =
+ findPromiseRejectionHandler('rejectionhandled');
+ }
+});
+
+
+/***/ })
+
+},[[1,"runtime"]]]);
+//# sourceMappingURL=polyfills.js.map
\ No newline at end of file
diff --git a/src/main/resources/static/polyfills.js.map b/src/main/resources/static/polyfills.js.map
new file mode 100644
index 0000000..15fbed8
--- /dev/null
+++ b/src/main/resources/static/polyfills.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["./src/polyfills.ts","./node_modules/zone.js/dist/zone-evergreen.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;GAcG;AAEH;;GAEG;AAEH;;GAEG;AACH,oEAAoE;AAEpE;;;;GAIG;AACH,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;GAEG;AACwB,CAAE,6BAA6B;AAG1D;;GAEG;;;;;;;;;;;;;AChEU;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,UAAU,6CAA6C,eAAe;AACxI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0BAA0B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,UAAU,IAAI,YAAY,4BAA4B,QAAQ,sBAAsB,WAAW,GAAG,+CAA+C,SAAS,YAAY;AACzM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,qBAAqB;AACrB;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,yBAAyB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,EAAE;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4HAA4H,wBAAwB,oCAAoC;AACxL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,sEAAsE;AACtJ;AACA;AACA,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,oDAAoD;AAC5F;AACA;AACA;AACA;AACA;AACA,2BAA2B,mCAAmC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,uEAAuE,gBAAgB;AACvF,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,6BAA6B;AACxE,0CAA0C,kCAAkC;AAC5E,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,sBAAsB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,wBAAwB;AACxB;AACA;AACA,qDAAqD,aAAa,gBAAgB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,4BAA4B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0BAA0B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,wBAAwB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,wBAAwB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,WAAW,GAAG,OAAO;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,sDAAsD;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,4EAA4E;AACvF;AACA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,mBAAmB,4BAA4B;AAC/C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,sBAAsB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,0CAA0C;AAC9G;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","file":"polyfills.js","sourcesContent":["/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfills to this file.\n *\n * This file is divided into 2 sections:\n * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.\n * 2. Application imports. Files imported after ZoneJS that should be loaded before your main\n * file.\n *\n * The current setup is for so-called \"evergreen\" browsers; the last versions of browsers that\n * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),\n * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.\n *\n * Learn more in https://angular.io/guide/browser-support\n */\n\n/***************************************************************************************************\n * BROWSER POLYFILLS\n */\n\n/**\n * IE11 requires the following for NgClass support on SVG elements\n */\n// import 'classlist.js'; // Run `npm install --save classlist.js`.\n\n/**\n * Web Animations `@angular/platform-browser/animations`\n * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.\n * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).\n */\n// import 'web-animations-js'; // Run `npm install --save web-animations-js`.\n\n/**\n * By default, zone.js will patch all possible macroTask and DomEvents\n * user can disable parts of macroTask/DomEvents patch by setting following flags\n * because those flags need to be set before `zone.js` being loaded, and webpack\n * will put import in the top of bundle, so user need to create a separate file\n * in this directory (for example: zone-flags.ts), and put the following flags\n * into that file, and then add the following code before importing zone.js.\n * import './zone-flags';\n *\n * The flags allowed in zone-flags.ts are listed here.\n *\n * The following flags will work for all browsers.\n *\n * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame\n * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick\n * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames\n *\n * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js\n * with the following flag, it will bypass `zone.js` patch for IE/Edge\n *\n * (window as any).__Zone_enable_cross_context_check = true;\n *\n */\n\n/***************************************************************************************************\n * Zone JS is required by default for Angular itself.\n */\nimport 'zone.js/dist/zone'; // Included with Angular CLI.\n\n\n/***************************************************************************************************\n * APPLICATION IMPORTS\n */\n","'use strict';\n/**\n * @license Angular v12.0.0-next.0\n * (c) 2010-2020 Google LLC. https://angular.io/\n * License: MIT\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 */\nconst Zone$1 = (function (global) {\n const performance = global['performance'];\n function mark(name) {\n performance && performance['mark'] && performance['mark'](name);\n }\n function performanceMeasure(name, label) {\n performance && performance['measure'] && performance['measure'](name, label);\n }\n mark('Zone');\n // Initialize before it's accessed below.\n // __Zone_symbol_prefix global can be used to override the default zone\n // symbol prefix with a custom one if needed.\n const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';\n function __symbol__(name) {\n return symbolPrefix + name;\n }\n const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;\n if (global['Zone']) {\n // if global['Zone'] already exists (maybe zone.js was already loaded or\n // some other lib also registered a global object named Zone), we may need\n // to throw an error, but sometimes user may not want this error.\n // For example,\n // we have two web pages, page1 includes zone.js, page2 doesn't.\n // and the 1st time user load page1 and page2, everything work fine,\n // but when user load page2 again, error occurs because global['Zone'] already exists.\n // so we add a flag to let user choose whether to throw this error or not.\n // By default, if existing Zone is from zone.js, we will not throw the error.\n if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') {\n throw new Error('Zone already loaded.');\n }\n else {\n return global['Zone'];\n }\n }\n class Zone {\n constructor(parent, zoneSpec) {\n this._parent = parent;\n this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '';\n this._properties = zoneSpec && zoneSpec.properties || {};\n this._zoneDelegate =\n new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);\n }\n static assertZonePatched() {\n if (global['Promise'] !== patches['ZoneAwarePromise']) {\n throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +\n 'has been overwritten.\\n' +\n 'Most likely cause is that a Promise polyfill has been loaded ' +\n 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +\n 'If you must load one, do so before loading zone.js.)');\n }\n }\n static get root() {\n let zone = Zone.current;\n while (zone.parent) {\n zone = zone.parent;\n }\n return zone;\n }\n static get current() {\n return _currentZoneFrame.zone;\n }\n static get currentTask() {\n return _currentTask;\n }\n // tslint:disable-next-line:require-internal-with-underscore\n static __load_patch(name, fn, ignoreDuplicate = false) {\n if (patches.hasOwnProperty(name)) {\n // `checkDuplicate` option is defined from global variable\n // so it works for all modules.\n // `ignoreDuplicate` can work for the specified module\n if (!ignoreDuplicate && checkDuplicate) {\n throw Error('Already loaded patch: ' + name);\n }\n }\n else if (!global['__Zone_disable_' + name]) {\n const perfName = 'Zone:' + name;\n mark(perfName);\n patches[name] = fn(global, Zone, _api);\n performanceMeasure(perfName, perfName);\n }\n }\n get parent() {\n return this._parent;\n }\n get name() {\n return this._name;\n }\n get(key) {\n const zone = this.getZoneWith(key);\n if (zone)\n return zone._properties[key];\n }\n getZoneWith(key) {\n let current = this;\n while (current) {\n if (current._properties.hasOwnProperty(key)) {\n return current;\n }\n current = current._parent;\n }\n return null;\n }\n fork(zoneSpec) {\n if (!zoneSpec)\n throw new Error('ZoneSpec required!');\n return this._zoneDelegate.fork(this, zoneSpec);\n }\n wrap(callback, source) {\n if (typeof callback !== 'function') {\n throw new Error('Expecting function got: ' + callback);\n }\n const _callback = this._zoneDelegate.intercept(this, callback, source);\n const zone = this;\n return function () {\n return zone.runGuarded(_callback, this, arguments, source);\n };\n }\n run(callback, applyThis, applyArgs, source) {\n _currentZoneFrame = { parent: _currentZoneFrame, zone: this };\n try {\n return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);\n }\n finally {\n _currentZoneFrame = _currentZoneFrame.parent;\n }\n }\n runGuarded(callback, applyThis = null, applyArgs, source) {\n _currentZoneFrame = { parent: _currentZoneFrame, zone: this };\n try {\n try {\n return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);\n }\n catch (error) {\n if (this._zoneDelegate.handleError(this, error)) {\n throw error;\n }\n }\n }\n finally {\n _currentZoneFrame = _currentZoneFrame.parent;\n }\n }\n runTask(task, applyThis, applyArgs) {\n if (task.zone != this) {\n throw new Error('A task can only be run in the zone of creation! (Creation: ' +\n (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');\n }\n // https://github.com/angular/zone.js/issues/778, sometimes eventTask\n // will run in notScheduled(canceled) state, we should not try to\n // run such kind of task but just return\n if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {\n return;\n }\n const reEntryGuard = task.state != running;\n reEntryGuard && task._transitionTo(running, scheduled);\n task.runCount++;\n const previousTask = _currentTask;\n _currentTask = task;\n _currentZoneFrame = { parent: _currentZoneFrame, zone: this };\n try {\n if (task.type == macroTask && task.data && !task.data.isPeriodic) {\n task.cancelFn = undefined;\n }\n try {\n return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);\n }\n catch (error) {\n if (this._zoneDelegate.handleError(this, error)) {\n throw error;\n }\n }\n }\n finally {\n // if the task's state is notScheduled or unknown, then it has already been cancelled\n // we should not reset the state to scheduled\n if (task.state !== notScheduled && task.state !== unknown) {\n if (task.type == eventTask || (task.data && task.data.isPeriodic)) {\n reEntryGuard && task._transitionTo(scheduled, running);\n }\n else {\n task.runCount = 0;\n this._updateTaskCount(task, -1);\n reEntryGuard &&\n task._transitionTo(notScheduled, running, notScheduled);\n }\n }\n _currentZoneFrame = _currentZoneFrame.parent;\n _currentTask = previousTask;\n }\n }\n scheduleTask(task) {\n if (task.zone && task.zone !== this) {\n // check if the task was rescheduled, the newZone\n // should not be the children of the original zone\n let newZone = this;\n while (newZone) {\n if (newZone === task.zone) {\n throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);\n }\n newZone = newZone.parent;\n }\n }\n task._transitionTo(scheduling, notScheduled);\n const zoneDelegates = [];\n task._zoneDelegates = zoneDelegates;\n task._zone = this;\n try {\n task = this._zoneDelegate.scheduleTask(this, task);\n }\n catch (err) {\n // should set task's state to unknown when scheduleTask throw error\n // because the err may from reschedule, so the fromState maybe notScheduled\n task._transitionTo(unknown, scheduling, notScheduled);\n // TODO: @JiaLiPassion, should we check the result from handleError?\n this._zoneDelegate.handleError(this, err);\n throw err;\n }\n if (task._zoneDelegates === zoneDelegates) {\n // we have to check because internally the delegate can reschedule the task.\n this._updateTaskCount(task, 1);\n }\n if (task.state == scheduling) {\n task._transitionTo(scheduled, scheduling);\n }\n return task;\n }\n scheduleMicroTask(source, callback, data, customSchedule) {\n return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));\n }\n scheduleMacroTask(source, callback, data, customSchedule, customCancel) {\n return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));\n }\n scheduleEventTask(source, callback, data, customSchedule, customCancel) {\n return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));\n }\n cancelTask(task) {\n if (task.zone != this)\n throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +\n (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');\n task._transitionTo(canceling, scheduled, running);\n try {\n this._zoneDelegate.cancelTask(this, task);\n }\n catch (err) {\n // if error occurs when cancelTask, transit the state to unknown\n task._transitionTo(unknown, canceling);\n this._zoneDelegate.handleError(this, err);\n throw err;\n }\n this._updateTaskCount(task, -1);\n task._transitionTo(notScheduled, canceling);\n task.runCount = 0;\n return task;\n }\n _updateTaskCount(task, count) {\n const zoneDelegates = task._zoneDelegates;\n if (count == -1) {\n task._zoneDelegates = null;\n }\n for (let i = 0; i < zoneDelegates.length; i++) {\n zoneDelegates[i]._updateTaskCount(task.type, count);\n }\n }\n }\n // tslint:disable-next-line:require-internal-with-underscore\n Zone.__symbol__ = __symbol__;\n const DELEGATE_ZS = {\n name: '',\n onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),\n onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),\n onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),\n onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task)\n };\n class ZoneDelegate {\n constructor(zone, parentDelegate, zoneSpec) {\n this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };\n this.zone = zone;\n this._parentDelegate = parentDelegate;\n this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);\n this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);\n this._forkCurrZone =\n zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate._forkCurrZone);\n this._interceptZS =\n zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);\n this._interceptDlgt =\n zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);\n this._interceptCurrZone =\n zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate._interceptCurrZone);\n this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);\n this._invokeDlgt =\n zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);\n this._invokeCurrZone =\n zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate._invokeCurrZone);\n this._handleErrorZS =\n zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);\n this._handleErrorDlgt =\n zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);\n this._handleErrorCurrZone =\n zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate._handleErrorCurrZone);\n this._scheduleTaskZS =\n zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);\n this._scheduleTaskDlgt = zoneSpec &&\n (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);\n this._scheduleTaskCurrZone =\n zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate._scheduleTaskCurrZone);\n this._invokeTaskZS =\n zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);\n this._invokeTaskDlgt =\n zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);\n this._invokeTaskCurrZone =\n zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate._invokeTaskCurrZone);\n this._cancelTaskZS =\n zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);\n this._cancelTaskDlgt =\n zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);\n this._cancelTaskCurrZone =\n zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate._cancelTaskCurrZone);\n this._hasTaskZS = null;\n this._hasTaskDlgt = null;\n this._hasTaskDlgtOwner = null;\n this._hasTaskCurrZone = null;\n const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;\n const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;\n if (zoneSpecHasTask || parentHasTask) {\n // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such\n // a case all task related interceptors must go through this ZD. We can't short circuit it.\n this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;\n this._hasTaskDlgt = parentDelegate;\n this._hasTaskDlgtOwner = this;\n this._hasTaskCurrZone = zone;\n if (!zoneSpec.onScheduleTask) {\n this._scheduleTaskZS = DELEGATE_ZS;\n this._scheduleTaskDlgt = parentDelegate;\n this._scheduleTaskCurrZone = this.zone;\n }\n if (!zoneSpec.onInvokeTask) {\n this._invokeTaskZS = DELEGATE_ZS;\n this._invokeTaskDlgt = parentDelegate;\n this._invokeTaskCurrZone = this.zone;\n }\n if (!zoneSpec.onCancelTask) {\n this._cancelTaskZS = DELEGATE_ZS;\n this._cancelTaskDlgt = parentDelegate;\n this._cancelTaskCurrZone = this.zone;\n }\n }\n }\n fork(targetZone, zoneSpec) {\n return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :\n new Zone(targetZone, zoneSpec);\n }\n intercept(targetZone, callback, source) {\n return this._interceptZS ?\n this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :\n callback;\n }\n invoke(targetZone, callback, applyThis, applyArgs, source) {\n return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :\n callback.apply(applyThis, applyArgs);\n }\n handleError(targetZone, error) {\n return this._handleErrorZS ?\n this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :\n true;\n }\n scheduleTask(targetZone, task) {\n let returnTask = task;\n if (this._scheduleTaskZS) {\n if (this._hasTaskZS) {\n returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);\n }\n // clang-format off\n returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);\n // clang-format on\n if (!returnTask)\n returnTask = task;\n }\n else {\n if (task.scheduleFn) {\n task.scheduleFn(task);\n }\n else if (task.type == microTask) {\n scheduleMicroTask(task);\n }\n else {\n throw new Error('Task is missing scheduleFn.');\n }\n }\n return returnTask;\n }\n invokeTask(targetZone, task, applyThis, applyArgs) {\n return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :\n task.callback.apply(applyThis, applyArgs);\n }\n cancelTask(targetZone, task) {\n let value;\n if (this._cancelTaskZS) {\n value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);\n }\n else {\n if (!task.cancelFn) {\n throw Error('Task is not cancelable');\n }\n value = task.cancelFn(task);\n }\n return value;\n }\n hasTask(targetZone, isEmpty) {\n // hasTask should not throw error so other ZoneDelegate\n // can still trigger hasTask callback\n try {\n this._hasTaskZS &&\n this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);\n }\n catch (err) {\n this.handleError(targetZone, err);\n }\n }\n // tslint:disable-next-line:require-internal-with-underscore\n _updateTaskCount(type, count) {\n const counts = this._taskCounts;\n const prev = counts[type];\n const next = counts[type] = prev + count;\n if (next < 0) {\n throw new Error('More tasks executed then were scheduled.');\n }\n if (prev == 0 || next == 0) {\n const isEmpty = {\n microTask: counts['microTask'] > 0,\n macroTask: counts['macroTask'] > 0,\n eventTask: counts['eventTask'] > 0,\n change: type\n };\n this.hasTask(this.zone, isEmpty);\n }\n }\n }\n class ZoneTask {\n constructor(type, source, callback, options, scheduleFn, cancelFn) {\n // tslint:disable-next-line:require-internal-with-underscore\n this._zone = null;\n this.runCount = 0;\n // tslint:disable-next-line:require-internal-with-underscore\n this._zoneDelegates = null;\n // tslint:disable-next-line:require-internal-with-underscore\n this._state = 'notScheduled';\n this.type = type;\n this.source = source;\n this.data = options;\n this.scheduleFn = scheduleFn;\n this.cancelFn = cancelFn;\n if (!callback) {\n throw new Error('callback is not defined');\n }\n this.callback = callback;\n const self = this;\n // TODO: @JiaLiPassion options should have interface\n if (type === eventTask && options && options.useG) {\n this.invoke = ZoneTask.invokeTask;\n }\n else {\n this.invoke = function () {\n return ZoneTask.invokeTask.call(global, self, this, arguments);\n };\n }\n }\n static invokeTask(task, target, args) {\n if (!task) {\n task = this;\n }\n _numberOfNestedTaskFrames++;\n try {\n task.runCount++;\n return task.zone.runTask(task, target, args);\n }\n finally {\n if (_numberOfNestedTaskFrames == 1) {\n drainMicroTaskQueue();\n }\n _numberOfNestedTaskFrames--;\n }\n }\n get zone() {\n return this._zone;\n }\n get state() {\n return this._state;\n }\n cancelScheduleRequest() {\n this._transitionTo(notScheduled, scheduling);\n }\n // tslint:disable-next-line:require-internal-with-underscore\n _transitionTo(toState, fromState1, fromState2) {\n if (this._state === fromState1 || this._state === fromState2) {\n this._state = toState;\n if (toState == notScheduled) {\n this._zoneDelegates = null;\n }\n }\n else {\n throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? ' or \\'' + fromState2 + '\\'' : ''}, was '${this._state}'.`);\n }\n }\n toString() {\n if (this.data && typeof this.data.handleId !== 'undefined') {\n return this.data.handleId.toString();\n }\n else {\n return Object.prototype.toString.call(this);\n }\n }\n // add toJSON method to prevent cyclic error when\n // call JSON.stringify(zoneTask)\n toJSON() {\n return {\n type: this.type,\n state: this.state,\n source: this.source,\n zone: this.zone.name,\n runCount: this.runCount\n };\n }\n }\n //////////////////////////////////////////////////////\n //////////////////////////////////////////////////////\n /// MICROTASK QUEUE\n //////////////////////////////////////////////////////\n //////////////////////////////////////////////////////\n const symbolSetTimeout = __symbol__('setTimeout');\n const symbolPromise = __symbol__('Promise');\n const symbolThen = __symbol__('then');\n let _microTaskQueue = [];\n let _isDrainingMicrotaskQueue = false;\n let nativeMicroTaskQueuePromise;\n function scheduleMicroTask(task) {\n // if we are not running in any task, and there has not been anything scheduled\n // we must bootstrap the initial task creation by manually scheduling the drain\n if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {\n // We are not running in Task, so we need to kickstart the microtask queue.\n if (!nativeMicroTaskQueuePromise) {\n if (global[symbolPromise]) {\n nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);\n }\n }\n if (nativeMicroTaskQueuePromise) {\n let nativeThen = nativeMicroTaskQueuePromise[symbolThen];\n if (!nativeThen) {\n // native Promise is not patchable, we need to use `then` directly\n // issue 1078\n nativeThen = nativeMicroTaskQueuePromise['then'];\n }\n nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue);\n }\n else {\n global[symbolSetTimeout](drainMicroTaskQueue, 0);\n }\n }\n task && _microTaskQueue.push(task);\n }\n function drainMicroTaskQueue() {\n if (!_isDrainingMicrotaskQueue) {\n _isDrainingMicrotaskQueue = true;\n while (_microTaskQueue.length) {\n const queue = _microTaskQueue;\n _microTaskQueue = [];\n for (let i = 0; i < queue.length; i++) {\n const task = queue[i];\n try {\n task.zone.runTask(task, null, null);\n }\n catch (error) {\n _api.onUnhandledError(error);\n }\n }\n }\n _api.microtaskDrainDone();\n _isDrainingMicrotaskQueue = false;\n }\n }\n //////////////////////////////////////////////////////\n //////////////////////////////////////////////////////\n /// BOOTSTRAP\n //////////////////////////////////////////////////////\n //////////////////////////////////////////////////////\n const NO_ZONE = { name: 'NO ZONE' };\n const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';\n const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';\n const patches = {};\n const _api = {\n symbol: __symbol__,\n currentZoneFrame: () => _currentZoneFrame,\n onUnhandledError: noop,\n microtaskDrainDone: noop,\n scheduleMicroTask: scheduleMicroTask,\n showUncaughtError: () => !Zone[__symbol__('ignoreConsoleErrorUncaughtError')],\n patchEventTarget: () => [],\n patchOnProperties: noop,\n patchMethod: () => noop,\n bindArguments: () => [],\n patchThen: () => noop,\n patchMacroTask: () => noop,\n patchEventPrototype: () => noop,\n isIEOrEdge: () => false,\n getGlobalObjects: () => undefined,\n ObjectDefineProperty: () => noop,\n ObjectGetOwnPropertyDescriptor: () => undefined,\n ObjectCreate: () => undefined,\n ArraySlice: () => [],\n patchClass: () => noop,\n wrapWithCurrentZone: () => noop,\n filterProperties: () => [],\n attachOriginToPatched: () => noop,\n _redefineProperty: () => noop,\n patchCallbacks: () => noop\n };\n let _currentZoneFrame = { parent: null, zone: new Zone(null, null) };\n let _currentTask = null;\n let _numberOfNestedTaskFrames = 0;\n function noop() { }\n performanceMeasure('Zone', 'Zone');\n return global['Zone'] = Zone;\n})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);\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 * Suppress closure compiler errors about unknown 'Zone' variable\n * @fileoverview\n * @suppress {undefinedVars,globalThis,missingRequire}\n */\n/// \n// issue #989, to reduce bundle size, use short name\n/** Object.getOwnPropertyDescriptor */\nconst ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n/** Object.defineProperty */\nconst ObjectDefineProperty = Object.defineProperty;\n/** Object.getPrototypeOf */\nconst ObjectGetPrototypeOf = Object.getPrototypeOf;\n/** Object.create */\nconst ObjectCreate = Object.create;\n/** Array.prototype.slice */\nconst ArraySlice = Array.prototype.slice;\n/** addEventListener string const */\nconst ADD_EVENT_LISTENER_STR = 'addEventListener';\n/** removeEventListener string const */\nconst REMOVE_EVENT_LISTENER_STR = 'removeEventListener';\n/** zoneSymbol addEventListener */\nconst ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);\n/** zoneSymbol removeEventListener */\nconst ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);\n/** true string const */\nconst TRUE_STR = 'true';\n/** false string const */\nconst FALSE_STR = 'false';\n/** Zone symbol prefix string const. */\nconst ZONE_SYMBOL_PREFIX = Zone.__symbol__('');\nfunction wrapWithCurrentZone(callback, source) {\n return Zone.current.wrap(callback, source);\n}\nfunction scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {\n return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);\n}\nconst zoneSymbol = Zone.__symbol__;\nconst isWindowExists = typeof window !== 'undefined';\nconst internalWindow = isWindowExists ? window : undefined;\nconst _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;\nconst REMOVE_ATTRIBUTE = 'removeAttribute';\nconst NULL_ON_PROP_VALUE = [null];\nfunction bindArguments(args, source) {\n for (let i = args.length - 1; i >= 0; i--) {\n if (typeof args[i] === 'function') {\n args[i] = wrapWithCurrentZone(args[i], source + '_' + i);\n }\n }\n return args;\n}\nfunction patchPrototype(prototype, fnNames) {\n const source = prototype.constructor['name'];\n for (let i = 0; i < fnNames.length; i++) {\n const name = fnNames[i];\n const delegate = prototype[name];\n if (delegate) {\n const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);\n if (!isPropertyWritable(prototypeDesc)) {\n continue;\n }\n prototype[name] = ((delegate) => {\n const patched = function () {\n return delegate.apply(this, bindArguments(arguments, source + '.' + name));\n };\n attachOriginToPatched(patched, delegate);\n return patched;\n })(delegate);\n }\n }\n}\nfunction isPropertyWritable(propertyDesc) {\n if (!propertyDesc) {\n return true;\n }\n if (propertyDesc.writable === false) {\n return false;\n }\n return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');\n}\nconst isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);\n// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify\n// this code.\nconst isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&\n {}.toString.call(_global.process) === '[object process]');\nconst isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);\n// we are in electron of nw, so we are both browser and nodejs\n// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify\n// this code.\nconst isMix = typeof _global.process !== 'undefined' &&\n {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&\n !!(isWindowExists && internalWindow['HTMLElement']);\nconst zoneSymbolEventNames = {};\nconst wrapFn = function (event) {\n // https://github.com/angular/zone.js/issues/911, in IE, sometimes\n // event will be undefined, so we need to use window.event\n event = event || _global.event;\n if (!event) {\n return;\n }\n let eventNameSymbol = zoneSymbolEventNames[event.type];\n if (!eventNameSymbol) {\n eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type);\n }\n const target = this || event.target || _global;\n const listener = target[eventNameSymbol];\n let result;\n if (isBrowser && target === internalWindow && event.type === 'error') {\n // window.onerror have different signiture\n // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror\n // and onerror callback will prevent default when callback return true\n const errorEvent = event;\n result = listener &&\n listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);\n if (result === true) {\n event.preventDefault();\n }\n }\n else {\n result = listener && listener.apply(this, arguments);\n if (result != undefined && !result) {\n event.preventDefault();\n }\n }\n return result;\n};\nfunction patchProperty(obj, prop, prototype) {\n let desc = ObjectGetOwnPropertyDescriptor(obj, prop);\n if (!desc && prototype) {\n // when patch window object, use prototype to check prop exist or not\n const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);\n if (prototypeDesc) {\n desc = { enumerable: true, configurable: true };\n }\n }\n // if the descriptor not exists or is not configurable\n // just return\n if (!desc || !desc.configurable) {\n return;\n }\n const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');\n if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {\n return;\n }\n // A property descriptor cannot have getter/setter and be writable\n // deleting the writable and value properties avoids this error:\n //\n // TypeError: property descriptors must not specify a value or be writable when a\n // getter or setter has been specified\n delete desc.writable;\n delete desc.value;\n const originalDescGet = desc.get;\n const originalDescSet = desc.set;\n // substr(2) cuz 'onclick' -> 'click', etc\n const eventName = prop.substr(2);\n let eventNameSymbol = zoneSymbolEventNames[eventName];\n if (!eventNameSymbol) {\n eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName);\n }\n desc.set = function (newValue) {\n // in some of windows's onproperty callback, this is undefined\n // so we need to check it\n let target = this;\n if (!target && obj === _global) {\n target = _global;\n }\n if (!target) {\n return;\n }\n let previousValue = target[eventNameSymbol];\n if (previousValue) {\n target.removeEventListener(eventName, wrapFn);\n }\n // issue #978, when onload handler was added before loading zone.js\n // we should remove it with originalDescSet\n if (originalDescSet) {\n originalDescSet.apply(target, NULL_ON_PROP_VALUE);\n }\n if (typeof newValue === 'function') {\n target[eventNameSymbol] = newValue;\n target.addEventListener(eventName, wrapFn, false);\n }\n else {\n target[eventNameSymbol] = null;\n }\n };\n // The getter would return undefined for unassigned properties but the default value of an\n // unassigned property is null\n desc.get = function () {\n // in some of windows's onproperty callback, this is undefined\n // so we need to check it\n let target = this;\n if (!target && obj === _global) {\n target = _global;\n }\n if (!target) {\n return null;\n }\n const listener = target[eventNameSymbol];\n if (listener) {\n return listener;\n }\n else if (originalDescGet) {\n // result will be null when use inline event attribute,\n // such as \n // because the onclick function is internal raw uncompiled handler\n // the onclick will be evaluated when first time event was triggered or\n // the property is accessed, https://github.com/angular/zone.js/issues/525\n // so we should use original native get to retrieve the handler\n let value = originalDescGet && originalDescGet.call(this);\n if (value) {\n desc.set.call(this, value);\n if (typeof target[REMOVE_ATTRIBUTE] === 'function') {\n target.removeAttribute(prop);\n }\n return value;\n }\n }\n return null;\n };\n ObjectDefineProperty(obj, prop, desc);\n obj[onPropPatchedSymbol] = true;\n}\nfunction patchOnProperties(obj, properties, prototype) {\n if (properties) {\n for (let i = 0; i < properties.length; i++) {\n patchProperty(obj, 'on' + properties[i], prototype);\n }\n }\n else {\n const onProperties = [];\n for (const prop in obj) {\n if (prop.substr(0, 2) == 'on') {\n onProperties.push(prop);\n }\n }\n for (let j = 0; j < onProperties.length; j++) {\n patchProperty(obj, onProperties[j], prototype);\n }\n }\n}\nconst originalInstanceKey = zoneSymbol('originalInstance');\n// wrap some native API on `window`\nfunction patchClass(className) {\n const OriginalClass = _global[className];\n if (!OriginalClass)\n return;\n // keep original class in global\n _global[zoneSymbol(className)] = OriginalClass;\n _global[className] = function () {\n const a = bindArguments(arguments, className);\n switch (a.length) {\n case 0:\n this[originalInstanceKey] = new OriginalClass();\n break;\n case 1:\n this[originalInstanceKey] = new OriginalClass(a[0]);\n break;\n case 2:\n this[originalInstanceKey] = new OriginalClass(a[0], a[1]);\n break;\n case 3:\n this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);\n break;\n case 4:\n this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);\n break;\n default:\n throw new Error('Arg list too long.');\n }\n };\n // attach original delegate to patched function\n attachOriginToPatched(_global[className], OriginalClass);\n const instance = new OriginalClass(function () { });\n let prop;\n for (prop in instance) {\n // https://bugs.webkit.org/show_bug.cgi?id=44721\n if (className === 'XMLHttpRequest' && prop === 'responseBlob')\n continue;\n (function (prop) {\n if (typeof instance[prop] === 'function') {\n _global[className].prototype[prop] = function () {\n return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);\n };\n }\n else {\n ObjectDefineProperty(_global[className].prototype, prop, {\n set: function (fn) {\n if (typeof fn === 'function') {\n this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);\n // keep callback in wrapped function so we can\n // use it in Function.prototype.toString to return\n // the native one.\n attachOriginToPatched(this[originalInstanceKey][prop], fn);\n }\n else {\n this[originalInstanceKey][prop] = fn;\n }\n },\n get: function () {\n return this[originalInstanceKey][prop];\n }\n });\n }\n }(prop));\n }\n for (prop in OriginalClass) {\n if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {\n _global[className][prop] = OriginalClass[prop];\n }\n }\n}\nfunction patchMethod(target, name, patchFn) {\n let proto = target;\n while (proto && !proto.hasOwnProperty(name)) {\n proto = ObjectGetPrototypeOf(proto);\n }\n if (!proto && target[name]) {\n // somehow we did not find it, but we can see it. This happens on IE for Window properties.\n proto = target;\n }\n const delegateName = zoneSymbol(name);\n let delegate = null;\n if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {\n delegate = proto[delegateName] = proto[name];\n // check whether proto[name] is writable\n // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob\n const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);\n if (isPropertyWritable(desc)) {\n const patchDelegate = patchFn(delegate, delegateName, name);\n proto[name] = function () {\n return patchDelegate(this, arguments);\n };\n attachOriginToPatched(proto[name], delegate);\n }\n }\n return delegate;\n}\n// TODO: @JiaLiPassion, support cancel task later if necessary\nfunction patchMacroTask(obj, funcName, metaCreator) {\n let setNative = null;\n function scheduleTask(task) {\n const data = task.data;\n data.args[data.cbIdx] = function () {\n task.invoke.apply(this, arguments);\n };\n setNative.apply(data.target, data.args);\n return task;\n }\n setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {\n const meta = metaCreator(self, args);\n if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {\n return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);\n }\n else {\n // cause an error by calling it directly.\n return delegate.apply(self, args);\n }\n });\n}\nfunction attachOriginToPatched(patched, original) {\n patched[zoneSymbol('OriginalDelegate')] = original;\n}\nlet isDetectedIEOrEdge = false;\nlet ieOrEdge = false;\nfunction isIE() {\n try {\n const ua = internalWindow.navigator.userAgent;\n if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {\n return true;\n }\n }\n catch (error) {\n }\n return false;\n}\nfunction isIEOrEdge() {\n if (isDetectedIEOrEdge) {\n return ieOrEdge;\n }\n isDetectedIEOrEdge = true;\n try {\n const ua = internalWindow.navigator.userAgent;\n if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {\n ieOrEdge = true;\n }\n }\n catch (error) {\n }\n return ieOrEdge;\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 */\nZone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {\n const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n const ObjectDefineProperty = Object.defineProperty;\n function readableObjectToString(obj) {\n if (obj && obj.toString === Object.prototype.toString) {\n const className = obj.constructor && obj.constructor.name;\n return (className ? className : '') + ': ' + JSON.stringify(obj);\n }\n return obj ? obj.toString() : Object.prototype.toString.call(obj);\n }\n const __symbol__ = api.symbol;\n const _uncaughtPromiseErrors = [];\n const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] === true;\n const symbolPromise = __symbol__('Promise');\n const symbolThen = __symbol__('then');\n const creationTrace = '__creationTrace__';\n api.onUnhandledError = (e) => {\n if (api.showUncaughtError()) {\n const rejection = e && e.rejection;\n if (rejection) {\n console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);\n }\n else {\n console.error(e);\n }\n }\n };\n api.microtaskDrainDone = () => {\n while (_uncaughtPromiseErrors.length) {\n const uncaughtPromiseError = _uncaughtPromiseErrors.shift();\n try {\n uncaughtPromiseError.zone.runGuarded(() => {\n if (uncaughtPromiseError.throwOriginal) {\n throw uncaughtPromiseError.rejection;\n }\n throw uncaughtPromiseError;\n });\n }\n catch (error) {\n handleUnhandledRejection(error);\n }\n }\n };\n const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');\n function handleUnhandledRejection(e) {\n api.onUnhandledError(e);\n try {\n const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];\n if (typeof handler === 'function') {\n handler.call(this, e);\n }\n }\n catch (err) {\n }\n }\n function isThenable(value) {\n return value && value.then;\n }\n function forwardResolution(value) {\n return value;\n }\n function forwardRejection(rejection) {\n return ZoneAwarePromise.reject(rejection);\n }\n const symbolState = __symbol__('state');\n const symbolValue = __symbol__('value');\n const symbolFinally = __symbol__('finally');\n const symbolParentPromiseValue = __symbol__('parentPromiseValue');\n const symbolParentPromiseState = __symbol__('parentPromiseState');\n const source = 'Promise.then';\n const UNRESOLVED = null;\n const RESOLVED = true;\n const REJECTED = false;\n const REJECTED_NO_CATCH = 0;\n function makeResolver(promise, state) {\n return (v) => {\n try {\n resolvePromise(promise, state, v);\n }\n catch (err) {\n resolvePromise(promise, false, err);\n }\n // Do not return value or you will break the Promise spec.\n };\n }\n const once = function () {\n let wasCalled = false;\n return function wrapper(wrappedFunction) {\n return function () {\n if (wasCalled) {\n return;\n }\n wasCalled = true;\n wrappedFunction.apply(null, arguments);\n };\n };\n };\n const TYPE_ERROR = 'Promise resolved with itself';\n const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');\n // Promise Resolution\n function resolvePromise(promise, state, value) {\n const onceWrapper = once();\n if (promise === value) {\n throw new TypeError(TYPE_ERROR);\n }\n if (promise[symbolState] === UNRESOLVED) {\n // should only get value.then once based on promise spec.\n let then = null;\n try {\n if (typeof value === 'object' || typeof value === 'function') {\n then = value && value.then;\n }\n }\n catch (err) {\n onceWrapper(() => {\n resolvePromise(promise, false, err);\n })();\n return promise;\n }\n // if (value instanceof ZoneAwarePromise) {\n if (state !== REJECTED && value instanceof ZoneAwarePromise &&\n value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&\n value[symbolState] !== UNRESOLVED) {\n clearRejectedNoCatch(value);\n resolvePromise(promise, value[symbolState], value[symbolValue]);\n }\n else if (state !== REJECTED && typeof then === 'function') {\n try {\n then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));\n }\n catch (err) {\n onceWrapper(() => {\n resolvePromise(promise, false, err);\n })();\n }\n }\n else {\n promise[symbolState] = state;\n const queue = promise[symbolValue];\n promise[symbolValue] = value;\n if (promise[symbolFinally] === symbolFinally) {\n // the promise is generated by Promise.prototype.finally\n if (state === RESOLVED) {\n // the state is resolved, should ignore the value\n // and use parent promise value\n promise[symbolState] = promise[symbolParentPromiseState];\n promise[symbolValue] = promise[symbolParentPromiseValue];\n }\n }\n // record task information in value when error occurs, so we can\n // do some additional work such as render longStackTrace\n if (state === REJECTED && value instanceof Error) {\n // check if longStackTraceZone is here\n const trace = Zone.currentTask && Zone.currentTask.data &&\n Zone.currentTask.data[creationTrace];\n if (trace) {\n // only keep the long stack trace into error when in longStackTraceZone\n ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });\n }\n }\n for (let i = 0; i < queue.length;) {\n scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);\n }\n if (queue.length == 0 && state == REJECTED) {\n promise[symbolState] = REJECTED_NO_CATCH;\n let uncaughtPromiseError = value;\n try {\n // Here we throws a new Error to print more readable error log\n // and if the value is not an error, zone.js builds an `Error`\n // Object here to attach the stack information.\n throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +\n (value && value.stack ? '\\n' + value.stack : ''));\n }\n catch (err) {\n uncaughtPromiseError = err;\n }\n if (isDisableWrappingUncaughtPromiseRejection) {\n // If disable wrapping uncaught promise reject\n // use the value instead of wrapping it.\n uncaughtPromiseError.throwOriginal = true;\n }\n uncaughtPromiseError.rejection = value;\n uncaughtPromiseError.promise = promise;\n uncaughtPromiseError.zone = Zone.current;\n uncaughtPromiseError.task = Zone.currentTask;\n _uncaughtPromiseErrors.push(uncaughtPromiseError);\n api.scheduleMicroTask(); // to make sure that it is running\n }\n }\n }\n // Resolving an already resolved promise is a noop.\n return promise;\n }\n const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');\n function clearRejectedNoCatch(promise) {\n if (promise[symbolState] === REJECTED_NO_CATCH) {\n // if the promise is rejected no catch status\n // and queue.length > 0, means there is a error handler\n // here to handle the rejected promise, we should trigger\n // windows.rejectionhandled eventHandler or nodejs rejectionHandled\n // eventHandler\n try {\n const handler = Zone[REJECTION_HANDLED_HANDLER];\n if (handler && typeof handler === 'function') {\n handler.call(this, { rejection: promise[symbolValue], promise: promise });\n }\n }\n catch (err) {\n }\n promise[symbolState] = REJECTED;\n for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {\n if (promise === _uncaughtPromiseErrors[i].promise) {\n _uncaughtPromiseErrors.splice(i, 1);\n }\n }\n }\n }\n function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {\n clearRejectedNoCatch(promise);\n const promiseState = promise[symbolState];\n const delegate = promiseState ?\n (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :\n (typeof onRejected === 'function') ? onRejected : forwardRejection;\n zone.scheduleMicroTask(source, () => {\n try {\n const parentPromiseValue = promise[symbolValue];\n const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];\n if (isFinallyPromise) {\n // if the promise is generated from finally call, keep parent promise's state and value\n chainPromise[symbolParentPromiseValue] = parentPromiseValue;\n chainPromise[symbolParentPromiseState] = promiseState;\n }\n // should not pass value to finally callback\n const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?\n [] :\n [parentPromiseValue]);\n resolvePromise(chainPromise, true, value);\n }\n catch (error) {\n // if error occurs, should always return this error\n resolvePromise(chainPromise, false, error);\n }\n }, chainPromise);\n }\n const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';\n const noop = function () { };\n class ZoneAwarePromise {\n static toString() {\n return ZONE_AWARE_PROMISE_TO_STRING;\n }\n static resolve(value) {\n return resolvePromise(new this(null), RESOLVED, value);\n }\n static reject(error) {\n return resolvePromise(new this(null), REJECTED, error);\n }\n static race(values) {\n let resolve;\n let reject;\n let promise = new this((res, rej) => {\n resolve = res;\n reject = rej;\n });\n function onResolve(value) {\n resolve(value);\n }\n function onReject(error) {\n reject(error);\n }\n for (let value of values) {\n if (!isThenable(value)) {\n value = this.resolve(value);\n }\n value.then(onResolve, onReject);\n }\n return promise;\n }\n static all(values) {\n return ZoneAwarePromise.allWithCallback(values);\n }\n static allSettled(values) {\n const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;\n return P.allWithCallback(values, {\n thenCallback: (value) => ({ status: 'fulfilled', value }),\n errorCallback: (err) => ({ status: 'rejected', reason: err })\n });\n }\n static allWithCallback(values, callback) {\n let resolve;\n let reject;\n let promise = new this((res, rej) => {\n resolve = res;\n reject = rej;\n });\n // Start at 2 to prevent prematurely resolving if .then is called immediately.\n let unresolvedCount = 2;\n let valueIndex = 0;\n const resolvedValues = [];\n for (let value of values) {\n if (!isThenable(value)) {\n value = this.resolve(value);\n }\n const curValueIndex = valueIndex;\n try {\n value.then((value) => {\n resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;\n unresolvedCount--;\n if (unresolvedCount === 0) {\n resolve(resolvedValues);\n }\n }, (err) => {\n if (!callback) {\n reject(err);\n }\n else {\n resolvedValues[curValueIndex] = callback.errorCallback(err);\n unresolvedCount--;\n if (unresolvedCount === 0) {\n resolve(resolvedValues);\n }\n }\n });\n }\n catch (thenErr) {\n reject(thenErr);\n }\n unresolvedCount++;\n valueIndex++;\n }\n // Make the unresolvedCount zero-based again.\n unresolvedCount -= 2;\n if (unresolvedCount === 0) {\n resolve(resolvedValues);\n }\n return promise;\n }\n constructor(executor) {\n const promise = this;\n if (!(promise instanceof ZoneAwarePromise)) {\n throw new Error('Must be an instanceof Promise.');\n }\n promise[symbolState] = UNRESOLVED;\n promise[symbolValue] = []; // queue;\n try {\n executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED));\n }\n catch (error) {\n resolvePromise(promise, false, error);\n }\n }\n get [Symbol.toStringTag]() {\n return 'Promise';\n }\n get [Symbol.species]() {\n return ZoneAwarePromise;\n }\n then(onFulfilled, onRejected) {\n let C = this.constructor[Symbol.species];\n if (!C || typeof C !== 'function') {\n C = this.constructor || ZoneAwarePromise;\n }\n const chainPromise = new C(noop);\n const zone = Zone.current;\n if (this[symbolState] == UNRESOLVED) {\n this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);\n }\n else {\n scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);\n }\n return chainPromise;\n }\n catch(onRejected) {\n return this.then(null, onRejected);\n }\n finally(onFinally) {\n let C = this.constructor[Symbol.species];\n if (!C || typeof C !== 'function') {\n C = ZoneAwarePromise;\n }\n const chainPromise = new C(noop);\n chainPromise[symbolFinally] = symbolFinally;\n const zone = Zone.current;\n if (this[symbolState] == UNRESOLVED) {\n this[symbolValue].push(zone, chainPromise, onFinally, onFinally);\n }\n else {\n scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);\n }\n return chainPromise;\n }\n }\n // Protect against aggressive optimizers dropping seemingly unused properties.\n // E.g. Closure Compiler in advanced mode.\n ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;\n ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;\n ZoneAwarePromise['race'] = ZoneAwarePromise.race;\n ZoneAwarePromise['all'] = ZoneAwarePromise.all;\n const NativePromise = global[symbolPromise] = global['Promise'];\n global['Promise'] = ZoneAwarePromise;\n const symbolThenPatched = __symbol__('thenPatched');\n function patchThen(Ctor) {\n const proto = Ctor.prototype;\n const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');\n if (prop && (prop.writable === false || !prop.configurable)) {\n // check Ctor.prototype.then propertyDescriptor is writable or not\n // in meteor env, writable is false, we should ignore such case\n return;\n }\n const originalThen = proto.then;\n // Keep a reference to the original method.\n proto[symbolThen] = originalThen;\n Ctor.prototype.then = function (onResolve, onReject) {\n const wrapped = new ZoneAwarePromise((resolve, reject) => {\n originalThen.call(this, resolve, reject);\n });\n return wrapped.then(onResolve, onReject);\n };\n Ctor[symbolThenPatched] = true;\n }\n api.patchThen = patchThen;\n function zoneify(fn) {\n return function (self, args) {\n let resultPromise = fn.apply(self, args);\n if (resultPromise instanceof ZoneAwarePromise) {\n return resultPromise;\n }\n let ctor = resultPromise.constructor;\n if (!ctor[symbolThenPatched]) {\n patchThen(ctor);\n }\n return resultPromise;\n };\n }\n if (NativePromise) {\n patchThen(NativePromise);\n patchMethod(global, 'fetch', delegate => zoneify(delegate));\n }\n // This is not part of public API, but it is useful for tests, so we expose it.\n Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;\n return ZoneAwarePromise;\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// override Function.prototype.toString to make zone.js patched function\n// look like native function\nZone.__load_patch('toString', (global) => {\n // patch Func.prototype.toString to let them look like native\n const originalFunctionToString = Function.prototype.toString;\n const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');\n const PROMISE_SYMBOL = zoneSymbol('Promise');\n const ERROR_SYMBOL = zoneSymbol('Error');\n const newFunctionToString = function toString() {\n if (typeof this === 'function') {\n const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];\n if (originalDelegate) {\n if (typeof originalDelegate === 'function') {\n return originalFunctionToString.call(originalDelegate);\n }\n else {\n return Object.prototype.toString.call(originalDelegate);\n }\n }\n if (this === Promise) {\n const nativePromise = global[PROMISE_SYMBOL];\n if (nativePromise) {\n return originalFunctionToString.call(nativePromise);\n }\n }\n if (this === Error) {\n const nativeError = global[ERROR_SYMBOL];\n if (nativeError) {\n return originalFunctionToString.call(nativeError);\n }\n }\n }\n return originalFunctionToString.call(this);\n };\n newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;\n Function.prototype.toString = newFunctionToString;\n // patch Object.prototype.toString to let them look like native\n const originalObjectToString = Object.prototype.toString;\n const PROMISE_OBJECT_TO_STRING = '[object Promise]';\n Object.prototype.toString = function () {\n if (typeof Promise === 'function' && this instanceof Promise) {\n return PROMISE_OBJECT_TO_STRING;\n }\n return originalObjectToString.call(this);\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 */\nlet passiveSupported = false;\nif (typeof window !== 'undefined') {\n try {\n const options = Object.defineProperty({}, 'passive', {\n get: function () {\n passiveSupported = true;\n }\n });\n window.addEventListener('test', options, options);\n window.removeEventListener('test', options, options);\n }\n catch (err) {\n passiveSupported = false;\n }\n}\n// an identifier to tell ZoneTask do not create a new invoke closure\nconst OPTIMIZED_ZONE_EVENT_TASK_DATA = {\n useG: true\n};\nconst zoneSymbolEventNames$1 = {};\nconst globalSources = {};\nconst EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\\\w+)(true|false)$');\nconst IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');\nfunction prepareEventNames(eventName, eventNameToString) {\n const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;\n const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;\n const symbol = ZONE_SYMBOL_PREFIX + falseEventName;\n const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;\n zoneSymbolEventNames$1[eventName] = {};\n zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;\n zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;\n}\nfunction patchEventTarget(_global, apis, patchOptions) {\n const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;\n const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;\n const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';\n const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';\n const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);\n const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';\n const PREPEND_EVENT_LISTENER = 'prependListener';\n const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';\n const invokeTask = function (task, target, event) {\n // for better performance, check isRemoved which is set\n // by removeEventListener\n if (task.isRemoved) {\n return;\n }\n const delegate = task.callback;\n if (typeof delegate === 'object' && delegate.handleEvent) {\n // create the bind version of handleEvent when invoke\n task.callback = (event) => delegate.handleEvent(event);\n task.originalDelegate = delegate;\n }\n // invoke static task.invoke\n task.invoke(task, target, [event]);\n const options = task.options;\n if (options && typeof options === 'object' && options.once) {\n // if options.once is true, after invoke once remove listener here\n // only browser need to do this, nodejs eventEmitter will cal removeListener\n // inside EventEmitter.once\n const delegate = task.originalDelegate ? task.originalDelegate : task.callback;\n target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);\n }\n };\n // global shared zoneAwareCallback to handle all event callback with capture = false\n const globalZoneAwareCallback = function (event) {\n // https://github.com/angular/zone.js/issues/911, in IE, sometimes\n // event will be undefined, so we need to use window.event\n event = event || _global.event;\n if (!event) {\n return;\n }\n // event.target is needed for Samsung TV and SourceBuffer\n // || global is needed https://github.com/angular/zone.js/issues/190\n const target = this || event.target || _global;\n const tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]];\n if (tasks) {\n // invoke all tasks which attached to current target with given event.type and capture = false\n // for performance concern, if task.length === 1, just invoke\n if (tasks.length === 1) {\n invokeTask(tasks[0], target, event);\n }\n else {\n // https://github.com/angular/zone.js/issues/836\n // copy the tasks array before invoke, to avoid\n // the callback will remove itself or other listener\n const copyTasks = tasks.slice();\n for (let i = 0; i < copyTasks.length; i++) {\n if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {\n break;\n }\n invokeTask(copyTasks[i], target, event);\n }\n }\n }\n };\n // global shared zoneAwareCallback to handle all event callback with capture = true\n const globalZoneAwareCaptureCallback = function (event) {\n // https://github.com/angular/zone.js/issues/911, in IE, sometimes\n // event will be undefined, so we need to use window.event\n event = event || _global.event;\n if (!event) {\n return;\n }\n // event.target is needed for Samsung TV and SourceBuffer\n // || global is needed https://github.com/angular/zone.js/issues/190\n const target = this || event.target || _global;\n const tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]];\n if (tasks) {\n // invoke all tasks which attached to current target with given event.type and capture = false\n // for performance concern, if task.length === 1, just invoke\n if (tasks.length === 1) {\n invokeTask(tasks[0], target, event);\n }\n else {\n // https://github.com/angular/zone.js/issues/836\n // copy the tasks array before invoke, to avoid\n // the callback will remove itself or other listener\n const copyTasks = tasks.slice();\n for (let i = 0; i < copyTasks.length; i++) {\n if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {\n break;\n }\n invokeTask(copyTasks[i], target, event);\n }\n }\n }\n };\n function patchEventTargetMethods(obj, patchOptions) {\n if (!obj) {\n return false;\n }\n let useGlobalCallback = true;\n if (patchOptions && patchOptions.useG !== undefined) {\n useGlobalCallback = patchOptions.useG;\n }\n const validateHandler = patchOptions && patchOptions.vh;\n let checkDuplicate = true;\n if (patchOptions && patchOptions.chkDup !== undefined) {\n checkDuplicate = patchOptions.chkDup;\n }\n let returnTarget = false;\n if (patchOptions && patchOptions.rt !== undefined) {\n returnTarget = patchOptions.rt;\n }\n let proto = obj;\n while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {\n proto = ObjectGetPrototypeOf(proto);\n }\n if (!proto && obj[ADD_EVENT_LISTENER]) {\n // somehow we did not find it, but we can see it. This happens on IE for Window properties.\n proto = obj;\n }\n if (!proto) {\n return false;\n }\n if (proto[zoneSymbolAddEventListener]) {\n return false;\n }\n const eventNameToString = patchOptions && patchOptions.eventNameToString;\n // a shared global taskData to pass data for scheduleEventTask\n // so we do not need to create a new object just for pass some data\n const taskData = {};\n const nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];\n const nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =\n proto[REMOVE_EVENT_LISTENER];\n const nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =\n proto[LISTENERS_EVENT_LISTENER];\n const nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =\n proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];\n let nativePrependEventListener;\n if (patchOptions && patchOptions.prepend) {\n nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =\n proto[patchOptions.prepend];\n }\n /**\n * This util function will build an option object with passive option\n * to handle all possible input from the user.\n */\n function buildEventListenerOptions(options, passive) {\n if (!passiveSupported && typeof options === 'object' && options) {\n // doesn't support passive but user want to pass an object as options.\n // this will not work on some old browser, so we just pass a boolean\n // as useCapture parameter\n return !!options.capture;\n }\n if (!passiveSupported || !passive) {\n return options;\n }\n if (typeof options === 'boolean') {\n return { capture: options, passive: true };\n }\n if (!options) {\n return { passive: true };\n }\n if (typeof options === 'object' && options.passive !== false) {\n return Object.assign(Object.assign({}, options), { passive: true });\n }\n return options;\n }\n const customScheduleGlobal = function (task) {\n // if there is already a task for the eventName + capture,\n // just return, because we use the shared globalZoneAwareCallback here.\n if (taskData.isExisting) {\n return;\n }\n return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);\n };\n const customCancelGlobal = function (task) {\n // if task is not marked as isRemoved, this call is directly\n // from Zone.prototype.cancelTask, we should remove the task\n // from tasksList of target first\n if (!task.isRemoved) {\n const symbolEventNames = zoneSymbolEventNames$1[task.eventName];\n let symbolEventName;\n if (symbolEventNames) {\n symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];\n }\n const existingTasks = symbolEventName && task.target[symbolEventName];\n if (existingTasks) {\n for (let i = 0; i < existingTasks.length; i++) {\n const existingTask = existingTasks[i];\n if (existingTask === task) {\n existingTasks.splice(i, 1);\n // set isRemoved to data for faster invokeTask check\n task.isRemoved = true;\n if (existingTasks.length === 0) {\n // all tasks for the eventName + capture have gone,\n // remove globalZoneAwareCallback and remove the task cache from target\n task.allRemoved = true;\n task.target[symbolEventName] = null;\n }\n break;\n }\n }\n }\n }\n // if all tasks for the eventName + capture have gone,\n // we will really remove the global event callback,\n // if not, return\n if (!task.allRemoved) {\n return;\n }\n return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);\n };\n const customScheduleNonGlobal = function (task) {\n return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);\n };\n const customSchedulePrepend = function (task) {\n return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);\n };\n const customCancelNonGlobal = function (task) {\n return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);\n };\n const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;\n const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;\n const compareTaskCallbackVsDelegate = function (task, delegate) {\n const typeOfDelegate = typeof delegate;\n return (typeOfDelegate === 'function' && task.callback === delegate) ||\n (typeOfDelegate === 'object' && task.originalDelegate === delegate);\n };\n const compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;\n const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];\n const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];\n const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {\n return function () {\n const target = this || _global;\n let eventName = arguments[0];\n if (patchOptions && patchOptions.transferEventName) {\n eventName = patchOptions.transferEventName(eventName);\n }\n let delegate = arguments[1];\n if (!delegate) {\n return nativeListener.apply(this, arguments);\n }\n if (isNode && eventName === 'uncaughtException') {\n // don't patch uncaughtException of nodejs to prevent endless loop\n return nativeListener.apply(this, arguments);\n }\n // don't create the bind delegate function for handleEvent\n // case here to improve addEventListener performance\n // we will create the bind delegate when invoke\n let isHandleEvent = false;\n if (typeof delegate !== 'function') {\n if (!delegate.handleEvent) {\n return nativeListener.apply(this, arguments);\n }\n isHandleEvent = true;\n }\n if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {\n return;\n }\n const passive = passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;\n const options = buildEventListenerOptions(arguments[2], passive);\n if (unpatchedEvents) {\n // check upatched list\n for (let i = 0; i < unpatchedEvents.length; i++) {\n if (eventName === unpatchedEvents[i]) {\n if (passive) {\n return nativeListener.call(target, eventName, delegate, options);\n }\n else {\n return nativeListener.apply(this, arguments);\n }\n }\n }\n }\n const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;\n const once = options && typeof options === 'object' ? options.once : false;\n const zone = Zone.current;\n let symbolEventNames = zoneSymbolEventNames$1[eventName];\n if (!symbolEventNames) {\n prepareEventNames(eventName, eventNameToString);\n symbolEventNames = zoneSymbolEventNames$1[eventName];\n }\n const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];\n let existingTasks = target[symbolEventName];\n let isExisting = false;\n if (existingTasks) {\n // already have task registered\n isExisting = true;\n if (checkDuplicate) {\n for (let i = 0; i < existingTasks.length; i++) {\n if (compare(existingTasks[i], delegate)) {\n // same callback, same capture, same event name, just return\n return;\n }\n }\n }\n }\n else {\n existingTasks = target[symbolEventName] = [];\n }\n let source;\n const constructorName = target.constructor['name'];\n const targetSource = globalSources[constructorName];\n if (targetSource) {\n source = targetSource[eventName];\n }\n if (!source) {\n source = constructorName + addSource +\n (eventNameToString ? eventNameToString(eventName) : eventName);\n }\n // do not create a new object as task.data to pass those things\n // just use the global shared one\n taskData.options = options;\n if (once) {\n // if addEventListener with once options, we don't pass it to\n // native addEventListener, instead we keep the once setting\n // and handle ourselves.\n taskData.options.once = false;\n }\n taskData.target = target;\n taskData.capture = capture;\n taskData.eventName = eventName;\n taskData.isExisting = isExisting;\n const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;\n // keep taskData into data to allow onScheduleEventTask to access the task information\n if (data) {\n data.taskData = taskData;\n }\n const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);\n // should clear taskData.target to avoid memory leak\n // issue, https://github.com/angular/angular/issues/20442\n taskData.target = null;\n // need to clear up taskData because it is a global object\n if (data) {\n data.taskData = null;\n }\n // have to save those information to task in case\n // application may call task.zone.cancelTask() directly\n if (once) {\n options.once = true;\n }\n if (!(!passiveSupported && typeof task.options === 'boolean')) {\n // if not support passive, and we pass an option object\n // to addEventListener, we should save the options to task\n task.options = options;\n }\n task.target = target;\n task.capture = capture;\n task.eventName = eventName;\n if (isHandleEvent) {\n // save original delegate for compare to check duplicate\n task.originalDelegate = delegate;\n }\n if (!prepend) {\n existingTasks.push(task);\n }\n else {\n existingTasks.unshift(task);\n }\n if (returnTarget) {\n return target;\n }\n };\n };\n proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);\n if (nativePrependEventListener) {\n proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);\n }\n proto[REMOVE_EVENT_LISTENER] = function () {\n const target = this || _global;\n let eventName = arguments[0];\n if (patchOptions && patchOptions.transferEventName) {\n eventName = patchOptions.transferEventName(eventName);\n }\n const options = arguments[2];\n const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;\n const delegate = arguments[1];\n if (!delegate) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (validateHandler &&\n !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {\n return;\n }\n const symbolEventNames = zoneSymbolEventNames$1[eventName];\n let symbolEventName;\n if (symbolEventNames) {\n symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];\n }\n const existingTasks = symbolEventName && target[symbolEventName];\n if (existingTasks) {\n for (let i = 0; i < existingTasks.length; i++) {\n const existingTask = existingTasks[i];\n if (compare(existingTask, delegate)) {\n existingTasks.splice(i, 1);\n // set isRemoved to data for faster invokeTask check\n existingTask.isRemoved = true;\n if (existingTasks.length === 0) {\n // all tasks for the eventName + capture have gone,\n // remove globalZoneAwareCallback and remove the task cache from target\n existingTask.allRemoved = true;\n target[symbolEventName] = null;\n // in the target, we have an event listener which is added by on_property\n // such as target.onclick = function() {}, so we need to clear this internal\n // property too if all delegates all removed\n if (typeof eventName === 'string') {\n const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;\n target[onPropertySymbol] = null;\n }\n }\n existingTask.zone.cancelTask(existingTask);\n if (returnTarget) {\n return target;\n }\n return;\n }\n }\n }\n // issue 930, didn't find the event name or callback\n // from zone kept existingTasks, the callback maybe\n // added outside of zone, we need to call native removeEventListener\n // to try to remove it.\n return nativeRemoveEventListener.apply(this, arguments);\n };\n proto[LISTENERS_EVENT_LISTENER] = function () {\n const target = this || _global;\n let eventName = arguments[0];\n if (patchOptions && patchOptions.transferEventName) {\n eventName = patchOptions.transferEventName(eventName);\n }\n const listeners = [];\n const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n let delegate = task.originalDelegate ? task.originalDelegate : task.callback;\n listeners.push(delegate);\n }\n return listeners;\n };\n proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {\n const target = this || _global;\n let eventName = arguments[0];\n if (!eventName) {\n const keys = Object.keys(target);\n for (let i = 0; i < keys.length; i++) {\n const prop = keys[i];\n const match = EVENT_NAME_SYMBOL_REGX.exec(prop);\n let evtName = match && match[1];\n // in nodejs EventEmitter, removeListener event is\n // used for monitoring the removeListener call,\n // so just keep removeListener eventListener until\n // all other eventListeners are removed\n if (evtName && evtName !== 'removeListener') {\n this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);\n }\n }\n // remove removeListener listener finally\n this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');\n }\n else {\n if (patchOptions && patchOptions.transferEventName) {\n eventName = patchOptions.transferEventName(eventName);\n }\n const symbolEventNames = zoneSymbolEventNames$1[eventName];\n if (symbolEventNames) {\n const symbolEventName = symbolEventNames[FALSE_STR];\n const symbolCaptureEventName = symbolEventNames[TRUE_STR];\n const tasks = target[symbolEventName];\n const captureTasks = target[symbolCaptureEventName];\n if (tasks) {\n const removeTasks = tasks.slice();\n for (let i = 0; i < removeTasks.length; i++) {\n const task = removeTasks[i];\n let delegate = task.originalDelegate ? task.originalDelegate : task.callback;\n this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);\n }\n }\n if (captureTasks) {\n const removeTasks = captureTasks.slice();\n for (let i = 0; i < removeTasks.length; i++) {\n const task = removeTasks[i];\n let delegate = task.originalDelegate ? task.originalDelegate : task.callback;\n this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);\n }\n }\n }\n }\n if (returnTarget) {\n return this;\n }\n };\n // for native toString patch\n attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);\n attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);\n if (nativeRemoveAllListeners) {\n attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);\n }\n if (nativeListeners) {\n attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);\n }\n return true;\n }\n let results = [];\n for (let i = 0; i < apis.length; i++) {\n results[i] = patchEventTargetMethods(apis[i], patchOptions);\n }\n return results;\n}\nfunction findEventTasks(target, eventName) {\n if (!eventName) {\n const foundTasks = [];\n for (let prop in target) {\n const match = EVENT_NAME_SYMBOL_REGX.exec(prop);\n let evtName = match && match[1];\n if (evtName && (!eventName || evtName === eventName)) {\n const tasks = target[prop];\n if (tasks) {\n for (let i = 0; i < tasks.length; i++) {\n foundTasks.push(tasks[i]);\n }\n }\n }\n }\n return foundTasks;\n }\n let symbolEventName = zoneSymbolEventNames$1[eventName];\n if (!symbolEventName) {\n prepareEventNames(eventName);\n symbolEventName = zoneSymbolEventNames$1[eventName];\n }\n const captureFalseTasks = target[symbolEventName[FALSE_STR]];\n const captureTrueTasks = target[symbolEventName[TRUE_STR]];\n if (!captureFalseTasks) {\n return captureTrueTasks ? captureTrueTasks.slice() : [];\n }\n else {\n return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :\n captureFalseTasks.slice();\n }\n}\nfunction patchEventPrototype(global, api) {\n const Event = global['Event'];\n if (Event && Event.prototype) {\n api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {\n self[IMMEDIATE_PROPAGATION_SYMBOL] = true;\n // we need to call the native stopImmediatePropagation\n // in case in some hybrid application, some part of\n // application will be controlled by zone, some are not\n delegate && delegate.apply(self, args);\n });\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 */\nfunction patchCallbacks(api, target, targetName, method, callbacks) {\n const symbol = Zone.__symbol__(method);\n if (target[symbol]) {\n return;\n }\n const nativeDelegate = target[symbol] = target[method];\n target[method] = function (name, opts, options) {\n if (opts && opts.prototype) {\n callbacks.forEach(function (callback) {\n const source = `${targetName}.${method}::` + callback;\n const prototype = opts.prototype;\n if (prototype.hasOwnProperty(callback)) {\n const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);\n if (descriptor && descriptor.value) {\n descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);\n api._redefineProperty(opts.prototype, callback, descriptor);\n }\n else if (prototype[callback]) {\n prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);\n }\n }\n else if (prototype[callback]) {\n prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);\n }\n });\n }\n return nativeDelegate.call(target, name, opts, options);\n };\n api.attachOriginToPatched(target[method], nativeDelegate);\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 */\nconst globalEventHandlersEventNames = [\n 'abort',\n 'animationcancel',\n 'animationend',\n 'animationiteration',\n 'auxclick',\n 'beforeinput',\n 'blur',\n 'cancel',\n 'canplay',\n 'canplaythrough',\n 'change',\n 'compositionstart',\n 'compositionupdate',\n 'compositionend',\n 'cuechange',\n 'click',\n 'close',\n 'contextmenu',\n 'curechange',\n 'dblclick',\n 'drag',\n 'dragend',\n 'dragenter',\n 'dragexit',\n 'dragleave',\n 'dragover',\n 'drop',\n 'durationchange',\n 'emptied',\n 'ended',\n 'error',\n 'focus',\n 'focusin',\n 'focusout',\n 'gotpointercapture',\n 'input',\n 'invalid',\n 'keydown',\n 'keypress',\n 'keyup',\n 'load',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'lostpointercapture',\n 'mousedown',\n 'mouseenter',\n 'mouseleave',\n 'mousemove',\n 'mouseout',\n 'mouseover',\n 'mouseup',\n 'mousewheel',\n 'orientationchange',\n 'pause',\n 'play',\n 'playing',\n 'pointercancel',\n 'pointerdown',\n 'pointerenter',\n 'pointerleave',\n 'pointerlockchange',\n 'mozpointerlockchange',\n 'webkitpointerlockerchange',\n 'pointerlockerror',\n 'mozpointerlockerror',\n 'webkitpointerlockerror',\n 'pointermove',\n 'pointout',\n 'pointerover',\n 'pointerup',\n 'progress',\n 'ratechange',\n 'reset',\n 'resize',\n 'scroll',\n 'seeked',\n 'seeking',\n 'select',\n 'selectionchange',\n 'selectstart',\n 'show',\n 'sort',\n 'stalled',\n 'submit',\n 'suspend',\n 'timeupdate',\n 'volumechange',\n 'touchcancel',\n 'touchmove',\n 'touchstart',\n 'touchend',\n 'transitioncancel',\n 'transitionend',\n 'waiting',\n 'wheel'\n];\nconst documentEventNames = [\n 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange',\n 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror',\n 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange',\n 'visibilitychange', 'resume'\n];\nconst windowEventNames = [\n 'absolutedeviceorientation',\n 'afterinput',\n 'afterprint',\n 'appinstalled',\n 'beforeinstallprompt',\n 'beforeprint',\n 'beforeunload',\n 'devicelight',\n 'devicemotion',\n 'deviceorientation',\n 'deviceorientationabsolute',\n 'deviceproximity',\n 'hashchange',\n 'languagechange',\n 'message',\n 'mozbeforepaint',\n 'offline',\n 'online',\n 'paint',\n 'pageshow',\n 'pagehide',\n 'popstate',\n 'rejectionhandled',\n 'storage',\n 'unhandledrejection',\n 'unload',\n 'userproximity',\n 'vrdisplayconnected',\n 'vrdisplaydisconnected',\n 'vrdisplaypresentchange'\n];\nconst htmlElementEventNames = [\n 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend',\n 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend',\n 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend'\n];\nconst mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend'];\nconst ieElementEventNames = [\n 'activate',\n 'afterupdate',\n 'ariarequest',\n 'beforeactivate',\n 'beforedeactivate',\n 'beforeeditfocus',\n 'beforeupdate',\n 'cellchange',\n 'controlselect',\n 'dataavailable',\n 'datasetchanged',\n 'datasetcomplete',\n 'errorupdate',\n 'filterchange',\n 'layoutcomplete',\n 'losecapture',\n 'move',\n 'moveend',\n 'movestart',\n 'propertychange',\n 'resizeend',\n 'resizestart',\n 'rowenter',\n 'rowexit',\n 'rowsdelete',\n 'rowsinserted',\n 'command',\n 'compassneedscalibration',\n 'deactivate',\n 'help',\n 'mscontentzoom',\n 'msmanipulationstatechanged',\n 'msgesturechange',\n 'msgesturedoubletap',\n 'msgestureend',\n 'msgesturehold',\n 'msgesturestart',\n 'msgesturetap',\n 'msgotpointercapture',\n 'msinertiastart',\n 'mslostpointercapture',\n 'mspointercancel',\n 'mspointerdown',\n 'mspointerenter',\n 'mspointerhover',\n 'mspointerleave',\n 'mspointermove',\n 'mspointerout',\n 'mspointerover',\n 'mspointerup',\n 'pointerout',\n 'mssitemodejumplistitemremoved',\n 'msthumbnailclick',\n 'stop',\n 'storagecommit'\n];\nconst webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];\nconst formEventNames = ['autocomplete', 'autocompleteerror'];\nconst detailEventNames = ['toggle'];\nconst frameEventNames = ['load'];\nconst frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror'];\nconst marqueeEventNames = ['bounce', 'finish', 'start'];\nconst XMLHttpRequestEventNames = [\n 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend',\n 'readystatechange'\n];\nconst IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close'];\nconst websocketEventNames = ['close', 'error', 'open', 'message'];\nconst workerEventNames = ['error', 'message'];\nconst eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames);\nfunction filterProperties(target, onProperties, ignoreProperties) {\n if (!ignoreProperties || ignoreProperties.length === 0) {\n return onProperties;\n }\n const tip = ignoreProperties.filter(ip => ip.target === target);\n if (!tip || tip.length === 0) {\n return onProperties;\n }\n const targetIgnoreProperties = tip[0].ignoreProperties;\n return onProperties.filter(op => targetIgnoreProperties.indexOf(op) === -1);\n}\nfunction patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {\n // check whether target is available, sometimes target will be undefined\n // because different browser or some 3rd party plugin.\n if (!target) {\n return;\n }\n const filteredProperties = filterProperties(target, onProperties, ignoreProperties);\n patchOnProperties(target, filteredProperties, prototype);\n}\nfunction propertyDescriptorPatch(api, _global) {\n if (isNode && !isMix) {\n return;\n }\n if (Zone[api.symbol('patchEvents')]) {\n // events are already been patched by legacy patch.\n return;\n }\n const supportsWebSocket = typeof WebSocket !== 'undefined';\n const ignoreProperties = _global['__Zone_ignore_on_properties'];\n // for browsers that we can patch the descriptor: Chrome & Firefox\n if (isBrowser) {\n const internalWindow = window;\n const ignoreErrorProperties = isIE() ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];\n // in IE/Edge, onProp not exist in window object, but in WindowPrototype\n // so we need to pass WindowPrototype to check onProp exist or not\n patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));\n patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);\n if (typeof internalWindow['SVGElement'] !== 'undefined') {\n patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);\n }\n patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);\n patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);\n patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);\n patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);\n patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);\n patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);\n patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);\n const HTMLMarqueeElement = internalWindow['HTMLMarqueeElement'];\n if (HTMLMarqueeElement) {\n patchFilteredProperties(HTMLMarqueeElement.prototype, marqueeEventNames, ignoreProperties);\n }\n const Worker = internalWindow['Worker'];\n if (Worker) {\n patchFilteredProperties(Worker.prototype, workerEventNames, ignoreProperties);\n }\n }\n const XMLHttpRequest = _global['XMLHttpRequest'];\n if (XMLHttpRequest) {\n // XMLHttpRequest is not available in ServiceWorker, so we need to check here\n patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);\n }\n const XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];\n if (XMLHttpRequestEventTarget) {\n patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);\n }\n if (typeof IDBIndex !== 'undefined') {\n patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);\n patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);\n patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);\n patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);\n patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);\n patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);\n }\n if (supportsWebSocket) {\n patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);\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 */\nZone.__load_patch('util', (global, Zone, api) => {\n api.patchOnProperties = patchOnProperties;\n api.patchMethod = patchMethod;\n api.bindArguments = bindArguments;\n api.patchMacroTask = patchMacroTask;\n // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to\n // define which events will not be patched by `Zone.js`.\n // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep\n // the name consistent with angular repo.\n // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for\n // backwards compatibility.\n const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');\n const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');\n if (global[SYMBOL_UNPATCHED_EVENTS]) {\n global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];\n }\n if (global[SYMBOL_BLACK_LISTED_EVENTS]) {\n Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =\n global[SYMBOL_BLACK_LISTED_EVENTS];\n }\n api.patchEventPrototype = patchEventPrototype;\n api.patchEventTarget = patchEventTarget;\n api.isIEOrEdge = isIEOrEdge;\n api.ObjectDefineProperty = ObjectDefineProperty;\n api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;\n api.ObjectCreate = ObjectCreate;\n api.ArraySlice = ArraySlice;\n api.patchClass = patchClass;\n api.wrapWithCurrentZone = wrapWithCurrentZone;\n api.filterProperties = filterProperties;\n api.attachOriginToPatched = attachOriginToPatched;\n api._redefineProperty = Object.defineProperty;\n api.patchCallbacks = patchCallbacks;\n api.getGlobalObjects = () => ({\n globalSources,\n zoneSymbolEventNames: zoneSymbolEventNames$1,\n eventNames,\n isBrowser,\n isMix,\n isNode,\n TRUE_STR,\n FALSE_STR,\n ZONE_SYMBOL_PREFIX,\n ADD_EVENT_LISTENER_STR,\n REMOVE_EVENT_LISTENER_STR\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 */\nconst taskSymbol = zoneSymbol('zoneTask');\nfunction patchTimer(window, setName, cancelName, nameSuffix) {\n let setNative = null;\n let clearNative = null;\n setName += nameSuffix;\n cancelName += nameSuffix;\n const tasksByHandleId = {};\n function scheduleTask(task) {\n const data = task.data;\n data.args[0] = function () {\n return task.invoke.apply(this, arguments);\n };\n data.handleId = setNative.apply(window, data.args);\n return task;\n }\n function clearTask(task) {\n return clearNative.call(window, task.data.handleId);\n }\n setNative =\n patchMethod(window, setName, (delegate) => function (self, args) {\n if (typeof args[0] === 'function') {\n const options = {\n isPeriodic: nameSuffix === 'Interval',\n delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :\n undefined,\n args: args\n };\n const callback = args[0];\n args[0] = function timer() {\n try {\n return callback.apply(this, arguments);\n }\n finally {\n // issue-934, task will be cancelled\n // even it is a periodic task such as\n // setInterval\n // https://github.com/angular/angular/issues/40387\n // Cleanup tasksByHandleId should be handled before scheduleTask\n // Since some zoneSpec may intercept and doesn't trigger\n // scheduleFn(scheduleTask) provided here.\n if (!(options.isPeriodic)) {\n if (typeof options.handleId === 'number') {\n // in non-nodejs env, we remove timerId\n // from local cache\n delete tasksByHandleId[options.handleId];\n }\n else if (options.handleId) {\n // Node returns complex objects as handleIds\n // we remove task reference from timer object\n options.handleId[taskSymbol] = null;\n }\n }\n }\n };\n const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);\n if (!task) {\n return task;\n }\n // Node.js must additionally support the ref and unref functions.\n const handle = task.data.handleId;\n if (typeof handle === 'number') {\n // for non nodejs env, we save handleId: task\n // mapping in local cache for clearTimeout\n tasksByHandleId[handle] = task;\n }\n else if (handle) {\n // for nodejs env, we save task\n // reference in timerId Object for clearTimeout\n handle[taskSymbol] = task;\n }\n // check whether handle is null, because some polyfill or browser\n // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame\n if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&\n typeof handle.unref === 'function') {\n task.ref = handle.ref.bind(handle);\n task.unref = handle.unref.bind(handle);\n }\n if (typeof handle === 'number' || handle) {\n return handle;\n }\n return task;\n }\n else {\n // cause an error by calling it directly.\n return delegate.apply(window, args);\n }\n });\n clearNative =\n patchMethod(window, cancelName, (delegate) => function (self, args) {\n const id = args[0];\n let task;\n if (typeof id === 'number') {\n // non nodejs env.\n task = tasksByHandleId[id];\n }\n else {\n // nodejs env.\n task = id && id[taskSymbol];\n // other environments.\n if (!task) {\n task = id;\n }\n }\n if (task && typeof task.type === 'string') {\n if (task.state !== 'notScheduled' &&\n (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {\n if (typeof id === 'number') {\n delete tasksByHandleId[id];\n }\n else if (id) {\n id[taskSymbol] = null;\n }\n // Do not cancel already canceled functions\n task.zone.cancelTask(task);\n }\n }\n else {\n // cause an error by calling it directly.\n delegate.apply(window, args);\n }\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 */\nfunction patchCustomElements(_global, api) {\n const { isBrowser, isMix } = api.getGlobalObjects();\n if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {\n return;\n }\n const callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];\n api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);\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 */\nfunction eventTargetPatch(_global, api) {\n if (Zone[api.symbol('patchEventTarget')]) {\n // EventTarget is already patched.\n return;\n }\n const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();\n // predefine all __zone_symbol__ + eventName + true/false string\n for (let i = 0; i < eventNames.length; i++) {\n const eventName = eventNames[i];\n const falseEventName = eventName + FALSE_STR;\n const trueEventName = eventName + TRUE_STR;\n const symbol = ZONE_SYMBOL_PREFIX + falseEventName;\n const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;\n zoneSymbolEventNames[eventName] = {};\n zoneSymbolEventNames[eventName][FALSE_STR] = symbol;\n zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;\n }\n const EVENT_TARGET = _global['EventTarget'];\n if (!EVENT_TARGET || !EVENT_TARGET.prototype) {\n return;\n }\n api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);\n return true;\n}\nfunction patchEvent(global, api) {\n api.patchEventPrototype(global, api);\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 */\nZone.__load_patch('legacy', (global) => {\n const legacyPatch = global[Zone.__symbol__('legacyPatch')];\n if (legacyPatch) {\n legacyPatch();\n }\n});\nZone.__load_patch('queueMicrotask', (global, Zone, api) => {\n api.patchMethod(global, 'queueMicrotask', delegate => {\n return function (self, args) {\n Zone.current.scheduleMicroTask('queueMicrotask', args[0]);\n };\n });\n});\nZone.__load_patch('timers', (global) => {\n const set = 'set';\n const clear = 'clear';\n patchTimer(global, set, clear, 'Timeout');\n patchTimer(global, set, clear, 'Interval');\n patchTimer(global, set, clear, 'Immediate');\n});\nZone.__load_patch('requestAnimationFrame', (global) => {\n patchTimer(global, 'request', 'cancel', 'AnimationFrame');\n patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');\n patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');\n});\nZone.__load_patch('blocking', (global, Zone) => {\n const blockingMethods = ['alert', 'prompt', 'confirm'];\n for (let i = 0; i < blockingMethods.length; i++) {\n const name = blockingMethods[i];\n patchMethod(global, name, (delegate, symbol, name) => {\n return function (s, args) {\n return Zone.current.run(delegate, global, args, name);\n };\n });\n }\n});\nZone.__load_patch('EventTarget', (global, Zone, api) => {\n patchEvent(global, api);\n eventTargetPatch(global, api);\n // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener\n const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];\n if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {\n api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]);\n }\n});\nZone.__load_patch('MutationObserver', (global, Zone, api) => {\n patchClass('MutationObserver');\n patchClass('WebKitMutationObserver');\n});\nZone.__load_patch('IntersectionObserver', (global, Zone, api) => {\n patchClass('IntersectionObserver');\n});\nZone.__load_patch('FileReader', (global, Zone, api) => {\n patchClass('FileReader');\n});\nZone.__load_patch('on_property', (global, Zone, api) => {\n propertyDescriptorPatch(api, global);\n});\nZone.__load_patch('customElements', (global, Zone, api) => {\n patchCustomElements(global, api);\n});\nZone.__load_patch('XHR', (global, Zone) => {\n // Treat XMLHttpRequest as a macrotask.\n patchXHR(global);\n const XHR_TASK = zoneSymbol('xhrTask');\n const XHR_SYNC = zoneSymbol('xhrSync');\n const XHR_LISTENER = zoneSymbol('xhrListener');\n const XHR_SCHEDULED = zoneSymbol('xhrScheduled');\n const XHR_URL = zoneSymbol('xhrURL');\n const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');\n function patchXHR(window) {\n const XMLHttpRequest = window['XMLHttpRequest'];\n if (!XMLHttpRequest) {\n // XMLHttpRequest is not available in service worker\n return;\n }\n const XMLHttpRequestPrototype = XMLHttpRequest.prototype;\n function findPendingTask(target) {\n return target[XHR_TASK];\n }\n let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];\n let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];\n if (!oriAddListener) {\n const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];\n if (XMLHttpRequestEventTarget) {\n const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;\n oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];\n oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];\n }\n }\n const READY_STATE_CHANGE = 'readystatechange';\n const SCHEDULED = 'scheduled';\n function scheduleTask(task) {\n const data = task.data;\n const target = data.target;\n target[XHR_SCHEDULED] = false;\n target[XHR_ERROR_BEFORE_SCHEDULED] = false;\n // remove existing event listener\n const listener = target[XHR_LISTENER];\n if (!oriAddListener) {\n oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];\n oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];\n }\n if (listener) {\n oriRemoveListener.call(target, READY_STATE_CHANGE, listener);\n }\n const newListener = target[XHR_LISTENER] = () => {\n if (target.readyState === target.DONE) {\n // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with\n // readyState=4 multiple times, so we need to check task state here\n if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {\n // check whether the xhr has registered onload listener\n // if that is the case, the task should invoke after all\n // onload listeners finish.\n // Also if the request failed without response (status = 0), the load event handler\n // will not be triggered, in that case, we should also invoke the placeholder callback\n // to close the XMLHttpRequest::send macroTask.\n // https://github.com/angular/angular/issues/38795\n const loadTasks = target[Zone.__symbol__('loadfalse')];\n if (target.status !== 0 && loadTasks && loadTasks.length > 0) {\n const oriInvoke = task.invoke;\n task.invoke = function () {\n // need to load the tasks again, because in other\n // load listener, they may remove themselves\n const loadTasks = target[Zone.__symbol__('loadfalse')];\n for (let i = 0; i < loadTasks.length; i++) {\n if (loadTasks[i] === task) {\n loadTasks.splice(i, 1);\n }\n }\n if (!data.aborted && task.state === SCHEDULED) {\n oriInvoke.call(task);\n }\n };\n loadTasks.push(task);\n }\n else {\n task.invoke();\n }\n }\n else if (!data.aborted && target[XHR_SCHEDULED] === false) {\n // error occurs when xhr.send()\n target[XHR_ERROR_BEFORE_SCHEDULED] = true;\n }\n }\n };\n oriAddListener.call(target, READY_STATE_CHANGE, newListener);\n const storedTask = target[XHR_TASK];\n if (!storedTask) {\n target[XHR_TASK] = task;\n }\n sendNative.apply(target, data.args);\n target[XHR_SCHEDULED] = true;\n return task;\n }\n function placeholderCallback() { }\n function clearTask(task) {\n const data = task.data;\n // Note - ideally, we would call data.target.removeEventListener here, but it's too late\n // to prevent it from firing. So instead, we store info for the event listener.\n data.aborted = true;\n return abortNative.apply(data.target, data.args);\n }\n const openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {\n self[XHR_SYNC] = args[2] == false;\n self[XHR_URL] = args[1];\n return openNative.apply(self, args);\n });\n const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';\n const fetchTaskAborting = zoneSymbol('fetchTaskAborting');\n const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');\n const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {\n if (Zone.current[fetchTaskScheduling] === true) {\n // a fetch is scheduling, so we are using xhr to polyfill fetch\n // and because we already schedule macroTask for fetch, we should\n // not schedule a macroTask for xhr again\n return sendNative.apply(self, args);\n }\n if (self[XHR_SYNC]) {\n // if the XHR is sync there is no task to schedule, just execute the code.\n return sendNative.apply(self, args);\n }\n else {\n const options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };\n const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);\n if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&\n task.state === SCHEDULED) {\n // xhr request throw error when send\n // we should invoke task instead of leaving a scheduled\n // pending macroTask\n task.invoke();\n }\n }\n });\n const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {\n const task = findPendingTask(self);\n if (task && typeof task.type == 'string') {\n // If the XHR has already completed, do nothing.\n // If the XHR has already been aborted, do nothing.\n // Fix #569, call abort multiple times before done will cause\n // macroTask task count be negative number\n if (task.cancelFn == null || (task.data && task.data.aborted)) {\n return;\n }\n task.zone.cancelTask(task);\n }\n else if (Zone.current[fetchTaskAborting] === true) {\n // the abort is called from fetch polyfill, we need to call native abort of XHR.\n return abortNative.apply(self, args);\n }\n // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no\n // task\n // to cancel. Do nothing.\n });\n }\n});\nZone.__load_patch('geolocation', (global) => {\n /// GEO_LOCATION\n if (global['navigator'] && global['navigator'].geolocation) {\n patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);\n }\n});\nZone.__load_patch('PromiseRejectionEvent', (global, Zone) => {\n // handle unhandled promise rejection\n function findPromiseRejectionHandler(evtName) {\n return function (e) {\n const eventTasks = findEventTasks(global, evtName);\n eventTasks.forEach(eventTask => {\n // windows has added unhandledrejection event listener\n // trigger the event listener\n const PromiseRejectionEvent = global['PromiseRejectionEvent'];\n if (PromiseRejectionEvent) {\n const evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection });\n eventTask.invoke(evt);\n }\n });\n };\n }\n if (global['PromiseRejectionEvent']) {\n Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =\n findPromiseRejectionHandler('unhandledrejection');\n Zone[zoneSymbol('rejectionHandledHandler')] =\n findPromiseRejectionHandler('rejectionhandled');\n }\n});\n"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/runtime.js b/src/main/resources/static/runtime.js
new file mode 100644
index 0000000..7a197f7
--- /dev/null
+++ b/src/main/resources/static/runtime.js
@@ -0,0 +1,224 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // install a JSONP callback for chunk loading
+/******/ function webpackJsonpCallback(data) {
+/******/ var chunkIds = data[0];
+/******/ var moreModules = data[1];
+/******/ var executeModules = data[2];
+/******/
+/******/ // add "moreModules" to the modules object,
+/******/ // then flag all "chunkIds" as loaded and fire callback
+/******/ var moduleId, chunkId, i = 0, resolves = [];
+/******/ for(;i < chunkIds.length; i++) {
+/******/ chunkId = chunkIds[i];
+/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
+/******/ resolves.push(installedChunks[chunkId][0]);
+/******/ }
+/******/ installedChunks[chunkId] = 0;
+/******/ }
+/******/ for(moduleId in moreModules) {
+/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
+/******/ modules[moduleId] = moreModules[moduleId];
+/******/ }
+/******/ }
+/******/ if(parentJsonpFunction) parentJsonpFunction(data);
+/******/
+/******/ while(resolves.length) {
+/******/ resolves.shift()();
+/******/ }
+/******/
+/******/ // add entry modules from loaded chunk to deferred list
+/******/ deferredModules.push.apply(deferredModules, executeModules || []);
+/******/
+/******/ // run deferred modules when all chunks ready
+/******/ return checkDeferredModules();
+/******/ };
+/******/ function checkDeferredModules() {
+/******/ var result;
+/******/ for(var i = 0; i < deferredModules.length; i++) {
+/******/ var deferredModule = deferredModules[i];
+/******/ var fulfilled = true;
+/******/ for(var j = 1; j < deferredModule.length; j++) {
+/******/ var depId = deferredModule[j];
+/******/ if(installedChunks[depId] !== 0) fulfilled = false;
+/******/ }
+/******/ if(fulfilled) {
+/******/ deferredModules.splice(i--, 1);
+/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
+/******/ }
+/******/ }
+/******/
+/******/ return result;
+/******/ }
+/******/
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // object to store loaded and loading chunks
+/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
+/******/ // Promise = chunk loading, 0 = chunk loaded
+/******/ var installedChunks = {
+/******/ "runtime": 0
+/******/ };
+/******/
+/******/ var deferredModules = [];
+/******/
+/******/ // script path function
+/******/ function jsonpScriptSrc(chunkId) {
+/******/ return __webpack_require__.p + "" + ({"assets-cypher-js":"assets-cypher-js","highlight-js-lib-core":"highlight-js-lib-core"}[chunkId]||chunkId) + ".js"
+/******/ }
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/ // This file contains only the entry chunk.
+/******/ // The chunk loading function for additional chunks
+/******/ __webpack_require__.e = function requireEnsure(chunkId) {
+/******/ var promises = [];
+/******/
+/******/
+/******/ // JSONP chunk loading for javascript
+/******/
+/******/ var installedChunkData = installedChunks[chunkId];
+/******/ if(installedChunkData !== 0) { // 0 means "already installed".
+/******/
+/******/ // a Promise means "currently loading".
+/******/ if(installedChunkData) {
+/******/ promises.push(installedChunkData[2]);
+/******/ } else {
+/******/ // setup Promise in chunk cache
+/******/ var promise = new Promise(function(resolve, reject) {
+/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject];
+/******/ });
+/******/ promises.push(installedChunkData[2] = promise);
+/******/
+/******/ // start chunk loading
+/******/ var script = document.createElement('script');
+/******/ var onScriptComplete;
+/******/
+/******/ script.charset = 'utf-8';
+/******/ script.timeout = 120;
+/******/ if (__webpack_require__.nc) {
+/******/ script.setAttribute("nonce", __webpack_require__.nc);
+/******/ }
+/******/ script.src = jsonpScriptSrc(chunkId);
+/******/
+/******/ // create error before stack unwound to get useful stacktrace later
+/******/ var error = new Error();
+/******/ onScriptComplete = function (event) {
+/******/ // avoid mem leaks in IE.
+/******/ script.onerror = script.onload = null;
+/******/ clearTimeout(timeout);
+/******/ var chunk = installedChunks[chunkId];
+/******/ if(chunk !== 0) {
+/******/ if(chunk) {
+/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
+/******/ var realSrc = event && event.target && event.target.src;
+/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
+/******/ error.name = 'ChunkLoadError';
+/******/ error.type = errorType;
+/******/ error.request = realSrc;
+/******/ chunk[1](error);
+/******/ }
+/******/ installedChunks[chunkId] = undefined;
+/******/ }
+/******/ };
+/******/ var timeout = setTimeout(function(){
+/******/ onScriptComplete({ type: 'timeout', target: script });
+/******/ }, 120000);
+/******/ script.onerror = script.onload = onScriptComplete;
+/******/ document.head.appendChild(script);
+/******/ }
+/******/ }
+/******/ return Promise.all(promises);
+/******/ };
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // on error function for async loading
+/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
+/******/
+/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
+/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
+/******/ jsonpArray.push = webpackJsonpCallback;
+/******/ jsonpArray = jsonpArray.slice();
+/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
+/******/ var parentJsonpFunction = oldJsonpFunction;
+/******/
+/******/
+/******/ // run deferred modules from other chunks
+/******/ checkDeferredModules();
+/******/ })
+/************************************************************************/
+/******/ ([]);
+//# sourceMappingURL=runtime.js.map
\ No newline at end of file
diff --git a/src/main/resources/static/runtime.js.map b/src/main/resources/static/runtime.js.map
new file mode 100644
index 0000000..9b3b6de
--- /dev/null
+++ b/src/main/resources/static/runtime.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack/bootstrap"],"names":[],"mappings":";QAAA;QACA;QACA;QACA;QACA;;QAEA;QACA;QACA;QACA,QAAQ,oBAAoB;QAC5B;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA,iBAAiB,4BAA4B;QAC7C;QACA;QACA,kBAAkB,2BAA2B;QAC7C;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;;QAEA;;QAEA;QACA;QACA,yCAAyC,sFAAsF;QAC/H;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;QAEA;QACA;QACA;QACA;;;QAGA;;QAEA;QACA,iCAAiC;;QAEjC;QACA;QACA;QACA,KAAK;QACL;QACA;QACA;QACA,MAAM;QACN;;QAEA;QACA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,wBAAwB,kCAAkC;QAC1D,MAAM;QACN;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA,0CAA0C,oBAAoB,WAAW;;QAEzE;QACA;QACA;QACA;QACA,gBAAgB,uBAAuB;QACvC;;;QAGA;QACA","file":"runtime.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"assets-cypher-js\":\"assets-cypher-js\",\"highlight-js-lib-core\":\"highlight-js-lib-core\"}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/styles.css b/src/main/resources/static/styles.css
new file mode 100644
index 0000000..b2344a0
--- /dev/null
+++ b/src/main/resources/static/styles.css
@@ -0,0 +1,673 @@
+/* You can add global styles to this file, and also import other style files */
+.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-badge-small .mat-badge-content{font-size:9px}
+.mat-badge-large .mat-badge-content{font-size:24px}
+.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0 0 16px}
+.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0 0 16px}
+.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0 0 16px}
+.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0 0 16px}
+.mat-h5,.mat-typography h5{font:400 calc(14px * 0.83)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}
+.mat-h6,.mat-typography h6{font:400 calc(14px * 0.67)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}
+.mat-body-strong,.mat-body-2{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}
+.mat-small,.mat-caption{font:400 12px/20px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-0.05em;margin:0 0 56px}
+.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-0.02em;margin:0 0 64px}
+.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-0.005em;margin:0 0 64px}
+.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0 0 64px}
+.mat-bottom-sheet-container{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-button,.mat-raised-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button,.mat-fab,.mat-mini-fab{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}
+.mat-button-toggle{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-card{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-card-title{font-size:24px;font-weight:500}
+.mat-card-header .mat-card-title{font-size:20px}
+.mat-card-subtitle,.mat-card-content{font-size:14px}
+.mat-checkbox{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-checkbox-layout .mat-checkbox-label{line-height:24px}
+.mat-chip{font-size:14px;font-weight:500}
+.mat-chip .mat-chip-trailing-icon.mat-icon,.mat-chip .mat-chip-remove.mat-icon{font-size:18px}
+.mat-table{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-header-cell{font-size:12px;font-weight:500}
+.mat-cell,.mat-footer-cell{font-size:14px}
+.mat-calendar{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-calendar-body{font-size:13px}
+.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}
+.mat-calendar-table-header th{font-size:11px;font-weight:400}
+.mat-dialog-title{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-expansion-panel-header{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:15px;font-weight:400}
+.mat-expansion-panel-content{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-form-field-wrapper{padding-bottom:1.34375em}
+.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}
+.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}
+.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}
+.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}
+.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(0.75);width:133.3333333333%}
+.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(0.75);width:133.3333433333%}
+.mat-form-field-label-wrapper{top:-0.84375em;padding-top:.84375em}
+.mat-form-field-label{top:1.34375em}
+.mat-form-field-underline{bottom:1.34375em}
+.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.6666666667em;top:calc(100% - 1.7916666667em)}
+.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}
+.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}
+.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.001px);-ms-transform:translateY(-1.28125em) scale(0.75);width:133.3333333333%}
+.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00101px);-ms-transform:translateY(-1.28124em) scale(0.75);width:133.3333433333%}
+.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00102px);-ms-transform:translateY(-1.28123em) scale(0.75);width:133.3333533333%}
+.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}
+.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}
+.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.5416666667em;top:calc(100% - 1.6666666667em)}
+@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(0.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(0.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(0.75)}}
+.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}
+.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-0.5em}
+.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-0.59375em) scale(0.75);width:133.3333333333%}
+.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-0.59374em) scale(0.75);width:133.3333433333%}
+.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}
+.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-0.25em}
+.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(0.75);width:133.3333333333%}
+.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(0.75);width:133.3333433333%}
+.mat-grid-tile-header,.mat-grid-tile-footer{font-size:14px}
+.mat-grid-tile-header .mat-line,.mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}
+.mat-grid-tile-header .mat-line:nth-child(n+2),.mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}
+input.mat-input-element{margin-top:-0.0625em}
+.mat-menu-item{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:400}
+.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px}
+.mat-radio-button{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-select{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-select-trigger{height:1.125em}
+.mat-slide-toggle-content{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-slider-thumb-label-text{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}
+.mat-stepper-vertical,.mat-stepper-horizontal{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-step-label{font-size:14px;font-weight:400}
+.mat-step-sub-label-error{font-weight:normal}
+.mat-step-label-error{font-size:14px}
+.mat-step-label-selected{font-size:14px;font-weight:500}
+.mat-tab-group{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-tab-label,.mat-tab-link{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}
+.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal;margin:0}
+.mat-tooltip{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}
+.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}
+.mat-list-item{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-list-option{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-list-base .mat-list-item{font-size:16px}
+.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}
+.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}
+.mat-list-base .mat-list-option{font-size:16px}
+.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}
+.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}
+.mat-list-base .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}
+.mat-list-base[dense] .mat-list-item{font-size:12px}
+.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}
+.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}
+.mat-list-base[dense] .mat-list-option{font-size:12px}
+.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}
+.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}
+.mat-list-base[dense] .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}
+.mat-option{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:16px}
+.mat-optgroup-label{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif;letter-spacing:normal}
+.mat-simple-snackbar{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px}
+.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}
+.mat-tree{font-family:Roboto, "Helvetica Neue", sans-serif}
+.mat-tree-node,.mat-nested-tree-node{font-weight:400;font-size:14px}
+.mat-ripple{overflow:hidden;position:relative}
+.mat-ripple:not(:empty){transform:translateZ(0)}
+.mat-ripple.mat-ripple-unbounded{overflow:visible}
+.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale(0)}
+.cdk-high-contrast-active .mat-ripple-element{display:none}
+.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}
+.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}
+.cdk-overlay-container{position:fixed;z-index:1000}
+.cdk-overlay-container:empty{display:none}
+.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}
+.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}
+.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);opacity:0}
+.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}
+.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}
+.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}
+.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}
+.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}
+.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}
+@keyframes cdk-text-field-autofill-start{/*!*/}
+@keyframes cdk-text-field-autofill-end{/*!*/}
+.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}
+.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}
+textarea.cdk-textarea-autosize{resize:none}
+textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}
+textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}
+.mat-focus-indicator{position:relative}
+.mat-mdc-focus-indicator{position:relative}
+.mat-ripple-element{background-color:rgba(0,0,0,.1)}
+.mat-option{color:rgba(0,0,0,.87)}
+.mat-option:hover:not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled){background:rgba(0,0,0,.04)}
+.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}
+.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}
+.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}
+.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#3f51b5}
+.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ff4081}
+.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}
+.mat-optgroup-label{color:rgba(0,0,0,.54)}
+.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}
+.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}
+.mat-pseudo-checkbox::after{color:#fafafa}
+.mat-pseudo-checkbox-disabled{color:#b0b0b0}
+.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#3f51b5}
+.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:#ff4081}
+.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}
+.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}
+.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}
+.mat-elevation-z0{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z1{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z2{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z3{box-shadow:0px 3px 3px -2px rgba(0, 0, 0, 0.2),0px 3px 4px 0px rgba(0, 0, 0, 0.14),0px 1px 8px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z4{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z5{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 5px 8px 0px rgba(0, 0, 0, 0.14),0px 1px 14px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z6{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z7{box-shadow:0px 4px 5px -2px rgba(0, 0, 0, 0.2),0px 7px 10px 1px rgba(0, 0, 0, 0.14),0px 2px 16px 1px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z8{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z9{box-shadow:0px 5px 6px -3px rgba(0, 0, 0, 0.2),0px 9px 12px 1px rgba(0, 0, 0, 0.14),0px 3px 16px 2px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z10{box-shadow:0px 6px 6px -3px rgba(0, 0, 0, 0.2),0px 10px 14px 1px rgba(0, 0, 0, 0.14),0px 4px 18px 3px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z11{box-shadow:0px 6px 7px -4px rgba(0, 0, 0, 0.2),0px 11px 15px 1px rgba(0, 0, 0, 0.14),0px 4px 20px 3px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z12{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z13{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 13px 19px 2px rgba(0, 0, 0, 0.14),0px 5px 24px 4px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z14{box-shadow:0px 7px 9px -4px rgba(0, 0, 0, 0.2),0px 14px 21px 2px rgba(0, 0, 0, 0.14),0px 5px 26px 4px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z15{box-shadow:0px 8px 9px -5px rgba(0, 0, 0, 0.2),0px 15px 22px 2px rgba(0, 0, 0, 0.14),0px 6px 28px 5px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z16{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z17{box-shadow:0px 8px 11px -5px rgba(0, 0, 0, 0.2),0px 17px 26px 2px rgba(0, 0, 0, 0.14),0px 6px 32px 5px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z18{box-shadow:0px 9px 11px -5px rgba(0, 0, 0, 0.2),0px 18px 28px 2px rgba(0, 0, 0, 0.14),0px 7px 34px 6px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z19{box-shadow:0px 9px 12px -6px rgba(0, 0, 0, 0.2),0px 19px 29px 2px rgba(0, 0, 0, 0.14),0px 7px 36px 6px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z20{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 20px 31px 3px rgba(0, 0, 0, 0.14),0px 8px 38px 7px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z21{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 21px 33px 3px rgba(0, 0, 0, 0.14),0px 8px 40px 7px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z22{box-shadow:0px 10px 14px -6px rgba(0, 0, 0, 0.2),0px 22px 35px 3px rgba(0, 0, 0, 0.14),0px 8px 42px 7px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z23{box-shadow:0px 11px 14px -7px rgba(0, 0, 0, 0.2),0px 23px 36px 3px rgba(0, 0, 0, 0.14),0px 9px 44px 8px rgba(0, 0, 0, 0.12)}
+.mat-elevation-z24{box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0, 0, 0, 0.12)}
+.mat-theme-loaded-marker{display:none}
+.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}
+.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}
+.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}
+.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}
+.mat-badge-content{color:#fff;background:#3f51b5}
+.cdk-high-contrast-active .mat-badge-content{outline:solid 1px;border-radius:0}
+.mat-badge-accent .mat-badge-content{background:#ff4081;color:#fff}
+.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}
+.mat-badge{position:relative}
+.mat-badge-hidden .mat-badge-content{display:none}
+.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}
+.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform 200ms ease-in-out;transform:scale(0.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}
+.ng-animate-disabled .mat-badge-content,.mat-badge-content._mat-animation-noopable{transition:none}
+.mat-badge-content.mat-badge-active{transform:none}
+.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}
+.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}
+.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}
+.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}
+[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}
+.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}
+[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}
+.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}
+[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}
+.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}
+[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}
+.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}
+.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}
+.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}
+.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}
+[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}
+.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}
+[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}
+.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}
+[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}
+.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}
+[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}
+.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}
+.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}
+.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}
+.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}
+[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}
+.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}
+[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}
+.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}
+[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}
+.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}
+[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}
+.mat-bottom-sheet-container{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12);background:#fff;color:rgba(0,0,0,.87)}
+.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}
+.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#3f51b5}
+.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ff4081}
+.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}
+.mat-button.mat-primary.mat-button-disabled,.mat-button.mat-accent.mat-button-disabled,.mat-button.mat-warn.mat-button-disabled,.mat-button.mat-button-disabled.mat-button-disabled,.mat-icon-button.mat-primary.mat-button-disabled,.mat-icon-button.mat-accent.mat-button-disabled,.mat-icon-button.mat-warn.mat-button-disabled,.mat-icon-button.mat-button-disabled.mat-button-disabled,.mat-stroked-button.mat-primary.mat-button-disabled,.mat-stroked-button.mat-accent.mat-button-disabled,.mat-stroked-button.mat-warn.mat-button-disabled,.mat-stroked-button.mat-button-disabled.mat-button-disabled{color:rgba(0,0,0,.26)}
+.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#3f51b5}
+.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ff4081}
+.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}
+.mat-button.mat-button-disabled .mat-button-focus-overlay,.mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}
+.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}
+.mat-button-focus-overlay{background:#000}
+.mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}
+.mat-flat-button,.mat-raised-button,.mat-fab,.mat-mini-fab{color:rgba(0,0,0,.87);background-color:#fff}
+.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{color:#fff}
+.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{color:#fff}
+.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{color:#fff}
+.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled{color:rgba(0,0,0,.26)}
+.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{background-color:#3f51b5}
+.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{background-color:#ff4081}
+.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{background-color:#f44336}
+.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled{background-color:rgba(0,0,0,.12)}
+.mat-flat-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-flat-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-flat-button.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-stroked-button:not([class*=mat-elevation-z]),.mat-flat-button:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}
+.mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0, 0, 0, 0.12)}
+.mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}
+.mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0, 0, 0, 0.12)}
+.mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-button-toggle-standalone,.mat-button-toggle-group{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}
+.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{box-shadow:none}
+.mat-button-toggle{color:rgba(0,0,0,.38)}
+.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}
+.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}
+.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}
+.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,.12)}
+[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}
+.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,.12)}
+.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}
+.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}
+.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}
+.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}
+.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}
+.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border:solid 1px rgba(0,0,0,.12)}
+.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}
+.mat-card{background:#fff;color:rgba(0,0,0,.87)}
+.mat-card:not([class*=mat-elevation-z]){box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12)}
+.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-card-subtitle{color:rgba(0,0,0,.54)}
+.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}
+.mat-checkbox-checkmark{fill:#fafafa}
+.mat-checkbox-checkmark-path{stroke:#fafafa !important}
+.mat-checkbox-mixedmark{background-color:#fafafa}
+.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background,.mat-checkbox-checked.mat-primary .mat-checkbox-background{background-color:#3f51b5}
+.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#ff4081}
+.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background,.mat-checkbox-checked.mat-warn .mat-checkbox-background{background-color:#f44336}
+.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}
+.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}
+.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}
+.mat-checkbox .mat-ripple-element{background-color:#000}
+.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#3f51b5}
+.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ff4081}
+.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}
+.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}
+.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}
+.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0px 3px 3px -2px rgba(0, 0, 0, 0.2),0px 3px 4px 0px rgba(0, 0, 0, 0.14),0px 1px 8px 0px rgba(0, 0, 0, 0.12)}
+.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}
+.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}
+.mat-chip.mat-standard-chip::after{background:#000}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#3f51b5;color:#fff}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ff4081;color:#fff}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}
+.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}
+.mat-table{background:#fff}
+.mat-table thead,.mat-table tbody,.mat-table tfoot,mat-header-row,mat-row,mat-footer-row,[mat-header-row],[mat-row],[mat-footer-row],.mat-table-sticky{background:inherit}
+mat-row,mat-header-row,mat-footer-row,th.mat-header-cell,td.mat-cell,td.mat-footer-cell{border-bottom-color:rgba(0,0,0,.12)}
+.mat-header-cell{color:rgba(0,0,0,.54)}
+.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}
+.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}
+.mat-datepicker-toggle,.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button{color:rgba(0,0,0,.54)}
+.mat-calendar-table-header{color:rgba(0,0,0,.38)}
+.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}
+.mat-calendar-body-label{color:rgba(0,0,0,.54)}
+.mat-calendar-body-cell-content,.mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}
+.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){color:rgba(0,0,0,.38)}
+.mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}
+.mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}
+.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}
+.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}
+.mat-calendar-body-in-range::before{background:rgba(63,81,181,.2)}
+.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}
+.mat-calendar-body-comparison-bridge-start::before,[dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(63, 81, 181, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-calendar-body-comparison-bridge-end::before,[dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(63, 81, 181, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}
+.mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}
+.mat-calendar-body-selected{background-color:#3f51b5;color:#fff}
+.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(63,81,181,.4)}
+.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}
+.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(63,81,181,.3)}
+.mat-datepicker-content{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12);background-color:#fff;color:rgba(0,0,0,.87)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-in-range::before{background:rgba(255,64,129,.2)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start::before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(255, 64, 129, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end::before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(255, 64, 129, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}
+.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}
+.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ff4081;color:#fff}
+.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,64,129,.4)}
+.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}
+.mat-datepicker-content.mat-accent .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(255,64,129,.3)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-in-range::before{background:rgba(244,67,54,.2)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start::before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(244, 67, 54, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end::before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(244, 67, 54, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}
+.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}
+.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}
+.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}
+.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}
+.mat-datepicker-content.mat-warn .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(244,67,54,.3)}
+.mat-datepicker-content-touch{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}
+.mat-datepicker-toggle-active{color:#3f51b5}
+.mat-datepicker-toggle-active.mat-accent{color:#ff4081}
+.mat-datepicker-toggle-active.mat-warn{color:#f44336}
+.mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}
+.mat-dialog-container{box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0, 0, 0, 0.12);background:#fff;color:rgba(0,0,0,.87)}
+.mat-divider{border-top-color:rgba(0,0,0,.12)}
+.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}
+.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}
+.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}
+.mat-action-row{border-top-color:rgba(0,0,0,.12)}
+.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}
+@media(hover: none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}
+.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}
+.mat-expansion-panel-header-description,.mat-expansion-indicator::after{color:rgba(0,0,0,.54)}
+.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}
+.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}
+.mat-expansion-panel-header{height:48px}
+.mat-expansion-panel-header.mat-expanded{height:64px}
+.mat-form-field-label{color:rgba(0,0,0,.6)}
+.mat-hint{color:rgba(0,0,0,.6)}
+.mat-form-field.mat-focused .mat-form-field-label{color:#3f51b5}
+.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ff4081}
+.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}
+.mat-focused .mat-form-field-required-marker{color:#ff4081}
+.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}
+.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#3f51b5}
+.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ff4081}
+.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}
+.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#3f51b5}
+.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#ff4081}
+.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#f44336}
+.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#f44336}
+.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}
+.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}
+.mat-error{color:#f44336}
+.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,.54)}
+.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}
+.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}
+.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}
+.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}
+.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}
+.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}
+.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}
+.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,.42)}
+.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}
+.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}
+.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}
+.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}
+.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#3f51b5}
+.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ff4081}
+.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#f44336}
+.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}
+.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}
+.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}
+.mat-icon.mat-primary{color:#3f51b5}
+.mat-icon.mat-accent{color:#ff4081}
+.mat-icon.mat-warn{color:#f44336}
+.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,.54)}
+.mat-input-element:disabled,.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after{color:rgba(0,0,0,.38)}
+.mat-input-element{caret-color:#3f51b5}
+.mat-input-element::placeholder{color:rgba(0,0,0,.42)}
+.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}
+.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}
+.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}
+.mat-form-field.mat-accent .mat-input-element{caret-color:#ff4081}
+.mat-form-field.mat-warn .mat-input-element,.mat-form-field-invalid .mat-input-element{caret-color:#f44336}
+.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#f44336}
+.mat-list-base .mat-list-item{color:rgba(0,0,0,.87)}
+.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}
+.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}
+.mat-list-item-disabled{background-color:#eee}
+.mat-list-option:hover,.mat-list-option:focus,.mat-nav-list .mat-list-item:hover,.mat-nav-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-action-list .mat-list-item:focus{background:rgba(0,0,0,.04)}
+.mat-list-single-selected-option,.mat-list-single-selected-option:hover,.mat-list-single-selected-option:focus{background:rgba(0,0,0,.12)}
+.mat-menu-panel{background:#fff}
+.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}
+.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}
+.mat-menu-item[disabled],.mat-menu-item[disabled]::after,.mat-menu-item[disabled] .mat-icon-no-color{color:rgba(0,0,0,.38)}
+.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}
+.mat-menu-item:hover:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item-highlighted:not([disabled]){background:rgba(0,0,0,.04)}
+.mat-paginator{background:#fff}
+.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}
+.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}
+.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}
+.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}
+.mat-paginator-container{min-height:56px}
+.mat-progress-bar-background{fill:#c5cae9}
+.mat-progress-bar-buffer{background-color:#c5cae9}
+.mat-progress-bar-fill::after{background-color:#3f51b5}
+.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ff80ab}
+.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#ff80ab}
+.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ff4081}
+.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}
+.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}
+.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}
+.mat-progress-spinner circle,.mat-spinner circle{stroke:#3f51b5}
+.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ff4081}
+.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}
+.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}
+.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#3f51b5}
+.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#3f51b5}
+.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff4081}
+.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ff4081}
+.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}
+.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}
+.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}
+.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle{background-color:rgba(0,0,0,.38)}
+.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}
+.mat-radio-button .mat-ripple-element{background-color:#000}
+.mat-select-value{color:rgba(0,0,0,.87)}
+.mat-select-placeholder{color:rgba(0,0,0,.42)}
+.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}
+.mat-select-arrow{color:rgba(0,0,0,.54)}
+.mat-select-panel{background:#fff}
+.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}
+.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}
+.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#3f51b5}
+.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ff4081}
+.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}
+.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}
+.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}
+.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}
+.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}
+.mat-drawer.mat-drawer-push{background-color:#fff}
+.mat-drawer:not(.mat-drawer-side){box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12)}
+.mat-drawer-side{border-right:solid 1px rgba(0,0,0,.12)}
+.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,.12);border-right:none}
+[dir=rtl] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,.12);border-right:none}
+[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}
+.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}
+.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ff4081}
+.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,64,129,.54)}
+.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ff4081}
+.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#3f51b5}
+.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(63,81,181,.54)}
+.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#3f51b5}
+.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}
+.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}
+.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}
+.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}
+.mat-slide-toggle-thumb{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12);background-color:#fafafa}
+.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}
+.mat-slider-track-background{background-color:rgba(0,0,0,.26)}
+.mat-primary .mat-slider-track-fill,.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label{background-color:#3f51b5}
+.mat-primary .mat-slider-thumb-label-text{color:#fff}
+.mat-primary .mat-slider-focus-ring{background-color:rgba(63,81,181,.2)}
+.mat-accent .mat-slider-track-fill,.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label{background-color:#ff4081}
+.mat-accent .mat-slider-thumb-label-text{color:#fff}
+.mat-accent .mat-slider-focus-ring{background-color:rgba(255,64,129,.2)}
+.mat-warn .mat-slider-track-fill,.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label{background-color:#f44336}
+.mat-warn .mat-slider-thumb-label-text{color:#fff}
+.mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}
+.mat-slider:hover .mat-slider-track-background,.cdk-focused .mat-slider-track-background{background-color:rgba(0,0,0,.38)}
+.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled .mat-slider-thumb{background-color:rgba(0,0,0,.26)}
+.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}
+.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}
+.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}
+.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}
+.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}
+.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb{border-color:rgba(0,0,0,.38)}
+.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}
+.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}
+.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent);background-image:-moz-repeating-linear-gradient(0.0001deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent)}
+.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent)}
+.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}
+@media(hover: none){.mat-step-header:hover{background:none}}
+.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}
+.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}
+.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#3f51b5;color:#fff}
+.mat-step-header.mat-accent .mat-step-icon{color:#fff}
+.mat-step-header.mat-accent .mat-step-icon-selected,.mat-step-header.mat-accent .mat-step-icon-state-done,.mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ff4081;color:#fff}
+.mat-step-header.mat-warn .mat-step-icon{color:#fff}
+.mat-step-header.mat-warn .mat-step-icon-selected,.mat-step-header.mat-warn .mat-step-icon-state-done,.mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}
+.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}
+.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}
+.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}
+.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}
+.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}
+.mat-horizontal-stepper-header::before,.mat-horizontal-stepper-header::after,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}
+.mat-horizontal-stepper-header{height:72px}
+.mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.mat-vertical-stepper-header{padding:24px 24px}
+.mat-stepper-vertical-line::before{top:-16px;bottom:-16px}
+.mat-stepper-label-position-bottom .mat-horizontal-stepper-header::after,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header::before{top:36px}
+.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}
+.mat-sort-header-arrow{color:#757575}
+.mat-tab-nav-bar,.mat-tab-header{border-bottom:1px solid rgba(0,0,0,.12)}
+.mat-tab-group-inverted-header .mat-tab-nav-bar,.mat-tab-group-inverted-header .mat-tab-header{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}
+.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}
+.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}
+.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}
+.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}
+.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}
+.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}
+.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#3f51b5}
+.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar{background-color:#fff}
+.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}
+.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ff4081}
+.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar{background-color:#fff}
+.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}
+.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}
+.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar{background-color:#fff}
+.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}
+.mat-tab-group.mat-background-primary>.mat-tab-header,.mat-tab-group.mat-background-primary>.mat-tab-link-container,.mat-tab-group.mat-background-primary>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination{background-color:#3f51b5}
+.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link{color:#fff}
+.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-primary>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}
+.mat-tab-group.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}
+.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}
+.mat-tab-group.mat-background-accent>.mat-tab-header,.mat-tab-group.mat-background-accent>.mat-tab-link-container,.mat-tab-group.mat-background-accent>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination{background-color:#ff4081}
+.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link{color:#fff}
+.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-accent>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}
+.mat-tab-group.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}
+.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}
+.mat-tab-group.mat-background-warn>.mat-tab-header,.mat-tab-group.mat-background-warn>.mat-tab-link-container,.mat-tab-group.mat-background-warn>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination{background-color:#f44336}
+.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link{color:#fff}
+.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-warn>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}
+.mat-tab-group.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}
+.mat-tab-group.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}
+.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}
+.mat-toolbar.mat-primary{background:#3f51b5;color:#fff}
+.mat-toolbar.mat-accent{background:#ff4081;color:#fff}
+.mat-toolbar.mat-warn{background:#f44336;color:#fff}
+.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}
+.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}
+.mat-toolbar .mat-input-element{caret-color:currentColor}
+.mat-toolbar-multiple-rows{min-height:64px}
+.mat-toolbar-row,.mat-toolbar-single-row{height:64px}
+@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}
+.mat-tooltip{background:rgba(97,97,97,.9)}
+.mat-tree{background:#fff}
+.mat-tree-node,.mat-nested-tree-node{color:rgba(0,0,0,.87)}
+.mat-tree-node{min-height:48px}
+.mat-snack-bar-container{color:rgba(255,255,255,.7);background:#323232;box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}
+.mat-simple-snackbar-action{color:#ff4081}
+/*
+
+Dracula Theme v1.2.0
+
+https://github.com/zenorocha/dracula-theme
+
+Copyright 2015, All rights reserved
+
+Code licensed under the MIT license
+http://zenorocha.mit-license.org
+
+@author Éverton Ribeiro
+@author Zeno Rocha
+
+*/
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282a36;
+}
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-section,
+.hljs-link {
+ color: #8be9fd;
+}
+.hljs-function .hljs-keyword {
+ color: #ff79c6;
+}
+.hljs,
+.hljs-subst {
+ color: #f8f8f2;
+}
+.hljs-string,
+.hljs-title,
+.hljs-name,
+.hljs-type,
+.hljs-attribute,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-variable,
+.hljs-template-tag,
+.hljs-template-variable {
+ color: #f1fa8c;
+}
+.hljs-comment,
+.hljs-quote,
+.hljs-deletion,
+.hljs-meta {
+ color: #6272a4;
+}
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-type,
+.hljs-name,
+.hljs-strong {
+ font-weight: bold;
+}
+.hljs-emphasis {
+ font-style: italic;
+}
+html, body {
+ height: 100%;
+}
+body {
+ margin: 0;
+}
+
+
+/*# sourceMappingURL=styles.css.map*/
\ No newline at end of file
diff --git a/src/main/resources/static/styles.css.map b/src/main/resources/static/styles.css.map
new file mode 100644
index 0000000..c9d84d3
--- /dev/null
+++ b/src/main/resources/static/styles.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["./src/styles.css","./node_modules/@angular/material/prebuilt-themes/indigo-pink.css","./src/assets/dracula.css"],"names":[],"mappings":"AAAA,8EAA8E;ACA9E,mBAAmB,eAAe,CAAC,cAAc,CAAC,gDAAgD;AAAC,oCAAoC,aAAa;AAAC,oCAAoC,cAAc;AAAC,yCAAyC,uDAAuD,CAAC,qBAAqB,CAAC,eAAe;AAAC,sCAAsC,uDAAuD,CAAC,qBAAqB,CAAC,eAAe;AAAC,6CAA6C,uDAAuD,CAAC,qBAAqB,CAAC,eAAe;AAAC,6CAA6C,uDAAuD,CAAC,qBAAqB,CAAC,eAAe;AAAC,2BAA2B,oEAAoE,CAAC,eAAe;AAAC,2BAA2B,oEAAoE,CAAC,eAAe;AAAC,6BAA6B,uDAAuD,CAAC,qBAAqB;AAAC,sCAAsC,uDAAuD,CAAC,qBAAqB;AAAC,4CAA4C,eAAe;AAAC,wBAAwB,uDAAuD,CAAC,qBAAqB;AAAC,8CAA8C,yDAAyD,CAAC,sBAAsB,CAAC,eAAe;AAAC,8CAA8C,uDAAuD,CAAC,sBAAsB,CAAC,eAAe;AAAC,8CAA8C,uDAAuD,CAAC,uBAAuB,CAAC,eAAe;AAAC,8CAA8C,uDAAuD,CAAC,qBAAqB,CAAC,eAAe;AAAC,4BAA4B,uDAAuD,CAAC,qBAAqB;AAAC,4GAA4G,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,mBAAmB,gDAAgD;AAAC,UAAU,gDAAgD;AAAC,gBAAgB,cAAc,CAAC,eAAe;AAAC,iCAAiC,cAAc;AAAC,qCAAqC,cAAc;AAAC,cAAc,gDAAgD;AAAC,yCAAyC,gBAAgB;AAAC,UAAU,cAAc,CAAC,eAAe;AAAC,+EAA+E,cAAc;AAAC,WAAW,gDAAgD;AAAC,iBAAiB,cAAc,CAAC,eAAe;AAAC,2BAA2B,cAAc;AAAC,cAAc,gDAAgD;AAAC,mBAAmB,cAAc;AAAC,qDAAqD,cAAc,CAAC,eAAe;AAAC,8BAA8B,cAAc,CAAC,eAAe;AAAC,kBAAkB,uDAAuD,CAAC,qBAAqB;AAAC,4BAA4B,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,6BAA6B,uDAAuD,CAAC,qBAAqB;AAAC,gBAAgB,iBAAiB,CAAC,eAAe,CAAC,iBAAiB,CAAC,gDAAgD,CAAC,qBAAqB;AAAC,wBAAwB,wBAAwB;AAAC,kEAAkE,cAAc,CAAC,iBAAiB;AAAC,gFAAgF,YAAY,CAAC,WAAW;AAAC,oGAAoG,cAAc,CAAC,iBAAiB;AAAC,sBAAsB,cAAc,CAAC,qCAAqC;AAAC,kLAAkL,4CAA4C,CAAC,qBAAqB;AAAC,yHAAyH,4CAA4C,CAAC,qBAAqB;AAAC,8BAA8B,cAAc,CAAC,oBAAoB;AAAC,sBAAsB,aAAa;AAAC,0BAA0B,gBAAgB;AAAC,kCAAkC,aAAa,CAAC,wBAAwB,CAAC,+BAA+B;AAAC,0DAA0D,qBAAqB;AAAC,wDAAwD,iBAAiB;AAAC,oPAAoP,mFAAmF,CAAC,gDAAgD,CAAC,qBAAqB;AAAC,iKAAiK,qFAAqF,CAAC,gDAAgD,CAAC,qBAAqB;AAAC,0JAA0J,qFAAqF,CAAC,gDAAgD,CAAC,qBAAqB;AAAC,wDAAwD,aAAa;AAAC,4DAA4D,aAAa;AAAC,oEAAoE,wBAAwB,CAAC,+BAA+B;AAAC,aAAa,oPAAoP,4CAA4C,CAAC,iKAAiK,4CAA4C,CAAC,0JAA0J,2CAA2C,CAAC;AAAC,sDAAsD,uBAAuB;AAAC,sDAAsD,aAAa,CAAC,iBAAiB;AAAC,gPAAgP,4CAA4C,CAAC,qBAAqB;AAAC,wJAAwJ,4CAA4C,CAAC,qBAAqB;AAAC,yDAAyD,mBAAmB;AAAC,yDAAyD,aAAa,CAAC,kBAAkB;AAAC,sPAAsP,4CAA4C,CAAC,qBAAqB;AAAC,2JAA2J,4CAA4C,CAAC,qBAAqB;AAAC,4CAA4C,cAAc;AAAC,gEAAgE,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,aAAa,CAAC,qBAAqB;AAAC,8FAA8F,cAAc;AAAC,wBAAwB,oBAAoB;AAAC,eAAe,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,4DAA4D,gDAAgD,CAAC,cAAc;AAAC,kBAAkB,gDAAgD;AAAC,YAAY,gDAAgD;AAAC,oBAAoB,cAAc;AAAC,0BAA0B,gDAAgD;AAAC,6BAA6B,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,8CAA8C,gDAAgD;AAAC,gBAAgB,cAAc,CAAC,eAAe;AAAC,0BAA0B,kBAAkB;AAAC,sBAAsB,cAAc;AAAC,yBAAyB,cAAc,CAAC,eAAe;AAAC,eAAe,gDAAgD;AAAC,6BAA6B,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,6GAA6G,uDAAuD,CAAC,qBAAqB,CAAC,QAAQ;AAAC,aAAa,gDAAgD,CAAC,cAAc,CAAC,eAAe,CAAC,kBAAkB;AAAC,qBAAqB,cAAc,CAAC,eAAe,CAAC,kBAAkB;AAAC,eAAe,gDAAgD;AAAC,iBAAiB,gDAAgD;AAAC,8BAA8B,cAAc;AAAC,wCAAwC,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,aAAa,CAAC,qBAAqB;AAAC,uDAAuD,cAAc;AAAC,gCAAgC,cAAc;AAAC,0CAA0C,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,aAAa,CAAC,qBAAqB;AAAC,yDAAyD,cAAc;AAAC,8BAA8B,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,qCAAqC,cAAc;AAAC,+CAA+C,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,aAAa,CAAC,qBAAqB;AAAC,8DAA8D,cAAc;AAAC,uCAAuC,cAAc;AAAC,iDAAiD,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,aAAa,CAAC,qBAAqB;AAAC,gEAAgE,cAAc;AAAC,qCAAqC,gDAAgD,CAAC,cAAc,CAAC,eAAe;AAAC,YAAY,gDAAgD,CAAC,cAAc;AAAC,oBAAoB,uDAAuD,CAAC,qBAAqB;AAAC,qBAAqB,gDAAgD,CAAC,cAAc;AAAC,4BAA4B,aAAa,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,eAAe;AAAC,UAAU,gDAAgD;AAAC,qCAAqC,eAAe,CAAC,cAAc;AAAC,YAAY,eAAe,CAAC,iBAAiB;AAAC,wBAAwB,uBAAuB;AAAC,iCAAiC,gBAAgB;AAAC,oBAAoB,iBAAiB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,2DAA2D,CAAC,kBAAkB;AAAC,8CAA8C,YAAY;AAAC,qBAAqB,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,uBAAuB,CAAC,oBAAoB;AAAC,mDAAmD,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU;AAAC,uBAAuB,cAAc,CAAC,YAAY;AAAC,6BAA6B,YAAY;AAAC,4BAA4B,YAAY,CAAC,iBAAiB,CAAC,YAAY;AAAC,kBAAkB,iBAAiB,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,YAAY,CAAC,YAAY,CAAC,cAAc,CAAC,eAAe;AAAC,sBAAsB,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,uCAAuC,CAAC,yDAAyD,CAAC,SAAS;AAAC,mDAAmD,SAAS;AAAC,6EAA6E,UAAU;AAAC,2BAA2B,0BAA0B;AAAC,iGAAiG,SAAS;AAAC,6CAA6C,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC,qBAAqB,CAAC,aAAa,CAAC,cAAc;AAAC,wBAAwB,cAAc,CAAC,UAAU,CAAC,iBAAiB;AAAC,yCAAyC,IAAI,CAAC;AAAC,uCAAuC,IAAI,CAAC;AAAC,oDAAoD,8CAA8C;AAAC,0DAA0D,4CAA4C;AAAC,+BAA+B,WAAW;AAAC,yCAAyC,wBAAwB,CAAC,iCAAiC,CAAC,sBAAsB,CAAC,0BAA0B;AAAC,iDAAiD,wBAAwB,CAAC,iCAAiC,CAAC,mBAAmB;AAAC,qBAAqB,iBAAiB;AAAC,yBAAyB,iBAAiB;AAAC,oBAAoB,+BAA+B;AAAC,YAAY,qBAAqB;AAAC,wFAAwF,0BAA0B;AAAC,6EAA6E,0BAA0B;AAAC,uBAAuB,0BAA0B,CAAC,qBAAqB;AAAC,gCAAgC,qBAAqB;AAAC,gEAAgE,aAAa;AAAC,+DAA+D,aAAa;AAAC,6DAA6D,aAAa;AAAC,oBAAoB,qBAAqB;AAAC,2CAA2C,qBAAqB;AAAC,qBAAqB,qBAAqB;AAAC,4BAA4B,aAAa;AAAC,8BAA8B,aAAa;AAAC,0FAA0F,kBAAkB;AAAC,wJAAwJ,kBAAkB;AAAC,oFAAoF,kBAAkB;AAAC,0HAA0H,kBAAkB;AAAC,oBAAoB,wBAAwB,CAAC,qBAAqB;AAAC,kBAAkB,qHAAqH;AAAC,kBAAkB,sHAAsH;AAAC,kBAAkB,sHAAsH;AAAC,kBAAkB,sHAAsH;AAAC,kBAAkB,uHAAuH;AAAC,kBAAkB,uHAAuH;AAAC,kBAAkB,wHAAwH;AAAC,kBAAkB,wHAAwH;AAAC,kBAAkB,wHAAwH;AAAC,kBAAkB,wHAAwH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,yHAAyH;AAAC,mBAAmB,0HAA0H;AAAC,mBAAmB,0HAA0H;AAAC,mBAAmB,0HAA0H;AAAC,mBAAmB,0HAA0H;AAAC,mBAAmB,2HAA2H;AAAC,mBAAmB,2HAA2H;AAAC,mBAAmB,2HAA2H;AAAC,mBAAmB,2HAA2H;AAAC,mBAAmB,2HAA2H;AAAC,yBAAyB,YAAY;AAAC,wBAAwB,eAAe,CAAC,qBAAqB;AAAC,sDAAsD,uHAAuH;AAAC,8EAA8E,eAAe;AAAC,wGAAwG,qBAAqB;AAAC,mBAAmB,UAAU,CAAC,kBAAkB;AAAC,6CAA6C,iBAAiB,CAAC,eAAe;AAAC,qCAAqC,kBAAkB,CAAC,UAAU;AAAC,mCAAmC,UAAU,CAAC,kBAAkB;AAAC,WAAW,iBAAiB;AAAC,qCAAqC,YAAY;AAAC,uCAAuC,kBAAkB,CAAC,qBAAqB;AAAC,mBAAmB,iBAAiB,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,sCAAsC,CAAC,oBAAoB,CAAC,eAAe,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,mBAAmB;AAAC,mFAAmF,eAAe;AAAC,oCAAoC,cAAc;AAAC,oCAAoC,UAAU,CAAC,WAAW,CAAC,gBAAgB;AAAC,oDAAoD,QAAQ;AAAC,oDAAoD,WAAW;AAAC,qDAAqD,UAAU;AAAC,+DAA+D,SAAS,CAAC,WAAW;AAAC,oDAAoD,WAAW;AAAC,8DAA8D,UAAU,CAAC,UAAU;AAAC,uEAAuE,SAAS;AAAC,iFAAiF,SAAS,CAAC,UAAU;AAAC,sEAAsE,UAAU;AAAC,gFAAgF,UAAU,CAAC,SAAS;AAAC,qCAAqC,UAAU,CAAC,WAAW,CAAC,gBAAgB;AAAC,qDAAqD,SAAS;AAAC,qDAAqD,YAAY;AAAC,sDAAsD,UAAU;AAAC,gEAAgE,SAAS,CAAC,WAAW;AAAC,qDAAqD,WAAW;AAAC,+DAA+D,UAAU,CAAC,UAAU;AAAC,wEAAwE,UAAU;AAAC,kFAAkF,SAAS,CAAC,WAAW;AAAC,uEAAuE,WAAW;AAAC,iFAAiF,UAAU,CAAC,UAAU;AAAC,oCAAoC,UAAU,CAAC,WAAW,CAAC,gBAAgB;AAAC,oDAAoD,SAAS;AAAC,oDAAoD,YAAY;AAAC,qDAAqD,UAAU;AAAC,+DAA+D,SAAS,CAAC,WAAW;AAAC,oDAAoD,WAAW;AAAC,8DAA8D,UAAU,CAAC,UAAU;AAAC,uEAAuE,UAAU;AAAC,iFAAiF,SAAS,CAAC,WAAW;AAAC,sEAAsE,WAAW;AAAC,gFAAgF,UAAU,CAAC,UAAU;AAAC,4BAA4B,0HAA0H,CAAC,eAAe,CAAC,qBAAqB;AAAC,iDAAiD,aAAa,CAAC,sBAAsB;AAAC,qFAAqF,aAAa;AAAC,kFAAkF,aAAa;AAAC,4EAA4E,aAAa;AAAC,glBAAglB,qBAAqB;AAAC,mKAAmK,wBAAwB;AAAC,gKAAgK,wBAAwB;AAAC,0JAA0J,wBAAwB;AAAC,2LAA2L,4BAA4B;AAAC,6GAA6G,UAAU,CAAC,6BAA6B;AAAC,0BAA0B,eAAe;AAAC,8CAA8C,4BAA4B;AAAC,2DAA2D,qBAAqB,CAAC,qBAAqB;AAAC,2GAA2G,UAAU;AAAC,uGAAuG,UAAU;AAAC,+FAA+F,UAAU;AAAC,4vBAA4vB,qBAAqB;AAAC,2GAA2G,wBAAwB;AAAC,uGAAuG,wBAAwB;AAAC,+FAA+F,wBAAwB;AAAC,4vBAA4vB,gCAAgC;AAAC,2LAA2L,qCAAqC;AAAC,uLAAuL,qCAAqC;AAAC,+KAA+K,qCAAqC;AAAC,iGAAiG,qHAAqH;AAAC,iDAAiD,sHAAsH;AAAC,kFAAkF,wHAAwH;AAAC,qEAAqE,qHAAqH;AAAC,mFAAmF,wHAAwH;AAAC,qJAAqJ,yHAAyH;AAAC,2HAA2H,qHAAqH;AAAC,uDAAuD,sHAAsH;AAAC,iHAAiH,eAAe;AAAC,mBAAmB,qBAAqB;AAAC,oDAAoD,gCAAgC;AAAC,uCAAuC,qBAAqB,CAAC,eAAe;AAAC,wEAAwE,qBAAqB;AAAC,mFAAmF,qCAAqC;AAAC,6FAA6F,gBAAgB,CAAC,sCAAsC;AAAC,8GAA8G,gBAAgB,CAAC,iBAAiB,CAAC,oCAAoC;AAAC,2BAA2B,wBAAwB,CAAC,qBAAqB;AAAC,iEAAiE,qBAAqB;AAAC,4BAA4B,qBAAqB,CAAC,qBAAqB;AAAC,kEAAkE,eAAe;AAAC,sDAAsD,wBAAwB;AAAC,iHAAiH,gCAAgC;AAAC,wEAAwE,gBAAgB;AAAC,UAAU,eAAe,CAAC,qBAAqB;AAAC,wCAAwC,sHAAsH;AAAC,sDAAsD,qHAAqH;AAAC,mBAAmB,qBAAqB;AAAC,oBAAoB,4BAA4B;AAAC,wBAAwB,YAAY;AAAC,6BAA6B,yBAAyB;AAAC,wBAAwB,wBAAwB;AAAC,4HAA4H,wBAAwB;AAAC,0HAA0H,wBAAwB;AAAC,sHAAsH,wBAAwB;AAAC,gJAAgJ,wBAAwB;AAAC,sEAAsE,oBAAoB;AAAC,2CAA2C,qBAAqB;AAAC,kCAAkC,qBAAqB;AAAC,mKAAmK,kBAAkB;AAAC,iKAAiK,kBAAkB;AAAC,6JAA6J,kBAAkB;AAAC,4BAA4B,wBAAwB,CAAC,qBAAqB;AAAC,6CAA6C,qBAAqB,CAAC,UAAU;AAAC,2DAA2D,sHAAsH;AAAC,2EAA2E,WAAW;AAAC,8CAA8C,UAAU;AAAC,mCAAmC,eAAe;AAAC,0DAA0D,wBAAwB,CAAC,UAAU;AAAC,2EAA2E,UAAU,CAAC,UAAU;AAAC,8EAA8E,qCAAqC;AAAC,uDAAuD,wBAAwB,CAAC,UAAU;AAAC,wEAAwE,UAAU,CAAC,UAAU;AAAC,2EAA2E,qCAAqC;AAAC,yDAAyD,wBAAwB,CAAC,UAAU;AAAC,0EAA0E,UAAU,CAAC,UAAU;AAAC,6EAA6E,qCAAqC;AAAC,WAAW,eAAe;AAAC,uJAAuJ,kBAAkB;AAAC,wFAAwF,mCAAmC;AAAC,iBAAiB,qBAAqB;AAAC,2BAA2B,qBAAqB;AAAC,oBAAoB,gCAAgC;AAAC,+HAA+H,qBAAqB;AAAC,2BAA2B,qBAAqB;AAAC,0CAA0C,0BAA0B;AAAC,yBAAyB,qBAAqB;AAAC,gEAAgE,qBAAqB,CAAC,wBAAwB;AAAC,0IAA0I,qBAAqB;AAAC,yDAAyD,qBAAqB;AAAC,8BAA8B,qBAAqB;AAAC,uGAAuG,4BAA4B;AAAC,mIAAmI,4BAA4B;AAAC,oCAAoC,6BAA6B;AAAC,uFAAuF,6BAA6B;AAAC,8GAA8G,4FAA4F;AAAC,8GAA8G,2FAA2F;AAAC,6IAA6I,kBAAkB;AAAC,sIAAsI,kBAAkB;AAAC,4BAA4B,wBAAwB,CAAC,UAAU;AAAC,wDAAwD,mCAAmC;AAAC,oDAAoD,+BAA+B;AAAC,weAAwe,mCAAmC;AAAC,wBAAwB,uHAAuH,CAAC,qBAAqB,CAAC,qBAAqB;AAAC,uEAAuE,8BAA8B;AAAC,6JAA6J,6BAA6B;AAAC,oLAAoL,6FAA6F;AAAC,oLAAoL,4FAA4F;AAAC,mNAAmN,kBAAkB;AAAC,4MAA4M,kBAAkB;AAAC,+DAA+D,wBAAwB,CAAC,UAAU;AAAC,2FAA2F,oCAAoC;AAAC,uFAAuF,+BAA+B;AAAC,ilBAAilB,oCAAoC;AAAC,qEAAqE,6BAA6B;AAAC,yJAAyJ,6BAA6B;AAAC,gLAAgL,4FAA4F;AAAC,gLAAgL,2FAA2F;AAAC,+MAA+M,kBAAkB;AAAC,wMAAwM,kBAAkB;AAAC,6DAA6D,wBAAwB,CAAC,UAAU;AAAC,yFAAyF,mCAAmC;AAAC,qFAAqF,+BAA+B;AAAC,2kBAA2kB,mCAAmC;AAAC,8BAA8B,qHAAqH;AAAC,8BAA8B,aAAa;AAAC,yCAAyC,aAAa;AAAC,uCAAuC,aAAa;AAAC,sCAAsC,qBAAqB;AAAC,sBAAsB,2HAA2H,CAAC,eAAe,CAAC,qBAAqB;AAAC,aAAa,gCAAgC;AAAC,sBAAsB,kCAAkC;AAAC,qBAAqB,eAAe,CAAC,qBAAqB;AAAC,mDAAmD,sHAAsH;AAAC,gBAAgB,gCAAgC;AAAC,mSAAmS,0BAA0B;AAAC,oBAAoB,oGAAoG,eAAe,CAAC;AAAC,kCAAkC,qBAAqB;AAAC,wEAAwE,qBAAqB;AAAC,gDAAgD,qBAAqB;AAAC,0KAA0K,aAAa;AAAC,4BAA4B,WAAW;AAAC,yCAAyC,WAAW;AAAC,sBAAsB,oBAAoB;AAAC,UAAU,oBAAoB;AAAC,kDAAkD,aAAa;AAAC,6DAA6D,aAAa;AAAC,2DAA2D,aAAa;AAAC,6CAA6C,aAAa;AAAC,uBAAuB,gCAAgC;AAAC,mDAAmD,wBAAwB;AAAC,8DAA8D,wBAAwB;AAAC,4DAA4D,wBAAwB;AAAC,6GAA6G,aAAa;AAAC,wHAAwH,aAAa;AAAC,sHAAsH,aAAa;AAAC,6DAA6D,aAAa;AAAC,qKAAqK,aAAa;AAAC,uIAAuI,wBAAwB;AAAC,WAAW,aAAa;AAAC,wDAAwD,qBAAqB;AAAC,4CAA4C,qBAAqB;AAAC,4DAA4D,gCAAgC;AAAC,oFAAoF,2GAA2G,CAAC,wBAAwB,CAAC,0BAA0B;AAAC,8DAA8D,gCAAgC;AAAC,sFAAsF,2GAA2G,CAAC,wBAAwB,CAAC,0BAA0B;AAAC,qDAAqD,gCAAgC;AAAC,6EAA6E,gCAAgC;AAAC,kEAAkE,gCAAgC;AAAC,8EAA8E,qBAAqB;AAAC,0FAA0F,4BAA4B;AAAC,2DAA2D,qBAAqB;AAAC,iEAAiE,qBAAqB;AAAC,6EAA6E,aAAa;AAAC,wFAAwF,aAAa;AAAC,sFAAsF,aAAa;AAAC,+GAA+G,aAAa;AAAC,iFAAiF,qBAAqB;AAAC,mFAAmF,qBAAqB;AAAC,sBAAsB,aAAa;AAAC,qBAAqB,aAAa;AAAC,mBAAmB,aAAa;AAAC,oEAAoE,qBAAqB;AAAC,wHAAwH,qBAAqB;AAAC,mBAAmB,mBAAmB;AAAC,gCAAgC,qBAAqB;AAAC,qCAAqC,qBAAqB;AAAC,8CAA8C,qBAAqB;AAAC,yCAAyC,qBAAqB;AAAC,8CAA8C,mBAAmB;AAAC,uFAAuF,mBAAmB;AAAC,2FAA2F,aAAa;AAAC,8BAA8B,qBAAqB;AAAC,gCAAgC,qBAAqB;AAAC,8BAA8B,qBAAqB;AAAC,wBAAwB,qBAAqB;AAAC,gMAAgM,0BAA0B;AAAC,+GAA+G,0BAA0B;AAAC,gBAAgB,eAAe;AAAC,8CAA8C,uHAAuH;AAAC,eAAe,sBAAsB,CAAC,qBAAqB;AAAC,qGAAqG,qBAAqB;AAAC,wEAAwE,qBAAqB;AAAC,uLAAuL,0BAA0B;AAAC,eAAe,eAAe;AAAC,4DAA4D,qBAAqB;AAAC,kDAAkD,oCAAoC,CAAC,sCAAsC;AAAC,yCAAyC,oCAAoC;AAAC,uMAAuM,4BAA4B;AAAC,yBAAyB,eAAe;AAAC,6BAA6B,YAAY;AAAC,yBAAyB,wBAAwB;AAAC,8BAA8B,wBAAwB;AAAC,0DAA0D,YAAY;AAAC,sDAAsD,wBAAwB;AAAC,2DAA2D,wBAAwB;AAAC,wDAAwD,YAAY;AAAC,oDAAoD,wBAAwB;AAAC,yDAAyD,wBAAwB;AAAC,iDAAiD,cAAc;AAAC,uEAAuE,cAAc;AAAC,mEAAmE,cAAc;AAAC,wBAAwB,4BAA4B;AAAC,wEAAwE,oBAAoB;AAAC,2SAA2S,wBAAwB;AAAC,uEAAuE,oBAAoB;AAAC,uSAAuS,wBAAwB;AAAC,qEAAqE,oBAAoB;AAAC,+RAA+R,wBAAwB;AAAC,4IAA4I,4BAA4B;AAAC,wIAAwI,gCAAgC;AAAC,8DAA8D,qBAAqB;AAAC,sCAAsC,qBAAqB;AAAC,kBAAkB,qBAAqB;AAAC,wBAAwB,qBAAqB;AAAC,uCAAuC,qBAAqB;AAAC,kBAAkB,qBAAqB;AAAC,kBAAkB,eAAe;AAAC,gDAAgD,uHAAuH;AAAC,qEAAqE,0BAA0B;AAAC,0DAA0D,aAAa;AAAC,yDAAyD,aAAa;AAAC,uDAAuD,aAAa;AAAC,iEAAiE,aAAa;AAAC,kEAAkE,qBAAqB;AAAC,sBAAsB,wBAAwB,CAAC,qBAAqB;AAAC,YAAY,qBAAqB,CAAC,qBAAqB;AAAC,4BAA4B,qBAAqB;AAAC,kCAAkC,0HAA0H;AAAC,iBAAiB,sCAAsC;AAAC,gCAAgC,qCAAqC,CAAC,iBAAiB;AAAC,2BAA2B,qCAAqC,CAAC,iBAAiB;AAAC,0CAA0C,gBAAgB,CAAC,sCAAsC;AAAC,sCAAsC,+BAA+B;AAAC,sDAAsD,wBAAwB;AAAC,oDAAoD,qCAAqC;AAAC,kDAAkD,wBAAwB;AAAC,kEAAkE,wBAAwB;AAAC,gEAAgE,oCAAoC;AAAC,8DAA8D,wBAAwB;AAAC,+DAA+D,wBAAwB;AAAC,6DAA6D,oCAAoC;AAAC,2DAA2D,wBAAwB;AAAC,wDAAwD,qBAAqB;AAAC,wBAAwB,sHAAsH,CAAC,wBAAwB;AAAC,sBAAsB,gCAAgC;AAAC,6BAA6B,gCAAgC;AAAC,wGAAwG,wBAAwB;AAAC,0CAA0C,UAAU;AAAC,oCAAoC,mCAAmC;AAAC,qGAAqG,wBAAwB;AAAC,yCAAyC,UAAU;AAAC,mCAAmC,oCAAoC;AAAC,+FAA+F,wBAAwB;AAAC,uCAAuC,UAAU;AAAC,iCAAiC,mCAAmC;AAAC,yFAAyF,gCAAgC;AAAC,qIAAqI,gCAAgC;AAAC,wDAAwD,gCAAgC;AAAC,6CAA6C,gCAAgC;AAAC,oJAAoJ,gCAAgC;AAAC,4KAA4K,gCAAgC;AAAC,6EAA6E,4BAA4B,CAAC,4BAA4B;AAAC,4KAA4K,4BAA4B;AAAC,oNAAoN,4BAA4B;AAAC,iDAAiD,2BAA2B;AAAC,yCAAyC,4HAA4H,CAAC,kIAAkI;AAAC,uCAAuC,6HAA6H;AAAC,kGAAkG,gCAAgC;AAAC,oBAAoB,uBAAuB,eAAe,CAAC;AAAC,qEAAqE,qBAAqB;AAAC,gCAAgC,gCAAgC,CAAC,UAAU;AAAC,+HAA+H,wBAAwB,CAAC,UAAU;AAAC,2CAA2C,UAAU;AAAC,gKAAgK,wBAAwB,CAAC,UAAU;AAAC,yCAAyC,UAAU;AAAC,0JAA0J,wBAAwB,CAAC,UAAU;AAAC,4CAA4C,4BAA4B,CAAC,aAAa;AAAC,uDAAuD,qBAAqB;AAAC,sDAAsD,aAAa;AAAC,8CAA8C,qBAAqB;AAAC,mCAAmC,iCAAiC;AAAC,0GAA0G,gCAAgC;AAAC,+BAA+B,WAAW;AAAC,+FAA+F,iBAAiB;AAAC,mCAAmC,SAAS,CAAC,YAAY;AAAC,mJAAmJ,QAAQ;AAAC,gEAAgE,QAAQ;AAAC,uBAAuB,aAAa;AAAC,iCAAiC,uCAAuC;AAAC,+FAA+F,oCAAoC,CAAC,kBAAkB;AAAC,6BAA6B,qBAAqB;AAAC,+DAA+D,qBAAqB;AAAC,mCAAmC,4BAA4B;AAAC,uEAAuE,4BAA4B;AAAC,gGAAgG,kBAAkB,CAAC,eAAe;AAAC,grBAAgrB,qCAAqC;AAAC,kFAAkF,wBAAwB;AAAC,gVAAgV,qBAAqB;AAAC,wqBAAwqB,qCAAqC;AAAC,gFAAgF,wBAAwB;AAAC,wUAAwU,qBAAqB;AAAC,wpBAAwpB,qCAAqC;AAAC,4EAA4E,wBAAwB;AAAC,wTAAwT,qBAAqB;AAAC,wwBAAwwB,qCAAqC;AAAC,gXAAgX,wBAAwB;AAAC,sSAAsS,UAAU;AAAC,0WAA0W,0BAA0B;AAAC,whBAAwhB,iBAAiB;AAAC,4NAA4N,iCAAiC;AAAC,4TAA4T,sCAAsC;AAAC,gwBAAgwB,qCAAqC;AAAC,0WAA0W,wBAAwB;AAAC,kSAAkS,UAAU;AAAC,sWAAsW,0BAA0B;AAAC,khBAAkhB,iBAAiB;AAAC,0NAA0N,iCAAiC;AAAC,wTAAwT,sCAAsC;AAAC,gvBAAgvB,qCAAqC;AAAC,8VAA8V,wBAAwB;AAAC,0RAA0R,UAAU;AAAC,8VAA8V,0BAA0B;AAAC,sgBAAsgB,iBAAiB;AAAC,sNAAsN,iCAAiC;AAAC,gTAAgT,sCAAsC;AAAC,aAAa,kBAAkB,CAAC,qBAAqB;AAAC,yBAAyB,kBAAkB,CAAC,UAAU;AAAC,wBAAwB,kBAAkB,CAAC,UAAU;AAAC,sBAAsB,kBAAkB,CAAC,UAAU;AAAC,4HAA4H,6BAA6B;AAAC,4MAA4M,aAAa;AAAC,gCAAgC,wBAAwB;AAAC,2BAA2B,eAAe;AAAC,yCAAyC,WAAW;AAAC,yBAAyB,2BAA2B,eAAe,CAAC,yCAAyC,WAAW,CAAC;AAAC,aAAa,4BAA4B;AAAC,UAAU,eAAe;AAAC,qCAAqC,qBAAqB;AAAC,eAAe,eAAe;AAAC,yBAAyB,0BAA0B,CAAC,kBAAkB,CAAC,wHAAwH;AAAC,4BAA4B,aAAa;ACAr1zE;;;;;;;;;;;;;;CAcC;AAED;EACE,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,mBAAmB;AACrB;AAEA;;;;;EAKE,cAAc;AAChB;AAEA;EACE,cAAc;AAChB;AAEA;;EAEE,cAAc;AAChB;AAEA;;;;;;;;;;;EAWE,cAAc;AAChB;AAEA;;;;EAIE,cAAc;AAChB;AAEA;;;;;;;;;EASE,iBAAiB;AACnB;AAEA;EACE,kBAAkB;AACpB;AFvEA;EACE,YAAY;AACd;AAEA;EACE,SAAS;AACX","file":"styles.css","sourcesContent":["/* You can add global styles to this file, and also import other style files */\n@import \"~@angular/material/prebuilt-themes/indigo-pink.css\";\n@import \"assets/dracula.css\";\n\nhtml, body {\n height: 100%;\n}\n\nbody {\n margin: 0;\n}\n",".mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * 0.83)/20px Roboto, \"Helvetica Neue\", sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * 0.67)/20px Roboto, \"Helvetica Neue\", sans-serif;margin:0 0 12px}.mat-body-strong,.mat-body-2{font:500 14px/24px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-small,.mat-caption{font:400 12px/20px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:-0.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:-0.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:-0.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-button,.mat-raised-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button,.mat-fab,.mat-mini-fab{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:14px;font-weight:500}.mat-button-toggle{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-card{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-subtitle,.mat-card-content{font-size:14px}.mat-checkbox{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-trailing-icon.mat-icon,.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-expansion-panel-header{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(0.75);width:133.3333333333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(0.75);width:133.3333433333%}.mat-form-field-label-wrapper{top:-0.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.6666666667em;top:calc(100% - 1.7916666667em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.001px);-ms-transform:translateY(-1.28125em) scale(0.75);width:133.3333333333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00101px);-ms-transform:translateY(-1.28124em) scale(0.75);width:133.3333433333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00102px);-ms-transform:translateY(-1.28123em) scale(0.75);width:133.3333533333%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.5416666667em;top:calc(100% - 1.6666666667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(0.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(0.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(0.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-0.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-0.59375em) scale(0.75);width:133.3333333333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-0.59374em) scale(0.75);width:133.3333433333%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-0.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(0.75);width:133.3333333333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(0.75);width:133.3333433333%}.mat-grid-tile-header,.mat-grid-tile-footer{font-size:14px}.mat-grid-tile-header .mat-line,.mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-header .mat-line:nth-child(n+2),.mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-0.0625em}.mat-menu-item{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:12px}.mat-radio-button{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-select{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-slider-thumb-label-text{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:12px;font-weight:500}.mat-stepper-vertical,.mat-stepper-horizontal{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:normal}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal;margin:0}.mat-tooltip{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-list-option{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto, \"Helvetica Neue\", sans-serif;letter-spacing:normal}.mat-simple-snackbar{font-family:Roboto, \"Helvetica Neue\", sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto, \"Helvetica Neue\", sans-serif}.mat-tree-node,.mat-nested-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale(0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}.mat-focus-indicator{position:relative}.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option:hover:not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#3f51b5}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ff4081}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#3f51b5}.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:#ff4081}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-elevation-z0{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z1{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z2{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z3{box-shadow:0px 3px 3px -2px rgba(0, 0, 0, 0.2),0px 3px 4px 0px rgba(0, 0, 0, 0.14),0px 1px 8px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z4{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z5{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 5px 8px 0px rgba(0, 0, 0, 0.14),0px 1px 14px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z6{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}.mat-elevation-z7{box-shadow:0px 4px 5px -2px rgba(0, 0, 0, 0.2),0px 7px 10px 1px rgba(0, 0, 0, 0.14),0px 2px 16px 1px rgba(0, 0, 0, 0.12)}.mat-elevation-z8{box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0, 0, 0, 0.12)}.mat-elevation-z9{box-shadow:0px 5px 6px -3px rgba(0, 0, 0, 0.2),0px 9px 12px 1px rgba(0, 0, 0, 0.14),0px 3px 16px 2px rgba(0, 0, 0, 0.12)}.mat-elevation-z10{box-shadow:0px 6px 6px -3px rgba(0, 0, 0, 0.2),0px 10px 14px 1px rgba(0, 0, 0, 0.14),0px 4px 18px 3px rgba(0, 0, 0, 0.12)}.mat-elevation-z11{box-shadow:0px 6px 7px -4px rgba(0, 0, 0, 0.2),0px 11px 15px 1px rgba(0, 0, 0, 0.14),0px 4px 20px 3px rgba(0, 0, 0, 0.12)}.mat-elevation-z12{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0, 0, 0, 0.12)}.mat-elevation-z13{box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 13px 19px 2px rgba(0, 0, 0, 0.14),0px 5px 24px 4px rgba(0, 0, 0, 0.12)}.mat-elevation-z14{box-shadow:0px 7px 9px -4px rgba(0, 0, 0, 0.2),0px 14px 21px 2px rgba(0, 0, 0, 0.14),0px 5px 26px 4px rgba(0, 0, 0, 0.12)}.mat-elevation-z15{box-shadow:0px 8px 9px -5px rgba(0, 0, 0, 0.2),0px 15px 22px 2px rgba(0, 0, 0, 0.14),0px 6px 28px 5px rgba(0, 0, 0, 0.12)}.mat-elevation-z16{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12)}.mat-elevation-z17{box-shadow:0px 8px 11px -5px rgba(0, 0, 0, 0.2),0px 17px 26px 2px rgba(0, 0, 0, 0.14),0px 6px 32px 5px rgba(0, 0, 0, 0.12)}.mat-elevation-z18{box-shadow:0px 9px 11px -5px rgba(0, 0, 0, 0.2),0px 18px 28px 2px rgba(0, 0, 0, 0.14),0px 7px 34px 6px rgba(0, 0, 0, 0.12)}.mat-elevation-z19{box-shadow:0px 9px 12px -6px rgba(0, 0, 0, 0.2),0px 19px 29px 2px rgba(0, 0, 0, 0.14),0px 7px 36px 6px rgba(0, 0, 0, 0.12)}.mat-elevation-z20{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 20px 31px 3px rgba(0, 0, 0, 0.14),0px 8px 38px 7px rgba(0, 0, 0, 0.12)}.mat-elevation-z21{box-shadow:0px 10px 13px -6px rgba(0, 0, 0, 0.2),0px 21px 33px 3px rgba(0, 0, 0, 0.14),0px 8px 40px 7px rgba(0, 0, 0, 0.12)}.mat-elevation-z22{box-shadow:0px 10px 14px -6px rgba(0, 0, 0, 0.2),0px 22px 35px 3px rgba(0, 0, 0, 0.14),0px 8px 42px 7px rgba(0, 0, 0, 0.12)}.mat-elevation-z23{box-shadow:0px 11px 14px -7px rgba(0, 0, 0, 0.2),0px 23px 36px 3px rgba(0, 0, 0, 0.14),0px 9px 44px 8px rgba(0, 0, 0, 0.12)}.mat-elevation-z24{box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0, 0, 0, 0.12)}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-badge-content{color:#fff;background:#3f51b5}.cdk-high-contrast-active .mat-badge-content{outline:solid 1px;border-radius:0}.mat-badge-accent .mat-badge-content{background:#ff4081;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform 200ms ease-in-out;transform:scale(0.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.ng-animate-disabled .mat-badge-content,.mat-badge-content._mat-animation-noopable{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-bottom-sheet-container{box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12);background:#fff;color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#3f51b5}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ff4081}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}.mat-button.mat-primary.mat-button-disabled,.mat-button.mat-accent.mat-button-disabled,.mat-button.mat-warn.mat-button-disabled,.mat-button.mat-button-disabled.mat-button-disabled,.mat-icon-button.mat-primary.mat-button-disabled,.mat-icon-button.mat-accent.mat-button-disabled,.mat-icon-button.mat-warn.mat-button-disabled,.mat-icon-button.mat-button-disabled.mat-button-disabled,.mat-stroked-button.mat-primary.mat-button-disabled,.mat-stroked-button.mat-accent.mat-button-disabled,.mat-stroked-button.mat-warn.mat-button-disabled,.mat-stroked-button.mat-button-disabled.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#3f51b5}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ff4081}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.mat-button.mat-button-disabled .mat-button-focus-overlay,.mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.mat-flat-button,.mat-raised-button,.mat-fab,.mat-mini-fab{color:rgba(0,0,0,.87);background-color:#fff}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{color:#fff}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{color:#fff}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{color:#fff}.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{background-color:#3f51b5}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{background-color:#ff4081}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{background-color:#f44336}.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled{background-color:rgba(0,0,0,.12)}.mat-flat-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-flat-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-flat-button.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-stroked-button:not([class*=mat-elevation-z]),.mat-flat-button:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0px 5px 5px -3px rgba(0, 0, 0, 0.2),0px 8px 10px 1px rgba(0, 0, 0, 0.14),0px 3px 14px 2px rgba(0, 0, 0, 0.12)}.mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}.mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0px 7px 8px -4px rgba(0, 0, 0, 0.2),0px 12px 17px 2px rgba(0, 0, 0, 0.14),0px 5px 22px 4px rgba(0, 0, 0, 0.12)}.mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-button-toggle-standalone,.mat-button-toggle-group{box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,.12)}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border:solid 1px rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card:not([class*=mat-elevation-z]){box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12)}.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa !important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background,.mat-checkbox-checked.mat-primary .mat-checkbox-background{background-color:#3f51b5}.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#ff4081}.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background,.mat-checkbox-checked.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#3f51b5}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ff4081}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0px 3px 3px -2px rgba(0, 0, 0, 0.2),0px 3px 4px 0px rgba(0, 0, 0, 0.14),0px 1px 8px 0px rgba(0, 0, 0, 0.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.mat-chip.mat-standard-chip::after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#3f51b5;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ff4081;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}.mat-table{background:#fff}.mat-table thead,.mat-table tbody,.mat-table tfoot,mat-header-row,mat-row,mat-footer-row,[mat-header-row],[mat-row],[mat-footer-row],.mat-table-sticky{background:inherit}mat-row,mat-header-row,mat-footer-row,th.mat-header-cell,td.mat-cell,td.mat-footer-cell{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-datepicker-toggle,.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content,.mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){color:rgba(0,0,0,.38)}.mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.mat-calendar-body-in-range::before{background:rgba(63,81,181,.2)}.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}.mat-calendar-body-comparison-bridge-start::before,[dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(63, 81, 181, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-calendar-body-comparison-bridge-end::before,[dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(63, 81, 181, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}.mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-calendar-body-selected{background-color:#3f51b5;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(63,81,181,.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(63,81,181,.3)}.mat-datepicker-content{box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12);background-color:#fff;color:rgba(0,0,0,.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-range::before{background:rgba(255,64,129,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start::before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(255, 64, 129, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end::before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(255, 64, 129, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ff4081;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,64,129,.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-accent .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(255,64,129,.3)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-range::before{background:rgba(244,67,54,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range::before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start::before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end::before{background:linear-gradient(to right, rgba(244, 67, 54, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end::before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start::before{background:linear-gradient(to left, rgba(244, 67, 54, 0.2) 50%, rgba(249, 171, 0, 0.2) 50%)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range::after{background:#a8dab5}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(244,67,54,.3)}.mat-datepicker-content-touch{box-shadow:0px 0px 0px 0px rgba(0, 0, 0, 0.2),0px 0px 0px 0px rgba(0, 0, 0, 0.14),0px 0px 0px 0px rgba(0, 0, 0, 0.12)}.mat-datepicker-toggle-active{color:#3f51b5}.mat-datepicker-toggle-active.mat-accent{color:#ff4081}.mat-datepicker-toggle-active.mat-warn{color:#f44336}.mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.mat-dialog-container{box-shadow:0px 11px 15px -7px rgba(0, 0, 0, 0.2),0px 24px 38px 3px rgba(0, 0, 0, 0.14),0px 9px 46px 8px rgba(0, 0, 0, 0.12);background:#fff;color:rgba(0,0,0,.87)}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2),0px 2px 2px 0px rgba(0, 0, 0, 0.14),0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media(hover: none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-panel-header-description,.mat-expansion-indicator::after{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header{height:48px}.mat-expansion-panel-header.mat-expanded{height:64px}.mat-form-field-label{color:rgba(0,0,0,.6)}.mat-hint{color:rgba(0,0,0,.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#3f51b5}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ff4081}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ff4081}.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#3f51b5}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ff4081}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#3f51b5}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#ff4081}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.mat-error{color:#f44336}.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,.54)}.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#3f51b5}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ff4081}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#f44336}.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.mat-icon.mat-primary{color:#3f51b5}.mat-icon.mat-accent{color:#ff4081}.mat-icon.mat-warn{color:#f44336}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,.54)}.mat-input-element:disabled,.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#3f51b5}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-form-field.mat-accent .mat-input-element{caret-color:#ff4081}.mat-form-field.mat-warn .mat-input-element,.mat-form-field-invalid .mat-input-element{caret-color:#f44336}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#f44336}.mat-list-base .mat-list-item{color:rgba(0,0,0,.87)}.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-list-option:hover,.mat-list-option:focus,.mat-nav-list .mat-list-item:hover,.mat-nav-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-action-list .mat-list-item:focus{background:rgba(0,0,0,.04)}.mat-list-single-selected-option,.mat-list-single-selected-option:hover,.mat-list-single-selected-option:focus{background:rgba(0,0,0,.12)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.mat-menu-item[disabled],.mat-menu-item[disabled]::after,.mat-menu-item[disabled] .mat-icon-no-color{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.mat-menu-item:hover:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item-highlighted:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.mat-paginator-container{min-height:56px}.mat-progress-bar-background{fill:#c5cae9}.mat-progress-bar-buffer{background-color:#c5cae9}.mat-progress-bar-fill::after{background-color:#3f51b5}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ff80ab}.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#ff80ab}.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ff4081}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#3f51b5}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ff4081}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#3f51b5}.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#3f51b5}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff4081}.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ff4081}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle{background-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0px 2px 4px -1px rgba(0, 0, 0, 0.2),0px 4px 5px 0px rgba(0, 0, 0, 0.14),0px 1px 10px 0px rgba(0, 0, 0, 0.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#3f51b5}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ff4081}.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0px 8px 10px -5px rgba(0, 0, 0, 0.2),0px 16px 24px 2px rgba(0, 0, 0, 0.14),0px 6px 30px 5px rgba(0, 0, 0, 0.12)}.mat-drawer-side{border-right:solid 1px rgba(0,0,0,.12)}.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,.12);border-right:none}[dir=rtl] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,.12);border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ff4081}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,64,129,.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ff4081}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#3f51b5}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(63,81,181,.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#3f51b5}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0px 2px 1px -1px rgba(0, 0, 0, 0.2),0px 1px 1px 0px rgba(0, 0, 0, 0.14),0px 1px 3px 0px rgba(0, 0, 0, 0.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-track-fill,.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label{background-color:#3f51b5}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-primary .mat-slider-focus-ring{background-color:rgba(63,81,181,.2)}.mat-accent .mat-slider-track-fill,.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label{background-color:#ff4081}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-focus-ring{background-color:rgba(255,64,129,.2)}.mat-warn .mat-slider-track-fill,.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.mat-slider:hover .mat-slider-track-background,.cdk-focused .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled .mat-slider-thumb{background-color:rgba(0,0,0,.26)}.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent);background-image:-moz-repeating-linear-gradient(0.0001deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}@media(hover: none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#3f51b5;color:#fff}.mat-step-header.mat-accent .mat-step-icon{color:#fff}.mat-step-header.mat-accent .mat-step-icon-selected,.mat-step-header.mat-accent .mat-step-icon-state-done,.mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ff4081;color:#fff}.mat-step-header.mat-warn .mat-step-icon{color:#fff}.mat-step-header.mat-warn .mat-step-icon-selected,.mat-step-header.mat-warn .mat-step-icon-state-done,.mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header::before,.mat-horizontal-stepper-header::after,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header{height:72px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.mat-vertical-stepper-header{padding:24px 24px}.mat-stepper-vertical-line::before{top:-16px;bottom:-16px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header::after,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header::before{top:36px}.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.mat-sort-header-arrow{color:#757575}.mat-tab-nav-bar,.mat-tab-header{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-nav-bar,.mat-tab-group-inverted-header .mat-tab-header{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#3f51b5}.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ff4081}.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}.mat-tab-group.mat-background-primary>.mat-tab-header,.mat-tab-group.mat-background-primary>.mat-tab-link-container,.mat-tab-group.mat-background-primary>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination{background-color:#3f51b5}.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-primary>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}.mat-tab-group.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}.mat-tab-group.mat-background-accent>.mat-tab-header,.mat-tab-group.mat-background-accent>.mat-tab-link-container,.mat-tab-group.mat-background-accent>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination{background-color:#ff4081}.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-accent>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}.mat-tab-group.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn>.mat-tab-header,.mat-tab-group.mat-background-warn>.mat-tab-link-container,.mat-tab-group.mat-background-warn>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination{background-color:#f44336}.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-warn>.mat-tab-links .mat-focus-indicator::before,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-links .mat-focus-indicator::before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-focus-indicator::before{border-color:#fff}.mat-tab-group.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#3f51b5;color:#fff}.mat-toolbar.mat-accent{background:#ff4081;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-tree{background:#fff}.mat-tree-node,.mat-nested-tree-node{color:rgba(0,0,0,.87)}.mat-tree-node{min-height:48px}.mat-snack-bar-container{color:rgba(255,255,255,.7);background:#323232;box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2),0px 6px 10px 0px rgba(0, 0, 0, 0.14),0px 1px 18px 0px rgba(0, 0, 0, 0.12)}.mat-simple-snackbar-action{color:#ff4081}\n","/*\n\nDracula Theme v1.2.0\n\nhttps://github.com/zenorocha/dracula-theme\n\nCopyright 2015, All rights reserved\n\nCode licensed under the MIT license\nhttp://zenorocha.mit-license.org\n\n@author Éverton Ribeiro \n@author Zeno Rocha \n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #282a36;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-section,\n.hljs-link {\n color: #8be9fd;\n}\n\n.hljs-function .hljs-keyword {\n color: #ff79c6;\n}\n\n.hljs,\n.hljs-subst {\n color: #f8f8f2;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-name,\n.hljs-type,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n color: #f1fa8c;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion,\n.hljs-meta {\n color: #6272a4;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-title,\n.hljs-section,\n.hljs-doctag,\n.hljs-type,\n.hljs-name,\n.hljs-strong {\n font-weight: bold;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n"],"sourceRoot":"webpack:///"}
\ No newline at end of file
diff --git a/src/main/resources/static/vendor.js b/src/main/resources/static/vendor.js
new file mode 100644
index 0000000..dd3517e
--- /dev/null
+++ b/src/main/resources/static/vendor.js
@@ -0,0 +1,70463 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["vendor"],{
+
+/***/ "+rOU":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/portal.js ***!
+ \*******************************************************************/
+/*! exports provided: BasePortalHost, BasePortalOutlet, CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortal, DomPortalHost, DomPortalOutlet, Portal, PortalHostDirective, PortalInjector, PortalModule, TemplatePortal, TemplatePortalDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BasePortalHost", function() { return BasePortalHost; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BasePortalOutlet", function() { return BasePortalOutlet; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkPortal", function() { return CdkPortal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkPortalOutlet", function() { return CdkPortalOutlet; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentPortal", function() { return ComponentPortal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DomPortal", function() { return DomPortal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DomPortalHost", function() { return DomPortalHost; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DomPortalOutlet", function() { return DomPortalOutlet; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Portal", function() { return Portal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PortalHostDirective", function() { return PortalHostDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PortalInjector", function() { return PortalInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PortalModule", function() { return PortalModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplatePortal", function() { return TemplatePortal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplatePortalDirective", function() { return TemplatePortalDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common */ "ofXK");
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Throws an exception when attempting to attach a null portal to a host.
+ * @docs-private
+ */
+
+function throwNullPortalError() {
+ throw Error('Must provide a portal to attach');
+}
+/**
+ * Throws an exception when attempting to attach a portal to a host that is already attached.
+ * @docs-private
+ */
+function throwPortalAlreadyAttachedError() {
+ throw Error('Host already has a portal attached');
+}
+/**
+ * Throws an exception when attempting to attach a portal to an already-disposed host.
+ * @docs-private
+ */
+function throwPortalOutletAlreadyDisposedError() {
+ throw Error('This PortalOutlet has already been disposed');
+}
+/**
+ * Throws an exception when attempting to attach an unknown portal type.
+ * @docs-private
+ */
+function throwUnknownPortalTypeError() {
+ throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' +
+ 'a ComponentPortal or a TemplatePortal.');
+}
+/**
+ * Throws an exception when attempting to attach a portal to a null host.
+ * @docs-private
+ */
+function throwNullPortalOutletError() {
+ throw Error('Attempting to attach a portal to a null PortalOutlet');
+}
+/**
+ * Throws an exception when attempting to detach a portal that is not attached.
+ * @docs-private
+ */
+function throwNoPortalAttachedError() {
+ throw Error('Attempting to detach a portal that is not attached to a host');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A `Portal` is something that you want to render somewhere else.
+ * It can be attach to / detached from a `PortalOutlet`.
+ */
+class Portal {
+ /** Attach this portal to a host. */
+ attach(host) {
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ if (host == null) {
+ throwNullPortalOutletError();
+ }
+ if (host.hasAttached()) {
+ throwPortalAlreadyAttachedError();
+ }
+ }
+ this._attachedHost = host;
+ return host.attach(this);
+ }
+ /** Detach this portal from its host */
+ detach() {
+ let host = this._attachedHost;
+ if (host != null) {
+ this._attachedHost = null;
+ host.detach();
+ }
+ else if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ throwNoPortalAttachedError();
+ }
+ }
+ /** Whether this portal is attached to a host. */
+ get isAttached() {
+ return this._attachedHost != null;
+ }
+ /**
+ * Sets the PortalOutlet reference without performing `attach()`. This is used directly by
+ * the PortalOutlet when it is performing an `attach()` or `detach()`.
+ */
+ setAttachedHost(host) {
+ this._attachedHost = host;
+ }
+}
+/**
+ * A `ComponentPortal` is a portal that instantiates some Component upon attachment.
+ */
+class ComponentPortal extends Portal {
+ constructor(component, viewContainerRef, injector, componentFactoryResolver) {
+ super();
+ this.component = component;
+ this.viewContainerRef = viewContainerRef;
+ this.injector = injector;
+ this.componentFactoryResolver = componentFactoryResolver;
+ }
+}
+/**
+ * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).
+ */
+class TemplatePortal extends Portal {
+ constructor(template, viewContainerRef, context) {
+ super();
+ this.templateRef = template;
+ this.viewContainerRef = viewContainerRef;
+ this.context = context;
+ }
+ get origin() {
+ return this.templateRef.elementRef;
+ }
+ /**
+ * Attach the portal to the provided `PortalOutlet`.
+ * When a context is provided it will override the `context` property of the `TemplatePortal`
+ * instance.
+ */
+ attach(host, context = this.context) {
+ this.context = context;
+ return super.attach(host);
+ }
+ detach() {
+ this.context = undefined;
+ return super.detach();
+ }
+}
+/**
+ * A `DomPortal` is a portal whose DOM element will be taken from its current position
+ * in the DOM and moved into a portal outlet, when it is attached. On detach, the content
+ * will be restored to its original position.
+ */
+class DomPortal extends Portal {
+ constructor(element) {
+ super();
+ this.element = element instanceof _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] ? element.nativeElement : element;
+ }
+}
+/**
+ * Partial implementation of PortalOutlet that handles attaching
+ * ComponentPortal and TemplatePortal.
+ */
+class BasePortalOutlet {
+ constructor() {
+ /** Whether this host has already been permanently disposed. */
+ this._isDisposed = false;
+ // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.
+ this.attachDomPortal = null;
+ }
+ /** Whether this host has an attached portal. */
+ hasAttached() {
+ return !!this._attachedPortal;
+ }
+ /** Attaches a portal. */
+ attach(portal) {
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ if (!portal) {
+ throwNullPortalError();
+ }
+ if (this.hasAttached()) {
+ throwPortalAlreadyAttachedError();
+ }
+ if (this._isDisposed) {
+ throwPortalOutletAlreadyDisposedError();
+ }
+ }
+ if (portal instanceof ComponentPortal) {
+ this._attachedPortal = portal;
+ return this.attachComponentPortal(portal);
+ }
+ else if (portal instanceof TemplatePortal) {
+ this._attachedPortal = portal;
+ return this.attachTemplatePortal(portal);
+ // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.
+ }
+ else if (this.attachDomPortal && portal instanceof DomPortal) {
+ this._attachedPortal = portal;
+ return this.attachDomPortal(portal);
+ }
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ throwUnknownPortalTypeError();
+ }
+ }
+ /** Detaches a previously attached portal. */
+ detach() {
+ if (this._attachedPortal) {
+ this._attachedPortal.setAttachedHost(null);
+ this._attachedPortal = null;
+ }
+ this._invokeDisposeFn();
+ }
+ /** Permanently dispose of this portal host. */
+ dispose() {
+ if (this.hasAttached()) {
+ this.detach();
+ }
+ this._invokeDisposeFn();
+ this._isDisposed = true;
+ }
+ /** @docs-private */
+ setDisposeFn(fn) {
+ this._disposeFn = fn;
+ }
+ _invokeDisposeFn() {
+ if (this._disposeFn) {
+ this._disposeFn();
+ this._disposeFn = null;
+ }
+ }
+}
+/**
+ * @deprecated Use `BasePortalOutlet` instead.
+ * @breaking-change 9.0.0
+ */
+class BasePortalHost extends BasePortalOutlet {
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular
+ * application context.
+ */
+class DomPortalOutlet extends BasePortalOutlet {
+ constructor(
+ /** Element into which the content is projected. */
+ outletElement, _componentFactoryResolver, _appRef, _defaultInjector,
+ /**
+ * @deprecated `_document` Parameter to be made required.
+ * @breaking-change 10.0.0
+ */
+ _document) {
+ super();
+ this.outletElement = outletElement;
+ this._componentFactoryResolver = _componentFactoryResolver;
+ this._appRef = _appRef;
+ this._defaultInjector = _defaultInjector;
+ /**
+ * Attaches a DOM portal by transferring its content into the outlet.
+ * @param portal Portal to be attached.
+ * @deprecated To be turned into a method.
+ * @breaking-change 10.0.0
+ */
+ this.attachDomPortal = (portal) => {
+ // @breaking-change 10.0.0 Remove check and error once the
+ // `_document` constructor parameter is required.
+ if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('Cannot attach DOM portal without _document constructor parameter');
+ }
+ const element = portal.element;
+ if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('DOM portal content must be attached to a parent node.');
+ }
+ // Anchor used to save the element's previous position so
+ // that we can restore it when the portal is detached.
+ const anchorNode = this._document.createComment('dom-portal');
+ element.parentNode.insertBefore(anchorNode, element);
+ this.outletElement.appendChild(element);
+ this._attachedPortal = portal;
+ super.setDisposeFn(() => {
+ // We can't use `replaceWith` here because IE doesn't support it.
+ if (anchorNode.parentNode) {
+ anchorNode.parentNode.replaceChild(element, anchorNode);
+ }
+ });
+ };
+ this._document = _document;
+ }
+ /**
+ * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
+ * @param portal Portal to be attached
+ * @returns Reference to the created component.
+ */
+ attachComponentPortal(portal) {
+ const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;
+ const componentFactory = resolver.resolveComponentFactory(portal.component);
+ let componentRef;
+ // If the portal specifies a ViewContainerRef, we will use that as the attachment point
+ // for the component (in terms of Angular's component tree, not rendering).
+ // When the ViewContainerRef is missing, we use the factory to create the component directly
+ // and then manually attach the view to the application.
+ if (portal.viewContainerRef) {
+ componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.injector);
+ this.setDisposeFn(() => componentRef.destroy());
+ }
+ else {
+ componentRef = componentFactory.create(portal.injector || this._defaultInjector);
+ this._appRef.attachView(componentRef.hostView);
+ this.setDisposeFn(() => {
+ this._appRef.detachView(componentRef.hostView);
+ componentRef.destroy();
+ });
+ }
+ // At this point the component has been instantiated, so we move it to the location in the DOM
+ // where we want it to be rendered.
+ this.outletElement.appendChild(this._getComponentRootNode(componentRef));
+ this._attachedPortal = portal;
+ return componentRef;
+ }
+ /**
+ * Attaches a template portal to the DOM as an embedded view.
+ * @param portal Portal to be attached.
+ * @returns Reference to the created embedded view.
+ */
+ attachTemplatePortal(portal) {
+ let viewContainer = portal.viewContainerRef;
+ let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context);
+ // The method `createEmbeddedView` will add the view as a child of the viewContainer.
+ // But for the DomPortalOutlet the view can be added everywhere in the DOM
+ // (e.g Overlay Container) To move the view to the specified host element. We just
+ // re-append the existing root nodes.
+ viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));
+ // Note that we want to detect changes after the nodes have been moved so that
+ // any directives inside the portal that are looking at the DOM inside a lifecycle
+ // hook won't be invoked too early.
+ viewRef.detectChanges();
+ this.setDisposeFn((() => {
+ let index = viewContainer.indexOf(viewRef);
+ if (index !== -1) {
+ viewContainer.remove(index);
+ }
+ }));
+ this._attachedPortal = portal;
+ // TODO(jelbourn): Return locals from view.
+ return viewRef;
+ }
+ /**
+ * Clears out a portal from the DOM.
+ */
+ dispose() {
+ super.dispose();
+ if (this.outletElement.parentNode != null) {
+ this.outletElement.parentNode.removeChild(this.outletElement);
+ }
+ }
+ /** Gets the root HTMLElement for an instantiated component. */
+ _getComponentRootNode(componentRef) {
+ return componentRef.hostView.rootNodes[0];
+ }
+}
+/**
+ * @deprecated Use `DomPortalOutlet` instead.
+ * @breaking-change 9.0.0
+ */
+class DomPortalHost extends DomPortalOutlet {
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,
+ * the directive instance itself can be attached to a host, enabling declarative use of portals.
+ */
+class CdkPortal extends TemplatePortal {
+ constructor(templateRef, viewContainerRef) {
+ super(templateRef, viewContainerRef);
+ }
+}
+CdkPortal.ɵfac = function CdkPortal_Factory(t) { return new (t || CdkPortal)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"])); };
+CdkPortal.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkPortal, selectors: [["", "cdkPortal", ""]], exportAs: ["cdkPortal"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+CdkPortal.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkPortal, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkPortal]',
+ exportAs: 'cdkPortal'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }]; }, null); })();
+/**
+ * @deprecated Use `CdkPortal` instead.
+ * @breaking-change 9.0.0
+ */
+class TemplatePortalDirective extends CdkPortal {
+}
+TemplatePortalDirective.ɵfac = function TemplatePortalDirective_Factory(t) { return ɵTemplatePortalDirective_BaseFactory(t || TemplatePortalDirective); };
+TemplatePortalDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: TemplatePortalDirective, selectors: [["", "cdk-portal", ""], ["", "portal", ""]], exportAs: ["cdkPortal"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{
+ provide: CdkPortal,
+ useExisting: TemplatePortalDirective
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+const ɵTemplatePortalDirective_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](TemplatePortalDirective);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TemplatePortalDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdk-portal], [portal]',
+ exportAs: 'cdkPortal',
+ providers: [{
+ provide: CdkPortal,
+ useExisting: TemplatePortalDirective
+ }]
+ }]
+ }], null, null); })();
+/**
+ * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be
+ * directly attached to it, enabling declarative use.
+ *
+ * Usage:
+ * ``
+ */
+class CdkPortalOutlet extends BasePortalOutlet {
+ constructor(_componentFactoryResolver, _viewContainerRef,
+ /**
+ * @deprecated `_document` parameter to be made required.
+ * @breaking-change 9.0.0
+ */
+ _document) {
+ super();
+ this._componentFactoryResolver = _componentFactoryResolver;
+ this._viewContainerRef = _viewContainerRef;
+ /** Whether the portal component is initialized. */
+ this._isInitialized = false;
+ /** Emits when a portal is attached to the outlet. */
+ this.attached = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /**
+ * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.
+ * @param portal Portal to be attached.
+ * @deprecated To be turned into a method.
+ * @breaking-change 10.0.0
+ */
+ this.attachDomPortal = (portal) => {
+ // @breaking-change 9.0.0 Remove check and error once the
+ // `_document` constructor parameter is required.
+ if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('Cannot attach DOM portal without _document constructor parameter');
+ }
+ const element = portal.element;
+ if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('DOM portal content must be attached to a parent node.');
+ }
+ // Anchor used to save the element's previous position so
+ // that we can restore it when the portal is detached.
+ const anchorNode = this._document.createComment('dom-portal');
+ portal.setAttachedHost(this);
+ element.parentNode.insertBefore(anchorNode, element);
+ this._getRootNode().appendChild(element);
+ this._attachedPortal = portal;
+ super.setDisposeFn(() => {
+ if (anchorNode.parentNode) {
+ anchorNode.parentNode.replaceChild(element, anchorNode);
+ }
+ });
+ };
+ this._document = _document;
+ }
+ /** Portal associated with the Portal outlet. */
+ get portal() {
+ return this._attachedPortal;
+ }
+ set portal(portal) {
+ // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have
+ // run. This handles the cases where the user might do something like `
`
+ // and attach a portal programmatically in the parent component. When Angular does the first CD
+ // round, it will fire the setter with empty string, causing the user's content to be cleared.
+ if (this.hasAttached() && !portal && !this._isInitialized) {
+ return;
+ }
+ if (this.hasAttached()) {
+ super.detach();
+ }
+ if (portal) {
+ super.attach(portal);
+ }
+ this._attachedPortal = portal;
+ }
+ /** Component or view reference that is attached to the portal. */
+ get attachedRef() {
+ return this._attachedRef;
+ }
+ ngOnInit() {
+ this._isInitialized = true;
+ }
+ ngOnDestroy() {
+ super.dispose();
+ this._attachedPortal = null;
+ this._attachedRef = null;
+ }
+ /**
+ * Attach the given ComponentPortal to this PortalOutlet using the ComponentFactoryResolver.
+ *
+ * @param portal Portal to be attached to the portal outlet.
+ * @returns Reference to the created component.
+ */
+ attachComponentPortal(portal) {
+ portal.setAttachedHost(this);
+ // If the portal specifies an origin, use that as the logical location of the component
+ // in the application tree. Otherwise use the location of this PortalOutlet.
+ const viewContainerRef = portal.viewContainerRef != null ?
+ portal.viewContainerRef :
+ this._viewContainerRef;
+ const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;
+ const componentFactory = resolver.resolveComponentFactory(portal.component);
+ const ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector);
+ // If we're using a view container that's different from the injected one (e.g. when the portal
+ // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered
+ // inside of the alternate view container.
+ if (viewContainerRef !== this._viewContainerRef) {
+ this._getRootNode().appendChild(ref.hostView.rootNodes[0]);
+ }
+ super.setDisposeFn(() => ref.destroy());
+ this._attachedPortal = portal;
+ this._attachedRef = ref;
+ this.attached.emit(ref);
+ return ref;
+ }
+ /**
+ * Attach the given TemplatePortal to this PortalHost as an embedded View.
+ * @param portal Portal to be attached.
+ * @returns Reference to the created embedded view.
+ */
+ attachTemplatePortal(portal) {
+ portal.setAttachedHost(this);
+ const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context);
+ super.setDisposeFn(() => this._viewContainerRef.clear());
+ this._attachedPortal = portal;
+ this._attachedRef = viewRef;
+ this.attached.emit(viewRef);
+ return viewRef;
+ }
+ /** Gets the root node of the portal outlet. */
+ _getRootNode() {
+ const nativeElement = this._viewContainerRef.element.nativeElement;
+ // The directive could be set on a template which will result in a comment
+ // node being the root. Use the comment's parent node if that is the case.
+ return (nativeElement.nodeType === nativeElement.ELEMENT_NODE ?
+ nativeElement : nativeElement.parentNode);
+ }
+}
+CdkPortalOutlet.ɵfac = function CdkPortalOutlet_Factory(t) { return new (t || CdkPortalOutlet)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"])); };
+CdkPortalOutlet.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkPortalOutlet, selectors: [["", "cdkPortalOutlet", ""]], inputs: { portal: ["cdkPortalOutlet", "portal"] }, outputs: { attached: "attached" }, exportAs: ["cdkPortalOutlet"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+CdkPortalOutlet.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"],] }] }
+];
+CdkPortalOutlet.propDecorators = {
+ attached: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkPortalOutlet, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkPortalOutlet]',
+ exportAs: 'cdkPortalOutlet',
+ inputs: ['portal: cdkPortalOutlet']
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]]
+ }] }]; }, { attached: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+/**
+ * @deprecated Use `CdkPortalOutlet` instead.
+ * @breaking-change 9.0.0
+ */
+class PortalHostDirective extends CdkPortalOutlet {
+}
+PortalHostDirective.ɵfac = function PortalHostDirective_Factory(t) { return ɵPortalHostDirective_BaseFactory(t || PortalHostDirective); };
+PortalHostDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PortalHostDirective, selectors: [["", "cdkPortalHost", ""], ["", "portalHost", ""]], inputs: { portal: ["cdkPortalHost", "portal"] }, exportAs: ["cdkPortalHost"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{
+ provide: CdkPortalOutlet,
+ useExisting: PortalHostDirective
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+const ɵPortalHostDirective_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](PortalHostDirective);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PortalHostDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkPortalHost], [portalHost]',
+ exportAs: 'cdkPortalHost',
+ inputs: ['portal: cdkPortalHost'],
+ providers: [{
+ provide: CdkPortalOutlet,
+ useExisting: PortalHostDirective
+ }]
+ }]
+ }], null, null); })();
+class PortalModule {
+}
+PortalModule.ɵfac = function PortalModule_Factory(t) { return new (t || PortalModule)(); };
+PortalModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: PortalModule });
+PortalModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({});
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](PortalModule, { declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective], exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PortalModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective],
+ declarations: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Custom injector to be used when providing custom
+ * injection tokens to components inside a portal.
+ * @docs-private
+ * @deprecated Use `Injector.create` instead.
+ * @breaking-change 11.0.0
+ */
+class PortalInjector {
+ constructor(_parentInjector, _customTokens) {
+ this._parentInjector = _parentInjector;
+ this._customTokens = _customTokens;
+ }
+ get(token, notFoundValue) {
+ const value = this._customTokens.get(token);
+ if (typeof value !== 'undefined') {
+ return value;
+ }
+ return this._parentInjector.get(token, notFoundValue);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=portal.js.map
+
+/***/ }),
+
+/***/ "/d8p":
+/*!*****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/repeat.js ***!
+ \*****************************************************************/
+/*! exports provided: repeat */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../observable/empty */ "EY2u");
+
+
+function repeat(count = -1) {
+ return (source) => {
+ if (count === 0) {
+ return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_1__["empty"])();
+ }
+ else if (count < 0) {
+ return source.lift(new RepeatOperator(-1, source));
+ }
+ else {
+ return source.lift(new RepeatOperator(count - 1, source));
+ }
+ };
+}
+class RepeatOperator {
+ constructor(count, source) {
+ this.count = count;
+ this.source = source;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
+ }
+}
+class RepeatSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, count, source) {
+ super(destination);
+ this.count = count;
+ this.source = source;
+ }
+ complete() {
+ if (!this.isStopped) {
+ const { source, count } = this;
+ if (count === 0) {
+ return super.complete();
+ }
+ else if (count > -1) {
+ this.count = count - 1;
+ }
+ source.subscribe(this._unsubscribeAndRecycle());
+ }
+ }
+}
+//# sourceMappingURL=repeat.js.map
+
+/***/ }),
+
+/***/ "/t3+":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@angular/material/__ivy_ngcc__/fesm2015/toolbar.js ***!
+ \*************************************************************************/
+/*! exports provided: MatToolbar, MatToolbarModule, MatToolbarRow, throwToolbarMixedModesError */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatToolbar", function() { return MatToolbar; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatToolbarModule", function() { return MatToolbarModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatToolbarRow", function() { return MatToolbarRow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwToolbarMixedModesError", function() { return throwToolbarMixedModesError; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_material_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/material/core */ "FKr1");
+/* harmony import */ var _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/cdk/platform */ "nLfN");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "ofXK");
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Boilerplate for applying mixins to MatToolbar.
+/** @docs-private */
+
+
+
+const _c0 = ["*", [["mat-toolbar-row"]]];
+const _c1 = ["*", "mat-toolbar-row"];
+class MatToolbarBase {
+ constructor(_elementRef) {
+ this._elementRef = _elementRef;
+ }
+}
+const _MatToolbarMixinBase = Object(_angular_material_core__WEBPACK_IMPORTED_MODULE_1__["mixinColor"])(MatToolbarBase);
+class MatToolbarRow {
+}
+MatToolbarRow.ɵfac = function MatToolbarRow_Factory(t) { return new (t || MatToolbarRow)(); };
+MatToolbarRow.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: MatToolbarRow, selectors: [["mat-toolbar-row"]], hostAttrs: [1, "mat-toolbar-row"], exportAs: ["matToolbarRow"] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatToolbarRow, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: 'mat-toolbar-row',
+ exportAs: 'matToolbarRow',
+ host: { 'class': 'mat-toolbar-row' }
+ }]
+ }], null, null); })();
+class MatToolbar extends _MatToolbarMixinBase {
+ constructor(elementRef, _platform, document) {
+ super(elementRef);
+ this._platform = _platform;
+ // TODO: make the document a required param when doing breaking changes.
+ this._document = document;
+ }
+ ngAfterViewInit() {
+ if (this._platform.isBrowser) {
+ this._checkToolbarMixedModes();
+ this._toolbarRows.changes.subscribe(() => this._checkToolbarMixedModes());
+ }
+ }
+ /**
+ * Throws an exception when developers are attempting to combine the different toolbar row modes.
+ */
+ _checkToolbarMixedModes() {
+ if (this._toolbarRows.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ // Check if there are any other DOM nodes that can display content but aren't inside of
+ // a element.
+ const isCombinedUsage = Array.from(this._elementRef.nativeElement.childNodes)
+ .filter(node => !(node.classList && node.classList.contains('mat-toolbar-row')))
+ .filter(node => node.nodeType !== (this._document ? this._document.COMMENT_NODE : 8))
+ .some(node => !!(node.textContent && node.textContent.trim()));
+ if (isCombinedUsage) {
+ throwToolbarMixedModesError();
+ }
+ }
+ }
+}
+MatToolbar.ɵfac = function MatToolbar_Factory(t) { return new (t || MatToolbar)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_2__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_3__["DOCUMENT"])); };
+MatToolbar.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: MatToolbar, selectors: [["mat-toolbar"]], contentQueries: function MatToolbar_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵcontentQuery"](dirIndex, MatToolbarRow, 1);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx._toolbarRows = _t);
+ } }, hostAttrs: [1, "mat-toolbar"], hostVars: 4, hostBindings: function MatToolbar_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("mat-toolbar-multiple-rows", ctx._toolbarRows.length > 0)("mat-toolbar-single-row", ctx._toolbarRows.length === 0);
+ } }, inputs: { color: "color" }, exportAs: ["matToolbar"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], ngContentSelectors: _c1, decls: 2, vars: 0, template: function MatToolbar_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojectionDef"](_c0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](1, 1);
+ } }, styles: [".cdk-high-contrast-active .mat-toolbar{outline:solid 1px}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}\n"], encapsulation: 2, changeDetection: 0 });
+MatToolbar.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_2__["Platform"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_3__["DOCUMENT"],] }] }
+];
+MatToolbar.propDecorators = {
+ _toolbarRows: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"], args: [MatToolbarRow, { descendants: true },] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatToolbar, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'mat-toolbar',
+ exportAs: 'matToolbar',
+ template: "\n\n",
+ inputs: ['color'],
+ host: {
+ 'class': 'mat-toolbar',
+ '[class.mat-toolbar-multiple-rows]': '_toolbarRows.length > 0',
+ '[class.mat-toolbar-single-row]': '_toolbarRows.length === 0'
+ },
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectionStrategy"].OnPush,
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewEncapsulation"].None,
+ styles: [".cdk-high-contrast-active .mat-toolbar{outline:solid 1px}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}\n"]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_2__["Platform"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_3__["DOCUMENT"]]
+ }] }]; }, { _toolbarRows: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"],
+ args: [MatToolbarRow, { descendants: true }]
+ }] }); })();
+/**
+ * Throws an exception when attempting to combine the different toolbar row modes.
+ * @docs-private
+ */
+function throwToolbarMixedModesError() {
+ throw Error('MatToolbar: Attempting to combine different toolbar modes. ' +
+ 'Either specify multiple `` elements explicitly or just place content ' +
+ 'inside of a `` for a single row.');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class MatToolbarModule {
+}
+MatToolbarModule.ɵfac = function MatToolbarModule_Factory(t) { return new (t || MatToolbarModule)(); };
+MatToolbarModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatToolbarModule });
+MatToolbarModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ imports: [[_angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]], _angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatToolbarModule, { declarations: function () { return [MatToolbar, MatToolbarRow]; }, imports: function () { return [_angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]]; }, exports: function () { return [MatToolbar, MatToolbarRow, _angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatToolbarModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [_angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]],
+ exports: [MatToolbar, MatToolbarRow, _angular_material_core__WEBPACK_IMPORTED_MODULE_1__["MatCommonModule"]],
+ declarations: [MatToolbar, MatToolbarRow]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=toolbar.js.map
+
+/***/ }),
+
+/***/ "/uUt":
+/*!*******************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js ***!
+ \*******************************************************************************/
+/*! exports provided: distinctUntilChanged */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function distinctUntilChanged(compare, keySelector) {
+ return (source) => source.lift(new DistinctUntilChangedOperator(compare, keySelector));
+}
+class DistinctUntilChangedOperator {
+ constructor(compare, keySelector) {
+ this.compare = compare;
+ this.keySelector = keySelector;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
+ }
+}
+class DistinctUntilChangedSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, compare, keySelector) {
+ super(destination);
+ this.keySelector = keySelector;
+ this.hasKey = false;
+ if (typeof compare === 'function') {
+ this.compare = compare;
+ }
+ }
+ compare(x, y) {
+ return x === y;
+ }
+ _next(value) {
+ let key;
+ try {
+ const { keySelector } = this;
+ key = keySelector ? keySelector(value) : value;
+ }
+ catch (err) {
+ return this.destination.error(err);
+ }
+ let result = false;
+ if (this.hasKey) {
+ try {
+ const { compare } = this;
+ result = compare(this.key, key);
+ }
+ catch (err) {
+ return this.destination.error(err);
+ }
+ }
+ else {
+ this.hasKey = true;
+ }
+ if (!result) {
+ this.key = key;
+ this.destination.next(value);
+ }
+ }
+}
+//# sourceMappingURL=distinctUntilChanged.js.map
+
+/***/ }),
+
+/***/ "02Lk":
+/*!*******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/distinct.js ***!
+ \*******************************************************************/
+/*! exports provided: distinct, DistinctSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; });
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+function distinct(keySelector, flushes) {
+ return (source) => source.lift(new DistinctOperator(keySelector, flushes));
+}
+class DistinctOperator {
+ constructor(keySelector, flushes) {
+ this.keySelector = keySelector;
+ this.flushes = flushes;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
+ }
+}
+class DistinctSubscriber extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleOuterSubscriber"] {
+ constructor(destination, keySelector, flushes) {
+ super(destination);
+ this.keySelector = keySelector;
+ this.values = new Set();
+ if (flushes) {
+ this.add(Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["innerSubscribe"])(flushes, new _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleInnerSubscriber"](this)));
+ }
+ }
+ notifyNext() {
+ this.values.clear();
+ }
+ notifyError(error) {
+ this._error(error);
+ }
+ _next(value) {
+ if (this.keySelector) {
+ this._useKeySelector(value);
+ }
+ else {
+ this._finalizeNext(value, value);
+ }
+ }
+ _useKeySelector(value) {
+ let key;
+ const { destination } = this;
+ try {
+ key = this.keySelector(value);
+ }
+ catch (err) {
+ destination.error(err);
+ return;
+ }
+ this._finalizeNext(key, value);
+ }
+ _finalizeNext(key, value) {
+ const { values } = this;
+ if (!values.has(key)) {
+ values.add(key);
+ this.destination.next(value);
+ }
+ }
+}
+//# sourceMappingURL=distinct.js.map
+
+/***/ }),
+
+/***/ "04ZW":
+/*!****************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js ***!
+ \****************************************************************************/
+/*! exports provided: fromEventPattern */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/isArray */ "DH7j");
+/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/isFunction */ "n6bG");
+/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../operators/map */ "lJxs");
+
+
+
+
+function fromEventPattern(addHandler, removeHandler, resultSelector) {
+ if (resultSelector) {
+ return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(args => Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector(...args) : resultSelector(args)));
+ }
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => {
+ const handler = (...e) => subscriber.next(e.length === 1 ? e[0] : e);
+ let retValue;
+ try {
+ retValue = addHandler(handler);
+ }
+ catch (err) {
+ subscriber.error(err);
+ return undefined;
+ }
+ if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) {
+ return undefined;
+ }
+ return () => removeHandler(handler, retValue);
+ });
+}
+//# sourceMappingURL=fromEventPattern.js.map
+
+/***/ }),
+
+/***/ "05l1":
+/*!************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/publishReplay.js ***!
+ \************************************************************************/
+/*! exports provided: publishReplay */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; });
+/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ReplaySubject */ "jtHE");
+/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./multicast */ "oB13");
+
+
+function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
+ if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
+ scheduler = selectorOrScheduler;
+ }
+ const selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
+ const subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler);
+ return (source) => Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(() => subject, selector)(source);
+}
+//# sourceMappingURL=publishReplay.js.map
+
+/***/ }),
+
+/***/ "0EQZ":
+/*!************************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/collections.js ***!
+ \************************************************************************/
+/*! exports provided: ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, getMultipleValuesInSingleSelectionError, isDataSource */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArrayDataSource", function() { return ArrayDataSource; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataSource", function() { return DataSource; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionModel", function() { return SelectionModel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UniqueSelectionDispatcher", function() { return UniqueSelectionDispatcher; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_DisposeViewRepeaterStrategy", function() { return _DisposeViewRepeaterStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_RecycleViewRepeaterStrategy", function() { return _RecycleViewRepeaterStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_VIEW_REPEATER_STRATEGY", function() { return _VIEW_REPEATER_STRATEGY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMultipleValuesInSingleSelectionError", function() { return getMultipleValuesInSingleSelectionError; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDataSource", function() { return isDataSource; });
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ "qCKp");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "fXoL");
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+class DataSource {
+}
+/** Checks whether an object is a data source. */
+function isDataSource(value) {
+ // Check if the value is a DataSource by observing if it has a connect function. Cannot
+ // be checked as an `instanceof DataSource` since people could create their own sources
+ // that match the interface, but don't extend DataSource.
+ return value && typeof value.connect === 'function';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** DataSource wrapper for a native array. */
+class ArrayDataSource extends DataSource {
+ constructor(_data) {
+ super();
+ this._data = _data;
+ }
+ connect() {
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_0__["isObservable"])(this._data) ? this._data : Object(rxjs__WEBPACK_IMPORTED_MODULE_0__["of"])(this._data);
+ }
+ disconnect() { }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A repeater that destroys views when they are removed from a
+ * {@link ViewContainerRef}. When new items are inserted into the container,
+ * the repeater will always construct a new embedded view for each item.
+ *
+ * @template T The type for the embedded view's $implicit property.
+ * @template R The type for the item in each IterableDiffer change record.
+ * @template C The type for the context passed to each embedded view.
+ */
+class _DisposeViewRepeaterStrategy {
+ applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {
+ changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {
+ let view;
+ let operation;
+ if (record.previousIndex == null) {
+ const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);
+ view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);
+ operation = 1 /* INSERTED */;
+ }
+ else if (currentIndex == null) {
+ viewContainerRef.remove(adjustedPreviousIndex);
+ operation = 3 /* REMOVED */;
+ }
+ else {
+ view = viewContainerRef.get(adjustedPreviousIndex);
+ viewContainerRef.move(view, currentIndex);
+ operation = 2 /* MOVED */;
+ }
+ if (itemViewChanged) {
+ itemViewChanged({
+ context: view === null || view === void 0 ? void 0 : view.context,
+ operation,
+ record,
+ });
+ }
+ });
+ }
+ detach() {
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A repeater that caches views when they are removed from a
+ * {@link ViewContainerRef}. When new items are inserted into the container,
+ * the repeater will reuse one of the cached views instead of creating a new
+ * embedded view. Recycling cached views reduces the quantity of expensive DOM
+ * inserts.
+ *
+ * @template T The type for the embedded view's $implicit property.
+ * @template R The type for the item in each IterableDiffer change record.
+ * @template C The type for the context passed to each embedded view.
+ */
+class _RecycleViewRepeaterStrategy {
+ constructor() {
+ /**
+ * The size of the cache used to store unused views.
+ * Setting the cache size to `0` will disable caching. Defaults to 20 views.
+ */
+ this.viewCacheSize = 20;
+ /**
+ * View cache that stores embedded view instances that have been previously stamped out,
+ * but don't are not currently rendered. The view repeater will reuse these views rather than
+ * creating brand new ones.
+ *
+ * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.
+ */
+ this._viewCache = [];
+ }
+ /** Apply changes to the DOM. */
+ applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {
+ // Rearrange the views to put them in the right location.
+ changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {
+ let view;
+ let operation;
+ if (record.previousIndex == null) { // Item added.
+ const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);
+ view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));
+ operation = view ? 1 /* INSERTED */ : 0 /* REPLACED */;
+ }
+ else if (currentIndex == null) { // Item removed.
+ this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);
+ operation = 3 /* REMOVED */;
+ }
+ else { // Item moved.
+ view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));
+ operation = 2 /* MOVED */;
+ }
+ if (itemViewChanged) {
+ itemViewChanged({
+ context: view === null || view === void 0 ? void 0 : view.context,
+ operation,
+ record,
+ });
+ }
+ });
+ }
+ detach() {
+ for (const view of this._viewCache) {
+ view.destroy();
+ }
+ this._viewCache = [];
+ }
+ /**
+ * Inserts a view for a new item, either from the cache or by creating a new
+ * one. Returns `undefined` if the item was inserted into a cached view.
+ */
+ _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {
+ const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);
+ if (cachedView) {
+ cachedView.context.$implicit = value;
+ return undefined;
+ }
+ const viewArgs = viewArgsFactory();
+ return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);
+ }
+ /** Detaches the view at the given index and inserts into the view cache. */
+ _detachAndCacheView(index, viewContainerRef) {
+ const detachedView = viewContainerRef.detach(index);
+ this._maybeCacheView(detachedView, viewContainerRef);
+ }
+ /** Moves view at the previous index to the current index. */
+ _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {
+ const view = viewContainerRef.get(adjustedPreviousIndex);
+ viewContainerRef.move(view, currentIndex);
+ view.context.$implicit = value;
+ return view;
+ }
+ /**
+ * Cache the given detached view. If the cache is full, the view will be
+ * destroyed.
+ */
+ _maybeCacheView(view, viewContainerRef) {
+ if (this._viewCache.length < this.viewCacheSize) {
+ this._viewCache.push(view);
+ }
+ else {
+ const index = viewContainerRef.indexOf(view);
+ // The host component could remove views from the container outside of
+ // the view repeater. It's unlikely this will occur, but just in case,
+ // destroy the view on its own, otherwise destroy it through the
+ // container to ensure that all the references are removed.
+ if (index === -1) {
+ view.destroy();
+ }
+ else {
+ viewContainerRef.remove(index);
+ }
+ }
+ }
+ /** Inserts a recycled view from the cache at the given index. */
+ _insertViewFromCache(index, viewContainerRef) {
+ const cachedView = this._viewCache.pop();
+ if (cachedView) {
+ viewContainerRef.insert(cachedView, index);
+ }
+ return cachedView || null;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class to be used to power selecting one or more options from a list.
+ */
+class SelectionModel {
+ constructor(_multiple = false, initiallySelectedValues, _emitChanges = true) {
+ this._multiple = _multiple;
+ this._emitChanges = _emitChanges;
+ /** Currently-selected values. */
+ this._selection = new Set();
+ /** Keeps track of the deselected options that haven't been emitted by the change event. */
+ this._deselectedToEmit = [];
+ /** Keeps track of the selected options that haven't been emitted by the change event. */
+ this._selectedToEmit = [];
+ /** Event emitted when the value has changed. */
+ this.changed = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ if (initiallySelectedValues && initiallySelectedValues.length) {
+ if (_multiple) {
+ initiallySelectedValues.forEach(value => this._markSelected(value));
+ }
+ else {
+ this._markSelected(initiallySelectedValues[0]);
+ }
+ // Clear the array in order to avoid firing the change event for preselected values.
+ this._selectedToEmit.length = 0;
+ }
+ }
+ /** Selected values. */
+ get selected() {
+ if (!this._selected) {
+ this._selected = Array.from(this._selection.values());
+ }
+ return this._selected;
+ }
+ /**
+ * Selects a value or an array of values.
+ */
+ select(...values) {
+ this._verifyValueAssignment(values);
+ values.forEach(value => this._markSelected(value));
+ this._emitChangeEvent();
+ }
+ /**
+ * Deselects a value or an array of values.
+ */
+ deselect(...values) {
+ this._verifyValueAssignment(values);
+ values.forEach(value => this._unmarkSelected(value));
+ this._emitChangeEvent();
+ }
+ /**
+ * Toggles a value between selected and deselected.
+ */
+ toggle(value) {
+ this.isSelected(value) ? this.deselect(value) : this.select(value);
+ }
+ /**
+ * Clears all of the selected values.
+ */
+ clear() {
+ this._unmarkAll();
+ this._emitChangeEvent();
+ }
+ /**
+ * Determines whether a value is selected.
+ */
+ isSelected(value) {
+ return this._selection.has(value);
+ }
+ /**
+ * Determines whether the model does not have a value.
+ */
+ isEmpty() {
+ return this._selection.size === 0;
+ }
+ /**
+ * Determines whether the model has a value.
+ */
+ hasValue() {
+ return !this.isEmpty();
+ }
+ /**
+ * Sorts the selected values based on a predicate function.
+ */
+ sort(predicate) {
+ if (this._multiple && this.selected) {
+ this._selected.sort(predicate);
+ }
+ }
+ /**
+ * Gets whether multiple values can be selected.
+ */
+ isMultipleSelection() {
+ return this._multiple;
+ }
+ /** Emits a change event and clears the records of selected and deselected values. */
+ _emitChangeEvent() {
+ // Clear the selected values so they can be re-cached.
+ this._selected = null;
+ if (this._selectedToEmit.length || this._deselectedToEmit.length) {
+ this.changed.next({
+ source: this,
+ added: this._selectedToEmit,
+ removed: this._deselectedToEmit
+ });
+ this._deselectedToEmit = [];
+ this._selectedToEmit = [];
+ }
+ }
+ /** Selects a value. */
+ _markSelected(value) {
+ if (!this.isSelected(value)) {
+ if (!this._multiple) {
+ this._unmarkAll();
+ }
+ this._selection.add(value);
+ if (this._emitChanges) {
+ this._selectedToEmit.push(value);
+ }
+ }
+ }
+ /** Deselects a value. */
+ _unmarkSelected(value) {
+ if (this.isSelected(value)) {
+ this._selection.delete(value);
+ if (this._emitChanges) {
+ this._deselectedToEmit.push(value);
+ }
+ }
+ }
+ /** Clears out the selected values. */
+ _unmarkAll() {
+ if (!this.isEmpty()) {
+ this._selection.forEach(value => this._unmarkSelected(value));
+ }
+ }
+ /**
+ * Verifies the value assignment and throws an error if the specified value array is
+ * including multiple values while the selection model is not supporting multiple values.
+ */
+ _verifyValueAssignment(values) {
+ if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw getMultipleValuesInSingleSelectionError();
+ }
+ }
+}
+/**
+ * Returns an error that reports that multiple values are passed into a selection model
+ * with a single value.
+ * @docs-private
+ */
+function getMultipleValuesInSingleSelectionError() {
+ return Error('Cannot pass multiple values into SelectionModel with single-value mode.');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class to coordinate unique selection based on name.
+ * Intended to be consumed as an Angular service.
+ * This service is needed because native radio change events are only fired on the item currently
+ * being selected, and we still need to uncheck the previous selection.
+ *
+ * This service does not *store* any IDs and names because they may change at any time, so it is
+ * less error-prone if they are simply passed through when the events occur.
+ */
+class UniqueSelectionDispatcher {
+ constructor() {
+ this._listeners = [];
+ }
+ /**
+ * Notify other items that selection for the given name has been set.
+ * @param id ID of the item.
+ * @param name Name of the item.
+ */
+ notify(id, name) {
+ for (let listener of this._listeners) {
+ listener(id, name);
+ }
+ }
+ /**
+ * Listen for future changes to item selection.
+ * @return Function used to deregister listener
+ */
+ listen(listener) {
+ this._listeners.push(listener);
+ return () => {
+ this._listeners = this._listeners.filter((registered) => {
+ return listener !== registered;
+ });
+ };
+ }
+ ngOnDestroy() {
+ this._listeners = [];
+ }
+}
+UniqueSelectionDispatcher.ɵfac = function UniqueSelectionDispatcher_Factory(t) { return new (t || UniqueSelectionDispatcher)(); };
+UniqueSelectionDispatcher.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function UniqueSelectionDispatcher_Factory() { return new UniqueSelectionDispatcher(); }, token: UniqueSelectionDispatcher, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](UniqueSelectionDispatcher, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return []; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.
+ * @docs-private
+ */
+const _VIEW_REPEATER_STRATEGY = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('_ViewRepeater');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=collections.js.map
+
+/***/ }),
+
+/***/ "0EUg":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/concatAll.js ***!
+ \********************************************************************/
+/*! exports provided: concatAll */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; });
+/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mergeAll */ "bHdf");
+
+function concatAll() {
+ return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1);
+}
+//# sourceMappingURL=concatAll.js.map
+
+/***/ }),
+
+/***/ "0Pi8":
+/*!******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/endWith.js ***!
+ \******************************************************************/
+/*! exports provided: endWith */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; });
+/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../observable/concat */ "GyhO");
+/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../observable/of */ "LRne");
+
+
+function endWith(...array) {
+ return (source) => Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(...array));
+}
+//# sourceMappingURL=endWith.js.map
+
+/***/ }),
+
+/***/ "128B":
+/*!*****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/reduce.js ***!
+ \*****************************************************************/
+/*! exports provided: reduce */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; });
+/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scan */ "Kqap");
+/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./takeLast */ "BFxc");
+/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultIfEmpty */ "xbPD");
+/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/pipe */ "mCNh");
+
+
+
+
+function reduce(accumulator, seed) {
+ if (arguments.length >= 2) {
+ return function reduceOperatorFunctionWithSeed(source) {
+ return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source);
+ };
+ }
+ return function reduceOperatorFunction(source) {
+ return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])((acc, value, index) => accumulator(acc, value, index + 1)), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source);
+ };
+}
+//# sourceMappingURL=reduce.js.map
+
+/***/ }),
+
+/***/ "1G5W":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/takeUntil.js ***!
+ \********************************************************************/
+/*! exports provided: takeUntil */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; });
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+function takeUntil(notifier) {
+ return (source) => source.lift(new TakeUntilOperator(notifier));
+}
+class TakeUntilOperator {
+ constructor(notifier) {
+ this.notifier = notifier;
+ }
+ call(subscriber, source) {
+ const takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
+ const notifierSubscription = Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["innerSubscribe"])(this.notifier, new _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleInnerSubscriber"](takeUntilSubscriber));
+ if (notifierSubscription && !takeUntilSubscriber.seenValue) {
+ takeUntilSubscriber.add(notifierSubscription);
+ return source.subscribe(takeUntilSubscriber);
+ }
+ return takeUntilSubscriber;
+ }
+}
+class TakeUntilSubscriber extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleOuterSubscriber"] {
+ constructor(destination) {
+ super(destination);
+ this.seenValue = false;
+ }
+ notifyNext() {
+ this.seenValue = true;
+ this.complete();
+ }
+ notifyComplete() {
+ }
+}
+//# sourceMappingURL=takeUntil.js.map
+
+/***/ }),
+
+/***/ "1Ykd":
+/*!*********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/sampleTime.js ***!
+ \*********************************************************************/
+/*! exports provided: sampleTime */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scheduler/async */ "D0XW");
+
+
+function sampleTime(period, scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]) {
+ return (source) => source.lift(new SampleTimeOperator(period, scheduler));
+}
+class SampleTimeOperator {
+ constructor(period, scheduler) {
+ this.period = period;
+ this.scheduler = scheduler;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
+ }
+}
+class SampleTimeSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, period, scheduler) {
+ super(destination);
+ this.period = period;
+ this.scheduler = scheduler;
+ this.hasValue = false;
+ this.add(scheduler.schedule(dispatchNotification, period, { subscriber: this, period }));
+ }
+ _next(value) {
+ this.lastValue = value;
+ this.hasValue = true;
+ }
+ notifyNext() {
+ if (this.hasValue) {
+ this.hasValue = false;
+ this.destination.next(this.lastValue);
+ }
+ }
+}
+function dispatchNotification(state) {
+ let { subscriber, period } = state;
+ subscriber.notifyNext();
+ this.schedule(state, period);
+}
+//# sourceMappingURL=sampleTime.js.map
+
+/***/ }),
+
+/***/ "1uah":
+/*!***************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/zip.js ***!
+ \***************************************************************/
+/*! exports provided: zip, ZipOperator, ZipSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; });
+/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fromArray */ "yCtX");
+/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/isArray */ "DH7j");
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../internal/symbol/iterator */ "Lhse");
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+
+
+
+
+function zip(...observables) {
+ const resultSelector = observables[observables.length - 1];
+ if (typeof resultSelector === 'function') {
+ observables.pop();
+ }
+ return Object(_fromArray__WEBPACK_IMPORTED_MODULE_0__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector));
+}
+class ZipOperator {
+ constructor(resultSelector) {
+ this.resultSelector = resultSelector;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
+ }
+}
+class ZipSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"] {
+ constructor(destination, resultSelector, values = Object.create(null)) {
+ super(destination);
+ this.resultSelector = resultSelector;
+ this.iterators = [];
+ this.active = 0;
+ this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : undefined;
+ }
+ _next(value) {
+ const iterators = this.iterators;
+ if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(value)) {
+ iterators.push(new StaticArrayIterator(value));
+ }
+ else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_3__["iterator"]] === 'function') {
+ iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_3__["iterator"]]()));
+ }
+ else {
+ iterators.push(new ZipBufferIterator(this.destination, this, value));
+ }
+ }
+ _complete() {
+ const iterators = this.iterators;
+ const len = iterators.length;
+ this.unsubscribe();
+ if (len === 0) {
+ this.destination.complete();
+ return;
+ }
+ this.active = len;
+ for (let i = 0; i < len; i++) {
+ let iterator = iterators[i];
+ if (iterator.stillUnsubscribed) {
+ const destination = this.destination;
+ destination.add(iterator.subscribe());
+ }
+ else {
+ this.active--;
+ }
+ }
+ }
+ notifyInactive() {
+ this.active--;
+ if (this.active === 0) {
+ this.destination.complete();
+ }
+ }
+ checkIterators() {
+ const iterators = this.iterators;
+ const len = iterators.length;
+ const destination = this.destination;
+ for (let i = 0; i < len; i++) {
+ let iterator = iterators[i];
+ if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
+ return;
+ }
+ }
+ let shouldComplete = false;
+ const args = [];
+ for (let i = 0; i < len; i++) {
+ let iterator = iterators[i];
+ let result = iterator.next();
+ if (iterator.hasCompleted()) {
+ shouldComplete = true;
+ }
+ if (result.done) {
+ destination.complete();
+ return;
+ }
+ args.push(result.value);
+ }
+ if (this.resultSelector) {
+ this._tryresultSelector(args);
+ }
+ else {
+ destination.next(args);
+ }
+ if (shouldComplete) {
+ destination.complete();
+ }
+ }
+ _tryresultSelector(args) {
+ let result;
+ try {
+ result = this.resultSelector.apply(this, args);
+ }
+ catch (err) {
+ this.destination.error(err);
+ return;
+ }
+ this.destination.next(result);
+ }
+}
+class StaticIterator {
+ constructor(iterator) {
+ this.iterator = iterator;
+ this.nextResult = iterator.next();
+ }
+ hasValue() {
+ return true;
+ }
+ next() {
+ const result = this.nextResult;
+ this.nextResult = this.iterator.next();
+ return result;
+ }
+ hasCompleted() {
+ const nextResult = this.nextResult;
+ return Boolean(nextResult && nextResult.done);
+ }
+}
+class StaticArrayIterator {
+ constructor(array) {
+ this.array = array;
+ this.index = 0;
+ this.length = 0;
+ this.length = array.length;
+ }
+ [_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_3__["iterator"]]() {
+ return this;
+ }
+ next(value) {
+ const i = this.index++;
+ const array = this.array;
+ return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
+ }
+ hasValue() {
+ return this.array.length > this.index;
+ }
+ hasCompleted() {
+ return this.array.length === this.index;
+ }
+}
+class ZipBufferIterator extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_4__["SimpleOuterSubscriber"] {
+ constructor(destination, parent, observable) {
+ super(destination);
+ this.parent = parent;
+ this.observable = observable;
+ this.stillUnsubscribed = true;
+ this.buffer = [];
+ this.isComplete = false;
+ }
+ [_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_3__["iterator"]]() {
+ return this;
+ }
+ next() {
+ const buffer = this.buffer;
+ if (buffer.length === 0 && this.isComplete) {
+ return { value: null, done: true };
+ }
+ else {
+ return { value: buffer.shift(), done: false };
+ }
+ }
+ hasValue() {
+ return this.buffer.length > 0;
+ }
+ hasCompleted() {
+ return this.buffer.length === 0 && this.isComplete;
+ }
+ notifyComplete() {
+ if (this.buffer.length > 0) {
+ this.isComplete = true;
+ this.parent.notifyInactive();
+ }
+ else {
+ this.destination.complete();
+ }
+ }
+ notifyNext(innerValue) {
+ this.buffer.push(innerValue);
+ this.parent.checkIterators();
+ }
+ subscribe() {
+ return Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_4__["innerSubscribe"])(this.observable, new _innerSubscribe__WEBPACK_IMPORTED_MODULE_4__["SimpleInnerSubscriber"](this));
+ }
+}
+//# sourceMappingURL=zip.js.map
+
+/***/ }),
+
+/***/ "2QA8":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js ***!
+ \********************************************************************/
+/*! exports provided: rxSubscriber, $$rxSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rxSubscriber", function() { return rxSubscriber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$rxSubscriber", function() { return $$rxSubscriber; });
+const rxSubscriber = (() => typeof Symbol === 'function'
+ ? Symbol('rxSubscriber')
+ : '@@rxSubscriber_' + Math.random())();
+const $$rxSubscriber = rxSubscriber;
+//# sourceMappingURL=rxSubscriber.js.map
+
+/***/ }),
+
+/***/ "2QGa":
+/*!*********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/partition.js ***!
+ \*********************************************************************/
+/*! exports provided: partition */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; });
+/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/not */ "F97/");
+/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/subscribeTo */ "SeVD");
+/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../operators/filter */ "pLZG");
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Observable */ "HDdC");
+
+
+
+
+function partition(source, predicate, thisArg) {
+ return [
+ Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))),
+ Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source)))
+ ];
+}
+//# sourceMappingURL=partition.js.map
+
+/***/ }),
+
+/***/ "2Vo4":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/BehaviorSubject.js ***!
+ \****************************************************************/
+/*! exports provided: BehaviorSubject */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; });
+/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Subject */ "XNiG");
+/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util/ObjectUnsubscribedError */ "9ppp");
+
+
+class BehaviorSubject extends _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"] {
+ constructor(_value) {
+ super();
+ this._value = _value;
+ }
+ get value() {
+ return this.getValue();
+ }
+ _subscribe(subscriber) {
+ const subscription = super._subscribe(subscriber);
+ if (subscription && !subscription.closed) {
+ subscriber.next(this._value);
+ }
+ return subscription;
+ }
+ getValue() {
+ if (this.hasError) {
+ throw this.thrownError;
+ }
+ else if (this.closed) {
+ throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_1__["ObjectUnsubscribedError"]();
+ }
+ else {
+ return this._value;
+ }
+ }
+ next(value) {
+ super.next(this._value = value);
+ }
+}
+//# sourceMappingURL=BehaviorSubject.js.map
+
+/***/ }),
+
+/***/ "2fFW":
+/*!*******************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/config.js ***!
+ \*******************************************************/
+/*! exports provided: config */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; });
+let _enable_super_gross_mode_that_will_cause_bad_things = false;
+const config = {
+ Promise: undefined,
+ set useDeprecatedSynchronousErrorHandling(value) {
+ if (value) {
+ const error = new Error();
+ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
+ }
+ else if (_enable_super_gross_mode_that_will_cause_bad_things) {
+ console.log('RxJS: Back to a better error behavior. Thank you. <3');
+ }
+ _enable_super_gross_mode_that_will_cause_bad_things = value;
+ },
+ get useDeprecatedSynchronousErrorHandling() {
+ return _enable_super_gross_mode_that_will_cause_bad_things;
+ },
+};
+//# sourceMappingURL=config.js.map
+
+/***/ }),
+
+/***/ "32Ea":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/skipWhile.js ***!
+ \********************************************************************/
+/*! exports provided: skipWhile */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function skipWhile(predicate) {
+ return (source) => source.lift(new SkipWhileOperator(predicate));
+}
+class SkipWhileOperator {
+ constructor(predicate) {
+ this.predicate = predicate;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
+ }
+}
+class SkipWhileSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, predicate) {
+ super(destination);
+ this.predicate = predicate;
+ this.skipping = true;
+ this.index = 0;
+ }
+ _next(value) {
+ const destination = this.destination;
+ if (this.skipping) {
+ this.tryCallPredicate(value);
+ }
+ if (!this.skipping) {
+ destination.next(value);
+ }
+ }
+ tryCallPredicate(value) {
+ try {
+ const result = this.predicate(value, this.index++);
+ this.skipping = Boolean(result);
+ }
+ catch (err) {
+ this.destination.error(err);
+ }
+ }
+}
+//# sourceMappingURL=skipWhile.js.map
+
+/***/ }),
+
+/***/ "3E0/":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/delay.js ***!
+ \****************************************************************/
+/*! exports provided: delay */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; });
+/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../scheduler/async */ "D0XW");
+/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/isDate */ "mlxB");
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Notification */ "WMd4");
+
+
+
+
+function delay(delay, scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]) {
+ const absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_1__["isDate"])(delay);
+ const delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
+ return (source) => source.lift(new DelayOperator(delayFor, scheduler));
+}
+class DelayOperator {
+ constructor(delay, scheduler) {
+ this.delay = delay;
+ this.scheduler = scheduler;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
+ }
+}
+class DelaySubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"] {
+ constructor(destination, delay, scheduler) {
+ super(destination);
+ this.delay = delay;
+ this.scheduler = scheduler;
+ this.queue = [];
+ this.active = false;
+ this.errored = false;
+ }
+ static dispatch(state) {
+ const source = state.source;
+ const queue = source.queue;
+ const scheduler = state.scheduler;
+ const destination = state.destination;
+ while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
+ queue.shift().notification.observe(destination);
+ }
+ if (queue.length > 0) {
+ const delay = Math.max(0, queue[0].time - scheduler.now());
+ this.schedule(state, delay);
+ }
+ else {
+ this.unsubscribe();
+ source.active = false;
+ }
+ }
+ _schedule(scheduler) {
+ this.active = true;
+ const destination = this.destination;
+ destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
+ source: this, destination: this.destination, scheduler: scheduler
+ }));
+ }
+ scheduleNotification(notification) {
+ if (this.errored === true) {
+ return;
+ }
+ const scheduler = this.scheduler;
+ const message = new DelayMessage(scheduler.now() + this.delay, notification);
+ this.queue.push(message);
+ if (this.active === false) {
+ this._schedule(scheduler);
+ }
+ }
+ _next(value) {
+ this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_3__["Notification"].createNext(value));
+ }
+ _error(err) {
+ this.errored = true;
+ this.queue = [];
+ this.destination.error(err);
+ this.unsubscribe();
+ }
+ _complete() {
+ this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_3__["Notification"].createComplete());
+ this.unsubscribe();
+ }
+}
+class DelayMessage {
+ constructor(time, notification) {
+ this.time = time;
+ this.notification = notification;
+ }
+}
+//# sourceMappingURL=delay.js.map
+
+/***/ }),
+
+/***/ "3N8a":
+/*!**********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js ***!
+ \**********************************************************************/
+/*! exports provided: AsyncAction */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; });
+/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Action */ "7ve7");
+
+class AsyncAction extends _Action__WEBPACK_IMPORTED_MODULE_0__["Action"] {
+ constructor(scheduler, work) {
+ super(scheduler, work);
+ this.scheduler = scheduler;
+ this.work = work;
+ this.pending = false;
+ }
+ schedule(state, delay = 0) {
+ if (this.closed) {
+ return this;
+ }
+ this.state = state;
+ const id = this.id;
+ const scheduler = this.scheduler;
+ if (id != null) {
+ this.id = this.recycleAsyncId(scheduler, id, delay);
+ }
+ this.pending = true;
+ this.delay = delay;
+ this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
+ return this;
+ }
+ requestAsyncId(scheduler, id, delay = 0) {
+ return setInterval(scheduler.flush.bind(scheduler, this), delay);
+ }
+ recycleAsyncId(scheduler, id, delay = 0) {
+ if (delay !== null && this.delay === delay && this.pending === false) {
+ return id;
+ }
+ clearInterval(id);
+ return undefined;
+ }
+ execute(state, delay) {
+ if (this.closed) {
+ return new Error('executing a cancelled action');
+ }
+ this.pending = false;
+ const error = this._execute(state, delay);
+ if (error) {
+ return error;
+ }
+ else if (this.pending === false && this.id != null) {
+ this.id = this.recycleAsyncId(this.scheduler, this.id, null);
+ }
+ }
+ _execute(state, delay) {
+ let errored = false;
+ let errorValue = undefined;
+ try {
+ this.work(state);
+ }
+ catch (e) {
+ errored = true;
+ errorValue = !!e && e || new Error(e);
+ }
+ if (errored) {
+ this.unsubscribe();
+ return errorValue;
+ }
+ }
+ _unsubscribe() {
+ const id = this.id;
+ const scheduler = this.scheduler;
+ const actions = scheduler.actions;
+ const index = actions.indexOf(this);
+ this.work = null;
+ this.state = null;
+ this.pending = false;
+ this.scheduler = null;
+ if (index !== -1) {
+ actions.splice(index, 1);
+ }
+ if (id != null) {
+ this.id = this.recycleAsyncId(scheduler, id, null);
+ }
+ this.delay = null;
+ }
+}
+//# sourceMappingURL=AsyncAction.js.map
+
+/***/ }),
+
+/***/ "3UWI":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/auditTime.js ***!
+ \********************************************************************/
+/*! exports provided: auditTime */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; });
+/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../scheduler/async */ "D0XW");
+/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./audit */ "tnsW");
+/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../observable/timer */ "PqYM");
+
+
+
+function auditTime(duration, scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]) {
+ return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(() => Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler));
+}
+//# sourceMappingURL=auditTime.js.map
+
+/***/ }),
+
+/***/ "4A3s":
+/*!*************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js ***!
+ \*************************************************************************/
+/*! exports provided: ignoreElements */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function ignoreElements() {
+ return function ignoreElementsOperatorFunction(source) {
+ return source.lift(new IgnoreElementsOperator());
+ };
+}
+class IgnoreElementsOperator {
+ call(subscriber, source) {
+ return source.subscribe(new IgnoreElementsSubscriber(subscriber));
+ }
+}
+class IgnoreElementsSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ _next(unused) {
+ }
+}
+//# sourceMappingURL=ignoreElements.js.map
+
+/***/ }),
+
+/***/ "4I5i":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js ***!
+ \*****************************************************************************/
+/*! exports provided: ArgumentOutOfRangeError */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; });
+const ArgumentOutOfRangeErrorImpl = (() => {
+ function ArgumentOutOfRangeErrorImpl() {
+ Error.call(this);
+ this.message = 'argument out of range';
+ this.name = 'ArgumentOutOfRangeError';
+ return this;
+ }
+ ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
+ return ArgumentOutOfRangeErrorImpl;
+})();
+const ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
+//# sourceMappingURL=ArgumentOutOfRangeError.js.map
+
+/***/ }),
+
+/***/ "4O5X":
+/*!****************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js ***!
+ \****************************************************************************/
+/*! exports provided: bindNodeCallback */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AsyncSubject */ "NHP+");
+/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../operators/map */ "lJxs");
+/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/canReportError */ "8Qeq");
+/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/isScheduler */ "z+Ro");
+/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/isArray */ "DH7j");
+
+
+
+
+
+
+function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
+ if (resultSelector) {
+ if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) {
+ scheduler = resultSelector;
+ }
+ else {
+ return (...args) => bindNodeCallback(callbackFunc, scheduler)(...args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(args => Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector(...args) : resultSelector(args)));
+ }
+ }
+ return function (...args) {
+ const params = {
+ subject: undefined,
+ args,
+ callbackFunc,
+ scheduler,
+ context: this,
+ };
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => {
+ const { context } = params;
+ let { subject } = params;
+ if (!scheduler) {
+ if (!subject) {
+ subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"]();
+ const handler = (...innerArgs) => {
+ const err = innerArgs.shift();
+ if (err) {
+ subject.error(err);
+ return;
+ }
+ subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
+ subject.complete();
+ };
+ try {
+ callbackFunc.apply(context, [...args, handler]);
+ }
+ catch (err) {
+ if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) {
+ subject.error(err);
+ }
+ else {
+ console.warn(err);
+ }
+ }
+ }
+ return subject.subscribe(subscriber);
+ }
+ else {
+ return scheduler.schedule(dispatch, 0, { params, subscriber, context });
+ }
+ });
+ };
+}
+function dispatch(state) {
+ const { params, subscriber, context } = state;
+ const { callbackFunc, args, scheduler } = params;
+ let subject = params.subject;
+ if (!subject) {
+ subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"]();
+ const handler = (...innerArgs) => {
+ const err = innerArgs.shift();
+ if (err) {
+ this.add(scheduler.schedule(dispatchError, 0, { err, subject }));
+ }
+ else {
+ const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
+ this.add(scheduler.schedule(dispatchNext, 0, { value, subject }));
+ }
+ };
+ try {
+ callbackFunc.apply(context, [...args, handler]);
+ }
+ catch (err) {
+ this.add(scheduler.schedule(dispatchError, 0, { err, subject }));
+ }
+ }
+ this.add(subject.subscribe(subscriber));
+}
+function dispatchNext(arg) {
+ const { value, subject } = arg;
+ subject.next(value);
+ subject.complete();
+}
+function dispatchError(arg) {
+ const { err, subject } = arg;
+ subject.error(err);
+}
+//# sourceMappingURL=bindNodeCallback.js.map
+
+/***/ }),
+
+/***/ "4f8F":
+/*!***************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/race.js ***!
+ \***************************************************************/
+/*! exports provided: race */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; });
+/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/isArray */ "DH7j");
+/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../observable/race */ "Nv8m");
+
+
+function race(...observables) {
+ return function raceOperatorFunction(source) {
+ if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) {
+ observables = observables[0];
+ }
+ return source.lift.call(Object(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"])(source, ...observables));
+ };
+}
+//# sourceMappingURL=race.js.map
+
+/***/ }),
+
+/***/ "4hIw":
+/*!***********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/timeInterval.js ***!
+ \***********************************************************************/
+/*! exports provided: timeInterval, TimeInterval */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; });
+/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../scheduler/async */ "D0XW");
+/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./scan */ "Kqap");
+/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../observable/defer */ "NXyV");
+/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./map */ "lJxs");
+
+
+
+
+function timeInterval(scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]) {
+ return (source) => Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(() => {
+ return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(({ current }, value) => ({ value, current: scheduler.now(), last: current }), { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(({ current, last, value }) => new TimeInterval(value, current - last)));
+ });
+}
+class TimeInterval {
+ constructor(value, interval) {
+ this.value = value;
+ this.interval = interval;
+ }
+}
+//# sourceMappingURL=timeInterval.js.map
+
+/***/ }),
+
+/***/ "4yVj":
+/*!**************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js ***!
+ \**************************************************************************/
+/*! exports provided: schedulePromise */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Subscription */ "quSY");
+
+
+function schedulePromise(input, scheduler) {
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => {
+ const sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"]();
+ sub.add(scheduler.schedule(() => input.then(value => {
+ sub.add(scheduler.schedule(() => {
+ subscriber.next(value);
+ sub.add(scheduler.schedule(() => subscriber.complete()));
+ }));
+ }, err => {
+ sub.add(scheduler.schedule(() => subscriber.error(err)));
+ })));
+ return sub;
+ });
+}
+//# sourceMappingURL=schedulePromise.js.map
+
+/***/ }),
+
+/***/ "5+tZ":
+/*!*******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/mergeMap.js ***!
+ \*******************************************************************/
+/*! exports provided: mergeMap, MergeMapOperator, MergeMapSubscriber, flatMap */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return flatMap; });
+/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "lJxs");
+/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../observable/from */ "Cfvw");
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+
+
+function mergeMap(project, resultSelector, concurrent = Number.POSITIVE_INFINITY) {
+ if (typeof resultSelector === 'function') {
+ return (source) => source.pipe(mergeMap((a, i) => Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])((b, ii) => resultSelector(a, b, i, ii))), concurrent));
+ }
+ else if (typeof resultSelector === 'number') {
+ concurrent = resultSelector;
+ }
+ return (source) => source.lift(new MergeMapOperator(project, concurrent));
+}
+class MergeMapOperator {
+ constructor(project, concurrent = Number.POSITIVE_INFINITY) {
+ this.project = project;
+ this.concurrent = concurrent;
+ }
+ call(observer, source) {
+ return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
+ }
+}
+class MergeMapSubscriber extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_2__["SimpleOuterSubscriber"] {
+ constructor(destination, project, concurrent = Number.POSITIVE_INFINITY) {
+ super(destination);
+ this.project = project;
+ this.concurrent = concurrent;
+ this.hasCompleted = false;
+ this.buffer = [];
+ this.active = 0;
+ this.index = 0;
+ }
+ _next(value) {
+ if (this.active < this.concurrent) {
+ this._tryNext(value);
+ }
+ else {
+ this.buffer.push(value);
+ }
+ }
+ _tryNext(value) {
+ let result;
+ const index = this.index++;
+ try {
+ result = this.project(value, index);
+ }
+ catch (err) {
+ this.destination.error(err);
+ return;
+ }
+ this.active++;
+ this._innerSub(result);
+ }
+ _innerSub(ish) {
+ const innerSubscriber = new _innerSubscribe__WEBPACK_IMPORTED_MODULE_2__["SimpleInnerSubscriber"](this);
+ const destination = this.destination;
+ destination.add(innerSubscriber);
+ const innerSubscription = Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_2__["innerSubscribe"])(ish, innerSubscriber);
+ if (innerSubscription !== innerSubscriber) {
+ destination.add(innerSubscription);
+ }
+ }
+ _complete() {
+ this.hasCompleted = true;
+ if (this.active === 0 && this.buffer.length === 0) {
+ this.destination.complete();
+ }
+ this.unsubscribe();
+ }
+ notifyNext(innerValue) {
+ this.destination.next(innerValue);
+ }
+ notifyComplete() {
+ const buffer = this.buffer;
+ this.active--;
+ if (buffer.length > 0) {
+ this._next(buffer.shift());
+ }
+ else if (this.active === 0 && this.hasCompleted) {
+ this.destination.complete();
+ }
+ }
+}
+const flatMap = mergeMap;
+//# sourceMappingURL=mergeMap.js.map
+
+/***/ }),
+
+/***/ "51Bx":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/mergeScan.js ***!
+ \********************************************************************/
+/*! exports provided: mergeScan, MergeScanOperator, MergeScanSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; });
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+function mergeScan(accumulator, seed, concurrent = Number.POSITIVE_INFINITY) {
+ return (source) => source.lift(new MergeScanOperator(accumulator, seed, concurrent));
+}
+class MergeScanOperator {
+ constructor(accumulator, seed, concurrent) {
+ this.accumulator = accumulator;
+ this.seed = seed;
+ this.concurrent = concurrent;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
+ }
+}
+class MergeScanSubscriber extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleOuterSubscriber"] {
+ constructor(destination, accumulator, acc, concurrent) {
+ super(destination);
+ this.accumulator = accumulator;
+ this.acc = acc;
+ this.concurrent = concurrent;
+ this.hasValue = false;
+ this.hasCompleted = false;
+ this.buffer = [];
+ this.active = 0;
+ this.index = 0;
+ }
+ _next(value) {
+ if (this.active < this.concurrent) {
+ const index = this.index++;
+ const destination = this.destination;
+ let ish;
+ try {
+ const { accumulator } = this;
+ ish = accumulator(this.acc, value, index);
+ }
+ catch (e) {
+ return destination.error(e);
+ }
+ this.active++;
+ this._innerSub(ish);
+ }
+ else {
+ this.buffer.push(value);
+ }
+ }
+ _innerSub(ish) {
+ const innerSubscriber = new _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleInnerSubscriber"](this);
+ const destination = this.destination;
+ destination.add(innerSubscriber);
+ const innerSubscription = Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["innerSubscribe"])(ish, innerSubscriber);
+ if (innerSubscription !== innerSubscriber) {
+ destination.add(innerSubscription);
+ }
+ }
+ _complete() {
+ this.hasCompleted = true;
+ if (this.active === 0 && this.buffer.length === 0) {
+ if (this.hasValue === false) {
+ this.destination.next(this.acc);
+ }
+ this.destination.complete();
+ }
+ this.unsubscribe();
+ }
+ notifyNext(innerValue) {
+ const { destination } = this;
+ this.acc = innerValue;
+ this.hasValue = true;
+ destination.next(innerValue);
+ }
+ notifyComplete() {
+ const buffer = this.buffer;
+ this.active--;
+ if (buffer.length > 0) {
+ this._next(buffer.shift());
+ }
+ else if (this.active === 0 && this.hasCompleted) {
+ if (this.hasValue === false) {
+ this.destination.next(this.acc);
+ }
+ this.destination.complete();
+ }
+ }
+}
+//# sourceMappingURL=mergeScan.js.map
+
+/***/ }),
+
+/***/ "51Dv":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/InnerSubscriber.js ***!
+ \****************************************************************/
+/*! exports provided: InnerSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Subscriber */ "7o/Q");
+
+class InnerSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(parent, outerValue, outerIndex) {
+ super();
+ this.parent = parent;
+ this.outerValue = outerValue;
+ this.outerIndex = outerIndex;
+ this.index = 0;
+ }
+ _next(value) {
+ this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
+ }
+ _error(error) {
+ this.parent.notifyError(error, this);
+ this.unsubscribe();
+ }
+ _complete() {
+ this.parent.notifyComplete(this);
+ this.unsubscribe();
+ }
+}
+//# sourceMappingURL=InnerSubscriber.js.map
+
+/***/ }),
+
+/***/ "5B2Y":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js ***!
+ \*****************************************************************************/
+/*! exports provided: scheduleObservable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Subscription */ "quSY");
+/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../symbol/observable */ "kJWO");
+
+
+
+function scheduleObservable(input, scheduler) {
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => {
+ const sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"]();
+ sub.add(scheduler.schedule(() => {
+ const observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]]();
+ sub.add(observable.subscribe({
+ next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },
+ error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },
+ complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },
+ }));
+ }));
+ return sub;
+ });
+}
+//# sourceMappingURL=scheduleObservable.js.map
+
+/***/ }),
+
+/***/ "5yfJ":
+/*!*****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/never.js ***!
+ \*****************************************************************/
+/*! exports provided: NEVER, never */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/noop */ "KqfI");
+
+
+const NEVER = new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]);
+function never() {
+ return NEVER;
+}
+//# sourceMappingURL=never.js.map
+
+/***/ }),
+
+/***/ "6eBy":
+/*!*******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/debounce.js ***!
+ \*******************************************************************/
+/*! exports provided: debounce */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; });
+/* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../innerSubscribe */ "zx2A");
+
+function debounce(durationSelector) {
+ return (source) => source.lift(new DebounceOperator(durationSelector));
+}
+class DebounceOperator {
+ constructor(durationSelector) {
+ this.durationSelector = durationSelector;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
+ }
+}
+class DebounceSubscriber extends _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleOuterSubscriber"] {
+ constructor(destination, durationSelector) {
+ super(destination);
+ this.durationSelector = durationSelector;
+ this.hasValue = false;
+ }
+ _next(value) {
+ try {
+ const result = this.durationSelector.call(this, value);
+ if (result) {
+ this._tryNext(value, result);
+ }
+ }
+ catch (err) {
+ this.destination.error(err);
+ }
+ }
+ _complete() {
+ this.emitValue();
+ this.destination.complete();
+ }
+ _tryNext(value, duration) {
+ let subscription = this.durationSubscription;
+ this.value = value;
+ this.hasValue = true;
+ if (subscription) {
+ subscription.unsubscribe();
+ this.remove(subscription);
+ }
+ subscription = Object(_innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["innerSubscribe"])(duration, new _innerSubscribe__WEBPACK_IMPORTED_MODULE_0__["SimpleInnerSubscriber"](this));
+ if (subscription && !subscription.closed) {
+ this.add(this.durationSubscription = subscription);
+ }
+ }
+ notifyNext() {
+ this.emitValue();
+ }
+ notifyComplete() {
+ this.emitValue();
+ }
+ emitValue() {
+ if (this.hasValue) {
+ const value = this.value;
+ const subscription = this.durationSubscription;
+ if (subscription) {
+ this.durationSubscription = undefined;
+ subscription.unsubscribe();
+ this.remove(subscription);
+ }
+ this.value = undefined;
+ this.hasValue = false;
+ super._next(value);
+ }
+ }
+}
+//# sourceMappingURL=debounce.js.map
+
+/***/ }),
+
+/***/ "7+OI":
+/*!******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/isObservable.js ***!
+ \******************************************************************/
+/*! exports provided: isObservable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+
+function isObservable(obj) {
+ return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
+}
+//# sourceMappingURL=isObservable.js.map
+
+/***/ }),
+
+/***/ "7EHt":
+/*!***************************************************************************!*\
+ !*** ./node_modules/@angular/material/__ivy_ngcc__/fesm2015/expansion.js ***!
+ \***************************************************************************/
+/*! exports provided: EXPANSION_PANEL_ANIMATION_TIMING, MAT_ACCORDION, MAT_EXPANSION_PANEL_DEFAULT_OPTIONS, MatAccordion, MatExpansionModule, MatExpansionPanel, MatExpansionPanelActionRow, MatExpansionPanelContent, MatExpansionPanelDescription, MatExpansionPanelHeader, MatExpansionPanelTitle, matExpansionAnimations, ɵ0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EXPANSION_PANEL_ANIMATION_TIMING", function() { return EXPANSION_PANEL_ANIMATION_TIMING; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_ACCORDION", function() { return MAT_ACCORDION; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_EXPANSION_PANEL_DEFAULT_OPTIONS", function() { return MAT_EXPANSION_PANEL_DEFAULT_OPTIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatAccordion", function() { return MatAccordion; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionModule", function() { return MatExpansionModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanel", function() { return MatExpansionPanel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanelActionRow", function() { return MatExpansionPanelActionRow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanelContent", function() { return MatExpansionPanelContent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanelDescription", function() { return MatExpansionPanelDescription; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanelHeader", function() { return MatExpansionPanelHeader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatExpansionPanelTitle", function() { return MatExpansionPanelTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "matExpansionAnimations", function() { return matExpansionAnimations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵ0", function() { return ɵ0; });
+/* harmony import */ var _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/cdk/accordion */ "N/qJ");
+/* harmony import */ var _angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/cdk/portal */ "+rOU");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "ofXK");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_material_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/material/core */ "FKr1");
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/cdk/coercion */ "8LU1");
+/* harmony import */ var _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/cdk/a11y */ "u47x");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rxjs/operators */ "kU1M");
+/* harmony import */ var _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/cdk/keycodes */ "FtGj");
+/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/platform-browser/animations */ "R1ws");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! rxjs */ "qCKp");
+/* harmony import */ var _angular_animations__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/animations */ "R0Ic");
+/* harmony import */ var _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/cdk/collections */ "0EQZ");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Token used to provide a `MatAccordion` to `MatExpansionPanel`.
+ * Used primarily to avoid circular imports between `MatAccordion` and `MatExpansionPanel`.
+ */
+
+
+
+
+
+
+const _c0 = ["body"];
+function MatExpansionPanel_ng_template_5_Template(rf, ctx) { }
+const _c1 = [[["mat-expansion-panel-header"]], "*", [["mat-action-row"]]];
+const _c2 = ["mat-expansion-panel-header", "*", "mat-action-row"];
+function MatExpansionPanelHeader_span_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelement"](0, "span", 2);
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("@indicatorRotate", ctx_r0._getExpandedState());
+} }
+const _c3 = [[["mat-panel-title"]], [["mat-panel-description"]], "*"];
+const _c4 = ["mat-panel-title", "mat-panel-description", "*"];
+const MAT_ACCORDION = new _angular_core__WEBPACK_IMPORTED_MODULE_3__["InjectionToken"]('MAT_ACCORDION');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Time and timing curve for expansion panel animations. */
+// Note: Keep this in sync with the Sass variable for the panel header animation.
+const EXPANSION_PANEL_ANIMATION_TIMING = '225ms cubic-bezier(0.4,0.0,0.2,1)';
+/**
+ * Animations used by the Material expansion panel.
+ *
+ * A bug in angular animation's `state` when ViewContainers are moved using ViewContainerRef.move()
+ * causes the animation state of moved components to become `void` upon exit, and not update again
+ * upon reentry into the DOM. This can lead a to situation for the expansion panel where the state
+ * of the panel is `expanded` or `collapsed` but the animation state is `void`.
+ *
+ * To correctly handle animating to the next state, we animate between `void` and `collapsed` which
+ * are defined to have the same styles. Since angular animates from the current styles to the
+ * destination state's style definition, in situations where we are moving from `void`'s styles to
+ * `collapsed` this acts a noop since no style values change.
+ *
+ * In the case where angular's animation state is out of sync with the expansion panel's state, the
+ * expansion panel being `expanded` and angular animations being `void`, the animation from the
+ * `expanded`'s effective styles (though in a `void` animation state) to the collapsed state will
+ * occur as expected.
+ *
+ * Angular Bug: https://github.com/angular/angular/issues/18847
+ *
+ * @docs-private
+ */
+const matExpansionAnimations = {
+ /** Animation that rotates the indicator arrow. */
+ indicatorRotate: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["trigger"])('indicatorRotate', [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["state"])('collapsed, void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["style"])({ transform: 'rotate(0deg)' })),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["state"])('expanded', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["style"])({ transform: 'rotate(180deg)' })),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["transition"])('expanded <=> collapsed, void => collapsed', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["animate"])(EXPANSION_PANEL_ANIMATION_TIMING)),
+ ]),
+ /** Animation that expands and collapses the panel content. */
+ bodyExpansion: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["trigger"])('bodyExpansion', [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["state"])('collapsed, void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["style"])({ height: '0px', visibility: 'hidden' })),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["state"])('expanded', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["style"])({ height: '*', visibility: 'visible' })),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["transition"])('expanded <=> collapsed, void => collapsed', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_11__["animate"])(EXPANSION_PANEL_ANIMATION_TIMING)),
+ ])
+};
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Expansion panel content that will be rendered lazily
+ * after the panel is opened for the first time.
+ */
+class MatExpansionPanelContent {
+ constructor(_template) {
+ this._template = _template;
+ }
+}
+MatExpansionPanelContent.ɵfac = function MatExpansionPanelContent_Factory(t) { return new (t || MatExpansionPanelContent)(_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["TemplateRef"])); };
+MatExpansionPanelContent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineDirective"]({ type: MatExpansionPanelContent, selectors: [["ng-template", "matExpansionPanelContent", ""]] });
+MatExpansionPanelContent.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["TemplateRef"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanelContent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Directive"],
+ args: [{
+ selector: 'ng-template[matExpansionPanelContent]'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["TemplateRef"] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Counter for generating unique element ids. */
+let uniqueId = 0;
+/**
+ * Injection token that can be used to configure the defalt
+ * options for the expansion panel component.
+ */
+const MAT_EXPANSION_PANEL_DEFAULT_OPTIONS = new _angular_core__WEBPACK_IMPORTED_MODULE_3__["InjectionToken"]('MAT_EXPANSION_PANEL_DEFAULT_OPTIONS');
+const ɵ0 = undefined;
+/**
+ * This component can be used as a single element to show expandable content, or as one of
+ * multiple children of an element with the MatAccordion directive attached.
+ */
+class MatExpansionPanel extends _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__["CdkAccordionItem"] {
+ constructor(accordion, _changeDetectorRef, _uniqueSelectionDispatcher, _viewContainerRef, _document, _animationMode, defaultOptions) {
+ super(accordion, _changeDetectorRef, _uniqueSelectionDispatcher);
+ this._viewContainerRef = _viewContainerRef;
+ this._animationMode = _animationMode;
+ this._hideToggle = false;
+ /** An event emitted after the body's expansion animation happens. */
+ this.afterExpand = new _angular_core__WEBPACK_IMPORTED_MODULE_3__["EventEmitter"]();
+ /** An event emitted after the body's collapse animation happens. */
+ this.afterCollapse = new _angular_core__WEBPACK_IMPORTED_MODULE_3__["EventEmitter"]();
+ /** Stream that emits for changes in `@Input` properties. */
+ this._inputChanges = new rxjs__WEBPACK_IMPORTED_MODULE_10__["Subject"]();
+ /** ID for the associated header element. Used for a11y labelling. */
+ this._headerId = `mat-expansion-panel-header-${uniqueId++}`;
+ /** Stream of body animation done events. */
+ this._bodyAnimationDone = new rxjs__WEBPACK_IMPORTED_MODULE_10__["Subject"]();
+ this.accordion = accordion;
+ this._document = _document;
+ // We need a Subject with distinctUntilChanged, because the `done` event
+ // fires twice on some browsers. See https://github.com/angular/angular/issues/24084
+ this._bodyAnimationDone.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["distinctUntilChanged"])((x, y) => {
+ return x.fromState === y.fromState && x.toState === y.toState;
+ })).subscribe(event => {
+ if (event.fromState !== 'void') {
+ if (event.toState === 'expanded') {
+ this.afterExpand.emit();
+ }
+ else if (event.toState === 'collapsed') {
+ this.afterCollapse.emit();
+ }
+ }
+ });
+ if (defaultOptions) {
+ this.hideToggle = defaultOptions.hideToggle;
+ }
+ }
+ /** Whether the toggle indicator should be hidden. */
+ get hideToggle() {
+ return this._hideToggle || (this.accordion && this.accordion.hideToggle);
+ }
+ set hideToggle(value) {
+ this._hideToggle = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value);
+ }
+ /** The position of the expansion indicator. */
+ get togglePosition() {
+ return this._togglePosition || (this.accordion && this.accordion.togglePosition);
+ }
+ set togglePosition(value) {
+ this._togglePosition = value;
+ }
+ /** Determines whether the expansion panel should have spacing between it and its siblings. */
+ _hasSpacing() {
+ if (this.accordion) {
+ return this.expanded && this.accordion.displayMode === 'default';
+ }
+ return false;
+ }
+ /** Gets the expanded state string. */
+ _getExpandedState() {
+ return this.expanded ? 'expanded' : 'collapsed';
+ }
+ /** Toggles the expanded state of the expansion panel. */
+ toggle() {
+ this.expanded = !this.expanded;
+ }
+ /** Sets the expanded state of the expansion panel to false. */
+ close() {
+ this.expanded = false;
+ }
+ /** Sets the expanded state of the expansion panel to true. */
+ open() {
+ this.expanded = true;
+ }
+ ngAfterContentInit() {
+ if (this._lazyContent) {
+ // Render the content as soon as the panel becomes open.
+ this.opened.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["startWith"])(null), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["filter"])(() => this.expanded && !this._portal), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["take"])(1)).subscribe(() => {
+ this._portal = new _angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__["TemplatePortal"](this._lazyContent._template, this._viewContainerRef);
+ });
+ }
+ }
+ ngOnChanges(changes) {
+ this._inputChanges.next(changes);
+ }
+ ngOnDestroy() {
+ super.ngOnDestroy();
+ this._bodyAnimationDone.complete();
+ this._inputChanges.complete();
+ }
+ /** Checks whether the expansion panel's content contains the currently-focused element. */
+ _containsFocus() {
+ if (this._body) {
+ const focusedElement = this._document.activeElement;
+ const bodyElement = this._body.nativeElement;
+ return focusedElement === bodyElement || bodyElement.contains(focusedElement);
+ }
+ return false;
+ }
+}
+MatExpansionPanel.ɵfac = function MatExpansionPanel_Factory(t) { return new (t || MatExpansionPanel)(_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](MAT_ACCORDION, 12), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_12__["UniqueSelectionDispatcher"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_2__["DOCUMENT"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"], 8), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](MAT_EXPANSION_PANEL_DEFAULT_OPTIONS, 8)); };
+MatExpansionPanel.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineComponent"]({ type: MatExpansionPanel, selectors: [["mat-expansion-panel"]], contentQueries: function MatExpansionPanel_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵcontentQuery"](dirIndex, MatExpansionPanelContent, 1);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵloadQuery"]()) && (ctx._lazyContent = _t.first);
+ } }, viewQuery: function MatExpansionPanel_Query(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵviewQuery"](_c0, 1);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵloadQuery"]()) && (ctx._body = _t.first);
+ } }, hostAttrs: [1, "mat-expansion-panel"], hostVars: 6, hostBindings: function MatExpansionPanel_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵclassProp"]("mat-expanded", ctx.expanded)("_mat-animation-noopable", ctx._animationMode === "NoopAnimations")("mat-expansion-panel-spacing", ctx._hasSpacing());
+ } }, inputs: { disabled: "disabled", expanded: "expanded", hideToggle: "hideToggle", togglePosition: "togglePosition" }, outputs: { opened: "opened", closed: "closed", expandedChange: "expandedChange", afterExpand: "afterExpand", afterCollapse: "afterCollapse" }, exportAs: ["matExpansionPanel"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵProvidersFeature"]([
+ // Provide MatAccordion as undefined to prevent nested expansion panels from registering
+ // to the same accordion.
+ { provide: MAT_ACCORDION, useValue: ɵ0 },
+ ]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵInheritDefinitionFeature"], _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵNgOnChangesFeature"]], ngContentSelectors: _c2, decls: 7, vars: 4, consts: [["role", "region", 1, "mat-expansion-panel-content", 3, "id"], ["body", ""], [1, "mat-expansion-panel-body"], [3, "cdkPortalOutlet"]], template: function MatExpansionPanel_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojectionDef"](_c1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementStart"](1, "div", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵlistener"]("@bodyExpansion.done", function MatExpansionPanel_Template_div_animation_bodyExpansion_done_1_listener($event) { return ctx._bodyAnimationDone.next($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementStart"](3, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](4, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtemplate"](5, MatExpansionPanel_ng_template_5_Template, 0, 0, "ng-template", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](6, 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementEnd"]();
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("@bodyExpansion", ctx._getExpandedState())("id", ctx.id);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵattribute"]("aria-labelledby", ctx._headerId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("cdkPortalOutlet", ctx._portal);
+ } }, directives: [_angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__["CdkPortalOutlet"]], styles: [".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;border-radius:4px;overflow:hidden;transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);position:relative}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:4px;border-top-left-radius:4px}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.cdk-high-contrast-active .mat-expansion-panel{outline:solid 1px}.mat-expansion-panel.ng-animate-disabled,.ng-animate-disabled .mat-expansion-panel,.mat-expansion-panel._mat-animation-noopable{transition:none}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px}.mat-action-row button.mat-button-base,.mat-action-row button.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row button.mat-button-base,[dir=rtl] .mat-action-row button.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], encapsulation: 2, data: { animation: [matExpansionAnimations.bodyExpansion] }, changeDetection: 0 });
+MatExpansionPanel.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["SkipSelf"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [MAT_ACCORDION,] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"] },
+ { type: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_12__["UniqueSelectionDispatcher"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewContainerRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["DOCUMENT"],] }] },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"],] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [MAT_EXPANSION_PANEL_DEFAULT_OPTIONS,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"] }] }
+];
+MatExpansionPanel.propDecorators = {
+ hideToggle: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }],
+ togglePosition: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }],
+ afterExpand: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Output"] }],
+ afterCollapse: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Output"] }],
+ _lazyContent: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ContentChild"], args: [MatExpansionPanelContent,] }],
+ _body: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewChild"], args: ['body',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanel, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Component"],
+ args: [{
+ selector: 'mat-expansion-panel',
+ exportAs: 'matExpansionPanel',
+ template: "\n
\n
\n \n \n
\n \n
\n",
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewEncapsulation"].None,
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectionStrategy"].OnPush,
+ inputs: ['disabled', 'expanded'],
+ outputs: ['opened', 'closed', 'expandedChange'],
+ animations: [matExpansionAnimations.bodyExpansion],
+ providers: [
+ // Provide MatAccordion as undefined to prevent nested expansion panels from registering
+ // to the same accordion.
+ { provide: MAT_ACCORDION, useValue: ɵ0 },
+ ],
+ host: {
+ 'class': 'mat-expansion-panel',
+ '[class.mat-expanded]': 'expanded',
+ '[class._mat-animation-noopable]': '_animationMode === "NoopAnimations"',
+ '[class.mat-expansion-panel-spacing]': '_hasSpacing()'
+ },
+ styles: [".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;border-radius:4px;overflow:hidden;transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);position:relative}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:4px;border-top-left-radius:4px}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.cdk-high-contrast-active .mat-expansion-panel{outline:solid 1px}.mat-expansion-panel.ng-animate-disabled,.ng-animate-disabled .mat-expansion-panel,.mat-expansion-panel._mat-animation-noopable{transition:none}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px}.mat-action-row button.mat-button-base,.mat-action-row button.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row button.mat-button-base,[dir=rtl] .mat-action-row button.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"]
+ }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["SkipSelf"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [MAT_ACCORDION]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"] }, { type: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_12__["UniqueSelectionDispatcher"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewContainerRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["DOCUMENT"]]
+ }] }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"]]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [MAT_EXPANSION_PANEL_DEFAULT_OPTIONS]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"]
+ }] }]; }, { afterExpand: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Output"]
+ }], afterCollapse: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Output"]
+ }], hideToggle: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], togglePosition: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], _lazyContent: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ContentChild"],
+ args: [MatExpansionPanelContent]
+ }], _body: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewChild"],
+ args: ['body']
+ }] }); })();
+/**
+ * Actions of a ``.
+ */
+class MatExpansionPanelActionRow {
+}
+MatExpansionPanelActionRow.ɵfac = function MatExpansionPanelActionRow_Factory(t) { return new (t || MatExpansionPanelActionRow)(); };
+MatExpansionPanelActionRow.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineDirective"]({ type: MatExpansionPanelActionRow, selectors: [["mat-action-row"]], hostAttrs: [1, "mat-action-row"] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanelActionRow, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Directive"],
+ args: [{
+ selector: 'mat-action-row',
+ host: {
+ class: 'mat-action-row'
+ }
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Header element of a ``.
+ */
+class MatExpansionPanelHeader {
+ constructor(panel, _element, _focusMonitor, _changeDetectorRef, defaultOptions, _animationMode) {
+ this.panel = panel;
+ this._element = _element;
+ this._focusMonitor = _focusMonitor;
+ this._changeDetectorRef = _changeDetectorRef;
+ this._animationMode = _animationMode;
+ this._parentChangeSubscription = rxjs__WEBPACK_IMPORTED_MODULE_10__["Subscription"].EMPTY;
+ const accordionHideToggleChange = panel.accordion ?
+ panel.accordion._stateChanges.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["filter"])(changes => !!(changes['hideToggle'] || changes['togglePosition']))) :
+ rxjs__WEBPACK_IMPORTED_MODULE_10__["EMPTY"];
+ // Since the toggle state depends on an @Input on the panel, we
+ // need to subscribe and trigger change detection manually.
+ this._parentChangeSubscription =
+ Object(rxjs__WEBPACK_IMPORTED_MODULE_10__["merge"])(panel.opened, panel.closed, accordionHideToggleChange, panel._inputChanges.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["filter"])(changes => {
+ return !!(changes['hideToggle'] ||
+ changes['disabled'] ||
+ changes['togglePosition']);
+ })))
+ .subscribe(() => this._changeDetectorRef.markForCheck());
+ // Avoids focus being lost if the panel contained the focused element and was closed.
+ panel.closed
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["filter"])(() => panel._containsFocus()))
+ .subscribe(() => _focusMonitor.focusVia(_element, 'program'));
+ if (defaultOptions) {
+ this.expandedHeight = defaultOptions.expandedHeight;
+ this.collapsedHeight = defaultOptions.collapsedHeight;
+ }
+ }
+ /**
+ * Whether the associated panel is disabled. Implemented as a part of `FocusableOption`.
+ * @docs-private
+ */
+ get disabled() {
+ return this.panel.disabled;
+ }
+ /** Toggles the expanded state of the panel. */
+ _toggle() {
+ if (!this.disabled) {
+ this.panel.toggle();
+ }
+ }
+ /** Gets whether the panel is expanded. */
+ _isExpanded() {
+ return this.panel.expanded;
+ }
+ /** Gets the expanded state string of the panel. */
+ _getExpandedState() {
+ return this.panel._getExpandedState();
+ }
+ /** Gets the panel id. */
+ _getPanelId() {
+ return this.panel.id;
+ }
+ /** Gets the toggle position for the header. */
+ _getTogglePosition() {
+ return this.panel.togglePosition;
+ }
+ /** Gets whether the expand indicator should be shown. */
+ _showToggle() {
+ return !this.panel.hideToggle && !this.panel.disabled;
+ }
+ /**
+ * Gets the current height of the header. Null if no custom height has been
+ * specified, and if the default height from the stylesheet should be used.
+ */
+ _getHeaderHeight() {
+ const isExpanded = this._isExpanded();
+ if (isExpanded && this.expandedHeight) {
+ return this.expandedHeight;
+ }
+ else if (!isExpanded && this.collapsedHeight) {
+ return this.collapsedHeight;
+ }
+ return null;
+ }
+ /** Handle keydown event calling to toggle() if appropriate. */
+ _keydown(event) {
+ switch (event.keyCode) {
+ // Toggle for space and enter keys.
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_8__["SPACE"]:
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_8__["ENTER"]:
+ if (!Object(_angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_8__["hasModifierKey"])(event)) {
+ event.preventDefault();
+ this._toggle();
+ }
+ break;
+ default:
+ if (this.panel.accordion) {
+ this.panel.accordion._handleHeaderKeydown(event);
+ }
+ return;
+ }
+ }
+ /**
+ * Focuses the panel header. Implemented as a part of `FocusableOption`.
+ * @param origin Origin of the action that triggered the focus.
+ * @docs-private
+ */
+ focus(origin, options) {
+ if (origin) {
+ this._focusMonitor.focusVia(this._element, origin, options);
+ }
+ else {
+ this._element.nativeElement.focus(options);
+ }
+ }
+ ngAfterViewInit() {
+ this._focusMonitor.monitor(this._element).subscribe(origin => {
+ if (origin && this.panel.accordion) {
+ this.panel.accordion._handleHeaderFocus(this);
+ }
+ });
+ }
+ ngOnDestroy() {
+ this._parentChangeSubscription.unsubscribe();
+ this._focusMonitor.stopMonitoring(this._element);
+ }
+}
+MatExpansionPanelHeader.ɵfac = function MatExpansionPanelHeader_Factory(t) { return new (t || MatExpansionPanelHeader)(_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](MatExpansionPanel, 1), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_6__["FocusMonitor"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](MAT_EXPANSION_PANEL_DEFAULT_OPTIONS, 8), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"], 8)); };
+MatExpansionPanelHeader.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineComponent"]({ type: MatExpansionPanelHeader, selectors: [["mat-expansion-panel-header"]], hostAttrs: ["role", "button", 1, "mat-expansion-panel-header", "mat-focus-indicator"], hostVars: 15, hostBindings: function MatExpansionPanelHeader_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵlistener"]("click", function MatExpansionPanelHeader_click_HostBindingHandler() { return ctx._toggle(); })("keydown", function MatExpansionPanelHeader_keydown_HostBindingHandler($event) { return ctx._keydown($event); });
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵattribute"]("id", ctx.panel._headerId)("tabindex", ctx.disabled ? -1 : 0)("aria-controls", ctx._getPanelId())("aria-expanded", ctx._isExpanded())("aria-disabled", ctx.panel.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵstyleProp"]("height", ctx._getHeaderHeight());
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵclassProp"]("mat-expanded", ctx._isExpanded())("mat-expansion-toggle-indicator-after", ctx._getTogglePosition() === "after")("mat-expansion-toggle-indicator-before", ctx._getTogglePosition() === "before")("_mat-animation-noopable", ctx._animationMode === "NoopAnimations");
+ } }, inputs: { expandedHeight: "expandedHeight", collapsedHeight: "collapsedHeight" }, ngContentSelectors: _c4, decls: 5, vars: 1, consts: [[1, "mat-content"], ["class", "mat-expansion-indicator", 4, "ngIf"], [1, "mat-expansion-indicator"]], template: function MatExpansionPanelHeader_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojectionDef"](_c3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementStart"](0, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](2, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵprojection"](3, 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtemplate"](4, MatExpansionPanelHeader_span_4_Template, 1, 1, "span", 1);
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("ngIf", ctx._showToggle());
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["NgIf"]], styles: [".mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;margin-right:16px}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header-description{flex-grow:2}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:\"\";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle}.cdk-high-contrast-active .mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true])::before,.cdk-high-contrast-active .mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true])::before,.cdk-high-contrast-active .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true])::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;border:3px solid;border-radius:4px;content:\"\"}\n"], encapsulation: 2, data: { animation: [
+ matExpansionAnimations.indicatorRotate,
+ ] }, changeDetection: 0 });
+MatExpansionPanelHeader.ctorParameters = () => [
+ { type: MatExpansionPanel, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Host"] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ElementRef"] },
+ { type: _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_6__["FocusMonitor"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [MAT_EXPANSION_PANEL_DEFAULT_OPTIONS,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"] }] },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"], args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"],] }] }
+];
+MatExpansionPanelHeader.propDecorators = {
+ expandedHeight: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }],
+ collapsedHeight: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanelHeader, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Component"],
+ args: [{
+ selector: 'mat-expansion-panel-header',
+ template: "\n \n \n \n\n\n",
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ViewEncapsulation"].None,
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectionStrategy"].OnPush,
+ animations: [
+ matExpansionAnimations.indicatorRotate,
+ ],
+ host: {
+ 'class': 'mat-expansion-panel-header mat-focus-indicator',
+ 'role': 'button',
+ '[attr.id]': 'panel._headerId',
+ '[attr.tabindex]': 'disabled ? -1 : 0',
+ '[attr.aria-controls]': '_getPanelId()',
+ '[attr.aria-expanded]': '_isExpanded()',
+ '[attr.aria-disabled]': 'panel.disabled',
+ '[class.mat-expanded]': '_isExpanded()',
+ '[class.mat-expansion-toggle-indicator-after]': `_getTogglePosition() === 'after'`,
+ '[class.mat-expansion-toggle-indicator-before]': `_getTogglePosition() === 'before'`,
+ '[class._mat-animation-noopable]': '_animationMode === "NoopAnimations"',
+ '[style.height]': '_getHeaderHeight()',
+ '(click)': '_toggle()',
+ '(keydown)': '_keydown($event)'
+ },
+ styles: [".mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;margin-right:16px}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header-description{flex-grow:2}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:\"\";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle}.cdk-high-contrast-active .mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true])::before,.cdk-high-contrast-active .mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true])::before,.cdk-high-contrast-active .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true])::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;border:3px solid;border-radius:4px;content:\"\"}\n"]
+ }]
+ }], function () { return [{ type: MatExpansionPanel, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Host"]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ElementRef"] }, { type: _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_6__["FocusMonitor"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [MAT_EXPANSION_PANEL_DEFAULT_OPTIONS]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"]
+ }] }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Inject"],
+ args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"]]
+ }] }]; }, { expandedHeight: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], collapsedHeight: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }] }); })();
+/**
+ * Description element of a ``.
+ */
+class MatExpansionPanelDescription {
+}
+MatExpansionPanelDescription.ɵfac = function MatExpansionPanelDescription_Factory(t) { return new (t || MatExpansionPanelDescription)(); };
+MatExpansionPanelDescription.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineDirective"]({ type: MatExpansionPanelDescription, selectors: [["mat-panel-description"]], hostAttrs: [1, "mat-expansion-panel-header-description"] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanelDescription, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Directive"],
+ args: [{
+ selector: 'mat-panel-description',
+ host: {
+ class: 'mat-expansion-panel-header-description'
+ }
+ }]
+ }], null, null); })();
+/**
+ * Title element of a ``.
+ */
+class MatExpansionPanelTitle {
+}
+MatExpansionPanelTitle.ɵfac = function MatExpansionPanelTitle_Factory(t) { return new (t || MatExpansionPanelTitle)(); };
+MatExpansionPanelTitle.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineDirective"]({ type: MatExpansionPanelTitle, selectors: [["mat-panel-title"]], hostAttrs: [1, "mat-expansion-panel-header-title"] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionPanelTitle, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Directive"],
+ args: [{
+ selector: 'mat-panel-title',
+ host: {
+ class: 'mat-expansion-panel-header-title'
+ }
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Directive for a Material Design Accordion.
+ */
+class MatAccordion extends _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__["CdkAccordion"] {
+ constructor() {
+ super(...arguments);
+ /** Headers belonging to this accordion. */
+ this._ownHeaders = new _angular_core__WEBPACK_IMPORTED_MODULE_3__["QueryList"]();
+ this._hideToggle = false;
+ /**
+ * Display mode used for all expansion panels in the accordion. Currently two display
+ * modes exist:
+ * default - a gutter-like spacing is placed around any expanded panel, placing the expanded
+ * panel at a different elevation from the rest of the accordion.
+ * flat - no spacing is placed around expanded panels, showing all panels at the same
+ * elevation.
+ */
+ this.displayMode = 'default';
+ /** The position of the expansion indicator. */
+ this.togglePosition = 'after';
+ }
+ /** Whether the expansion indicator should be hidden. */
+ get hideToggle() { return this._hideToggle; }
+ set hideToggle(show) { this._hideToggle = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(show); }
+ ngAfterContentInit() {
+ this._headers.changes
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_7__["startWith"])(this._headers))
+ .subscribe((headers) => {
+ this._ownHeaders.reset(headers.filter(header => header.panel.accordion === this));
+ this._ownHeaders.notifyOnChanges();
+ });
+ this._keyManager = new _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_6__["FocusKeyManager"](this._ownHeaders).withWrap().withHomeAndEnd();
+ }
+ /** Handles keyboard events coming in from the panel headers. */
+ _handleHeaderKeydown(event) {
+ this._keyManager.onKeydown(event);
+ }
+ _handleHeaderFocus(header) {
+ this._keyManager.updateActiveItem(header);
+ }
+ ngOnDestroy() {
+ super.ngOnDestroy();
+ this._ownHeaders.destroy();
+ }
+}
+MatAccordion.ɵfac = function MatAccordion_Factory(t) { return ɵMatAccordion_BaseFactory(t || MatAccordion); };
+MatAccordion.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineDirective"]({ type: MatAccordion, selectors: [["mat-accordion"]], contentQueries: function MatAccordion_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵcontentQuery"](dirIndex, MatExpansionPanelHeader, 1);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵloadQuery"]()) && (ctx._headers = _t);
+ } }, hostAttrs: [1, "mat-accordion"], hostVars: 2, hostBindings: function MatAccordion_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵclassProp"]("mat-accordion-multi", ctx.multi);
+ } }, inputs: { multi: "multi", displayMode: "displayMode", togglePosition: "togglePosition", hideToggle: "hideToggle" }, exportAs: ["matAccordion"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵProvidersFeature"]([{
+ provide: MAT_ACCORDION,
+ useExisting: MatAccordion
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵInheritDefinitionFeature"]] });
+MatAccordion.propDecorators = {
+ _headers: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ContentChildren"], args: [MatExpansionPanelHeader, { descendants: true },] }],
+ hideToggle: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }],
+ displayMode: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }],
+ togglePosition: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"] }]
+};
+const ɵMatAccordion_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵgetInheritedFactory"](MatAccordion);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatAccordion, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Directive"],
+ args: [{
+ selector: 'mat-accordion',
+ exportAs: 'matAccordion',
+ inputs: ['multi'],
+ providers: [{
+ provide: MAT_ACCORDION,
+ useExisting: MatAccordion
+ }],
+ host: {
+ class: 'mat-accordion',
+ // Class binding which is only used by the test harness as there is no other
+ // way for the harness to detect if multiple panel support is enabled.
+ '[class.mat-accordion-multi]': 'this.multi'
+ }
+ }]
+ }], null, { displayMode: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], togglePosition: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], hideToggle: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Input"]
+ }], _headers: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ContentChildren"],
+ args: [MatExpansionPanelHeader, { descendants: true }]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class MatExpansionModule {
+}
+MatExpansionModule.ɵfac = function MatExpansionModule_Factory(t) { return new (t || MatExpansionModule)(); };
+MatExpansionModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineNgModule"]({ type: MatExpansionModule });
+MatExpansionModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineInjector"]({ imports: [[_angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material_core__WEBPACK_IMPORTED_MODULE_4__["MatCommonModule"], _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__["CdkAccordionModule"], _angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__["PortalModule"]]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵsetNgModuleScope"](MatExpansionModule, { declarations: function () { return [MatAccordion, MatExpansionPanel, MatExpansionPanelActionRow, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription, MatExpansionPanelContent]; }, imports: function () { return [_angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material_core__WEBPACK_IMPORTED_MODULE_4__["MatCommonModule"], _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__["CdkAccordionModule"], _angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__["PortalModule"]]; }, exports: function () { return [MatAccordion, MatExpansionPanel, MatExpansionPanelActionRow, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription, MatExpansionPanelContent]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](MatExpansionModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["NgModule"],
+ args: [{
+ imports: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material_core__WEBPACK_IMPORTED_MODULE_4__["MatCommonModule"], _angular_cdk_accordion__WEBPACK_IMPORTED_MODULE_0__["CdkAccordionModule"], _angular_cdk_portal__WEBPACK_IMPORTED_MODULE_1__["PortalModule"]],
+ exports: [
+ MatAccordion,
+ MatExpansionPanel,
+ MatExpansionPanelActionRow,
+ MatExpansionPanelHeader,
+ MatExpansionPanelTitle,
+ MatExpansionPanelDescription,
+ MatExpansionPanelContent,
+ ],
+ declarations: [
+ MatAccordion,
+ MatExpansionPanel,
+ MatExpansionPanelActionRow,
+ MatExpansionPanelHeader,
+ MatExpansionPanelTitle,
+ MatExpansionPanelDescription,
+ MatExpansionPanelContent,
+ ]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=expansion.js.map
+
+/***/ }),
+
+/***/ "7HRe":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js ***!
+ \********************************************************************/
+/*! exports provided: scheduled */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; });
+/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scheduleObservable */ "5B2Y");
+/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./schedulePromise */ "4yVj");
+/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scheduleArray */ "jZKg");
+/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scheduleIterable */ "MBAA");
+/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/isInteropObservable */ "QIAL");
+/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/isPromise */ "c2HN");
+/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/isArrayLike */ "I55L");
+/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/isIterable */ "CMyj");
+
+
+
+
+
+
+
+
+function scheduled(input, scheduler) {
+ if (input != null) {
+ if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) {
+ return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler);
+ }
+ else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) {
+ return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler);
+ }
+ else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) {
+ return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler);
+ }
+ else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') {
+ return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler);
+ }
+ }
+ throw new TypeError((input !== null && typeof input || input) + ' is not observable');
+}
+//# sourceMappingURL=scheduled.js.map
+
+/***/ }),
+
+/***/ "7Hc7":
+/*!***************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduler/asap.js ***!
+ \***************************************************************/
+/*! exports provided: asapScheduler, asap */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return asapScheduler; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; });
+/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AsapAction */ "Pz8W");
+/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AsapScheduler */ "RUbi");
+
+
+const asapScheduler = new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]);
+const asap = asapScheduler;
+//# sourceMappingURL=asap.js.map
+
+/***/ }),
+
+/***/ "7o/Q":
+/*!***********************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/Subscriber.js ***!
+ \***********************************************************/
+/*! exports provided: Subscriber, SafeSubscriber */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return Subscriber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafeSubscriber", function() { return SafeSubscriber; });
+/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util/isFunction */ "n6bG");
+/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Observer */ "gRHU");
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Subscription */ "quSY");
+/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/symbol/rxSubscriber */ "2QA8");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./config */ "2fFW");
+/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util/hostReportError */ "NJ4a");
+
+
+
+
+
+
+class Subscriber extends _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"] {
+ constructor(destinationOrNext, error, complete) {
+ super();
+ this.syncErrorValue = null;
+ this.syncErrorThrown = false;
+ this.syncErrorThrowable = false;
+ this.isStopped = false;
+ switch (arguments.length) {
+ case 0:
+ this.destination = _Observer__WEBPACK_IMPORTED_MODULE_1__["empty"];
+ break;
+ case 1:
+ if (!destinationOrNext) {
+ this.destination = _Observer__WEBPACK_IMPORTED_MODULE_1__["empty"];
+ break;
+ }
+ if (typeof destinationOrNext === 'object') {
+ if (destinationOrNext instanceof Subscriber) {
+ this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
+ this.destination = destinationOrNext;
+ destinationOrNext.add(this);
+ }
+ else {
+ this.syncErrorThrowable = true;
+ this.destination = new SafeSubscriber(this, destinationOrNext);
+ }
+ break;
+ }
+ default:
+ this.syncErrorThrowable = true;
+ this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
+ break;
+ }
+ }
+ [_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_3__["rxSubscriber"]]() { return this; }
+ static create(next, error, complete) {
+ const subscriber = new Subscriber(next, error, complete);
+ subscriber.syncErrorThrowable = false;
+ return subscriber;
+ }
+ next(value) {
+ if (!this.isStopped) {
+ this._next(value);
+ }
+ }
+ error(err) {
+ if (!this.isStopped) {
+ this.isStopped = true;
+ this._error(err);
+ }
+ }
+ complete() {
+ if (!this.isStopped) {
+ this.isStopped = true;
+ this._complete();
+ }
+ }
+ unsubscribe() {
+ if (this.closed) {
+ return;
+ }
+ this.isStopped = true;
+ super.unsubscribe();
+ }
+ _next(value) {
+ this.destination.next(value);
+ }
+ _error(err) {
+ this.destination.error(err);
+ this.unsubscribe();
+ }
+ _complete() {
+ this.destination.complete();
+ this.unsubscribe();
+ }
+ _unsubscribeAndRecycle() {
+ const { _parentOrParents } = this;
+ this._parentOrParents = null;
+ this.unsubscribe();
+ this.closed = false;
+ this.isStopped = false;
+ this._parentOrParents = _parentOrParents;
+ return this;
+ }
+}
+class SafeSubscriber extends Subscriber {
+ constructor(_parentSubscriber, observerOrNext, error, complete) {
+ super();
+ this._parentSubscriber = _parentSubscriber;
+ let next;
+ let context = this;
+ if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_0__["isFunction"])(observerOrNext)) {
+ next = observerOrNext;
+ }
+ else if (observerOrNext) {
+ next = observerOrNext.next;
+ error = observerOrNext.error;
+ complete = observerOrNext.complete;
+ if (observerOrNext !== _Observer__WEBPACK_IMPORTED_MODULE_1__["empty"]) {
+ context = Object.create(observerOrNext);
+ if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_0__["isFunction"])(context.unsubscribe)) {
+ this.add(context.unsubscribe.bind(context));
+ }
+ context.unsubscribe = this.unsubscribe.bind(this);
+ }
+ }
+ this._context = context;
+ this._next = next;
+ this._error = error;
+ this._complete = complete;
+ }
+ next(value) {
+ if (!this.isStopped && this._next) {
+ const { _parentSubscriber } = this;
+ if (!_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+ this.__tryOrUnsub(this._next, value);
+ }
+ else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
+ this.unsubscribe();
+ }
+ }
+ }
+ error(err) {
+ if (!this.isStopped) {
+ const { _parentSubscriber } = this;
+ const { useDeprecatedSynchronousErrorHandling } = _config__WEBPACK_IMPORTED_MODULE_4__["config"];
+ if (this._error) {
+ if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+ this.__tryOrUnsub(this._error, err);
+ this.unsubscribe();
+ }
+ else {
+ this.__tryOrSetError(_parentSubscriber, this._error, err);
+ this.unsubscribe();
+ }
+ }
+ else if (!_parentSubscriber.syncErrorThrowable) {
+ this.unsubscribe();
+ if (useDeprecatedSynchronousErrorHandling) {
+ throw err;
+ }
+ Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_5__["hostReportError"])(err);
+ }
+ else {
+ if (useDeprecatedSynchronousErrorHandling) {
+ _parentSubscriber.syncErrorValue = err;
+ _parentSubscriber.syncErrorThrown = true;
+ }
+ else {
+ Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_5__["hostReportError"])(err);
+ }
+ this.unsubscribe();
+ }
+ }
+ }
+ complete() {
+ if (!this.isStopped) {
+ const { _parentSubscriber } = this;
+ if (this._complete) {
+ const wrappedComplete = () => this._complete.call(this._context);
+ if (!_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+ this.__tryOrUnsub(wrappedComplete);
+ this.unsubscribe();
+ }
+ else {
+ this.__tryOrSetError(_parentSubscriber, wrappedComplete);
+ this.unsubscribe();
+ }
+ }
+ else {
+ this.unsubscribe();
+ }
+ }
+ }
+ __tryOrUnsub(fn, value) {
+ try {
+ fn.call(this._context, value);
+ }
+ catch (err) {
+ this.unsubscribe();
+ if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) {
+ throw err;
+ }
+ else {
+ Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_5__["hostReportError"])(err);
+ }
+ }
+ }
+ __tryOrSetError(parent, fn, value) {
+ if (!_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) {
+ throw new Error('bad call');
+ }
+ try {
+ fn.call(this._context, value);
+ }
+ catch (err) {
+ if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) {
+ parent.syncErrorValue = err;
+ parent.syncErrorThrown = true;
+ return true;
+ }
+ else {
+ Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_5__["hostReportError"])(err);
+ return true;
+ }
+ }
+ return false;
+ }
+ _unsubscribe() {
+ const { _parentSubscriber } = this;
+ this._context = null;
+ this._parentSubscriber = null;
+ _parentSubscriber.unsubscribe();
+ }
+}
+//# sourceMappingURL=Subscriber.js.map
+
+/***/ }),
+
+/***/ "7ve7":
+/*!*****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduler/Action.js ***!
+ \*****************************************************************/
+/*! exports provided: Action */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; });
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscription */ "quSY");
+
+class Action extends _Subscription__WEBPACK_IMPORTED_MODULE_0__["Subscription"] {
+ constructor(scheduler, work) {
+ super();
+ }
+ schedule(state, delay = 0) {
+ return this;
+ }
+}
+//# sourceMappingURL=Action.js.map
+
+/***/ }),
+
+/***/ "7wxJ":
+/*!*********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/combineAll.js ***!
+ \*********************************************************************/
+/*! exports provided: combineAll */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; });
+/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../observable/combineLatest */ "itXk");
+
+function combineAll(project) {
+ return (source) => source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project));
+}
+//# sourceMappingURL=combineAll.js.map
+
+/***/ }),
+
+/***/ "8LU1":
+/*!********************************************************!*\
+ !*** ./node_modules/@angular/cdk/fesm2015/coercion.js ***!
+ \********************************************************/
+/*! exports provided: _isNumberValue, coerceArray, coerceBooleanProperty, coerceCssPixelValue, coerceElement, coerceNumberProperty, coerceStringArray */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isNumberValue", function() { return _isNumberValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceArray", function() { return coerceArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceBooleanProperty", function() { return coerceBooleanProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceCssPixelValue", function() { return coerceCssPixelValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceElement", function() { return coerceElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceNumberProperty", function() { return coerceNumberProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceStringArray", function() { return coerceStringArray; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Coerces a data-bound value (typically a string) to a boolean. */
+function coerceBooleanProperty(value) {
+ return value != null && `${value}` !== 'false';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function coerceNumberProperty(value, fallbackValue = 0) {
+ return _isNumberValue(value) ? Number(value) : fallbackValue;
+}
+/**
+ * Whether the provided value is considered a number.
+ * @docs-private
+ */
+function _isNumberValue(value) {
+ // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,
+ // and other non-number values as NaN, where Number just uses 0) but it considers the string
+ // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.
+ return !isNaN(parseFloat(value)) && !isNaN(Number(value));
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function coerceArray(value) {
+ return Array.isArray(value) ? value : [value];
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Coerces a value to a CSS pixel value. */
+function coerceCssPixelValue(value) {
+ if (value == null) {
+ return '';
+ }
+ return typeof value === 'string' ? value : `${value}px`;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Coerces an ElementRef or an Element into an element.
+ * Useful for APIs that can accept either a ref or the native element itself.
+ */
+function coerceElement(elementOrRef) {
+ return elementOrRef instanceof _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] ? elementOrRef.nativeElement : elementOrRef;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Coerces a value to an array of trimmed non-empty strings.
+ * Any input that is not an array, `null` or `undefined` will be turned into a string
+ * via `toString()` and subsequently split with the given separator.
+ * `null` and `undefined` will result in an empty array.
+ * This results in the following outcomes:
+ * - `null` -> `[]`
+ * - `[null]` -> `["null"]`
+ * - `["a", "b ", " "]` -> `["a", "b"]`
+ * - `[1, [2, 3]]` -> `["1", "2,3"]`
+ * - `[{ a: 0 }]` -> `["[object Object]"]`
+ * - `{ a: 0 }` -> `["[object", "Object]"]`
+ *
+ * Useful for defining CSS classes or table columns.
+ * @param value the value to coerce into an array of strings
+ * @param separator split-separator if value isn't an array
+ */
+function coerceStringArray(value, separator = /\s+/) {
+ const result = [];
+ if (value != null) {
+ const sourceValues = Array.isArray(value) ? value : `${value}`.split(separator);
+ for (const sourceValue of sourceValues) {
+ const trimmedString = `${sourceValue}`.trim();
+ if (trimmedString) {
+ result.push(trimmedString);
+ }
+ }
+ }
+ return result;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+
+//# sourceMappingURL=coercion.js.map
+
+
+/***/ }),
+
+/***/ "8Qeq":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/canReportError.js ***!
+ \********************************************************************/
+/*! exports provided: canReportError */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function canReportError(observer) {
+ while (observer) {
+ const { closed, destination, isStopped } = observer;
+ if (closed || isStopped) {
+ return false;
+ }
+ else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) {
+ observer = destination;
+ }
+ else {
+ observer = null;
+ }
+ }
+ return true;
+}
+//# sourceMappingURL=canReportError.js.map
+
+/***/ }),
+
+/***/ "9M8c":
+/*!**********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/bufferCount.js ***!
+ \**********************************************************************/
+/*! exports provided: bufferCount */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function bufferCount(bufferSize, startBufferEvery = null) {
+ return function bufferCountOperatorFunction(source) {
+ return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+ };
+}
+class BufferCountOperator {
+ constructor(bufferSize, startBufferEvery) {
+ this.bufferSize = bufferSize;
+ this.startBufferEvery = startBufferEvery;
+ if (!startBufferEvery || bufferSize === startBufferEvery) {
+ this.subscriberClass = BufferCountSubscriber;
+ }
+ else {
+ this.subscriberClass = BufferSkipCountSubscriber;
+ }
+ }
+ call(subscriber, source) {
+ return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
+ }
+}
+class BufferCountSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, bufferSize) {
+ super(destination);
+ this.bufferSize = bufferSize;
+ this.buffer = [];
+ }
+ _next(value) {
+ const buffer = this.buffer;
+ buffer.push(value);
+ if (buffer.length == this.bufferSize) {
+ this.destination.next(buffer);
+ this.buffer = [];
+ }
+ }
+ _complete() {
+ const buffer = this.buffer;
+ if (buffer.length > 0) {
+ this.destination.next(buffer);
+ }
+ super._complete();
+ }
+}
+class BufferSkipCountSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, bufferSize, startBufferEvery) {
+ super(destination);
+ this.bufferSize = bufferSize;
+ this.startBufferEvery = startBufferEvery;
+ this.buffers = [];
+ this.count = 0;
+ }
+ _next(value) {
+ const { bufferSize, startBufferEvery, buffers, count } = this;
+ this.count++;
+ if (count % startBufferEvery === 0) {
+ buffers.push([]);
+ }
+ for (let i = buffers.length; i--;) {
+ const buffer = buffers[i];
+ buffer.push(value);
+ if (buffer.length === bufferSize) {
+ buffers.splice(i, 1);
+ this.destination.next(buffer);
+ }
+ }
+ }
+ _complete() {
+ const { buffers, destination } = this;
+ while (buffers.length > 0) {
+ let buffer = buffers.shift();
+ if (buffer.length > 0) {
+ destination.next(buffer);
+ }
+ }
+ super._complete();
+ }
+}
+//# sourceMappingURL=bufferCount.js.map
+
+/***/ }),
+
+/***/ "9ihq":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/elementAt.js ***!
+ \********************************************************************/
+/*! exports provided: elementAt */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; });
+/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/ArgumentOutOfRangeError */ "4I5i");
+/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./filter */ "pLZG");
+/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./throwIfEmpty */ "XDbj");
+/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./defaultIfEmpty */ "xbPD");
+/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./take */ "IzEk");
+
+
+
+
+
+function elementAt(index, defaultValue) {
+ if (index < 0) {
+ throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"]();
+ }
+ const hasDefaultValue = arguments.length >= 2;
+ return (source) => source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])((v, i) => i === index), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue
+ ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue)
+ : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(() => new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"]()));
+}
+//# sourceMappingURL=elementAt.js.map
+
+/***/ }),
+
+/***/ "9ppp":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js ***!
+ \*****************************************************************************/
+/*! exports provided: ObjectUnsubscribedError */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; });
+const ObjectUnsubscribedErrorImpl = (() => {
+ function ObjectUnsubscribedErrorImpl() {
+ Error.call(this);
+ this.message = 'object unsubscribed';
+ this.name = 'ObjectUnsubscribedError';
+ return this;
+ }
+ ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
+ return ObjectUnsubscribedErrorImpl;
+})();
+const ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
+//# sourceMappingURL=ObjectUnsubscribedError.js.map
+
+/***/ }),
+
+/***/ "A3iJ":
+/*!********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/partition.js ***!
+ \********************************************************************/
+/*! exports provided: partition */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; });
+/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/not */ "F97/");
+/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./filter */ "pLZG");
+
+
+function partition(predicate, thisArg) {
+ return (source) => [
+ Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source),
+ Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source)
+ ];
+}
+//# sourceMappingURL=partition.js.map
+
+/***/ }),
+
+/***/ "BFxc":
+/*!*******************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/takeLast.js ***!
+ \*******************************************************************/
+/*! exports provided: takeLast */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/ArgumentOutOfRangeError */ "4I5i");
+/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../observable/empty */ "EY2u");
+
+
+
+function takeLast(count) {
+ return function takeLastOperatorFunction(source) {
+ if (count === 0) {
+ return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])();
+ }
+ else {
+ return source.lift(new TakeLastOperator(count));
+ }
+ };
+}
+class TakeLastOperator {
+ constructor(total) {
+ this.total = total;
+ if (this.total < 0) {
+ throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_1__["ArgumentOutOfRangeError"];
+ }
+ }
+ call(subscriber, source) {
+ return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
+ }
+}
+class TakeLastSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, total) {
+ super(destination);
+ this.total = total;
+ this.ring = new Array();
+ this.count = 0;
+ }
+ _next(value) {
+ const ring = this.ring;
+ const total = this.total;
+ const count = this.count++;
+ if (ring.length < total) {
+ ring.push(value);
+ }
+ else {
+ const index = count % total;
+ ring[index] = value;
+ }
+ }
+ _complete() {
+ const destination = this.destination;
+ let count = this.count;
+ if (count > 0) {
+ const total = this.count >= this.total ? this.total : this.count;
+ const ring = this.ring;
+ for (let i = 0; i < total; i++) {
+ const idx = (count++) % total;
+ destination.next(ring[idx]);
+ }
+ }
+ destination.complete();
+ }
+}
+//# sourceMappingURL=takeLast.js.map
+
+/***/ }),
+
+/***/ "CMyj":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/isIterable.js ***!
+ \****************************************************************/
+/*! exports provided: isIterable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; });
+/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../symbol/iterator */ "Lhse");
+
+function isIterable(input) {
+ return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function';
+}
+//# sourceMappingURL=isIterable.js.map
+
+/***/ }),
+
+/***/ "CRDf":
+/*!***************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js ***!
+ \***************************************************************************/
+/*! exports provided: subscribeToObservable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; });
+/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../symbol/observable */ "kJWO");
+
+const subscribeToObservable = (obj) => (subscriber) => {
+ const obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]]();
+ if (typeof obs.subscribe !== 'function') {
+ throw new TypeError('Provided object does not correctly implement Symbol.observable');
+ }
+ else {
+ return obs.subscribe(subscriber);
+ }
+};
+//# sourceMappingURL=subscribeToObservable.js.map
+
+/***/ }),
+
+/***/ "Cfvw":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/from.js ***!
+ \****************************************************************/
+/*! exports provided: from */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/subscribeTo */ "SeVD");
+/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scheduled/scheduled */ "7HRe");
+
+
+
+function from(input, scheduler) {
+ if (!scheduler) {
+ if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) {
+ return input;
+ }
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input));
+ }
+ else {
+ return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler);
+ }
+}
+//# sourceMappingURL=from.js.map
+
+/***/ }),
+
+/***/ "CqXF":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/mapTo.js ***!
+ \****************************************************************/
+/*! exports provided: mapTo */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; });
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+
+function mapTo(value) {
+ return (source) => source.lift(new MapToOperator(value));
+}
+class MapToOperator {
+ constructor(value) {
+ this.value = value;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new MapToSubscriber(subscriber, this.value));
+ }
+}
+class MapToSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"] {
+ constructor(destination, value) {
+ super(destination);
+ this.value = value;
+ }
+ _next(x) {
+ this.destination.next(this.value);
+ }
+}
+//# sourceMappingURL=mapTo.js.map
+
+/***/ }),
+
+/***/ "D0XW":
+/*!****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/scheduler/async.js ***!
+ \****************************************************************/
+/*! exports provided: asyncScheduler, async */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return asyncScheduler; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; });
+/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AsyncAction */ "3N8a");
+/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AsyncScheduler */ "IjjT");
+
+
+const asyncScheduler = new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]);
+const async = asyncScheduler;
+//# sourceMappingURL=async.js.map
+
+/***/ }),
+
+/***/ "DH7j":
+/*!*************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/isArray.js ***!
+ \*************************************************************/
+/*! exports provided: isArray */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return isArray; });
+const isArray = (() => Array.isArray || ((x) => x && typeof x.length === 'number'))();
+//# sourceMappingURL=isArray.js.map
+
+/***/ }),
+
+/***/ "EQ5u":
+/*!*********************************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js ***!
+ \*********************************************************************************/
+/*! exports provided: ConnectableObservable, connectableObservableDescriptor */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; });
+/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subject */ "XNiG");
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Observable */ "HDdC");
+/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Subscriber */ "7o/Q");
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Subscription */ "quSY");
+/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../operators/refCount */ "x+ZX");
+
+
+
+
+
+class ConnectableObservable extends _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"] {
+ constructor(source, subjectFactory) {
+ super();
+ this.source = source;
+ this.subjectFactory = subjectFactory;
+ this._refCount = 0;
+ this._isComplete = false;
+ }
+ _subscribe(subscriber) {
+ return this.getSubject().subscribe(subscriber);
+ }
+ getSubject() {
+ const subject = this._subject;
+ if (!subject || subject.isStopped) {
+ this._subject = this.subjectFactory();
+ }
+ return this._subject;
+ }
+ connect() {
+ let connection = this._connection;
+ if (!connection) {
+ this._isComplete = false;
+ connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"]();
+ connection.add(this.source
+ .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
+ if (connection.closed) {
+ this._connection = null;
+ connection = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY;
+ }
+ }
+ return connection;
+ }
+ refCount() {
+ return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_4__["refCount"])()(this);
+ }
+}
+const connectableObservableDescriptor = (() => {
+ const connectableProto = ConnectableObservable.prototype;
+ return {
+ operator: { value: null },
+ _refCount: { value: 0, writable: true },
+ _subject: { value: null, writable: true },
+ _connection: { value: null, writable: true },
+ _subscribe: { value: connectableProto._subscribe },
+ _isComplete: { value: connectableProto._isComplete, writable: true },
+ getSubject: { value: connectableProto.getSubject },
+ connect: { value: connectableProto.connect },
+ refCount: { value: connectableProto.refCount }
+ };
+})();
+class ConnectableSubscriber extends _Subject__WEBPACK_IMPORTED_MODULE_0__["SubjectSubscriber"] {
+ constructor(destination, connectable) {
+ super(destination);
+ this.connectable = connectable;
+ }
+ _error(err) {
+ this._unsubscribe();
+ super._error(err);
+ }
+ _complete() {
+ this.connectable._isComplete = true;
+ this._unsubscribe();
+ super._complete();
+ }
+ _unsubscribe() {
+ const connectable = this.connectable;
+ if (connectable) {
+ this.connectable = null;
+ const connection = connectable._connection;
+ connectable._refCount = 0;
+ connectable._subject = null;
+ connectable._connection = null;
+ if (connection) {
+ connection.unsubscribe();
+ }
+ }
+ }
+}
+class RefCountOperator {
+ constructor(connectable) {
+ this.connectable = connectable;
+ }
+ call(subscriber, source) {
+ const { connectable } = this;
+ connectable._refCount++;
+ const refCounter = new RefCountSubscriber(subscriber, connectable);
+ const subscription = source.subscribe(refCounter);
+ if (!refCounter.closed) {
+ refCounter.connection = connectable.connect();
+ }
+ return subscription;
+ }
+}
+class RefCountSubscriber extends _Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"] {
+ constructor(destination, connectable) {
+ super(destination);
+ this.connectable = connectable;
+ }
+ _unsubscribe() {
+ const { connectable } = this;
+ if (!connectable) {
+ this.connection = null;
+ return;
+ }
+ this.connectable = null;
+ const refCount = connectable._refCount;
+ if (refCount <= 0) {
+ this.connection = null;
+ return;
+ }
+ connectable._refCount = refCount - 1;
+ if (refCount > 1) {
+ this.connection = null;
+ return;
+ }
+ const { connection } = this;
+ const sharedConnection = connectable._connection;
+ this.connection = null;
+ if (sharedConnection && (!connection || sharedConnection === connection)) {
+ sharedConnection.unsubscribe();
+ }
+ }
+}
+//# sourceMappingURL=ConnectableObservable.js.map
+
+/***/ }),
+
+/***/ "EY2u":
+/*!*****************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/observable/empty.js ***!
+ \*****************************************************************/
+/*! exports provided: EMPTY, empty */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; });
+/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Observable */ "HDdC");
+
+const EMPTY = new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => subscriber.complete());
+function empty(scheduler) {
+ return scheduler ? emptyScheduled(scheduler) : EMPTY;
+}
+function emptyScheduled(scheduler) {
+ return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](subscriber => scheduler.schedule(() => subscriber.complete()));
+}
+//# sourceMappingURL=empty.js.map
+
+/***/ }),
+
+/***/ "F97/":
+/*!*********************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/util/not.js ***!
+ \*********************************************************/
+/*! exports provided: not */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; });
+function not(pred, thisArg) {
+ function notPred() {
+ return !(notPred.pred.apply(notPred.thisArg, arguments));
+ }
+ notPred.pred = pred;
+ notPred.thisArg = thisArg;
+ return notPred;
+}
+//# sourceMappingURL=not.js.map
+
+/***/ }),
+
+/***/ "FD9M":
+/*!***********************************************************************!*\
+ !*** ./node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js ***!
+ \***********************************************************************/
+/*! exports provided: bufferToggle */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; });
+/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Subscription */ "quSY");
+/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/subscribeToResult */ "ZUHj");
+/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../OuterSubscriber */ "l7GE");
+
+
+
+function bufferToggle(openings, closingSelector) {
+ return function bufferToggleOperatorFunction(source) {
+ return source.lift(new BufferToggleOperator(openings, closingSelector));
+ };
+}
+class BufferToggleOperator {
+ constructor(openings, closingSelector) {
+ this.openings = openings;
+ this.closingSelector = closingSelector;
+ }
+ call(subscriber, source) {
+ return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
+ }
+}
+class BufferToggleSubscriber extends _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"] {
+ constructor(destination, openings, closingSelector) {
+ super(destination);
+ this.closingSelector = closingSelector;
+ this.contexts = [];
+ this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, openings));
+ }
+ _next(value) {
+ const contexts = this.contexts;
+ const len = contexts.length;
+ for (let i = 0; i < len; i++) {
+ contexts[i].buffer.push(value);
+ }
+ }
+ _error(err) {
+ const contexts = this.contexts;
+ while (contexts.length > 0) {
+ const context = contexts.shift();
+ context.subscription.unsubscribe();
+ context.buffer = null;
+ context.subscription = null;
+ }
+ this.contexts = null;
+ super._error(err);
+ }
+ _complete() {
+ const contexts = this.contexts;
+ while (contexts.length > 0) {
+ const context = contexts.shift();
+ this.destination.next(context.buffer);
+ context.subscription.unsubscribe();
+ context.buffer = null;
+ context.subscription = null;
+ }
+ this.contexts = null;
+ super._complete();
+ }
+ notifyNext(outerValue, innerValue) {
+ outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
+ }
+ notifyComplete(innerSub) {
+ this.closeBuffer(innerSub.context);
+ }
+ openBuffer(value) {
+ try {
+ const closingSelector = this.closingSelector;
+ const closingNotifier = closingSelector.call(this, value);
+ if (closingNotifier) {
+ this.trySubscribe(closingNotifier);
+ }
+ }
+ catch (err) {
+ this._error(err);
+ }
+ }
+ closeBuffer(context) {
+ const contexts = this.contexts;
+ if (contexts && context) {
+ const { buffer, subscription } = context;
+ this.destination.next(buffer);
+ contexts.splice(contexts.indexOf(context), 1);
+ this.remove(subscription);
+ subscription.unsubscribe();
+ }
+ }
+ trySubscribe(closingNotifier) {
+ const contexts = this.contexts;
+ const buffer = [];
+ const subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_0__["Subscription"]();
+ const context = { buffer, subscription };
+ contexts.push(context);
+ const innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, closingNotifier, context);
+ if (!innerSubscription || innerSubscription.closed) {
+ this.closeBuffer(context);
+ }
+ else {
+ innerSubscription.context = context;
+ this.add(innerSubscription);
+ subscription.add(innerSubscription);
+ }
+ }
+}
+//# sourceMappingURL=bufferToggle.js.map
+
+/***/ }),
+
+/***/ "FKr1":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@angular/material/__ivy_ngcc__/fesm2015/core.js ***!
+ \**********************************************************************/
+/*! exports provided: AnimationCurves, AnimationDurations, DateAdapter, ErrorStateMatcher, MATERIAL_SANITY_CHECKS, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MAT_DATE_LOCALE_FACTORY, MAT_NATIVE_DATE_FORMATS, MAT_OPTGROUP, MAT_OPTION_PARENT_COMPONENT, MAT_RIPPLE_GLOBAL_OPTIONS, MatCommonModule, MatLine, MatLineModule, MatNativeDateModule, MatOptgroup, MatOption, MatOptionModule, MatOptionSelectionChange, MatPseudoCheckbox, MatPseudoCheckboxModule, MatRipple, MatRippleModule, NativeDateAdapter, NativeDateModule, RippleRef, RippleRenderer, ShowOnDirtyErrorStateMatcher, VERSION, _MatOptgroupBase, _MatOptionBase, _countGroupLabelsBeforeOption, _getOptionScrollPosition, defaultRippleAnimationConfig, mixinColor, mixinDisableRipple, mixinDisabled, mixinErrorState, mixinInitialized, mixinTabIndex, setLines, ɵ0, ɵangular_material_src_material_core_core_a */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationCurves", function() { return AnimationCurves; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationDurations", function() { return AnimationDurations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DateAdapter", function() { return DateAdapter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorStateMatcher", function() { return ErrorStateMatcher; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MATERIAL_SANITY_CHECKS", function() { return MATERIAL_SANITY_CHECKS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_DATE_FORMATS", function() { return MAT_DATE_FORMATS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_DATE_LOCALE", function() { return MAT_DATE_LOCALE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_DATE_LOCALE_FACTORY", function() { return MAT_DATE_LOCALE_FACTORY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_NATIVE_DATE_FORMATS", function() { return MAT_NATIVE_DATE_FORMATS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_OPTGROUP", function() { return MAT_OPTGROUP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_OPTION_PARENT_COMPONENT", function() { return MAT_OPTION_PARENT_COMPONENT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAT_RIPPLE_GLOBAL_OPTIONS", function() { return MAT_RIPPLE_GLOBAL_OPTIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatCommonModule", function() { return MatCommonModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatLine", function() { return MatLine; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatLineModule", function() { return MatLineModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatNativeDateModule", function() { return MatNativeDateModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatOptgroup", function() { return MatOptgroup; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatOption", function() { return MatOption; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatOptionModule", function() { return MatOptionModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatOptionSelectionChange", function() { return MatOptionSelectionChange; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatPseudoCheckbox", function() { return MatPseudoCheckbox; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatPseudoCheckboxModule", function() { return MatPseudoCheckboxModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatRipple", function() { return MatRipple; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatRippleModule", function() { return MatRippleModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NativeDateAdapter", function() { return NativeDateAdapter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NativeDateModule", function() { return NativeDateModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RippleRef", function() { return RippleRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RippleRenderer", function() { return RippleRenderer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShowOnDirtyErrorStateMatcher", function() { return ShowOnDirtyErrorStateMatcher; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_MatOptgroupBase", function() { return _MatOptgroupBase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_MatOptionBase", function() { return _MatOptionBase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_countGroupLabelsBeforeOption", function() { return _countGroupLabelsBeforeOption; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getOptionScrollPosition", function() { return _getOptionScrollPosition; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRippleAnimationConfig", function() { return defaultRippleAnimationConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinColor", function() { return mixinColor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinDisableRipple", function() { return mixinDisableRipple; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinDisabled", function() { return mixinDisabled; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinErrorState", function() { return mixinErrorState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinInitialized", function() { return mixinInitialized; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mixinTabIndex", function() { return mixinTabIndex; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLines", function() { return setLines; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵ0", function() { return ɵ0$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_material_src_material_core_core_a", function() { return MATERIAL_SANITY_CHECKS_FACTORY; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "fXoL");
+/* harmony import */ var _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/cdk/a11y */ "u47x");
+/* harmony import */ var _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/cdk/bidi */ "cH1L");
+/* harmony import */ var _angular_cdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/cdk */ "xz+E");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/common */ "ofXK");
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/cdk/coercion */ "8LU1");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rxjs */ "qCKp");
+/* harmony import */ var _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/cdk/platform */ "nLfN");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rxjs/operators */ "kU1M");
+/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/platform-browser/animations */ "R1ws");
+/* harmony import */ var _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/cdk/keycodes */ "FtGj");
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Current version of Angular Material. */
+
+
+
+
+
+const _c0 = ["*", [["mat-option"], ["ng-container"]]];
+const _c1 = ["*", "mat-option, ng-container"];
+function MatOption_mat_pseudo_checkbox_0_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "mat-pseudo-checkbox", 4);
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("state", ctx_r0.selected ? "checked" : "unchecked")("disabled", ctx_r0.disabled);
+} }
+function MatOption_span_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("(", ctx_r1.group.label, ")");
+} }
+const _c2 = ["*"];
+const VERSION = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Version"]('11.2.9');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** @docs-private */
+class AnimationCurves {
+}
+AnimationCurves.STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';
+AnimationCurves.DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';
+AnimationCurves.ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';
+AnimationCurves.SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';
+/** @docs-private */
+class AnimationDurations {
+}
+AnimationDurations.COMPLEX = '375ms';
+AnimationDurations.ENTERING = '225ms';
+AnimationDurations.EXITING = '195ms';
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Private version constant to circumvent test/build issues,
+// i.e. avoid core to depend on the @angular/material primary entry-point
+// Can be removed once the Material primary entry-point no longer
+// re-exports all secondary entry-points
+const VERSION$1 = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Version"]('11.2.9');
+/** @docs-private */
+function MATERIAL_SANITY_CHECKS_FACTORY() {
+ return true;
+}
+/** Injection token that configures whether the Material sanity checks are enabled. */
+const MATERIAL_SANITY_CHECKS = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('mat-sanity-checks', {
+ providedIn: 'root',
+ factory: MATERIAL_SANITY_CHECKS_FACTORY,
+});
+/**
+ * Module that captures anything that should be loaded and/or run for *all* Angular Material
+ * components. This includes Bidi, etc.
+ *
+ * This module should be imported to each top-level component module (e.g., MatTabsModule).
+ */
+class MatCommonModule {
+ constructor(highContrastModeDetector, sanityChecks, document) {
+ /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */
+ this._hasDoneGlobalChecks = false;
+ this._document = document;
+ // While A11yModule also does this, we repeat it here to avoid importing A11yModule
+ // in MatCommonModule.
+ highContrastModeDetector._applyBodyHighContrastModeCssClasses();
+ // Note that `_sanityChecks` is typed to `any`, because AoT
+ // throws an error if we use the `SanityChecks` type directly.
+ this._sanityChecks = sanityChecks;
+ if (!this._hasDoneGlobalChecks) {
+ this._checkDoctypeIsDefined();
+ this._checkThemeIsPresent();
+ this._checkCdkVersionMatch();
+ this._hasDoneGlobalChecks = true;
+ }
+ }
+ /** Use defaultView of injected document if available or fallback to global window reference */
+ _getWindow() {
+ const win = this._document.defaultView || window;
+ return typeof win === 'object' && win ? win : null;
+ }
+ /** Whether any sanity checks are enabled. */
+ _checksAreEnabled() {
+ // TODO(crisbeto): we can't use `ngDevMode` here yet, because ViewEngine apps might not support
+ // it. Since these checks can have performance implications and they aren't tree shakeable
+ // in their current form, we can leave the `isDevMode` check in for now.
+ // tslint:disable-next-line:ban
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["isDevMode"])() && !this._isTestEnv();
+ }
+ /** Whether the code is running in tests. */
+ _isTestEnv() {
+ const window = this._getWindow();
+ return window && (window.__karma__ || window.jasmine);
+ }
+ _checkDoctypeIsDefined() {
+ const isEnabled = this._checksAreEnabled() &&
+ (this._sanityChecks === true || this._sanityChecks.doctype);
+ if (isEnabled && !this._document.doctype) {
+ console.warn('Current document does not have a doctype. This may cause ' +
+ 'some Angular Material components not to behave as expected.');
+ }
+ }
+ _checkThemeIsPresent() {
+ // We need to assert that the `body` is defined, because these checks run very early
+ // and the `body` won't be defined if the consumer put their scripts in the `head`.
+ const isDisabled = !this._checksAreEnabled() ||
+ (this._sanityChecks === false || !this._sanityChecks.theme);
+ if (isDisabled || !this._document.body || typeof getComputedStyle !== 'function') {
+ return;
+ }
+ const testElement = this._document.createElement('div');
+ testElement.classList.add('mat-theme-loaded-marker');
+ this._document.body.appendChild(testElement);
+ const computedStyle = getComputedStyle(testElement);
+ // In some situations the computed style of the test element can be null. For example in
+ // Firefox, the computed style is null if an application is running inside of a hidden iframe.
+ // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397
+ if (computedStyle && computedStyle.display !== 'none') {
+ console.warn('Could not find Angular Material core theme. Most Material ' +
+ 'components may not work as expected. For more info refer ' +
+ 'to the theming guide: https://material.angular.io/guide/theming');
+ }
+ this._document.body.removeChild(testElement);
+ }
+ /** Checks whether the material version matches the cdk version */
+ _checkCdkVersionMatch() {
+ const isEnabled = this._checksAreEnabled() &&
+ (this._sanityChecks === true || this._sanityChecks.version);
+ if (isEnabled && VERSION$1.full !== _angular_cdk__WEBPACK_IMPORTED_MODULE_3__["VERSION"].full) {
+ console.warn('The Angular Material version (' + VERSION$1.full + ') does not match ' +
+ 'the Angular CDK version (' + _angular_cdk__WEBPACK_IMPORTED_MODULE_3__["VERSION"].full + ').\n' +
+ 'Please ensure the versions of these two packages exactly match.');
+ }
+ }
+}
+MatCommonModule.ɵfac = function MatCommonModule_Factory(t) { return new (t || MatCommonModule)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["HighContrastModeDetector"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](MATERIAL_SANITY_CHECKS, 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_4__["DOCUMENT"])); };
+MatCommonModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatCommonModule });
+MatCommonModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ imports: [[_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]], _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]] });
+MatCommonModule.ctorParameters = () => [
+ { type: _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["HighContrastModeDetector"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MATERIAL_SANITY_CHECKS,] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_4__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatCommonModule, { imports: function () { return [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]]; }, exports: function () { return [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatCommonModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]],
+ exports: [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_2__["BidiModule"]]
+ }]
+ }], function () { return [{ type: _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["HighContrastModeDetector"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [MATERIAL_SANITY_CHECKS]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_4__["DOCUMENT"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Mixin to augment a directive with a `disabled` property. */
+function mixinDisabled(base) {
+ return class extends base {
+ constructor(...args) {
+ super(...args);
+ this._disabled = false;
+ }
+ get disabled() { return this._disabled; }
+ set disabled(value) { this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value); }
+ };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Mixin to augment a directive with a `color` property. */
+function mixinColor(base, defaultColor) {
+ return class extends base {
+ constructor(...args) {
+ super(...args);
+ this.defaultColor = defaultColor;
+ // Set the default color that can be specified from the mixin.
+ this.color = defaultColor;
+ }
+ get color() { return this._color; }
+ set color(value) {
+ const colorPalette = value || this.defaultColor;
+ if (colorPalette !== this._color) {
+ if (this._color) {
+ this._elementRef.nativeElement.classList.remove(`mat-${this._color}`);
+ }
+ if (colorPalette) {
+ this._elementRef.nativeElement.classList.add(`mat-${colorPalette}`);
+ }
+ this._color = colorPalette;
+ }
+ }
+ };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Mixin to augment a directive with a `disableRipple` property. */
+function mixinDisableRipple(base) {
+ class Mixin extends base {
+ constructor(...args) {
+ super(...args);
+ this._disableRipple = false;
+ }
+ /** Whether the ripple effect is disabled or not. */
+ get disableRipple() { return this._disableRipple; }
+ set disableRipple(value) { this._disableRipple = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value); }
+ }
+ // Since we don't directly extend from `base` with it's original types, and we instruct
+ // TypeScript that `T` actually is instantiatable through `new`, the types don't overlap.
+ // This is a limitation in TS as abstract classes cannot be typed properly dynamically.
+ return Mixin;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Mixin to augment a directive with a `tabIndex` property. */
+function mixinTabIndex(base, defaultTabIndex = 0) {
+ // Note: We cast `base` to `unknown` and then `Constructor`. It could be an abstract class,
+ // but given we `extend` it from another class, we can assume a constructor being accessible.
+ class Mixin extends base {
+ constructor(...args) {
+ super(...args);
+ this._tabIndex = defaultTabIndex;
+ this.defaultTabIndex = defaultTabIndex;
+ }
+ get tabIndex() { return this.disabled ? -1 : this._tabIndex; }
+ set tabIndex(value) {
+ // If the specified tabIndex value is null or undefined, fall back to the default value.
+ this._tabIndex = value != null ? Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceNumberProperty"])(value) : this.defaultTabIndex;
+ }
+ }
+ // Since we don't directly extend from `base` with it's original types, and we instruct
+ // TypeScript that `T` actually is instantiatable through `new`, the types don't overlap.
+ // This is a limitation in TS as abstract classes cannot be typed properly dynamically.
+ return Mixin;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Mixin to augment a directive with updateErrorState method.
+ * For component with `errorState` and need to update `errorState`.
+ */
+function mixinErrorState(base) {
+ return class extends base {
+ constructor(...args) {
+ super(...args);
+ /** Whether the component is in an error state. */
+ this.errorState = false;
+ /**
+ * Stream that emits whenever the state of the input changes such that the wrapping
+ * `MatFormField` needs to run change detection.
+ */
+ this.stateChanges = new rxjs__WEBPACK_IMPORTED_MODULE_6__["Subject"]();
+ }
+ updateErrorState() {
+ const oldState = this.errorState;
+ const parent = this._parentFormGroup || this._parentForm;
+ const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;
+ const control = this.ngControl ? this.ngControl.control : null;
+ const newState = matcher.isErrorState(control, parent);
+ if (newState !== oldState) {
+ this.errorState = newState;
+ this.stateChanges.next();
+ }
+ }
+ };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Mixin to augment a directive with an initialized property that will emits when ngOnInit ends. */
+function mixinInitialized(base) {
+ return class extends base {
+ constructor(...args) {
+ super(...args);
+ /** Whether this directive has been marked as initialized. */
+ this._isInitialized = false;
+ /**
+ * List of subscribers that subscribed before the directive was initialized. Should be notified
+ * during _markInitialized. Set to null after pending subscribers are notified, and should
+ * not expect to be populated after.
+ */
+ this._pendingSubscribers = [];
+ /**
+ * Observable stream that emits when the directive initializes. If already initialized, the
+ * subscriber is stored to be notified once _markInitialized is called.
+ */
+ this.initialized = new rxjs__WEBPACK_IMPORTED_MODULE_6__["Observable"](subscriber => {
+ // If initialized, immediately notify the subscriber. Otherwise store the subscriber to notify
+ // when _markInitialized is called.
+ if (this._isInitialized) {
+ this._notifySubscriber(subscriber);
+ }
+ else {
+ this._pendingSubscribers.push(subscriber);
+ }
+ });
+ }
+ /**
+ * Marks the state as initialized and notifies pending subscribers. Should be called at the end
+ * of ngOnInit.
+ * @docs-private
+ */
+ _markInitialized() {
+ if (this._isInitialized && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('This directive has already been marked as initialized and ' +
+ 'should not be called twice.');
+ }
+ this._isInitialized = true;
+ this._pendingSubscribers.forEach(this._notifySubscriber);
+ this._pendingSubscribers = null;
+ }
+ /** Emits and completes the subscriber stream (should only emit once). */
+ _notifySubscriber(subscriber) {
+ subscriber.next();
+ subscriber.complete();
+ }
+ };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** InjectionToken for datepicker that can be used to override default locale code. */
+const MAT_DATE_LOCALE = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('MAT_DATE_LOCALE', {
+ providedIn: 'root',
+ factory: MAT_DATE_LOCALE_FACTORY,
+});
+/** @docs-private */
+function MAT_DATE_LOCALE_FACTORY() {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]);
+}
+/** Adapts type `D` to be usable as a date by cdk-based components that work with dates. */
+class DateAdapter {
+ constructor() {
+ this._localeChanges = new rxjs__WEBPACK_IMPORTED_MODULE_6__["Subject"]();
+ /** A stream that emits when the locale changes. */
+ this.localeChanges = this._localeChanges;
+ }
+ /**
+ * Given a potential date object, returns that same date object if it is
+ * a valid date, or `null` if it's not a valid date.
+ * @param obj The object to check.
+ * @returns A date or `null`.
+ */
+ getValidDateOrNull(obj) {
+ return this.isDateInstance(obj) && this.isValid(obj) ? obj : null;
+ }
+ /**
+ * Attempts to deserialize a value to a valid date object. This is different from parsing in that
+ * deserialize should only accept non-ambiguous, locale-independent formats (e.g. a ISO 8601
+ * string). The default implementation does not allow any deserialization, it simply checks that
+ * the given value is already a valid date object or null. The `` will call this
+ * method on all of its `@Input()` properties that accept dates. It is therefore possible to
+ * support passing values from your backend directly to these properties by overriding this method
+ * to also deserialize the format used by your backend.
+ * @param value The value to be deserialized into a date object.
+ * @returns The deserialized date object, either a valid date, null if the value can be
+ * deserialized into a null date (e.g. the empty string), or an invalid date.
+ */
+ deserialize(value) {
+ if (value == null || this.isDateInstance(value) && this.isValid(value)) {
+ return value;
+ }
+ return this.invalid();
+ }
+ /**
+ * Sets the locale used for all dates.
+ * @param locale The new locale.
+ */
+ setLocale(locale) {
+ this.locale = locale;
+ this._localeChanges.next();
+ }
+ /**
+ * Compares two dates.
+ * @param first The first date to compare.
+ * @param second The second date to compare.
+ * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,
+ * a number greater than 0 if the first date is later.
+ */
+ compareDate(first, second) {
+ return this.getYear(first) - this.getYear(second) ||
+ this.getMonth(first) - this.getMonth(second) ||
+ this.getDate(first) - this.getDate(second);
+ }
+ /**
+ * Checks if two dates are equal.
+ * @param first The first date to check.
+ * @param second The second date to check.
+ * @returns Whether the two dates are equal.
+ * Null dates are considered equal to other null dates.
+ */
+ sameDate(first, second) {
+ if (first && second) {
+ let firstValid = this.isValid(first);
+ let secondValid = this.isValid(second);
+ if (firstValid && secondValid) {
+ return !this.compareDate(first, second);
+ }
+ return firstValid == secondValid;
+ }
+ return first == second;
+ }
+ /**
+ * Clamp the given date between min and max dates.
+ * @param date The date to clamp.
+ * @param min The minimum value to allow. If null or omitted no min is enforced.
+ * @param max The maximum value to allow. If null or omitted no max is enforced.
+ * @returns `min` if `date` is less than `min`, `max` if date is greater than `max`,
+ * otherwise `date`.
+ */
+ clampDate(date, min, max) {
+ if (min && this.compareDate(date, min) < 0) {
+ return min;
+ }
+ if (max && this.compareDate(date, max) > 0) {
+ return max;
+ }
+ return date;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const MAT_DATE_FORMATS = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('mat-date-formats');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// TODO(mmalerba): Remove when we no longer support safari 9.
+/** Whether the browser supports the Intl API. */
+let SUPPORTS_INTL_API;
+// We need a try/catch around the reference to `Intl`, because accessing it in some cases can
+// cause IE to throw. These cases are tied to particular versions of Windows and can happen if
+// the consumer is providing a polyfilled `Map`. See:
+// https://github.com/Microsoft/ChakraCore/issues/3189
+// https://github.com/angular/components/issues/15687
+try {
+ SUPPORTS_INTL_API = typeof Intl != 'undefined';
+}
+catch (_a) {
+ SUPPORTS_INTL_API = false;
+}
+/** The default month names to use if Intl API is not available. */
+const DEFAULT_MONTH_NAMES = {
+ 'long': [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',
+ 'October', 'November', 'December'
+ ],
+ 'short': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ 'narrow': ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']
+};
+const ɵ0 = i => String(i + 1);
+/** The default date names to use if Intl API is not available. */
+const DEFAULT_DATE_NAMES = range(31, ɵ0);
+/** The default day of the week names to use if Intl API is not available. */
+const DEFAULT_DAY_OF_WEEK_NAMES = {
+ 'long': ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ 'short': ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ 'narrow': ['S', 'M', 'T', 'W', 'T', 'F', 'S']
+};
+/**
+ * Matches strings that have the form of a valid RFC 3339 string
+ * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date
+ * because the regex will match strings an with out of bounds month, date, etc.
+ */
+const ISO_8601_REGEX = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|(?:(?:\+|-)\d{2}:\d{2}))?)?$/;
+/** Creates an array and fills it with values. */
+function range(length, valueFunction) {
+ const valuesArray = Array(length);
+ for (let i = 0; i < length; i++) {
+ valuesArray[i] = valueFunction(i);
+ }
+ return valuesArray;
+}
+/** Adapts the native JS Date for use with cdk-based components that work with dates. */
+class NativeDateAdapter extends DateAdapter {
+ constructor(matDateLocale, platform) {
+ super();
+ /**
+ * Whether to use `timeZone: 'utc'` with `Intl.DateTimeFormat` when formatting dates.
+ * Without this `Intl.DateTimeFormat` sometimes chooses the wrong timeZone, which can throw off
+ * the result. (e.g. in the en-US locale `new Date(1800, 7, 14).toLocaleDateString()`
+ * will produce `'8/13/1800'`.
+ *
+ * TODO(mmalerba): drop this variable. It's not being used in the code right now. We're now
+ * getting the string representation of a Date object from its utc representation. We're keeping
+ * it here for sometime, just for precaution, in case we decide to revert some of these changes
+ * though.
+ */
+ this.useUtcForDisplay = true;
+ super.setLocale(matDateLocale);
+ // IE does its own time zone correction, so we disable this on IE.
+ this.useUtcForDisplay = !platform.TRIDENT;
+ this._clampDate = platform.TRIDENT || platform.EDGE;
+ }
+ getYear(date) {
+ return date.getFullYear();
+ }
+ getMonth(date) {
+ return date.getMonth();
+ }
+ getDate(date) {
+ return date.getDate();
+ }
+ getDayOfWeek(date) {
+ return date.getDay();
+ }
+ getMonthNames(style) {
+ if (SUPPORTS_INTL_API) {
+ const dtf = new Intl.DateTimeFormat(this.locale, { month: style, timeZone: 'utc' });
+ return range(12, i => this._stripDirectionalityCharacters(this._format(dtf, new Date(2017, i, 1))));
+ }
+ return DEFAULT_MONTH_NAMES[style];
+ }
+ getDateNames() {
+ if (SUPPORTS_INTL_API) {
+ const dtf = new Intl.DateTimeFormat(this.locale, { day: 'numeric', timeZone: 'utc' });
+ return range(31, i => this._stripDirectionalityCharacters(this._format(dtf, new Date(2017, 0, i + 1))));
+ }
+ return DEFAULT_DATE_NAMES;
+ }
+ getDayOfWeekNames(style) {
+ if (SUPPORTS_INTL_API) {
+ const dtf = new Intl.DateTimeFormat(this.locale, { weekday: style, timeZone: 'utc' });
+ return range(7, i => this._stripDirectionalityCharacters(this._format(dtf, new Date(2017, 0, i + 1))));
+ }
+ return DEFAULT_DAY_OF_WEEK_NAMES[style];
+ }
+ getYearName(date) {
+ if (SUPPORTS_INTL_API) {
+ const dtf = new Intl.DateTimeFormat(this.locale, { year: 'numeric', timeZone: 'utc' });
+ return this._stripDirectionalityCharacters(this._format(dtf, date));
+ }
+ return String(this.getYear(date));
+ }
+ getFirstDayOfWeek() {
+ // We can't tell using native JS Date what the first day of the week is, we default to Sunday.
+ return 0;
+ }
+ getNumDaysInMonth(date) {
+ return this.getDate(this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + 1, 0));
+ }
+ clone(date) {
+ return new Date(date.getTime());
+ }
+ createDate(year, month, date) {
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ // Check for invalid month and date (except upper bound on date which we have to check after
+ // creating the Date).
+ if (month < 0 || month > 11) {
+ throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
+ }
+ if (date < 1) {
+ throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
+ }
+ }
+ let result = this._createDateWithOverflow(year, month, date);
+ // Check that the date wasn't above the upper bound for the month, causing the month to overflow
+ if (result.getMonth() != month && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error(`Invalid date "${date}" for month with index "${month}".`);
+ }
+ return result;
+ }
+ today() {
+ return new Date();
+ }
+ parse(value) {
+ // We have no way using the native JS Date to set the parse format or locale, so we ignore these
+ // parameters.
+ if (typeof value == 'number') {
+ return new Date(value);
+ }
+ return value ? new Date(Date.parse(value)) : null;
+ }
+ format(date, displayFormat) {
+ if (!this.isValid(date)) {
+ throw Error('NativeDateAdapter: Cannot format invalid date.');
+ }
+ if (SUPPORTS_INTL_API) {
+ // On IE and Edge the i18n API will throw a hard error that can crash the entire app
+ // if we attempt to format a date whose year is less than 1 or greater than 9999.
+ if (this._clampDate && (date.getFullYear() < 1 || date.getFullYear() > 9999)) {
+ date = this.clone(date);
+ date.setFullYear(Math.max(1, Math.min(9999, date.getFullYear())));
+ }
+ displayFormat = Object.assign(Object.assign({}, displayFormat), { timeZone: 'utc' });
+ const dtf = new Intl.DateTimeFormat(this.locale, displayFormat);
+ return this._stripDirectionalityCharacters(this._format(dtf, date));
+ }
+ return this._stripDirectionalityCharacters(date.toDateString());
+ }
+ addCalendarYears(date, years) {
+ return this.addCalendarMonths(date, years * 12);
+ }
+ addCalendarMonths(date, months) {
+ let newDate = this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + months, this.getDate(date));
+ // It's possible to wind up in the wrong month if the original month has more days than the new
+ // month. In this case we want to go to the last day of the desired month.
+ // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't
+ // guarantee this.
+ if (this.getMonth(newDate) != ((this.getMonth(date) + months) % 12 + 12) % 12) {
+ newDate = this._createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);
+ }
+ return newDate;
+ }
+ addCalendarDays(date, days) {
+ return this._createDateWithOverflow(this.getYear(date), this.getMonth(date), this.getDate(date) + days);
+ }
+ toIso8601(date) {
+ return [
+ date.getUTCFullYear(),
+ this._2digit(date.getUTCMonth() + 1),
+ this._2digit(date.getUTCDate())
+ ].join('-');
+ }
+ /**
+ * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings
+ * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an
+ * invalid date for all other values.
+ */
+ deserialize(value) {
+ if (typeof value === 'string') {
+ if (!value) {
+ return null;
+ }
+ // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the
+ // string is the right format first.
+ if (ISO_8601_REGEX.test(value)) {
+ let date = new Date(value);
+ if (this.isValid(date)) {
+ return date;
+ }
+ }
+ }
+ return super.deserialize(value);
+ }
+ isDateInstance(obj) {
+ return obj instanceof Date;
+ }
+ isValid(date) {
+ return !isNaN(date.getTime());
+ }
+ invalid() {
+ return new Date(NaN);
+ }
+ /** Creates a date but allows the month and date to overflow. */
+ _createDateWithOverflow(year, month, date) {
+ // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.
+ // To work around this we use `setFullYear` and `setHours` instead.
+ const d = new Date();
+ d.setFullYear(year, month, date);
+ d.setHours(0, 0, 0, 0);
+ return d;
+ }
+ /**
+ * Pads a number to make it two digits.
+ * @param n The number to pad.
+ * @returns The padded number.
+ */
+ _2digit(n) {
+ return ('00' + n).slice(-2);
+ }
+ /**
+ * Strip out unicode LTR and RTL characters. Edge and IE insert these into formatted dates while
+ * other browsers do not. We remove them to make output consistent and because they interfere with
+ * date parsing.
+ * @param str The string to strip direction characters from.
+ * @returns The stripped string.
+ */
+ _stripDirectionalityCharacters(str) {
+ return str.replace(/[\u200e\u200f]/g, '');
+ }
+ /**
+ * When converting Date object to string, javascript built-in functions may return wrong
+ * results because it applies its internal DST rules. The DST rules around the world change
+ * very frequently, and the current valid rule is not always valid in previous years though.
+ * We work around this problem building a new Date object which has its internal UTC
+ * representation with the local date and time.
+ * @param dtf Intl.DateTimeFormat object, containg the desired string format. It must have
+ * timeZone set to 'utc' to work fine.
+ * @param date Date from which we want to get the string representation according to dtf
+ * @returns A Date object with its UTC representation based on the passed in date info
+ */
+ _format(dtf, date) {
+ // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.
+ // To work around this we use `setUTCFullYear` and `setUTCHours` instead.
+ const d = new Date();
+ d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+ d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
+ return dtf.format(d);
+ }
+}
+NativeDateAdapter.ɵfac = function NativeDateAdapter_Factory(t) { return new (t || NativeDateAdapter)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](MAT_DATE_LOCALE, 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"])); };
+NativeDateAdapter.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: NativeDateAdapter, factory: NativeDateAdapter.ɵfac });
+NativeDateAdapter.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MAT_DATE_LOCALE,] }] },
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NativeDateAdapter, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [MAT_DATE_LOCALE]
+ }] }, { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const MAT_NATIVE_DATE_FORMATS = {
+ parse: {
+ dateInput: null,
+ },
+ display: {
+ dateInput: { year: 'numeric', month: 'numeric', day: 'numeric' },
+ monthYearLabel: { year: 'numeric', month: 'short' },
+ dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },
+ monthYearA11yLabel: { year: 'numeric', month: 'long' },
+ }
+};
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class NativeDateModule {
+}
+NativeDateModule.ɵfac = function NativeDateModule_Factory(t) { return new (t || NativeDateModule)(); };
+NativeDateModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: NativeDateModule });
+NativeDateModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [
+ { provide: DateAdapter, useClass: NativeDateAdapter },
+ ], imports: [[_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](NativeDateModule, { imports: function () { return [_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NativeDateModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]],
+ providers: [
+ { provide: DateAdapter, useClass: NativeDateAdapter },
+ ]
+ }]
+ }], null, null); })();
+const ɵ0$1 = MAT_NATIVE_DATE_FORMATS;
+class MatNativeDateModule {
+}
+MatNativeDateModule.ɵfac = function MatNativeDateModule_Factory(t) { return new (t || MatNativeDateModule)(); };
+MatNativeDateModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatNativeDateModule });
+MatNativeDateModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [{ provide: MAT_DATE_FORMATS, useValue: ɵ0$1 }], imports: [[NativeDateModule]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatNativeDateModule, { imports: [NativeDateModule] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatNativeDateModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [NativeDateModule],
+ providers: [{ provide: MAT_DATE_FORMATS, useValue: ɵ0$1 }]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Error state matcher that matches when a control is invalid and dirty. */
+class ShowOnDirtyErrorStateMatcher {
+ isErrorState(control, form) {
+ return !!(control && control.invalid && (control.dirty || (form && form.submitted)));
+ }
+}
+ShowOnDirtyErrorStateMatcher.ɵfac = function ShowOnDirtyErrorStateMatcher_Factory(t) { return new (t || ShowOnDirtyErrorStateMatcher)(); };
+ShowOnDirtyErrorStateMatcher.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: ShowOnDirtyErrorStateMatcher, factory: ShowOnDirtyErrorStateMatcher.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ShowOnDirtyErrorStateMatcher, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+/** Provider that defines how form controls behave with regards to displaying error messages. */
+class ErrorStateMatcher {
+ isErrorState(control, form) {
+ return !!(control && control.invalid && (control.touched || (form && form.submitted)));
+ }
+}
+ErrorStateMatcher.ɵfac = function ErrorStateMatcher_Factory(t) { return new (t || ErrorStateMatcher)(); };
+ErrorStateMatcher.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: function ErrorStateMatcher_Factory() { return new ErrorStateMatcher(); }, token: ErrorStateMatcher, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ErrorStateMatcher, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Shared directive to count lines inside a text area, such as a list item.
+ * Line elements can be extracted with a @ContentChildren(MatLine) query, then
+ * counted by checking the query list's length.
+ */
+class MatLine {
+}
+MatLine.ɵfac = function MatLine_Factory(t) { return new (t || MatLine)(); };
+MatLine.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: MatLine, selectors: [["", "mat-line", ""], ["", "matLine", ""]], hostAttrs: [1, "mat-line"] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatLine, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[mat-line], [matLine]',
+ host: { 'class': 'mat-line' }
+ }]
+ }], null, null); })();
+/**
+ * Helper that takes a query list of lines and sets the correct class on the host.
+ * @docs-private
+ */
+function setLines(lines, element, prefix = 'mat') {
+ // Note: doesn't need to unsubscribe, because `changes`
+ // gets completed by Angular when the view is destroyed.
+ lines.changes.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_8__["startWith"])(lines)).subscribe(({ length }) => {
+ setClass(element, `${prefix}-2-line`, false);
+ setClass(element, `${prefix}-3-line`, false);
+ setClass(element, `${prefix}-multi-line`, false);
+ if (length === 2 || length === 3) {
+ setClass(element, `${prefix}-${length}-line`, true);
+ }
+ else if (length > 3) {
+ setClass(element, `${prefix}-multi-line`, true);
+ }
+ });
+}
+/** Adds or removes a class from an element. */
+function setClass(element, className, isAdd) {
+ const classList = element.nativeElement.classList;
+ isAdd ? classList.add(className) : classList.remove(className);
+}
+class MatLineModule {
+}
+MatLineModule.ɵfac = function MatLineModule_Factory(t) { return new (t || MatLineModule)(); };
+MatLineModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatLineModule });
+MatLineModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ imports: [[MatCommonModule], MatCommonModule] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatLineModule, { declarations: [MatLine], imports: [MatCommonModule], exports: [MatLine, MatCommonModule] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatLineModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [MatCommonModule],
+ exports: [MatLine, MatCommonModule],
+ declarations: [MatLine]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Reference to a previously launched ripple element.
+ */
+class RippleRef {
+ constructor(_renderer,
+ /** Reference to the ripple HTML element. */
+ element,
+ /** Ripple configuration used for the ripple. */
+ config) {
+ this._renderer = _renderer;
+ this.element = element;
+ this.config = config;
+ /** Current state of the ripple. */
+ this.state = 3 /* HIDDEN */;
+ }
+ /** Fades out the ripple element. */
+ fadeOut() {
+ this._renderer.fadeOutRipple(this);
+ }
+}
+
+/**
+ * Default ripple animation configuration for ripples without an explicit
+ * animation config specified.
+ */
+const defaultRippleAnimationConfig = {
+ enterDuration: 450,
+ exitDuration: 400
+};
+/**
+ * Timeout for ignoring mouse events. Mouse events will be temporary ignored after touch
+ * events to avoid synthetic mouse events.
+ */
+const ignoreMouseEventsTimeout = 800;
+/** Options that apply to all the event listeners that are bound by the ripple renderer. */
+const passiveEventOptions = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["normalizePassiveListenerOptions"])({ passive: true });
+/** Events that signal that the pointer is down. */
+const pointerDownEvents = ['mousedown', 'touchstart'];
+/** Events that signal that the pointer is up. */
+const pointerUpEvents = ['mouseup', 'mouseleave', 'touchend', 'touchcancel'];
+/**
+ * Helper service that performs DOM manipulations. Not intended to be used outside this module.
+ * The constructor takes a reference to the ripple directive's host element and a map of DOM
+ * event handlers to be installed on the element that triggers ripple animations.
+ * This will eventually become a custom renderer once Angular support exists.
+ * @docs-private
+ */
+class RippleRenderer {
+ constructor(_target, _ngZone, elementOrElementRef, platform) {
+ this._target = _target;
+ this._ngZone = _ngZone;
+ /** Whether the pointer is currently down or not. */
+ this._isPointerDown = false;
+ /** Set of currently active ripple references. */
+ this._activeRipples = new Set();
+ /** Whether pointer-up event listeners have been registered. */
+ this._pointerUpEventsRegistered = false;
+ // Only do anything if we're on the browser.
+ if (platform.isBrowser) {
+ this._containerElement = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceElement"])(elementOrElementRef);
+ }
+ }
+ /**
+ * Fades in a ripple at the given coordinates.
+ * @param x Coordinate within the element, along the X axis at which to start the ripple.
+ * @param y Coordinate within the element, along the Y axis at which to start the ripple.
+ * @param config Extra ripple options.
+ */
+ fadeInRipple(x, y, config = {}) {
+ const containerRect = this._containerRect =
+ this._containerRect || this._containerElement.getBoundingClientRect();
+ const animationConfig = Object.assign(Object.assign({}, defaultRippleAnimationConfig), config.animation);
+ if (config.centered) {
+ x = containerRect.left + containerRect.width / 2;
+ y = containerRect.top + containerRect.height / 2;
+ }
+ const radius = config.radius || distanceToFurthestCorner(x, y, containerRect);
+ const offsetX = x - containerRect.left;
+ const offsetY = y - containerRect.top;
+ const duration = animationConfig.enterDuration;
+ const ripple = document.createElement('div');
+ ripple.classList.add('mat-ripple-element');
+ ripple.style.left = `${offsetX - radius}px`;
+ ripple.style.top = `${offsetY - radius}px`;
+ ripple.style.height = `${radius * 2}px`;
+ ripple.style.width = `${radius * 2}px`;
+ // If a custom color has been specified, set it as inline style. If no color is
+ // set, the default color will be applied through the ripple theme styles.
+ if (config.color != null) {
+ ripple.style.backgroundColor = config.color;
+ }
+ ripple.style.transitionDuration = `${duration}ms`;
+ this._containerElement.appendChild(ripple);
+ // By default the browser does not recalculate the styles of dynamically created
+ // ripple elements. This is critical because then the `scale` would not animate properly.
+ enforceStyleRecalculation(ripple);
+ ripple.style.transform = 'scale(1)';
+ // Exposed reference to the ripple that will be returned.
+ const rippleRef = new RippleRef(this, ripple, config);
+ rippleRef.state = 0 /* FADING_IN */;
+ // Add the ripple reference to the list of all active ripples.
+ this._activeRipples.add(rippleRef);
+ if (!config.persistent) {
+ this._mostRecentTransientRipple = rippleRef;
+ }
+ // Wait for the ripple element to be completely faded in.
+ // Once it's faded in, the ripple can be hidden immediately if the mouse is released.
+ this._runTimeoutOutsideZone(() => {
+ const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;
+ rippleRef.state = 1 /* VISIBLE */;
+ // When the timer runs out while the user has kept their pointer down, we want to
+ // keep only the persistent ripples and the latest transient ripple. We do this,
+ // because we don't want stacked transient ripples to appear after their enter
+ // animation has finished.
+ if (!config.persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {
+ rippleRef.fadeOut();
+ }
+ }, duration);
+ return rippleRef;
+ }
+ /** Fades out a ripple reference. */
+ fadeOutRipple(rippleRef) {
+ const wasActive = this._activeRipples.delete(rippleRef);
+ if (rippleRef === this._mostRecentTransientRipple) {
+ this._mostRecentTransientRipple = null;
+ }
+ // Clear out the cached bounding rect if we have no more ripples.
+ if (!this._activeRipples.size) {
+ this._containerRect = null;
+ }
+ // For ripples that are not active anymore, don't re-run the fade-out animation.
+ if (!wasActive) {
+ return;
+ }
+ const rippleEl = rippleRef.element;
+ const animationConfig = Object.assign(Object.assign({}, defaultRippleAnimationConfig), rippleRef.config.animation);
+ rippleEl.style.transitionDuration = `${animationConfig.exitDuration}ms`;
+ rippleEl.style.opacity = '0';
+ rippleRef.state = 2 /* FADING_OUT */;
+ // Once the ripple faded out, the ripple can be safely removed from the DOM.
+ this._runTimeoutOutsideZone(() => {
+ rippleRef.state = 3 /* HIDDEN */;
+ rippleEl.parentNode.removeChild(rippleEl);
+ }, animationConfig.exitDuration);
+ }
+ /** Fades out all currently active ripples. */
+ fadeOutAll() {
+ this._activeRipples.forEach(ripple => ripple.fadeOut());
+ }
+ /** Sets up the trigger event listeners */
+ setupTriggerEvents(elementOrElementRef) {
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceElement"])(elementOrElementRef);
+ if (!element || element === this._triggerElement) {
+ return;
+ }
+ // Remove all previously registered event listeners from the trigger element.
+ this._removeTriggerEvents();
+ this._triggerElement = element;
+ this._registerEvents(pointerDownEvents);
+ }
+ /**
+ * Handles all registered events.
+ * @docs-private
+ */
+ handleEvent(event) {
+ if (event.type === 'mousedown') {
+ this._onMousedown(event);
+ }
+ else if (event.type === 'touchstart') {
+ this._onTouchStart(event);
+ }
+ else {
+ this._onPointerUp();
+ }
+ // If pointer-up events haven't been registered yet, do so now.
+ // We do this on-demand in order to reduce the total number of event listeners
+ // registered by the ripples, which speeds up the rendering time for large UIs.
+ if (!this._pointerUpEventsRegistered) {
+ this._registerEvents(pointerUpEvents);
+ this._pointerUpEventsRegistered = true;
+ }
+ }
+ /** Function being called whenever the trigger is being pressed using mouse. */
+ _onMousedown(event) {
+ // Screen readers will fire fake mouse events for space/enter. Skip launching a
+ // ripple in this case for consistency with the non-screen-reader experience.
+ const isFakeMousedown = Object(_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["isFakeMousedownFromScreenReader"])(event);
+ const isSyntheticEvent = this._lastTouchStartEvent &&
+ Date.now() < this._lastTouchStartEvent + ignoreMouseEventsTimeout;
+ if (!this._target.rippleDisabled && !isFakeMousedown && !isSyntheticEvent) {
+ this._isPointerDown = true;
+ this.fadeInRipple(event.clientX, event.clientY, this._target.rippleConfig);
+ }
+ }
+ /** Function being called whenever the trigger is being pressed using touch. */
+ _onTouchStart(event) {
+ if (!this._target.rippleDisabled && !Object(_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["isFakeTouchstartFromScreenReader"])(event)) {
+ // Some browsers fire mouse events after a `touchstart` event. Those synthetic mouse
+ // events will launch a second ripple if we don't ignore mouse events for a specific
+ // time after a touchstart event.
+ this._lastTouchStartEvent = Date.now();
+ this._isPointerDown = true;
+ // Use `changedTouches` so we skip any touches where the user put
+ // their finger down, but used another finger to tap the element again.
+ const touches = event.changedTouches;
+ for (let i = 0; i < touches.length; i++) {
+ this.fadeInRipple(touches[i].clientX, touches[i].clientY, this._target.rippleConfig);
+ }
+ }
+ }
+ /** Function being called whenever the trigger is being released. */
+ _onPointerUp() {
+ if (!this._isPointerDown) {
+ return;
+ }
+ this._isPointerDown = false;
+ // Fade-out all ripples that are visible and not persistent.
+ this._activeRipples.forEach(ripple => {
+ // By default, only ripples that are completely visible will fade out on pointer release.
+ // If the `terminateOnPointerUp` option is set, ripples that still fade in will also fade out.
+ const isVisible = ripple.state === 1 /* VISIBLE */ ||
+ ripple.config.terminateOnPointerUp && ripple.state === 0 /* FADING_IN */;
+ if (!ripple.config.persistent && isVisible) {
+ ripple.fadeOut();
+ }
+ });
+ }
+ /** Runs a timeout outside of the Angular zone to avoid triggering the change detection. */
+ _runTimeoutOutsideZone(fn, delay = 0) {
+ this._ngZone.runOutsideAngular(() => setTimeout(fn, delay));
+ }
+ /** Registers event listeners for a given list of events. */
+ _registerEvents(eventTypes) {
+ this._ngZone.runOutsideAngular(() => {
+ eventTypes.forEach((type) => {
+ this._triggerElement.addEventListener(type, this, passiveEventOptions);
+ });
+ });
+ }
+ /** Removes previously registered event listeners from the trigger element. */
+ _removeTriggerEvents() {
+ if (this._triggerElement) {
+ pointerDownEvents.forEach((type) => {
+ this._triggerElement.removeEventListener(type, this, passiveEventOptions);
+ });
+ if (this._pointerUpEventsRegistered) {
+ pointerUpEvents.forEach((type) => {
+ this._triggerElement.removeEventListener(type, this, passiveEventOptions);
+ });
+ }
+ }
+ }
+}
+/** Enforces a style recalculation of a DOM element by computing its styles. */
+function enforceStyleRecalculation(element) {
+ // Enforce a style recalculation by calling `getComputedStyle` and accessing any property.
+ // Calling `getPropertyValue` is important to let optimizers know that this is not a noop.
+ // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a
+ window.getComputedStyle(element).getPropertyValue('opacity');
+}
+/**
+ * Returns the distance from the point (x, y) to the furthest corner of a rectangle.
+ */
+function distanceToFurthestCorner(x, y, rect) {
+ const distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));
+ const distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));
+ return Math.sqrt(distX * distX + distY * distY);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Injection token that can be used to specify the global ripple options. */
+const MAT_RIPPLE_GLOBAL_OPTIONS = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('mat-ripple-global-options');
+class MatRipple {
+ constructor(_elementRef, ngZone, platform, globalOptions, _animationMode) {
+ this._elementRef = _elementRef;
+ this._animationMode = _animationMode;
+ /**
+ * If set, the radius in pixels of foreground ripples when fully expanded. If unset, the radius
+ * will be the distance from the center of the ripple to the furthest corner of the host element's
+ * bounding rectangle.
+ */
+ this.radius = 0;
+ this._disabled = false;
+ /** Whether ripple directive is initialized and the input bindings are set. */
+ this._isInitialized = false;
+ this._globalOptions = globalOptions || {};
+ this._rippleRenderer = new RippleRenderer(this, ngZone, _elementRef, platform);
+ }
+ /**
+ * Whether click events will not trigger the ripple. Ripples can be still launched manually
+ * by using the `launch()` method.
+ */
+ get disabled() { return this._disabled; }
+ set disabled(value) {
+ this._disabled = value;
+ this._setupTriggerEventsIfEnabled();
+ }
+ /**
+ * The element that triggers the ripple when click events are received.
+ * Defaults to the directive's host element.
+ */
+ get trigger() { return this._trigger || this._elementRef.nativeElement; }
+ set trigger(trigger) {
+ this._trigger = trigger;
+ this._setupTriggerEventsIfEnabled();
+ }
+ ngOnInit() {
+ this._isInitialized = true;
+ this._setupTriggerEventsIfEnabled();
+ }
+ ngOnDestroy() {
+ this._rippleRenderer._removeTriggerEvents();
+ }
+ /** Fades out all currently showing ripple elements. */
+ fadeOutAll() {
+ this._rippleRenderer.fadeOutAll();
+ }
+ /**
+ * Ripple configuration from the directive's input values.
+ * @docs-private Implemented as part of RippleTarget
+ */
+ get rippleConfig() {
+ return {
+ centered: this.centered,
+ radius: this.radius,
+ color: this.color,
+ animation: Object.assign(Object.assign(Object.assign({}, this._globalOptions.animation), (this._animationMode === 'NoopAnimations' ? { enterDuration: 0, exitDuration: 0 } : {})), this.animation),
+ terminateOnPointerUp: this._globalOptions.terminateOnPointerUp,
+ };
+ }
+ /**
+ * Whether ripples on pointer-down are disabled or not.
+ * @docs-private Implemented as part of RippleTarget
+ */
+ get rippleDisabled() {
+ return this.disabled || !!this._globalOptions.disabled;
+ }
+ /** Sets up the trigger event listeners if ripples are enabled. */
+ _setupTriggerEventsIfEnabled() {
+ if (!this.disabled && this._isInitialized) {
+ this._rippleRenderer.setupTriggerEvents(this.trigger);
+ }
+ }
+ /** Launches a manual ripple at the specified coordinated or just by the ripple config. */
+ launch(configOrX, y = 0, config) {
+ if (typeof configOrX === 'number') {
+ return this._rippleRenderer.fadeInRipple(configOrX, y, Object.assign(Object.assign({}, this.rippleConfig), config));
+ }
+ else {
+ return this._rippleRenderer.fadeInRipple(0, 0, Object.assign(Object.assign({}, this.rippleConfig), configOrX));
+ }
+ }
+}
+MatRipple.ɵfac = function MatRipple_Factory(t) { return new (t || MatRipple)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](MAT_RIPPLE_GLOBAL_OPTIONS, 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"], 8)); };
+MatRipple.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: MatRipple, selectors: [["", "mat-ripple", ""], ["", "matRipple", ""]], hostAttrs: [1, "mat-ripple"], hostVars: 2, hostBindings: function MatRipple_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("mat-ripple-unbounded", ctx.unbounded);
+ } }, inputs: { radius: ["matRippleRadius", "radius"], disabled: ["matRippleDisabled", "disabled"], trigger: ["matRippleTrigger", "trigger"], color: ["matRippleColor", "color"], unbounded: ["matRippleUnbounded", "unbounded"], centered: ["matRippleCentered", "centered"], animation: ["matRippleAnimation", "animation"] }, exportAs: ["matRipple"] });
+MatRipple.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] },
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"],] }] }
+];
+MatRipple.propDecorators = {
+ color: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleColor',] }],
+ unbounded: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleUnbounded',] }],
+ centered: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleCentered',] }],
+ radius: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleRadius',] }],
+ animation: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleAnimation',] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleDisabled',] }],
+ trigger: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['matRippleTrigger',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatRipple, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[mat-ripple], [matRipple]',
+ exportAs: 'matRipple',
+ host: {
+ 'class': 'mat-ripple',
+ '[class.mat-ripple-unbounded]': 'unbounded'
+ }
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["Platform"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [MAT_RIPPLE_GLOBAL_OPTIONS]
+ }] }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"]]
+ }] }]; }, { radius: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleRadius']
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleDisabled']
+ }], trigger: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleTrigger']
+ }], color: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleColor']
+ }], unbounded: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleUnbounded']
+ }], centered: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleCentered']
+ }], animation: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['matRippleAnimation']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class MatRippleModule {
+}
+MatRippleModule.ɵfac = function MatRippleModule_Factory(t) { return new (t || MatRippleModule)(); };
+MatRippleModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatRippleModule });
+MatRippleModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ imports: [[MatCommonModule, _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]], MatCommonModule] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatRippleModule, { declarations: function () { return [MatRipple]; }, imports: function () { return [MatCommonModule, _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]]; }, exports: function () { return [MatRipple, MatCommonModule]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatRippleModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [MatCommonModule, _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_7__["PlatformModule"]],
+ exports: [MatRipple, MatCommonModule],
+ declarations: [MatRipple]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Component that shows a simplified checkbox without including any kind of "real" checkbox.
+ * Meant to be used when the checkbox is purely decorative and a large number of them will be
+ * included, such as for the options in a multi-select. Uses no SVGs or complex animations.
+ * Note that theming is meant to be handled by the parent element, e.g.
+ * `mat-primary .mat-pseudo-checkbox`.
+ *
+ * Note that this component will be completely invisible to screen-reader users. This is *not*
+ * interchangeable with `` and should *not* be used if the user would directly
+ * interact with the checkbox. The pseudo-checkbox should only be used as an implementation detail
+ * of more complex components that appropriately handle selected / checked state.
+ * @docs-private
+ */
+class MatPseudoCheckbox {
+ constructor(_animationMode) {
+ this._animationMode = _animationMode;
+ /** Display state of the checkbox. */
+ this.state = 'unchecked';
+ /** Whether the checkbox is disabled. */
+ this.disabled = false;
+ }
+}
+MatPseudoCheckbox.ɵfac = function MatPseudoCheckbox_Factory(t) { return new (t || MatPseudoCheckbox)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"], 8)); };
+MatPseudoCheckbox.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: MatPseudoCheckbox, selectors: [["mat-pseudo-checkbox"]], hostAttrs: [1, "mat-pseudo-checkbox"], hostVars: 8, hostBindings: function MatPseudoCheckbox_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("mat-pseudo-checkbox-indeterminate", ctx.state === "indeterminate")("mat-pseudo-checkbox-checked", ctx.state === "checked")("mat-pseudo-checkbox-disabled", ctx.disabled)("_mat-animation-noopable", ctx._animationMode === "NoopAnimations");
+ } }, inputs: { state: "state", disabled: "disabled" }, decls: 0, vars: 0, template: function MatPseudoCheckbox_Template(rf, ctx) { }, styles: [".mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\n"], encapsulation: 2, changeDetection: 0 });
+MatPseudoCheckbox.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"],] }] }
+];
+MatPseudoCheckbox.propDecorators = {
+ state: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatPseudoCheckbox, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewEncapsulation"].None,
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectionStrategy"].OnPush,
+ selector: 'mat-pseudo-checkbox',
+ template: '',
+ host: {
+ 'class': 'mat-pseudo-checkbox',
+ '[class.mat-pseudo-checkbox-indeterminate]': 'state === "indeterminate"',
+ '[class.mat-pseudo-checkbox-checked]': 'state === "checked"',
+ '[class.mat-pseudo-checkbox-disabled]': 'disabled',
+ '[class._mat-animation-noopable]': '_animationMode === "NoopAnimations"'
+ },
+ styles: [".mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\n"]
+ }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["ANIMATION_MODULE_TYPE"]]
+ }] }]; }, { state: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class MatPseudoCheckboxModule {
+}
+MatPseudoCheckboxModule.ɵfac = function MatPseudoCheckboxModule_Factory(t) { return new (t || MatPseudoCheckboxModule)(); };
+MatPseudoCheckboxModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: MatPseudoCheckboxModule });
+MatPseudoCheckboxModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ imports: [[MatCommonModule]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](MatPseudoCheckboxModule, { declarations: [MatPseudoCheckbox], imports: [MatCommonModule], exports: [MatPseudoCheckbox] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatPseudoCheckboxModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [MatCommonModule],
+ exports: [MatPseudoCheckbox],
+ declarations: [MatPseudoCheckbox]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token used to provide the parent component to options.
+ */
+const MAT_OPTION_PARENT_COMPONENT = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('MAT_OPTION_PARENT_COMPONENT');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Notes on the accessibility pattern used for `mat-optgroup`.
+// The option group has two different "modes": regular and inert. The regular mode uses the
+// recommended a11y pattern which has `role="group"` on the group element with `aria-labelledby`
+// pointing to the label. This works for `mat-select`, but it seems to hit a bug for autocomplete
+// under VoiceOver where the group doesn't get read out at all. The bug appears to be that if
+// there's __any__ a11y-related attribute on the group (e.g. `role` or `aria-labelledby`),
+// VoiceOver on Safari won't read it out.
+// We've introduced the `inert` mode as a workaround. Under this mode, all a11y attributes are
+// removed from the group, and we get the screen reader to read out the group label by mirroring it
+// inside an invisible element in the option. This is sub-optimal, because the screen reader will
+// repeat the group label on each navigation, whereas the default pattern only reads the group when
+// the user enters a new group. The following alternate approaches were considered:
+// 1. Reading out the group label using the `LiveAnnouncer` solves the problem, but we can't control
+// when the text will be read out so sometimes it comes in too late or never if the user
+// navigates quickly.
+// 2. ` [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MAT_OPTION_PARENT_COMPONENT,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }] }
+];
+_MatOptgroupBase.propDecorators = {
+ label: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](_MatOptgroupBase, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [MAT_OPTION_PARENT_COMPONENT]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }] }]; }, { label: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * Injection token that can be used to reference instances of `MatOptgroup`. It serves as
+ * alternative token to the actual `MatOptgroup` class which could cause unnecessary
+ * retention of the class and its component metadata.
+ */
+const MAT_OPTGROUP = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('MatOptgroup');
+/**
+ * Component that is used to group instances of `mat-option`.
+ */
+class MatOptgroup extends _MatOptgroupBase {
+}
+MatOptgroup.ɵfac = function MatOptgroup_Factory(t) { return ɵMatOptgroup_BaseFactory(t || MatOptgroup); };
+MatOptgroup.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: MatOptgroup, selectors: [["mat-optgroup"]], hostAttrs: [1, "mat-optgroup"], hostVars: 5, hostBindings: function MatOptgroup_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("role", ctx._inert ? null : "group")("aria-disabled", ctx._inert ? null : ctx.disabled.toString())("aria-labelledby", ctx._inert ? null : ctx._labelId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("mat-optgroup-disabled", ctx.disabled);
+ } }, inputs: { disabled: "disabled" }, exportAs: ["matOptgroup"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: MAT_OPTGROUP, useExisting: MatOptgroup }]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], ngContentSelectors: _c1, decls: 4, vars: 2, consts: [["aria-hidden", "true", 1, "mat-optgroup-label", 3, "id"]], template: function MatOptgroup_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojectionDef"](_c0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](3, 1);
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("id", ctx._labelId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", ctx.label, " ");
+ } }, styles: [".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\n"], encapsulation: 2, changeDetection: 0 });
+const ɵMatOptgroup_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](MatOptgroup);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatOptgroup, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'mat-optgroup',
+ exportAs: 'matOptgroup',
+ template: "{{ label }} \n\n",
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewEncapsulation"].None,
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectionStrategy"].OnPush,
+ inputs: ['disabled'],
+ host: {
+ 'class': 'mat-optgroup',
+ '[attr.role]': '_inert ? null : "group"',
+ '[attr.aria-disabled]': '_inert ? null : disabled.toString()',
+ '[attr.aria-labelledby]': '_inert ? null : _labelId',
+ '[class.mat-optgroup-disabled]': 'disabled'
+ },
+ providers: [{ provide: MAT_OPTGROUP, useExisting: MatOptgroup }],
+ styles: [".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\n"]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Option IDs need to be unique across components, so this counter exists outside of
+ * the component definition.
+ */
+let _uniqueIdCounter = 0;
+/** Event object emitted by MatOption when selected or deselected. */
+class MatOptionSelectionChange {
+ constructor(
+ /** Reference to the option that emitted the event. */
+ source,
+ /** Whether the change in the option's value was a result of a user action. */
+ isUserInput = false) {
+ this.source = source;
+ this.isUserInput = isUserInput;
+ }
+}
+class _MatOptionBase {
+ constructor(_element, _changeDetectorRef, _parent, group) {
+ this._element = _element;
+ this._changeDetectorRef = _changeDetectorRef;
+ this._parent = _parent;
+ this.group = group;
+ this._selected = false;
+ this._active = false;
+ this._disabled = false;
+ this._mostRecentViewValue = '';
+ /** The unique ID of the option. */
+ this.id = `mat-option-${_uniqueIdCounter++}`;
+ /** Event emitted when the option is selected or deselected. */
+ // tslint:disable-next-line:no-output-on-prefix
+ this.onSelectionChange = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the state of the option changes and any parents have to be notified. */
+ this._stateChanges = new rxjs__WEBPACK_IMPORTED_MODULE_6__["Subject"]();
+ }
+ /** Whether the wrapping component is in multiple selection mode. */
+ get multiple() { return this._parent && this._parent.multiple; }
+ /** Whether or not the option is currently selected. */
+ get selected() { return this._selected; }
+ /** Whether the option is disabled. */
+ get disabled() { return (this.group && this.group.disabled) || this._disabled; }
+ set disabled(value) { this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value); }
+ /** Whether ripples for the option are disabled. */
+ get disableRipple() { return this._parent && this._parent.disableRipple; }
+ /**
+ * Whether or not the option is currently active and ready to be selected.
+ * An active option displays styles as if it is focused, but the
+ * focus is actually retained somewhere else. This comes in handy
+ * for components like autocomplete where focus must remain on the input.
+ */
+ get active() {
+ return this._active;
+ }
+ /**
+ * The displayed value of the option. It is necessary to show the selected option in the
+ * select's trigger.
+ */
+ get viewValue() {
+ // TODO(kara): Add input property alternative for node envs.
+ return (this._getHostElement().textContent || '').trim();
+ }
+ /** Selects the option. */
+ select() {
+ if (!this._selected) {
+ this._selected = true;
+ this._changeDetectorRef.markForCheck();
+ this._emitSelectionChangeEvent();
+ }
+ }
+ /** Deselects the option. */
+ deselect() {
+ if (this._selected) {
+ this._selected = false;
+ this._changeDetectorRef.markForCheck();
+ this._emitSelectionChangeEvent();
+ }
+ }
+ /** Sets focus onto this option. */
+ focus(_origin, options) {
+ // Note that we aren't using `_origin`, but we need to keep it because some internal consumers
+ // use `MatOption` in a `FocusKeyManager` and we need it to match `FocusableOption`.
+ const element = this._getHostElement();
+ if (typeof element.focus === 'function') {
+ element.focus(options);
+ }
+ }
+ /**
+ * This method sets display styles on the option to make it appear
+ * active. This is used by the ActiveDescendantKeyManager so key
+ * events will display the proper options as active on arrow key events.
+ */
+ setActiveStyles() {
+ if (!this._active) {
+ this._active = true;
+ this._changeDetectorRef.markForCheck();
+ }
+ }
+ /**
+ * This method removes display styles on the option that made it appear
+ * active. This is used by the ActiveDescendantKeyManager so key
+ * events will display the proper options as active on arrow key events.
+ */
+ setInactiveStyles() {
+ if (this._active) {
+ this._active = false;
+ this._changeDetectorRef.markForCheck();
+ }
+ }
+ /** Gets the label to be used when determining whether the option should be focused. */
+ getLabel() {
+ return this.viewValue;
+ }
+ /** Ensures the option is selected when activated from the keyboard. */
+ _handleKeydown(event) {
+ if ((event.keyCode === _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_10__["ENTER"] || event.keyCode === _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_10__["SPACE"]) && !Object(_angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_10__["hasModifierKey"])(event)) {
+ this._selectViaInteraction();
+ // Prevent the page from scrolling down and form submits.
+ event.preventDefault();
+ }
+ }
+ /**
+ * `Selects the option while indicating the selection came from the user. Used to
+ * determine if the select's view -> model callback should be invoked.`
+ */
+ _selectViaInteraction() {
+ if (!this.disabled) {
+ this._selected = this.multiple ? !this._selected : true;
+ this._changeDetectorRef.markForCheck();
+ this._emitSelectionChangeEvent(true);
+ }
+ }
+ /**
+ * Gets the `aria-selected` value for the option. We explicitly omit the `aria-selected`
+ * attribute from single-selection, unselected options. Including the `aria-selected="false"`
+ * attributes adds a significant amount of noise to screen-reader users without providing useful
+ * information.
+ */
+ _getAriaSelected() {
+ return this.selected || (this.multiple ? false : null);
+ }
+ /** Returns the correct tabindex for the option depending on disabled state. */
+ _getTabIndex() {
+ return this.disabled ? '-1' : '0';
+ }
+ /** Gets the host DOM element. */
+ _getHostElement() {
+ return this._element.nativeElement;
+ }
+ ngAfterViewChecked() {
+ // Since parent components could be using the option's label to display the selected values
+ // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed
+ // we have to check for changes in the DOM ourselves and dispatch an event. These checks are
+ // relatively cheap, however we still limit them only to selected options in order to avoid
+ // hitting the DOM too often.
+ if (this._selected) {
+ const viewValue = this.viewValue;
+ if (viewValue !== this._mostRecentViewValue) {
+ this._mostRecentViewValue = viewValue;
+ this._stateChanges.next();
+ }
+ }
+ }
+ ngOnDestroy() {
+ this._stateChanges.complete();
+ }
+ /** Emits the selection change event. */
+ _emitSelectionChangeEvent(isUserInput = false) {
+ this.onSelectionChange.emit(new MatOptionSelectionChange(this, isUserInput));
+ }
+}
+_MatOptionBase.ɵfac = function _MatOptionBase_Factory(t) { return new (t || _MatOptionBase)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](undefined), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_MatOptgroupBase)); };
+_MatOptionBase.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: _MatOptionBase, inputs: { id: "id", disabled: "disabled", value: "value" }, outputs: { onSelectionChange: "onSelectionChange" } });
+_MatOptionBase.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] },
+ { type: undefined },
+ { type: _MatOptgroupBase }
+];
+_MatOptionBase.propDecorators = {
+ value: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ id: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ onSelectionChange: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](_MatOptionBase, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: undefined }, { type: _MatOptgroupBase }]; }, { id: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSelectionChange: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], value: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * Single option inside of a `` element.
+ */
+class MatOption extends _MatOptionBase {
+ constructor(element, changeDetectorRef, parent, group) {
+ super(element, changeDetectorRef, parent, group);
+ }
+}
+MatOption.ɵfac = function MatOption_Factory(t) { return new (t || MatOption)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](MAT_OPTION_PARENT_COMPONENT, 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](MAT_OPTGROUP, 8)); };
+MatOption.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: MatOption, selectors: [["mat-option"]], hostAttrs: ["role", "option", 1, "mat-option", "mat-focus-indicator"], hostVars: 12, hostBindings: function MatOption_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function MatOption_click_HostBindingHandler() { return ctx._selectViaInteraction(); })("keydown", function MatOption_keydown_HostBindingHandler($event) { return ctx._handleKeydown($event); });
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵhostProperty"]("id", ctx.id);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("tabindex", ctx._getTabIndex())("aria-selected", ctx._getAriaSelected())("aria-disabled", ctx.disabled.toString());
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("mat-selected", ctx.selected)("mat-option-multiple", ctx.multiple)("mat-active", ctx.active)("mat-option-disabled", ctx.disabled);
+ } }, exportAs: ["matOption"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], ngContentSelectors: _c2, decls: 5, vars: 4, consts: [["class", "mat-option-pseudo-checkbox", 3, "state", "disabled", 4, "ngIf"], [1, "mat-option-text"], ["class", "cdk-visually-hidden", 4, "ngIf"], ["mat-ripple", "", 1, "mat-option-ripple", 3, "matRippleTrigger", "matRippleDisabled"], [1, "mat-option-pseudo-checkbox", 3, "state", "disabled"], [1, "cdk-visually-hidden"]], template: function MatOption_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojectionDef"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, MatOption_mat_pseudo_checkbox_0_Template, 1, 2, "mat-pseudo-checkbox", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](1, "span", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, MatOption_span_3_Template, 2, 1, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "div", 3);
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.multiple);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.group && ctx.group._inert);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("matRippleTrigger", ctx._getHostElement())("matRippleDisabled", ctx.disabled || ctx.disableRipple);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_4__["NgIf"], MatRipple, MatPseudoCheckbox], styles: [".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.cdk-high-contrast-active .mat-option[aria-disabled=true]{opacity:.5}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\n"], encapsulation: 2, changeDetection: 0 });
+MatOption.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MAT_OPTION_PARENT_COMPONENT,] }] },
+ { type: MatOptgroup, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [MAT_OPTGROUP,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](MatOption, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'mat-option',
+ exportAs: 'matOption',
+ host: {
+ 'role': 'option',
+ '[attr.tabindex]': '_getTabIndex()',
+ '[class.mat-selected]': 'selected',
+ '[class.mat-option-multiple]': 'multiple',
+ '[class.mat-active]': 'active',
+ '[id]': 'id',
+ '[attr.aria-selected]': '_getAriaSelected()',
+ '[attr.aria-disabled]': 'disabled.toString()',
+ '[class.mat-option-disabled]': 'disabled',
+ '(click)': '_selectViaInteraction()',
+ '(keydown)': '_handleKeydown($event)',
+ 'class': 'mat-option mat-focus-indicator'
+ },
+ template: "\n\n\n\n\n({{ group.label }})\n\n