ngx-material-navigation 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CONTRIBUTING.md +97 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +119 -0
  4. package/components/footer/footer.component.d.ts +13 -0
  5. package/components/footer/footer.module.d.ts +8 -0
  6. package/components/navbar/nav-element/nav-element.component.d.ts +35 -0
  7. package/components/navbar/nav-element/nav-element.module.d.ts +13 -0
  8. package/components/navbar/nav-menu/nav-menu.component.d.ts +42 -0
  9. package/components/navbar/nav-menu/nav-menu.module.d.ts +11 -0
  10. package/components/navbar/navbar.component.d.ts +53 -0
  11. package/components/navbar/navbar.module.d.ts +11 -0
  12. package/esm2020/components/footer/footer.component.mjs +17 -0
  13. package/esm2020/components/footer/footer.module.mjs +22 -0
  14. package/esm2020/components/navbar/nav-element/nav-element.component.mjs +51 -0
  15. package/esm2020/components/navbar/nav-element/nav-element.module.mjs +42 -0
  16. package/esm2020/components/navbar/nav-menu/nav-menu.component.mjs +71 -0
  17. package/esm2020/components/navbar/nav-menu/nav-menu.module.mjs +34 -0
  18. package/esm2020/components/navbar/navbar.component.mjs +97 -0
  19. package/esm2020/components/navbar/navbar.module.mjs +34 -0
  20. package/esm2020/models/nav-button.model.mjs +2 -0
  21. package/esm2020/models/nav-image.model.mjs +2 -0
  22. package/esm2020/models/nav-link.model.mjs +8 -0
  23. package/esm2020/models/nav-menu.model.mjs +2 -0
  24. package/esm2020/models/nav-title.model.mjs +2 -0
  25. package/esm2020/models/nav.model.mjs +4 -0
  26. package/esm2020/models/navbar.model.mjs +2 -0
  27. package/esm2020/ngx-material-navigation.mjs +5 -0
  28. package/esm2020/public-api.mjs +16 -0
  29. package/esm2020/utilities/nav.utilities.mjs +198 -0
  30. package/fesm2015/ngx-material-navigation.mjs +551 -0
  31. package/fesm2015/ngx-material-navigation.mjs.map +1 -0
  32. package/fesm2020/ngx-material-navigation.mjs +551 -0
  33. package/fesm2020/ngx-material-navigation.mjs.map +1 -0
  34. package/models/nav-button.model.d.ts +11 -0
  35. package/models/nav-image.model.d.ts +40 -0
  36. package/models/nav-link.model.d.ts +39 -0
  37. package/models/nav-menu.model.d.ts +28 -0
  38. package/models/nav-title.model.d.ts +52 -0
  39. package/models/nav.model.d.ts +23 -0
  40. package/models/navbar.model.d.ts +11 -0
  41. package/ngx-material-navigation.d.ts +5 -0
  42. package/package.json +39 -0
  43. package/public-api.d.ts +12 -0
  44. package/utilities/nav.utilities.d.ts +81 -0
@@ -0,0 +1,97 @@
1
+ # Contributing to NgxMaterialNavigation
2
+ Thank you for considering to contribute to this project! It is open for discussion to change anything regarding contributing, linting, workflow etc. at any point in time.
3
+ <br>
4
+ All development is done using github.
5
+
6
+ # Table of Contents
7
+ - [Contributing to NgxMaterialNavigation](#contributing-to-ngxmaterialnavigation)
8
+ - [Table of Contents](#table-of-contents)
9
+ - [Create an Issue](#create-an-issue)
10
+ - [Special guidelines for bug reports](#special-guidelines-for-bug-reports)
11
+ - [Folder structure of the project](#folder-structure-of-the-project)
12
+ - [Starting the project](#starting-the-project)
13
+ - [Codestyle](#codestyle)
14
+ - [User Input](#user-input)
15
+ - [Naming conventions](#naming-conventions)
16
+ - [Tests](#tests)
17
+ - [Workflow for submitting Code Changes](#workflow-for-submitting-code-changes)
18
+ - [License](#license)
19
+
20
+ # Create an Issue
21
+ If you want to ask a question, need a new feature, found gaps in the documentation, found a bug, found code that can be refactored etc. you first have to start with creating an Issue.
22
+ <br>
23
+ Please check if there already is an issue for your problem.
24
+ <br>
25
+ Right now there are now specific guidelines for Issues, other than that their name and description should include enough details so that everyone knows what the issue is about. You should also include some fitting tags.
26
+
27
+ ## Special guidelines for bug reports
28
+
29
+ Great Bug Reports tend to have:
30
+
31
+ - A quick summary
32
+ - Steps to reproduce
33
+ - Be specific!
34
+ - Give sample code if you can
35
+ - What you expected would happen
36
+ - What actually happens
37
+ - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
38
+
39
+ # Folder structure of the project
40
+ The main projects are the library itself which will be published to npm and an showcase project used for trying things out. They can be found inside the `project/ngx-material-navigation` and `projects/ngx-material-entity-navigation` directories.
41
+
42
+ # Starting the project
43
+ 1. Run `npm install` in the root directory,
44
+ 2. Run `npm install` in the project/ngx-material-entity directory
45
+ 3. Run `npm run stack` in the root directory. This will start the build-process of the library aswell as the showcase project all in watch-mode (hot reload). That's it! You will probably only ever need this single command.
46
+ > :information_source: About package.json
47
+ > <br>
48
+ > If you open the package.json in the root directory you will probably notice that it looks a bit messy. That is mainly because:
49
+ > 1. the scripts should support Windows which means that commands like `cp` or even just chaining stuff with `&&` is not available and needed to be replaced with node alternatives.
50
+ > 2. Some of the CD process is done here aswell
51
+
52
+ # Codestyle
53
+ This project is using eslint and requires all linting to pass in order to merge pull requests. It can happen that you need to use code that is against some of the rules (e.g. required use of "any"). In that case you can of course disable that rule at that specific point with
54
+ <br>
55
+ `// eslint-disable-next-line the-rule-to-disable`
56
+ > You can run eslint with the command `npm run lint`
57
+ > <br>
58
+ > You can autofix some codestyle problems with `npm run lint:fix`
59
+
60
+ ## User Input
61
+ Every Input the user can make should be split up in two different models.
62
+
63
+ The first model should be used internal and require all input. The second model should only require values where no default value can be set. The second model should only be used by the user and never internally.
64
+
65
+ That way the components can be highly customizable without requiring the user to input the whole configuration. With the internal model that requires all values we also ensure that newly added configuration options aren't (as easily) forgotten somewhere.
66
+
67
+ ## Naming conventions
68
+
69
+ All angular components / modules inside the library(projects/ngx-material-entity) should be named "`NgxMatNavigation`MyGreatComponentOrModule".
70
+
71
+ Their selector should follow the same logic:
72
+ <br>
73
+ "`ngx-mat-navigation`-my-great-component-or-module"
74
+
75
+ In the folder structure however, you are encouraged to leave the prefix out, because the user will never see this anyway.
76
+
77
+ # Tests
78
+ The testing consists of two test types:
79
+ 1. Unit Tests with Jest, should be used for everything that isn't an angular component
80
+ 2. E2E Tests using Cypress, should be used to test how angular components behave in the "real" world
81
+
82
+ # Workflow for submitting Code Changes
83
+
84
+ 1. Create an issue if it not already exists.
85
+ 2. Create a branch for that specific issue (The best way to this is directly inside the issue on the right side under "Development". That way the the issue and the branch are automatically linked)
86
+ 3. Checkout the new branch
87
+ 4. Add your code
88
+ 5. Update / add [tests](#tests).
89
+ 6. Update the documentation.
90
+ 7. Check that tests and linting passes.
91
+ 1. For tests: `npm run test`
92
+ 2. For linting: `npm run lint` / `npm run lint:fix`
93
+ 8. Rebase to dev and solve any merge-conflicts (`git rebase dev`)
94
+ 9. Issue that pull request!
95
+
96
+ # License
97
+ By contributing to this project, you agree that your contributions will be licensed under its MIT License.
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Tim Fabian
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # NgxMaterialNavigation
2
+
3
+ Builds material navigation elements like a combined navbar and sidenav or footers based on the supplied configuration data. Will automatically move elements from the navbar to the sidenav at the provided breakpoints.
4
+
5
+ Supports nested menus and brings functionality which allow you to extract angular routes from an Configuration if you want to define the routes directly there.
6
+
7
+ # Table of Contents
8
+ - [NgxMaterialNavigation](#ngxmaterialnavigation)
9
+ - [Table of Contents](#table-of-contents)
10
+ - [Requirements](#requirements)
11
+ - [Basic Usage](#basic-usage)
12
+ - [Define your configuration:](#define-your-configuration)
13
+ - [Extract the angular routes](#extract-the-angular-routes)
14
+ - [Use the elements](#use-the-elements)
15
+
16
+ # Requirements
17
+ This package relies on the [angular material library](https://material.angular.io/guide/getting-started) to render its components.
18
+ <br>
19
+ It also uses [bootstrap](https://getbootstrap.com/) for responsive design.
20
+
21
+ # Basic Usage
22
+ ## Define your configuration:
23
+ ```typescript
24
+ import { NavbarRow } from 'ngx-material-navigation';
25
+
26
+ /**
27
+ * The configuration consists of multiple NavbarRows.
28
+ * This is needed if you want to have a toolbar with multiple rows.
29
+ *
30
+ * In most cases you probably only define one NavbarRow in this array.
31
+ */
32
+ export const navbarRows: NavbarRow[] = [
33
+ {
34
+ elements: [
35
+ {
36
+ type: 'imageWithInternalLink',
37
+ url: 'https://www.my-great-website.de/my-great-picture.png',
38
+ link: {
39
+ route: 'home',
40
+ },
41
+ collapse: 'never'
42
+ },
43
+ {
44
+ type: 'titleWithInternalLink',
45
+ title: 'Showcase Project',
46
+ link: {
47
+ route: 'home'
48
+ },
49
+ collapse: 'sm'
50
+ },
51
+ {
52
+ type: 'internalLink',
53
+ name: 'Home',
54
+ route: { // This can also just be a string.
55
+ path: 'home',
56
+ loadChildren: () => import('./components/home/home.module').then(m => m.HomeModule)
57
+ },
58
+ collapse: 'md'
59
+ },
60
+ {
61
+ type: 'menu',
62
+ name: 'Menu',
63
+ elements: [
64
+ {
65
+ type: 'internalLink',
66
+ name: 'menu item #1',
67
+ route: 'menu-item/1'
68
+ },
69
+ {
70
+ type: 'internalLink',
71
+ name: 'menu item #2',
72
+ route: 'menu-item/2'
73
+ }
74
+ ],
75
+ position: 'center',
76
+ collapse: 'md'
77
+ },
78
+ {
79
+ type: 'button',
80
+ name: 'Reload the page',
81
+ action: () => location.reload(),
82
+ position: 'right',
83
+ collapse: 'sm'
84
+ }
85
+ ]
86
+ }
87
+ ];
88
+ ```
89
+ ## Extract the angular routes
90
+ > :warning: Optional:
91
+ > <br>
92
+ > You only need this if you want to define your angular routes inside the NavbarRows.
93
+ ```typescript
94
+ /**
95
+ * Define any additional routes that are not defined in the NavbarRows.
96
+ */
97
+ export const additionalRoutes: Routes = [
98
+ {
99
+ path: 'menu-item/:number',
100
+ loadChildren: () => import('./components/showcase-inputs/showcase-inputs.module').then(m => m.ShowcaseInputsModule)
101
+ }
102
+ ]
103
+
104
+ // Extract the angular routes from the given configuration. This can be used in the app.routing.module.ts
105
+ export const routes: Routes = NavUtilities.getAngularRoutes(navbarRows, additionalRoutes);
106
+ ```
107
+ ## Use the elements
108
+ In app.component.html:
109
+ ```html
110
+ <ngx-mat-navigation-navbar [minHeight]="70" [minSidenavWidth]="'30%'" [minHeightOtherElements]="70" [navbarRows]="navbarRows">
111
+ <!-- The content of your app needs to be put inside the navbar -->
112
+ <router-outlet></router-outlet>
113
+ </ngx-mat-navigation-navbar>
114
+
115
+ <app-footer [minHeight]="70"></app-footer>
116
+ ```
117
+ Please note that all of your content needs to be put inside the navbar. This is needed to put it inside the mat-sidenav-content.
118
+
119
+ The minHeight and minHeightOtherElements is needed internally to set the min-height of the content accordingly.
@@ -0,0 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Displays a footer based on the provided input data.
4
+ */
5
+ export declare class FooterComponent {
6
+ /**
7
+ * The minimum height of the footer.
8
+ */
9
+ minHeight: number;
10
+ constructor();
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FooterComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<FooterComponent, "ngx-mat-navigation-footer", never, { "minHeight": "minHeight"; }, {}, never, never>;
13
+ }
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./footer.component";
3
+ import * as i2 from "@angular/common";
4
+ export declare class NgxMatNavigationFooterModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatNavigationFooterModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatNavigationFooterModule, [typeof i1.FooterComponent], [typeof i2.CommonModule], [typeof i1.FooterComponent]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgxMatNavigationFooterModule>;
8
+ }
@@ -0,0 +1,35 @@
1
+ import { AfterContentChecked } from '@angular/core';
2
+ import { NavElement } from '../../../models/nav.model';
3
+ import { NavUtilities } from '../../../utilities/nav.utilities';
4
+ import { MatSidenav } from '@angular/material/sidenav';
5
+ import { MatButton } from '@angular/material/button';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Displays a single Navigation Element.
9
+ */
10
+ export declare class NavElementComponent implements AfterContentChecked {
11
+ NavUtilities: typeof NavUtilities;
12
+ /**
13
+ * The element to display.
14
+ */
15
+ element: NavElement;
16
+ /**
17
+ * A reference to the sidenav. Is needed for the menu to close the sidenav.
18
+ */
19
+ sidenav?: MatSidenav;
20
+ /**
21
+ * Whether or not this element should be displayed inside the sidenav.
22
+ * Used to apply different styling.
23
+ */
24
+ sidenavElement?: boolean;
25
+ menuButton: MatButton;
26
+ menuWidth: number;
27
+ ngAfterContentChecked(): void;
28
+ /**
29
+ * Updates the width of the menu to the value of its button.
30
+ */
31
+ onResize(): void;
32
+ private getMenuWidth;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavElementComponent, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<NavElementComponent, "ngx-mat-navigation-element", never, { "element": "element"; "sidenav": "sidenav"; "sidenavElement": "sidenavElement"; }, {}, never, never>;
35
+ }
@@ -0,0 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./nav-element.component";
3
+ import * as i2 from "@angular/common";
4
+ import * as i3 from "../nav-menu/nav-menu.module";
5
+ import * as i4 from "@angular/router";
6
+ import * as i5 from "@angular/material/menu";
7
+ import * as i6 from "@angular/material/button";
8
+ import * as i7 from "@angular/material/sidenav";
9
+ export declare class NavElementModule {
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavElementModule, never>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NavElementModule, [typeof i1.NavElementComponent], [typeof i2.CommonModule, typeof i3.NavMenuModule, typeof i4.RouterModule, typeof i5.MatMenuModule, typeof i6.MatButtonModule, typeof i7.MatSidenavModule], [typeof i1.NavElementComponent]>;
12
+ static ɵinj: i0.ɵɵInjectorDeclaration<NavElementModule>;
13
+ }
@@ -0,0 +1,42 @@
1
+ import { AfterContentChecked } from '@angular/core';
2
+ import { MatMenu } from '@angular/material/menu';
3
+ import { NavMenu, NavMenuElement } from "../../../models/nav-menu.model";
4
+ import { NavUtilities } from '../../../utilities/nav.utilities';
5
+ import { MatSidenav } from '@angular/material/sidenav';
6
+ import { MatButton } from '@angular/material/button';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Displays a menu based on the provided NavMenu data.
10
+ */
11
+ export declare class NavMenuComponent implements AfterContentChecked {
12
+ menu: MatMenu;
13
+ /**
14
+ * The data that is used to generate the menu.
15
+ */
16
+ navMenu: NavMenu;
17
+ /**
18
+ * The sidenav element. Is needed so that it can be closed from within a menu.
19
+ */
20
+ sidenav?: MatSidenav;
21
+ /**
22
+ * The width of the menu. Is set to the value of the button opening it.
23
+ */
24
+ menuWidth: number;
25
+ NavUtilities: typeof NavUtilities;
26
+ nestedMenuButton: MatButton;
27
+ nestedMenuWidth: number;
28
+ ngAfterContentChecked(): void;
29
+ /**
30
+ * Updates the width of the nestedMenu.
31
+ */
32
+ onResize(): void;
33
+ private getMenuWidth;
34
+ /**
35
+ * Defines if the sidenav should be closed when the given element is clicked.
36
+ *
37
+ * @param element - The element that has been clicked.
38
+ */
39
+ clickSidenavElement(element: NavMenuElement): void;
40
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavMenuComponent, never>;
41
+ static ɵcmp: i0.ɵɵComponentDeclaration<NavMenuComponent, "ngx-mat-navigation-menu", never, { "navMenu": "navMenu"; "sidenav": "sidenav"; "menuWidth": "menuWidth"; }, {}, never, never>;
42
+ }
@@ -0,0 +1,11 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./nav-menu.component";
3
+ import * as i2 from "@angular/common";
4
+ import * as i3 from "@angular/material/menu";
5
+ import * as i4 from "@angular/router";
6
+ import * as i5 from "@angular/material/button";
7
+ export declare class NavMenuModule {
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavMenuModule, never>;
9
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NavMenuModule, [typeof i1.NavMenuComponent], [typeof i2.CommonModule, typeof i3.MatMenuModule, typeof i4.RouterModule, typeof i5.MatButtonModule], [typeof i1.NavMenuComponent]>;
10
+ static ɵinj: i0.ɵɵInjectorDeclaration<NavMenuModule>;
11
+ }
@@ -0,0 +1,53 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { MatSidenav } from '@angular/material/sidenav';
3
+ import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
4
+ import { NavElement } from '../../models/nav.model';
5
+ import { NavbarRow } from '../../models/navbar.model';
6
+ import { NavUtilities } from '../../utilities/nav.utilities';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * The navbar component.
10
+ * Takes in your configuration and builds a toolbar as well as a sidenav accordingly.
11
+ * Also handles responsiveness.
12
+ */
13
+ export declare class NavbarComponent implements OnInit {
14
+ sanitizer: DomSanitizer;
15
+ NavUtilities: typeof NavUtilities;
16
+ /**
17
+ * The navbar rows to build the navbar from.
18
+ */
19
+ navbarRows: NavbarRow[];
20
+ /**
21
+ * The minimum height of the navbar.
22
+ */
23
+ minHeight: number;
24
+ /**
25
+ * The minimum height of all other elements that are on the same level as the navbar component.
26
+ */
27
+ minHeightOtherElements: number;
28
+ /**
29
+ * The minimum width of the sidenav.
30
+ */
31
+ minSidenavWidth?: string;
32
+ sidenav: MatSidenav;
33
+ sidenavElements: NavElement[];
34
+ burgerMenu: NavElement;
35
+ sanitizedMinHeight: SafeStyle;
36
+ screenWidth: number;
37
+ screenWidthName: 'lg' | 'md' | 'sm';
38
+ constructor(sanitizer: DomSanitizer);
39
+ ngOnInit(): void;
40
+ /**
41
+ * Updates the current screen width and filters the sidenav elements accordingly.
42
+ */
43
+ onResize(): void;
44
+ /**
45
+ * Defines if the sidenav should be closed when the given element is clicked.
46
+ *
47
+ * @param element - The element that has been clicked.
48
+ */
49
+ clickSidenavElement(element: NavElement): void;
50
+ private getCurrentScreenWidth;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<NavbarComponent, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<NavbarComponent, "ngx-mat-navigation-navbar", never, { "navbarRows": "navbarRows"; "minHeight": "minHeight"; "minHeightOtherElements": "minHeightOtherElements"; "minSidenavWidth": "minSidenavWidth"; }, {}, never, ["*"]>;
53
+ }
@@ -0,0 +1,11 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./navbar.component";
3
+ import * as i2 from "@angular/common";
4
+ import * as i3 from "@angular/material/toolbar";
5
+ import * as i4 from "./nav-element/nav-element.module";
6
+ import * as i5 from "@angular/material/sidenav";
7
+ export declare class NgxMatNavigationNavbarModule {
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatNavigationNavbarModule, never>;
9
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatNavigationNavbarModule, [typeof i1.NavbarComponent], [typeof i2.CommonModule, typeof i3.MatToolbarModule, typeof i4.NavElementModule, typeof i5.MatSidenavModule], [typeof i1.NavbarComponent]>;
10
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgxMatNavigationNavbarModule>;
11
+ }
@@ -0,0 +1,17 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Displays a footer based on the provided input data.
5
+ */
6
+ export class FooterComponent {
7
+ constructor() { }
8
+ }
9
+ FooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ FooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: FooterComponent, selector: "ngx-mat-navigation-footer", inputs: { minHeight: "minHeight" }, ngImport: i0, template: "<div class=\"mat-elevation-z8\" [style.minHeight.px]=\"minHeight\" style=\"background-color: #F5F5F5;\">\r\n\r\n</div>", styles: [""] });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FooterComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'ngx-mat-navigation-footer', template: "<div class=\"mat-elevation-z8\" [style.minHeight.px]=\"minHeight\" style=\"background-color: #F5F5F5;\">\r\n\r\n</div>", styles: [""] }]
14
+ }], ctorParameters: function () { return []; }, propDecorators: { minHeight: [{
15
+ type: Input
16
+ }] } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1uYXZpZ2F0aW9uL3NyYy9jb21wb25lbnRzL2Zvb3Rlci9mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLW5hdmlnYXRpb24vc3JjL2NvbXBvbmVudHMvZm9vdGVyL2Zvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFakQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sZUFBZTtJQVF4QixnQkFBZ0IsQ0FBQzs7NkdBUlIsZUFBZTtpR0FBZixlQUFlLHFHQ1Y1Qix3SEFFTTs0RkRRTyxlQUFlO2tCQUwzQixTQUFTOytCQUNJLDJCQUEyQjswRUFVckMsU0FBUztzQkFEUixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIERpc3BsYXlzIGEgZm9vdGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtbmF2aWdhdGlvbi1mb290ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvb3Rlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9mb290ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9vdGVyQ29tcG9uZW50IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIGhlaWdodCBvZiB0aGUgZm9vdGVyLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgbWluSGVpZ2h0ITogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiIFtzdHlsZS5taW5IZWlnaHQucHhdPVwibWluSGVpZ2h0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1O1wiPlxyXG5cclxuPC9kaXY+Il19
@@ -0,0 +1,22 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FooterComponent } from './footer.component';
4
+ import * as i0 from "@angular/core";
5
+ export class NgxMatNavigationFooterModule {
6
+ }
7
+ NgxMatNavigationFooterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatNavigationFooterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ NgxMatNavigationFooterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatNavigationFooterModule, declarations: [FooterComponent], imports: [CommonModule], exports: [FooterComponent] });
9
+ NgxMatNavigationFooterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatNavigationFooterModule, imports: [[
10
+ CommonModule
11
+ ]] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatNavigationFooterModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ imports: [
16
+ CommonModule
17
+ ],
18
+ declarations: [FooterComponent],
19
+ exports: [FooterComponent]
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1uYXZpZ2F0aW9uL3NyYy9jb21wb25lbnRzL2Zvb3Rlci9mb290ZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFTckQsTUFBTSxPQUFPLDRCQUE0Qjs7MEhBQTVCLDRCQUE0QjsySEFBNUIsNEJBQTRCLGlCQUh0QixlQUFlLGFBRjFCLFlBQVksYUFHTixlQUFlOzJIQUVoQiw0QkFBNEIsWUFONUI7WUFDTCxZQUFZO1NBQ2Y7NEZBSVEsNEJBQTRCO2tCQVB4QyxRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3FCQUNmO29CQUNELFlBQVksRUFBRSxDQUFDLGVBQWUsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2lCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4vZm9vdGVyLmNvbXBvbmVudCc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIENvbW1vbk1vZHVsZVxyXG4gICAgXSxcclxuICAgIGRlY2xhcmF0aW9uczogW0Zvb3RlckNvbXBvbmVudF0sXHJcbiAgICBleHBvcnRzOiBbRm9vdGVyQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4TWF0TmF2aWdhdGlvbkZvb3Rlck1vZHVsZSB7IH0iXX0=
@@ -0,0 +1,51 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { NavUtilities } from '../../../utilities/nav.utilities';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/menu";
5
+ import * as i2 from "@angular/material/button";
6
+ import * as i3 from "../nav-menu/nav-menu.component";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/router";
9
+ /**
10
+ * Displays a single Navigation Element.
11
+ */
12
+ export class NavElementComponent {
13
+ constructor() {
14
+ this.NavUtilities = NavUtilities;
15
+ }
16
+ ngAfterContentChecked() {
17
+ if (this.menuButton) {
18
+ this.menuWidth = this.getMenuWidth();
19
+ }
20
+ }
21
+ /**
22
+ * Updates the width of the menu to the value of its button.
23
+ */
24
+ onResize() {
25
+ if (this.menuButton) {
26
+ this.menuWidth = this.getMenuWidth();
27
+ }
28
+ }
29
+ getMenuWidth() {
30
+ return this.menuButton._elementRef.nativeElement.offsetWidth;
31
+ }
32
+ }
33
+ NavElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NavElementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
34
+ NavElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NavElementComponent, selector: "ngx-mat-navigation-element", inputs: { element: "element", sidenav: "sidenav", sidenavElement: "sidenavElement" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "menuButton", first: true, predicate: ["menuButton"], descendants: true }], ngImport: i0, template: "<span [ngSwitch]=\"element.type\">\r\n <!-- Title -->\r\n <h1 mat-menu-item disabled *ngSwitchCase=\"'title'\" [class.sidenavElement]=\"sidenavElement\">\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n <!-- Title with internal link -->\r\n <a id=\"title-link\" disableRipple mat-menu-item *ngSwitchCase=\"'titleWithInternalLink'\"\r\n [routerLink]=\" \r\n NavUtilities.asAngularRoute(NavUtilities.asTitleWithInternalLink(element).link.route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asTitleWithInternalLink(element).link.route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asTitleWithInternalLink(element).link.route)\"\r\n [target]=\"NavUtilities.asTitleWithInternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asTitleWithInternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <h1>\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n </a>\r\n <!-- Title with external link -->\r\n <a class=\"title-link\" disableRipple mat-menu-item *ngSwitchCase=\"'titleWithExternalLink'\"\r\n [href]=\"NavUtilities.asTitleWithExternalLink(element).link.url\"\r\n [target]=\"NavUtilities.asTitleWithExternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asTitleWithExternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <h1>\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n </a>\r\n <!-- Image -->\r\n <img mat-menu-item disabled *ngSwitchCase=\"'image'\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n [src]=\"NavUtilities.asImage(element).url\"\r\n >\r\n <!-- Image with internal link -->\r\n <a id=\"image-link\" disableRipple mat-menu-item *ngSwitchCase=\"'imageWithInternalLink'\"\r\n [routerLink]=\"\r\n NavUtilities.asAngularRoute(NavUtilities.asImageWithInternalLink(element).link.route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asImageWithInternalLink(element).link.route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asImageWithInternalLink(element).link.route)\"\r\n [target]=\"NavUtilities.asImageWithInternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asImageWithInternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <img [src]=\"NavUtilities.asImageWithInternalLink(element).url\">\r\n </a>\r\n <!-- Image with external link -->\r\n <a id=\"image-link\" disableRipple mat-menu-item *ngSwitchCase=\"'imageWithExternalLink'\"\r\n [href]=\"NavUtilities.asImageWithExternalLink(element).link.url\"\r\n [target]=\"NavUtilities.asImageWithExternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asImageWithExternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <img [src]=\"NavUtilities.asImageWithExternalLink(element).url\">\r\n </a>\r\n <!-- Button -->\r\n <button *ngSwitchCase=\"'button'\"\r\n mat-raised-button\r\n (click)=\"NavUtilities.asButton(element).action()\"\r\n [class.sidenavElementButton]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asButton(element).icon\" [class]=\"NavUtilities.asButton(element).icon\"></i>\r\n {{NavUtilities.asButton(element).name}}\r\n </button>\r\n <!-- Internal Link -->\r\n <a mat-button *ngSwitchCase=\"'internalLink'\"\r\n [routerLink]=\"\r\n NavUtilities.asAngularRoute(NavUtilities.asInternalLink(element).route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asInternalLink(element).route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asInternalLink(element).route)\"\r\n [target]=\"NavUtilities.asInternalLink(element).openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asInternalLink(element).openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asInternalLink(element).icon\" [class]=\"NavUtilities.asInternalLink(element).icon\"></i> \r\n {{NavUtilities.asInternalLink(element).name}}\r\n </a>\r\n <!-- External Link -->\r\n <span *ngSwitchCase=\"'externalLink'\">\r\n <a mat-button\r\n [href]=\"NavUtilities.asExternalLink(element).url\"\r\n [target]=\"NavUtilities.asExternalLink(element).openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asExternalLink(element).openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asExternalLink(element).icon\" [class]=\"NavUtilities.asExternalLink(element).icon\"></i>\r\n {{NavUtilities.asExternalLink(element).name}}\r\n </a>\r\n </span>\r\n <!-- Menu -->\r\n <button #menuButton *ngSwitchCase=\"'menu'\" mat-button [matMenuTriggerFor]=\"menu.menu\" [class.sidenavElement]=\"sidenavElement\">\r\n <i *ngIf=\"NavUtilities.asMenu(element).icon\" [class]=\"NavUtilities.asMenu(element).icon\"></i>\r\n {{NavUtilities.asMenu(element).name}}\r\n </button>\r\n <ngx-mat-navigation-menu #menu\r\n [navMenu]=\"NavUtilities.asMenu(element)\"\r\n [sidenav]=\"sidenav\"\r\n [menuWidth]=\"menuWidth\">\r\n </ngx-mat-navigation-menu>\r\n \r\n</span>", styles: ["#title-link{display:flex;align-items:center;justify-content:center;color:inherit}#image-link{display:flex;align-items:center;padding:0}#image-link img{max-height:100%;max-width:100%}#image-link:hover,#title-link:hover{cursor:pointer;background-color:transparent}.sidenavElement{display:inline-block;width:100%;text-align:left}.sidenavElementButton{display:inline-block;width:100%}mat-menu{display:none}.mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:4px;outline:0;min-height:64px}.mat-menu-panel.ng-animating{pointer-events:none}.cdk-high-contrast-active .mat-menu-panel{outline:solid 1px}.mat-menu-content:not(:empty){padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;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}.mat-menu-item::-moz-focus-inner{border:0}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}.mat-menu-item .mat-icon svg{vertical-align:top}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item[disabled]:before{display:block;position:absolute;content:\"\";top:0;left:0;bottom:0;right:0}.cdk-high-contrast-active .mat-menu-item{margin-top:1px}.cdk-high-contrast-active .mat-menu-item.cdk-program-focused,.cdk-high-contrast-active .mat-menu-item.cdk-keyboard-focused,.cdk-high-contrast-active .mat-menu-item-highlighted{outline:dotted 1px}.mat-menu-item-submenu-trigger{padding-right:32px}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}.mat-menu-submenu-icon{position:absolute;top:50%;right:16px;transform:translateY(-50%);width:5px;height:10px;fill:currentColor}[dir=rtl] .mat-menu-submenu-icon{right:auto;left:16px;transform:translateY(-50%) scaleX(-1)}.cdk-high-contrast-active .mat-menu-submenu-icon{fill:CanvasText}button.mat-menu-item{width:100%}.mat-menu-item .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n"], components: [{ type: i1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i2.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i3.NavMenuComponent, selector: "ngx-mat-navigation-menu", inputs: ["navMenu", "sidenav", "menuWidth"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }] });
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NavElementComponent, decorators: [{
36
+ type: Component,
37
+ args: [{ selector: 'ngx-mat-navigation-element', template: "<span [ngSwitch]=\"element.type\">\r\n <!-- Title -->\r\n <h1 mat-menu-item disabled *ngSwitchCase=\"'title'\" [class.sidenavElement]=\"sidenavElement\">\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n <!-- Title with internal link -->\r\n <a id=\"title-link\" disableRipple mat-menu-item *ngSwitchCase=\"'titleWithInternalLink'\"\r\n [routerLink]=\" \r\n NavUtilities.asAngularRoute(NavUtilities.asTitleWithInternalLink(element).link.route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asTitleWithInternalLink(element).link.route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asTitleWithInternalLink(element).link.route)\"\r\n [target]=\"NavUtilities.asTitleWithInternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asTitleWithInternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <h1>\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n </a>\r\n <!-- Title with external link -->\r\n <a class=\"title-link\" disableRipple mat-menu-item *ngSwitchCase=\"'titleWithExternalLink'\"\r\n [href]=\"NavUtilities.asTitleWithExternalLink(element).link.url\"\r\n [target]=\"NavUtilities.asTitleWithExternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asTitleWithExternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <h1>\r\n <i *ngIf=\"NavUtilities.asTitle(element).icon\" [class]=\"NavUtilities.asTitle(element).icon\"></i>\r\n {{NavUtilities.asTitle(element).title}}\r\n </h1>\r\n </a>\r\n <!-- Image -->\r\n <img mat-menu-item disabled *ngSwitchCase=\"'image'\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n [src]=\"NavUtilities.asImage(element).url\"\r\n >\r\n <!-- Image with internal link -->\r\n <a id=\"image-link\" disableRipple mat-menu-item *ngSwitchCase=\"'imageWithInternalLink'\"\r\n [routerLink]=\"\r\n NavUtilities.asAngularRoute(NavUtilities.asImageWithInternalLink(element).link.route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asImageWithInternalLink(element).link.route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asImageWithInternalLink(element).link.route)\"\r\n [target]=\"NavUtilities.asImageWithInternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asImageWithInternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <img [src]=\"NavUtilities.asImageWithInternalLink(element).url\">\r\n </a>\r\n <!-- Image with external link -->\r\n <a id=\"image-link\" disableRipple mat-menu-item *ngSwitchCase=\"'imageWithExternalLink'\"\r\n [href]=\"NavUtilities.asImageWithExternalLink(element).link.url\"\r\n [target]=\"NavUtilities.asImageWithExternalLink(element).link.openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asImageWithExternalLink(element).link.openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <img [src]=\"NavUtilities.asImageWithExternalLink(element).url\">\r\n </a>\r\n <!-- Button -->\r\n <button *ngSwitchCase=\"'button'\"\r\n mat-raised-button\r\n (click)=\"NavUtilities.asButton(element).action()\"\r\n [class.sidenavElementButton]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asButton(element).icon\" [class]=\"NavUtilities.asButton(element).icon\"></i>\r\n {{NavUtilities.asButton(element).name}}\r\n </button>\r\n <!-- Internal Link -->\r\n <a mat-button *ngSwitchCase=\"'internalLink'\"\r\n [routerLink]=\"\r\n NavUtilities.asAngularRoute(NavUtilities.asInternalLink(element).route).path !== undefined\r\n ? NavUtilities.asAngularRoute(NavUtilities.asInternalLink(element).route).path\r\n : NavUtilities.asStringRoute(NavUtilities.asInternalLink(element).route)\"\r\n [target]=\"NavUtilities.asInternalLink(element).openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asInternalLink(element).openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asInternalLink(element).icon\" [class]=\"NavUtilities.asInternalLink(element).icon\"></i> \r\n {{NavUtilities.asInternalLink(element).name}}\r\n </a>\r\n <!-- External Link -->\r\n <span *ngSwitchCase=\"'externalLink'\">\r\n <a mat-button\r\n [href]=\"NavUtilities.asExternalLink(element).url\"\r\n [target]=\"NavUtilities.asExternalLink(element).openInNewTab ? '_blank' : '_self'\"\r\n [rel]=\"NavUtilities.asExternalLink(element).openInNewTab ? 'noreferrer noopener' : undefined\"\r\n [class.sidenavElement]=\"sidenavElement\"\r\n >\r\n <i *ngIf=\"NavUtilities.asExternalLink(element).icon\" [class]=\"NavUtilities.asExternalLink(element).icon\"></i>\r\n {{NavUtilities.asExternalLink(element).name}}\r\n </a>\r\n </span>\r\n <!-- Menu -->\r\n <button #menuButton *ngSwitchCase=\"'menu'\" mat-button [matMenuTriggerFor]=\"menu.menu\" [class.sidenavElement]=\"sidenavElement\">\r\n <i *ngIf=\"NavUtilities.asMenu(element).icon\" [class]=\"NavUtilities.asMenu(element).icon\"></i>\r\n {{NavUtilities.asMenu(element).name}}\r\n </button>\r\n <ngx-mat-navigation-menu #menu\r\n [navMenu]=\"NavUtilities.asMenu(element)\"\r\n [sidenav]=\"sidenav\"\r\n [menuWidth]=\"menuWidth\">\r\n </ngx-mat-navigation-menu>\r\n \r\n</span>", styles: ["#title-link{display:flex;align-items:center;justify-content:center;color:inherit}#image-link{display:flex;align-items:center;padding:0}#image-link img{max-height:100%;max-width:100%}#image-link:hover,#title-link:hover{cursor:pointer;background-color:transparent}.sidenavElement{display:inline-block;width:100%;text-align:left}.sidenavElementButton{display:inline-block;width:100%}mat-menu{display:none}.mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:4px;outline:0;min-height:64px}.mat-menu-panel.ng-animating{pointer-events:none}.cdk-high-contrast-active .mat-menu-panel{outline:solid 1px}.mat-menu-content:not(:empty){padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;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}.mat-menu-item::-moz-focus-inner{border:0}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}.mat-menu-item .mat-icon svg{vertical-align:top}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item[disabled]:before{display:block;position:absolute;content:\"\";top:0;left:0;bottom:0;right:0}.cdk-high-contrast-active .mat-menu-item{margin-top:1px}.cdk-high-contrast-active .mat-menu-item.cdk-program-focused,.cdk-high-contrast-active .mat-menu-item.cdk-keyboard-focused,.cdk-high-contrast-active .mat-menu-item-highlighted{outline:dotted 1px}.mat-menu-item-submenu-trigger{padding-right:32px}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}.mat-menu-submenu-icon{position:absolute;top:50%;right:16px;transform:translateY(-50%);width:5px;height:10px;fill:currentColor}[dir=rtl] .mat-menu-submenu-icon{right:auto;left:16px;transform:translateY(-50%) scaleX(-1)}.cdk-high-contrast-active .mat-menu-submenu-icon{fill:CanvasText}button.mat-menu-item{width:100%}.mat-menu-item .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n"] }]
38
+ }], propDecorators: { element: [{
39
+ type: Input
40
+ }], sidenav: [{
41
+ type: Input
42
+ }], sidenavElement: [{
43
+ type: Input
44
+ }], menuButton: [{
45
+ type: ViewChild,
46
+ args: ['menuButton']
47
+ }], onResize: [{
48
+ type: HostListener,
49
+ args: ['window:resize', ['$event']]
50
+ }] } });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LWVsZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLW5hdmlnYXRpb24vc3JjL2NvbXBvbmVudHMvbmF2YmFyL25hdi1lbGVtZW50L25hdi1lbGVtZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1uYXZpZ2F0aW9uL3NyYy9jb21wb25lbnRzL25hdmJhci9uYXYtZWxlbWVudC9uYXYtZWxlbWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7QUFJaEU7O0dBRUc7QUFNSCxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBT0ksaUJBQVksR0FBRyxZQUFZLENBQUM7S0E2Qy9CO0lBbkJHLHFCQUFxQjtRQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFFSCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3hDO0lBQ0wsQ0FBQztJQUVPLFlBQVk7UUFDaEIsT0FBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxhQUE2QixDQUFDLFdBQVcsQ0FBQztJQUNsRixDQUFDOztpSEE5Q1EsbUJBQW1CO3FHQUFuQixtQkFBbUIsZ1VDZGhDLDZsTUF3R087NEZEMUZNLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDSSw0QkFBNEI7OEJBWXRDLE9BQU87c0JBRE4sS0FBSztnQkFPTixPQUFPO3NCQUROLEtBQUs7Z0JBUU4sY0FBYztzQkFEYixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZO2dCQWV2QixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmF2RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9uYXYubW9kZWwnO1xyXG5pbXBvcnQgeyBOYXZVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMvbmF2LnV0aWxpdGllcyc7XHJcbmltcG9ydCB7IE1hdFNpZGVuYXYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuXHJcbi8qKlxyXG4gKiBEaXNwbGF5cyBhIHNpbmdsZSBOYXZpZ2F0aW9uIEVsZW1lbnQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd4LW1hdC1uYXZpZ2F0aW9uLWVsZW1lbnQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL25hdi1lbGVtZW50LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL25hdi1lbGVtZW50LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdkVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkIHtcclxuXHJcbiAgICBOYXZVdGlsaXRpZXMgPSBOYXZVdGlsaXRpZXM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWxlbWVudCB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZWxlbWVudCE6IE5hdkVsZW1lbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgc2lkZW5hdi4gSXMgbmVlZGVkIGZvciB0aGUgbWVudSB0byBjbG9zZSB0aGUgc2lkZW5hdi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHNpZGVuYXY/OiBNYXRTaWRlbmF2O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBvciBub3QgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBzaWRlbmF2LlxyXG4gICAgICogVXNlZCB0byBhcHBseSBkaWZmZXJlbnQgc3R5bGluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHNpZGVuYXZFbGVtZW50PzogYm9vbGVhbjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdtZW51QnV0dG9uJylcclxuICAgIG1lbnVCdXR0b24hOiBNYXRCdXR0b247XHJcblxyXG4gICAgbWVudVdpZHRoITogbnVtYmVyO1xyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tZW51QnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVudVdpZHRoID0gdGhpcy5nZXRNZW51V2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB3aWR0aCBvZiB0aGUgbWVudSB0byB0aGUgdmFsdWUgb2YgaXRzIGJ1dHRvbi5cclxuICAgICAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tZW51QnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVudVdpZHRoID0gdGhpcy5nZXRNZW51V2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNZW51V2lkdGgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMubWVudUJ1dHRvbi5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxufSIsIjxzcGFuIFtuZ1N3aXRjaF09XCJlbGVtZW50LnR5cGVcIj5cclxuICAgIDwhLS0gVGl0bGUgLS0+XHJcbiAgICA8aDEgbWF0LW1lbnUtaXRlbSBkaXNhYmxlZCAqbmdTd2l0Y2hDYXNlPVwiJ3RpdGxlJ1wiIFtjbGFzcy5zaWRlbmF2RWxlbWVudF09XCJzaWRlbmF2RWxlbWVudFwiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiTmF2VXRpbGl0aWVzLmFzVGl0bGUoZWxlbWVudCkuaWNvblwiIFtjbGFzc109XCJOYXZVdGlsaXRpZXMuYXNUaXRsZShlbGVtZW50KS5pY29uXCI+PC9pPlxyXG4gICAgICAgIHt7TmF2VXRpbGl0aWVzLmFzVGl0bGUoZWxlbWVudCkudGl0bGV9fVxyXG4gICAgPC9oMT5cclxuICAgIDwhLS0gVGl0bGUgd2l0aCBpbnRlcm5hbCBsaW5rIC0tPlxyXG4gICAgPGEgaWQ9XCJ0aXRsZS1saW5rXCIgZGlzYWJsZVJpcHBsZSBtYXQtbWVudS1pdGVtICpuZ1N3aXRjaENhc2U9XCIndGl0bGVXaXRoSW50ZXJuYWxMaW5rJ1wiXHJcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiICAgICAgXHJcbiAgICAgICAgICAgIE5hdlV0aWxpdGllcy5hc0FuZ3VsYXJSb3V0ZShOYXZVdGlsaXRpZXMuYXNUaXRsZVdpdGhJbnRlcm5hbExpbmsoZWxlbWVudCkubGluay5yb3V0ZSkucGF0aCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gTmF2VXRpbGl0aWVzLmFzQW5ndWxhclJvdXRlKE5hdlV0aWxpdGllcy5hc1RpdGxlV2l0aEludGVybmFsTGluayhlbGVtZW50KS5saW5rLnJvdXRlKS5wYXRoXHJcbiAgICAgICAgICAgIDogTmF2VXRpbGl0aWVzLmFzU3RyaW5nUm91dGUoTmF2VXRpbGl0aWVzLmFzVGl0bGVXaXRoSW50ZXJuYWxMaW5rKGVsZW1lbnQpLmxpbmsucm91dGUpXCJcclxuICAgICAgICBbdGFyZ2V0XT1cIk5hdlV0aWxpdGllcy5hc1RpdGxlV2l0aEludGVybmFsTGluayhlbGVtZW50KS5saW5rLm9wZW5Jbk5ld1RhYiA/ICdfYmxhbmsnIDogJ19zZWxmJ1wiXHJcbiAgICAgICAgW3JlbF09XCJOYXZVdGlsaXRpZXMuYXNUaXRsZVdpdGhJbnRlcm5hbExpbmsoZWxlbWVudCkubGluay5vcGVuSW5OZXdUYWIgPyAnbm9yZWZlcnJlciBub29wZW5lcicgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgIFtjbGFzcy5zaWRlbmF2RWxlbWVudF09XCJzaWRlbmF2RWxlbWVudFwiXHJcbiAgICA+XHJcbiAgICAgICAgPGgxPlxyXG4gICAgICAgICAgICA8aSAqbmdJZj1cIk5hdlV0aWxpdGllcy5hc1RpdGxlKGVsZW1lbnQpLmljb25cIiBbY2xhc3NdPVwiTmF2VXRpbGl0aWVzLmFzVGl0bGUoZWxlbWVudCkuaWNvblwiPjwvaT5cclxuICAgICAgICAgICAge3tOYXZVdGlsaXRpZXMuYXNUaXRsZShlbGVtZW50KS50aXRsZX19XHJcbiAgICAgICAgPC9oMT5cclxuICAgIDwvYT5cclxuICAgIDwhLS0gVGl0bGUgd2l0aCBleHRlcm5hbCBsaW5rIC0tPlxyXG4gICAgPGEgY2xhc3M9XCJ0aXRsZS1saW5rXCIgZGlzYWJsZVJpcHBsZSBtYXQtbWVudS1pdGVtICpuZ1N3aXRjaENhc2U9XCIndGl0bGVXaXRoRXh0ZXJuYWxMaW5rJ1wiXHJcbiAgICAgICAgW2hyZWZdPVwiTmF2VXRpbGl0aWVzLmFzVGl0bGVXaXRoRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLmxpbmsudXJsXCJcclxuICAgICAgICBbdGFyZ2V0XT1cIk5hdlV0aWxpdGllcy5hc1RpdGxlV2l0aEV4dGVybmFsTGluayhlbGVtZW50KS5saW5rLm9wZW5Jbk5ld1RhYiA/ICdfYmxhbmsnIDogJ19zZWxmJ1wiXHJcbiAgICAgICAgW3JlbF09XCJOYXZVdGlsaXRpZXMuYXNUaXRsZVdpdGhFeHRlcm5hbExpbmsoZWxlbWVudCkubGluay5vcGVuSW5OZXdUYWIgPyAnbm9yZWZlcnJlciBub29wZW5lcicgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgIFtjbGFzcy5zaWRlbmF2RWxlbWVudF09XCJzaWRlbmF2RWxlbWVudFwiXHJcbiAgICA+XHJcbiAgICAgICAgPGgxPlxyXG4gICAgICAgICAgICA8aSAqbmdJZj1cIk5hdlV0aWxpdGllcy5hc1RpdGxlKGVsZW1lbnQpLmljb25cIiBbY2xhc3NdPVwiTmF2VXRpbGl0aWVzLmFzVGl0bGUoZWxlbWVudCkuaWNvblwiPjwvaT5cclxuICAgICAgICAgICAge3tOYXZVdGlsaXRpZXMuYXNUaXRsZShlbGVtZW50KS50aXRsZX19XHJcbiAgICAgICAgPC9oMT5cclxuICAgIDwvYT5cclxuICAgIDwhLS0gSW1hZ2UgLS0+XHJcbiAgICA8aW1nIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIlxyXG4gICAgICAgIFtjbGFzcy5zaWRlbmF2RWxlbWVudF09XCJzaWRlbmF2RWxlbWVudFwiXHJcbiAgICAgICAgW3NyY109XCJOYXZVdGlsaXRpZXMuYXNJbWFnZShlbGVtZW50KS51cmxcIlxyXG4gICAgPlxyXG4gICAgPCEtLSBJbWFnZSB3aXRoIGludGVybmFsIGxpbmsgLS0+XHJcbiAgICA8YSBpZD1cImltYWdlLWxpbmtcIiBkaXNhYmxlUmlwcGxlIG1hdC1tZW51LWl0ZW0gKm5nU3dpdGNoQ2FzZT1cIidpbWFnZVdpdGhJbnRlcm5hbExpbmsnXCJcclxuICAgICAgICBbcm91dGVyTGlua109XCJcclxuICAgICAgICAgICAgTmF2VXRpbGl0aWVzLmFzQW5ndWxhclJvdXRlKE5hdlV0aWxpdGllcy5hc0ltYWdlV2l0aEludGVybmFsTGluayhlbGVtZW50KS5saW5rLnJvdXRlKS5wYXRoICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBOYXZVdGlsaXRpZXMuYXNBbmd1bGFyUm91dGUoTmF2VXRpbGl0aWVzLmFzSW1hZ2VXaXRoSW50ZXJuYWxMaW5rKGVsZW1lbnQpLmxpbmsucm91dGUpLnBhdGhcclxuICAgICAgICAgICAgOiBOYXZVdGlsaXRpZXMuYXNTdHJpbmdSb3V0ZShOYXZVdGlsaXRpZXMuYXNJbWFnZVdpdGhJbnRlcm5hbExpbmsoZWxlbWVudCkubGluay5yb3V0ZSlcIlxyXG4gICAgICAgIFt0YXJnZXRdPVwiTmF2VXRpbGl0aWVzLmFzSW1hZ2VXaXRoSW50ZXJuYWxMaW5rKGVsZW1lbnQpLmxpbmsub3BlbkluTmV3VGFiID8gJ19ibGFuaycgOiAnX3NlbGYnXCJcclxuICAgICAgICBbcmVsXT1cIk5hdlV0aWxpdGllcy5hc0ltYWdlV2l0aEludGVybmFsTGluayhlbGVtZW50KS5saW5rLm9wZW5Jbk5ld1RhYiA/ICdub3JlZmVycmVyIG5vb3BlbmVyJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgW2NsYXNzLnNpZGVuYXZFbGVtZW50XT1cInNpZGVuYXZFbGVtZW50XCJcclxuICAgID5cclxuICAgICAgICA8aW1nIFtzcmNdPVwiTmF2VXRpbGl0aWVzLmFzSW1hZ2VXaXRoSW50ZXJuYWxMaW5rKGVsZW1lbnQpLnVybFwiPlxyXG4gICAgPC9hPlxyXG4gICAgPCEtLSBJbWFnZSB3aXRoIGV4dGVybmFsIGxpbmsgLS0+XHJcbiAgICA8YSBpZD1cImltYWdlLWxpbmtcIiBkaXNhYmxlUmlwcGxlIG1hdC1tZW51LWl0ZW0gKm5nU3dpdGNoQ2FzZT1cIidpbWFnZVdpdGhFeHRlcm5hbExpbmsnXCJcclxuICAgICAgICBbaHJlZl09XCJOYXZVdGlsaXRpZXMuYXNJbWFnZVdpdGhFeHRlcm5hbExpbmsoZWxlbWVudCkubGluay51cmxcIlxyXG4gICAgICAgIFt0YXJnZXRdPVwiTmF2VXRpbGl0aWVzLmFzSW1hZ2VXaXRoRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLmxpbmsub3BlbkluTmV3VGFiID8gJ19ibGFuaycgOiAnX3NlbGYnXCJcclxuICAgICAgICBbcmVsXT1cIk5hdlV0aWxpdGllcy5hc0ltYWdlV2l0aEV4dGVybmFsTGluayhlbGVtZW50KS5saW5rLm9wZW5Jbk5ld1RhYiA/ICdub3JlZmVycmVyIG5vb3BlbmVyJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgW2NsYXNzLnNpZGVuYXZFbGVtZW50XT1cInNpZGVuYXZFbGVtZW50XCJcclxuICAgID5cclxuICAgICAgICA8aW1nIFtzcmNdPVwiTmF2VXRpbGl0aWVzLmFzSW1hZ2VXaXRoRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLnVybFwiPlxyXG4gICAgPC9hPlxyXG4gICAgPCEtLSBCdXR0b24gLS0+XHJcbiAgICA8YnV0dG9uICpuZ1N3aXRjaENhc2U9XCInYnV0dG9uJ1wiXHJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAoY2xpY2spPVwiTmF2VXRpbGl0aWVzLmFzQnV0dG9uKGVsZW1lbnQpLmFjdGlvbigpXCJcclxuICAgICAgICBbY2xhc3Muc2lkZW5hdkVsZW1lbnRCdXR0b25dPVwic2lkZW5hdkVsZW1lbnRcIlxyXG4gICAgPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiTmF2VXRpbGl0aWVzLmFzQnV0dG9uKGVsZW1lbnQpLmljb25cIiBbY2xhc3NdPVwiTmF2VXRpbGl0aWVzLmFzQnV0dG9uKGVsZW1lbnQpLmljb25cIj48L2k+XHJcbiAgICAgICAge3tOYXZVdGlsaXRpZXMuYXNCdXR0b24oZWxlbWVudCkubmFtZX19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDwhLS0gSW50ZXJuYWwgTGluayAtLT5cclxuICAgIDxhIG1hdC1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIidpbnRlcm5hbExpbmsnXCJcclxuICAgICAgICBbcm91dGVyTGlua109XCJcclxuICAgICAgICAgICAgTmF2VXRpbGl0aWVzLmFzQW5ndWxhclJvdXRlKE5hdlV0aWxpdGllcy5hc0ludGVybmFsTGluayhlbGVtZW50KS5yb3V0ZSkucGF0aCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gTmF2VXRpbGl0aWVzLmFzQW5ndWxhclJvdXRlKE5hdlV0aWxpdGllcy5hc0ludGVybmFsTGluayhlbGVtZW50KS5yb3V0ZSkucGF0aFxyXG4gICAgICAgICAgICA6IE5hdlV0aWxpdGllcy5hc1N0cmluZ1JvdXRlKE5hdlV0aWxpdGllcy5hc0ludGVybmFsTGluayhlbGVtZW50KS5yb3V0ZSlcIlxyXG4gICAgICAgIFt0YXJnZXRdPVwiTmF2VXRpbGl0aWVzLmFzSW50ZXJuYWxMaW5rKGVsZW1lbnQpLm9wZW5Jbk5ld1RhYiA/ICdfYmxhbmsnIDogJ19zZWxmJ1wiXHJcbiAgICAgICAgW3JlbF09XCJOYXZVdGlsaXRpZXMuYXNJbnRlcm5hbExpbmsoZWxlbWVudCkub3BlbkluTmV3VGFiID8gJ25vcmVmZXJyZXIgbm9vcGVuZXInIDogdW5kZWZpbmVkXCJcclxuICAgICAgICBbY2xhc3Muc2lkZW5hdkVsZW1lbnRdPVwic2lkZW5hdkVsZW1lbnRcIlxyXG4gICAgPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiTmF2VXRpbGl0aWVzLmFzSW50ZXJuYWxMaW5rKGVsZW1lbnQpLmljb25cIiBbY2xhc3NdPVwiTmF2VXRpbGl0aWVzLmFzSW50ZXJuYWxMaW5rKGVsZW1lbnQpLmljb25cIj48L2k+IFxyXG4gICAgICAgIHt7TmF2VXRpbGl0aWVzLmFzSW50ZXJuYWxMaW5rKGVsZW1lbnQpLm5hbWV9fVxyXG4gICAgPC9hPlxyXG4gICAgPCEtLSBFeHRlcm5hbCBMaW5rIC0tPlxyXG4gICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidleHRlcm5hbExpbmsnXCI+XHJcbiAgICAgICAgPGEgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICBbaHJlZl09XCJOYXZVdGlsaXRpZXMuYXNFeHRlcm5hbExpbmsoZWxlbWVudCkudXJsXCJcclxuICAgICAgICAgICAgW3RhcmdldF09XCJOYXZVdGlsaXRpZXMuYXNFeHRlcm5hbExpbmsoZWxlbWVudCkub3BlbkluTmV3VGFiID8gJ19ibGFuaycgOiAnX3NlbGYnXCJcclxuICAgICAgICAgICAgW3JlbF09XCJOYXZVdGlsaXRpZXMuYXNFeHRlcm5hbExpbmsoZWxlbWVudCkub3BlbkluTmV3VGFiID8gJ25vcmVmZXJyZXIgbm9vcGVuZXInIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNpZGVuYXZFbGVtZW50XT1cInNpZGVuYXZFbGVtZW50XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpICpuZ0lmPVwiTmF2VXRpbGl0aWVzLmFzRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLmljb25cIiBbY2xhc3NdPVwiTmF2VXRpbGl0aWVzLmFzRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLmljb25cIj48L2k+XHJcbiAgICAgICAgICAgIHt7TmF2VXRpbGl0aWVzLmFzRXh0ZXJuYWxMaW5rKGVsZW1lbnQpLm5hbWV9fVxyXG4gICAgICAgIDwvYT5cclxuICAgIDwvc3Bhbj5cclxuICAgIDwhLS0gTWVudSAtLT5cclxuICAgIDxidXR0b24gI21lbnVCdXR0b24gKm5nU3dpdGNoQ2FzZT1cIidtZW51J1wiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnUubWVudVwiIFtjbGFzcy5zaWRlbmF2RWxlbWVudF09XCJzaWRlbmF2RWxlbWVudFwiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiTmF2VXRpbGl0aWVzLmFzTWVudShlbGVtZW50KS5pY29uXCIgW2NsYXNzXT1cIk5hdlV0aWxpdGllcy5hc01lbnUoZWxlbWVudCkuaWNvblwiPjwvaT5cclxuICAgICAgICB7e05hdlV0aWxpdGllcy5hc01lbnUoZWxlbWVudCkubmFtZX19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxuZ3gtbWF0LW5hdmlnYXRpb24tbWVudSAjbWVudVxyXG4gICAgICAgIFtuYXZNZW51XT1cIk5hdlV0aWxpdGllcy5hc01lbnUoZWxlbWVudClcIlxyXG4gICAgICAgIFtzaWRlbmF2XT1cInNpZGVuYXZcIlxyXG4gICAgICAgIFttZW51V2lkdGhdPVwibWVudVdpZHRoXCI+XHJcbiAgICA8L25neC1tYXQtbmF2aWdhdGlvbi1tZW51PlxyXG4gICAgXHJcbjwvc3Bhbj4iXX0=