UNPKG

ngx-mat-lib

Version:

A bunch of utilities and components to use in your Angular 7+ apps!

418 lines (417 loc) 43.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ // tslint:disable:member-ordering import * as tslib_1 from "tslib"; import { Component, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, NgZone, ViewChild, Input, Optional, ContentChildren, QueryList, forwardRef, Directive, Inject, Attribute, } from "@angular/core"; import { ANIMATION_MODULE_TYPE } from "@angular/platform-browser/animations"; import { Directionality } from "@angular/cdk/bidi"; import { coerceBooleanProperty } from "@angular/cdk/coercion"; import { ViewportRuler } from "@angular/cdk/overlay"; import { FocusMonitor } from "@angular/cdk/a11y"; import { Platform } from "@angular/cdk/platform"; import { mixinDisableRipple, MAT_RIPPLE_GLOBAL_OPTIONS, RippleRenderer, mixinTabIndex, mixinDisabled, } from "@angular/material/core"; import { XmatInkBarDirective } from "./xmat-ink-bar.directive"; import { XmatPaginatedTabHeaderDirective } from "./xmat-paginated-tab-header"; import { takeUntil, startWith } from "rxjs/operators"; /** * Base class with all of the `MatTabNav` functionality. * \@docs-private * @abstract */ var _XmatTabNavBase = /** @class */ (function (_super) { tslib_1.__extends(_XmatTabNavBase, _super); function _XmatTabNavBase(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, /** * @deprecated @breaking-change 9.0.0 `platform` parameter to become required. */ platform, animationMode) { var _this = _super.call(this, elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) || this; _this._disableRipple = false; /** * Theme color of the nav bar. */ _this.color = "primary"; return _this; } Object.defineProperty(_XmatTabNavBase.prototype, "backgroundColor", { /** Background color of the tab nav. */ get: /** * Background color of the tab nav. * @return {?} */ function () { return this._backgroundColor; }, set: /** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var classList = this._elementRef.nativeElement.classList; classList.remove("mat-background-" + this.backgroundColor); if (value) { classList.add("mat-background-" + value); } this._backgroundColor = value; }, enumerable: true, configurable: true }); Object.defineProperty(_XmatTabNavBase.prototype, "disableRipple", { /** Whether the ripple effect is disabled or not. */ get: /** * Whether the ripple effect is disabled or not. * @return {?} */ function () { return this._disableRipple; }, set: /** * @param {?} value * @return {?} */ function (value) { this._disableRipple = coerceBooleanProperty(value); }, enumerable: true, configurable: true }); /** * @return {?} */ _XmatTabNavBase.prototype._itemSelected = /** * @return {?} */ function () { // noop }; /** * @return {?} */ _XmatTabNavBase.prototype.ngAfterContentInit = /** * @return {?} */ function () { var _this = this; // We need this to run before the `changes` subscription in parent to ensure that the // selectedIndex is up-to-date by the time the super class starts looking for it. this._items.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(function () { _this.updateActiveLink(); }); _super.prototype.ngAfterContentInit.call(this); }; /** * Notifies the component that the active link has been changed. * @breaking-change 8.0.0 `element` parameter to be removed. */ /** * Notifies the component that the active link has been changed. * \@breaking-change 8.0.0 `element` parameter to be removed. * @param {?=} _element * @return {?} */ _XmatTabNavBase.prototype.updateActiveLink = /** * Notifies the component that the active link has been changed. * \@breaking-change 8.0.0 `element` parameter to be removed. * @param {?=} _element * @return {?} */ function (_element) { if (!this._items) { return; } /** @type {?} */ var items = this._items.toArray(); for (var i = 0; i < items.length; i++) { if (items[i].active) { this.selectedIndex = i; this._changeDetectorRef.markForCheck(); return; } } // The ink bar should hide itself if no items are active. this.selectedIndex = -1; this._inkBar.hide(); }; /** @nocollapse */ _XmatTabNavBase.ctorParameters = function () { return [ { type: ElementRef }, { type: Directionality, decorators: [{ type: Optional }] }, { type: NgZone }, { type: ChangeDetectorRef }, { type: ViewportRuler }, { type: Platform, decorators: [{ type: Optional }] }, { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] } ]; }; _XmatTabNavBase.propDecorators = { backgroundColor: [{ type: Input }], disableRipple: [{ type: Input }], color: [{ type: Input }] }; return _XmatTabNavBase; }(XmatPaginatedTabHeaderDirective)); export { _XmatTabNavBase }; if (false) { /** * Query list of all tab links of the tab navigation. * @type {?} */ _XmatTabNavBase.prototype._items; /** @type {?} */ _XmatTabNavBase.prototype._backgroundColor; /** @type {?} */ _XmatTabNavBase.prototype._disableRipple; /** * Theme color of the nav bar. * @type {?} */ _XmatTabNavBase.prototype.color; } var XmatTabNavComponent = /** @class */ (function (_super) { tslib_1.__extends(XmatTabNavComponent, _super); function XmatTabNavComponent(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, /** * @deprecated @breaking-change 9.0.0 `platform` parameter to become required. */ platform, animationMode) { return _super.call(this, elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode) || this; } XmatTabNavComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: "[xmat-tab-nav-bar]", // tslint:disable-next-line:use-input-property-decorator inputs: ["color", "disableRipple"], template: "<div class=\"mat-tab-header-pagination mat-tab-header-pagination-before mat-elevation-z4\"\n #previousPaginator\n aria-hidden=\"true\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-tab-header-pagination-chevron\"></div>\n</div>\n\n<div class=\"mat-tab-link-container\" #tabListContainer (keydown)=\"_handleKeydown($event)\">\n <div class=\"mat-tab-list\" #tabList (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-tab-links\">\n <ng-content></ng-content>\n </div>\n <xmat-ink-bar></xmat-ink-bar>\n </div>\n</div>\n\n<div class=\"mat-tab-header-pagination mat-tab-header-pagination-after mat-elevation-z4\"\n #nextPaginator\n aria-hidden=\"true\"\n mat-ripple [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n (mousedown)=\"_handlePaginatorPress('after')\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-tab-header-pagination-chevron\"></div>\n</div>\n", // host: {"class": "mat-tab-nav-bar"}, host: { "class": "mat-tab-nav-bar mat-tab-header", "[class.mat-tab-header-pagination-controls-enabled]": "_showPaginationControls", "[class.mat-tab-header-rtl]": "_getLayoutDirection() == \"rtl\"", "[class.mat-primary]": "color !== \"warn\" && color !== \"accent\"", "[class.mat-accent]": "color === \"accent\"", "[class.mat-warn]": "color === \"warn\"", }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mat-tab-header{display:-webkit-box;display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-tab-header-pagination{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:none;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:transparent;touch-action:none}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:-webkit-box;display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.mat-tab-header-pagination-after,.mat-tab-header-rtl .mat-tab-header-pagination-before{padding-right:4px}.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;content:'';height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{-webkit-box-flex:1;flex-grow:1;position:relative;-webkit-transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1),-webkit-transform .5s cubic-bezier(.35,0,.25,1)}.mat-tab-links{display:-webkit-box;display:flex}[mat-align-tabs=center] .mat-tab-links{-webkit-box-pack:center;justify-content:center}[mat-align-tabs=end] .mat-tab-links{-webkit-box-pack:end;justify-content:flex-end}.mat-ink-bar{position:absolute;bottom:0;height:2px;-webkit-transition:.5s cubic-bezier(.35,0,.25,1);transition:.5s cubic-bezier(.35,0,.25,1)}._mat-animation-noopable.mat-ink-bar{-webkit-transition:none;transition:none;-webkit-animation:none;animation:none}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}@media (-ms-high-contrast:active){.mat-ink-bar{outline:solid 2px;height:0}}.mat-tab-link-container{display:-webkit-box;display:flex;-webkit-box-flex:1;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-link{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;white-space:nowrap;vertical-align:top;text-decoration:none;position:relative;overflow:hidden;-webkit-tap-highlight-color:transparent}.mat-tab-link:focus{outline:0}.mat-tab-link:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-link.mat-tab-disabled{cursor:default;pointer-events:none}.mat-tab-link .mat-tab-label-content{display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;white-space:nowrap}@media (-ms-high-contrast:active){.mat-tab-link:focus{outline:dotted 2px}.mat-tab-link.mat-tab-disabled{opacity:.5}.mat-tab-link{opacity:1}}[mat-stretch-tabs] .mat-tab-link{flex-basis:0;-webkit-box-flex:1;flex-grow:1}@media (max-width:599px){.mat-tab-link{min-width:72px}}"] }] } ]; /** @nocollapse */ XmatTabNavComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: Directionality, decorators: [{ type: Optional }] }, { type: NgZone }, { type: ChangeDetectorRef }, { type: ViewportRuler }, { type: Platform, decorators: [{ type: Optional }] }, { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] } ]; }; XmatTabNavComponent.propDecorators = { _items: [{ type: ContentChildren, args: [forwardRef(function () { return XmatTabLinkDirective; }), { descendants: true },] }], _inkBar: [{ type: ViewChild, args: [XmatInkBarDirective,] }], _tabListContainer: [{ type: ViewChild, args: ["tabListContainer",] }], _tabList: [{ type: ViewChild, args: ["tabList",] }], _nextPaginator: [{ type: ViewChild, args: ["nextPaginator",] }], _previousPaginator: [{ type: ViewChild, args: ["previousPaginator",] }] }; return XmatTabNavComponent; }(_XmatTabNavBase)); export { XmatTabNavComponent }; if (false) { /** @type {?} */ XmatTabNavComponent.prototype._items; /** @type {?} */ XmatTabNavComponent.prototype._inkBar; /** @type {?} */ XmatTabNavComponent.prototype._tabListContainer; /** @type {?} */ XmatTabNavComponent.prototype._tabList; /** @type {?} */ XmatTabNavComponent.prototype._nextPaginator; /** @type {?} */ XmatTabNavComponent.prototype._previousPaginator; } var XmatTabLinkMixinBase = /** @class */ (function () { function XmatTabLinkMixinBase() { } return XmatTabLinkMixinBase; }()); /** @type {?} */ var _XmatTabLinkMixinBase = mixinTabIndex(mixinDisableRipple(mixinDisabled(XmatTabLinkMixinBase))); /** * Base class with all of the `MatTabLink` functionality. */ var _XmatTabLinkBase = /** @class */ (function (_super) { tslib_1.__extends(_XmatTabLinkBase, _super); function _XmatTabLinkBase(_tabNavBar, elementRef, globalRippleOptions, tabIndex, _focusMonitor, animationMode) { var _this = _super.call(this) || this; _this._tabNavBar = _tabNavBar; _this.elementRef = elementRef; _this._focusMonitor = _focusMonitor; /** * Whether the tab link is active or not. */ _this._isActive = false; _this.rippleConfig = globalRippleOptions || {}; // tslint:disable-next-line:radix _this.tabIndex = parseInt(tabIndex) || 0; if (animationMode === "NoopAnimations") { _this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 }; } _focusMonitor.monitor(elementRef); return _this; } Object.defineProperty(_XmatTabLinkBase.prototype, "active", { /** Whether the link is active. */ get: /** * Whether the link is active. * @return {?} */ function () { return this._isActive; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value !== this._isActive) { this._isActive = value; this._tabNavBar.updateActiveLink(this.elementRef); } }, enumerable: true, configurable: true }); Object.defineProperty(_XmatTabLinkBase.prototype, "rippleDisabled", { /** * Whether ripples are disabled on interaction. * @docs-private */ get: /** * Whether ripples are disabled on interaction. * \@docs-private * @return {?} */ function () { return this.disabled || this.disableRipple || this._tabNavBar.disableRipple || !!this.rippleConfig.disabled; }, enumerable: true, configurable: true }); /** * @return {?} */ _XmatTabLinkBase.prototype.focus = /** * @return {?} */ function () { this.elementRef.nativeElement.focus(); }; /** * @return {?} */ _XmatTabLinkBase.prototype.ngOnDestroy = /** * @return {?} */ function () { this._focusMonitor.stopMonitoring(this.elementRef); }; /** @nocollapse */ _XmatTabLinkBase.ctorParameters = function () { return [ { type: _XmatTabNavBase }, { type: ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] }, { type: String, decorators: [{ type: Attribute, args: ["tabindex",] }] }, { type: FocusMonitor }, { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] } ]; }; _XmatTabLinkBase.propDecorators = { active: [{ type: Input }] }; return _XmatTabLinkBase; }(_XmatTabLinkMixinBase)); export { _XmatTabLinkBase }; if (false) { /** * Whether the tab link is active or not. * @type {?} */ _XmatTabLinkBase.prototype._isActive; /** * Ripple configuration for ripples that are launched on pointer down. The ripple config * is set to the global ripple options since we don't have any configurable options for * the tab link ripples. * \@docs-private * @type {?} */ _XmatTabLinkBase.prototype.rippleConfig; /** @type {?} */ _XmatTabLinkBase.prototype._tabNavBar; /** @type {?} */ _XmatTabLinkBase.prototype.elementRef; /** @type {?} */ _XmatTabLinkBase.prototype._focusMonitor; } /** * Link inside of a `mat-tab-nav-bar`. */ var XmatTabLinkDirective = /** @class */ (function (_super) { tslib_1.__extends(XmatTabLinkDirective, _super); function XmatTabLinkDirective(tabNavBar, elementRef, ngZone, platform, globalRippleOptions, tabIndex, focusMonitor, animationMode) { var _this = _super.call(this, tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode) || this; _this._tabLinkRipple = new RippleRenderer(_this, ngZone, elementRef, platform); _this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement); return _this; } /** * @return {?} */ XmatTabLinkDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { _super.prototype.ngOnDestroy.call(this); this._tabLinkRipple._removeTriggerEvents(); }; XmatTabLinkDirective.decorators = [ { type: Directive, args: [{ selector: "[xmat-tab-link], [xmatTabLink]", exportAs: "xmatTabLink", // tslint:disable-next-line:use-input-property-decorator inputs: ["disabled", "disableRipple", "tabIndex"], host: { "class": "mat-tab-link", "[attr.aria-current]": "active ? \"page\" : null", "[attr.aria-disabled]": "disabled", "[attr.tabIndex]": "tabIndex", "[class.mat-tab-disabled]": "disabled", "[class.mat-tab-label-active]": "active", } },] } ]; /** @nocollapse */ XmatTabLinkDirective.ctorParameters = function () { return [ { type: XmatTabNavComponent }, { type: ElementRef }, { type: NgZone }, { type: Platform }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] }, { type: String, decorators: [{ type: Attribute, args: ["tabindex",] }] }, { type: FocusMonitor }, { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] } ]; }; return XmatTabLinkDirective; }(_XmatTabLinkBase)); export { XmatTabLinkDirective }; if (false) { /** * Reference to the RippleRenderer for the tab-link. * @type {?} */ XmatTabLinkDirective.prototype._tabLinkRipple; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1uYXYtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMveG1hdC1uYXYtYmFyL3htYXQtbmF2LWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsT0FBTyxFQUNILFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUdSLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUVWLFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBa0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUtILGtCQUFrQixFQUtsQix5QkFBeUIsRUFFekIsY0FBYyxFQUNkLGFBQWEsRUFFYixhQUFhLEdBRWhCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFDLCtCQUErQixFQUE2QixNQUFNLDZCQUE2QixDQUFDO0FBRXhHLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7SUFPTiwyQ0FBK0I7SUF3Q3pFLHlCQUFZLFVBQXNC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QztvQkFDUCxRQUFRLEVBQUUsZ0NBQWdDO29CQUMxQyxRQUFRLEVBQUUsYUFBYTs7b0JBRXZCLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDO29CQUNqRCxJQUFJLEVBQUU7d0JBQ0YsT0FBTyxFQUFFLGNBQWM7d0JBQ3ZCLHFCQUFxQixFQUFFLDBCQUEwQjt3QkFDakQsc0JBQXNCLEVBQUUsVUFBVTt3QkFDbEMsaUJBQWlCLEVBQUUsVUFBVTt3QkFDN0IsMEJBQTBCLEVBQUUsVUFBVTt3QkFDdEMsOEJBQThCLEVBQUUsUUFBUTtxQkFDM0M7aUJBQ0o7Ozs7Z0JBTWtCLG1CQUFtQjtnQkExUmxDLFVBQVU7Z0JBQ1YsTUFBTTtnQkFtQkYsUUFBUTtnREF3UVAsUUFBUSxZQUFJLE1BQU0sU0FBQyx5QkFBeUI7NkNBQzVDLFNBQVMsU0FBQyxVQUFVO2dCQTFRckIsWUFBWTs2Q0EyUVgsUUFBUSxZQUFJLE1BQU0sU0FBQyxxQkFBcUI7OytCQXJTakQ7RUE0UjBDLGdCQUFnQjtTQUE3QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTptZW1iZXItb3JkZXJpbmdcblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBOZ1pvbmUsXG4gICAgVmlld0NoaWxkLFxuICAgIElucHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIE9uRGVzdHJveSxcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBRdWVyeUxpc3QsXG4gICAgZm9yd2FyZFJlZixcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBJbmplY3QsXG4gICAgQXR0cmlidXRlLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtBTklNQVRJT05fTU9EVUxFX1RZUEV9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnNcIjtcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gXCJAYW5ndWxhci9jZGsvYmlkaVwiO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7Vmlld3BvcnRSdWxlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQge0ZvY3VzTW9uaXRvciwgRm9jdXNhYmxlT3B0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gXCJAYW5ndWxhci9jZGsvcGxhdGZvcm1cIjtcbmltcG9ydCB7XG4gICAgVGhlbWVQYWxldHRlLFxuICAgIENhbkNvbG9yLFxuICAgIENhbkRpc2FibGVSaXBwbGUsXG4gICAgQ2FuRGlzYWJsZVJpcHBsZUN0b3IsXG4gICAgbWl4aW5EaXNhYmxlUmlwcGxlLFxuICAgIFJpcHBsZVRhcmdldCxcbiAgICBDYW5EaXNhYmxlLFxuICAgIEhhc1RhYkluZGV4LFxuICAgIFJpcHBsZUdsb2JhbE9wdGlvbnMsXG4gICAgTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUyxcbiAgICBSaXBwbGVDb25maWcsXG4gICAgUmlwcGxlUmVuZGVyZXIsXG4gICAgbWl4aW5UYWJJbmRleCxcbiAgICBDYW5EaXNhYmxlQ3RvcixcbiAgICBtaXhpbkRpc2FibGVkLFxuICAgIEhhc1RhYkluZGV4Q3Rvcixcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbi8vXG5pbXBvcnQge1htYXRJbmtCYXJEaXJlY3RpdmV9IGZyb20gXCIuL3htYXQtaW5rLWJhci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7WG1hdFBhZ2luYXRlZFRhYkhlYWRlckRpcmVjdGl2ZSwgWG1hdFBhZ2luYXRlZFRhYkhlYWRlckl0ZW19IGZyb20gXCIuL3htYXQtcGFnaW5hdGVkLXRhYi1oZWFkZXJcIjtcbi8vXG5pbXBvcnQge3Rha2VVbnRpbCwgc3RhcnRXaXRofSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIHdpdGggYWxsIG9mIHRoZSBgTWF0VGFiTmF2YCBmdW5jdGlvbmFsaXR5LlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bmFtaW5nLWNvbnZlbnRpb24gY2xhc3MtbmFtZVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIF9YbWF0VGFiTmF2QmFzZSBleHRlbmRzIFhtYXRQYWdpbmF0ZWRUYWJIZWFkZXJEaXJlY3RpdmVcbiAgICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvKiogUXVlcnkgbGlzdCBvZiBhbGwgdGFiIGxpbmtzIG9mIHRoZSB0YWIgbmF2aWdhdGlvbi4gKi9cbiAgICBhYnN0cmFjdCBfaXRlbXM6IFF1ZXJ5TGlzdDxYbWF0UGFnaW5hdGVkVGFiSGVhZGVySXRlbSAmIHsgYWN0aXZlOiBib29sZWFuIH0+O1xuXG4gICAgLyoqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYiBuYXYuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgYmFja2dyb3VuZENvbG9yKCk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZTogVGhlbWVQYWxldHRlKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYG1hdC1iYWNrZ3JvdW5kLSR7dGhpcy5iYWNrZ3JvdW5kQ29sb3J9YCk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGBtYXQtYmFja2dyb3VuZC0ke3ZhbHVlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOiBUaGVtZVBhbGV0dGU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcmlwcGxlIGVmZmVjdCBpcyBkaXNhYmxlZCBvciBub3QuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGU7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVSaXBwbGUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlUmlwcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlUmlwcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVGhlbWUgY29sb3Igb2YgdGhlIG5hdiBiYXIuICovXG4gICAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZSA9IFwicHJpbWFyeVwiO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBkaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHBsYXRmb3JtPzogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pdGVtU2VsZWN0ZWQoKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBydW4gYmVmb3JlIHRoZSBgY2hhbmdlc2Agc3Vic2NyaXB0aW9uIGluIHBhcmVudCB0byBlbnN1cmUgdGhhdCB0aGVcbiAgICAgICAgLy8gc2VsZWN0ZWRJbmRleCBpcyB1cC10by1kYXRlIGJ5IHRoZSB0aW1lIHRoZSBzdXBlciBjbGFzcyBzdGFydHMgbG9va2luZyBmb3IgaXQuXG4gICAgICAgIHRoaXMuX2l0ZW1zLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVMaW5rKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBjb21wb25lbnQgdGhhdCB0aGUgYWN0aXZlIGxpbmsgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDguMC4wIGBlbGVtZW50YCBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICB1cGRhdGVBY3RpdmVMaW5rKF9lbGVtZW50PzogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5rIGJhciBzaG91bGQgaGlkZSBpdHNlbGYgaWYgbm8gaXRlbXMgYXJlIGFjdGl2ZS5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX2lua0Jhci5oaWRlKCk7XG4gICAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogXCJbeG1hdC10YWItbmF2LWJhcl1cIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dXNlLWlucHV0LXByb3BlcnR5LWRlY29yYXRvclxuICAgIGlucHV0czogW1wiY29sb3JcIiwgXCJkaXNhYmxlUmlwcGxlXCJdLFxuICAgIHRlbXBsYXRlVXJsOiBcInhtYXQtbmF2LWJhci5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wieG1hdC1uYXYtYmFyLmNvbXBvbmVudC5zY3NzXCJdLFxuICAgIC8vIGhvc3Q6IHtcImNsYXNzXCI6IFwibWF0LXRhYi1uYXYtYmFyXCJ9LFxuICAgIGhvc3Q6IHtcbiAgICAgICAgXCJjbGFzc1wiOiBcIm1hdC10YWItbmF2LWJhciBtYXQtdGFiLWhlYWRlclwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWRdXCI6IFwiX3Nob3dQYWdpbmF0aW9uQ29udHJvbHNcIixcbiAgICAgICAgXCJbY2xhc3MubWF0LXRhYi1oZWFkZXItcnRsXVwiOiBcIl9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSBcXFwicnRsXFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtcHJpbWFyeV1cIjogXCJjb2xvciAhPT0gXFxcIndhcm5cXFwiICYmIGNvbG9yICE9PSBcXFwiYWNjZW50XFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtYWNjZW50XVwiOiBcImNvbG9yID09PSBcXFwiYWNjZW50XFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtd2Fybl1cIjogXCJjb2xvciA9PT0gXFxcIndhcm5cXFwiXCIsXG4gICAgfSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBYbWF0VGFiTmF2Q29tcG9uZW50IGV4dGVuZHMgX1htYXRUYWJOYXZCYXNlXG4gICAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlckNvbnRlbnRJbml0LCBDYW5Db2xvciwgQ2FuRGlzYWJsZVJpcHBsZSwgT25EZXN0cm95IHtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBYbWF0VGFiTGlua0RpcmVjdGl2ZSksIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9pdGVtczogUXVlcnlMaXN0PFhtYXRUYWJMaW5rRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKFhtYXRJbmtCYXJEaXJlY3RpdmUpIF9pbmtCYXI6IFhtYXRJbmtCYXJEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZChcInRhYkxpc3RDb250YWluZXJcIikgX3RhYkxpc3RDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcInRhYkxpc3RcIikgX3RhYkxpc3Q6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcIm5leHRQYWdpbmF0b3JcIikgX25leHRQYWdpbmF0b3I6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoXCJwcmV2aW91c1BhZ2luYXRvclwiKSBfcHJldmlvdXNQYWdpbmF0b3I6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBkaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHBsYXRmb3JtPzogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgZGlyLCBuZ1pvbmUsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7XG4gICAgfVxufVxuXG5cbi8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0VGFiTGluay5cbmNsYXNzIFhtYXRUYWJMaW5rTWl4aW5CYXNlIHtcbn1cblxuY29uc3QgX1htYXRUYWJMaW5rTWl4aW5CYXNlOlxuICAgIEhhc1RhYkluZGV4Q3RvciAmIENhbkRpc2FibGVSaXBwbGVDdG9yICYgQ2FuRGlzYWJsZUN0b3IgJiB0eXBlb2YgWG1hdFRhYkxpbmtNaXhpbkJhc2UgPVxuICAgIG1peGluVGFiSW5kZXgobWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoWG1hdFRhYkxpbmtNaXhpbkJhc2UpKSk7XG5cbi8qKiBCYXNlIGNsYXNzIHdpdGggYWxsIG9mIHRoZSBgTWF0VGFiTGlua2AgZnVuY3Rpb25hbGl0eS4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lIG5hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY2xhc3MgX1htYXRUYWJMaW5rQmFzZSBleHRlbmRzIF9YbWF0VGFiTGlua01peGluQmFzZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ2FuRGlzYWJsZSxcbiAgICBDYW5EaXNhYmxlUmlwcGxlLCBIYXNUYWJJbmRleCwgUmlwcGxlVGFyZ2V0LCBGb2N1c2FibGVPcHRpb24ge1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRhYiBsaW5rIGlzIGFjdGl2ZSBvciBub3QuICovXG4gICAgcHJvdGVjdGVkIF9pc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxpbmsgaXMgYWN0aXZlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3RhYk5hdkJhci51cGRhdGVBY3RpdmVMaW5rKHRoaXMuZWxlbWVudFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaXBwbGUgY29uZmlndXJhdGlvbiBmb3IgcmlwcGxlcyB0aGF0IGFyZSBsYXVuY2hlZCBvbiBwb2ludGVyIGRvd24uIFRoZSByaXBwbGUgY29uZmlnXG4gICAgICogaXMgc2V0IHRvIHRoZSBnbG9iYWwgcmlwcGxlIG9wdGlvbnMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yXG4gICAgICogdGhlIHRhYiBsaW5rIHJpcHBsZXMuXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHJpcHBsZUNvbmZpZzogUmlwcGxlQ29uZmlnICYgUmlwcGxlR2xvYmFsT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgcmlwcGxlcyBhcmUgZGlzYWJsZWQgb24gaW50ZXJhY3Rpb24uXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCByaXBwbGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmlwcGxlIHx8IHRoaXMuX3RhYk5hdkJhci5kaXNhYmxlUmlwcGxlIHx8XG4gICAgICAgICAgICAhIXRoaXMucmlwcGxlQ29uZmlnLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF90YWJOYXZCYXI6IF9YbWF0VGFiTmF2QmFzZSwgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUykgZ2xvYmFsUmlwcGxlT3B0aW9uczogUmlwcGxlR2xvYmFsT3B0aW9ucyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB0YWJJbmRleDogc3RyaW5nLCBwcml2YXRlIF9mb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJpcHBsZUNvbmZpZyA9IGdsb2JhbFJpcHBsZU9wdGlvbnMgfHwge307XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyYWRpeFxuICAgICAgICB0aGlzLnRhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgpIHx8IDA7XG5cbiAgICAgICAgaWYgKGFuaW1hdGlvbk1vZGUgPT09IFwiTm9vcEFuaW1hdGlvbnNcIikge1xuICAgICAgICAgICAgdGhpcy5yaXBwbGVDb25maWcuYW5pbWF0aW9uID0ge2VudGVyRHVyYXRpb246IDAsIGV4aXREdXJhdGlvbjogMH07XG4gICAgICAgIH1cblxuICAgICAgICBfZm9jdXNNb25pdG9yLm1vbml0b3IoZWxlbWVudFJlZik7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLmVsZW1lbnRSZWYpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMaW5rIGluc2lkZSBvZiBhIGBtYXQtdGFiLW5hdi1iYXJgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbeG1hdC10YWItbGlua10sIFt4bWF0VGFiTGlua11cIixcbiAgICBleHBvcnRBczogXCJ4bWF0VGFiTGlua1wiLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtaW5wdXQtcHJvcGVydHktZGVjb3JhdG9yXG4gICAgaW5wdXRzOiBbXCJkaXNhYmxlZFwiLCBcImRpc2FibGVSaXBwbGVcIiwgXCJ0YWJJbmRleFwiXSxcbiAgICBob3N0OiB7XG4gICAgICAgIFwiY2xhc3NcIjogXCJtYXQtdGFiLWxpbmtcIixcbiAgICAgICAgXCJbYXR0ci5hcmlhLWN1cnJlbnRdXCI6IFwiYWN0aXZlID8gXFxcInBhZ2VcXFwiIDogbnVsbFwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtZGlzYWJsZWRdXCI6IFwiZGlzYWJsZWRcIixcbiAgICAgICAgXCJbYXR0ci50YWJJbmRleF1cIjogXCJ0YWJJbmRleFwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtdGFiLWRpc2FibGVkXVwiOiBcImRpc2FibGVkXCIsXG4gICAgICAgIFwiW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXVwiOiBcImFjdGl2ZVwiLFxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgWG1hdFRhYkxpbmtEaXJlY3RpdmUgZXh0ZW5kcyBfWG1hdFRhYkxpbmtCYXNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBSaXBwbGVSZW5kZXJlciBmb3IgdGhlIHRhYi1saW5rLiAqL1xuICAgIHByaXZhdGUgX3RhYkxpbmtSaXBwbGU6IFJpcHBsZVJlbmRlcmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRhYk5hdkJhcjogWG1hdFRhYk5hdkNvbXBvbmVudCwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TKSBnbG9iYWxSaXBwbGVPcHRpb25zOiBSaXBwbGVHbG9iYWxPcHRpb25zIHwgbnVsbCxcbiAgICAgICAgQEF0dHJpYnV0ZShcInRhYmluZGV4XCIpIHRhYkluZGV4OiBzdHJpbmcsIGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSkgYW5pbWF0aW9uTW9kZT86IHN0cmluZykge1xuICAgICAgICBzdXBlcih0YWJOYXZCYXIsIGVsZW1lbnRSZWYsIGdsb2JhbFJpcHBsZU9wdGlvbnMsIHRhYkluZGV4LCBmb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlID0gbmV3IFJpcHBsZVJlbmRlcmVyKHRoaXMsIG5nWm9uZSwgZWxlbWVudFJlZiwgcGxhdGZvcm0pO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlLnNldHVwVHJpZ2dlckV2ZW50cyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCk7XG4gICAgfVxufVxuIl19