ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
608 lines • 53.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,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, static: true },] }],
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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QUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO3lCQWFwQyxZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2xDLFlBQVksU0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDckMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUEyUHRDLHNCQUFDO0NBQUEsQUEvVEQsQ0FLdUQsU0FBUyxHQTBUL0Q7U0ExVFksZUFBZTs7O0lBQzFCLHlDQUFzRTs7SUFDdEUsNkNBQWtFOztJQUNsRSxpQ0FBbUI7O0lBQ25CLGtDQUFvQjs7SUFDcEIsbUNBQXFCOztJQUNyQiw4QkFBZ0I7O0lBQ2hCLDhCQUFnQjs7SUFDaEIsZ0NBQWtCOztJQUNsQiwrQkFBaUI7O0lBQ2pCLHFDQUF3Qjs7SUFDeEIsd0NBQTBCOztJQUMxQix5Q0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0IsbUNBQWtDOztJQUNsQyx3Q0FBbUI7Ozs7O0lBRW5CLHdDQUEyRDs7Ozs7SUFFM0Qsa0NBQ2tDOztJQXdHbEMsbUNBQTRCOztJQVAxQixxQ0FBNkI7O0lBQzdCLGtDQUE2Qjs7Ozs7SUFDN0IsaURBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIENvbXBvbmVudCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGlja2VyT3B0aW9ucyB9IGZyb20gJy4vcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuaW1wb3J0ICogYXMgdmVsb2NpdHkgZnJvbSAnLi4vY29yZS91dGlsL3ZlbG9jaXR5JztcbmltcG9ydCAqIGFzIHRvdWNoRXZlbnQgZnJvbSAnLi4vY29yZS91dGlsL3RvdWNoLWV2ZW50JztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQaWNrZXJSZWYgfSBmcm9tICcuL3BpY2tlci1yZWYuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQ8VCA9IGFueSwgUiA9IGFueT4gZXh0ZW5kcyBQaWNrZXJSZWY8VCwgUj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tc2xpZGUtdXAtZW50ZXIgYW0tc2xpZGUtdXAtZW50ZXItYWN0aXZlJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gIHN0YXJ0WTogbnVtYmVyID0gMDtcbiAgZGlmZmVyWTogbnVtYmVyID0gMDtcbiAgY3VycmVudFk6IG51bWJlciA9IDA7XG4gIGxlbjogbnVtYmVyID0gMDtcbiAgZG9tOiBhbnkgPSBudWxsO1xuICBpbmRleDogbnVtYmVyID0gMDtcbiAgbWF4WTogbnVtYmVyID0gMDtcbiAgbGluZUhlaWdodDogbnVtYmVyID0gMzQ7XG4gIGRhdGFGb3JSZW5kZXI6IGFueVtdID0gW107XG4gIHNlbGVjdGVkVGFyZ2V0OiBhbnlbXSA9IFtdO1xuICBpc01vdXNlRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuICBWZWxvY2l0eSA9IHZlbG9jaXR5LmdldFZlbG9jaXR5KCk7XG4gIGN1cnJlbnRQaWNrZXI6IGFueTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3BpY2tlcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZG9tID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkudGFyZ2V0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5bMl07XG4gICAgdGhpcy5sZW4gPSB0aGlzLmRvbS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgdGhpcy5tYXhZID0gLSh0aGlzLmxlbiAtIDEpO1xuXG4gICAgaWYgKHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9PT0gJ3RyYW5zbGF0ZVkoMHB4KScpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgPSAwO1xuICAgICAgdGhpcy5tYXhZID0gLSh0aGlzLmxlbiAtIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldElkID09PSBldmVudC50YXJnZXQuaWQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRZID0gaXRlbS5jdXJyZW50WTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRZID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkuY2xpZW50WTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gIHBhbm1vdmUoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpIHx8ICF0aGlzLmlzTW91c2VEb3duIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGV2ID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgdGhpcy5kaWZmZXJZID0gZXYuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIHRoaXMuVmVsb2NpdHkucmVjb3JkKHRoaXMuZGlmZmVyWSk7XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gMHMnO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodCArIHRoaXMuZGlmZmVyWX1weClgO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24gfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGV2ID0gdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgdGhpcy5kaWZmZXJZID0gZXYuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGxldCB0aW1lID0gMC4zO1xuICAgIGNvbnN0IHZlbG9jaXR5VGVtcCA9IHRoaXMuVmVsb2NpdHkuZ2V0VmVsb2NpdHkodGhpcy5kaWZmZXJZKSAqIDQ7XG4gICAgaWYgKHZlbG9jaXR5KSB7XG4gICAgICB0aGlzLmRpZmZlclkgPSB2ZWxvY2l0eVRlbXAgKiA0MCArIHRoaXMuZGlmZmVyWTtcbiAgICAgIHRpbWUgPSBNYXRoLmFicyh2ZWxvY2l0eVRlbXApICogMC4xO1xuICAgIH1cbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAnICsgKHRpbWUgPCAwLjMgPyAwLjMgOiB0aW1lKSArICdzJztcbiAgICBpZiAodGhpcy5kaWZmZXJZIDw9IC10aGlzLmxpbmVIZWlnaHQgLyAyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZICs9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJZIC8gdGhpcy5saW5lSGVpZ2h0KTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRZIDw9IHRoaXMubWF4WSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRZID0gdGhpcy5tYXhZO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5kaWZmZXJZID49IHRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPj0gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRZID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGhhc0tleSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50YXJnZXRJZCA9PT0gZXZlbnQudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgaGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgICBpdGVtLnRhcmdldElkID0gZXZlbnQudGFyZ2V0LmlkO1xuICAgICAgICAgIGl0ZW0uY3VycmVudFkgPSB0aGlzLmN1cnJlbnRZO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApID4gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKSAmJiB0aGlzLm9wdGlvbnMuY2FzY2FkZSkge1xuICAgICAgICAgIGl0ZW0uY3VycmVudFkgPSAwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBldmVudC50YXJnZXQuaWQsIGN1cnJlbnRZOiB0aGlzLmN1cnJlbnRZIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogZXZlbnQudGFyZ2V0LmlkLCBjdXJyZW50WTogdGhpcy5jdXJyZW50WSB9KTtcbiAgICB9XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aGlzLmN1cnJlbnRZICogdGhpcy5saW5lSGVpZ2h0fXB4KWA7XG4gICAgdGhpcy5pbmRleCA9IE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5jdXJyZW50WSAvIDEpKTtcbiAgICB0aGlzLnNldEN1cnJlbnRTZWxlY3RlZChwYXJzZUludChldmVudC50YXJnZXQuaWQsIDApLCB0aGlzLmluZGV4KTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlICE9PSB0aGlzLmNvbWJpbmVSZXNsdXQoKSkge1xuICAgICAgdGhpcy5vcHRpb25zLm9uUGlja2VyQ2hhbmdlLmVtaXQodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIG9wdGlvbnM6IFBpY2tlck9wdGlvbnMsXG4gICAgcHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKF86IGFueVtdKSA9PiB7fTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLmRhdGFGb3JSZW5kZXIubGVuZ3RoID09PSAwICYmIHRoaXMuZ2VuZXJhdGVBcnJheURhdGEodGhpcy5vcHRpb25zLmRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YUZvclJlbmRlci5wdXNoKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEodGhpcy5vcHRpb25zLmRhdGEpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmdldEluaXRWYWx1ZUluZGV4KHRoaXMuZGF0YUZvclJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAodGhpcy5vcHRpb25zLmRhdGFbMF0pO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGAke2luZGV4fWAsIGN1cnJlbnRZOiAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEluaXRWYWx1ZUluZGV4KGRhdGFUZW1wKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5zZWxlY3RlZFRhcmdldCA9IFtdO1xuICAgIHNlbGYub3B0aW9ucy52YWx1ZS5mb3JFYWNoKChlbGVtZW50LCBpKSA9PiB7XG4gICAgICBkYXRhVGVtcC5mb3JFYWNoKChpdGVtLCBqKSA9PiB7XG4gICAgICAgIGl0ZW0uZm9yRWFjaCgoaXRlbTEsIGspID0+IHtcbiAgICAgICAgICBpZiAoKGVsZW1lbnQgPT09IGl0ZW0xLmxhYmVsIHx8IGVsZW1lbnQgPT09IGl0ZW0xLnZhbHVlIHx8IGVsZW1lbnQgPT09IGl0ZW0xKSAmJiBpID09PSBqKSB7XG4gICAgICAgICAgICBzZWxmLmNoZWNrQXJyYXlEZWVwKHNlbGYuZGF0YUZvclJlbmRlcltpXVtrXSwgZmFsc2UpO1xuICAgICAgICAgICAgc2VsZi5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IC1rIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbG9hZFBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMuX3BpY2tlciB8fCB0aGlzLl9waWNrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQaWNrZXIgPSB0aGlzLl9waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaWNrZXIgJiYgdGhpcy5jdXJyZW50UGlja2VyLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAuM3MnO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5jdXJyZW50WSwgMCk7XG4gICAgICAgICAgc2VsZi5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7aW5kZXggKiBzZWxmLmxpbmVIZWlnaHR9cHgpYDtcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUFycmF5RGF0YSh0YXJnZXRBcnIpIHtcbiAgICBjb25zdCB0ZW1wQXJyID0gW107XG4gICAgaWYgKHRhcmdldEFyciBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB0YXJnZXRBcnIuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB7fTtcbiAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRba2V5XSA9IHRhcmdldEFycltpXVtrZXldIHx8IHRhcmdldEFycltpXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0ZW1wQXJyLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVtcEFyci5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0ZW1wQXJyO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjaGVja0FycmF5RGVlcChwYXJlbnQsIGluaXQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBwYXJlbnQuY2hpbGRyZW4gJiYgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHBhcmVudC5jaGlsZHJlbikubGVuZ3RoID4gMCAmJiB0aGlzLmRhdGFGb3JSZW5kZXIubGVuZ3RoIDwgdGhpcy5vcHRpb25zLmNvbHMpIHtcbiAgICAgICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGF0YUZvclJlbmRlci5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGl0ZW0pID09PSBKU09OLnN0cmluZ2lmeShwYXJlbnQuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YUZvclJlbmRlci5wdXNoKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEocGFyZW50LmNoaWxkcmVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXQpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHBhcmVudC5jaGlsZHJlblswXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnVwZGF0ZU5nTW9kZWwpIHtcbiAgICAgIHRoaXMub3B0aW9ucy51cGRhdGVOZ01vZGVsKHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb25maXJtKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY29uZmlybSh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgfVxuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgfVxuXG4gIGNvbWJpbmVSZXNsdXQoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHNlbGYuZGF0YUZ