@ardium-ui/ui 2.0.1 → 2.0.2

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.
@@ -811,7 +811,7 @@ export class ArdiumSelectComponent extends _NgModelComponentBase {
811
811
  useExisting: forwardRef(() => ArdiumSelectComponent),
812
812
  multi: true,
813
813
  },
814
- ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, isSignal: true }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, isSignal: true }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, isSignal: true }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, isSignal: true }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, isSignal: true }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "dropdownPanel", first: true, predicate: ArdiumDropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i3.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i4.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i5.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i6._ClearButtonComponent, selector: "ard-clear-button" }, { kind: "directive", type: i5.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
814
+ ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, isSignal: true }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, isSignal: true }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, isSignal: true }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, isSignal: true }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, isSignal: true }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, isSignal: true }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, isSignal: true }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, isSignal: true }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, isSignal: true }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "dropdownPanel", first: true, predicate: ArdiumDropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n >\r\n <div class=\"ard-placeholder\">{{ placeholder() }}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\" />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i3.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i4.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i5.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i6._ClearButtonComponent, selector: "ard-clear-button" }, { kind: "directive", type: i5.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
815
815
  }
816
816
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ArdiumSelectComponent, decorators: [{
817
817
  type: Component,
@@ -821,7 +821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
821
821
  useExisting: forwardRef(() => ArdiumSelectComponent),
822
822
  multi: true,
823
823
  },
824
- ], template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n let-plchldr\r\n >\r\n <div class=\"ard-placeholder\">{{ plchldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
824
+ ], template: "<ard-form-field-frame\r\n [appearance]=\"appearance()\"\r\n [variant]=\"variant()\"\r\n [compact]=\"compact()\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate()?.template\"\r\n [suffixTemplate]=\"suffixTemplate()?.template\"\r\n>\r\n <div\r\n class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected()\"\r\n [ngClass]=\"ngClasses()\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n @if (shouldDisplayPlaceholder()) {\r\n <ng-template\r\n #defaultPlaceholderTemplate\r\n >\r\n <div class=\"ard-placeholder\">{{ placeholder() }}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"placeholderTemplate()?.template || defaultPlaceholderTemplate\" />\r\n }\r\n @if (shouldDisplayValue()) {\r\n @for (item of itemStorage.selectedItems(); track item.index()) {\r\n <div\r\n class=\"ard-select-value\"\r\n [class.ard-value-disabled]=\"item.disabled()\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit($index)\"\r\n >\r\n <ng-template\r\n *ngIf=\"isValueWithinDisplayLimit($index)\"\r\n [ngTemplateOutlet]=\"valueTemplate()?.template || (multiselectable() ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #defaultValueTemplate\r\n let-item\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n </ng-template>\r\n <ng-template\r\n #defaultMultiValueTemplate\r\n let-item\r\n let-unselect=\"unselect\"\r\n >\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant()\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div\r\n [ardInnerHTML]=\"item.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></div>\r\n <!-- TODO check if can remove div -->\r\n </ard-deletable-chip>\r\n </ng-template>\r\n }\r\n\r\n @if (itemStorage.isAnyItemSelected() && shouldShowItemDisplayLimit()) {\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate()?.template || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n />\r\n\r\n <ng-template\r\n #defaultItemDisplayLimitTemplate\r\n let-count=\"overflowCount\"\r\n >\r\n <div>{{ count }} more...</div>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-owns]=\"isOpen() ? htmlId() : null\"\r\n >\r\n <input\r\n #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId()\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [readonly]=\"isInputElementReadonly()\"\r\n [disabled]=\"disabled()\"\r\n [value]=\"searchTerm()\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isOpen() ? htmlId() : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur()\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate()?.template || defaultLoadingSpinnerTemplate\" />\r\n }\r\n\r\n @if (shouldShowClearButton()) {\r\n <ard-clear-button\r\n [title]=\"clearButtonTitle()\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n />\r\n }\r\n\r\n <button\r\n class=\"ard-dropdown-arrow-wrapper\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate()?.template ?? null\"\r\n [footerTemplate]=\"dropdownFooterTemplate()?.template ?? null\"\r\n [appearance]=\"dropdownAppearanceOrDefault()\"\r\n [variant]=\"dropdownVariantOrDefault()\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm()\"\r\n [panelId]=\"htmlId()\"\r\n [compact]=\"compact()\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n @if (!shouldShowNoItemsFound()) {\r\n @for (group of itemStorage.groups(); track $index) {\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n [class.ard-group-disabled]=\"group.disabled()\"\r\n [class.ard-group-selected]=\"group.selected()\"\r\n [class.ard-group-highlighted]=\"group.highlighted()\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n @if (group.label() !== '' && group.label() !== undefined) {\r\n <ng-template\r\n #defaultOptgroupTemplate\r\n let-group\r\n >\r\n <span\r\n class=\"ard-optgroup-label\"\r\n [ardInnerHTML]=\"group.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate()?.template || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n />\r\n }\r\n\r\n <div class=\"ard-optgroup-children\">\r\n @for (option of group.children(); track option.index()) {\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n [class.ard-option-disabled]=\"option.disabled()\"\r\n [class.ard-option-selected]=\"option.selected()\"\r\n [class.ard-option-highlighted]=\"option.highlighted()\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently()\"\r\n [attr.aria-selected]=\"option.selected()\"\r\n [attr.id]=\"htmlId() + '-' + option.index()\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template\r\n #defaultOptionTemplate\r\n let-option\r\n >\r\n <span\r\n [ardInnerHTML]=\"option.label()\"\r\n [ardEscapeInnerHTML]=\"isItemsInputUsed\"\r\n ></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate()?.template || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n @if (shouldShowNoItemsFound()) {\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ noItemsFoundText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"noItemsFoundTemplate()?.template || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n\r\n @if (shouldShowAddCustom()) {\r\n <ng-template\r\n #defaultAddCustomTemplate\r\n let-searchTerm\r\n >\r\n <div\r\n class=\"ard-option ard-option-highlighted ard-add-custom\"\r\n (click)=\"addCustomOption(searchTerm)\"\r\n >\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{ searchTerm }}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"addCustomTemplate()?.template || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\"\r\n />\r\n }\r\n\r\n @if (isLoading()) {\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{ loadingPlaceholderText() }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"loadingPlaceholderTemplate()?.template || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\"\r\n />\r\n }\r\n </ard-dropdown-panel>\r\n</ng-template>\r\n", styles: [".ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-select-value{display:block}.ard-select .ard-select-value[hidden=true]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
825
825
  }], propDecorators: { _groupItemsHostAttribute: [{
826
826
  type: HostBinding,
827
827
  args: ['class.ard-group-items']
@@ -848,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
848
848
  type: HostListener,
849
849
  args: ['keydown', ['$event']]
850
850
  }] } });
851
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBT0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFtQixNQUFNLGtEQUFrRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxxQkFBcUIsRUFB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZUFycmF5UHJvcGVydHksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQW55U3RyaW5nLCBpc0FycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgSXRlbVN0b3JhZ2UsIEl0ZW1TdG9yYWdlSG9zdCB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRWYXJpYW50IH0gZnJvbSAnLi8uLi90eXBlcy90aGVtaW5nLnR5cGVzJztcbmltcG9ydCB7XG4gIEFyZEFkZEN1c3RvbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRncm91cFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFNlbGVjdFN1ZmZpeFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLFxufSBmcm9tICcuL3NlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgQWRkQ3VzdG9tRm4sXG4gIEN1c3RvbU9wdGlvbkNvbnRleHQsXG4gIEdyb3VwQ29udGV4dCxcbiAgSXRlbURpc3BsYXlMaW1pdENvbnRleHQsXG4gIEl0ZW1MaW1pdENvbnRleHQsXG4gIFBsYWNlaG9sZGVyQ29udGV4dCxcbiAgU2VhcmNoQ29udGV4dCxcbiAgU3RhdHNDb250ZXh0LFxuICBWYWx1ZUNvbnRleHQsXG59IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJkLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJdGVtU3RvcmFnZUhvc3RcbntcbiAgcmVhZG9ubHkgX2NvbXBvbmVudElkOiBzdHJpbmcgPSAnMDAwJztcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHZhbHVlRnJvbTogJ3ZhbHVlJyxcbiAgICBsYWJlbEZyb206ICdsYWJlbCcsXG4gICAgZGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGdyb3VwTGFiZWxGcm9tOiAnZ3JvdXAnLFxuICAgIGdyb3VwRGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGNoaWxkcmVuRnJvbTogJ2NoaWxkcmVuJyxcbiAgICBzZWFyY2hGbjogc2VhcmNoRnVuY3Rpb25zLmJ5TGFiZWwsXG4gICAgY2xlYXJCdXR0b25UaXRsZTogJ0NsZWFyJyxcbiAgICBub0l0ZW1zRm91bmRUZXh0OiAnTm8gaXRlbXMgZm91bmQuJyxcbiAgICBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0OiAnTG9hZGluZy4uLicsXG4gIH07XG5cbiAgLy8hIHByaXZhdGVzXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSB8IG51bGwgPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNNb3VzZUJlaW5nVXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaEJhckZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8hIHB1YmxpY3NcbiAgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgcmVhZG9ubHkgdmFsdWVGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgbGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZWRGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIHJlYWRvbmx5IGdyb3VwTGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nIHwgR3JvdXBCeUZuPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZ3JvdXBEaXNhYmxlZEZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBjaGlsZHJlbkZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICAvLyEgc2V0dGluZ3NcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCdTZWxlY3QgaXRlbScpO1xuICByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ1NlYXJjaC4uLicpO1xuICByZWFkb25seSBjbGVhckJ1dHRvblRpdGxlID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmNsZWFyQnV0dG9uVGl0bGUpO1xuXG4gIHJlYWRvbmx5IGRyb3Bkb3duUG9zaXRpb24gPSBpbnB1dDxBcmRQYW5lbFBvc2l0aW9uPihBcmRQYW5lbFBvc2l0aW9uLkF1dG8pO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICByZWFkb25seSBub0l0ZW1zRm91bmRUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmxvYWRpbmdQbGFjZWhvbGRlclRleHQpO1xuICAvLyEgc2VhcmNoLXJlbGF0ZWQgb3B0aW9uc1xuICByZWFkb25seSBzZWFyY2hJbnB1dElkID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaW5wdXRBdHRycyA9IGlucHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgLy8hIG90aGVyIGlucHV0c1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGlucHV0UHJvcHMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IGh0bWxJZCA9IGlucHV0PHN0cmluZz4oY3J5cHRvLnJhbmRvbVVVSUQoKSk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcmVhZG9ubHkgaXRlbXNBbHJlYWR5R3JvdXBlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcblxuICAvL3Nob3VsZCB0aGUgdmFsdWUgdGhhdCB0aGUgXCJkaXNhYmxlZEZyb21cIiBwYXRoIGxlYWQgdG8gYmUgaW52ZXJ0ZWQ/XG4gIC8vdXNlZnVsIHdoZW4gdGhlIHByb3BlcnR5IGlzIGUuZy4gXCJhY3RpdmVcIiwgd2hpY2ggaXMgdGhlIG9wb3NpdGUgb2YgXCJkaXNhYmxlZFwiXG4gIHJlYWRvbmx5IGludmVydERpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IG5vR3JvdXBBY3Rpb25zID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBhdXRvSGlnaGxpZ2h0Rmlyc3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGF1dG9Gb2N1cyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkga2VlcE9wZW4gPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGhpZGVTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgbm9CYWNrc3BhY2VDbGVhciA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgc29ydE11bHRpcGxlVmFsdWVzID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcmVhZG9ubHkgbWF4U2VsZWN0ZWRJdGVtcyA9IGlucHV0PG51bWJlciwgYW55PihJbmZpbml0eSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgSW5maW5pdHkpIH0pO1xuICByZWFkb25seSBpdGVtRGlzcGxheUxpbWl0ID0gaW5wdXQ8bnVtYmVyLCBhbnk+KEluZmluaXR5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBJbmZpbml0eSkgfSk7XG5cbiAgLy8hIGZ1bmN0aW9uIGlucHV0c1xuICByZWFkb25seSBzZWFyY2hGbiA9IGlucHV0PFNlYXJjaEZuPih0aGlzLkRFRkFVTFRTLnNlYXJjaEZuKTtcbiAgcmVhZG9ubHkgY29tcGFyZVdpdGggPSBpbnB1dDxOdWxsYWJsZTxTZWFyY2hGbj4+KHVuZGVmaW5lZCk7XG5cbiAgLy8hIGFwcGVhcmFuY2VcbiAgcmVhZG9ubHkgYXBwZWFyYW5jZSA9IGlucHV0PEZvcm1FbGVtZW50QXBwZWFyYW5jZT4oRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKTtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PEZvcm1FbGVtZW50VmFyaWFudD4oRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQpO1xuXG4gIHJlYWRvbmx5IGNvbXBhY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCgpID8gJ2FyZC1jb21wYWN0JyA6ICcnLFxuICAgICAgdGhpcy5tdWx0aXNlbGVjdGFibGUoKSA/ICdhcmQtbXVsdGlzZWxlY3QnIDogJ2FyZC1zaW5nbGVzZWxlY3QnLFxuICAgICAgdGhpcy5jbGVhcmFibGUoKSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlKCkgPyAnYXJkLXNlYXJjaGFibGUnIDogJycsXG4gICAgICB0aGlzLmZpbHRlcmVkKCkgPyAnYXJkLWZpbHRlcmVkJyA6ICcnLFxuICAgICAgdGhpcy50b3VjaGVkKCkgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzT3BlbigpID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICByZWFkb25seSBkcm9wZG93bkFwcGVhcmFuY2UgPSBpbnB1dDxOdWxsYWJsZTxEcm9wZG93blBhbmVsQXBwZWFyYW5jZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQXBwZWFyYW5jZU9yRGVmYXVsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5kcm9wZG93bkFwcGVhcmFuY2UoKSkgcmV0dXJuIHRoaXMuZHJvcGRvd25BcHBlYXJhbmNlKCkhO1xuICAgIGlmICh0aGlzLmFwcGVhcmFuY2UoKSA9PT0gRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKSByZXR1cm4gRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UuT3V0bGluZWQ7XG4gICAgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLlJhaXNlZDtcbiAgfSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVmFyaWFudCA9IGlucHV0PE51bGxhYmxlPERyb3Bkb3duUGFuZWxWYXJpYW50Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZHJvcGRvd25WYXJpYW50T3JEZWZhdWx0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duVmFyaWFudCgpKSByZXR1cm4gdGhpcy5kcm9wZG93blZhcmlhbnQoKSE7XG4gICAgY29uc3QgdmFyaWFudCA9IHRoaXMudmFyaWFudCgpO1xuICAgIGlmICh2YXJpYW50ID09PSBGb3JtRWxlbWVudFZhcmlhbnQuUGlsbCkgcmV0dXJuIERyb3Bkb3duUGFuZWxWYXJpYW50LlJvdW5kZWQ7XG4gICAgcmV0dXJuIHZhcmlhbnQ7XG4gIH0pO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJylcbiAgZ2V0IF9ncm91cEl0ZW1zSG9zdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cExhYmVsRnJvbSgpO1xuICB9XG5cbiAgLy8hIGl0ZW1zIHNldHRlci9nZXR0ZXJcbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBzZXQgaXRlbXModmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCkge1xuICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IHRydWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgdGhpcy5pc0l0ZW1zSW5wdXRVc2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0FueVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHByaW50RXJyb3JzID0gdGhpcy5pdGVtU3RvcmFnZS5zZXRJdGVtcyh2YWx1ZSk7XG4gICAgaWYgKHByaW50RXJyb3JzKSB7XG4gICAgICB0aGlzLl9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihBcmRpdW1PcHRpb25Db21wb25lbnQpXG4gIG9wdGlvbkNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8QXJkaXVtT3B0aW9uQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCkge1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICBtZXJnZSguLi50aGlzLm9wdGlvbkNvbXBvbmVudHMubWFwKG9wdGlvbiA9PiBvcHRpb24uc3RhdGVDaGFuZ2UkKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAgIC5zdWJzY3JpYmUob3B0aW9uID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1TdG9yYWdlLmZpbmRJdGVtQnlWYWx1ZShvcHRpb24ub2xkVmFsdWUgPz8gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQuc2V0KG9wdGlvbi5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgIGl0ZW0ubGFiZWwuc2V0KG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCkpO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlLnNldChvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLnNldCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5vcHRpb25Db21wb25lbnRzKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW1zID0gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGhhbmRsZU9wdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8hIGF0dHJpYnV0ZSBhbmQvb3IgY2xhc3Mgc2V0dGVycy9nZXR0ZXJzXG4gIHJlYWRvbmx5IG11bHRpc2VsZWN0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgY2xlYXJhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5zZWFyY2hhYmxlKCkgJiYgdGhpcy5zZWFyY2hUZXJtKCkgIT09ICcnKTtcblxuICByZWFkb25seSB0b3VjaGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyEgY3VzdG9tIG9wdGlvbnNcbiAgcHJpdmF0ZSBfZGVmYXVsdEFkZEN1c3RvbUZuOiBBZGRDdXN0b21Gbjxhbnk+ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlO1xuXG4gIHJlYWRvbmx5IGFkZEN1c3RvbSA9IGlucHV0PFxuICAgIGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4sXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+XG4gID4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IHYgPT4ge1xuICAgICAgaWYgKGlzRnVuY3Rpb24odikpIHtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9XG4gICAgICAvL2NvZXJjZSB0aGUgdmFsdWUgaW50byBhIGJvb2xlYW5cbiAgICAgIC8vaWYgXCJ0cnVlXCIsIHVzZSB0aGUgZGVmYXVsdCBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0byBcImZhbHNlXCIuXG4gICAgICByZXR1cm4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpICYmIHRoaXMuX2RlZmF1bHRBZGRDdXN0b21GbjtcbiAgICB9LFxuICB9KTtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0FkZEN1c3RvbSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuYWRkQ3VzdG9tKCkgIT09IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNGb3VuZCgpXG4gICk7XG5cbiAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhYyA9IHRoaXMuYWRkQ3VzdG9tKCk7XG4gICAgaWYgKCFhYykgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3T3B0aW9uT2JqID0gYXdhaXQgdGhpcy5pdGVtU3RvcmFnZS5hZGRDdXN0b21PcHRpb24odmFsdWUsIGFjKTtcblxuICAgIHRoaXMuc2VsZWN0SXRlbShuZXdPcHRpb25PYmopO1xuICB9XG5cbiAgLy8hIGNvbnRyb2wgdmFsdWUgYWNjZXNzb3JcbiAgLy9vdmVycmlkZSB0aGUgd3JpdGVWYWx1ZSBhbmQgc2V0RGlzYWJsZWRTdGF0ZSBkZWZpbmVkIGluIF9OZ01vZGVsQ29tcG9uZW50XG4gIG92ZXJyaWRlIHNldERpc2FibGVkU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHN0YXRlO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbCk7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIGNoYW5nZSAmIHRvdWNoIGV2ZW50IGVtaXR0ZXJzXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UudmFsdWUoKTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQuc2V0KHRydWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IFNpZ25hbDxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIHJlYWRvbmx5IGNoYW5nZUV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnY2hhbmdlJyB9KTtcbiAgcmVhZG9ubHkgYWRkRXZlbnQgPSBvdXRwdXQ8YW55W10+KHsgYWxpYXM6ICdhZGQnIH0pO1xuICByZWFkb25seSBmYWlsZWRUb0FkZEV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnZmFpbGVkVG9BZGQnIH0pO1xuICByZWFkb25seSByZW1vdmVFdmVudCA9IG91dHB1dDxhbnlbXT4oeyBhbGlhczogJ3JlbW92ZScgfSk7XG4gIHJlYWRvbmx5IGNsZWFyRXZlbnQgPSBvdXRwdXQ8dm9pZD4oeyBhbGlhczogJ2NsZWFyJyB9KTtcbiAgcmVhZG9ubHkgb3BlbkV2ZW50ID0gb3V0cHV0PHZvaWQ+KHsgYWxpYXM6ICdvcGVuJyB9KTtcbiAgcmVhZG9ubHkgY2xvc2VFdmVudCA9IG91dHB1dDx2b2lkPih7IGFsaWFzOiAnY2xvc2UnIH0pO1xuICByZWFkb25seSBzY3JvbGxFdmVudCA9IG91dHB1dDx7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgfT4oeyBhbGlhczogJ3Njcm9sbCcgfSk7XG4gIHJlYWRvbmx5IHNjcm9sbFRvRW5kRXZlbnQgPSBvdXRwdXQoeyBhbGlhczogJ3Njcm9sbFRvRW5kJyB9KTtcbiAgcmVhZG9ubHkgc2VhcmNoRXZlbnQgPSBvdXRwdXQ8e1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIG1hdGNoaW5nOiBhbnlbXTtcbiAgfT4oeyBhbGlhczogJ3NlYXJjaCcgfSk7XG5cbiAgcmVhZG9ubHkgaXNPcGVuID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIHJlYWRvbmx5IHNlYXJjaElucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBkcm9wZG93blBhbmVsID0gdmlld0NoaWxkPEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQ+KEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQpO1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgcmVhZG9ubHkgb3B0aW9uVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkT3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBvcHRncm91cFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSB2YWx1ZVRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBwbGFjZWhvbGRlclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duSGVhZGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duRm9vdGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IG5vSXRlbXNGb3VuZFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgYWRkQ3VzdG9tVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBpdGVtTGltaXRSZWFjaGVkVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgcHJlZml4VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBzdWZmaXhUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRTZWxlY3RTdWZmaXhUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgLy8hIGNvbnRleHQgcHJvdmlkZXJzXG4gIGdldFZhbHVlQ29udGV4dChpdGVtOiBBcmRPcHRpb24pOiBWYWx1ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBpdGVtLFxuICAgICAgaXRlbURhdGE6IGl0ZW0uaXRlbURhdGEoKSxcbiAgICAgIHVuc2VsZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJlYWRvbmx5IGdldFN0YXRzQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTdGF0c0NvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zKCksXG4gICAgfSlcbiAgKTtcbiAgcmVhZG9ubHkgZ2V0U2VhcmNoQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTZWFyY2hDb250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMoKSxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcygpLFxuICAgIH0pXG4gICk7XG4gIHJlYWRvbmx5IGdldFBsYWNlaG9sZGVyQ29udGV4dCA9IGNvbXB1dGVkKCgpOiBQbGFjZWhvbGRlckNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlckZvckN1cnJlbnRDb250ZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBDdXN0b21PcHRpb25Db250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgfSlcbiAgKTtcbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuKCkuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCgpKS5sZW5ndGgsXG4gICAgICB0b3RhbENoaWxkcmVuOiBncm91cC5jaGlsZHJlbigpLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dDxBcmRPcHRpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBpdGVtLFxuICAgICAgaXRlbSxcbiAgICAgIGl0ZW1EYXRhOiBpdGVtLml0ZW1EYXRhKCksXG4gICAgfTtcbiAgfVxuICByZWFkb25seSBnZXRJdGVtTGltaXRDb250ZXh0ID0gY29tcHV0ZWQoXG4gICAgKCk6IEl0ZW1MaW1pdENvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICB9KVxuICApO1xuICByZWFkb25seSBnZXRJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9IGNvbXB1dGVkKCgpOiBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zKCksXG4gICAgICBzZWxlY3RlZEl0ZW1zLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0KCkgPz8gMCksXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxTdHJhdGVneU9wdHMgPSBpbmplY3QoU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKTtcblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKCkpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0l0ZW1zSW5wdXRVc2VkKSB7XG4gICAgICB0aGlzLl9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCk7XG4gICAgfVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL2ZpcmUgaXRlbXMgbG9hZCBoYW5kbGVyIHdoZW4gbG9hZGluZyBpcyBzZXQgdG8gZmFsc2VcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddKSB7XG4gICAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddLmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25JdGVtc0xvYWQoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcHJpbnRQcmltaXRpdmVXYXJuaW5ncygpIHtcbiAgICBmdW5jdGlvbiBtYWtlV2FybmluZyhzdHI6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEFSRC1XQTAwMCR7ZXJyb3JDb2RlfTogU2tpcHBlZCB1c2luZyBbJHtzdHJ9XSBwcm9wZXJ0eSBib3VuZCB0byA8YXJkLXNlbGVjdD4sIGFzIHNvbWUgcHJvdmlkZWQgaXRlbXMgYXJlIG9mIHByaW1pdGl2ZSB0eXBlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nLCAnNWEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdsYWJlbEZyb20nLCAnNWInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdkaXNhYmxlZEZyb20nLCAnNWMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBMYWJlbEZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJywgJzVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdncm91cERpc2FibGVkRnJvbScsICc1ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGlsZHJlbkZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2NoaWxkcmVuRnJvbScsICc1ZicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnZlcnREaXNhYmxlZCgpKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnLCAnNWcnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICByZWFkb25seSBmaXJzdEhpZ2hsaWdodGVkSXRlbSA9IGNvbXB1dGVkPEFyZE9wdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCk/LmZpcnN0KCkpO1xuICByZWFkb25seSBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpICYmICF0aGlzLnNlYXJjaFRlcm0oKSk7XG4gIHJlYWRvbmx5IHNob3VsZERpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQoKSAmJiAoIXRoaXMuc2VhcmNoVGVybSgpIHx8IHRoaXMubXVsdGlzZWxlY3RhYmxlKCkpXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbGVhckJ1dHRvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuY2xlYXJhYmxlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpIHx8IHRoaXMuc2VhcmNoVGVybSgpICE9PSAnJylcbiAgKTtcbiAgcmVhZG9ubHkgaXRlbXNUb0Rpc3BsYXkgPSBjb21wdXRlZDxJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPj4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5ncm91cHMoKS52YWx1ZXMoKSk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dOb0l0ZW1zRm91bmQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kKCkgJiYgIXRoaXMuaXNMb2FkaW5nKCkgJiYgIXRoaXMuc2hvdWxkU2hvd0FkZEN1c3RvbSgpXG4gICk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbXMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMoKS5sZW5ndGgpO1xuICByZWFkb25seSBmb3VuZEl0ZW1zID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PlxuICAgIHRoaXMuc2VhcmNoYWJsZSgpID8gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoIDogdW5kZWZpbmVkXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiZcbiAgICAgIHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpICE9PSBJbmZpbml0eSAmJlxuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gdGhpcy5pdGVtRGlzcGxheUxpbWl0KClcbiAgKTtcbiAgcmVhZG9ubHkgaXNJbnB1dEVsZW1lbnRSZWFkb25seSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+ICF0aGlzLmFkZEN1c3RvbSgpICYmICghdGhpcy5zZWFyY2hhYmxlKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc0l0ZW1MaW1pdFJlYWNoZWQoKSlcbiAgKTtcblxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLml0ZW1EaXNwbGF5TGltaXQoKSA9PT0gSW5maW5pdHkgfHwgaSA8IHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpO1xuICB9XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlcigpICYmIHRoaXMuc2VhcmNoYWJsZSgpICYmICh0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKCkgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKCkpKVxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpO1xuICB9KTtcblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoZmlsdGVyVGVybSk7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLml0ZW1TdG9yYWdlLmZpbHRlcihmaWx0ZXJUZXJtKTtcbiAgICBpZiAoIXN1cHByZXNzU2VhcmNoRXZlbnQpIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh7IHNlYXJjaDogZmlsdGVyVGVybSwgbWF0Y2hpbmcgfSk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgb25TZWFyY2hJbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KHRydWUpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICB9XG4gIHNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgY29uc3QgW3NlbGVjdGVkLCB1bnNlbGVjdGVkLCBmYWlsZWRUb1NlbGVjdF0gPSB0aGlzLml0ZW1TdG9yYWdlLnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRFdmVudC5lbWl0KHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgaWYgKCF0aGlzLmtlZXBTZWFyY2hBZnRlclNlbGVjdCgpKSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCB8fCBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHVuc2VsZWN0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KCkpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4oKSB8fCB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc1RvU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJBbGxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckxhc3RTZWxlY3RlZCgpLnZhbHVlKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoW2NsZWFyZWRWYWx1ZV0pO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgfVxuICAvLyEgaGlnaGxpZ2gtcmVsYXRlZFxuICBvbk1vdXNlTW92ZSgpIHtcbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwTW91c2VvdmVyKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKCkpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEdyb3VwKGdyb3VwKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUVudGVyKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCgpKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRTaW5nbGVJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VMZWF2ZShvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ2xpY2tlZFdpdGhpbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIG9uSXRlbUNsaWNrKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpKSB0aGlzLnRvZ2dsZUl0ZW0ob3B0aW9uKTtcbiAgICBlbHNlIHRoaXMuc2VsZWN0SXRlbShvcHRpb24pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwQ2xpY2soZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSgpIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMoKSkgcmV0dXJuO1xuICAgIGlmIChncm91cC5jaGlsZHJlbigpLmV2ZXJ5KG8gPT4gby5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMudW5zZWxlY3RJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4oKSk7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4uc2V0KHRydWUpO1xuICB9XG4gIGhhbmRsZUNsZWFyQnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtKCkpIHtcbiAgICAgIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBoYW5kbGVEcm9wZG93bkFycm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICB9XG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnSU5QVVQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYXJjaGFibGUoKSkge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnKVxuICBvbk1vdXNldXAoKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldChmYWxzZSk7XG4gIH1cbiAgLy8hIGRyb3Bkb3duIHN0YXRlIGhhbmRsZXJzXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dG9IaWdobGlnaHRGaXJzdCgpKSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICAvLyEgQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoISh0aGlzLl9jZCBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICAvLyEgc2VhcmNoXG4gIHByaXZhdGUgX2NsZWFyU2VhcmNoKHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3NldFNlYXJjaCgnJywgc3VwcHJlc3NTZWFyY2hFdmVudCk7XG4gIH1cbiAgcHJpdmF0ZSBfc2V0U2VhcmNoKHNlYXJjaFRlcm06IHN0cmluZywgc3VwcHJlc3NTZWFyY2hFdmVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChzZWFyY2hUZXJtKTtcbiAgICB0aGlzLmZpbHRlcihzZWFyY2hUZXJtLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaElucHV0KCkhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGF1dG9jb3JyZWN0OiAnb2ZmJyxcbiAgICAgIGF1dG9jYXBpdGFsaXplOiAnb2ZmJyxcbiAgICAgIGF1dG9jb21wbGV0ZTogJ29mZicsXG4gICAgICAuLi50aGlzLmlucHV0QXR0cnMoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc2hvdWxkQ2xvc2UgPSB0cnVlO1xuXG4gICAgLy9zZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmZpcnN0SGlnaGxpZ2h0ZWRJdGVtKCkpIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpICYmIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4udGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9hZGQgYSBjdXN0b20gb3B0aW9uXG4gICAgZWxzZSBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLnNob3VsZFNob3dBZGRDdXN0b20oKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDdXN0b21PcHRpb24odGhpcy5zZWFyY2hUZXJtKCkpO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbigpICYmIHNob3VsZENsb3NlKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25TcGFjZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldChmYWxzZSk7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHROZXh0SXRlbSgrMSwgZXZlbnQuc2hpZnRLZXkpO1xuICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd1VwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZC5zZXQoZmFsc2UpO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oLTEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNPcGVuKCkgfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9PSAwICYmIHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gMClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc09wZW4oKSB8fFxuICAgICAgKHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCAmJlxuICAgICAgICB0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodExhc3RJdGVtKCk7XG4gICAgaWYgKCFyZWNlbnRseUhpZ2hsaWdodGVkKSByZXR1cm47XG5cbiAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSgpIHx8ICF0aGlzLmNsZWFyYWJsZSgpIHx8IHRoaXMubm9CYWNrc3BhY2VDbGVhcigpIHx8ICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY2xlYXJMYXN0SXRlbSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFsbEl0ZW1zKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25DdHJsQVByZXNzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0QWxsSXRlbXMoKTtcbiAgfVxufVxuIiwiPGFyZC1mb3JtLWZpZWxkLWZyYW1lXHJcbiAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZSgpXCJcclxuICBbdmFyaWFudF09XCJ2YXJpYW50KClcIlxyXG4gIFtjb21wYWN0XT1cImNvbXBhY3QoKVwiXHJcbiAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gIFtwcmVmaXhUZW1wbGF0ZV09XCJwcmVmaXhUZW1wbGF0ZSgpPy50ZW1wbGF0ZVwiXHJcbiAgW3N1ZmZpeFRlbXBsYXRlXT1cInN1ZmZpeFRlbXBsYXRlKCk/LnRlbXBsYXRlXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYXJkLXNlbGVjdFwiXHJcbiAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAoY2xpY2spPVwiaGFuZGxlQW55d2hlcmVDbGljaygkZXZlbnQpXCJcclxuICAgIFtjbGFzcy5hcmQtaGFzLXZhbHVlXT1cIml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKClcIlxyXG4gICAgW25nQ2xhc3NdPVwibmdDbGFzc2VzKClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0LXZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICBAaWYgKHNob3VsZERpc3BsYXlQbGFjZWhvbGRlcigpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1wbGNobGRyXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1wbGFjZWhvbGRlclwiPnt7IHBsY2hsZHIgfX08L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFBsYWNlaG9sZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvdWxkRGlzcGxheVZhbHVlKCkpIHtcclxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1TdG9yYWdlLnNlbGVjdGVkSXRlbXMoKTsgdHJhY2sgaXRlbS5pbmRleCgpKSB7XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hcmQtdmFsdWUtZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2F0dHIuaGlkZGVuXT1cIiFpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KCRpbmRleClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidmFsdWVUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCAobXVsdGlzZWxlY3RhYmxlKCkgPyBkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIDogZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0VmFsdWVDb250ZXh0KGl0ZW0pXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFZhbHVlVGVtcGxhdGVcclxuICAgICAgICAgIGxldC1pdGVtXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiXHJcbiAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlXHJcbiAgICAgICAgICBsZXQtaXRlbVxyXG4gICAgICAgICAgbGV0LXVuc2VsZWN0PVwidW5zZWxlY3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxhcmQtZGVsZXRhYmxlLWNoaXBcclxuICAgICAgICAgICAgKGRlbGV0ZSk9XCJ1bnNlbGVjdChpdGVtKVwiXHJcbiAgICAgICAgICAgIFt2YXJpYW50XT1cInZhcmlhbnQoKVwiXHJcbiAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cIml0ZW0ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIFRPRE8gY2hlY2sgaWYgY2FuIHJlbW92ZSBkaXYgLS0+XHJcbiAgICAgICAgICA8L2FyZC1kZWxldGFibGUtY2hpcD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGl0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXQoKSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SXRlbURpc3BsYXlMaW1pdENvbnRleHQoKVwiXHJcbiAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAjZGVmYXVsdEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZVxyXG4gICAgICAgICAgICBsZXQtY291bnQ9XCJvdmVyZmxvd0NvdW50XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdj57eyBjb3VudCB9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcclxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICAgICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBbYXR0ci5pZF09XCJzZWFyY2hJbnB1dElkKClcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXgoKVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwiaXNJbnB1dEVsZW1lbnRSZWFkb25seSgpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxyXG4gICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNPcGVuKCkgPyBodG1sSWQoKSA6IG51bGxcIlxyXG4gICAgICAgICAgKGlucHV0KT1cImZpbHRlcihzZWFyY2hJbnB1dC52YWx1ZSlcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwib25TZWFyY2hJbnB1dEZvY3VzKClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25TZWFyY2hJbnB1dEJsdXIoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2ltcGxlLXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1NwaW5uZXJUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZVwiIC8+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0NsZWFyQnV0dG9uKCkpIHtcclxuICAgICAgICA8YXJkLWNsZWFyLWJ1dHRvblxyXG4gICAgICAgICAgW3RpdGxlXT1cImNsZWFyQnV0dG9uVGl0bGUoKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZURyb3Bkb3duQXJyb3dDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duVGVtcGxhdGU+XHJcbiAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgY2xhc3M9XCJhcmQtZHJvcGRvd24tcGFuZWwgYXJkLXNlbGVjdC1kcm9wZG93bi1wYW5lbFwiXHJcbiAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgIFtoZWFkZXJUZW1wbGF0ZV09XCJkcm9wZG93bkhlYWRlclRlbXBsYXRlKCk/LnRlbXBsYXRlID8/IG51bGxcIlxyXG4gICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGUoKT8udGVtcGxhdGUgPz8gbnVsbFwiXHJcbiAgICBbYXBwZWFyYW5jZV09XCJkcm9wZG93bkFwcGVhcmFuY2VPckRlZmF1bHQoKVwiXHJcbiAgICBbdmFyaWFudF09XCJkcm9wZG93blZhcmlhbnRPckRlZmF1bHQoKVwiXHJcbiAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgW2ZpbHRlclZhbHVlXT1cInNlYXJjaFRlcm0oKVwiXHJcbiAgICBbcGFuZWxJZF09XCJodG1sSWQoKVwiXHJcbiAgICBbY29tcGFjdF09XCJjb21wYWN0KClcIlxyXG4gICAgKGFyZENsaWNrT3V0c2lkZSk9XCJoYW5kbGVPdXRzaWRlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKClcIlxyXG4gICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgKHNjcm9sbFRvRW5kKT1cInNjcm9sbFRvRW5kRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICA+XHJcbiAgICBAaWYgKCFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgQGZvciAoZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzKCk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWRpc2FibGVkXT1cImdyb3VwLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtaGlnaGxpZ2h0ZWRdPVwiZ3JvdXAuaGlnaGxpZ2h0ZWQoKVwiXHJcbiAgICAgICAgICAobW91c2VvdmVyKT1cIm9uR3JvdXBNb3VzZW92ZXIoZ3JvdXApXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZ3JvdXApXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBAaWYgKGdyb3VwLmxhYmVsKCkgIT09ICcnICYmIGdyb3VwLmxhYmVsKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAjZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcclxuICAgICAgICAgICAgICBsZXQtZ3JvdXBcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbYXJkSW5uZXJIVE1MXT1cImdyb3VwLmxhYmVsKClcIlxyXG4gICAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0Z3JvdXBUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0Z3JvdXBUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEdyb3VwQ29udGV4dChncm91cClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0Z3JvdXAtY2hpbGRyZW5cIj5cclxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGdyb3VwLmNoaWxkcmVuKCk7IHRyYWNrIG9wdGlvbi5pbmRleCgpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24tc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWRdPVwib3B0aW9uLmhpZ2hsaWdodGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1vcHRpb24taGlnaGxpZ2h0ZWQtcmVjZW50XT1cIm9wdGlvbi5oaWdobGlnaHRlZF9yZWNlbnRseSgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaHRtbElkKCkgKyAnLScgKyBvcHRpb24uaW5kZXgoKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2sob3B0aW9uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25JdGVtTW91c2VPdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25JdGVtTW91c2VMZWF2ZShvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICNkZWZhdWx0T3B0aW9uVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBsZXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25UZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRPcHRpb25Db250ZXh0KG9wdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93Tm9JdGVtc0ZvdW5kKCkpIHtcclxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Tm9JdGVtc0ZvdW5kVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7IG5vSXRlbXNGb3VuZFRleHQoKSB9fTwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0U2VhcmNoQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKHNob3VsZFNob3dBZGRDdXN0b20oKSkge1xyXG4gICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAjZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXHJcbiAgICAgICAgbGV0LXNlYXJjaFRlcm1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRDdXN0b21PcHRpb24oc2VhcmNoVGVybSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcmQtYWRkLWN1c3RvbS12YWx1ZVwiPlwie3sgc2VhcmNoVGVybSB9fVwiPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQ3VzdG9tVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdEFkZEN1c3RvbVRlbXBsYXRlXCJcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCgpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKGlzTG9hZGluZygpKSB7XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uIGFyZC1vcHRpb24tZGlzYWJsZWRcIj57eyBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0KCkgfX08L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFNlYXJjaENvbnRleHQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcbiAgPC9hcmQtZHJvcGRvd24tcGFuZWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBT0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFtQixNQUFNLGtEQUFrRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQTZCLGdCQUFnQixFQUFzQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFDTCw2QkFBNkIsRUFDN0Isa0NBQWtDLEVBQ2xDLGtDQUFrQyxFQUNsQyxvQ0FBb0MsRUFDcEMsb0NBQW9DLEVBQ3BDLHNDQUFzQyxFQUN0QyxrQ0FBa0MsRUFDbEMsZ0NBQWdDLEVBQ2hDLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIscUNBQXFDLEVBQ3JDLGdDQUFnQyxFQUNoQyxnQ0FBZ0MsRUFDaEMseUJBQXlCLEdBQzFCLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7O0FBMkI1QixNQUFNLE9BQU8scUJBQ1gsU0FBUSxxQkFBcUI7SUFmL0I7O1FBa0JXLGlCQUFZLEdBQVcsS0FBSyxDQUFDO1FBQ3RDLG9CQUFvQjtRQUNYLGdCQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsYUFBUSxHQUFHO1lBQ2xCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFlBQVksRUFBRSxVQUFVO1lBQ3hCLGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLGlCQUFpQixFQUFFLFVBQVU7WUFDN0IsWUFBWSxFQUFFLFVBQVU7WUFDeEIsUUFBUSxFQUFFLGVBQWUsQ0FBQyxPQUFPO1lBQ2pDLGdCQUFnQixFQUFFLE9BQU87WUFDekIsZ0JBQWdCLEVBQUUsaUJBQWlCO1lBQ25DLHNCQUFzQixFQUFFLFlBQVk7U0FDckMsQ0FBQztRQUVGLFlBQVk7UUFDSixXQUFNLEdBQWlCLEVBQUUsQ0FBQztRQUNqQixzQkFBaUIsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDM0Msc0JBQWlCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRWpELFdBQVc7UUFDRixlQUFVLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6QiwwQkFBMEI7UUFDMUIsdURBQXVEO1FBQzlDLGNBQVMsR0FBRyxLQUFLLENBQW1CLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLGNBQVMsR0FBRyxLQUFLLENBQW1CLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLGlCQUFZLEdBQUcsS0FBSyxDQUFtQixTQUFTLENBQUMsQ0FBQztRQUMzRCx3QkFBd0I7UUFDZixtQkFBYyxHQUFHLEtBQUssQ0FBK0IsU0FBUyxDQUFDLENBQUM7UUFDaEUsc0JBQWlCLEdBQUcsS0FBSyxDQUFtQixTQUFTLENBQUMsQ0FBQztRQUN2RCxpQkFBWSxHQUFHLEtBQUssQ0FBbUIsU0FBUyxDQUFDLENBQUM7UUFDM0QsWUFBWTtRQUNILGdCQUFXLEdBQUcsS0FBSyxDQUFTLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLHNCQUFpQixHQUFHLEtBQUssQ0FBUyxXQUFXLENBQUMsQ0FBQztRQUMvQyxxQkFBZ0IsR0FBRyxLQUFLLENBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWpFLHFCQUFnQixHQUFHLEtBQUssQ0FBbUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0UsNkJBQTZCO1FBQ3BCLHFCQUFnQixHQUFHLEtBQUssQ0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakUsMkJBQXNCLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN0RiwwQkFBMEI7UUFDakIsa0JBQWEsR0FBRyxLQUFLLENBQW1CLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELGVBQVUsR0FBRyxLQUFLLENBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELGdCQUFnQjtRQUNQLGNBQVMsR0FBRyxLQUFLLENBQWUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLGVBQVUsR0FBRyxLQUFLLENBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLFdBQU0sR0FBRyxLQUFLLENBQVMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFckQsb0JBQW9CO1FBQ1gsd0JBQW1CLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4RyxvRUFBb0U7UUFDcEUsK0VBQStFO1FBQ3RFLG1CQUFjLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxRixtQkFBYyxHQUFHLEtBQUssQ0FBZSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUYsdUJBQWtCLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RixjQUFTLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixhQUFRLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRixpQkFBWSxHQUFHLEtBQUssQ0FBZSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEYscUJBQWdCLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1Rix1QkFBa0IsR0FBRyxLQUFLLENBQWUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLHdCQUFtQixHQUFHLEtBQUssQ0FBZSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0YsMEJBQXFCLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxRyxpQkFBaUI7UUFDUixxQkFBZ0IsR0FBRyxLQUFLLENBQWMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RyxxQkFBZ0IsR0FBRyxLQUFLLENBQWMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoSCxtQkFBbUI7UUFDVixhQUFRLEdBQUcsS0FBSyxDQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsZ0JBQVcsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO1FBRTVELGNBQWM7UUFDTCxlQUFVLEdBQUcsS0FBSyxDQUF3QixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRSxZQUFPLEdBQUcsS0FBSyxDQUFxQixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVoRSxZQUFPLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRixjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNqQztZQUNFLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxrQkFBa0I7WUFDL0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDckQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ1osQ0FBQztRQUVPLHVCQUFrQixHQUFHLEtBQUssQ0FBb0MsU0FBUyxDQUFDLENBQUM7UUFDekUsZ0NBQTJCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFBRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRyxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLHFCQUFxQixDQUFDLFFBQVE7Z0JBQUUsT0FBTyx1QkFBdUIsQ0FBQyxRQUFRLENBQUM7WUFDbEcsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDTSxvQkFBZSxHQUFHLEtBQUssQ0FBaUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsNkJBQXdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNoRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFHLENBQUM7WUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLElBQUksT0FBTyxLQUFLLGtCQUFrQixDQUFDLElBQUk7Z0JBQUUsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7WUFDN0UsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFtRUgsMENBQTBDO1FBQ2pDLG9CQUFlLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRixjQUFTLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixlQUFVLEdBQUcsS0FBSyxDQUFlLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0RixhQUFRLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbEYsWUFBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUUxQyxrQkFBa0I7UUFDVix3QkFBbUIsR0FBcUIsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUVoRSxjQUFTLEdBQUcsS0FBSyxDQUd4QixLQUFLLEVBQUU7WUFDUCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDbEIsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztnQkFDRCxpQ0FBaUM7Z0JBQ2pDLHNFQUFzRTtnQkFDdEUsT0FBTyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDOUQsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNNLHdCQUFtQixHQUFHLFFBQVEsQ0FDckMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUN0RyxDQUFDO1FBOENPLGdCQUFXLEdBQUcsTUFBTSxFQUFTLENBQUM7UUFFdkMsaUJBQWlCO1FBQ1IsZ0JBQVcsR0FBRyxNQUFNLENBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNqRCxhQUFRLEdBQUcsTUFBTSxDQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0MscUJBQWdCLEdBQUcsTUFBTSxDQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDM0QsZ0JBQVcsR0FBRyxNQUFNLENBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNqRCxlQUFVLEdBQUcsTUFBTSxDQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUMsY0FBUyxHQUFHLE1BQU0sQ0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLGVBQVUsR0FBRyxNQUFNLENBQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5QyxnQkFBVyxHQUFHLE1BQU0sQ0FHMUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNmLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELGdCQUFXLEdBQUcsTUFBTSxDQUcxQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRWYsV0FBTSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV4QyxpQkFBaUI7UUFDUixnQkFBVyxHQUFHLFNBQVMsQ0FBK0IsYUFBYSxDQUFDLENBQUM7UUFDckUsa0JBQWEsR0FBRyxTQUFTLENBQStCLDRCQUE0QixDQUFDLENBQUM7UUFFL0YsYUFBYTtRQUNKLG1CQUFjLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDMUQscUJBQWdCLEdBQUcsWUFBWSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDOUQsa0JBQWEsR0FBRyxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN4RCx3QkFBbUIsR0FBRyxZQUFZLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMxRSwyQkFBc0IsR0FBRyxZQUFZLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMxRSwrQkFBMEIsR0FBRyxZQUFZLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNsRiwyQkFBc0IsR0FBRyxZQUFZLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMxRSwyQkFBc0IsR0FBRyxZQUFZLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMxRSx5QkFBb0IsR0FBRyxZQUFZLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUN0RSxzQkFBaUIsR0FBRyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNoRSw2QkFBd0IsR0FBRyxZQUFZLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUM5RSw2QkFBd0IsR0FBRyxZQUFZLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUU5RSxtQkFBYyxHQUFHLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ2hFLG1CQUFjLEdBQUcsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFhaEUsb0JBQWUsR0FBRyxRQUFRLENBQ2pDLEdBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBQ08scUJBQWdCLEdBQUcsUUFBUSxDQUNsQyxHQUFrQixFQUFFLENBQUMsQ0FBQztZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM1QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM5QixDQUFDLENBQ0gsQ0FBQztRQUNPLDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUF1QixFQUFFO1lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsV0FBVztnQkFDWCxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTSwyQkFBc0IsR0FBRyxRQUFRLENBQ3hDLEdBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzVCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBZ0JPLHdCQUFtQixHQUFHLFFBQVEsQ0FDckMsR0FBcUIsRUFBRSxDQUFDLENBQUM7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTTtZQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1NBQ25DLENBQUMsQ0FDSCxDQUFDO1FBQ08sK0JBQTBCLEdBQUcsUUFBUSxDQUFDLEdBQTRCLEVBQUU7WUFDM0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDOUQsT0FBTztnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDN0IsYUFBYTtnQkFDYixTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNsQyxhQUFhLEVBQUUsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVjLGVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUF1QixDQUFBLENBQUMsQ0FBQztRQUM3QyxRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQXVIcEUsV0FBVztRQUNGLHlCQUFvQixHQUFHLFFBQVEsQ0FBd0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0csNkJBQXdCLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDaEgsdUJBQWtCLEdBQUcsUUFBUSxDQUNwQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FDN0YsQ0FBQztRQUNPLDBCQUFxQixHQUFHLFFBQVEsQ0FDdkMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDakgsQ0FBQztRQUNPLG1CQUFjLEdBQUcsUUFBUSxDQUFtQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEcsMkJBQXNCLEdBQUcsUUFBUSxDQUN4QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQzVGLENBQUM7UUFDTyxlQUFVLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsZUFBVSxHQUFHLFFBQVEsQ0FBcUIsR0FBRyxFQUFFLENBQ3RELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDeEUsQ0FBQztRQUNPLCtCQUEwQixHQUFHLFFBQVEsQ0FDNUMsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxRQUFRO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUNwRSxDQUFDO1FBQ08sMkJBQXNCLEdBQUcsUUFBUSxDQUN4QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUN6RixDQUFDO1FBS08saUNBQTRCLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtZQUM1RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4RyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBcUdILGtCQUFrQjtRQUNELHFCQUFnQixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztLQTJRNUQ7SUF6d0JDLElBQ0ksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUE0QjtRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUtPLHVCQUF1QjtRQUM3QixNQUFNLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtZQUM5QixNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRixLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7aUJBQ25DLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7NEJBQ2hCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7NEJBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzs0QkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO3lCQUMxQixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU87YUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2pFLFNBQVMsQ0FBQyxDQUFDLE9BQXlDLEVBQUUsRUFBRTtZQUN2RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtpQkFDMUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQStCRCxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWE7UUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUVoQixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsMkVBQTJFO0lBQ2xFLGdCQUFnQixDQUFDLEtBQWM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsVUFBVSxDQUFDLE9BQWM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxpQ0FBaUM7SUFDdkIsV0FBVztRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUNJLEtBQUssQ0FBQyxRQUFhO1FBQ3JCLGlEQUFpRDtRQUNqRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFBRSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEUsaUVBQWlFO2FBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQUUsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBNENELHFCQUFxQjtJQUNyQixlQUFlLENBQUMsSUFBZTtRQUM3QixPQUFPO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixJQUFJO1lBQ0osUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDekIsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQTRCRCxlQUFlLENBQUMsS0FBcUI7UUFDbkMsT0FBTztZQUNMLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUs7WUFDTCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNuRSxhQUFhLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU07U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxJQUFlO1FBQzlCLE9BQU87WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLElBQUk7WUFDSixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtTQUMxQixDQUFDO0lBQ0osQ0FBQztJQWdDTyxjQUFjO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQzFCLFFBQVEsRUFBRTthQUNWLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDdEMsYUFBYSxDQUFDO1lBQ2I7Z0JBQ0UsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsT0FBTztnQkFDakIsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsT0FBTztnQkFDaEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1NBQ0YsQ0FBQyxDQUFDO1FBRUwsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDL0IsZ0JBQWdCLEVBQUUsUUFBUTtZQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtZQUMvQyxXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUNPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTztRQUVsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFFbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBR0QsY0FBYztRQUNaLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztJQUNULFFBQVE7UUFDTixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLHNEQUFzRDtRQUN0RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFDTyx1QkFBdUI7UUFDN0IsU0FBUyxXQUFXLENBQUMsR0FBVyxFQUFFLFNBQWlCO1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQ1YsWUFBWSxTQUFTLG9CQUFvQixHQUFHLGdGQUFnRixDQUM3SCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDMUIsV0FBVyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDN0IsV0FBVyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDMUIsV0FBVyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBNkJELHlCQUF5QixDQUFDLENBQVM7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3hHLENBQUM7SUFPRCwrQkFBK0I7SUFDL0IsTUFBTSxDQUFDLFVBQWtCLEVBQUUsbUJBQW1CLEdBQUcsS0FBSztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsbUJBQW1CO1lBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTztRQUV0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsMkJBQTJCO0lBQzNCLFVBQVUsQ0FBQyxJQUFlO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFHLEtBQWtCO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFckYsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZLENBQUMsR0FBRyxLQUFrQjtRQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXZELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDTyxjQUFjO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNPLGNBQWM7UUFDcEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWxFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELG9CQUFvQjtJQUNwQixXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsS0FBcUI7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQUUsT0FBTztRQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBaUIsRUFBRSxLQUFpQjtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBaUIsRUFBRSxLQUFpQjtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdELFdBQVcsQ0FBQyxNQUFpQixFQUFFLEtBQWlCO1FBQzlDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFxQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFBRSxPQUFPO1FBQzdELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxLQUFpQjtRQUN0QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUNELHdCQUF3QixDQUFDLEtBQWlCO1FBQ3hDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPO1FBQzNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFFM0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUNELG1CQUFtQixDQUFDLEtBQWlCO1FBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsMkJBQTJCO0lBQzNCLE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTztRQUU3QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUVyRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELHFCQUFxQjtJQUNyQixhQUFhO1FBQ1gsSUFBSSxDQUFFLElBQUksQ0FBQyxHQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNELFVBQVU7SUFDRixZQUFZLENBQUMsbUJBQW1CLEdBQUcsS0FBSztRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDTyxVQUFVLENBQUMsVUFBa0IsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNPLHlCQUF5QjtRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFHLENBQUMsYUFBYSxDQUFDO1FBQ2hELE1BQU0sVUFBVSxHQUEyQjtZQUN6QyxJQUFJLEVBQUUsTUFBTTtZQUNaLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUNyQixDQUFDO1FBRUYsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDMUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFFdEIsVUFBVSxDQUFDLEtBQW9CO1FBQzdCLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU87WUFDVCxDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3JCLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNPLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBb0I7UUFDOUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztRQUV2Qix5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pGLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBQ0QscUJBQXFCO2FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCwyREFBMkQ7O1lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNPLGFBQWEsQ0FBQyxLQUFvQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPO1FBRTFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ08saUJBQWlCLENBQUMsS0FBb0I7UUFDNUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNPLGVBQWUsQ0FBQyxLQUFvQjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87UUFDM0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNPLFlBQVksQ0FBQyxLQUFvQjtRQUN2QyxJQUNFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxhQUFhLENBQUMsY0FBYyxLQUFLLENBQUMsQ0FBQztZQUVoSCxPQUFPO1FBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU87UUFFakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ08sV0FBVyxDQUFDLEtBQW9CO1FBQ3RDLElBQ0UsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsYUFBYSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTTtnQkFDMUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUVoRixPQUFPO1FBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU87UUFFakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ08seUJBQXlCLENBQUMsS0FBb0I7UUFDcEQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTztRQUV2SCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFDTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN2QyxDQUFDOzhHQTUzQlUscUJBQXFCO2tHQUFyQixxQkFBcUIsNnFOQVJyQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7Z0JBQ3BELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixzRUEyUnNDLDBCQUEwQixtR0FDeEIsNEJBQTRCLGdHQUMvQix5QkFBeUIsc0dBQ25CLHFDQUFxQyx5R0FDbEMsa0NBQWtDLDZHQUM5QixzQ0FBc0MseUdBQzFDLGtDQUFrQyx5R0FDbEMsa0NBQWtDLHVHQUNwQyxnQ0FBZ0Msb0dBQ25DLDZCQUE2QiwyR0FDdEIsb0NBQW9DLDJHQUNwQyxvQ0FBb0MsaUdBRTlDLGdDQUFnQyxpR0FDaEMsZ0NBQWdDLHNGQTNKdEQscUJBQXFCLHlMQTBJMkIsNEJBQTRCLDBJQWdHMUQsVUFBVSwrR0FFTixXQUFXLHlFQ2pkcEQseXhUQTZRQTs7MkZEcExhLHFCQUFxQjtrQkFkakMsU0FBUzsrQkFDRSxZQUFZLGlCQUdQLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQXVIRyx3QkFBd0I7c0JBRDNCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQU9oQyxLQUFLO3NCQURSLEtBQUs7Z0JBbUJOLGdCQUFnQjtzQkFEZixlQUFlO3VCQUFDLHFCQUFxQjtnQkF1R2xDLEtBQUs7c0JBRFIsS0FBSztnQkFxSU4sWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRy9DLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFtRHBELGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlO2dCQW1RN0IsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVM7Z0JBa0V2QixVQUFVO3NCQURULFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZUFycmF5UHJvcGVydHksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQW55U3RyaW5nLCBpc0FycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgSXRlbVN0b3JhZ2UsIEl0ZW1TdG9yYWdlSG9zdCB9IGZyb20gJy4uL19pbnRlcm5hbC9pdGVtLXN0b3JhZ2VzL2Ryb3Bkb3duLWl0ZW0tc3RvcmFnZSc7XG5pbXBvcnQgeyBfTmdNb2RlbENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9faW50ZXJuYWwvbmdtb2RlbC1jb21wb25lbnQnO1xuaW1wb3J0IHsgQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duLXBhbmVsL2Ryb3Bkb3duLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSwgRHJvcGRvd25QYW5lbFZhcmlhbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC50eXBlcyc7XG5pbXBvcnQgeyBBcmRpdW1PcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWFyY2hGdW5jdGlvbnMgfSBmcm9tICcuLi9zZWFyY2gtZnVuY3Rpb25zJztcbmltcG9ydCB7IEFyZE9wdGlvbiwgQXJkT3B0aW9uR3JvdXAsIEFyZFBhbmVsUG9zaXRpb24sIEdyb3VwQnlGbiwgT3B0aW9uQ29udGV4dCwgU2VhcmNoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRBcHBlYXJhbmNlIH0gZnJvbSAnLi4vdHlwZXMvdGhlbWluZy50eXBlcyc7XG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRWYXJpYW50IH0gZnJvbSAnLi8uLi90eXBlcy90aGVtaW5nLnR5cGVzJztcbmltcG9ydCB7XG4gIEFyZEFkZEN1c3RvbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkZvb3RlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREcm9wZG93bkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZEl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkTG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRncm91cFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFNlbGVjdFN1ZmZpeFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRWYWx1ZVRlbXBsYXRlRGlyZWN0aXZlLFxufSBmcm9tICcuL3NlbGVjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgQWRkQ3VzdG9tRm4sXG4gIEN1c3RvbU9wdGlvbkNvbnRleHQsXG4gIEdyb3VwQ29udGV4dCxcbiAgSXRlbURpc3BsYXlMaW1pdENvbnRleHQsXG4gIEl0ZW1MaW1pdENvbnRleHQsXG4gIFBsYWNlaG9sZGVyQ29udGV4dCxcbiAgU2VhcmNoQ29udGV4dCxcbiAgU3RhdHNDb250ZXh0LFxuICBWYWx1ZUNvbnRleHQsXG59IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJkLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIF9OZ01vZGVsQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJdGVtU3RvcmFnZUhvc3RcbntcbiAgcmVhZG9ubHkgX2NvbXBvbmVudElkOiBzdHJpbmcgPSAnMDAwJztcbiAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgcmVhZG9ubHkgaXRlbVN0b3JhZ2UgPSBuZXcgSXRlbVN0b3JhZ2UodGhpcyk7XG4gIHJlYWRvbmx5IERFRkFVTFRTID0ge1xuICAgIHZhbHVlRnJvbTogJ3ZhbHVlJyxcbiAgICBsYWJlbEZyb206ICdsYWJlbCcsXG4gICAgZGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGdyb3VwTGFiZWxGcm9tOiAnZ3JvdXAnLFxuICAgIGdyb3VwRGlzYWJsZWRGcm9tOiAnZGlzYWJsZWQnLFxuICAgIGNoaWxkcmVuRnJvbTogJ2NoaWxkcmVuJyxcbiAgICBzZWFyY2hGbjogc2VhcmNoRnVuY3Rpb25zLmJ5TGFiZWwsXG4gICAgY2xlYXJCdXR0b25UaXRsZTogJ0NsZWFyJyxcbiAgICBub0l0ZW1zRm91bmRUZXh0OiAnTm8gaXRlbXMgZm91bmQuJyxcbiAgICBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0OiAnTG9hZGluZy4uLicsXG4gIH07XG5cbiAgLy8hIHByaXZhdGVzXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSB8IG51bGwgPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNNb3VzZUJlaW5nVXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaEJhckZvY3VzZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8hIHB1YmxpY3NcbiAgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgaXNJdGVtc0lucHV0VXNlZCA9IGZhbHNlO1xuXG4gIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gIC8vdmFsdWUvbGFiZWwvZGlzYWJsZWQvZ3JvdXAvcHJlLWdyb3VwZWQgY2hpbGRyZW4gcGF0aHNcbiAgcmVhZG9ubHkgdmFsdWVGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgbGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGlzYWJsZWRGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgLy8hIGdyb3VwLXJlbGF0ZWQgaW5wdXRzXG4gIHJlYWRvbmx5IGdyb3VwTGFiZWxGcm9tID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nIHwgR3JvdXBCeUZuPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZ3JvdXBEaXNhYmxlZEZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBjaGlsZHJlbkZyb20gPSBpbnB1dDxOdWxsYWJsZTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICAvLyEgc2V0dGluZ3NcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCdTZWxlY3QgaXRlbScpO1xuICByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ1NlYXJjaC4uLicpO1xuICByZWFkb25seSBjbGVhckJ1dHRvblRpdGxlID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmNsZWFyQnV0dG9uVGl0bGUpO1xuXG4gIHJlYWRvbmx5IGRyb3Bkb3duUG9zaXRpb24gPSBpbnB1dDxBcmRQYW5lbFBvc2l0aW9uPihBcmRQYW5lbFBvc2l0aW9uLkF1dG8pO1xuICAvLyEgdGVtcGxhdGUtcmVsYXRlZCBzZXR0aW5nc1xuICByZWFkb25seSBub0l0ZW1zRm91bmRUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0ID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRTLmxvYWRpbmdQbGFjZWhvbGRlclRleHQpO1xuICAvLyEgc2VhcmNoLXJlbGF0ZWQgb3B0aW9uc1xuICByZWFkb25seSBzZWFyY2hJbnB1dElkID0gaW5wdXQ8TnVsbGFibGU8c3RyaW5nPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgaW5wdXRBdHRycyA9IGlucHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgLy8hIG90aGVyIGlucHV0c1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGlucHV0UHJvcHMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IGh0bWxJZCA9IGlucHV0PHN0cmluZz4oY3J5cHRvLnJhbmRvbVVVSUQoKSk7XG5cbiAgLy8hIGJvb2xlYW4gc2V0dGluZ3NcbiAgcmVhZG9ubHkgaXRlbXNBbHJlYWR5R3JvdXBlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcblxuICAvL3Nob3VsZCB0aGUgdmFsdWUgdGhhdCB0aGUgXCJkaXNhYmxlZEZyb21cIiBwYXRoIGxlYWQgdG8gYmUgaW52ZXJ0ZWQ/XG4gIC8vdXNlZnVsIHdoZW4gdGhlIHByb3BlcnR5IGlzIGUuZy4gXCJhY3RpdmVcIiwgd2hpY2ggaXMgdGhlIG9wb3NpdGUgb2YgXCJkaXNhYmxlZFwiXG4gIHJlYWRvbmx5IGludmVydERpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IG5vR3JvdXBBY3Rpb25zID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBhdXRvSGlnaGxpZ2h0Rmlyc3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGF1dG9Gb2N1cyA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkga2VlcE9wZW4gPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG4gIHJlYWRvbmx5IGhpZGVTZWxlY3RlZCA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgbm9CYWNrc3BhY2VDbGVhciA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgc29ydE11bHRpcGxlVmFsdWVzID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgLy8hIG51bWJlciBpbnB1dHNcbiAgcmVhZG9ubHkgbWF4U2VsZWN0ZWRJdGVtcyA9IGlucHV0PG51bWJlciwgYW55PihJbmZpbml0eSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgSW5maW5pdHkpIH0pO1xuICByZWFkb25seSBpdGVtRGlzcGxheUxpbWl0ID0gaW5wdXQ8bnVtYmVyLCBhbnk+KEluZmluaXR5LCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBJbmZpbml0eSkgfSk7XG5cbiAgLy8hIGZ1bmN0aW9uIGlucHV0c1xuICByZWFkb25seSBzZWFyY2hGbiA9IGlucHV0PFNlYXJjaEZuPih0aGlzLkRFRkFVTFRTLnNlYXJjaEZuKTtcbiAgcmVhZG9ubHkgY29tcGFyZVdpdGggPSBpbnB1dDxOdWxsYWJsZTxTZWFyY2hGbj4+KHVuZGVmaW5lZCk7XG5cbiAgLy8hIGFwcGVhcmFuY2VcbiAgcmVhZG9ubHkgYXBwZWFyYW5jZSA9IGlucHV0PEZvcm1FbGVtZW50QXBwZWFyYW5jZT4oRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKTtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PEZvcm1FbGVtZW50VmFyaWFudD4oRm9ybUVsZW1lbnRWYXJpYW50LlJvdW5kZWQpO1xuXG4gIHJlYWRvbmx5IGNvbXBhY3QgPSBpbnB1dDxib29sZWFuLCBhbnk+KGZhbHNlLCB7IHRyYW5zZm9ybTogdiA9PiBjb2VyY2VCb29sZWFuUHJvcGVydHkodikgfSk7XG5cbiAgcmVhZG9ubHkgbmdDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBbXG4gICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgIHRoaXMuY29tcGFjdCgpID8gJ2FyZC1jb21wYWN0JyA6ICcnLFxuICAgICAgdGhpcy5tdWx0aXNlbGVjdGFibGUoKSA/ICdhcmQtbXVsdGlzZWxlY3QnIDogJ2FyZC1zaW5nbGVzZWxlY3QnLFxuICAgICAgdGhpcy5jbGVhcmFibGUoKSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgdGhpcy5zZWFyY2hhYmxlKCkgPyAnYXJkLXNlYXJjaGFibGUnIDogJycsXG4gICAgICB0aGlzLmZpbHRlcmVkKCkgPyAnYXJkLWZpbHRlcmVkJyA6ICcnLFxuICAgICAgdGhpcy50b3VjaGVkKCkgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICB0aGlzLmlzT3BlbigpID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICByZWFkb25seSBkcm9wZG93bkFwcGVhcmFuY2UgPSBpbnB1dDxOdWxsYWJsZTxEcm9wZG93blBhbmVsQXBwZWFyYW5jZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQXBwZWFyYW5jZU9yRGVmYXVsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5kcm9wZG93bkFwcGVhcmFuY2UoKSkgcmV0dXJuIHRoaXMuZHJvcGRvd25BcHBlYXJhbmNlKCkhO1xuICAgIGlmICh0aGlzLmFwcGVhcmFuY2UoKSA9PT0gRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkKSByZXR1cm4gRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UuT3V0bGluZWQ7XG4gICAgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLlJhaXNlZDtcbiAgfSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVmFyaWFudCA9IGlucHV0PE51bGxhYmxlPERyb3Bkb3duUGFuZWxWYXJpYW50Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZHJvcGRvd25WYXJpYW50T3JEZWZhdWx0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duVmFyaWFudCgpKSByZXR1cm4gdGhpcy5kcm9wZG93blZhcmlhbnQoKSE7XG4gICAgY29uc3QgdmFyaWFudCA9IHRoaXMudmFyaWFudCgpO1xuICAgIGlmICh2YXJpYW50ID09PSBGb3JtRWxlbWVudFZhcmlhbnQuUGlsbCkgcmV0dXJuIERyb3Bkb3duUGFuZWxWYXJpYW50LlJvdW5kZWQ7XG4gICAgcmV0dXJuIHZhcmlhbnQ7XG4gIH0pO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJylcbiAgZ2V0IF9ncm91cEl0ZW1zSG9zdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cExhYmVsRnJvbSgpO1xuICB9XG5cbiAgLy8hIGl0ZW1zIHNldHRlci9nZXR0ZXJcbiAgQElucHV0KClcbiAgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBzZXQgaXRlbXModmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCkge1xuICAgIHRoaXMuaXNJdGVtc0lucHV0VXNlZCA9IHRydWU7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgdGhpcy5pc0l0ZW1zSW5wdXRVc2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0FueVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHByaW50RXJyb3JzID0gdGhpcy5pdGVtU3RvcmFnZS5zZXRJdGVtcyh2YWx1ZSk7XG4gICAgaWYgKHByaW50RXJyb3JzKSB7XG4gICAgICB0aGlzLl9wcmludFByaW1pdGl2ZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihBcmRpdW1PcHRpb25Db21wb25lbnQpXG4gIG9wdGlvbkNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8QXJkaXVtT3B0aW9uQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCkge1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95JCk7XG4gICAgICBtZXJnZSguLi50aGlzLm9wdGlvbkNvbXBvbmVudHMubWFwKG9wdGlvbiA9PiBvcHRpb24uc3RhdGVDaGFuZ2UkKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAgIC5zdWJzY3JpYmUob3B0aW9uID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1TdG9yYWdlLmZpbmRJdGVtQnlWYWx1ZShvcHRpb24ub2xkVmFsdWUgPz8gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQuc2V0KG9wdGlvbi5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgIGl0ZW0ubGFiZWwuc2V0KG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCkpO1xuICAgICAgICAgICAgICBpdGVtLnZhbHVlLnNldChvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLnNldCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3B0aW9uLmRpc2FibGVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMub3B0aW9uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5vcHRpb25Db21wb25lbnRzKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW1zID0gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGhhbmRsZU9wdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8hIGF0dHJpYnV0ZSBhbmQvb3IgY2xhc3Mgc2V0dGVycy9nZXR0ZXJzXG4gIHJlYWRvbmx5IG11bHRpc2VsZWN0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGFueT4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2ID0+IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KSB9KTtcbiAgcmVhZG9ubHkgY2xlYXJhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuICByZWFkb25seSBzZWFyY2hhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYW55PihmYWxzZSwgeyB0cmFuc2Zvcm06IHYgPT4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5zZWFyY2hhYmxlKCkgJiYgdGhpcy5zZWFyY2hUZXJtKCkgIT09ICcnKTtcblxuICByZWFkb25seSB0b3VjaGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyEgY3VzdG9tIG9wdGlvbnNcbiAgcHJpdmF0ZSBfZGVmYXVsdEFkZEN1c3RvbUZuOiBBZGRDdXN0b21Gbjxhbnk+ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlO1xuXG4gIHJlYWRvbmx5IGFkZEN1c3RvbSA9IGlucHV0PFxuICAgIGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4sXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+XG4gID4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IHYgPT4ge1xuICAgICAgaWYgKGlzRnVuY3Rpb24odikpIHtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9XG4gICAgICAvL2NvZXJjZSB0aGUgdmFsdWUgaW50byBhIGJvb2xlYW5cbiAgICAgIC8vaWYgXCJ0cnVlXCIsIHVzZSB0aGUgZGVmYXVsdCBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0byBcImZhbHNlXCIuXG4gICAgICByZXR1cm4gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpICYmIHRoaXMuX2RlZmF1bHRBZGRDdXN0b21GbjtcbiAgICB9LFxuICB9KTtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0FkZEN1c3RvbSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuYWRkQ3VzdG9tKCkgIT09IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNGb3VuZCgpXG4gICk7XG5cbiAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhYyA9IHRoaXMuYWRkQ3VzdG9tKCk7XG4gICAgaWYgKCFhYykgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3T3B0aW9uT2JqID0gYXdhaXQgdGhpcy5pdGVtU3RvcmFnZS5hZGRDdXN0b21PcHRpb24odmFsdWUsIGFjKTtcblxuICAgIHRoaXMuc2VsZWN0SXRlbShuZXdPcHRpb25PYmopO1xuICB9XG5cbiAgLy8hIGNvbnRyb2wgdmFsdWUgYWNjZXNzb3JcbiAgLy9vdmVycmlkZSB0aGUgd3JpdGVWYWx1ZSBhbmQgc2V0RGlzYWJsZWRTdGF0ZSBkZWZpbmVkIGluIF9OZ01vZGVsQ29tcG9uZW50XG4gIG92ZXJyaWRlIHNldERpc2FibGVkU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHN0YXRlO1xuICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbCk7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgLy8hIGNoYW5nZSAmIHRvdWNoIGV2ZW50IGVtaXR0ZXJzXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UudmFsdWUoKTtcbiAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX29uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdWNoZWQuc2V0KHRydWUpO1xuICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICB9XG5cbiAgLy8hIHZhbHVlIGlucHV0ICYgb3V0cHV0XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIGlmIChpc0FueVN0cmluZyhuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eShuZXdWYWx1ZSk7XG4gICAgLy9pZiBpdCBpcyBub3QgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSwganVzdCBwdXQgaXQgaW4gYW4gYXJyYXlcbiAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IFNpZ25hbDxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueVtdPigpO1xuXG4gIC8vISBvdXRwdXQgZXZlbnRzXG4gIHJlYWRvbmx5IGNoYW5nZUV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnY2hhbmdlJyB9KTtcbiAgcmVhZG9ubHkgYWRkRXZlbnQgPSBvdXRwdXQ8YW55W10+KHsgYWxpYXM6ICdhZGQnIH0pO1xuICByZWFkb25seSBmYWlsZWRUb0FkZEV2ZW50ID0gb3V0cHV0PGFueVtdPih7IGFsaWFzOiAnZmFpbGVkVG9BZGQnIH0pO1xuICByZWFkb25seSByZW1vdmVFdmVudCA9IG91dHB1dDxhbnlbXT4oeyBhbGlhczogJ3JlbW92ZScgfSk7XG4gIHJlYWRvbmx5IGNsZWFyRXZlbnQgPSBvdXRwdXQ8dm9pZD4oeyBhbGlhczogJ2NsZWFyJyB9KTtcbiAgcmVhZG9ubHkgb3BlbkV2ZW50ID0gb3V0cHV0PHZvaWQ+KHsgYWxpYXM6ICdvcGVuJyB9KTtcbiAgcmVhZG9ubHkgY2xvc2VFdmVudCA9IG91dHB1dDx2b2lkPih7IGFsaWFzOiAnY2xvc2UnIH0pO1xuICByZWFkb25seSBzY3JvbGxFdmVudCA9IG91dHB1dDx7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgfT4oeyBhbGlhczogJ3Njcm9sbCcgfSk7XG4gIHJlYWRvbmx5IHNjcm9sbFRvRW5kRXZlbnQgPSBvdXRwdXQoeyBhbGlhczogJ3Njcm9sbFRvRW5kJyB9KTtcbiAgcmVhZG9ubHkgc2VhcmNoRXZlbnQgPSBvdXRwdXQ8e1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIG1hdGNoaW5nOiBhbnlbXTtcbiAgfT4oeyBhbGlhczogJ3NlYXJjaCcgfSk7XG5cbiAgcmVhZG9ubHkgaXNPcGVuID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vISB2aWV3IGNoaWxkcmVuXG4gIHJlYWRvbmx5IHNlYXJjaElucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBkcm9wZG93blBhbmVsID0gdmlld0NoaWxkPEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQ+KEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQpO1xuXG4gIC8vISB0ZW1wbGF0ZXNcbiAgcmVhZG9ubHkgb3B0aW9uVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkT3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBvcHRncm91cFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSB2YWx1ZVRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBwbGFjZWhvbGRlclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duSGVhZGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duRm9vdGVyVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IG5vSXRlbXNGb3VuZFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZE5vSXRlbXNGb3VuZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgYWRkQ3VzdG9tVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBpdGVtTGltaXRSZWFjaGVkVGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkSXRlbUxpbWl0UmVhY2hlZFRlbXBsYXRlRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgaXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlID0gY29udGVudENoaWxkKEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgcHJlZml4VGVtcGxhdGUgPSBjb250ZW50Q2hpbGQoQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUpO1xuICByZWFkb25seSBzdWZmaXhUZW1wbGF0ZSA9IGNvbnRlbnRDaGlsZChBcmRTZWxlY3RTdWZmaXhUZW1wbGF0ZURpcmVjdGl2ZSk7XG5cbiAgLy8hIGNvbnRleHQgcHJvdmlkZXJzXG4gIGdldFZhbHVlQ29udGV4dChpdGVtOiBBcmRPcHRpb24pOiBWYWx1ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBpdGVtLFxuICAgICAgaXRlbURhdGE6IGl0ZW0uaXRlbURhdGEoKSxcbiAgICAgIHVuc2VsZWN0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJlYWRvbmx5IGdldFN0YXRzQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTdGF0c0NvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zKCksXG4gICAgfSlcbiAgKTtcbiAgcmVhZG9ubHkgZ2V0U2VhcmNoQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBTZWFyY2hDb250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMoKSxcbiAgICAgIGZvdW5kSXRlbXM6IHRoaXMuZm91bmRJdGVtcygpLFxuICAgIH0pXG4gICk7XG4gIHJlYWRvbmx5IGdldFBsYWNlaG9sZGVyQ29udGV4dCA9IGNvbXB1dGVkKCgpOiBQbGFjZWhvbGRlckNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlckZvckN1cnJlbnRDb250ZXh0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCA9IGNvbXB1dGVkKFxuICAgICgpOiBDdXN0b21PcHRpb25Db250ZXh0ID0+ICh7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuc2VhcmNoVGVybSgpLFxuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtKCksXG4gICAgfSlcbiAgKTtcbiAgZ2V0R3JvdXBDb250ZXh0KGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEdyb3VwQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICBncm91cCxcbiAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuKCkuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCgpKS5sZW5ndGgsXG4gICAgICB0b3RhbENoaWxkcmVuOiBncm91cC5jaGlsZHJlbigpLmxlbmd0aCxcbiAgICB9O1xuICB9XG4gIGdldE9wdGlvbkNvbnRleHQoaXRlbTogQXJkT3B0aW9uKTogT3B0aW9uQ29udGV4dDxBcmRPcHRpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBpdGVtLFxuICAgICAgaXRlbSxcbiAgICAgIGl0ZW1EYXRhOiBpdGVtLml0ZW1EYXRhKCksXG4gICAgfTtcbiAgfVxuICByZWFkb25seSBnZXRJdGVtTGltaXRDb250ZXh0ID0gY29tcHV0ZWQoXG4gICAgKCk6IEl0ZW1MaW1pdENvbnRleHQgPT4gKHtcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcygpLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICB9KVxuICApO1xuICByZWFkb25seSBnZXRJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9IGNvbXB1dGVkKCgpOiBJdGVtRGlzcGxheUxpbWl0Q29udGV4dCA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zKCksXG4gICAgICBzZWxlY3RlZEl0ZW1zLFxuICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMoKSxcbiAgICAgIG92ZXJmbG93Q291bnQ6IHNlbGVjdGVkSXRlbXMgLSAodGhpcy5pdGVtRGlzcGxheUxpbWl0KCkgPz8gMCksXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxTdHJhdGVneU9wdHMgPSBpbmplY3QoU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKTtcblxuICAvLyEgZHJvcGRvd24gb3ZlcmxheVxuICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZHJvcGRvd25Ib3N0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgZHJvcGRvd25PdmVybGF5PzogT3ZlcmxheVJlZjtcblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5kcm9wZG93bkhvc3QpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5T3B0cy5ibG9jaygpLFxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5kcm9wZG93blRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIHRoaXMuZHJvcGRvd25PdmVybGF5LmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuICBwcml2YXRlIF9kZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PdmVybGF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgZGVsZXRlIHRoaXMuZHJvcGRvd25PdmVybGF5O1xuICB9XG5cbiAgc2V0T3ZlcmxheVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcGRvd25Ib3N0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5kcm9wZG93bk92ZXJsYXkudXBkYXRlU2l6ZSh7IHdpZHRoOiByZWN0LndpZHRoIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgfVxuXG4gIC8vISBob29rc1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKCkpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0l0ZW1zSW5wdXRVc2VkKSB7XG4gICAgICB0aGlzLl9zZXRJdGVtc0Zyb21Db21wb25lbnRzKCk7XG4gICAgfVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL2ZpcmUgaXRlbXMgbG9hZCBoYW5kbGVyIHdoZW4gbG9hZGluZyBpcyBzZXQgdG8gZmFsc2VcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddKSB7XG4gICAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddLmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25JdGVtc0xvYWQoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcHJpbnRQcmltaXRpdmVXYXJuaW5ncygpIHtcbiAgICBmdW5jdGlvbiBtYWtlV2FybmluZyhzdHI6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEFSRC1XQTAwMCR7ZXJyb3JDb2RlfTogU2tpcHBlZCB1c2luZyBbJHtzdHJ9XSBwcm9wZXJ0eSBib3VuZCB0byA8YXJkLXNlbGVjdD4sIGFzIHNvbWUgcHJvdmlkZWQgaXRlbXMgYXJlIG9mIHByaW1pdGl2ZSB0eXBlYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCd2YWx1ZUZyb20nLCAnNWEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWxGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdsYWJlbEZyb20nLCAnNWInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdkaXNhYmxlZEZyb20nLCAnNWMnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBMYWJlbEZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwTGFiZWxGcm9tJywgJzVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWRGcm9tKCkpIHtcbiAgICAgIG1ha2VXYXJuaW5nKCdncm91cERpc2FibGVkRnJvbScsICc1ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGlsZHJlbkZyb20oKSkge1xuICAgICAgbWFrZVdhcm5pbmcoJ2NoaWxkcmVuRnJvbScsICc1ZicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnZlcnREaXNhYmxlZCgpKSB7XG4gICAgICBtYWtlV2FybmluZygnaW52ZXJ0RGlzYWJsZWQnLCAnNWcnKTtcbiAgICB9XG4gIH1cblxuICAvLyEgZ2V0dGVyc1xuICByZWFkb25seSBmaXJzdEhpZ2hsaWdodGVkSXRlbSA9IGNvbXB1dGVkPEFyZE9wdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCk/LmZpcnN0KCkpO1xuICByZWFkb25seSBzaG91bGREaXNwbGF5UGxhY2Vob2xkZXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpICYmICF0aGlzLnNlYXJjaFRlcm0oKSk7XG4gIHJlYWRvbmx5IHNob3VsZERpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQoKSAmJiAoIXRoaXMuc2VhcmNoVGVybSgpIHx8IHRoaXMubXVsdGlzZWxlY3RhYmxlKCkpXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbGVhckJ1dHRvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuY2xlYXJhYmxlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSAmJiAodGhpcy5pdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpIHx8IHRoaXMuc2VhcmNoVGVybSgpICE9PSAnJylcbiAgKTtcbiAgcmVhZG9ubHkgaXRlbXNUb0Rpc3BsYXkgPSBjb21wdXRlZDxJdGVyYWJsZUl0ZXJhdG9yPEFyZE9wdGlvbkdyb3VwPj4oKCkgPT4gdGhpcy5pdGVtU3RvcmFnZS5ncm91cHMoKS52YWx1ZXMoKSk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dOb0l0ZW1zRm91bmQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc0ZvdW5kKCkgJiYgIXRoaXMuaXNMb2FkaW5nKCkgJiYgIXRoaXMuc2hvdWxkU2hvd0FkZEN1c3RvbSgpXG4gICk7XG4gIHJlYWRvbmx5IHRvdGFsSXRlbXMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuaXRlbVN0b3JhZ2UuaXRlbXMoKS5sZW5ndGgpO1xuICByZWFkb25seSBmb3VuZEl0ZW1zID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PlxuICAgIHRoaXMuc2VhcmNoYWJsZSgpID8gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoIDogdW5kZWZpbmVkXG4gICk7XG4gIHJlYWRvbmx5IHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT5cbiAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiZcbiAgICAgIHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpICE9PSBJbmZpbml0eSAmJlxuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gdGhpcy5pdGVtRGlzcGxheUxpbWl0KClcbiAgKTtcbiAgcmVhZG9ubHkgaXNJbnB1dEVsZW1lbnRSZWFkb25seSA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+ICF0aGlzLmFkZEN1c3RvbSgpICYmICghdGhpcy5zZWFyY2hhYmxlKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc0l0ZW1MaW1pdFJlYWNoZWQoKSlcbiAgKTtcblxuICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLml0ZW1EaXNwbGF5TGltaXQoKSA9PT0gSW5maW5pdHkgfHwgaSA8IHRoaXMuaXRlbURpc3BsYXlMaW1pdCgpO1xuICB9XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyRm9yQ3VycmVudENvbnRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlcigpICYmIHRoaXMuc2VhcmNoYWJsZSgpICYmICh0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKCkgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKCkpKVxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpO1xuICB9KTtcblxuICAvLyEgc2VhcmNoIGlucHV0IGV2ZW50IGhhbmRsZXJzXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcsIHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoZmlsdGVyVGVybSk7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLml0ZW1TdG9yYWdlLmZpbHRlcihmaWx0ZXJUZXJtKTtcbiAgICBpZiAoIXN1cHByZXNzU2VhcmNoRXZlbnQpIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh7IHNlYXJjaDogZmlsdGVyVGVybSwgbWF0Y2hpbmcgfSk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgb25TZWFyY2hJbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KHRydWUpO1xuICB9XG4gIG9uU2VhcmNoSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCgpKSByZXR1cm47XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcblxuICAgIHRoaXMuX3NlYXJjaEJhckZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgfVxuICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgdG9nZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICB9XG4gIHNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgY29uc3QgW3NlbGVjdGVkLCB1bnNlbGVjdGVkLCBmYWlsZWRUb1NlbGVjdF0gPSB0aGlzLml0ZW1TdG9yYWdlLnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRFdmVudC5lbWl0KHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgaWYgKCF0aGlzLmtlZXBTZWFyY2hBZnRlclNlbGVjdCgpKSB0aGlzLl9jbGVhclNlYXJjaCh0cnVlKTtcblxuICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuKCkgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVuc2VsZWN0ZWQubGVuZ3RoID4gMCB8fCBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHVuc2VsZWN0SXRlbSguLi5pdGVtczogQXJkT3B0aW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KHVuc2VsZWN0ZWQpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KCkpIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICBpZiAoIXRoaXMua2VlcE9wZW4oKSB8fCB0aGlzLml0ZW1TdG9yYWdlLmlzTm9JdGVtc1RvU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJBbGxJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgdGhpcy5mb2N1cygpO1xuXG4gICAgdGhpcy5jbGVhckV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICB9XG4gIHByaXZhdGUgX2NsZWFyTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckxhc3RTZWxlY3RlZCgpLnZhbHVlKCk7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoW2NsZWFyZWRWYWx1ZV0pO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgfVxuICAvLyEgaGlnaGxpZ2gtcmVsYXRlZFxuICBvbk1vdXNlTW92ZSgpIHtcbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwTW91c2VvdmVyKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdGFibGUoKSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKCkpIHJldHVybjtcbiAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEdyb3VwKGdyb3VwKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBvbkl0ZW1Nb3VzZUVudGVyKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCgpKSByZXR1cm47XG4gICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRTaW5nbGVJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgb25JdGVtTW91c2VMZWF2ZShvcHRpb246IEFyZE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VCZWluZ1VzZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UudW5oaWdobGlnaHRJdGVtKG9wdGlvbik7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzQ2xpY2tlZFdpdGhpbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIG9uSXRlbUNsaWNrKG9wdGlvbjogQXJkT3B0aW9uLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpKSB0aGlzLnRvZ2dsZUl0ZW0ob3B0aW9uKTtcbiAgICBlbHNlIHRoaXMuc2VsZWN0SXRlbShvcHRpb24pO1xuXG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldCh0cnVlKTtcbiAgfVxuICBvbkdyb3VwQ2xpY2soZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSgpIHx8IHRoaXMubm9Hcm91cEFjdGlvbnMoKSkgcmV0dXJuO1xuICAgIGlmIChncm91cC5jaGlsZHJlbigpLmV2ZXJ5KG8gPT4gby5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMudW5zZWxlY3RJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oLi4uZ3JvdXAuY2hpbGRyZW4oKSk7XG5cbiAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4uc2V0KHRydWUpO1xuICB9XG4gIGhhbmRsZUNsZWFyQnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtKCkpIHtcbiAgICAgIHRoaXMuX2NsZWFyU2VhcmNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgfVxuICBoYW5kbGVEcm9wZG93bkFycm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICB9XG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIGhhbmRsZUFueXdoZXJlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC50YWdOYW1lICE9PSAnSU5QVVQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbi5zZXQodHJ1ZSk7XG5cbiAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQoKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYXJjaGFibGUoKSkge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnKVxuICBvbk1vdXNldXAoKTogdm9pZCB7XG4gICAgdGhpcy5faXNDbGlja2VkV2l0aGluLnNldChmYWxzZSk7XG4gIH1cbiAgLy8hIGRyb3Bkb3duIHN0YXRlIGhhbmRsZXJzXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dG9IaWdobGlnaHRGaXJzdCgpKSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuXG4gICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZm9jdXMoKTtcblxuICAgIHRoaXMub3BlbkV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLl9kZXN0cm95T3ZlcmxheSgpO1xuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICAvLyEgQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoISh0aGlzLl9jZCBhcyBhbnkpLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICAvLyEgc2VhcmNoXG4gIHByaXZhdGUgX2NsZWFyU2VhcmNoKHN1cHByZXNzU2VhcmNoRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3NldFNlYXJjaCgnJywgc3VwcHJlc3NTZWFyY2hFdmVudCk7XG4gIH1cbiAgcHJpdmF0ZSBfc2V0U2VhcmNoKHNlYXJjaFRlcm06IHN0cmluZywgc3VwcHJlc3NTZWFyY2hFdmVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChzZWFyY2hUZXJtKTtcbiAgICB0aGlzLmZpbHRlcihzZWFyY2hUZXJtLCBzdXBwcmVzc1NlYXJjaEV2ZW50KTtcbiAgfVxuICBwcml2YXRlIF9zZXRTZWFyY2hJbnB1dEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaElucHV0KCkhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIGF1dG9jb3JyZWN0OiAnb2ZmJyxcbiAgICAgIGF1dG9jYXBpdGFsaXplOiAnb2ZmJyxcbiAgICAgIGF1dG9jb21wbGV0ZTogJ29mZicsXG4gICAgICAuLi50aGlzLmlucHV0QXR0cnMoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuX29uRW50ZXJQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICB0aGlzLl9vblNwYWNlUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICB0aGlzLl9vbkFycm93VXBQcmVzcyhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgICAgdGhpcy5fb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc2hvdWxkQ2xvc2UgPSB0cnVlO1xuXG4gICAgLy9zZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLmZpcnN0SGlnaGxpZ2h0ZWRJdGVtKCkpIHtcbiAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSgpICYmIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oLi4udGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRlZEl0ZW1zKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcygpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9hZGQgYSBjdXN0b20gb3B0aW9uXG4gICAgZWxzZSBpZiAodGhpcy5pc09wZW4oKSAmJiB0aGlzLnNob3VsZFNob3dBZGRDdXN0b20oKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDdXN0b21PcHRpb24odGhpcy5zZWFyY2hUZXJtKCkpO1xuICAgIH1cbiAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgIGVsc2Ugc2hvdWxkQ2xvc2UgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5rZWVwT3BlbigpICYmIHNob3VsZENsb3NlKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfb25TcGFjZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd0Rvd25QcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG5cbiAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkLnNldChmYWxzZSk7XG5cbiAgICBjb25zdCByZWNlbnRseUhpZ2hsaWdodGVkID0gdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHROZXh0SXRlbSgrMSwgZXZlbnQuc2hpZnRLZXkpO1xuICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25BcnJvd1VwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZC5zZXQoZmFsc2UpO1xuXG4gICAgY29uc3QgcmVjZW50bHlIaWdobGlnaHRlZCA9IHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0TmV4dEl0ZW0oLTEsIGV2ZW50LnNoaWZ0S2V5KTtcbiAgICBpZiAocmVjZW50bHlIaWdobGlnaHRlZCkge1xuICAgICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNPcGVuKCkgfHxcbiAgICAgICh0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9PSAwICYmIHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPT0gMClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU3RvcmFnZS5zZXRSZWNlbnRseUhpZ2hsaWdodGVkKHJlY2VudGx5SGlnaGxpZ2h0ZWQpO1xuICAgIHRoaXMuZHJvcGRvd25QYW5lbCgpPy5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICB9XG4gIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc09wZW4oKSB8fFxuICAgICAgKHRoaXMuc2VhcmNoSW5wdXQoKT8ubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aCAmJlxuICAgICAgICB0aGlzLnNlYXJjaElucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VhcmNoVGVybSgpLmxlbmd0aClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2lzTW91c2VCZWluZ1VzZWQuc2V0KGZhbHNlKTtcblxuICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodExhc3RJdGVtKCk7XG4gICAgaWYgKCFyZWNlbnRseUhpZ2hsaWdodGVkKSByZXR1cm47XG5cbiAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgdGhpcy5kcm9wZG93blBhbmVsKCk/LnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gIH1cbiAgcHJpdmF0ZSBfb25CYWNrc3BhY2VPckRlbGV0ZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGVybSgpIHx8ICF0aGlzLmNsZWFyYWJsZSgpIHx8IHRoaXMubm9CYWNrc3BhY2VDbGVhcigpIHx8ICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlKCkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY2xlYXJMYXN0SXRlbSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFsbEl0ZW1zKCk7XG4gIH1cbiAgcHJpdmF0ZSBfb25DdHJsQVByZXNzKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0QWxsSXRlbXMoKTtcbiAgfVxufVxuIiwiPGFyZC1mb3JtLWZpZWxkLWZyYW1lXHJcbiAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZSgpXCJcclxuICBbdmFyaWFudF09XCJ2YXJpYW50KClcIlxyXG4gIFtjb21wYWN0XT1cImNvbXBhY3QoKVwiXHJcbiAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gIFtwcmVmaXhUZW1wbGF0ZV09XCJwcmVmaXhUZW1wbGF0ZSgpPy50ZW1wbGF0ZVwiXHJcbiAgW3N1ZmZpeFRlbXBsYXRlXT1cInN1ZmZpeFRlbXBsYXRlKCk/LnRlbXBsYXRlXCJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiYXJkLXNlbGVjdFwiXHJcbiAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAoY2xpY2spPVwiaGFuZGxlQW55d2hlcmVDbGljaygkZXZlbnQpXCJcclxuICAgIFtjbGFzcy5hcmQtaGFzLXZhbHVlXT1cIml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKClcIlxyXG4gICAgW25nQ2xhc3NdPVwibmdDbGFzc2VzKClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0LXZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICBAaWYgKHNob3VsZERpc3BsYXlQbGFjZWhvbGRlcigpKSB7XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXBsYWNlaG9sZGVyXCI+e3sgcGxhY2Vob2xkZXIoKSB9fTwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwbGFjZWhvbGRlclRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRQbGFjZWhvbGRlclRlbXBsYXRlXCIgLz5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHNob3VsZERpc3BsYXlWYWx1ZSgpKSB7XHJcbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zKCk7IHRyYWNrIGl0ZW0uaW5kZXgoKSkge1xyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1zZWxlY3QtdmFsdWVcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYXJkLXZhbHVlLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWQoKVwiXHJcbiAgICAgICAgICAgIFthdHRyLmhpZGRlbl09XCIhaXNWYWx1ZVdpdGhpbkRpc3BsYXlMaW1pdCgkaW5kZXgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KCRpbmRleClcIlxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZhbHVlVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgKG11bHRpc2VsZWN0YWJsZSgpID8gZGVmYXVsdE11bHRpVmFsdWVUZW1wbGF0ZSA6IGRlZmF1bHRWYWx1ZVRlbXBsYXRlKVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFZhbHVlQ29udGV4dChpdGVtKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgI2RlZmF1bHRWYWx1ZVRlbXBsYXRlXHJcbiAgICAgICAgICBsZXQtaXRlbVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJpdGVtLmxhYmVsKClcIlxyXG4gICAgICAgICAgICBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIlxyXG4gICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAjZGVmYXVsdE11bHRpVmFsdWVUZW1wbGF0ZVxyXG4gICAgICAgICAgbGV0LWl0ZW1cclxuICAgICAgICAgIGxldC11bnNlbGVjdD1cInVuc2VsZWN0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YXJkLWRlbGV0YWJsZS1jaGlwXHJcbiAgICAgICAgICAgIChkZWxldGUpPVwidW5zZWxlY3QoaXRlbSlcIlxyXG4gICAgICAgICAgICBbdmFyaWFudF09XCJ2YXJpYW50KClcIlxyXG4gICAgICAgICAgICBjb21wYWN0XHJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lZC1zdHJvbmdcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJpdGVtLmxhYmVsKClcIlxyXG4gICAgICAgICAgICAgIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiXHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBUT0RPIGNoZWNrIGlmIGNhbiByZW1vdmUgZGl2IC0tPlxyXG4gICAgICAgICAgPC9hcmQtZGVsZXRhYmxlLWNoaXA+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChpdGVtU3RvcmFnZS5pc0FueUl0ZW1TZWxlY3RlZCgpICYmIHNob3VsZFNob3dJdGVtRGlzcGxheUxpbWl0KCkpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW92ZXJmbG93LWluZGljYXRvclwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KClcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgI2RlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVcclxuICAgICAgICAgICAgbGV0LWNvdW50PVwib3ZlcmZsb3dDb3VudFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+e3sgY291bnQgfX0gbW9yZS4uLjwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYXJkLXNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcclxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImlzT3BlbigpID8gaHRtbElkKCkgOiBudWxsXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgI3NlYXJjaElucHV0XHJcbiAgICAgICAgICAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgW2F0dHIuaWRdPVwic2VhcmNoSW5wdXRJZCgpXCJcclxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRhYkluZGV4KClcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cImlzSW5wdXRFbGVtZW50UmVhZG9ubHkoKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGVybSgpXCJcclxuICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlzT3BlbigpID8gaHRtbElkKCkgOiBudWxsXCJcclxuICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXIoc2VhcmNoSW5wdXQudmFsdWUpXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgKGZvY3VzKT1cIm9uU2VhcmNoSW5wdXRGb2N1cygpXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uU2VhcmNoSW5wdXRCbHVyKClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtY29udHJvbHNcIj5cclxuICAgICAgQGlmIChpc0xvYWRpbmcoKSkge1xyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdTcGlubmVyVGVtcGxhdGU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNpbXBsZS1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRpbmdTcGlubmVyVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdExvYWRpbmdTcGlubmVyVGVtcGxhdGVcIiAvPlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKHNob3VsZFNob3dDbGVhckJ1dHRvbigpKSB7XHJcbiAgICAgICAgPGFyZC1jbGVhci1idXR0b25cclxuICAgICAgICAgIFt0aXRsZV09XCJjbGVhckJ1dHRvblRpdGxlKClcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsZWFyQnV0dG9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93LXdyYXBwZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVEcm9wZG93bkFycm93Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWhpdGJveFwiPjwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2FyZC1mb3JtLWZpZWxkLWZyYW1lPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blRlbXBsYXRlPlxyXG4gIDxhcmQtZHJvcGRvd24tcGFuZWxcclxuICAgIGNsYXNzPVwiYXJkLWRyb3Bkb3duLXBhbmVsIGFyZC1zZWxlY3QtZHJvcGRvd24tcGFuZWxcIlxyXG4gICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgYXJpYS1sYWJlbD1cIk9wdGlvbnMgbGlzdFwiXHJcbiAgICBbaGVhZGVyVGVtcGxhdGVdPVwiZHJvcGRvd25IZWFkZXJUZW1wbGF0ZSgpPy50ZW1wbGF0ZSA/PyBudWxsXCJcclxuICAgIFtmb290ZXJUZW1wbGF0ZV09XCJkcm9wZG93bkZvb3RlclRlbXBsYXRlKCk/LnRlbXBsYXRlID8/IG51bGxcIlxyXG4gICAgW2FwcGVhcmFuY2VdPVwiZHJvcGRvd25BcHBlYXJhbmNlT3JEZWZhdWx0KClcIlxyXG4gICAgW3ZhcmlhbnRdPVwiZHJvcGRvd25WYXJpYW50T3JEZWZhdWx0KClcIlxyXG4gICAgW2lzT3Blbl09XCJ0cnVlXCJcclxuICAgIFtmaWx0ZXJWYWx1ZV09XCJzZWFyY2hUZXJtKClcIlxyXG4gICAgW3BhbmVsSWRdPVwiaHRtbElkKClcIlxyXG4gICAgW2NvbXBhY3RdPVwiY29tcGFjdCgpXCJcclxuICAgIChhcmRDbGlja091dHNpZGUpPVwiaGFuZGxlT3V0c2lkZUNsaWNrKCRldmVudClcIlxyXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgpXCJcclxuICAgIChzY3JvbGwpPVwic2Nyb2xsRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgIChzY3JvbGxUb0VuZCk9XCJzY3JvbGxUb0VuZEV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgQGlmICghc2hvdWxkU2hvd05vSXRlbXNGb3VuZCgpKSB7XHJcbiAgICAgIEBmb3IgKGdyb3VwIG9mIGl0ZW1TdG9yYWdlLmdyb3VwcygpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImFyZC1vcHRncm91cFwiXHJcbiAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1kaXNhYmxlZF09XCJncm91cC5kaXNhYmxlZCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtc2VsZWN0ZWRdPVwiZ3JvdXAuc2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWhpZ2hsaWdodGVkXT1cImdyb3VwLmhpZ2hsaWdodGVkKClcIlxyXG4gICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkdyb3VwTW91c2VvdmVyKGdyb3VwKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGdyb3VwKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQGlmIChncm91cC5sYWJlbCgpICE9PSAnJyAmJiBncm91cC5sYWJlbCgpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgI2RlZmF1bHRPcHRncm91cFRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgbGV0LWdyb3VwXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtb3B0Z3JvdXAtbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW2FyZElubmVySFRNTF09XCJncm91cC5sYWJlbCgpXCJcclxuICAgICAgICAgICAgICAgIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiXHJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGdyb3VwVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRHcm91cENvbnRleHQoZ3JvdXApXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGdyb3VwLWNoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBncm91cC5jaGlsZHJlbigpOyB0cmFjayBvcHRpb24uaW5kZXgoKSkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkXT1cIm9wdGlvbi5oaWdobGlnaHRlZCgpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkLXJlY2VudF09XCJvcHRpb24uaGlnaGxpZ2h0ZWRfcmVjZW50bHkoKVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImh0bWxJZCgpICsgJy0nICsgb3B0aW9uLmluZGV4KClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKG9wdGlvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm9uSXRlbU1vdXNlT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uSXRlbU1vdXNlRW50ZXIob3B0aW9uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uSXRlbU1vdXNlTGVhdmUob3B0aW9uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAjZGVmYXVsdE9wdGlvblRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgIFthcmRJbm5lckhUTUxdPVwib3B0aW9uLmxhYmVsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uVGVtcGxhdGUoKT8udGVtcGxhdGUgfHwgZGVmYXVsdE9wdGlvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0T3B0aW9uQ29udGV4dChvcHRpb24pXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoc2hvdWxkU2hvd05vSXRlbXNGb3VuZCgpKSB7XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3B0aW9uIGFyZC1vcHRpb24tZGlzYWJsZWRcIj57eyBub0l0ZW1zRm91bmRUZXh0KCkgfX08L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vSXRlbXNGb3VuZFRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHROb0l0ZW1zRm91bmRUZW1wbGF0ZVwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFNlYXJjaENvbnRleHQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93QWRkQ3VzdG9tKCkpIHtcclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgI2RlZmF1bHRBZGRDdXN0b21UZW1wbGF0ZVxyXG4gICAgICAgIGxldC1zZWFyY2hUZXJtXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1oaWdobGlnaHRlZCBhcmQtYWRkLWN1c3RvbVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkQ3VzdG9tT3B0aW9uKHNlYXJjaFRlcm0pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1hZGQtY3VzdG9tLWxhYmVsXCI+QWRkIG9wdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tdmFsdWVcIj5cInt7IHNlYXJjaFRlcm0gfX1cIjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZEN1c3RvbVRlbXBsYXRlKCk/LnRlbXBsYXRlIHx8IGRlZmF1bHRBZGRDdXN0b21UZW1wbGF0ZVwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEN1c3RvbU9wdGlvbkNvbnRleHQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmIChpc0xvYWRpbmcoKSkge1xyXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWRpc2FibGVkXCI+e3sgbG9hZGluZ1BsYWNlaG9sZGVyVGV4dCgpIH19PC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nUGxhY2Vob2xkZXJUZW1wbGF0ZSgpPy50ZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIlxyXG4gICAgICAvPlxyXG4gICAgfVxyXG4gIDwvYXJkLWRyb3Bkb3duLXBhbmVsPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=