ngx-amap
Version:
[][npm-badge-url] [][npm-badge-url] [][ci-url]
567 lines • 42.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: directives/ui-simple-marker/ui-simple-marker.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Input, Output, EventEmitter, ContentChildren, QueryList, } from '@angular/core';
import { zip } from 'rxjs';
import { AMapOverlay, OverlayOptions } from '../../base/amap-overlay';
import { AmapInfoWindowComponent } from '../../components/amap-info-window/amap-info-window.component';
import { getOptions, ChangeFilter } from '../../utils';
/** @type {?} */
export const SimpleMarkerOptions = [
...OverlayOptions,
// Marker options without cotent
'position',
'anchor',
'offset',
'icon',
'topWhenClick',
'raiseOnDrag',
'visible',
'zIndex',
'angle',
'autoRotation',
'animation',
'shadow',
'title',
'shape',
'label',
// Own options
'iconTheme',
'iconStyle',
'iconLabel',
'showPositionPoint',
'containerClassNames',
];
export class UISimpleMarker extends AMapOverlay {
/**
* @param {?} os
* @param {?} binder
* @param {?} amaps
* @param {?} pixels
* @param {?} icons
* @param {?} mlabels
* @param {?} logger
* @param {?} ngZone
*/
constructor(os, binder, amaps, pixels, icons, mlabels, logger, ngZone) {
super(os, binder);
this.os = os;
this.binder = binder;
this.amaps = amaps;
this.pixels = pixels;
this.icons = icons;
this.mlabels = mlabels;
this.logger = logger;
this.ngZone = ngZone;
this.TAG = 'ui-simple-marker';
/**
* 额外: 是否隐藏
*/
this.hidden = false;
/**
* 额外: 是否包含在点聚合中
*/
this.inCluster = false;
/**
* 额外: 点击时是否显示信息窗体
*/
this.openInfoWindow = true;
// amap-marker events:
this.naReady = new EventEmitter();
// amap info window:
this.infoWindowComponent = new QueryList();
this.inited = false;
/** @type {?} */
const target = this.os.get();
this.naMouseOut = this.binder.bindEvent(target, 'mouseout');
this.naDragStart = this.binder.bindEvent(target, 'dragstart');
this.naDragging = this.binder.bindEvent(target, 'dragging');
this.naDragEnd = this.binder.bindEvent(target, 'dragend');
this.naMoving = this.binder.bindEvent(target, 'moving');
this.naMoveEnd = this.binder.bindEvent(target, 'moveend');
this.naMoveAlong = this.binder.bindEvent(target, 'movealong');
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.os.destroy();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const filter = ChangeFilter.of(changes);
/** @type {?} */
const marker = this.get();
if (!this.inited) {
// do not draw marker when no poistion defined.
if (!this.position) {
return;
}
this.amaps.get().subscribe((/**
* @return {?}
*/
() => {
this.logger.d(this.TAG, 'initializing ...');
// bind info window events:
this.subscription = this.binder.bindEvent(marker, 'click').subscribe((/**
* @return {?}
*/
() => {
if (this.openInfoWindow) {
this.infoWindowComponent.forEach((/**
* @param {?} w
* @return {?}
*/
w => w.open()));
}
}));
/** @type {?} */
const options = this.getOptions();
if (this.icon) {
options.icon = this.icons.create(this.icon);
}
if (this.shadow) {
options.shadow = this.icons.create(this.shadow);
}
if (this.label) {
options.label = this.mlabels.create(this.label);
}
if (this.offset) {
options.offset = this.pixels.create(this.offset);
}
this.logger.d(this.TAG, 'options:', options);
this.os.create(options).subscribe((/**
* @param {?} m
* @return {?}
*/
m => {
this.ngZone.run((/**
* @return {?}
*/
() => this.naReady.emit(m)));
this.logger.d(this.TAG, 'marker is ready.');
}));
this.inited = true;
this.updateInfoWindow();
this.updateInfoWindowPosition();
}));
}
else {
zip(filter.has('icon'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setIcon(this.icons.create(v))));
zip(filter.has('shadow'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setShadow(this.icons.create(v))));
zip(filter.has('label'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setLabel(this.mlabels.create(v))));
zip(filter.has('title'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTitle(v)));
zip(filter.has('extData'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setExtData(v)));
zip(filter.has('clickable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setClickable(!!v)));
zip(filter.has('draggable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setDraggable(!!v)));
zip(filter.has('visible'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.show() : m.hide())));
zip(filter.has('cursor'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setCursor(v)));
zip(filter.has('animation'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAnimation(v)));
zip(filter.has('angle'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAngle(v)));
zip(filter.has('zIndex'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setzIndex(v)));
zip(filter.has('shape'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setShape(v)));
zip(filter.notEmpty('offset'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setOffset(this.pixels.create(v))));
zip(filter.notEmpty('position'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setPosition(v)));
zip(filter.has('showPositionPoint'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => {
if (!!v) {
m.showPositionPoint();
}
else {
m.hidePositionPoint();
}
}));
zip(filter.notEmpty('iconStyle'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => {
if (changes.iconTheme && changes.iconTheme.currentValue) {
m.setIconThemeAndStyle(changes.iconTheme.currentValue, v);
}
else {
m.setIconStyle(v);
}
}));
zip(filter.notEmpty('iconLabel'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setIconLabel(v)));
zip(filter.notEmpty('containerClassNames'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setContainerClassNames(v)));
}
zip(filter.has('isTop'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTop(!!v)));
zip(filter.has('hidden'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.hide() : m.show())));
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.updateInfoWindow();
this.infoWindowComponent.changes.subscribe((/**
* @return {?}
*/
() => this.updateInfoWindow()));
}
/**
* @private
* @return {?}
*/
updateInfoWindow() {
if (this.infoWindowComponent && this.inited) {
if (this.infoWindowComponent.length > 1) {
this.logger.e(this.TAG, 'Expected no more than 1 info window.');
return;
}
/** @type {?} */
const marker = this.os.get();
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.hostMarker = marker;
}));
}
}
/**
* @private
* @return {?}
*/
updateInfoWindowPosition() {
if (this.infoWindowComponent && this.inited) {
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.toggleOpen();
}));
}
}
/**
* @return {?}
*/
getOptions() {
return getOptions(this, SimpleMarkerOptions);
}
/**
* 获取已创建的 AMapUI 对象
* @return {?}
*/
get() {
return this.os.get();
}
}
UISimpleMarker.propDecorators = {
iconTheme: [{ type: Input }],
iconStyle: [{ type: Input }],
iconLabel: [{ type: Input }],
showPositionPoint: [{ type: Input }],
containerClassNames: [{ type: Input }],
position: [{ type: Input }],
anchor: [{ type: Input }],
offset: [{ type: Input }],
icon: [{ type: Input }],
topWhenClick: [{ type: Input }],
raiseOnDrag: [{ type: Input }],
visible: [{ type: Input }],
zIndex: [{ type: Input }],
angle: [{ type: Input }],
autoRotation: [{ type: Input }],
animation: [{ type: Input }],
shadow: [{ type: Input }],
title: [{ type: Input }],
shape: [{ type: Input }],
label: [{ type: Input }],
isTop: [{ type: Input }],
hidden: [{ type: Input }],
inCluster: [{ type: Input }],
openInfoWindow: [{ type: Input }],
naReady: [{ type: Output }],
naMouseOut: [{ type: Output }],
naDragStart: [{ type: Output }],
naDragging: [{ type: Output }],
naDragEnd: [{ type: Output }],
naMoving: [{ type: Output }],
naMoveEnd: [{ type: Output }],
naMoveAlong: [{ type: Output }],
infoWindowComponent: [{ type: ContentChildren, args: [AmapInfoWindowComponent,] }]
};
if (false) {
/** @type {?} */
UISimpleMarker.prototype.TAG;
/**
* 样式主题
* @type {?}
*/
UISimpleMarker.prototype.iconTheme;
/**
* 背景图标样式
* @type {?}
*/
UISimpleMarker.prototype.iconStyle;
/**
* 图标前景文字
* @type {?}
*/
UISimpleMarker.prototype.iconLabel;
/**
* 是否显示定位点
* @type {?}
*/
UISimpleMarker.prototype.showPositionPoint;
/**
* 内建的Dom容器上附带的class,多个class name用空格分开
* @type {?}
*/
UISimpleMarker.prototype.containerClassNames;
/**
* 点标记在地图上显示的位置
* @type {?}
*/
UISimpleMarker.prototype.position;
/**
* 标记锚点
* @type {?}
*/
UISimpleMarker.prototype.anchor;
/**
* 点标记显示位置偏移量
* @type {?}
*/
UISimpleMarker.prototype.offset;
/**
* 需在点标记中显示的图标
* @type {?}
*/
UISimpleMarker.prototype.icon;
/**
* 鼠标点击时marker是否置顶
* @type {?}
*/
UISimpleMarker.prototype.topWhenClick;
/**
* 拖拽点标记时是否开启点标记离开地图的效果
* @type {?}
*/
UISimpleMarker.prototype.raiseOnDrag;
/**
* 点标记是否可见
* @type {?}
*/
UISimpleMarker.prototype.visible;
/**
* 点标记的叠加顺序
* @type {?}
*/
UISimpleMarker.prototype.zIndex;
/**
* 点标记的旋转角度
* @type {?}
*/
UISimpleMarker.prototype.angle;
/**
* 是否自动旋转
* @type {?}
*/
UISimpleMarker.prototype.autoRotation;
/**
* 点标记的动画效果
* @type {?}
*/
UISimpleMarker.prototype.animation;
/**
* 点标记阴影
* @type {?}
*/
UISimpleMarker.prototype.shadow;
/**
* 鼠标滑过点标记时的文字提示
* @type {?}
*/
UISimpleMarker.prototype.title;
/**
* 可点击区域
* @type {?}
*/
UISimpleMarker.prototype.shape;
/**
* 文本标注
* @type {?}
*/
UISimpleMarker.prototype.label;
/**
* 额外: 是否置顶
* @type {?}
*/
UISimpleMarker.prototype.isTop;
/**
* 额外: 是否隐藏
* @type {?}
*/
UISimpleMarker.prototype.hidden;
/**
* 额外: 是否包含在点聚合中
* @type {?}
*/
UISimpleMarker.prototype.inCluster;
/**
* 额外: 点击时是否显示信息窗体
* @type {?}
*/
UISimpleMarker.prototype.openInfoWindow;
/** @type {?} */
UISimpleMarker.prototype.naReady;
/** @type {?} */
UISimpleMarker.prototype.naMouseOut;
/** @type {?} */
UISimpleMarker.prototype.naDragStart;
/** @type {?} */
UISimpleMarker.prototype.naDragging;
/** @type {?} */
UISimpleMarker.prototype.naDragEnd;
/** @type {?} */
UISimpleMarker.prototype.naMoving;
/** @type {?} */
UISimpleMarker.prototype.naMoveEnd;
/** @type {?} */
UISimpleMarker.prototype.naMoveAlong;
/** @type {?} */
UISimpleMarker.prototype.infoWindowComponent;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.inited;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.subscription;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.os;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.binder;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.amaps;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.pixels;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.icons;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.mlabels;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.logger;
/**
* @type {?}
* @protected
*/
UISimpleMarker.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktc2ltcGxlLW1hcmtlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1hbWFwLyIsInNvdXJjZXMiOlsiZGlyZWN0aXZlcy91aS1zaW1wbGUtbWFya2VyL3VpLXNpbXBsZS1tYXJrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFDTixZQUFZLEVBR1osZUFBZSxFQUNmLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3RFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBSXZHLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQU12RCxNQUFNLE9BQU8sbUJBQW1CLEdBQUc7SUFDakMsR0FBRyxjQUFjO0lBQ2pCLGdDQUFnQztJQUNoQyxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sY0FBYztJQUNkLGFBQWE7SUFDYixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxjQUFjO0lBQ2QsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxjQUFjO0lBQ2QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLHFCQUFxQjtDQUN0QjtBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsV0FBZ0I7Ozs7Ozs7Ozs7O0lBc0hsRCxZQUNZLEVBQW1CLEVBQ25CLE1BQTBCLEVBQzFCLEtBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLEtBQWtCLEVBQ2xCLE9BQTJCLEVBQzNCLE1BQXFCLEVBQ3JCLE1BQWM7UUFFeEIsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQVRS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Q0FBQyxNQUFNLENBQUMsR0FBRyxDQUFNLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDL0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7WUFDN0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUNoRixHQUFHLENBQUMs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dUJBQXVCOzs7O0lBOUd4Qyw2QkFBeUI7Ozs7O0lBS3pCLG1DQUE0RDs7Ozs7SUFJNUQsbUNBQW9DOzs7OztJQUlwQyxtQ0FBb0M7Ozs7O0lBSXBDLDJDQUE2Qzs7Ozs7SUFJN0MsNkNBQXFDOzs7OztJQUlyQyxrQ0FBc0M7Ozs7O0lBSXRDLGdDQUFvQzs7Ozs7SUFJcEMsZ0NBQXFDOzs7OztJQUlyQyw4QkFBMEM7Ozs7O0lBSTFDLHNDQUErQjs7Ozs7SUFJL0IscUNBQThCOzs7OztJQUk5QixpQ0FBMEI7Ozs7O0lBSTFCLGdDQUF3Qjs7Ozs7SUFJeEIsK0JBQXVCOzs7OztJQUl2QixzQ0FBK0I7Ozs7O0lBSS9CLG1DQUF1Qzs7Ozs7SUFJdkMsZ0NBQTRDOzs7OztJQUk1QywrQkFBdUI7Ozs7O0lBSXZCLCtCQUFpQzs7Ozs7SUFJakMsK0JBQWlEOzs7OztJQUlqRCwrQkFBd0I7Ozs7O0lBSXhCLGdDQUF3Qjs7Ozs7SUFJeEIsbUNBQTJCOzs7OztJQUkzQix3Q0FBK0I7O0lBRy9CLGlDQUF1Qzs7SUFDdkMsb0NBQXdDOztJQUN4QyxxQ0FBeUM7O0lBQ3pDLG9DQUF3Qzs7SUFDeEMsbUNBQXVDOztJQUN2QyxrQ0FBc0M7O0lBQ3RDLG1DQUF1Qzs7SUFDdkMscUNBQXlDOztJQUd6Qyw2Q0FDK0Q7Ozs7O0lBRS9ELGdDQUF5Qjs7Ozs7SUFDekIsc0NBQXFDOzs7OztJQUduQyw0QkFBNkI7Ozs7O0lBQzdCLGdDQUFvQzs7Ozs7SUFDcEMsK0JBQTRCOzs7OztJQUM1QixnQ0FBOEI7Ozs7O0lBQzlCLCtCQUE0Qjs7Ozs7SUFDNUIsaUNBQXFDOzs7OztJQUNyQyxnQ0FBK0I7Ozs7O0lBQy9CLGdDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkNoYW5nZXMsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgemlwLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFNYXBPdmVybGF5LCBPdmVybGF5T3B0aW9ucyB9IGZyb20gJy4uLy4uL2Jhc2UvYW1hcC1vdmVybGF5JztcbmltcG9ydCB7IEV2ZW50QmluZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9ldmVudC1iaW5kZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJUGl4ZWwsIElJY29uLCBJTWFya2VyTGFiZWwgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFtYXBJbmZvV2luZG93Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hbWFwLWluZm8td2luZG93L2FtYXAtaW5mby13aW5kb3cuY29tcG9uZW50JztcbmltcG9ydCB7IEFNYXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FtYXAuc2VydmljZSc7XG5pbXBvcnQgeyBXaXRoQ3JlYXRlIH0gZnJvbSAnLi4vLi4vYmFzZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2VyL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IGdldE9wdGlvbnMsIENoYW5nZUZpbHRlciB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IFBpeGVsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9waXhlbC5zZXJ2aWNlJztcbmltcG9ydCB7IEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXJrZXJMYWJlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbWFya2VyLWxhYmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQU1hcFVJU2ltcGxlTWFya2VyIH0gZnJvbSAnLi91aS1zaW1wbGUtbWFya2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgU2ltcGxlTWFya2VyT3B0aW9ucyA9IFtcbiAgLi4uT3ZlcmxheU9wdGlvbnMsXG4gIC8vIE1hcmtlciBvcHRpb25zIHdpdGhvdXQgY290ZW50XG4gICdwb3NpdGlvbicsXG4gICdhbmNob3InLFxuICAnb2Zmc2V0JyxcbiAgJ2ljb24nLFxuICAndG9wV2hlbkNsaWNrJyxcbiAgJ3JhaXNlT25EcmFnJyxcbiAgJ3Zpc2libGUnLFxuICAnekluZGV4JyxcbiAgJ2FuZ2xlJyxcbiAgJ2F1dG9Sb3RhdGlvbicsXG4gICdhbmltYXRpb24nLFxuICAnc2hhZG93JyxcbiAgJ3RpdGxlJyxcbiAgJ3NoYXBlJyxcbiAgJ2xhYmVsJyxcbiAgLy8gT3duIG9wdGlvbnNcbiAgJ2ljb25UaGVtZScsXG4gICdpY29uU3R5bGUnLFxuICAnaWNvbkxhYmVsJyxcbiAgJ3Nob3dQb3NpdGlvblBvaW50JyxcbiAgJ2NvbnRhaW5lckNsYXNzTmFtZXMnLFxuXTtcblxuZXhwb3J0IGNsYXNzIFVJU2ltcGxlTWFya2VyIGV4dGVuZHMgQU1hcE92ZXJsYXk8YW55PlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcbiAgVEFHID0gJ3VpLXNpbXBsZS1tYXJrZXInO1xuICAvLyAtLS0tIE9wdGlvbnMgLS0tLVxuICAvKipcbiAgICog5qC35byP5Li76aKYXG4gICAqL1xuICBASW5wdXQoKSBpY29uVGhlbWU6ICdkZWZhdWx0JyB8ICdmcmVzaCcgfCAnbnVtdjEnIHwgJ251bXYyJztcbiAgLyoqXG4gICAqIOiDjOaZr+Wbvuagh+agt+W8j1xuICAgKi9cbiAgQElucHV0KCkgaWNvblN0eWxlOiBzdHJpbmcgfCBvYmplY3Q7XG4gIC8qKlxuICAgKiDlm77moIfliY3mma/mloflrZdcbiAgICovXG4gIEBJbnB1dCgpIGljb25MYWJlbDogc3RyaW5nIHwgb2JqZWN0O1xuICAvKipcbiAgICog5piv5ZCm5pi+56S65a6a5L2N54K5XG4gICAqL1xuICBASW5wdXQoKSBzaG93UG9zaXRpb25Qb2ludDogYm9vbGVhbiB8IG9iamVjdDtcbiAgLyoqXG4gICAqIOWGheW7uueahERvbeWuueWZqOS4iumZhOW4pueahGNsYXNz77yM5aSa5LiqY2xhc3MgbmFtZeeUqOepuuagvOWIhuW8gFxuICAgKi9cbiAgQElucHV0KCkgY29udGFpbmVyQ2xhc3NOYW1lczogc3RyaW5nO1xuICAvKipcbiAgICog54K55qCH6K6w5Zyo5Zyw5Zu+5LiK5pi+56S655qE5L2N572uXG4gICAqL1xuICBASW5wdXQoKSBwb3NpdGlvbjogQU1hcC5Mb2NhdGlvblZhbHVlO1xuICAvKipcbiAgICog5qCH6K6w6ZSa54K5XG4gICAqL1xuICBASW5wdXQoKSBhbmNob3I6IEFNYXAuTWFya2VyLkFuY2hvcjtcbiAgLyoqXG4gICAqIOeCueagh+iusOaYvuekuuS9jee9ruWBj+enu+mHj1xuICAgKi9cbiAgQElucHV0KCkgb2Zmc2V0OiBBTWFwLlBpeGVsIHwgSVBpeGVsO1xuICAvKipcbiAgICog6ZyA5Zyo54K55qCH6K6w5Lit5pi+56S655qE5Zu+5qCHXG4gICAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgfCBBTWFwLkljb24gfCBJSWNvbjtcbiAgLyoqXG4gICAqIOm8oOagh+eCueWHu+aXtm1hcmtlcuaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgdG9wV2hlbkNsaWNrOiBib29sZWFuO1xuICAvKipcbiAgICog5ouW5ou954K55qCH6K6w5pe25piv5ZCm5byA5ZCv54K55qCH6K6w56a75byA5Zyw5Zu+55qE5pWI5p6cXG4gICAqL1xuICBASW5wdXQoKSByYWlzZU9uRHJhZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOaYr+WQpuWPr+ingVxuICAgKi9cbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWPoOWKoOmhuuW6j1xuICAgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XG4gIC8qKlxuICAgKiDngrnmoIforrDnmoTml4vovazop5LluqZcbiAgICovXG4gIEBJbnB1dCgpIGFuZ2xlOiBudW1iZXI7XG4gIC8qKlxuICAgKiDmmK/lkKboh6rliqjml4vovaxcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Sb3RhdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWKqOeUu+aViOaenFxuICAgKi9cbiAgQElucHV0KCkgYW5pbWF0aW9uOiBBTWFwLkFuaW1hdGlvbk5hbWU7XG4gIC8qKlxuICAgKiDngrnmoIforrDpmLTlvbFcbiAgICovXG4gIEBJbnB1dCgpIHNoYWRvdzogQU1hcC5JY29uIHwgc3RyaW5nIHwgSUljb247XG4gIC8qKlxuICAgKiDpvKDmoIfmu5Hov4fngrnmoIforrDml7bnmoTmloflrZfmj5DnpLpcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDlj6/ngrnlh7vljLrln59cbiAgICovXG4gIEBJbnB1dCgpIHNoYXBlOiBBTWFwLk1hcmtlclNoYXBlO1xuICAvKipcbiAgICog5paH5pys5qCH5rOoXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogQU1hcC5NYXJrZXIuTGFiZWwgfCBJTWFya2VyTGFiZWw7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgaXNUb3A6IGJvb2xlYW47XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpumakOiXj1xuICAgKi9cbiAgQElucHV0KCkgaGlkZGVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpuWMheWQq+WcqOeCueiBmuWQiOS4rVxuICAgKi9cbiAgQElucHV0KCkgaW5DbHVzdGVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOeCueWHu+aXtuaYr+WQpuaYvuekuuS/oeaBr+eql+S9k1xuICAgKi9cbiAgQElucHV0KCkgb3BlbkluZm9XaW5kb3cgPSB0cnVlO1xuXG4gIC8vIGFtYXAtbWFya2VyIGV2ZW50czpcbiAgQE91dHB1dCgpIG5hUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBuYU1vdXNlT3V0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ2dpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFEcmFnRW5kOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92aW5nOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92ZUVuZDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYU1vdmVBbG9uZzogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gYW1hcCBpbmZvIHdpbmRvdzpcbiAgQENvbnRlbnRDaGlsZHJlbihBbWFwSW5mb1dpbmRvd0NvbXBvbmVudClcbiAgaW5mb1dpbmRvd0NvbXBvbmVudCA9IG5ldyBRdWVyeUxpc3Q8QW1hcEluZm9XaW5kb3dDb21wb25lbnQ+KCk7XG5cbiAgcHJvdGVjdGVkIGluaXRlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG9zOiBXaXRoQ3JlYXRlPGFueT4sXG4gICAgcHJvdGVjdGVkIGJpbmRlcjogRXZlbnRCaW5kZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhbWFwczogQU1hcFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHBpeGVsczogUGl4ZWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpY29uczogSWNvblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1sYWJlbHM6IE1hcmtlckxhYmVsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7XG4gICAgc3VwZXIob3MsIGJpbmRlcik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5vcy5nZXQoKTtcbiAgICB0aGlzLm5hTW91c2VPdXQgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnbW91c2VvdXQnKTtcbiAgICB0aGlzLm5hRHJhZ1N0YXJ0ID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ2RyYWdzdGFydCcpO1xuICAgIHRoaXMubmFEcmFnZ2luZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnZ2luZycpO1xuICAgIHRoaXMubmFEcmFnRW5kID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ2RyYWdlbmQnKTtcbiAgICB0aGlzLm5hTW92aW5nID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmluZycpO1xuICAgIHRoaXMubmFNb3ZlRW5kID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmVlbmQnKTtcbiAgICB0aGlzLm5hTW92ZUFsb25nID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmVhbG9uZycpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9zLmRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBDaGFuZ2VGaWx0ZXIub2YoY2hhbmdlcyk7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5nZXQoKTtcbiAgICBpZiAoIXRoaXMuaW5pdGVkKSB7XG4gICAgICAvLyBkbyBub3QgZHJhdyBtYXJrZXIgd2hlbiBubyBwb2lzdGlvbiBkZWZpbmVkLlxuICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYW1hcHMuZ2V0KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZCh0aGlzLlRBRywgJ2luaXRpYWxpemluZyAuLi4nKTtcbiAgICAgICAgLy8gYmluZCBpbmZvIHdpbmRvdyBldmVudHM6XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KG1hcmtlciwgJ2NsaWNrJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5vcGVuSW5mb1dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pbmZvV2luZG93Q29tcG9uZW50LmZvckVhY2godyA9PiB3Lm9wZW4oKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICBpZiAodGhpcy5pY29uKSB7XG4gICAgICAgICAgb3B0aW9ucy5pY29uID0gdGhpcy5pY29ucy5jcmVhdGUodGhpcy5pY29uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHtcbiAgICAgICAgICBvcHRpb25zLnNoYWRvdyA9IHRoaXMuaWNvbnMuY3JlYXRlKHRoaXMuc2hhZG93KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYWJlbCkge1xuICAgICAgICAgIG9wdGlvbnMubGFiZWwgPSB0aGlzLm1sYWJlbHMuY3JlYXRlKHRoaXMubGFiZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCkge1xuICAgICAgICAgIG9wdGlvbnMub2Zmc2V0ID0gdGhpcy5waXhlbHMuY3JlYXRlKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5kKHRoaXMuVEFHLCAnb3B0aW9uczonLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcy5jcmVhdGUob3B0aW9ucykuc3Vic2NyaWJlKG0gPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm5hUmVhZHkuZW1pdChtKSk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZCh0aGlzLlRBRywgJ21hcmtlciBpcyByZWFkeS4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmZvV2luZG93KCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvd1Bvc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uIHwgSUljb24+KCdpY29uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0SWNvbih0aGlzLmljb25zLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uPignc2hhZG93JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0U2hhZG93KHRoaXMuaWNvbnMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlci5MYWJlbCB8IElNYXJrZXJMYWJlbD4oJ2xhYmVsJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0TGFiZWwodGhpcy5tbGFiZWxzLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPigndGl0bGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUaXRsZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxhbnk+KCdleHREYXRhJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0RXh0RGF0YSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignY2xpY2thYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q2xpY2thYmxlKCEhdikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2RyYWdnYWJsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldERyYWdnYWJsZSghIXYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCd2aXNpYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+ICh2ID8gbS5zaG93KCkgOiBtLmhpZGUoKSkpO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPignY3Vyc29yJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q3Vyc29yKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPEFNYXAuQW5pbWF0aW9uTmFtZT4oJ2FuaW1hdGlvbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldEFuaW1hdGlvbih2KSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxudW1iZXI+KCdhbmdsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldEFuZ2xlKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPG51bWJlcj4oJ3pJbmRleCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldHpJbmRleCh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlclNoYXBlPignc2hhcGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRTaGFwZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuUGl4ZWwgfCBJUGl4ZWw+KCdvZmZzZXQnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRPZmZzZXQodGhpcy5waXhlbHMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuTG9jYXRpb25WYWx1ZT4oJ3Bvc2l0aW9uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0UG9zaXRpb24odiksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbiB8IG9iamVjdD4oJ3Nob3dQb3NpdGlvblBvaW50JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IHtcbiAgICAgICAgaWYgKCEhdikge1xuICAgICAgICAgIG0uc2hvd1Bvc2l0aW9uUG9pbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtLmhpZGVQb3NpdGlvblBvaW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgemlwKGZpbHRlci5ub3RFbXB0eTxzdHJpbmcgfCBvYmplY3Q+KCdpY29uU3R5bGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4ge1xuICAgICAgICBpZiAoY2hhbmdlcy5pY29uVGhlbWUgJiYgY2hhbmdlcy5pY29uVGhlbWUuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgbS5zZXRJY29uVGhlbWVBbmRTdHlsZShjaGFuZ2VzLmljb25UaGVtZS5jdXJyZW50VmFsdWUsIHYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0uc2V0SWNvblN0eWxlKHYpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHppcChmaWx0ZXIubm90RW1wdHk8c3RyaW5nIHwgb2JqZWN0PignaWNvbkxhYmVsJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0SWNvbkxhYmVsKHYpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIubm90RW1wdHk8c3RyaW5nPignY29udGFpbmVyQ2xhc3NOYW1lcycpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldENvbnRhaW5lckNsYXNzTmFtZXModiksXG4gICAgICApO1xuICAgIH1cbiAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignaXNUb3AnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUb3AoISF2KSk7XG4gICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2hpZGRlbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiAodiA/IG0uaGlkZSgpIDogbS5zaG93KCkpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKTtcbiAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJbmZvV2luZG93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93KCkge1xuICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQgJiYgdGhpcy5pbml0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lKHRoaXMuVEFHLCAnRXhwZWN0ZWQgbm8gbW9yZSB0aGFuIDEgaW5mbyB3aW5kb3cuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5vcy5nZXQoKTtcbiAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5ob3N0TWFya2VyID0gbWFya2VyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93UG9zaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudCAmJiB0aGlzLmluaXRlZCkge1xuICAgICAgdGhpcy5pbmZvV2luZG93Q29tcG9uZW50LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgY29tcG9uZW50LnRvZ2dsZU9wZW4oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldE9wdGlvbnM8QU1hcFVJU2ltcGxlTWFya2VyLk9wdGlvbnM+KHRoaXMsIFNpbXBsZU1hcmtlck9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW3suWIm+W7uueahCBBTWFwVUkg5a+56LGhXG4gICAqL1xuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3MuZ2V0KCk7XG4gIH1cbn1cbiJdfQ==