@fundamental-ngx/core 0.37.0-rc.7 → 0.37.0-rc.8

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 (39) hide show
  1. package/esm2020/breadcrumb/breadcrumb.component.mjs +1 -1
  2. package/esm2020/menu/menu-item/menu-item.component.mjs +43 -7
  3. package/esm2020/menu/menu.component.mjs +28 -32
  4. package/esm2020/menu/services/menu.service.mjs +14 -13
  5. package/esm2020/shellbar/product-menu/product-menu.component.mjs +1 -1
  6. package/esm2020/shellbar/user-menu/shellbar-user-menu.component.mjs +1 -1
  7. package/esm2020/split-button/split-button.component.mjs +6 -6
  8. package/esm2020/tabs/tab-list.component.mjs +1 -1
  9. package/esm2020/tree/tree-child.component.mjs +2 -2
  10. package/fesm2015/fundamental-ngx-core-breadcrumb.mjs +1 -1
  11. package/fesm2015/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  12. package/fesm2015/fundamental-ngx-core-menu.mjs +83 -48
  13. package/fesm2015/fundamental-ngx-core-menu.mjs.map +1 -1
  14. package/fesm2015/fundamental-ngx-core-shellbar.mjs +2 -2
  15. package/fesm2015/fundamental-ngx-core-shellbar.mjs.map +1 -1
  16. package/fesm2015/fundamental-ngx-core-split-button.mjs +5 -5
  17. package/fesm2015/fundamental-ngx-core-split-button.mjs.map +1 -1
  18. package/fesm2015/fundamental-ngx-core-tabs.mjs +1 -1
  19. package/fesm2015/fundamental-ngx-core-tabs.mjs.map +1 -1
  20. package/fesm2015/fundamental-ngx-core-tree.mjs +1 -1
  21. package/fesm2015/fundamental-ngx-core-tree.mjs.map +1 -1
  22. package/fesm2020/fundamental-ngx-core-breadcrumb.mjs +1 -1
  23. package/fesm2020/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  24. package/fesm2020/fundamental-ngx-core-menu.mjs +81 -48
  25. package/fesm2020/fundamental-ngx-core-menu.mjs.map +1 -1
  26. package/fesm2020/fundamental-ngx-core-shellbar.mjs +2 -2
  27. package/fesm2020/fundamental-ngx-core-shellbar.mjs.map +1 -1
  28. package/fesm2020/fundamental-ngx-core-split-button.mjs +5 -5
  29. package/fesm2020/fundamental-ngx-core-split-button.mjs.map +1 -1
  30. package/fesm2020/fundamental-ngx-core-tabs.mjs +1 -1
  31. package/fesm2020/fundamental-ngx-core-tabs.mjs.map +1 -1
  32. package/fesm2020/fundamental-ngx-core-tree.mjs +1 -1
  33. package/fesm2020/fundamental-ngx-core-tree.mjs.map +1 -1
  34. package/fundamental-ngx-core-v0.37.0-rc.8.tgz +0 -0
  35. package/menu/menu-item/menu-item.component.d.ts +27 -7
  36. package/menu/menu.component.d.ts +8 -10
  37. package/menu/services/menu.service.d.ts +3 -3
  38. package/package.json +2 -2
  39. package/fundamental-ngx-core-v0.37.0-rc.7.tgz +0 -0
@@ -117,7 +117,7 @@ export class BreadcrumbComponent {
117
117
  }
118
118
  }
119
119
  BreadcrumbComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i0.ElementRef }, { token: i1.DestroyedService }, { token: i1.RtlService, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
120
- BreadcrumbComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: BreadcrumbComponent, selector: "fd-breadcrumb", inputs: { containerElement: "containerElement", reverse: "reverse", tabIndex: "tabIndex" }, outputs: { visibleItemsCount: "visibleItemsCount", hiddenItemsCount: "hiddenItemsCount" }, host: { attributes: { "role": "tree" }, classAttribute: "fd-breadcrumb" }, providers: [DestroyedService], queries: [{ propertyName: "_contentItems", predicate: BreadcrumbItemComponent }, { propertyName: "breadcrumbItems", predicate: i0.forwardRef(function () { return BreadcrumbItemComponent; }) }], viewQueries: [{ propertyName: "_menuComponent", first: true, predicate: MenuComponent, descendants: true }, { propertyName: "_overflowLayout", first: true, predicate: OverflowLayoutComponent, descendants: true }], ngImport: i0, template: "<fd-overflow-layout\n [reverseHiddenItems]=\"!reverse\"\n showMorePosition=\"left\"\n [enableKeyboardNavigation]=\"false\"\n (visibleItemsCount)=\"_onVisibleItemsCountChange($event)\"\n (hiddenItemsCount)=\"_onHiddenItemsCountChange($event)\"\n>\n <ng-container *ngFor=\"let breadcrumb of _items\">\n <div\n *fdOverflowItemRef=\"breadcrumb; let hidden\"\n fdOverflowLayoutItem\n (hiddenChange)=\"_onHiddenChange($event, breadcrumb)\"\n >\n <ng-template [cdkPortalOutlet]=\"breadcrumb.portal\"></ng-template>\n </div>\n </ng-container>\n <ng-container *fdOverflowExpand=\"let breadcrumbs; items: _items\">\n <fd-menu #menu [closeOnEscapeKey]=\"true\" [focusAutoCapture]=\"true\" [placement]=\"_placement$ | async\">\n <ng-container *ngFor=\"let breadcrumbItem of breadcrumbs\">\n <li\n fd-menu-item\n [disabled]=\"\n breadcrumbItem.item.breadcrumbLink ? breadcrumbItem.item.breadcrumbLink.disabled : false\n \"\n >\n <a\n fd-menu-interactive\n (click)=\"itemClicked(breadcrumbItem.item, $event)\"\n (keydown.enter)=\"itemClicked(breadcrumbItem.item, $event)\"\n (keydown.space)=\"itemClicked(breadcrumbItem.item, $event)\"\n >\n <ng-container *ngIf=\"breadcrumbItem?.item.breadcrumbLink; else portalContent\">\n <ng-container *ngIf=\"breadcrumbItem.item.breadcrumbLink._prefixIconName\">\n <fd-menu-addon\n position=\"before\"\n [glyph]=\"breadcrumbItem.item.breadcrumbLink._prefixIconName\"\n ></fd-menu-addon>\n </ng-container>\n <span fd-menu-title>\n <ng-container [cdkPortalOutlet]=\"breadcrumbItem.item.linkContentPortal\"></ng-container>\n </span>\n <ng-container *ngIf=\"breadcrumbItem.item.breadcrumbLink._postfixIconName\">\n <fd-menu-addon\n [glyph]=\"breadcrumbItem.item.breadcrumbLink._postfixIconName\"\n ></fd-menu-addon>\n </ng-container>\n </ng-container>\n <ng-template #portalContent>\n <span fd-menu-title>\n <ng-container\n [cdkPortalOutlet]=\"breadcrumbItem.item.breadcrumbItemPortal\"\n ></ng-container>\n </span>\n </ng-template>\n </a>\n </li>\n </ng-container>\n </fd-menu>\n <span class=\"fd-breadcrumb__item\" *ngIf=\"breadcrumbs.length > 0\" [fdMenuTrigger]=\"menu\">\n <a\n fd-link\n tabindex=\"0\"\n class=\"fd-breadcrumb__collapsed\"\n (keydown.enter)=\"_keyDownHandle($event)\"\n (keydown.space)=\"_keyDownHandle($event)\"\n >\n \u2026\n <fd-icon glyph=\"slim-arrow-down\"></fd-icon>\n </a>\n </span>\n </ng-container>\n</fd-overflow-layout>\n\n<ng-content></ng-content>\n", styles: ["/*!\n * Fundamental Library Styles v0.25.1-rc.16\n * Copyright (c) 2022 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *//*!\n.fd-breadcrumb\n .fd-breadcrumb__item\n .fd-breadcrump__link\n*/.fd-breadcrumb{-webkit-box-sizing:border-box;-ms-flex-wrap:wrap;align-items:center;border:0;box-sizing:border-box;color:var(--sapTextColor);display:flex;flex-wrap:wrap;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;line-height:var(--sapContent_LineHeight);list-style:none;margin:0;padding:0}.fd-breadcrumb:after,.fd-breadcrumb:before{box-sizing:inherit;font-size:inherit}.fd-breadcrumb__item{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_LabelColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-breadcrumb__item:after,.fd-breadcrumb__item:before{box-sizing:inherit;font-size:inherit}.fd-breadcrumb__item:after{color:var(--sapContent_LabelColor);content:\"/\";margin-left:.25rem;margin-right:.25rem}.fd-breadcrumb__item:last-child:after{content:none}.fd-breadcrumb__item .fd-breadcrumb__popover-body{border:none;border-top-left-radius:.125rem;border-top-right-radius:.125rem}.fd-breadcrumb{display:flex;white-space:nowrap}.fd-breadcrumb .fd-breadcrumb__collapsed{cursor:pointer}.fd-breadcrumb .fd-overflow-layout{justify-content:start}.fd-breadcrumb .fd-breadcrumb__item:last-child:after{content:\"/\"}.fd-breadcrumb .fd-overflow-layout__item--last .fd-breadcrumb__item:after{content:none}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "component", type: i4.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i4.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "directive", type: i4.MenuInteractiveDirective, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i4.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "component", type: i4.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "glyph", "submenuIndicator", "ariaHidden"] }, { kind: "directive", type: i4.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i5.LinkComponent, selector: "[fdLink], [fd-link], [fd-breadcrumb-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "directive", type: i6.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i7.OverflowLayoutComponent, selector: "fd-overflow-layout", inputs: ["maxVisibleItems", "navigationTrigger", "showMorePosition", "reverseHiddenItems", "enableKeyboardNavigation", "moreItemsButtonText"], outputs: ["visibleItemsCount", "hiddenItemsCount"] }, { kind: "directive", type: i7.OverflowItemRefDirective, selector: "[fdOverflowItemRef]", inputs: ["fdOverflowItemRef"] }, { kind: "directive", type: i7.OverflowExpandDirective, selector: "[fdOverflowExpand]", inputs: ["fdOverflowExpandItems"] }, { kind: "directive", type: i7.OverflowLayoutItemDirective, selector: "[fdOverflowLayoutItem]", inputs: ["forceVisibility"], outputs: ["hiddenChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
120
+ BreadcrumbComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: BreadcrumbComponent, selector: "fd-breadcrumb", inputs: { containerElement: "containerElement", reverse: "reverse", tabIndex: "tabIndex" }, outputs: { visibleItemsCount: "visibleItemsCount", hiddenItemsCount: "hiddenItemsCount" }, host: { attributes: { "role": "tree" }, classAttribute: "fd-breadcrumb" }, providers: [DestroyedService], queries: [{ propertyName: "_contentItems", predicate: BreadcrumbItemComponent }, { propertyName: "breadcrumbItems", predicate: i0.forwardRef(function () { return BreadcrumbItemComponent; }) }], viewQueries: [{ propertyName: "_menuComponent", first: true, predicate: MenuComponent, descendants: true }, { propertyName: "_overflowLayout", first: true, predicate: OverflowLayoutComponent, descendants: true }], ngImport: i0, template: "<fd-overflow-layout\n [reverseHiddenItems]=\"!reverse\"\n showMorePosition=\"left\"\n [enableKeyboardNavigation]=\"false\"\n (visibleItemsCount)=\"_onVisibleItemsCountChange($event)\"\n (hiddenItemsCount)=\"_onHiddenItemsCountChange($event)\"\n>\n <ng-container *ngFor=\"let breadcrumb of _items\">\n <div\n *fdOverflowItemRef=\"breadcrumb; let hidden\"\n fdOverflowLayoutItem\n (hiddenChange)=\"_onHiddenChange($event, breadcrumb)\"\n >\n <ng-template [cdkPortalOutlet]=\"breadcrumb.portal\"></ng-template>\n </div>\n </ng-container>\n <ng-container *fdOverflowExpand=\"let breadcrumbs; items: _items\">\n <fd-menu #menu [closeOnEscapeKey]=\"true\" [focusAutoCapture]=\"true\" [placement]=\"_placement$ | async\">\n <ng-container *ngFor=\"let breadcrumbItem of breadcrumbs\">\n <li\n fd-menu-item\n [disabled]=\"\n breadcrumbItem.item.breadcrumbLink ? breadcrumbItem.item.breadcrumbLink.disabled : false\n \"\n >\n <a\n fd-menu-interactive\n (click)=\"itemClicked(breadcrumbItem.item, $event)\"\n (keydown.enter)=\"itemClicked(breadcrumbItem.item, $event)\"\n (keydown.space)=\"itemClicked(breadcrumbItem.item, $event)\"\n >\n <ng-container *ngIf=\"breadcrumbItem?.item.breadcrumbLink; else portalContent\">\n <ng-container *ngIf=\"breadcrumbItem.item.breadcrumbLink._prefixIconName\">\n <fd-menu-addon\n position=\"before\"\n [glyph]=\"breadcrumbItem.item.breadcrumbLink._prefixIconName\"\n ></fd-menu-addon>\n </ng-container>\n <span fd-menu-title>\n <ng-container [cdkPortalOutlet]=\"breadcrumbItem.item.linkContentPortal\"></ng-container>\n </span>\n <ng-container *ngIf=\"breadcrumbItem.item.breadcrumbLink._postfixIconName\">\n <fd-menu-addon\n [glyph]=\"breadcrumbItem.item.breadcrumbLink._postfixIconName\"\n ></fd-menu-addon>\n </ng-container>\n </ng-container>\n <ng-template #portalContent>\n <span fd-menu-title>\n <ng-container\n [cdkPortalOutlet]=\"breadcrumbItem.item.breadcrumbItemPortal\"\n ></ng-container>\n </span>\n </ng-template>\n </a>\n </li>\n </ng-container>\n </fd-menu>\n <span class=\"fd-breadcrumb__item\" *ngIf=\"breadcrumbs.length > 0\" [fdMenuTrigger]=\"menu\">\n <a\n fd-link\n tabindex=\"0\"\n class=\"fd-breadcrumb__collapsed\"\n (keydown.enter)=\"_keyDownHandle($event)\"\n (keydown.space)=\"_keyDownHandle($event)\"\n >\n \u2026\n <fd-icon glyph=\"slim-arrow-down\"></fd-icon>\n </a>\n </span>\n </ng-container>\n</fd-overflow-layout>\n\n<ng-content></ng-content>\n", styles: ["/*!\n * Fundamental Library Styles v0.25.1-rc.16\n * Copyright (c) 2022 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n *//*!\n.fd-breadcrumb\n .fd-breadcrumb__item\n .fd-breadcrump__link\n*/.fd-breadcrumb{-webkit-box-sizing:border-box;-ms-flex-wrap:wrap;align-items:center;border:0;box-sizing:border-box;color:var(--sapTextColor);display:flex;flex-wrap:wrap;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;line-height:var(--sapContent_LineHeight);list-style:none;margin:0;padding:0}.fd-breadcrumb:after,.fd-breadcrumb:before{box-sizing:inherit;font-size:inherit}.fd-breadcrumb__item{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapContent_LabelColor);font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-breadcrumb__item:after,.fd-breadcrumb__item:before{box-sizing:inherit;font-size:inherit}.fd-breadcrumb__item:after{color:var(--sapContent_LabelColor);content:\"/\";margin-left:.25rem;margin-right:.25rem}.fd-breadcrumb__item:last-child:after{content:none}.fd-breadcrumb__item .fd-breadcrumb__popover-body{border:none;border-top-left-radius:.125rem;border-top-right-radius:.125rem}.fd-breadcrumb{display:flex;white-space:nowrap}.fd-breadcrumb .fd-breadcrumb__collapsed{cursor:pointer}.fd-breadcrumb .fd-overflow-layout{justify-content:start}.fd-breadcrumb .fd-breadcrumb__item:last-child:after{content:\"/\"}.fd-breadcrumb .fd-overflow-layout__item--last .fd-breadcrumb__item:after{content:none}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "component", type: i4.MenuComponent, selector: "fd-menu", inputs: ["mobile", "disabled", "focusTrapped", "openOnHoverTime", "mobileConfig", "ariaLabel", "ariaLabelledby", "id"], outputs: ["activePath"] }, { kind: "component", type: i4.MenuItemComponent, selector: "li[fd-menu-item]", inputs: ["disabled", "itemId", "submenu", "parentSubmenu"], outputs: ["onSelect"], exportAs: ["fd-menu-item"] }, { kind: "directive", type: i4.MenuInteractiveDirective, selector: "[fd-menu-interactive]" }, { kind: "directive", type: i4.MenuTitleDirective, selector: "[fd-menu-title]" }, { kind: "component", type: i4.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "glyph", "submenuIndicator", "ariaHidden"] }, { kind: "directive", type: i4.MenuTriggerDirective, selector: "[fdMenuTrigger]", inputs: ["fdMenuTrigger"] }, { kind: "component", type: i5.LinkComponent, selector: "[fdLink], [fd-link], [fd-breadcrumb-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "directive", type: i6.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i7.OverflowLayoutComponent, selector: "fd-overflow-layout", inputs: ["maxVisibleItems", "navigationTrigger", "showMorePosition", "reverseHiddenItems", "enableKeyboardNavigation", "moreItemsButtonText"], outputs: ["visibleItemsCount", "hiddenItemsCount"] }, { kind: "directive", type: i7.OverflowItemRefDirective, selector: "[fdOverflowItemRef]", inputs: ["fdOverflowItemRef"] }, { kind: "directive", type: i7.OverflowExpandDirective, selector: "[fdOverflowExpand]", inputs: ["fdOverflowExpandItems"] }, { kind: "directive", type: i7.OverflowLayoutItemDirective, selector: "[fdOverflowLayoutItem]", inputs: ["forceVisibility"], outputs: ["hiddenChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
121
121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: BreadcrumbComponent, decorators: [{
122
122
  type: Component,
123
123
  args: [{ selector: 'fd-breadcrumb', host: {
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, InjectionToken, Input, Optional, Output, QueryList, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
2
- import { defer, fromEvent, Subscription, timer } from 'rxjs';
2
+ import { defer, fromEvent, Subject, Subscription, timer } from 'rxjs';
3
3
  import { filter, switchMap, takeUntil } from 'rxjs/operators';
4
4
  import { MenuTitleDirective } from '../directives/menu-title.directive';
5
5
  import { MenuInteractiveDirective } from '../directives/menu-interactive.directive';
@@ -30,6 +30,13 @@ export class MenuItemComponent {
30
30
  this._hoverSubscriptions = new Subscription();
31
31
  }
32
32
  /** @hidden */
33
+ ngOnInit() {
34
+ if (this.parentSubmenu) {
35
+ this._submenu = this.parentSubmenu;
36
+ this._submenu._registerItem(this);
37
+ }
38
+ }
39
+ /** @hidden */
33
40
  ngAfterContentInit() {
34
41
  this._setMenuService();
35
42
  this._initialiseItemState();
@@ -48,12 +55,15 @@ export class MenuItemComponent {
48
55
  }
49
56
  /** @hidden */
50
57
  ngOnDestroy() {
58
+ if (this.parentSubmenu) {
59
+ this._submenu?._unregisterItem(this);
60
+ }
51
61
  this._subscriptions.unsubscribe();
52
62
  this._hoverSubscriptions.unsubscribe();
53
63
  }
54
64
  /** Whether menu item has popup (desktop mode) */
55
65
  get hasPopup() {
56
- return !!this.submenu && (!this.menuService?.menu || !this.menuService?.menu.mobile);
66
+ return !!this.submenu && (!this.menuService?.menuComponent || !this.menuService?.menuComponent.mobile);
57
67
  }
58
68
  /** Focuses Menu Item interactive element */
59
69
  focus() {
@@ -86,7 +96,7 @@ export class MenuItemComponent {
86
96
  const hoverSubscriptions = new Subscription();
87
97
  const mouseEnter$ = fromEvent(this.menuInteractive.elementRef.nativeElement, 'mouseenter');
88
98
  const mouseLeave$ = fromEvent(this.menuInteractive.elementRef.nativeElement, 'mouseleave');
89
- const timerFactory$ = defer(() => timer(this.menuService ? this.menuService.menu.openOnHoverTime : 0).pipe(takeUntil(mouseLeave$)));
99
+ const timerFactory$ = defer(() => timer(this.menuService ? this.menuService.menuComponent.openOnHoverTime : 0).pipe(takeUntil(mouseLeave$)));
90
100
  // Set active on hover
91
101
  hoverSubscriptions.add(mouseEnter$
92
102
  .pipe(filter(() => !!this.menuService), switchMap(() => timerFactory$))
@@ -133,7 +143,7 @@ export class MenuItemComponent {
133
143
  }
134
144
  }
135
145
  MenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.MenuService, optional: true }, { token: i0.ChangeDetectorRef }, { token: SUBMENU, optional: true }], target: i0.ɵɵFactoryTarget.Component });
136
- MenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuItemComponent, selector: "li[fd-menu-item]", inputs: { disabled: "disabled", itemId: "itemId", submenu: "submenu" }, outputs: { onSelect: "onSelect" }, host: { attributes: { "attr.role": "menuitem" }, properties: { "class.fd-menu__item": "true" } }, queries: [{ propertyName: "menuItemTitle", first: true, predicate: MenuTitleDirective, descendants: true }, { propertyName: "menuInteractive", first: true, predicate: MenuInteractiveDirective, descendants: true }], exportAs: ["fd-menu-item"], usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n\n<ng-container *ngIf=\"hasPopup && submenu\">\n <ul\n class=\"fd-menu__sublist\"\n role=\"menu\"\n [attr.id]=\"itemId\"\n [attr.aria-hidden]=\"!submenuVisible\"\n [attr.aria-label]=\"submenu.ariaLabel\"\n [attr.aria-labelledby]=\"submenu.ariaLabelledby\"\n >\n <ng-container *ngTemplateOutlet=\"submenu.templateRef\"></ng-container>\n </ul>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
146
+ MenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuItemComponent, selector: "li[fd-menu-item]", inputs: { disabled: "disabled", itemId: "itemId", submenu: "submenu", parentSubmenu: "parentSubmenu" }, outputs: { onSelect: "onSelect" }, host: { attributes: { "attr.role": "menuitem" }, properties: { "class.fd-menu__item": "true" } }, queries: [{ propertyName: "menuItemTitle", first: true, predicate: MenuTitleDirective, descendants: true }, { propertyName: "menuInteractive", first: true, predicate: MenuInteractiveDirective, descendants: true }], exportAs: ["fd-menu-item"], usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n\n<ng-container *ngIf=\"hasPopup && submenu\">\n <ul\n class=\"fd-menu__sublist\"\n role=\"menu\"\n [attr.id]=\"itemId\"\n [attr.aria-hidden]=\"!submenuVisible\"\n [attr.aria-label]=\"submenu.ariaLabel\"\n [attr.aria-labelledby]=\"submenu.ariaLabelledby\"\n >\n <ng-container *ngTemplateOutlet=\"submenu.templateRef\"></ng-container>\n </ul>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
137
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuItemComponent, decorators: [{
138
148
  type: Component,
139
149
  args: [{ selector: 'li[fd-menu-item]', exportAs: 'fd-menu-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
@@ -153,6 +163,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
153
163
  type: Input
154
164
  }], submenu: [{
155
165
  type: Input
166
+ }], parentSubmenu: [{
167
+ type: Input
156
168
  }],
157
169
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
158
170
  onSelect: [{
@@ -165,9 +177,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
165
177
  args: [MenuInteractiveDirective]
166
178
  }] } });
167
179
  export class SubmenuComponent {
180
+ constructor() {
181
+ /** @hidden */
182
+ this._registeredItems = [];
183
+ /** @hidden */
184
+ this._menuItemsChange$ = new Subject();
185
+ }
186
+ /** @hidden */
187
+ get menuItems() {
188
+ return this._projectedItems.length ? this._projectedItems.toArray() : this._registeredItems;
189
+ }
190
+ /** @hidden */
191
+ ngAfterContentInit() {
192
+ this._projectedItems.changes.subscribe(() => this._menuItemsChange$.next());
193
+ }
194
+ /** @hidden method for manually registering item when it's not visible for @ContentChildren */
195
+ _registerItem(item) {
196
+ this._registeredItems.push(item);
197
+ this._menuItemsChange$.next();
198
+ }
199
+ /** @hidden method for manually unregistering item when it's not visible for @ContentChildren */
200
+ _unregisterItem(item) {
201
+ this._registeredItems = this._registeredItems.filter((i) => i !== item);
202
+ this._menuItemsChange$.next();
203
+ }
168
204
  }
169
205
  SubmenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: SubmenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
170
- SubmenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: SubmenuComponent, selector: "fd-submenu", inputs: { ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby" }, providers: [{ provide: SUBMENU, useExisting: SubmenuComponent }], queries: [{ propertyName: "menuItems", predicate: MenuItemComponent }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], exportAs: ["fdSubmenu"], ngImport: i0, template: `
206
+ SubmenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: SubmenuComponent, selector: "fd-submenu", inputs: { ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby" }, providers: [{ provide: SUBMENU, useExisting: SubmenuComponent }], queries: [{ propertyName: "_projectedItems", predicate: MenuItemComponent }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], exportAs: ["fdSubmenu"], ngImport: i0, template: `
171
207
  <ng-template>
172
208
  <ng-content></ng-content>
173
209
  </ng-template>
@@ -193,8 +229,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
193
229
  }], templateRef: [{
194
230
  type: ViewChild,
195
231
  args: [TemplateRef]
196
- }], menuItems: [{
232
+ }], _projectedItems: [{
197
233
  type: ContentChildren,
198
234
  args: [MenuItemComponent]
199
235
  }] } });
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL21lbnUvbWVudS1pdGVtL21lbnUtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9tZW51L21lbnUtaXRlbS9tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBSXBGLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQVVyQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQWMsOEJBQThCLENBQUMsQ0FBQztBQWN2RixNQUFNLE9BQU8saUJBQWlCO0lBbUMxQixjQUFjO0lBQ2QsWUFDVyxVQUFzQixFQUNWLFdBQStCLEVBQzFDLGtCQUFxQyxFQUNSLFFBQTRCO1FBSDFELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDMUMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNSLGFBQVEsR0FBUixRQUFRLENBQW9CO1FBdkNyRSw0Q0FBNEM7UUFFNUMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixtQ0FBbUM7UUFFbkMsV0FBTSxHQUFHLGdCQUFnQixZQUFZLEVBQUUsRUFBRSxDQUFDO1FBTTFDLDhDQUE4QztRQUU5QywrREFBK0Q7UUFDL0QsYUFBUSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBVXhELG1EQUFtRDtRQUNuRCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUV2QixjQUFjO1FBQ04sbUJBQWMsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUxRCxjQUFjO1FBQ04sd0JBQW1CLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7SUFRNUQsQ0FBQztJQUVKLGNBQWM7SUFDZCxrQkFBa0I7UUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGNBQWM7SUFDZCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzRjtJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2QsV0FBVztRQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEtBQUs7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3pEO0lBQ0wsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDMUM7SUFDTCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLFdBQVcsQ0FBQyxVQUFtQixFQUFFLFNBQW1CO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsc0JBQXNCO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUNuQixTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDN0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMxQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsNEVBQTRFO0lBQ3BFLHNCQUFzQjtRQUMxQixNQUFNLGtCQUFrQixHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTVELE1BQU0sV0FBVyxHQUEyQixTQUFTLENBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFDN0MsWUFBWSxDQUNmLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBMkIsU0FBUyxDQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQzdDLFlBQVksQ0FDZixDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQ25HLENBQUM7UUFFRixzQkFBc0I7UUFDdEIsa0JBQWtCLENBQUMsR0FBRyxDQUNsQixXQUFXO2FBQ04sSUFBSSxDQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQ2pDO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxlQUFlO2dCQUNmLElBQUksQ0FBQyxXQUFZLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMzQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNmLGtDQUFrQztnQkFDbEMsSUFBSSxDQUFDLFdBQVksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RDtRQUNMLENBQUMsQ0FBQyxDQUNULENBQUM7UUFFRixPQUFPLGtCQUFrQixDQUFDO0lBQzlCLENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELDBFQUEwRTtJQUNsRSxlQUFlO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUM7UUFDMUUsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxnRUFBZ0U7SUFDeEQsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUM1RDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHVEQUF1RDtJQUMvQyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQ25CLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM3RSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6RixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztRQUNMLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOzs4R0FuTFEsaUJBQWlCLHdIQXdDRixPQUFPO2tHQXhDdEIsaUJBQWlCLGdUQW1CWixrQkFBa0Isa0ZBSWxCLHdCQUF3QixpR0M5RTFDLCtiQWNBOzJGRHlDYSxpQkFBaUI7a0JBWjdCLFNBQVM7K0JBRUksa0JBQWtCLFlBQ2xCLGNBQWMsbUJBRVAsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDRixXQUFXLEVBQUUsVUFBVTt3QkFDdkIsdUJBQXVCLEVBQUUsTUFBTTtxQkFDbEM7OzBCQXdDSSxRQUFROzswQkFFUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLE9BQU87NENBckMvQixRQUFRO3NCQURQLEtBQUs7Z0JBS04sTUFBTTtzQkFETCxLQUFLO2dCQUtOLE9BQU87c0JBRE4sS0FBSzs7UUFLTiwrREFBK0Q7UUFDL0QsUUFBUTtzQkFGUCxNQUFNO2dCQU1QLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxrQkFBa0I7Z0JBS2hDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyx3QkFBd0I7O0FBMksxQyxNQUFNLE9BQU8sZ0JBQWdCOzs2R0FBaEIsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsMkdBSGQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUMsb0RBZ0IvQyxpQkFBaUIsMEVBSHZCLFdBQVcseUVBcEJaOzs7O0tBSVQ7MkZBTVEsZ0JBQWdCO2tCQVo1QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUU7Ozs7S0FJVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLGtCQUFrQixFQUFFLENBQUM7b0JBQ2hFLFFBQVEsRUFBRSxXQUFXO2lCQUN4Qjs4QkFJRyxTQUFTO3NCQURSLEtBQUs7Z0JBS04sY0FBYztzQkFEYixLQUFLO2dCQUlrQixXQUFXO3NCQUFsQyxTQUFTO3VCQUFDLFdBQVc7Z0JBR2MsU0FBUztzQkFBNUMsZUFBZTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRlZmVyLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1lbnVUaXRsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbWVudS10aXRsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGVmYXVsdE1lbnVJdGVtIH0gZnJvbSAnLi4vZGVmYXVsdC1tZW51LWl0ZW0uY2xhc3MnO1xuaW1wb3J0IHsgTWVudUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9tZW51LWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuXG5sZXQgbWVudVVuaXF1ZUlkID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlU3VibWVudSB7XG4gICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgbWVudUl0ZW1zOiBRdWVyeUxpc3Q8YW55PjtcbiAgICBtZW51U2VydmljZTogTWVudVNlcnZpY2U7XG4gICAgYXJpYUxhYmVsOiBOdWxsYWJsZTxzdHJpbmc+O1xuICAgIGFyaWFMYWJlbGxlZGJ5OiBOdWxsYWJsZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgY29uc3QgU1VCTUVOVSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxCYXNlU3VibWVudT4oJ1N1Ym1lbnUgY29tcG9uZW50IGRlcGVuZGVuY3knKTtcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2xpW2ZkLW1lbnUtaXRlbV0nLFxuICAgIGV4cG9ydEFzOiAnZmQtbWVudS1pdGVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ2F0dHIucm9sZSc6ICdtZW51aXRlbScsXG4gICAgICAgICdbY2xhc3MuZmQtbWVudV9faXRlbV0nOiAndHJ1ZSdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIE1lbnVJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgRGVmYXVsdE1lbnVJdGVtLCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIFNldCB0aGUgTWVudSBJdGVtIGFzIGRpc2FibGVkL2VuYWJsZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKiogTWVudSBJdGVtIGlkIGF0dHJpYnV0ZSB2YWx1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXRlbUlkID0gYGZkLW1lbnUtaXRlbS0ke21lbnVVbmlxdWVJZCsrfWA7XG5cbiAgICAvKiogUmVmZXJlbmNlIHRvIHN1Yi1tZW51IGNvbXBvbmVudCAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3VibWVudTogQmFzZVN1Ym1lbnUgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuIFJlZmVyZW5jZSB0byB0aGUgTWVudSBJdGVtIHRpdGxlICovXG4gICAgQENvbnRlbnRDaGlsZChNZW51VGl0bGVEaXJlY3RpdmUpXG4gICAgbWVudUl0ZW1UaXRsZTogTWVudVRpdGxlRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gUmVmZXJlbmNlIHRvIHRoZSBNZW51IEl0ZW0gaW50ZXJhY3RpdmUgZWxlbWVudCAqL1xuICAgIEBDb250ZW50Q2hpbGQoTWVudUludGVyYWN0aXZlRGlyZWN0aXZlKVxuICAgIG1lbnVJbnRlcmFjdGl2ZTogTWVudUludGVyYWN0aXZlRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gV2hldGhlciBzdWItbWVudSBpcyBjdXJyZW50bHkgdmlzaWJsZSovXG4gICAgc3VibWVudVZpc2libGUgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9ob3ZlclN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlIHwgbnVsbCxcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNVQk1FTlUpIHByaXZhdGUgX3N1Ym1lbnU6IEJhc2VTdWJtZW51IHwgbnVsbFxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRNZW51U2VydmljZSgpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXNlSXRlbVN0YXRlKCk7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uTWVudUxpbmtDbGljaygpO1xuICAgICAgICB0aGlzLl9saXN0ZW5Pbk91dGVyRm9jdXMoKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25NZW51TW9kZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snZGlzYWJsZWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SW50ZXJhY3RpdmUuc2V0RGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3N1Ym1lbnUnXSAmJiAhY2hhbmdlc1snc3VibWVudSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5zZXRTdWJtZW51KCEhdGhpcy5zdWJtZW51LCB0aGlzLnN1Ym1lbnUgPyB0aGlzLml0ZW1JZCA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIG1lbnUgaXRlbSBoYXMgcG9wdXAgKGRlc2t0b3AgbW9kZSkgICovXG4gICAgZ2V0IGhhc1BvcHVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnN1Ym1lbnUgJiYgKCF0aGlzLm1lbnVTZXJ2aWNlPy5tZW51IHx8ICF0aGlzLm1lbnVTZXJ2aWNlPy5tZW51Lm1vYmlsZSk7XG4gICAgfVxuXG4gICAgLyoqIEZvY3VzZXMgTWVudSBJdGVtIGludGVyYWN0aXZlIGVsZW1lbnQgKi9cbiAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWVudUludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBDbGlja3MgTWVudSBJdGVtIGludGVyYWN0aXZlIGVsZW1lbnQgKi9cbiAgICBjbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWVudUludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gU2V0cyBtZW51IGl0ZW0gYXMgc2VsZWN0ZWQvdW5zZWxlY3RlZCBiYXNlZCBvbiBpc1NlbGVjdGVkIGZsYWcgKi9cbiAgICBzZXRTZWxlY3RlZChpc1NlbGVjdGVkOiBib29sZWFuLCBmcm9tU3BsaXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudUludGVyYWN0aXZlLnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLnN1Ym1lbnVWaXNpYmxlID0gaXNTZWxlY3RlZCAmJiAhIXRoaXMuc3VibWVudTtcbiAgICAgICAgaWYgKCFmcm9tU3BsaXQpIHtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIENyZWF0ZXMgY2xpY2sgbGlzdGVuZXIgb24gbWVudSBpdGVtIGludGVyYWN0aXZlIGVsZW1lbnQgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Pbk1lbnVMaW5rQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMubWVudUludGVyYWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJykuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51U2VydmljZT8uc2V0QWN0aXZlKHRydWUsIHRoaXMpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQ3JlYXRlcyBob3ZlciBsaXN0ZW5lcnMgZm9yIGFjdGl2YXRpbmcvZGVhY3RpdmF0aW5nIG1lbnUgaXRlbSAqL1xuICAgIHByaXZhdGUgX2xpc3Rlbk9uTWVudUxpbmtIb3ZlcigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICBjb25zdCBob3ZlclN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICBjb25zdCBtb3VzZUVudGVyJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PiA9IGZyb21FdmVudChcbiAgICAgICAgICAgIHRoaXMubWVudUludGVyYWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdtb3VzZWVudGVyJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBtb3VzZUxlYXZlJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PiA9IGZyb21FdmVudChcbiAgICAgICAgICAgIHRoaXMubWVudUludGVyYWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICdtb3VzZWxlYXZlJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRpbWVyRmFjdG9yeSQgPSBkZWZlcigoKSA9PlxuICAgICAgICAgICAgdGltZXIodGhpcy5tZW51U2VydmljZSA/IHRoaXMubWVudVNlcnZpY2UubWVudS5vcGVuT25Ib3ZlclRpbWUgOiAwKS5waXBlKHRha2VVbnRpbChtb3VzZUxlYXZlJCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2V0IGFjdGl2ZSBvbiBob3ZlclxuICAgICAgICBob3ZlclN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgbW91c2VFbnRlciRcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5tZW51U2VydmljZSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aW1lckZhY3RvcnkkKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VibWVudSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBzdWJtZW51XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlIS5zZXRBY3RpdmUodHJ1ZSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN1Ym1lbnUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHNpYmxpbmcgc3VibWVudSBpZiBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVudVNlcnZpY2UhLnNldEluYWN0aXZlU2libGluZ01lbnVJdGVtKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gaG92ZXJTdWJzY3JpcHRpb25zO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEluaXRpYWxpemVzIG1lbnUgbGluayBzdGF0ZSBiYXNlZCBvbiBpdGVtIGluaXRpYWwgc3RhdGUgKi9cbiAgICBwcml2YXRlIF9pbml0aWFsaXNlSXRlbVN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5zZXRTdWJtZW51KCEhdGhpcy5zdWJtZW51LCB0aGlzLml0ZW1JZCk7XG4gICAgICAgIHRoaXMubWVudUludGVyYWN0aXZlLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIENoZWNrcyBmb3IgTWVudSBTZXJ2aWNlIGRlcGVuZGVuY3kgYW5kIHBhc3NlcyBpdCBpZiBmdXJ0aGVyICovXG4gICAgcHJpdmF0ZSBfc2V0TWVudVNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVudVNlcnZpY2UgPSB0aGlzLm1lbnVTZXJ2aWNlIHx8IHRoaXMuX3N1Ym1lbnU/Lm1lbnVTZXJ2aWNlIHx8IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN1Ym1lbnUgJiYgdGhpcy5tZW51U2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5zdWJtZW51Lm1lbnVTZXJ2aWNlID0gdGhpcy5tZW51U2VydmljZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIExpc3RlbiBvbiBtZW51IG1vZGUgYW5kIHNldCBwcm9wZXIgbW9kZSBsaXN0ZW5lcnMgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Pbk1lbnVNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlPy5pc01vYmlsZU1vZGUuc3Vic2NyaWJlKChpc01vYmlsZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faG92ZXJTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBpZiAoIWlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faG92ZXJTdWJzY3JpcHRpb25zID0gdGhpcy5fbGlzdGVuT25NZW51TGlua0hvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFVwZGF0ZXMgZm9jdXNlZCBtZW51IGl0ZW0gb24gb3V0ZXIgZm9jdXMgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Pbk91dGVyRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMubWVudUludGVyYWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW51U2VydmljZSAmJiB0aGlzLm1lbnVTZXJ2aWNlLmZvY3VzZWROb2RlICE9PSB0aGlzLm1lbnVTZXJ2aWNlLm1lbnVNYXAuZ2V0KHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVudVNlcnZpY2Uuc2V0Rm9jdXNlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1zdWJtZW51JyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogU1VCTUVOVSwgdXNlRXhpc3Rpbmc6IFN1Ym1lbnVDb21wb25lbnQgfV0sXG4gICAgZXhwb3J0QXM6ICdmZFN1Ym1lbnUnXG59KVxuZXhwb3J0IGNsYXNzIFN1Ym1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBCYXNlU3VibWVudSB7XG4gICAgLyoqIEFyaWEtbGFiZWwgZm9yIG5hdmlnYXRpb24gKi9cbiAgICBASW5wdXQoKVxuICAgIGFyaWFMYWJlbDogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBBcmlhLUxhYmVsbGVkYnkgZm9yIGVsZW1lbnQgZGVzY3JpYmluZyBuYXZpZ2F0aW9uICovXG4gICAgQElucHV0KClcbiAgICBhcmlhTGFiZWxsZWRieTogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBAaGlkZGVuIFJlZmVyZW5jZSB0byB0ZW1wbGF0ZSB3aXRoIFN1Ym1lbnUgaXRlbXMgICovXG4gICAgQFZpZXdDaGlsZChUZW1wbGF0ZVJlZikgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBSZWZlcmVuY2UgdG8gU3VibWVudSBNZW51SXRlbXMgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZW51SXRlbUNvbXBvbmVudCkgbWVudUl0ZW1zOiBRdWVyeUxpc3Q8TWVudUl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gUmVmZXJlbmNlIHRvIE1lbnVTZXJ2aWNlIHVzZWQgYnkgTWVudUl0ZW1zICovXG4gICAgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlO1xufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiaGFzUG9wdXAgJiYgc3VibWVudVwiPlxuICAgIDx1bFxuICAgICAgICBjbGFzcz1cImZkLW1lbnVfX3N1Ymxpc3RcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIFthdHRyLmlkXT1cIml0ZW1JZFwiXG4gICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzdWJtZW51VmlzaWJsZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic3VibWVudS5hcmlhTGFiZWxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwic3VibWVudS5hcmlhTGFiZWxsZWRieVwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VibWVudS50ZW1wbGF0ZVJlZlwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvdWw+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL21lbnUvbWVudS1pdGVtL21lbnUtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9tZW51L21lbnUtaXRlbS9tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQUlwRixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFhckIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxDQUFjLDhCQUE4QixDQUFDLENBQUM7QUFjdkYsTUFBTSxPQUFPLGlCQUFpQjtJQXVDMUIsY0FBYztJQUNkLFlBQ1csVUFBc0IsRUFDVixXQUErQixFQUMxQyxrQkFBcUMsRUFDUixRQUE0QjtRQUgxRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ1YsZ0JB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LENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7OzZHQTdDUSxnQkFBZ0I7aUdBQWhCLGdCQUFnQiwyR0FIZCxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQywwREFnQi9DLGlCQUFpQiwwRUFIdkIsV0FBVyx5RUFwQlo7Ozs7S0FJVDsyRkFNUSxnQkFBZ0I7a0JBWjVCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFFBQVEsRUFBRTs7OztLQUlUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsa0JBQWtCLEVBQUUsQ0FBQztvQkFDaEUsUUFBUSxFQUFFLFdBQVc7aUJBQ3hCOzhCQUlHLFNBQVM7c0JBRFIsS0FBSztnQkFLTixjQUFjO3NCQURiLEtBQUs7Z0JBSWtCLFdBQVc7c0JBQWxDLFNBQVM7dUJBQUMsV0FBVztnQkFJdEIsZUFBZTtzQkFEZCxlQUFlO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRlZmVyLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1lbnVUaXRsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbWVudS10aXRsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGVmYXVsdE1lbnVJdGVtIH0gZnJvbSAnLi4vZGVmYXVsdC1tZW51LWl0ZW0uY2xhc3MnO1xuaW1wb3J0IHsgTWVudUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9tZW51LWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuXG5sZXQgbWVudVVuaXF1ZUlkID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlU3VibWVudSB7XG4gICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbUNvbXBvbmVudFtdO1xuICAgIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZTtcbiAgICBhcmlhTGFiZWw6IE51bGxhYmxlPHN0cmluZz47XG4gICAgYXJpYUxhYmVsbGVkYnk6IE51bGxhYmxlPHN0cmluZz47XG4gICAgX21lbnVJdGVtc0NoYW5nZSQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgX3JlZ2lzdGVySXRlbShpdGVtOiBNZW51SXRlbUNvbXBvbmVudCk6IHZvaWQ7XG4gICAgX3VucmVnaXN0ZXJJdGVtKGl0ZW06IE1lbnVJdGVtQ29tcG9uZW50KTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IFNVQk1FTlUgPSBuZXcgSW5qZWN0aW9uVG9rZW48QmFzZVN1Ym1lbnU+KCdTdWJtZW51IGNvbXBvbmVudCBkZXBlbmRlbmN5Jyk7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdsaVtmZC1tZW51LWl0ZW1dJyxcbiAgICBleHBvcnRBczogJ2ZkLW1lbnUtaXRlbScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgICdhdHRyLnJvbGUnOiAnbWVudWl0ZW0nLFxuICAgICAgICAnW2NsYXNzLmZkLW1lbnVfX2l0ZW1dJzogJ3RydWUnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIERlZmF1bHRNZW51SXRlbSwgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIFNldCB0aGUgTWVudSBJdGVtIGFzIGRpc2FibGVkL2VuYWJsZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKiogTWVudSBJdGVtIGlkIGF0dHJpYnV0ZSB2YWx1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXRlbUlkID0gYGZkLW1lbnUtaXRlbS0ke21lbnVVbmlxdWVJZCsrfWA7XG5cbiAgICAvKiogUmVmZXJlbmNlIHRvIHN1Yi1tZW51IGNvbXBvbmVudCAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3VibWVudTogQmFzZVN1Ym1lbnUgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgc3VibWVudSBpZiBuZXN0ZWQgbWVudXMgY3JlYXRlZCBkeW5hbWljYWxseSAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGFyZW50U3VibWVudTogQmFzZVN1Ym1lbnUgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuIFJlZmVyZW5jZSB0byB0aGUgTWVudSBJdGVtIHRpdGxlICovXG4gICAgQENvbnRlbnRDaGlsZChNZW51VGl0bGVEaXJlY3RpdmUpXG4gICAgbWVudUl0ZW1UaXRsZTogTWVudVRpdGxlRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gUmVmZXJlbmNlIHRvIHRoZSBNZW51IEl0ZW0gaW50ZXJhY3RpdmUgZWxlbWVudCAqL1xuICAgIEBDb250ZW50Q2hpbGQoTWVudUludGVyYWN0aXZlRGlyZWN0aXZlKVxuICAgIG1lbnVJbnRlcmFjdGl2ZTogTWVudUludGVyYWN0aXZlRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gV2hldGhlciBzdWItbWVudSBpcyBjdXJyZW50bHkgdmlzaWJsZSovXG4gICAgc3VibWVudVZpc2libGUgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9ob3ZlclN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlIHwgbnVsbCxcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNVQk1FTlUpIHByaXZhdGUgX3N1Ym1lbnU6IEJhc2VTdWJtZW51IHwgbnVsbFxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudFN1Ym1lbnUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1Ym1lbnUgPSB0aGlzLnBhcmVudFN1Ym1lbnU7XG4gICAgICAgICAgICB0aGlzLl9zdWJtZW51Ll9yZWdpc3Rlckl0ZW0odGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2V0TWVudVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGlzZUl0ZW1TdGF0ZSgpO1xuICAgICAgICB0aGlzLl9saXN0ZW5Pbk1lbnVMaW5rQ2xpY2soKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25PdXRlckZvY3VzKCk7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uTWVudU1vZGUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10gJiYgIWNoYW5nZXNbJ2Rpc2FibGVkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubWVudUludGVyYWN0aXZlLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzdWJtZW51J10gJiYgIWNoYW5nZXNbJ3N1Ym1lbnUnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SW50ZXJhY3RpdmUuc2V0U3VibWVudSghIXRoaXMuc3VibWVudSwgdGhpcy5zdWJtZW51ID8gdGhpcy5pdGVtSWQgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50U3VibWVudSkge1xuICAgICAgICAgICAgdGhpcy5fc3VibWVudT8uX3VucmVnaXN0ZXJJdGVtKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBtZW51IGl0ZW0gaGFzIHBvcHVwIChkZXNrdG9wIG1vZGUpICAqL1xuICAgIGdldCBoYXNQb3B1cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdWJtZW51ICYmICghdGhpcy5tZW51U2VydmljZT8ubWVudUNvbXBvbmVudCB8fCAhdGhpcy5tZW51U2VydmljZT8ubWVudUNvbXBvbmVudC5tb2JpbGUpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIE1lbnUgSXRlbSBpbnRlcmFjdGl2ZSBlbGVtZW50ICovXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1lbnVJbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SW50ZXJhY3RpdmUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2xpY2tzIE1lbnUgSXRlbSBpbnRlcmFjdGl2ZSBlbGVtZW50ICovXG4gICAgY2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1lbnVJbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SW50ZXJhY3RpdmUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNldHMgbWVudSBpdGVtIGFzIHNlbGVjdGVkL3Vuc2VsZWN0ZWQgYmFzZWQgb24gaXNTZWxlY3RlZCBmbGFnICovXG4gICAgc2V0U2VsZWN0ZWQoaXNTZWxlY3RlZDogYm9vbGVhbiwgZnJvbVNwbGl0PzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKTtcbiAgICAgICAgdGhpcy5zdWJtZW51VmlzaWJsZSA9IGlzU2VsZWN0ZWQgJiYgISF0aGlzLnN1Ym1lbnU7XG4gICAgICAgIGlmICghZnJvbVNwbGl0KSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBDcmVhdGVzIGNsaWNrIGxpc3RlbmVyIG9uIG1lbnUgaXRlbSBpbnRlcmFjdGl2ZSBlbGVtZW50ICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25NZW51TGlua0NsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMubWVudVNlcnZpY2U/LnNldEFjdGl2ZSh0cnVlLCB0aGlzKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIENyZWF0ZXMgaG92ZXIgbGlzdGVuZXJzIGZvciBhY3RpdmF0aW5nL2RlYWN0aXZhdGluZyBtZW51IGl0ZW0gKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Pbk1lbnVMaW5rSG92ZXIoKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgY29uc3QgaG92ZXJTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgbW91c2VFbnRlciQ6IE9ic2VydmFibGU8TW91c2VFdmVudD4gPSBmcm9tRXZlbnQoXG4gICAgICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnbW91c2VlbnRlcidcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbW91c2VMZWF2ZSQ6IE9ic2VydmFibGU8TW91c2VFdmVudD4gPSBmcm9tRXZlbnQoXG4gICAgICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnbW91c2VsZWF2ZSdcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0aW1lckZhY3RvcnkkID0gZGVmZXIoKCkgPT5cbiAgICAgICAgICAgIHRpbWVyKHRoaXMubWVudVNlcnZpY2UgPyB0aGlzLm1lbnVTZXJ2aWNlLm1lbnVDb21wb25lbnQub3Blbk9uSG92ZXJUaW1lIDogMCkucGlwZSh0YWtlVW50aWwobW91c2VMZWF2ZSQpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgb24gaG92ZXJcbiAgICAgICAgaG92ZXJTdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIG1vdXNlRW50ZXIkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMubWVudVNlcnZpY2UpLFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGltZXJGYWN0b3J5JClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1lbnUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gc3VibWVudVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51U2VydmljZSEuc2V0QWN0aXZlKHRydWUsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdWJtZW51KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBzaWJsaW5nIHN1Ym1lbnUgaWYgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlIS5zZXRJbmFjdGl2ZVNpYmxpbmdNZW51SXRlbSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGhvdmVyU3Vic2NyaXB0aW9ucztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBJbml0aWFsaXplcyBtZW51IGxpbmsgc3RhdGUgYmFzZWQgb24gaXRlbSBpbml0aWFsIHN0YXRlICovXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGlzZUl0ZW1TdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW51SW50ZXJhY3RpdmUuc2V0U3VibWVudSghIXRoaXMuc3VibWVudSwgdGhpcy5pdGVtSWQpO1xuICAgICAgICB0aGlzLm1lbnVJbnRlcmFjdGl2ZS5zZXREaXNhYmxlZCh0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBDaGVja3MgZm9yIE1lbnUgU2VydmljZSBkZXBlbmRlbmN5IGFuZCBwYXNzZXMgaXQgaWYgZnVydGhlciAqL1xuICAgIHByaXZhdGUgX3NldE1lbnVTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlID0gdGhpcy5tZW51U2VydmljZSB8fCB0aGlzLl9zdWJtZW51Py5tZW51U2VydmljZSB8fCBudWxsO1xuICAgICAgICBpZiAodGhpcy5zdWJtZW51ICYmIHRoaXMubWVudVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWVudS5tZW51U2VydmljZSA9IHRoaXMubWVudVNlcnZpY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW4gb24gbWVudSBtb2RlIGFuZCBzZXQgcHJvcGVyIG1vZGUgbGlzdGVuZXJzICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25NZW51TW9kZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW51U2VydmljZT8uaXNNb2JpbGVNb2RlLnN1YnNjcmliZSgoaXNNb2JpbGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgaWYgKCFpc01vYmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9ucyA9IHRoaXMuX2xpc3Rlbk9uTWVudUxpbmtIb3ZlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBVcGRhdGVzIGZvY3VzZWQgbWVudSBpdGVtIG9uIG91dGVyIGZvY3VzICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25PdXRlckZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLm1lbnVJbnRlcmFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdmb2N1cycpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWVudVNlcnZpY2UgJiYgdGhpcy5tZW51U2VydmljZS5mb2N1c2VkTm9kZSAhPT0gdGhpcy5tZW51U2VydmljZS5tZW51TWFwLmdldCh0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnVTZXJ2aWNlLnNldEZvY3VzZWQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtc3VibWVudScsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFNVQk1FTlUsIHVzZUV4aXN0aW5nOiBTdWJtZW51Q29tcG9uZW50IH1dLFxuICAgIGV4cG9ydEFzOiAnZmRTdWJtZW51J1xufSlcbmV4cG9ydCBjbGFzcyBTdWJtZW51Q29tcG9uZW50IGltcGxlbWVudHMgQmFzZVN1Ym1lbnUsIEFmdGVyQ29udGVudEluaXQge1xuICAgIC8qKiBBcmlhLWxhYmVsIGZvciBuYXZpZ2F0aW9uICovXG4gICAgQElucHV0KClcbiAgICBhcmlhTGFiZWw6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKiogQXJpYS1MYWJlbGxlZGJ5IGZvciBlbGVtZW50IGRlc2NyaWJpbmcgbmF2aWdhdGlvbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXJpYUxhYmVsbGVkYnk6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKiogQGhpZGRlbiBSZWZlcmVuY2UgdG8gdGVtcGxhdGUgd2l0aCBTdWJtZW51IGl0ZW1zICAqL1xuICAgIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gUmVmZXJlbmNlIHRvIFN1Ym1lbnUgTWVudUl0ZW1zICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTWVudUl0ZW1Db21wb25lbnQpXG4gICAgX3Byb2plY3RlZEl0ZW1zOiBRdWVyeUxpc3Q8TWVudUl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVnaXN0ZXJlZEl0ZW1zOiBNZW51SXRlbUNvbXBvbmVudFtdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiBSZWZlcmVuY2UgdG8gTWVudVNlcnZpY2UgdXNlZCBieSBNZW51SXRlbXMgKi9cbiAgICBtZW51U2VydmljZTogTWVudVNlcnZpY2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9tZW51SXRlbXNDaGFuZ2UkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0IG1lbnVJdGVtcygpOiBNZW51SXRlbUNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RlZEl0ZW1zLmxlbmd0aCA/IHRoaXMuX3Byb2plY3RlZEl0ZW1zLnRvQXJyYXkoKSA6IHRoaXMuX3JlZ2lzdGVyZWRJdGVtcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcHJvamVjdGVkSXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fbWVudUl0ZW1zQ2hhbmdlJC5uZXh0KCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIG1ldGhvZCBmb3IgbWFudWFsbHkgcmVnaXN0ZXJpbmcgaXRlbSB3aGVuIGl0J3Mgbm90IHZpc2libGUgZm9yIEBDb250ZW50Q2hpbGRyZW4gKi9cbiAgICBfcmVnaXN0ZXJJdGVtKGl0ZW06IE1lbnVJdGVtQ29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLl9tZW51SXRlbXNDaGFuZ2UkLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBtZXRob2QgZm9yIG1hbnVhbGx5IHVucmVnaXN0ZXJpbmcgaXRlbSB3aGVuIGl0J3Mgbm90IHZpc2libGUgZm9yIEBDb250ZW50Q2hpbGRyZW4gKi9cbiAgICBfdW5yZWdpc3Rlckl0ZW0oaXRlbTogTWVudUl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEl0ZW1zID0gdGhpcy5fcmVnaXN0ZXJlZEl0ZW1zLmZpbHRlcigoaSkgPT4gaSAhPT0gaXRlbSk7XG4gICAgICAgIHRoaXMuX21lbnVJdGVtc0NoYW5nZSQubmV4dCgpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1BvcHVwICYmIHN1Ym1lbnVcIj5cbiAgICA8dWxcbiAgICAgICAgY2xhc3M9XCJmZC1tZW51X19zdWJsaXN0XCJcbiAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICBbYXR0ci5pZF09XCJpdGVtSWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc3VibWVudVZpc2libGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInN1Ym1lbnUuYXJpYUxhYmVsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInN1Ym1lbnUuYXJpYUxhYmVsbGVkYnlcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1Ym1lbnUudGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3VsPlxuPC9uZy1jb250YWluZXI+XG4iXX0=