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,198 @@
1
+ /**
2
+ * Contains HelperMethods around handling Navigation.
3
+ */
4
+ export class NavUtilities {
5
+ // eslint-disable-next-line jsdoc/require-jsdoc
6
+ static asTitle(element) {
7
+ return element;
8
+ }
9
+ // eslint-disable-next-line jsdoc/require-jsdoc
10
+ static asAngularRoute(route) {
11
+ return route;
12
+ }
13
+ // eslint-disable-next-line jsdoc/require-jsdoc
14
+ static asStringRoute(route) {
15
+ return route;
16
+ }
17
+ // eslint-disable-next-line jsdoc/require-jsdoc
18
+ static asInternalLink(element) {
19
+ return element;
20
+ }
21
+ // eslint-disable-next-line jsdoc/require-jsdoc
22
+ static asExternalLink(element) {
23
+ return element;
24
+ }
25
+ // eslint-disable-next-line jsdoc/require-jsdoc
26
+ static asMenu(element) {
27
+ return element;
28
+ }
29
+ // eslint-disable-next-line jsdoc/require-jsdoc
30
+ static asButton(element) {
31
+ return element;
32
+ }
33
+ // eslint-disable-next-line jsdoc/require-jsdoc
34
+ static asImage(element) {
35
+ return element;
36
+ }
37
+ // eslint-disable-next-line jsdoc/require-jsdoc
38
+ static asImageWithInternalLink(element) {
39
+ return element;
40
+ }
41
+ // eslint-disable-next-line jsdoc/require-jsdoc
42
+ static asImageWithExternalLink(element) {
43
+ return element;
44
+ }
45
+ // eslint-disable-next-line jsdoc/require-jsdoc
46
+ static asTitleWithInternalLink(element) {
47
+ return element;
48
+ }
49
+ // eslint-disable-next-line jsdoc/require-jsdoc
50
+ static asTitleWithExternalLink(element) {
51
+ return element;
52
+ }
53
+ /**
54
+ * Checks if the provided element is a NavInternalLink.
55
+ *
56
+ * @param element - The element to check.
57
+ * @returns Whether or not the given element is a NavInternalLink.
58
+ */
59
+ static isInternalLink(element) {
60
+ if (element.route) {
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ /**
66
+ * Checks if the provided element is a NavMenu.
67
+ *
68
+ * @param element - The element to check.
69
+ * @returns Whether or not the given element is a NavMenu.
70
+ */
71
+ static isMenu(element) {
72
+ if (element.elements) {
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+ /**
78
+ * Checks if the provided value is an angular route.
79
+ *
80
+ * @param route - The value to check.
81
+ * @returns Whether or not the given value is an angular route.
82
+ */
83
+ static isAngularRoute(route) {
84
+ if (route.path) {
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ /**
90
+ * Checks if the provided element is a NavElement.
91
+ *
92
+ * @param value - The element to check.
93
+ * @returns Whether or not the given element is a NavElement.
94
+ */
95
+ static isNavElement(value) {
96
+ if (value.type) {
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ /**
102
+ * Gets the angular routes.
103
+ * Extracts them from the navbarRows and adds any additional routes provided in additionalRoutes.
104
+ *
105
+ * @param navbarRows - The NavbarRows used as a configuration for the navbar element.
106
+ * @param additionalRoutes - Any additional routes that aren't included in the NavbarRows.
107
+ * @returns All found angular routes.
108
+ */
109
+ static getAngularRoutes(navbarRows = [], additionalRoutes = []) {
110
+ let allRoutes = [];
111
+ allRoutes = allRoutes.concat(NavUtilities.getRoutesFromNavbar(navbarRows));
112
+ allRoutes = allRoutes.concat(additionalRoutes);
113
+ // Filters to only contain unique paths
114
+ const uniquePaths = [];
115
+ const res = [];
116
+ for (const route of allRoutes) {
117
+ if (!uniquePaths.find(r => r === route.path)) {
118
+ res.push(route);
119
+ }
120
+ }
121
+ return res;
122
+ }
123
+ static getRoutesFromNavbar(navbarRows) {
124
+ let res = [];
125
+ for (const row of navbarRows) {
126
+ res = res.concat(NavUtilities.getRoutesFromElements(row.elements));
127
+ }
128
+ ;
129
+ return res;
130
+ }
131
+ static getRoutesFromElements(elements) {
132
+ let res = [];
133
+ const internalLinks = elements.filter(e => NavUtilities.isInternalLink(e));
134
+ const angularRoutes = internalLinks.filter(l => NavUtilities.isAngularRoute(l.route)).map(l => l.route);
135
+ res = res.concat(angularRoutes);
136
+ const menus = elements.filter(e => NavUtilities.isMenu(e));
137
+ for (const menu of menus) {
138
+ res = res.concat(NavUtilities.getRoutesFromElements(menu.elements));
139
+ }
140
+ return res;
141
+ }
142
+ /**
143
+ * Get all elements at the provided position with the provided screenWidth from the given elements.
144
+ *
145
+ * @param position - The position for which to get the elements.
146
+ * @param screenWidth - The current screen width. Is needed to hide elements that are already collapsed into the sidenav.
147
+ * @param rows - The rows to get the elements from.
148
+ * @returns All Elements for the provided input.
149
+ */
150
+ static getNavbarElements(position, screenWidth, rows) {
151
+ if (!rows || !rows.length) {
152
+ return [];
153
+ }
154
+ let res = [];
155
+ for (const row of rows) {
156
+ res = res.concat(row.elements);
157
+ }
158
+ if (position === 'left') {
159
+ res = res.filter(e => !e.position || e.position === position);
160
+ }
161
+ else {
162
+ res = res.filter(e => e.position === position);
163
+ }
164
+ switch (screenWidth) {
165
+ case 'lg':
166
+ return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg');
167
+ case 'md':
168
+ return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg' && e.collapse !== 'md');
169
+ case 'sm':
170
+ return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg' && e.collapse !== 'md' && e.collapse !== 'sm');
171
+ }
172
+ }
173
+ /**
174
+ * Gets all the elements to display in the sidenav.
175
+ *
176
+ * @param screenWidth - The current screen width.
177
+ * @param rows - The rows to get the elements from.
178
+ * @returns The NavElements to display in the sidenav.
179
+ */
180
+ static getSidenavElements(screenWidth, rows) {
181
+ if (!rows || !rows.length) {
182
+ return [];
183
+ }
184
+ let res = [];
185
+ for (const row of rows) {
186
+ res = res.concat(row.elements);
187
+ }
188
+ switch (screenWidth) {
189
+ case 'lg':
190
+ return res.filter(e => e.collapse === 'always' || e.collapse === 'lg');
191
+ case 'md':
192
+ return res.filter(e => e.collapse === 'always' || e.collapse === 'lg' || e.collapse === 'md');
193
+ case 'sm':
194
+ return res.filter(e => e.collapse === 'always' || e.collapse === 'lg' || e.collapse === 'md' || e.collapse === 'sm');
195
+ }
196
+ }
197
+ }
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1uYXZpZ2F0aW9uL3NyYy91dGlsaXRpZXMvbmF2LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsWUFBWTtJQUU5QiwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQjtRQUM5QixPQUFPLE9BQW1CLENBQUM7SUFDL0IsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQXFCO1FBQ3ZDLE9BQU8sS0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFxQjtRQUN0QyxPQUFPLEtBQWUsQ0FBQztJQUMzQixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBb0M7UUFDdEQsT0FBTyxPQUEwQixDQUFDO0lBQ3RDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFvQztRQUN0RCxPQUFPLE9BQTBCLENBQUM7SUFDdEMsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQW9DO1FBQzlDLE9BQU8sT0FBa0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBbUI7UUFDL0IsT0FBTyxPQUFvQixDQUFDO0lBQ2hDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQjtRQUM5QixPQUFPLE9BQW1CLENBQUM7SUFDL0IsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBbUI7UUFDOUMsT0FBTyxPQUFtQyxDQUFDO0lBQy9DLENBQUM7SUFFRCwr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LFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzNFLEtBQUssSUFBSTtnQkFDTCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ2xHLEtBQUssSUFBSTtnQkFDTCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQzVIO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5hdkJ1dHRvbiB9IGZyb20gJy4uL21vZGVscy9uYXYtYnV0dG9uLm1vZGVsJztcclxuaW1wb3J0IHsgTmF2TWVudSwgTmF2TWVudUVsZW1lbnQgfSBmcm9tICcuLi9tb2RlbHMvbmF2LW1lbnUubW9kZWwnO1xyXG5pbXBvcnQgeyBOYXZJbWFnZSwgTmF2SW1hZ2VXaXRoRXh0ZXJuYWxMaW5rLCBOYXZJbWFnZVdpdGhJbnRlcm5hbExpbmsgfSBmcm9tICcuLi9tb2RlbHMvbmF2LWltYWdlLm1vZGVsJztcclxuaW1wb3J0IHsgTmF2VGl0bGUsIE5hdlRpdGxlV2l0aEV4dGVybmFsTGluaywgTmF2VGl0bGVXaXRoSW50ZXJuYWxMaW5rIH0gZnJvbSAnLi4vbW9kZWxzL25hdi10aXRsZS5tb2RlbCc7XHJcbmltcG9ydCB7IE5hdkVsZW1lbnQgfSBmcm9tICcuLi9tb2RlbHMvbmF2Lm1vZGVsJztcclxuaW1wb3J0IHsgTmF2RXh0ZXJuYWxMaW5rLCBOYXZJbnRlcm5hbExpbmsgfSBmcm9tICcuLi9tb2RlbHMvbmF2LWxpbmsubW9kZWwnO1xyXG5pbXBvcnQgeyBOYXZiYXJSb3cgfSBmcm9tICcuLi9tb2RlbHMvbmF2YmFyLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBOYXZpZ2F0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5hdlV0aWxpdGllcyB7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlKGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBOYXZUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2VGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0FuZ3VsYXJSb3V0ZShyb3V0ZTogUm91dGUgfCBzdHJpbmcpOiBSb3V0ZSB7XHJcbiAgICAgICAgcmV0dXJuIHJvdXRlIGFzIFJvdXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXHJcbiAgICBzdGF0aWMgYXNTdHJpbmdSb3V0ZShyb3V0ZTogUm91dGUgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiByb3V0ZSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50IHwgTmF2TWVudUVsZW1lbnQpOiBOYXZJbnRlcm5hbExpbmsge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIE5hdkludGVybmFsTGluaztcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xyXG4gICAgc3RhdGljIGFzRXh0ZXJuYWxMaW5rKGVsZW1lbnQ6IE5hdkVsZW1lbnQgfCBOYXZNZW51RWxlbWVudCk6IE5hdkV4dGVybmFsTGluayB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2RXh0ZXJuYWxMaW5rO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXHJcbiAgICBzdGF0aWMgYXNNZW51KGVsZW1lbnQ6IE5hdkVsZW1lbnQgfCBOYXZNZW51RWxlbWVudCk6IE5hdk1lbnUge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIE5hdk1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0J1dHRvbihlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2QnV0dG9uIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZCdXR0b247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlKGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBOYXZJbWFnZSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2SW1hZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlV2l0aEludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2SW1hZ2VXaXRoSW50ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZJbWFnZVdpdGhJbnRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlV2l0aEV4dGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2SW1hZ2VXaXRoRXh0ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZJbWFnZVdpdGhFeHRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlV2l0aEludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2VGl0bGVXaXRoSW50ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZUaXRsZVdpdGhJbnRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlV2l0aEV4dGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2VGl0bGVXaXRoRXh0ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZUaXRsZVdpdGhFeHRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBOYXZJbnRlcm5hbExpbmsuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBlbGVtZW50IGlzIGEgTmF2SW50ZXJuYWxMaW5rLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNJbnRlcm5hbExpbmsoZWxlbWVudDogTmF2RWxlbWVudCk6IGVsZW1lbnQgaXMgTmF2SW50ZXJuYWxMaW5rIHtcclxuICAgICAgICBpZiAoKGVsZW1lbnQgYXMgTmF2SW50ZXJuYWxMaW5rKS5yb3V0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIGEgTmF2TWVudS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxyXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGdpdmVuIGVsZW1lbnQgaXMgYSBOYXZNZW51LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNNZW51KGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBlbGVtZW50IGlzIE5hdk1lbnUge1xyXG4gICAgICAgIGlmICgoZWxlbWVudCBhcyBOYXZNZW51KS5lbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBhbiBhbmd1bGFyIHJvdXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByb3V0ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBhbmd1bGFyIHJvdXRlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNBbmd1bGFyUm91dGUocm91dGU6IFJvdXRlIHwgc3RyaW5nKTogcm91dGUgaXMgUm91dGUge1xyXG4gICAgICAgIGlmICgocm91dGUgYXMgUm91dGUpLnBhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyBhIE5hdkVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGVsZW1lbnQgdG8gY2hlY2suXHJcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIE5hdkVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpc05hdkVsZW1lbnQodmFsdWU6IE5hdkVsZW1lbnQgfCBOYXZiYXJSb3cpOiB2YWx1ZSBpcyBOYXZFbGVtZW50IHtcclxuICAgICAgICBpZiAoKHZhbHVlIGFzIE5hdkVsZW1lbnQpLnR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFuZ3VsYXIgcm91dGVzLlxyXG4gICAgICogRXh0cmFjdHMgdGhlbSBmcm9tIHRoZSBuYXZiYXJSb3dzIGFuZCBhZGRzIGFueSBhZGRpdGlvbmFsIHJvdXRlcyBwcm92aWRlZCBpbiBhZGRpdGlvbmFsUm91dGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYXZiYXJSb3dzIC0gVGhlIE5hdmJhclJvd3MgdXNlZCBhcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBuYXZiYXIgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsUm91dGVzIC0gQW55IGFkZGl0aW9uYWwgcm91dGVzIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBOYXZiYXJSb3dzLlxyXG4gICAgICogQHJldHVybnMgQWxsIGZvdW5kIGFuZ3VsYXIgcm91dGVzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0QW5ndWxhclJvdXRlcyhuYXZiYXJSb3dzOiBOYXZiYXJSb3dbXSA9IFtdLCBhZGRpdGlvbmFsUm91dGVzOiBSb3V0ZXMgPSBbXSk6IFJvdXRlcyB7XHJcbiAgICAgICAgbGV0IGFsbFJvdXRlczogUm91dGVzID0gW107XHJcbiAgICAgICAgYWxsUm91dGVzID0gYWxsUm91dGVzLmNvbmNhdChOYXZVdGlsaXRpZXMuZ2V0Um91dGVzRnJvbU5hdmJhcihuYXZiYXJSb3dzKSk7XHJcbiAgICAgICAgYWxsUm91dGVzID0gYWxsUm91dGVzLmNvbmNhdChhZGRpdGlvbmFsUm91dGVzKTtcclxuICAgICAgICAvLyBGaWx0ZXJzIHRvIG9ubHkgY29udGFpbiB1bmlxdWUgcGF0aHNcclxuICAgICAgICBjb25zdCB1bmlxdWVQYXRoczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBjb25zdCByZXM6IFJvdXRlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgYWxsUm91dGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghdW5pcXVlUGF0aHMuZmluZChyID0+IHIgPT09IHJvdXRlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChyb3V0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSb3V0ZXNGcm9tTmF2YmFyKG5hdmJhclJvd3M6IE5hdmJhclJvd1tdKTogUm91dGVzIHtcclxuICAgICAgICBsZXQgcmVzOiBSb3V0ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBuYXZiYXJSb3dzKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoTmF2VXRpbGl0aWVzLmdldFJvdXRlc0Zyb21FbGVtZW50cyhyb3cuZWxlbWVudHMpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Um91dGVzRnJvbUVsZW1lbnRzKGVsZW1lbnRzOiBOYXZFbGVtZW50W10pOiBSb3V0ZXMge1xyXG4gICAgICAgIGxldCByZXM6IFJvdXRlcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsTGlua3M6IE5hdkludGVybmFsTGlua1tdID0gZWxlbWVudHMuZmlsdGVyKGUgPT4gTmF2VXRpbGl0aWVzLmlzSW50ZXJuYWxMaW5rKGUpKSBhcyBOYXZJbnRlcm5hbExpbmtbXTtcclxuICAgICAgICBjb25zdCBhbmd1bGFyUm91dGVzOiBSb3V0ZXMgPSBpbnRlcm5hbExpbmtzLmZpbHRlcihsID0+IE5hdlV0aWxpdGllcy5pc0FuZ3VsYXJSb3V0ZShsLnJvdXRlKSkubWFwKGwgPT4gbC5yb3V0ZSkgYXMgUm91dGVzO1xyXG4gICAgICAgIHJlcyA9IHJlcy5jb25jYXQoYW5ndWxhclJvdXRlcyk7XHJcbiAgICAgICAgY29uc3QgbWVudXM6IE5hdk1lbnVbXSA9IGVsZW1lbnRzLmZpbHRlcihlID0+IE5hdlV0aWxpdGllcy5pc01lbnUoZSkpIGFzIE5hdk1lbnVbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1lbnUgb2YgbWVudXMpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChOYXZVdGlsaXRpZXMuZ2V0Um91dGVzRnJvbUVsZW1lbnRzKG1lbnUuZWxlbWVudHMgYXMgTmF2RWxlbWVudFtdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYWxsIGVsZW1lbnRzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBzY3JlZW5XaWR0aCBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gZm9yIHdoaWNoIHRvIGdldCB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiBAcGFyYW0gc2NyZWVuV2lkdGggLSBUaGUgY3VycmVudCBzY3JlZW4gd2lkdGguIElzIG5lZWRlZCB0byBoaWRlIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgY29sbGFwc2VkIGludG8gdGhlIHNpZGVuYXYuXHJcbiAgICAgKiBAcGFyYW0gcm93cyAtIFRoZSByb3dzIHRvIGdldCB0aGUgZWxlbWVudHMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIEFsbCBFbGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0TmF2YmFyRWxlbWVudHMoXHJcbiAgICAgICAgcG9zaXRpb246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JyxcclxuICAgICAgICBzY3JlZW5XaWR0aDogJ2xnJyB8ICdtZCcgfCAnc20nLFxyXG4gICAgICAgIHJvd3M/OiBOYXZiYXJSb3dbXVxyXG4gICAgKTogTmF2RWxlbWVudFtdIHtcclxuICAgICAgICBpZiAoIXJvd3MgfHwgIXJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlczogTmF2RWxlbWVudFtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cyApIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChyb3cuZWxlbWVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmZpbHRlcihlID0+ICFlLnBvc2l0aW9uIHx8IGUucG9zaXRpb24gPT09IHBvc2l0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIoZSA9PiBlLnBvc2l0aW9uID09PSBwb3NpdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgY2FzZSAnbGcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlICE9PSAnYWx3YXlzJyAmJiBlLmNvbGxhcHNlICE9PSAnbGcnKTtcclxuICAgICAgICAgICAgY2FzZSAnbWQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlICE9PSAnYWx3YXlzJyAmJiBlLmNvbGxhcHNlICE9PSAnbGcnICYmIGUuY29sbGFwc2UgIT09ICdtZCcpO1xyXG4gICAgICAgICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmZpbHRlcihlID0+IGUuY29sbGFwc2UgIT09ICdhbHdheXMnICYmIGUuY29sbGFwc2UgIT09ICdsZycgJiYgZS5jb2xsYXBzZSAhPT0gJ21kJyAmJiBlLmNvbGxhcHNlICE9PSAnc20nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgc2lkZW5hdi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2NyZWVuV2lkdGggLSBUaGUgY3VycmVudCBzY3JlZW4gd2lkdGguXHJcbiAgICAgKiBAcGFyYW0gcm93cyAtIFRoZSByb3dzIHRvIGdldCB0aGUgZWxlbWVudHMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBOYXZFbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSBzaWRlbmF2LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0U2lkZW5hdkVsZW1lbnRzKHNjcmVlbldpZHRoOiAnbGcnIHwgJ21kJyB8ICdzbScsIHJvd3M/OiBOYXZiYXJSb3dbXSk6IE5hdkVsZW1lbnRbXSB7XHJcbiAgICAgICAgaWYgKCFyb3dzIHx8ICFyb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXM6IE5hdkVsZW1lbnRbXSA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChyb3cuZWxlbWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZmlsdGVyKGUgPT4gZS5jb2xsYXBzZSA9PT0gJ2Fsd2F5cycgfHwgZS5jb2xsYXBzZSA9PT0gJ2xnJyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21kJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZmlsdGVyKGUgPT4gZS5jb2xsYXBzZSA9PT0gJ2Fsd2F5cycgfHwgZS5jb2xsYXBzZSA9PT0gJ2xnJyB8fCBlLmNvbGxhcHNlID09PSAnbWQnKTtcclxuICAgICAgICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlID09PSAnYWx3YXlzJyB8fCBlLmNvbGxhcHNlID09PSAnbGcnIHx8IGUuY29sbGFwc2UgPT09ICdtZCcgfHwgZS5jb2xsYXBzZSA9PT0gJ3NtJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19