UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

551 lines 46.1 kB
/** * @fileoverview added by tsickle * Generated from: typography.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __decorate, __metadata } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Platform } from '@angular/cdk/platform'; import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, Output, Renderer2, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config'; import { cancelRequestAnimationFrame, reqAnimFrame } from 'ng-zorro-antd/core/polyfill'; import { NzResizeService } from 'ng-zorro-antd/core/services'; import { InputBoolean, InputNumber, isStyleSupport, measure } from 'ng-zorro-antd/core/util'; import { Subject, Subscription } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NzI18nService } from 'ng-zorro-antd/i18n'; import { NzTextCopyComponent } from './text-copy.component'; import { NzTextEditComponent } from './text-edit.component'; /** @type {?} */ var NZ_CONFIG_COMPONENT_NAME = 'typography'; /** @type {?} */ var EXPAND_ELEMENT_CLASSNAME = 'ant-typography-expand'; var NzTypographyComponent = /** @class */ (function () { function NzTypographyComponent(nzConfigService, host, cdr, viewContainerRef, renderer, platform, i18n, document, resizeService) { this.nzConfigService = nzConfigService; this.host = host; this.cdr = cdr; this.viewContainerRef = viewContainerRef; this.renderer = renderer; this.platform = platform; this.i18n = i18n; this.resizeService = resizeService; this.nzCopyable = false; this.nzEditable = false; this.nzDisabled = false; this.nzExpandable = false; this.nzEllipsis = false; this.nzContentChange = new EventEmitter(); this.nzCopy = new EventEmitter(); this.nzExpandChange = new EventEmitter(); this.locale = {}; this.expandableBtnElementCache = null; this.editing = false; this.cssEllipsis = false; this.isEllipsis = true; this.expanded = false; this.ellipsisStr = '...'; this.viewInit = false; this.rfaId = -1; this.destroy$ = new Subject(); this.windowResizeSubscription = Subscription.EMPTY; this.document = document; } Object.defineProperty(NzTypographyComponent.prototype, "canCssEllipsis", { get: /** * @return {?} */ function () { return this.nzEllipsis && this.cssEllipsis && !this.expanded; }, enumerable: true, configurable: true }); Object.defineProperty(NzTypographyComponent.prototype, "copyText", { get: /** * @return {?} */ function () { return typeof this.nzCopyText === 'string' ? this.nzCopyText : this.nzContent; }, enumerable: true, configurable: true }); /** * @param {?} text * @return {?} */ NzTypographyComponent.prototype.onTextCopy = /** * @param {?} text * @return {?} */ function (text) { this.nzCopy.emit(text); }; /** * @return {?} */ NzTypographyComponent.prototype.onStartEditing = /** * @return {?} */ function () { this.editing = true; }; /** * @param {?} text * @return {?} */ NzTypographyComponent.prototype.onEndEditing = /** * @param {?} text * @return {?} */ function (text) { this.editing = false; this.nzContentChange.emit(text); if (this.nzContent === text) { this.renderOnNextFrame(); } }; /** * @return {?} */ NzTypographyComponent.prototype.onExpand = /** * @return {?} */ function () { this.isEllipsis = false; this.expanded = true; this.nzExpandChange.emit(); }; /** * @return {?} */ NzTypographyComponent.prototype.canUseCSSEllipsis = /** * @return {?} */ function () { if (this.nzEditable || this.nzCopyable || this.nzExpandable || this.nzSuffix) { return false; } if (this.nzEllipsisRows === 1) { return isStyleSupport('textOverflow'); } else { return isStyleSupport('webkitLineClamp'); } }; /** * @return {?} */ NzTypographyComponent.prototype.renderOnNextFrame = /** * @return {?} */ function () { var _this = this; cancelRequestAnimationFrame(this.rfaId); if (!this.viewInit || !this.nzEllipsis || this.nzEllipsisRows < 0 || this.expanded || !this.platform.isBrowser) { return; } this.rfaId = reqAnimFrame((/** * @return {?} */ function () { _this.syncEllipsis(); })); }; /** * @return {?} */ NzTypographyComponent.prototype.getOriginContentViewRef = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var viewRef = this.viewContainerRef.createEmbeddedView(this.contentTemplate, { content: this.nzContent }); viewRef.detectChanges(); return { viewRef: viewRef, removeView: (/** * @return {?} */ function () { _this.viewContainerRef.remove(_this.viewContainerRef.indexOf(viewRef)); }) }; }; /** * @return {?} */ NzTypographyComponent.prototype.syncEllipsis = /** * @return {?} */ function () { var _this = this; if (this.cssEllipsis) { return; } var _a = this.getOriginContentViewRef(), viewRef = _a.viewRef, removeView = _a.removeView; /** @type {?} */ var fixedNodes = [this.textCopyRef, this.textEditRef].filter((/** * @param {?} e * @return {?} */ function (e) { return e && e.nativeElement; })).map((/** * @param {?} e * @return {?} */ function (e) { return e.nativeElement; })); /** @type {?} */ var expandableBtnElement = this.getExpandableBtnElement(); if (expandableBtnElement) { fixedNodes.push(expandableBtnElement); } var _b = measure(this.host.nativeElement, this.nzEllipsisRows, viewRef.rootNodes, fixedNodes, this.ellipsisStr, this.nzSuffix), contentNodes = _b.contentNodes, text = _b.text, ellipsis = _b.ellipsis; removeView(); this.ellipsisText = text; this.isEllipsis = ellipsis; /** @type {?} */ var ellipsisContainerNativeElement = this.ellipsisContainer.nativeElement; while (ellipsisContainerNativeElement.firstChild) { this.renderer.removeChild(ellipsisContainerNativeElement, ellipsisContainerNativeElement.firstChild); } contentNodes.forEach((/** * @param {?} n * @return {?} */ function (n) { _this.renderer.appendChild(ellipsisContainerNativeElement, n.cloneNode(true)); })); this.cdr.markForCheck(); }; // Need to create the element for calculation size before view init // Need to create the element for calculation size before view init /** * @private * @return {?} */ NzTypographyComponent.prototype.getExpandableBtnElement = // Need to create the element for calculation size before view init /** * @private * @return {?} */ function () { if (this.nzExpandable) { /** @type {?} */ var expandText = this.locale ? this.locale.expand : ''; /** @type {?} */ var cache = this.expandableBtnElementCache; if (!cache || cache.innerText === expandText) { /** @type {?} */ var el = this.document.createElement('a'); el.className = EXPAND_ELEMENT_CLASSNAME; el.innerText = expandText; this.expandableBtnElementCache = el; } return this.expandableBtnElementCache; } else { this.expandableBtnElementCache = null; return null; } }; /** * @private * @return {?} */ NzTypographyComponent.prototype.renderAndSubscribeWindowResize = /** * @private * @return {?} */ function () { var _this = this; if (this.platform.isBrowser) { this.windowResizeSubscription.unsubscribe(); this.cssEllipsis = this.canUseCSSEllipsis(); this.renderOnNextFrame(); this.windowResizeSubscription = this.resizeService .subscribe() .pipe(takeUntil(this.destroy$)) .subscribe((/** * @return {?} */ function () { return _this.renderOnNextFrame(); })); } }; /** * @return {?} */ NzTypographyComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe((/** * @return {?} */ function () { _this.locale = _this.i18n.getLocaleData('Text'); _this.cdr.markForCheck(); })); }; /** * @return {?} */ NzTypographyComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.viewInit = true; this.renderAndSubscribeWindowResize(); }; /** * @param {?} changes * @return {?} */ NzTypographyComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var nzCopyable = changes.nzCopyable, nzEditable = changes.nzEditable, nzExpandable = changes.nzExpandable, nzEllipsis = changes.nzEllipsis, nzContent = changes.nzContent, nzEllipsisRows = changes.nzEllipsisRows, nzSuffix = changes.nzSuffix; if (nzCopyable || nzEditable || nzExpandable || nzEllipsis || nzContent || nzEllipsisRows || nzSuffix) { if (this.nzEllipsis) { if (this.expanded) { this.windowResizeSubscription.unsubscribe(); } else { this.renderAndSubscribeWindowResize(); } } } }; /** * @return {?} */ NzTypographyComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); this.expandableBtnElementCache = null; this.windowResizeSubscription.unsubscribe(); }; NzTypographyComponent.decorators = [ { type: Component, args: [{ selector: "\n nz-typography,\n [nz-typography],\n p[nz-paragraph],\n span[nz-text],\n h1[nz-title], h2[nz-title], h3[nz-title], h4[nz-title]\n ", exportAs: 'nzTypography', template: "\n <ng-template #contentTemplate let-content=\"content\">\n <ng-content *ngIf=\"!content\"></ng-content>\n {{ content }}\n </ng-template>\n\n <ng-container *ngIf=\"!editing\">\n <ng-container *ngIf=\"expanded || (!nzExpandable && !nzSuffix && nzEllipsisRows === 1) || canCssEllipsis\">\n <ng-template [ngTemplateOutlet]=\"contentTemplate\" [ngTemplateOutletContext]=\"{ content: nzContent }\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"(nzEllipsis && !expanded && (nzEllipsisRows > 1 || nzExpandable)) || nzSuffix\">\n <span #ellipsisContainer *ngIf=\"!expanded\"></span>\n <ng-container *ngIf=\"isEllipsis\">{{ ellipsisStr }}</ng-container>\n <ng-container *ngIf=\"nzSuffix\">{{ nzSuffix }}</ng-container>\n <a #expandable *ngIf=\"nzExpandable && isEllipsis\" class=\"ant-typography-expand\" (click)=\"onExpand()\">{{ locale?.expand }}</a>\n </ng-container>\n </ng-container>\n\n <nz-text-edit *ngIf=\"nzEditable\" [text]=\"nzContent\" (endEditing)=\"onEndEditing($event)\" (startEditing)=\"onStartEditing()\">\n </nz-text-edit>\n\n <nz-text-copy *ngIf=\"nzCopyable && !editing\" [text]=\"copyText\" (textCopy)=\"onTextCopy($event)\"></nz-text-copy>\n ", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, host: { '[class.ant-typography]': '!editing', '[class.ant-typography-edit-content]': 'editing', '[class.ant-typography-secondary]': 'nzType === "secondary"', '[class.ant-typography-warning]': 'nzType === "warning"', '[class.ant-typography-danger]': 'nzType === "danger"', '[class.ant-typography-disabled]': 'nzDisabled', '[class.ant-typography-ellipsis]': 'nzEllipsis && !expanded', '[class.ant-typography-ellipsis-single-line]': 'canCssEllipsis && nzEllipsisRows === 1', '[class.ant-typography-ellipsis-multiple-line]': 'canCssEllipsis && nzEllipsisRows > 1', '[style.-webkit-line-clamp]': '(canCssEllipsis && nzEllipsisRows > 1) ? nzEllipsisRows : null' } }] } ]; /** @nocollapse */ NzTypographyComponent.ctorParameters = function () { return [ { type: NzConfigService }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: ViewContainerRef }, { type: Renderer2 }, { type: Platform }, { type: NzI18nService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: NzResizeService } ]; }; NzTypographyComponent.propDecorators = { nzCopyable: [{ type: Input }], nzEditable: [{ type: Input }], nzDisabled: [{ type: Input }], nzExpandable: [{ type: Input }], nzEllipsis: [{ type: Input }], nzContent: [{ type: Input }], nzEllipsisRows: [{ type: Input }], nzType: [{ type: Input }], nzCopyText: [{ type: Input }], nzSuffix: [{ type: Input }], nzContentChange: [{ type: Output }], nzCopy: [{ type: Output }], nzExpandChange: [{ type: Output }], textEditRef: [{ type: ViewChild, args: [NzTextEditComponent, { static: false },] }], textCopyRef: [{ type: ViewChild, args: [NzTextCopyComponent, { static: false },] }], ellipsisContainer: [{ type: ViewChild, args: ['ellipsisContainer', { static: false },] }], expandableBtn: [{ type: ViewChild, args: ['expandable', { static: false },] }], contentTemplate: [{ type: ViewChild, args: ['contentTemplate', { static: false },] }] }; __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTypographyComponent.prototype, "nzCopyable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTypographyComponent.prototype, "nzEditable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTypographyComponent.prototype, "nzDisabled", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTypographyComponent.prototype, "nzExpandable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTypographyComponent.prototype, "nzEllipsis", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME, 1), InputNumber(), __metadata("design:type", Number) ], NzTypographyComponent.prototype, "nzEllipsisRows", void 0); return NzTypographyComponent; }()); export { NzTypographyComponent }; if (false) { /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzCopyable; /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzEditable; /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzDisabled; /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzExpandable; /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzEllipsis; /** @type {?} */ NzTypographyComponent.ngAcceptInputType_nzEllipsisRows; /** @type {?} */ NzTypographyComponent.prototype.nzCopyable; /** @type {?} */ NzTypographyComponent.prototype.nzEditable; /** @type {?} */ NzTypographyComponent.prototype.nzDisabled; /** @type {?} */ NzTypographyComponent.prototype.nzExpandable; /** @type {?} */ NzTypographyComponent.prototype.nzEllipsis; /** @type {?} */ NzTypographyComponent.prototype.nzContent; /** @type {?} */ NzTypographyComponent.prototype.nzEllipsisRows; /** @type {?} */ NzTypographyComponent.prototype.nzType; /** @type {?} */ NzTypographyComponent.prototype.nzCopyText; /** @type {?} */ NzTypographyComponent.prototype.nzSuffix; /** @type {?} */ NzTypographyComponent.prototype.nzContentChange; /** @type {?} */ NzTypographyComponent.prototype.nzCopy; /** @type {?} */ NzTypographyComponent.prototype.nzExpandChange; /** @type {?} */ NzTypographyComponent.prototype.textEditRef; /** @type {?} */ NzTypographyComponent.prototype.textCopyRef; /** @type {?} */ NzTypographyComponent.prototype.ellipsisContainer; /** @type {?} */ NzTypographyComponent.prototype.expandableBtn; /** @type {?} */ NzTypographyComponent.prototype.contentTemplate; /** @type {?} */ NzTypographyComponent.prototype.locale; /** @type {?} */ NzTypographyComponent.prototype.document; /** @type {?} */ NzTypographyComponent.prototype.expandableBtnElementCache; /** @type {?} */ NzTypographyComponent.prototype.editing; /** @type {?} */ NzTypographyComponent.prototype.ellipsisText; /** @type {?} */ NzTypographyComponent.prototype.cssEllipsis; /** @type {?} */ NzTypographyComponent.prototype.isEllipsis; /** @type {?} */ NzTypographyComponent.prototype.expanded; /** @type {?} */ NzTypographyComponent.prototype.ellipsisStr; /** * @type {?} * @private */ NzTypographyComponent.prototype.viewInit; /** * @type {?} * @private */ NzTypographyComponent.prototype.rfaId; /** * @type {?} * @private */ NzTypographyComponent.prototype.destroy$; /** * @type {?} * @private */ NzTypographyComponent.prototype.windowResizeSubscription; /** @type {?} */ NzTypographyComponent.prototype.nzConfigService; /** * @type {?} * @private */ NzTypographyComponent.prototype.host; /** * @type {?} * @private */ NzTypographyComponent.prototype.cdr; /** * @type {?} * @private */ NzTypographyComponent.prototype.viewContainerRef; /** * @type {?} * @private */ NzTypographyComponent.prototype.renderer; /** * @type {?} * @private */ NzTypographyComponent.prototype.platform; /** * @type {?} * @private */ NzTypographyComponent.prototype.i18n; /** * @type {?} * @private */ NzTypographyComponent.prototype.resizeService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL3R5cG9ncmFwaHkvIiwic291cmNlcyI6WyJ0eXBvZ3JhcGh5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7SUFFdEQsd0JBQXdCLEdBQUcsWUFBWTs7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LHdDQUFnQjs7SUFDaEIsNkNBQWlDOztJQUNqQyw0Q0FBNkI7O0lBQzdCLDJDQUEyQjs7SUFDM0IseUNBQTBCOztJQUMxQiw0Q0FBb0I7Ozs7O0lBTXBCLHlDQUF5Qjs7Ozs7SUFDekIsc0NBQTJCOzs7OztJQUMzQix5Q0FBaUM7Ozs7O0lBQ2pDLHlEQUFzRDs7SUFNcEQsZ0RBQXVDOzs7OztJQUN2QyxxQ0FBcUM7Ozs7O0lBQ3JDLG9DQUE4Qjs7Ozs7SUFDOUIsaURBQTBDOzs7OztJQUMxQyx5Q0FBMkI7Ozs7O0lBQzNCLHlDQUEwQjs7Ozs7SUFDMUIscUNBQTJCOzs7OztJQUUzQiw4Q0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOekNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvY29uZmlnJztcbmltcG9ydCB7IGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSwgcmVxQW5pbUZyYW1lIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3BvbHlmaWxsJztcbmltcG9ydCB7IE56UmVzaXplU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIE51bWJlcklucHV0LCBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBJbnB1dE51bWJlciwgaXNTdHlsZVN1cHBvcnQsIG1lYXN1cmUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5cbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcblxuaW1wb3J0IHsgTnpUZXh0Q29weUNvbXBvbmVudCB9IGZyb20gJy4vdGV4dC1jb3B5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOelRleHRFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi90ZXh0LWVkaXQuY29tcG9uZW50JztcblxuY29uc3QgTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FID0gJ3R5cG9ncmFwaHknO1xuY29uc3QgRVhQQU5EX0VMRU1FTlRfQ0xBU1NOQU1FID0gJ2FudC10eXBvZ3JhcGh5LWV4cGFuZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogYFxuICBuei10eXBvZ3JhcGh5LFxuICBbbnotdHlwb2dyYXBoeV0sXG4gIHBbbnotcGFyYWdyYXBoXSxcbiAgc3Bhbltuei10ZXh0XSxcbiAgaDFbbnotdGl0bGVdLCBoMltuei10aXRsZV0sIGgzW256LXRpdGxlXSwgaDRbbnotdGl0bGVdXG4gIGAsXG4gIGV4cG9ydEFzOiAnbnpUeXBvZ3JhcGh5JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUZW1wbGF0ZSBsZXQtY29udGVudD1cImNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiIWNvbnRlbnRcIj48L25nLWNvbnRlbnQ+XG4gICAgICB7eyBjb250ZW50IH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGVkIHx8ICghbnpFeHBhbmRhYmxlICYmICFuelN1ZmZpeCAmJiBuekVsbGlwc2lzUm93cyA9PT0gMSkgfHwgY2FuQ3NzRWxsaXBzaXNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbnRlbnQ6IG56Q29udGVudCB9XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihuekVsbGlwc2lzICYmICFleHBhbmRlZCAmJiAobnpFbGxpcHNpc1Jvd3MgPiAxIHx8IG56RXhwYW5kYWJsZSkpIHx8IG56U3VmZml4XCI+XG4gICAgICAgIDxzcGFuICNlbGxpcHNpc0NvbnRhaW5lciAqbmdJZj1cIiFleHBhbmRlZFwiPjwvc3Bhbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWxsaXBzaXNcIj57eyBlbGxpcHNpc1N0ciB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnpTdWZmaXhcIj57eyBuelN1ZmZpeCB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8YSAjZXhwYW5kYWJsZSAqbmdJZj1cIm56RXhwYW5kYWJsZSAmJiBpc0VsbGlwc2lzXCIgY2xhc3M9XCJhbnQtdHlwb2dyYXBoeS1leHBhbmRcIiAoY2xpY2spPVwib25FeHBhbmQoKVwiPnt7IGxvY2FsZT8uZXhwYW5kIH19PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bnotdGV4dC1lZGl0ICpuZ0lmPVwibnpFZGl0YWJsZVwiIFt0ZXh0XT1cIm56Q29udGVudFwiIChlbmRFZGl0aW5nKT1cIm9uRW5kRWRpdGluZygkZXZlbnQpXCIgKHN0YXJ0RWRpdGluZyk9XCJvblN0YXJ0RWRpdGluZygpXCI+XG4gICAgPC9uei10ZXh0LWVkaXQ+XG5cbiAgICA8bnotdGV4dC1jb3B5ICpuZ0lmPVwibnpDb3B5YWJsZSAmJiAhZWRpdGluZ1wiIFt0ZXh0XT1cImNvcHlUZXh0XCIgKHRleHRDb3B5KT1cIm9uVGV4dENvcHkoJGV2ZW50KVwiPjwvbnotdGV4dC1jb3B5PlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC10eXBvZ3JhcGh5XSc6ICchZWRpdGluZycsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1lZGl0LWNvbnRlbnRdJzogJ2VkaXRpbmcnLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktc2Vjb25kYXJ5XSc6ICduelR5cGUgPT09IFwic2Vjb25kYXJ5XCInLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktd2FybmluZ10nOiAnbnpUeXBlID09PSBcIndhcm5pbmdcIicsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1kYW5nZXJdJzogJ256VHlwZSA9PT0gXCJkYW5nZXJcIicsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1kaXNhYmxlZF0nOiAnbnpEaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1lbGxpcHNpc10nOiAnbnpFbGxpcHNpcyAmJiAhZXhwYW5kZWQnLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktZWxsaXBzaXMtc2luZ2xlLWxpbmVdJzogJ2NhbkNzc0VsbGlwc2lzICYmIG56RWxsaXBzaXNSb3dzID09PSAxJyxcbiAgICAnW2NsYXNzLmFudC10eXBvZ3JhcGh5LWVsbGlwc2lzLW11bHRpcGxlLWxpbmVdJzogJ2NhbkNzc0VsbGlwc2lzICYmIG56RWxsaXBzaXNSb3dzID4gMScsXG4gICAgJ1tzdHlsZS4td2Via2l0LWxpbmUtY2xhbXBdJzogJyhjYW5Dc3NFbGxpcHNpcyAmJiBuekVsbGlwc2lzUm93cyA+IDEpID8gbnpFbGxpcHNpc1Jvd3MgOiBudWxsJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56VHlwb2dyYXBoeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDb3B5YWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpFZGl0YWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpEaXNhYmxlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpFeHBhbmRhYmxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekVsbGlwc2lzOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekVsbGlwc2lzUm93czogTnVtYmVySW5wdXQ7XG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q29weWFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RWRpdGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RXhwYW5kYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFbGxpcHNpcyA9IGZhbHNlO1xuICBASW5wdXQoKSBuekNvbnRlbnQ6IHN0cmluZztcbiAgQElucHV0KCkgQFdpdGhDb25maWcoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FLCAxKSBASW5wdXROdW1iZXIoKSBuekVsbGlwc2lzUm93czogbnVtYmVyO1xuICBASW5wdXQoKSBuelR5cGU6ICdzZWNvbmRhcnknIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG56Q29weVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgbnpTdWZmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKE56VGV4dEVkaXRDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZXh0RWRpdFJlZjogTnpUZXh0RWRpdENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZChOelRleHRDb3B5Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgdGV4dENvcHlSZWY6IE56VGV4dENvcHlDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2VsbGlwc2lzQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGVsbGlwc2lzQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxTcGFuRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2V4cGFuZGFibGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgZXhwYW5kYWJsZUJ0bjogRWxlbWVudFJlZjxIVE1MU3BhbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjb250ZW50VGVtcGxhdGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGVudFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx7IGNvbnRlbnQ6IHN0cmluZyB9PjtcblxuICBsb2NhbGU6IE56U2FmZUFueSA9IHt9O1xuICBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIGV4cGFuZGFibGVCdG5FbGVtZW50Q2FjaGU6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGVkaXRpbmcgPSBmYWxzZTtcbiAgZWxsaXBzaXNUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNzc0VsbGlwc2lzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRWxsaXBzaXM6IGJvb2xlYW4gPSB0cnVlO1xuICBleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBlbGxpcHNpc1N0ciA9ICcuLi4nO1xuXG4gIGdldCBjYW5Dc3NFbGxpcHNpcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uekVsbGlwc2lzICYmIHRoaXMuY3NzRWxsaXBzaXMgJiYgIXRoaXMuZXhwYW5kZWQ7XG4gIH1cblxuICBwcml2YXRlIHZpZXdJbml0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmZhSWQ6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSB3aW5kb3dSZXNpemVTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIGdldCBjb3B5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5uekNvcHlUZXh0ID09PSAnc3RyaW5nJyA/IHRoaXMubnpDb3B5VGV4dCA6IHRoaXMubnpDb250ZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBOelNhZmVBbnksXG4gICAgcHJpdmF0ZSByZXNpemVTZXJ2aWNlOiBOelJlc2l6ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICB9XG5cbiAgb25UZXh0Q29weSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm56Q29weS5lbWl0KHRleHQpO1xuICB9XG5cbiAgb25TdGFydEVkaXRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIG9uRW5kRWRpdGluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm56Q29udGVudENoYW5nZS5lbWl0KHRleHQpO1xuICAgIGlmICh0aGlzLm56Q29udGVudCA9PT0gdGV4dCkge1xuICAgICAgdGhpcy5yZW5kZXJPbk5leHRGcmFtZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFbGxpcHNpcyA9IGZhbHNlO1xuICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHRoaXMubnpFeHBhbmRDaGFuZ2UuZW1pdCgpO1xuICB9XG5cbiAgY2FuVXNlQ1NTRWxsaXBzaXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubnpFZGl0YWJsZSB8fCB0aGlzLm56Q29weWFibGUgfHwgdGhpcy5uekV4cGFuZGFibGUgfHwgdGhpcy5uelN1ZmZpeCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5uekVsbGlwc2lzUm93cyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGlzU3R5bGVTdXBwb3J0KCd0ZXh0T3ZlcmZsb3cnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzU3R5bGVTdXBwb3J0KCd3ZWJraXRMaW5lQ2xhbXAnKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJPbk5leHRGcmFtZSgpOiB2b2lkIHtcbiAgICBjYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZmFJZCk7XG4gICAgaWYgKCF0aGlzLnZpZXdJbml0IHx8ICF0aGlzLm56RWxsaXBzaXMgfHwgdGhpcy5uekVsbGlwc2lzUm93cyA8IDAgfHwgdGhpcy5leHBhbmRlZCB8fCAhdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZmFJZCA9IHJlcUFuaW1GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNFbGxpcHNpcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0T3JpZ2luQ29udGVudFZpZXdSZWYoKTogeyB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8eyBjb250ZW50OiBzdHJpbmcgfT47IHJlbW92ZVZpZXcoKTogdm9pZCB9IHtcbiAgICBjb25zdCB2aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldzx7IGNvbnRlbnQ6IHN0cmluZyB9Pih0aGlzLmNvbnRlbnRUZW1wbGF0ZSwge1xuICAgICAgY29udGVudDogdGhpcy5uekNvbnRlbnRcbiAgICB9KTtcbiAgICB2aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmlld1JlZixcbiAgICAgIHJlbW92ZVZpZXc6ICgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLnJlbW92ZSh0aGlzLnZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3UmVmKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN5bmNFbGxpcHNpcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jc3NFbGxpcHNpcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHZpZXdSZWYsIHJlbW92ZVZpZXcgfSA9IHRoaXMuZ2V0T3JpZ2luQ29udGVudFZpZXdSZWYoKTtcbiAgICBjb25zdCBmaXhlZE5vZGVzID0gW3RoaXMudGV4dENvcHlSZWYsIHRoaXMudGV4dEVkaXRSZWZdLmZpbHRlcihlID0+IGUgJiYgZS5uYXRpdmVFbGVtZW50KS5tYXAoZSA9PiBlLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGNvbnN0IGV4cGFuZGFibGVCdG5FbGVtZW50ID0gdGhpcy5nZXRFeHBhbmRhYmxlQnRuRWxlbWVudCgpO1xuICAgIGlmIChleHBhbmRhYmxlQnRuRWxlbWVudCkge1xuICAgICAgZml4ZWROb2Rlcy5wdXNoKGV4cGFuZGFibGVCdG5FbGVtZW50KTtcbiAgICB9XG4gICAgY29uc3QgeyBjb250ZW50Tm9kZXMsIHRleHQsIGVsbGlwc2lzIH0gPSBtZWFzdXJlKFxuICAgICAgdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm56RWxsaXBzaXNSb3dzLFxuICAgICAgdmlld1JlZi5yb290Tm9kZXMsXG4gICAgICBmaXhlZE5vZGVzLFxuICAgICAgdGhpcy5lbGxpcHNpc1N0cixcbiAgICAgIHRoaXMubnpTdWZmaXhcbiAgICApO1xuXG4gICAgcmVtb3ZlVmlldygpO1xuXG4gICAgdGhpcy5lbGxpcHNpc1RleHQgPSB0ZXh0O1xuICAgIHRoaXMuaXNFbGxpcHNpcyA9IGVsbGlwc2lzO1xuICAgIGNvbnN0IGVsbGlwc2lzQ29udGFpbmVyTmF0aXZlRWxlbWVudCA9IHRoaXMuZWxsaXBzaXNDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWxsaXBzaXNDb250YWluZXJOYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZWxsaXBzaXNDb250YWluZXJOYXRpdmVFbGVtZW50LCBlbGxpcHNpc0NvbnRhaW5lck5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIGNvbnRlbnROb2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChlbGxpcHNpc0NvbnRhaW5lck5hdGl2ZUVsZW1lbnQsIG4uY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIE5lZWQgdG8gY3JlYXRlIHRoZSBlbGVtZW50IGZvciBjYWxjdWxhdGlvbiBzaXplIGJlZm9yZSB2aWV3IGluaXRcbiAgcHJpdmF0ZSBnZXRFeHBhbmRhYmxlQnRuRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0aGlzLm56RXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kVGV4dCA9IHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXhwYW5kIDogJyc7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZXhwYW5kYWJsZUJ0bkVsZW1lbnRDYWNoZTtcbiAgICAgIGlmICghY2FjaGUgfHwgY2FjaGUuaW5uZXJUZXh0ID09PSBleHBhbmRUZXh0KSB7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGVsLmNsYXNzTmFtZSA9IEVYUEFORF9FTEVNRU5UX0NMQVNTTkFNRTtcbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gZXhwYW5kVGV4dDtcbiAgICAgICAgdGhpcy5leHBhbmRhYmxlQnRuRWxlbWVudENhY2hlID0gZWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlQnRuRWxlbWVudENhY2hlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGFibGVCdG5FbGVtZW50Q2FjaGUgPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBbmRTdWJzY3JpYmVXaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5jc3NFbGxpcHNpcyA9IHRoaXMuY2FuVXNlQ1NTRWxsaXBzaXMoKTtcbiAgICAgIHRoaXMucmVuZGVyT25OZXh0RnJhbWUoKTtcbiAgICAgIHRoaXMud2luZG93UmVzaXplU3Vic2NyaXB0aW9uID0gdGhpcy5yZXNpemVTZXJ2aWNlXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW5kZXJPbk5leHRGcmFtZSgpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnVGV4dCcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3SW5pdCA9IHRydWU7XG4gICAgdGhpcy5yZW5kZXJBbmRTdWJzY3JpYmVXaW5kb3dSZXNpemUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56Q29weWFibGUsIG56RWRpdGFibGUsIG56RXhwYW5kYWJsZSwgbnpFbGxpcHNpcywgbnpDb250ZW50LCBuekVsbGlwc2lzUm93cywgbnpTdWZmaXggfSA9IGNoYW5nZXM7XG4gICAgaWYgKG56Q29weWFibGUgfHwgbnpFZGl0YWJsZSB8fCBuekV4cGFuZGFibGUgfHwgbnpFbGxpcHNpcyB8fCBuekNvbnRlbnQgfHwgbnpFbGxpcHNpc1Jvd3MgfHwgbnpTdWZmaXgpIHtcbiAgICAgIGlmICh0aGlzLm56RWxsaXBzaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLndpbmRvd1Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyQW5kU3Vic2NyaWJlV2luZG93UmVzaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5leHBhbmRhYmxlQnRuRWxlbWVudENhY2hlID0gbnVsbDtcbiAgICB0aGlzLndpbmRvd1Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=