ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
533 lines • 51.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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
*/
export class PickerComponent extends PickerRef {
/**
* @param {?} elementRef
* @param {?} options
* @param {?} _localeProviderService
*/
constructor(elementRef, options, _localeProviderService) {
super();
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 {?}
*/
(_) => { });
}
/**
* @param {?} event
* @return {?}
*/
panstart(event) {
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 {?}
*/
item => {
if (item.targetId === event.target.id) {
this.currentY = item.currentY;
}
}));
}
this.startY = touchEvent.getEventTarget(event).clientY;
}
/**
* @param {?} event
* @return {?}
*/
panmove(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
event.preventDefault();
/** @type {?} */
const 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 {?}
*/
panend(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
this.isMouseDown = false;
event.preventDefault();
/** @type {?} */
const ev = touchEvent.getEventTarget(event);
this.differY = ev.clientY - this.startY;
/** @type {?} */
let time = 0.3;
/** @type {?} */
const 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 {?} */
let hasKey = false;
this.selectedTarget.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.targetId === event.target.id) {
hasKey = 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) {
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 {?}
*/
init() {
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 (let index = 0; index < this.dataForRender.length; index++) {
this.selectedTarget.push({ targetId: `${index}`, currentY: 0 });
}
}
}
/**
* @param {?} dataTemp
* @return {?}
*/
getInitValueIndex(dataTemp) {
/** @type {?} */
const self = this;
self.selectedTarget = [];
self.options.value.forEach((/**
* @param {?} element
* @param {?} i
* @return {?}
*/
(element, i) => {
dataTemp.forEach((/**
* @param {?} item
* @param {?} j
* @return {?}
*/
(item, j) => {
item.forEach((/**
* @param {?} item1
* @param {?} k
* @return {?}
*/
(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 {?}
*/
reloadPicker() {
if (!this._picker || this._picker === undefined) {
return;
}
this.currentPicker = this._picker.element.nativeElement;
if (this.currentPicker && this.currentPicker.children.length > 0) {
/** @type {?} */
const self = this;
setTimeout((/**
* @return {?}
*/
() => {
self.selectedTarget.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(item, i) => {
self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
/** @type {?} */
const index = parseInt(item.currentY, 0);
self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
}));
}), 0);
}
}
/**
* @param {?} targetArr
* @return {?}
*/
generateArrayData(targetArr) {
/** @type {?} */
const tempArr = [];
if (targetArr instanceof Array) {
targetArr.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(item, i) => {
if (item instanceof Array) {
/** @type {?} */
const keys = Object.keys(item);
/** @type {?} */
const element = {};
keys.forEach((/**
* @param {?} key
* @return {?}
*/
key => {
element[key] = targetArr[i][key] || targetArr[i];
}));
tempArr.push(element);
}
else {
tempArr.push(item);
}
}));
return tempArr;
}
return [];
}
/**
* @param {?} parent
* @param {?=} init
* @return {?}
*/
checkArrayDeep(parent, 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 {?} */
let hasValue = false;
this.dataForRender.filter((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
(item, index) => {
if (JSON.stringify(item) === JSON.stringify(parent.children)) {
hasValue = true;
}
}));
if (!hasValue) {
this.dataForRender.push(this.generateArrayData(parent.children));
}
if (init) {
this.checkArrayDeep(parent.children[0]);
}
}
}
}
/**
* @return {?}
*/
ok() {
if (this.options.updateNgModel) {
this.options.updateNgModel(this.combineReslut());
}
if (this.options.confirm) {
this.options.confirm(this.combineReslut());
}
this.setTransitionName();
}
/**
* @return {?}
*/
combineReslut() {
/** @type {?} */
const result = [];
/** @type {?} */
const self = this;
self.selectedTarget.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (self.dataForRender.length > 0 && self.dataForRender.length >= parseInt(item.targetId, 0) + 1) {
/** @type {?} */
const curItem = self.dataForRender[parseInt(item.targetId, 0)][-item.currentY];
if (curItem !== undefined) {
result.push(curItem);
}
}
}));
return result;
}
/**
* @return {?}
*/
cancel() {
this.setTransitionName();
this.options.onDismiss.emit();
if (this.options.cancel) {
this.options.cancel();
}
}
/**
* @return {?}
*/
setTransitionName() {
this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
setTimeout((/**
* @return {?}
*/
() => {
this.options.hidePicker();
}), 200);
}
/**
* @param {?} target
* @param {?} index
* @return {?}
*/
setCurrentSelected(target, index) {
if (!this.options.cascade) {
return;
}
/** @type {?} */
const 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 (let 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 {?}
*/
() => {
this.dataForRender.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(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 {?}
*/
getInstance() {
return this;
}
/**
* @return {?}
*/
getElement() {
return this.elementRef && this.elementRef.nativeElement;
}
/**
* @return {?}
*/
close() {
if (this.options.hidePicker) {
this.options.hidePicker();
}
}
/**
* @return {?}
*/
destroy() {
this.close();
}
/**
* @return {?}
*/
ngOnInit() {
this.init();
this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe((/**
* @param {?} _
* @return {?}
*/
_ => {
/** @type {?} */
const 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 {?}
*/
ngAfterViewInit() {
this.reloadPicker();
}
/**
* @return {?}
*/
ngOnDestroy() {
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 = () => [
{ 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'],] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxLQUFLLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssVUFBVSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU8vQyxNQUFNLE9BQU8sZUFBa0MsU0FBUSxTQUFlOzs7Ozs7SUFvSHBFLFlBQ1MsVUFBc0IsRUFDdEIsT0FBc0IsRUFDckIsc0JBQTZDO1FBRXJELEtBQUssRUFBRSxDQUFDO1FBSkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3JCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUF0SHZELG1CQUFjLEdBQVcsNENBQTRDLENBQUM7UUFDdEUsdUJBQWtCLEdBQVcsb0NBQW9DLENBQUM7UUFDbEUsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsUUFBRyxHQUFXLENBQUMsQ0FBQztRQUNoQixRQUFH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USxDQUFDLGNBQ3JDLFlBQVksU0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUE5RHBDLHlDQUFzRTs7SUFDdEUsNkNBQWtFOztJQUNsRSxpQ0FBbUI7O0lBQ25CLGtDQUFvQjs7SUFDcEIsbUNBQXFCOztJQUNyQiw4QkFBZ0I7O0lBQ2hCLDhCQUFnQjs7SUFDaEIsZ0NBQWtCOztJQUNsQiwrQkFBaUI7O0lBQ2pCLHFDQUF3Qjs7SUFDeEIsd0NBQTBCOztJQUMxQix5Q0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0IsbUNBQWtDOztJQUNsQyx3Q0FBbUI7Ozs7O0lBRW5CLHdDQUEyRDs7Ozs7SUFFM0Qsa0NBQ2tDOztJQXdHbEMsbUNBQTRCOztJQVAxQixxQ0FBNkI7O0lBQzdCLGtDQUE2Qjs7Ozs7SUFDN0IsaURBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIENvbXBvbmVudCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGlja2VyT3B0aW9ucyB9IGZyb20gJy4vcGlja2VyLW9wdGlvbnMucHJvdmlkZXInO1xuaW1wb3J0ICogYXMgdmVsb2NpdHkgZnJvbSAnLi4vY29yZS91dGlsL3ZlbG9jaXR5JztcbmltcG9ydCAqIGFzIHRvdWNoRXZlbnQgZnJvbSAnLi4vY29yZS91dGlsL3RvdWNoLWV2ZW50JztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9sb2NhbGUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQaWNrZXJSZWYgfSBmcm9tICcuL3BpY2tlci1yZWYuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQ8VCA9IGFueSwgUiA9IGFueT4gZXh0ZW5kcyBQaWNrZXJSZWY8VCwgUj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tc2xpZGUtdXAtZW50ZXIgYW0tc2xpZGUtdXAtZW50ZXItYWN0aXZlJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gIHN0YXJ0WTogbnVtYmVyID0gMDtcbiAgZGlmZmVyWTogbnVtYmVyID0gMDtcbiAgY3VycmVudFk6IG51bWJlciA9IDA7XG4gIGxlbjogbnVtYmVyID0gMDtcbiAgZG9tOiBhbnkgPSBudWxsO1xuICBpbmRleDogbnVtYmVyID0gMDtcbiAgbWF4WTogbnVtYmVyID0gMDtcbiAgbGluZUhlaWdodDogbnVtYmVyID0gMzQ7XG4gIGRhdGFGb3JSZW5kZXI6IGFueVtdID0gW107XG4gIHNlbGVjdGVkVGFyZ2V0OiBhbnlbXSA9IFtdO1xuICBpc01vdXNlRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuICBWZWxvY2l0eSA9IHZlbG9jaXR5LmdldFZlbG9jaXR5KCk7XG4gIGN1cnJlbnRQaWNrZXI6IGFueTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBwcml2YXRlIF9waWNrZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vdXNlRG93biA9IHRydWU7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRvbSA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnRhcmdldC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuWzJdO1xuICAgIHRoaXMubGVuID0gdGhpcy5kb20uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcblxuICAgIGlmICh0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPT09ICd0cmFuc2xhdGVZKDBweCknKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZID0gMDtcbiAgICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50YXJnZXRJZCA9PT0gZXZlbnQudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50WSA9IGl0ZW0uY3VycmVudFk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0WSA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLmNsaWVudFk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICBwYW5tb3ZlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCAhdGhpcy5pc01vdXNlRG93biB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldiA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICB0aGlzLlZlbG9jaXR5LnJlY29yZCh0aGlzLmRpZmZlclkpO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIDBzJztcbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHQgKyB0aGlzLmRpZmZlcll9cHgpYDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICBwYW5lbmQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpIHx8ICF0aGlzLmlzTW91c2VEb3duIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTW91c2VEb3duID0gZmFsc2U7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldiA9IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBsZXQgdGltZSA9IDAuMztcbiAgICBjb25zdCB2ZWxvY2l0eVRlbXAgPSB0aGlzLlZlbG9jaXR5LmdldFZlbG9jaXR5KHRoaXMuZGlmZmVyWSkgKiA0O1xuICAgIGlmICh2ZWxvY2l0eSkge1xuICAgICAgdGhpcy5kaWZmZXJZID0gdmVsb2NpdHlUZW1wICogNDAgKyB0aGlzLmRpZmZlclk7XG4gICAgICB0aW1lID0gTWF0aC5hYnModmVsb2NpdHlUZW1wKSAqIDAuMTtcbiAgICB9XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gJyArICh0aW1lIDwgMC4zID8gMC4zIDogdGltZSkgKyAncyc7XG4gICAgaWYgKHRoaXMuZGlmZmVyWSA8PSAtdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA8PSB0aGlzLm1heFkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WSA9IHRoaXMubWF4WTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlmZmVyWSA+PSB0aGlzLmxpbmVIZWlnaHQgLyAyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZICs9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJZIC8gdGhpcy5saW5lSGVpZ2h0KTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRZID49IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBoYXNLZXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIGhhc0tleSA9IHRydWU7XG4gICAgICAgICAgaXRlbS50YXJnZXRJZCA9IGV2ZW50LnRhcmdldC5pZDtcbiAgICAgICAgICBpdGVtLmN1cnJlbnRZID0gdGhpcy5jdXJyZW50WTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChpdGVtLnRhcmdldElkLCAwKSA+IHBhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCkgJiYgdGhpcy5vcHRpb25zLmNhc2NhZGUpIHtcbiAgICAgICAgICBpdGVtLmN1cnJlbnRZID0gMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogZXZlbnQudGFyZ2V0LmlkLCBjdXJyZW50WTogdGhpcy5jdXJyZW50WSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodH1weClgO1xuICAgIHRoaXMuaW5kZXggPSBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuY3VycmVudFkgLyAxKSk7XG4gICAgdGhpcy5zZXRDdXJyZW50U2VsZWN0ZWQocGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKSwgdGhpcy5pbmRleCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZSAhPT0gdGhpcy5jb21iaW5lUmVzbHV0KCkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5vblBpY2tlckNoYW5nZS5lbWl0KHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBvcHRpb25zOiBQaWNrZXJPcHRpb25zLFxuICAgIHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyU2VydmljZTogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnlbXSkgPT4ge307XG5cbiAgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHRoaXMub3B0aW9ucy5kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRhdGFGb3JSZW5kZXIucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHRoaXMub3B0aW9ucy5kYXRhKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXRJbml0VmFsdWVJbmRleCh0aGlzLmRhdGFGb3JSZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMub3B0aW9ucy5kYXRhWzBdKTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGFGb3JSZW5kZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpbmRleH1gLCBjdXJyZW50WTogMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbml0VmFsdWVJbmRleChkYXRhVGVtcCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQgPSBbXTtcbiAgICBzZWxmLm9wdGlvbnMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xuICAgICAgZGF0YVRlbXAuZm9yRWFjaCgoaXRlbSwgaikgPT4ge1xuICAgICAgICBpdGVtLmZvckVhY2goKGl0ZW0xLCBrKSA9PiB7XG4gICAgICAgICAgaWYgKChlbGVtZW50ID09PSBpdGVtMS5sYWJlbCB8fCBlbGVtZW50ID09PSBpdGVtMS52YWx1ZSB8fCBlbGVtZW50ID09PSBpdGVtMSkgJiYgaSA9PT0gaikge1xuICAgICAgICAgICAgc2VsZi5jaGVja0FycmF5RGVlcChzZWxmLmRhdGFGb3JSZW5kZXJbaV1ba10sIGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpfWAsIGN1cnJlbnRZOiAtayB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWxvYWRQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9waWNrZXIgfHwgdGhpcy5fcGlja2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGlja2VyID0gdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5jdXJyZW50UGlja2VyICYmIHRoaXMuY3VycmVudFBpY2tlci5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gLjNzJztcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGl0ZW0uY3VycmVudFksIDApO1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2luZGV4ICogc2VsZi5saW5lSGVpZ2h0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBcnJheURhdGEodGFyZ2V0QXJyKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuICAgIGlmICh0YXJnZXRBcnIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGFyZ2V0QXJyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0ge307XG4gICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50W2tleV0gPSB0YXJnZXRBcnJbaV1ba2V5XSB8fCB0YXJnZXRBcnJbaV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcEFyci5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBBcnIucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcEFycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY2hlY2tBcnJheURlZXAocGFyZW50LCBpbml0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgcGFyZW50LmNoaWxkcmVuICYmIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0ZUFycmF5RGF0YShwYXJlbnQuY2hpbGRyZW4pLmxlbmd0aCA+IDAgJiYgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5jb2xzKSB7XG4gICAgICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRhdGFGb3JSZW5kZXIuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpdGVtKSA9PT0gSlNPTi5zdHJpbmdpZnkocGFyZW50LmNoaWxkcmVuKSkge1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmRhdGFGb3JSZW5kZXIucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHBhcmVudC5jaGlsZHJlbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgdGhpcy5jaGVja0FycmF5RGVlcChwYXJlbnQuY2hpbGRyZW5bMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb2soKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVOZ01vZGVsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudXBkYXRlTmdNb2RlbCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29uZmlybSkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbmZpcm0odGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgICB0aGlzLnNldFRyYW5zaXRpb25OYW1lKCk7XG4gIH1cblxuICBjb21iaW5lUmVzbHV0KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChzZWxmLmRhdGFGb3JSZW5kZXIubGVuZ3RoID4gMCAmJiBzZWxmLmRhdGFGb3JSZW5kZXIubGVuZ3RoID49IHBhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApICsgMSkge1xuICAgICAgICBjb25zdCBjdXJJdGVtID0gc2VsZi5kYXRhRm9yUmVuZGVyW3BhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApXVstaXRlbS5jdXJyZW50WV07XG4gICAgICAgIGlmIChjdXJJdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChjdXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICAgIHRoaXMub3B0aW9ucy5vbkRpc21pc3MuZW1pdCgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuY2VsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9ICdhbS1zbGlkZS11cC1sZWF2ZSBhbS1zbGlkZS11cC1sZWF2ZS1hY3RpdmUnO1xuICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gJ2FtLWZhZGUtbGVhdmUgYW0tZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmhpZGVQaWNrZXIoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgc2V0Q3VycmVudFNlbGVjdGVkKHRhcmdldCwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGEgPSB0aGlzLmRhdGFGb3JSZW5kZXIuc2xpY2UoMCwgdGFyZ2V0ICsgMSk7XG4gICAgdGhpcy5kYXRhRm9yUmVuZGVyID0gYTtcbiAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMuZGF0YUZvclJlbmRlclt0YXJnZXRdW2luZGV4XSk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA8IHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gdGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKGkgPCB0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldFtpXSA9IHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IDAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IDAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYCR7aX1gICYmIGkgPiB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgwcHgpJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXRJbnN0YW5jZSgpOiBQaWNrZXJDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIH