UNPKG

ng-zorro-antd-mobile

Version:

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

608 lines 53.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ViewChild, ElementRef, HostListener, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { PickerOptions } from './picker-options.provider'; import * as velocity from '../core/util/velocity'; import * as touchEvent from '../core/util/touch-event'; import { LocaleProviderService } from '../locale-provider/locale-provider.service'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { PickerRef } from './picker-ref.class'; /** * @template T, R */ var PickerComponent = /** @class */ (function (_super) { tslib_1.__extends(PickerComponent, _super); function PickerComponent(elementRef, options, _localeProviderService) { var _this = _super.call(this) || this; _this.elementRef = elementRef; _this.options = options; _this._localeProviderService = _localeProviderService; _this.transitionName = 'am-slide-up-enter am-slide-up-enter-active'; _this.maskTransitionName = 'am-fade-enter am-fade-enter-active'; _this.startY = 0; _this.differY = 0; _this.currentY = 0; _this.len = 0; _this.dom = null; _this.index = 0; _this.maxY = 0; _this.lineHeight = 34; _this.dataForRender = []; _this.selectedTarget = []; _this.isMouseDown = false; _this.Velocity = velocity.getVelocity(); _this._unsubscribe$ = new Subject(); _this.onChange = (/** * @param {?} _ * @return {?} */ function (_) { }); return _this; } /** * @param {?} event * @return {?} */ PickerComponent.prototype.panstart = /** * @param {?} event * @return {?} */ function (event) { var _this = this; if (!event.target.classList.contains('am-picker-col-mask') || this.options.disabled) { return; } this.isMouseDown = true; event.preventDefault(); this.dom = touchEvent.getEventTarget(event).target.parentElement.children[2]; this.len = this.dom.children.length; this.maxY = -(this.len - 1); if (this.dom.style.transform === 'translateY(0px)') { this.currentY = 0; this.maxY = -(this.len - 1); } else if (this.selectedTarget.length > 0) { this.selectedTarget.forEach((/** * @param {?} item * @return {?} */ function (item) { if (item.targetId === event.target.id) { _this.currentY = item.currentY; } })); } this.startY = touchEvent.getEventTarget(event).clientY; }; /** * @param {?} event * @return {?} */ PickerComponent.prototype.panmove = /** * @param {?} event * @return {?} */ function (event) { if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) { return; } event.preventDefault(); /** @type {?} */ var ev = touchEvent.getEventTarget(event); this.differY = ev.clientY - this.startY; this.Velocity.record(this.differY); this.dom.style.transition = 'transform 0s'; this.dom.style.transform = "translateY(" + (this.currentY * this.lineHeight + this.differY) + "px)"; }; /** * @param {?} event * @return {?} */ PickerComponent.prototype.panend = /** * @param {?} event * @return {?} */ function (event) { var _this = this; if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) { return; } this.isMouseDown = false; event.preventDefault(); /** @type {?} */ var ev = touchEvent.getEventTarget(event); this.differY = ev.clientY - this.startY; /** @type {?} */ var time = 0.3; /** @type {?} */ var velocityTemp = this.Velocity.getVelocity(this.differY) * 4; if (velocity) { this.differY = velocityTemp * 40 + this.differY; time = Math.abs(velocityTemp) * 0.1; } this.dom.style.transition = 'transform ' + (time < 0.3 ? 0.3 : time) + 's'; if (this.differY <= -this.lineHeight / 2) { this.currentY += Math.floor(this.differY / this.lineHeight); if (this.currentY <= this.maxY) { this.currentY = this.maxY; } } else if (this.differY >= this.lineHeight / 2) { this.currentY += Math.floor(this.differY / this.lineHeight); if (this.currentY >= 0) { this.currentY = 0; } } if (this.selectedTarget.length > 0) { /** @type {?} */ var hasKey_1 = false; this.selectedTarget.forEach((/** * @param {?} item * @return {?} */ function (item) { if (item.targetId === event.target.id) { hasKey_1 = true; item.targetId = event.target.id; item.currentY = _this.currentY; } else if (parseInt(item.targetId, 0) > parseInt(event.target.id, 0) && _this.options.cascade) { item.currentY = 0; } })); if (!hasKey_1) { this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY }); } } else { this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY }); } this.dom.style.transform = "translateY(" + this.currentY * this.lineHeight + "px)"; this.index = Math.floor(Math.abs(this.currentY / 1)); this.setCurrentSelected(parseInt(event.target.id, 0), this.index); if (this.options.value !== this.combineReslut()) { this.options.onPickerChange.emit(this.combineReslut()); this.onChange(this.combineReslut()); } }; /** * @return {?} */ PickerComponent.prototype.init = /** * @return {?} */ function () { if (this.dataForRender.length === 0 && this.generateArrayData(this.options.data).length > 0) { this.dataForRender.push(this.generateArrayData(this.options.data)); } if (this.options.value.length > 0) { this.getInitValueIndex(this.dataForRender); } else { this.checkArrayDeep(this.options.data[0]); for (var index = 0; index < this.dataForRender.length; index++) { this.selectedTarget.push({ targetId: "" + index, currentY: 0 }); } } }; /** * @param {?} dataTemp * @return {?} */ PickerComponent.prototype.getInitValueIndex = /** * @param {?} dataTemp * @return {?} */ function (dataTemp) { /** @type {?} */ var self = this; self.selectedTarget = []; self.options.value.forEach((/** * @param {?} element * @param {?} i * @return {?} */ function (element, i) { dataTemp.forEach((/** * @param {?} item * @param {?} j * @return {?} */ function (item, j) { item.forEach((/** * @param {?} item1 * @param {?} k * @return {?} */ function (item1, k) { if ((element === item1.label || element === item1.value || element === item1) && i === j) { self.checkArrayDeep(self.dataForRender[i][k], false); self.selectedTarget.push({ targetId: "" + i, currentY: -k }); } })); })); })); }; /** * @return {?} */ PickerComponent.prototype.reloadPicker = /** * @return {?} */ function () { if (!this._picker || this._picker === undefined) { return; } this.currentPicker = this._picker.element.nativeElement; if (this.currentPicker && this.currentPicker.children.length > 0) { /** @type {?} */ var self_1 = this; setTimeout((/** * @return {?} */ function () { self_1.selectedTarget.forEach((/** * @param {?} item * @param {?} i * @return {?} */ function (item, i) { self_1.currentPicker.children[i].children[2].style.transition = 'transform .3s'; /** @type {?} */ var index = parseInt(item.currentY, 0); self_1.currentPicker.children[i].children[2].style.transform = "translateY(" + index * self_1.lineHeight + "px)"; })); }), 0); } }; /** * @param {?} targetArr * @return {?} */ PickerComponent.prototype.generateArrayData = /** * @param {?} targetArr * @return {?} */ function (targetArr) { /** @type {?} */ var tempArr = []; if (targetArr instanceof Array) { targetArr.forEach((/** * @param {?} item * @param {?} i * @return {?} */ function (item, i) { if (item instanceof Array) { /** @type {?} */ var keys = Object.keys(item); /** @type {?} */ var element_1 = {}; keys.forEach((/** * @param {?} key * @return {?} */ function (key) { element_1[key] = targetArr[i][key] || targetArr[i]; })); tempArr.push(element_1); } else { tempArr.push(item); } })); return tempArr; } return []; }; /** * @param {?} parent * @param {?=} init * @return {?} */ PickerComponent.prototype.checkArrayDeep = /** * @param {?} parent * @param {?=} init * @return {?} */ function (parent, init) { if (init === void 0) { init = true; } if (parent instanceof Object && parent.children && parent.children.length > 0) { if (this.generateArrayData(parent.children).length > 0 && this.dataForRender.length < this.options.cols) { /** @type {?} */ var hasValue_1 = false; this.dataForRender.filter((/** * @param {?} item * @param {?} index * @return {?} */ function (item, index) { if (JSON.stringify(item) === JSON.stringify(parent.children)) { hasValue_1 = true; } })); if (!hasValue_1) { this.dataForRender.push(this.generateArrayData(parent.children)); } if (init) { this.checkArrayDeep(parent.children[0]); } } } }; /** * @return {?} */ PickerComponent.prototype.ok = /** * @return {?} */ function () { if (this.options.updateNgModel) { this.options.updateNgModel(this.combineReslut()); } if (this.options.confirm) { this.options.confirm(this.combineReslut()); } this.setTransitionName(); }; /** * @return {?} */ PickerComponent.prototype.combineReslut = /** * @return {?} */ function () { /** @type {?} */ var result = []; /** @type {?} */ var self = this; self.selectedTarget.forEach((/** * @param {?} item * @return {?} */ function (item) { if (self.dataForRender.length > 0 && self.dataForRender.length >= parseInt(item.targetId, 0) + 1) { /** @type {?} */ var curItem = self.dataForRender[parseInt(item.targetId, 0)][-item.currentY]; if (curItem !== undefined) { result.push(curItem); } } })); return result; }; /** * @return {?} */ PickerComponent.prototype.cancel = /** * @return {?} */ function () { this.setTransitionName(); this.options.onDismiss.emit(); if (this.options.cancel) { this.options.cancel(); } }; /** * @return {?} */ PickerComponent.prototype.setTransitionName = /** * @return {?} */ function () { var _this = this; this.transitionName = 'am-slide-up-leave am-slide-up-leave-active'; this.maskTransitionName = 'am-fade-leave am-fade-leave-active'; setTimeout((/** * @return {?} */ function () { _this.options.hidePicker(); }), 200); }; /** * @param {?} target * @param {?} index * @return {?} */ PickerComponent.prototype.setCurrentSelected = /** * @param {?} target * @param {?} index * @return {?} */ function (target, index) { var _this = this; if (!this.options.cascade) { return; } /** @type {?} */ var a = this.dataForRender.slice(0, target + 1); this.dataForRender = a; this.checkArrayDeep(this.dataForRender[target][index]); if (this.selectedTarget.length > 0 && this.selectedTarget.length < this.dataForRender.length) { for (var i = 0; i < this.dataForRender.length; i++) { if (i > target) { if (i < this.selectedTarget.length) { this.selectedTarget[i] = { targetId: "" + i, currentY: 0 }; } else { this.selectedTarget.push({ targetId: "" + i, currentY: 0 }); } } } } setTimeout((/** * @return {?} */ function () { _this.dataForRender.forEach((/** * @param {?} item * @param {?} i * @return {?} */ function (item, i) { if (target !== "" + i && i > target) { _this._picker.element.nativeElement.children[i].children[2].style.transition = 'transform .3s'; _this._picker.element.nativeElement.children[i].children[2].style.transform = 'translateY(0px)'; } })); }), 0); }; /** * @return {?} */ PickerComponent.prototype.getInstance = /** * @return {?} */ function () { return this; }; /** * @return {?} */ PickerComponent.prototype.getElement = /** * @return {?} */ function () { return this.elementRef && this.elementRef.nativeElement; }; /** * @return {?} */ PickerComponent.prototype.close = /** * @return {?} */ function () { if (this.options.hidePicker) { this.options.hidePicker(); } }; /** * @return {?} */ PickerComponent.prototype.destroy = /** * @return {?} */ function () { this.close(); }; /** * @return {?} */ PickerComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.init(); this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe((/** * @param {?} _ * @return {?} */ function (_) { /** @type {?} */ var locale = _this._localeProviderService.getLocaleSubObj('Picker'); _this.options.okText = _this.options.okText === '确定' ? locale.okText : _this.options.okText; _this.options.dismissText = _this.options.dismissText === '取消' ? locale.dismissText : _this.options.dismissText; })); }; /** * @return {?} */ PickerComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.reloadPicker(); }; /** * @return {?} */ PickerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this._unsubscribe$.next(); this._unsubscribe$.complete(); }; PickerComponent.decorators = [ { type: Component, args: [{ selector: 'Picker', template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{ maskTransitionName }}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup am-picker-popup-wrap {{ transitionName }}\" style=\" min-height: 280px\">\n <div class=\"am-picker-popup-content\">\n <div class=\"am-picker-popup-body\">\n <div>\n <div class=\"am-picker-popup-header\">\n <div class=\"am-picker-popup-item am-picker-popup-header-left\" (click)=\"cancel()\">\n {{ options.dismissText }}\n </div>\n <div class=\"am-picker-popup-item am-picker-popup-title\">{{ options.title }}</div>\n <div class=\"am-picker-popup-item am-picker-popup-header-right\" (click)=\"ok()\">{{ options.okText }}</div>\n </div>\n <div class=\"am-picker\" style=\"flex-direction: row; align-items: center;\" #picker>\n <div *ngFor=\"let item of dataForRender; let i = index\" class=\"am-picker-col\">\n <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"options.indicatorStyle\"></div>\n <div class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\" id=\"{{ i }}\"></div>\n <div class=\"am-picker-col-content\">\n <div *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\" id=\"{{ i }}\">\n {{ val.label ? val.label : val }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ PickerComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: PickerOptions }, { type: LocaleProviderService } ]; }; PickerComponent.propDecorators = { _picker: [{ type: ViewChild, args: ['picker', { read: ViewContainerRef },] }], panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }], panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }], panend: [{ type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }] }; return PickerComponent; }(PickerRef)); export { PickerComponent }; if (false) { /** @type {?} */ PickerComponent.prototype.transitionName; /** @type {?} */ PickerComponent.prototype.maskTransitionName; /** @type {?} */ PickerComponent.prototype.startY; /** @type {?} */ PickerComponent.prototype.differY; /** @type {?} */ PickerComponent.prototype.currentY; /** @type {?} */ PickerComponent.prototype.len; /** @type {?} */ PickerComponent.prototype.dom; /** @type {?} */ PickerComponent.prototype.index; /** @type {?} */ PickerComponent.prototype.maxY; /** @type {?} */ PickerComponent.prototype.lineHeight; /** @type {?} */ PickerComponent.prototype.dataForRender; /** @type {?} */ PickerComponent.prototype.selectedTarget; /** @type {?} */ PickerComponent.prototype.isMouseDown; /** @type {?} */ PickerComponent.prototype.Velocity; /** @type {?} */ PickerComponent.prototype.currentPicker; /** * @type {?} * @private */ PickerComponent.prototype._unsubscribe$; /** * @type {?} * @private */ PickerComponent.prototype._picker; /** @type {?} */ PickerComponent.prototype.onChange; /** @type {?} */ PickerComponent.prototype.elementRef; /** @type {?} */ PickerComponent.prototype.options; /** * @type {?} * @private */ PickerComponent.prototype._localeProviderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sS0FBSyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFVBQVUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFFL0M7SUFLdUQsMkNBQWU7SUFvSHBFLHlCQUNTLFVBQXNCLEVBQ3RCLE9BQXNCLEVBQ3JCLHNCQUE2QztRQUh2RCxZQUtFLGlCQUFPLFNBQ1I7UUFMUSxnQkFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixhQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3JCLDRCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUF0SHZELG9CQUFjLEdBQVcsNENBQTRDLENBQUM7UUFDdEUsd0JBQWtCLEdBQVcsb0NBQW9DLENBQUM7UUFDbEUsWUFBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGNBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsU0FBRyxHQUFXLENBQUMsQ0FBQztRQUNoQixTQUFHLEdBQVEsSUFBSSxDQUFD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QVEsQ0FBQzt5QkFhcEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNsQyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ3JDLFlBQVksU0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBMlB0QyxzQkFBQztDQUFBLEFBL1RELENBS3VELFNBQVMsR0EwVC9EO1NBMVRZLGVBQWU7OztJQUMxQix5Q0FBc0U7O0lBQ3RFLDZDQUFrRTs7SUFDbEUsaUNBQW1COztJQUNuQixrQ0FBb0I7O0lBQ3BCLG1DQUFxQjs7SUFDckIsOEJBQWdCOztJQUNoQiw4QkFBZ0I7O0lBQ2hCLGdDQUFrQjs7SUFDbEIsK0JBQWlCOztJQUNqQixxQ0FBd0I7O0lBQ3hCLHdDQUEwQjs7SUFDMUIseUNBQTJCOztJQUMzQixzQ0FBNkI7O0lBQzdCLG1DQUFrQzs7SUFDbEMsd0NBQW1COzs7OztJQUVuQix3Q0FBMkQ7Ozs7O0lBRTNELGtDQUNrQzs7SUF3R2xDLG1DQUE0Qjs7SUFQMUIscUNBQTZCOztJQUM3QixrQ0FBNkI7Ozs7O0lBQzdCLGlEQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBDb21wb25lbnQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBBZnRlclZpZXdJbml0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBpY2tlck9wdGlvbnMgfSBmcm9tICcuL3BpY2tlci1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCAqIGFzIHZlbG9jaXR5IGZyb20gJy4uL2NvcmUvdXRpbC92ZWxvY2l0eSc7XG5pbXBvcnQgKiBhcyB0b3VjaEV2ZW50IGZyb20gJy4uL2NvcmUvdXRpbC90b3VjaC1ldmVudCc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGlja2VyUmVmIH0gZnJvbSAnLi9waWNrZXItcmVmLmNsYXNzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUGlja2VyQ29tcG9uZW50PFQgPSBhbnksIFIgPSBhbnk+IGV4dGVuZHMgUGlja2VyUmVmPFQsIFI+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICB0cmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJ2FtLXNsaWRlLXVwLWVudGVyIGFtLXNsaWRlLXVwLWVudGVyLWFjdGl2ZSc7XG4gIG1hc2tUcmFuc2l0aW9uTmFtZTogc3RyaW5nID0gJ2FtLWZhZGUtZW50ZXIgYW0tZmFkZS1lbnRlci1hY3RpdmUnO1xuICBzdGFydFk6IG51bWJlciA9IDA7XG4gIGRpZmZlclk6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRZOiBudW1iZXIgPSAwO1xuICBsZW46IG51bWJlciA9IDA7XG4gIGRvbTogYW55ID0gbnVsbDtcbiAgaW5kZXg6IG51bWJlciA9IDA7XG4gIG1heFk6IG51bWJlciA9IDA7XG4gIGxpbmVIZWlnaHQ6IG51bWJlciA9IDM0O1xuICBkYXRhRm9yUmVuZGVyOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZFRhcmdldDogYW55W10gPSBbXTtcbiAgaXNNb3VzZURvd246IGJvb2xlYW4gPSBmYWxzZTtcbiAgVmVsb2NpdHkgPSB2ZWxvY2l0eS5nZXRWZWxvY2l0eSgpO1xuICBjdXJyZW50UGlja2VyOiBhbnk7XG5cbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdwaWNrZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgcHJpdmF0ZSBfcGlja2VyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxuICBwYW5zdGFydChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kb20gPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlblsyXTtcbiAgICB0aGlzLmxlbiA9IHRoaXMuZG9tLmNoaWxkcmVuLmxlbmd0aDtcbiAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG5cbiAgICBpZiAodGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID09PSAndHJhbnNsYXRlWSgwcHgpJykge1xuICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFkgPSBpdGVtLmN1cnJlbnRZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFkgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5jbGllbnRZO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24gfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLmRpZmZlclkgPSBldi5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgdGhpcy5WZWxvY2l0eS5yZWNvcmQodGhpcy5kaWZmZXJZKTtcbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAwcyc7XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aGlzLmN1cnJlbnRZICogdGhpcy5saW5lSGVpZ2h0ICsgdGhpcy5kaWZmZXJZfXB4KWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCAhdGhpcy5pc01vdXNlRG93biB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vdXNlRG93biA9IGZhbHNlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLmRpZmZlclkgPSBldi5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgbGV0IHRpbWUgPSAwLjM7XG4gICAgY29uc3QgdmVsb2NpdHlUZW1wID0gdGhpcy5WZWxvY2l0eS5nZXRWZWxvY2l0eSh0aGlzLmRpZmZlclkpICogNDtcbiAgICBpZiAodmVsb2NpdHkpIHtcbiAgICAgIHRoaXMuZGlmZmVyWSA9IHZlbG9jaXR5VGVtcCAqIDQwICsgdGhpcy5kaWZmZXJZO1xuICAgICAgdGltZSA9IE1hdGguYWJzKHZlbG9jaXR5VGVtcCkgKiAwLjE7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtICcgKyAodGltZSA8IDAuMyA/IDAuMyA6IHRpbWUpICsgJ3MnO1xuICAgIGlmICh0aGlzLmRpZmZlclkgPD0gLXRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPD0gdGhpcy5tYXhZKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSB0aGlzLm1heFk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpZmZlclkgPj0gdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA+PSAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaGFzS2V5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldElkID09PSBldmVudC50YXJnZXQuaWQpIHtcbiAgICAgICAgICBoYXNLZXkgPSB0cnVlO1xuICAgICAgICAgIGl0ZW0udGFyZ2V0SWQgPSBldmVudC50YXJnZXQuaWQ7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IHRoaXMuY3VycmVudFk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoaXRlbS50YXJnZXRJZCwgMCkgPiBwYXJzZUludChldmVudC50YXJnZXQuaWQsIDApICYmIHRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBldmVudC50YXJnZXQuaWQsIGN1cnJlbnRZOiB0aGlzLmN1cnJlbnRZIH0pO1xuICAgIH1cbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHR9cHgpYDtcbiAgICB0aGlzLmluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmN1cnJlbnRZIC8gMSkpO1xuICAgIHRoaXMuc2V0Q3VycmVudFNlbGVjdGVkKHBhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCksIHRoaXMuaW5kZXgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT09IHRoaXMuY29tYmluZVJlc2x1dCgpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25QaWNrZXJDaGFuZ2UuZW1pdCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgb3B0aW9uczogUGlja2VyT3B0aW9ucyxcbiAgICBwcml2YXRlIF9sb2NhbGVQcm92aWRlclNlcnZpY2U6IExvY2FsZVByb3ZpZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55W10pID0+IHt9O1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGggPT09IDAgJiYgdGhpcy5nZW5lcmF0ZUFycmF5RGF0YSh0aGlzLm9wdGlvbnMuZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLnB1c2godGhpcy5nZW5lcmF0ZUFycmF5RGF0YSh0aGlzLm9wdGlvbnMuZGF0YSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2V0SW5pdFZhbHVlSW5kZXgodGhpcy5kYXRhRm9yUmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0FycmF5RGVlcCh0aGlzLm9wdGlvbnMuZGF0YVswXSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aW5kZXh9YCwgY3VycmVudFk6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5pdFZhbHVlSW5kZXgoZGF0YVRlbXApIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0ID0gW107XG4gICAgc2VsZi5vcHRpb25zLnZhbHVlLmZvckVhY2goKGVsZW1lbnQsIGkpID0+IHtcbiAgICAgIGRhdGFUZW1wLmZvckVhY2goKGl0ZW0sIGopID0+IHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKChpdGVtMSwgaykgPT4ge1xuICAgICAgICAgIGlmICgoZWxlbWVudCA9PT0gaXRlbTEubGFiZWwgfHwgZWxlbWVudCA9PT0gaXRlbTEudmFsdWUgfHwgZWxlbWVudCA9PT0gaXRlbTEpICYmIGkgPT09IGopIHtcbiAgICAgICAgICAgIHNlbGYuY2hlY2tBcnJheURlZXAoc2VsZi5kYXRhRm9yUmVuZGVyW2ldW2tdLCBmYWxzZSk7XG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aX1gLCBjdXJyZW50WTogLWsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5fcGlja2VyIHx8IHRoaXMuX3BpY2tlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBpY2tlciA9IHRoaXMuX3BpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpY2tlciAmJiB0aGlzLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VsZi5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgc2VsZi5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpdGVtLmN1cnJlbnRZLCAwKTtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtpbmRleCAqIHNlbGYubGluZUhlaWdodH1weClgO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQXJyYXlEYXRhKHRhcmdldEFycikge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcbiAgICBpZiAodGFyZ2V0QXJyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRhcmdldEFyci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHt9O1xuICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudFtrZXldID0gdGFyZ2V0QXJyW2ldW2tleV0gfHwgdGFyZ2V0QXJyW2ldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRlbXBBcnIucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRlbXBBcnI7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNoZWNrQXJyYXlEZWVwKHBhcmVudCwgaW5pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgT2JqZWN0ICYmIHBhcmVudC5jaGlsZHJlbiAmJiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEocGFyZW50LmNoaWxkcmVuKS5sZW5ndGggPiAwICYmIHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGggPCB0aGlzLm9wdGlvbnMuY29scykge1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaXRlbSkgPT09IEpTT04uc3RyaW5naWZ5KHBhcmVudC5jaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLnB1c2godGhpcy5nZW5lcmF0ZUFycmF5RGF0YShwYXJlbnQuY2hpbGRyZW4pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAocGFyZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9rKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXBkYXRlTmdNb2RlbCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVwZGF0ZU5nTW9kZWwodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jb25maXJtKHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICB9XG5cbiAgY29tYmluZVJlc2x1dCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoc2VsZi5kYXRhRm9yUmVuZGVyLmxlbmd0aCA+IDAgJiYgc2VsZi5kYXRhRm9yUmVuZGVyLmxlbmd0aCA+PSBwYXJzZU