ngx-amap
Version:
[][npm-badge-url] [][npm-badge-url] [][ci-url]
601 lines • 43.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: directives/amap-marker/amap-marker.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, Input, Output, EventEmitter, ContentChildren, QueryList, NgZone, } from '@angular/core';
import { zip } from 'rxjs';
import { AmapMarkerService } from './amap-marker.service';
import { LoggerService } from '../../shared/logger/logger.service';
import { AMapOverlay, OverlayOptions } from '../../base/amap-overlay';
import { EventBinderService } from '../../shared/event-binder.service';
import { getOptions, ChangeFilter } from '../../utils';
import { PixelService } from '../../shared/pixel.service';
import { IconService } from '../../shared/icon.service';
import { MarkerLabelService } from '../../shared/marker-label.service';
import { AmapInfoWindowComponent } from '../../components/amap-info-window/amap-info-window.component';
import { AMapService } from '../../shared/amap.service';
/** @type {?} */
var TAG = 'amap-marker';
/** @type {?} */
var ALL_OPTIONS = tslib_1.__spread(OverlayOptions, [
'position',
'anchor',
'offset',
'icon',
'content',
'topWhenClick',
'raiseOnDrag',
'visible',
'zIndex',
'angle',
'autoRotation',
'animation',
'shadow',
'title',
'shape',
'label',
]);
var AmapMarkerDirective = /** @class */ (function (_super) {
tslib_1.__extends(AmapMarkerDirective, _super);
function AmapMarkerDirective(os, binder, amaps, pixels, icons, mlabels, logger, ngZone) {
var _this = _super.call(this, os, binder) || this;
_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.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 {?} */
var 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 _this;
}
/**
* @return {?}
*/
AmapMarkerDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.os.destroy();
};
/**
* @param {?} changes
* @return {?}
*/
AmapMarkerDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
/** @type {?} */
var filter = ChangeFilter.of(changes);
/** @type {?} */
var marker = this.get();
if (!this.inited) {
// do not draw marker when no poistion defined.
if (!this.position) {
return;
}
this.amaps.get().subscribe((/**
* @return {?}
*/
function () {
_this.logger.d(TAG, 'initializing ...');
// bind info window events:
_this.subscription = _this.binder.bindEvent(marker, 'click').subscribe((/**
* @return {?}
*/
function () {
if (_this.openInfoWindow) {
_this.infoWindowComponent.forEach((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.open(); }));
}
}));
/** @type {?} */
var options = getOptions(_this, ALL_OPTIONS);
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(TAG, 'options:', options);
_this.os.create(options, !_this.inCluster).subscribe((/**
* @param {?} m
* @return {?}
*/
function (m) {
_this.ngZone.run((/**
* @return {?}
*/
function () { return _this.naReady.emit(m); }));
_this.logger.d(TAG, 'marker is ready.');
}));
_this.inited = true;
_this.updateInfoWindow();
_this.updateInfoWindowPosition();
}));
}
else {
zip(filter.has('icon'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setIcon(_this.icons.create(v));
}));
zip(filter.has('shadow'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setShadow(_this.icons.create(v));
}));
zip(filter.has('label'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setLabel(_this.mlabels.create(v));
}));
zip(filter.has('title'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setTitle(v);
}));
zip(filter.has('content'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setContent(v);
}));
zip(filter.has('extData'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setExtData(v);
}));
zip(filter.has('clickable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setClickable(!!v);
}));
zip(filter.has('draggable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setDraggable(!!v);
}));
zip(filter.has('visible'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return (v ? m.show() : m.hide());
}));
zip(filter.has('cursor'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setCursor(v);
}));
zip(filter.has('animation'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setAnimation(v);
}));
zip(filter.has('angle'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setAngle(v);
}));
zip(filter.has('zIndex'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setzIndex(v);
}));
zip(filter.has('shape'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setShape(v);
}));
zip(filter.notEmpty('offset'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setOffset(_this.pixels.create(v));
}));
zip(filter.notEmpty('position'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setPosition(v);
}));
}
zip(filter.has('isTop'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return m.setTop(!!v);
}));
zip(filter.has('hidden'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), v = _b[0], m = _b[1];
return (v ? m.hide() : m.show());
}));
};
/**
* @return {?}
*/
AmapMarkerDirective.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.updateInfoWindow();
this.infoWindowComponent.changes.subscribe((/**
* @return {?}
*/
function () { return _this.updateInfoWindow(); }));
};
/**
* @private
* @return {?}
*/
AmapMarkerDirective.prototype.updateInfoWindow = /**
* @private
* @return {?}
*/
function () {
if (this.infoWindowComponent && this.inited) {
if (this.infoWindowComponent.length > 1) {
this.logger.e(TAG, 'Expected no more than 1 info window.');
return;
}
/** @type {?} */
var marker_1 = this.os.get();
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
function (component) {
component.hostMarker = marker_1;
}));
}
};
/**
* @private
* @return {?}
*/
AmapMarkerDirective.prototype.updateInfoWindowPosition = /**
* @private
* @return {?}
*/
function () {
if (this.infoWindowComponent && this.inited) {
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
function (component) {
component.toggleOpen();
}));
}
};
/**
* 获取已创建的 AMap.Marker 对象
*/
/**
* 获取已创建的 AMap.Marker 对象
* @return {?}
*/
AmapMarkerDirective.prototype.get = /**
* 获取已创建的 AMap.Marker 对象
* @return {?}
*/
function () {
return this.os.get();
};
AmapMarkerDirective.decorators = [
{ type: Directive, args: [{
selector: 'amap-marker',
exportAs: 'marker',
providers: [AmapMarkerService],
},] }
];
/** @nocollapse */
AmapMarkerDirective.ctorParameters = function () { return [
{ type: AmapMarkerService },
{ type: EventBinderService },
{ type: AMapService },
{ type: PixelService },
{ type: IconService },
{ type: MarkerLabelService },
{ type: LoggerService },
{ type: NgZone }
]; };
AmapMarkerDirective.propDecorators = {
position: [{ type: Input }],
anchor: [{ type: Input }],
offset: [{ type: Input }],
icon: [{ type: Input }],
content: [{ 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,] }]
};
return AmapMarkerDirective;
}(AMapOverlay));
export { AmapMarkerDirective };
if (false) {
/**
* 点标记在地图上显示的位置
* @type {?}
*/
AmapMarkerDirective.prototype.position;
/**
* 标记锚点
* @type {?}
*/
AmapMarkerDirective.prototype.anchor;
/**
* 点标记显示位置偏移量
* @type {?}
*/
AmapMarkerDirective.prototype.offset;
/**
* 需在点标记中显示的图标
* @type {?}
*/
AmapMarkerDirective.prototype.icon;
/**
* 点标记显示内容
* @type {?}
*/
AmapMarkerDirective.prototype.content;
/**
* 鼠标点击时marker是否置顶
* @type {?}
*/
AmapMarkerDirective.prototype.topWhenClick;
/**
* 拖拽点标记时是否开启点标记离开地图的效果
* @type {?}
*/
AmapMarkerDirective.prototype.raiseOnDrag;
/**
* 点标记是否可见
* @type {?}
*/
AmapMarkerDirective.prototype.visible;
/**
* 点标记的叠加顺序
* @type {?}
*/
AmapMarkerDirective.prototype.zIndex;
/**
* 点标记的旋转角度
* @type {?}
*/
AmapMarkerDirective.prototype.angle;
/**
* 是否自动旋转
* @type {?}
*/
AmapMarkerDirective.prototype.autoRotation;
/**
* 点标记的动画效果
* @type {?}
*/
AmapMarkerDirective.prototype.animation;
/**
* 点标记阴影
* @type {?}
*/
AmapMarkerDirective.prototype.shadow;
/**
* 鼠标滑过点标记时的文字提示
* @type {?}
*/
AmapMarkerDirective.prototype.title;
/**
* 可点击区域
* @type {?}
*/
AmapMarkerDirective.prototype.shape;
/**
* 文本标注
* @type {?}
*/
AmapMarkerDirective.prototype.label;
/**
* 额外: 是否置顶
* @type {?}
*/
AmapMarkerDirective.prototype.isTop;
/**
* 额外: 是否隐藏
* @type {?}
*/
AmapMarkerDirective.prototype.hidden;
/**
* 额外: 是否包含在点聚合中
* @type {?}
*/
AmapMarkerDirective.prototype.inCluster;
/**
* 额外: 点击时是否显示信息窗体
* @type {?}
*/
AmapMarkerDirective.prototype.openInfoWindow;
/** @type {?} */
AmapMarkerDirective.prototype.naReady;
/** @type {?} */
AmapMarkerDirective.prototype.naMouseOut;
/** @type {?} */
AmapMarkerDirective.prototype.naDragStart;
/** @type {?} */
AmapMarkerDirective.prototype.naDragging;
/** @type {?} */
AmapMarkerDirective.prototype.naDragEnd;
/** @type {?} */
AmapMarkerDirective.prototype.naMoving;
/** @type {?} */
AmapMarkerDirective.prototype.naMoveEnd;
/** @type {?} */
AmapMarkerDirective.prototype.naMoveAlong;
/** @type {?} */
AmapMarkerDirective.prototype.infoWindowComponent;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.inited;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.subscription;
/**
* @type {?}
* @protected
*/
AmapMarkerDirective.prototype.os;
/**
* @type {?}
* @protected
*/
AmapMarkerDirective.prototype.binder;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.amaps;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.pixels;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.icons;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.mlabels;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.logger;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1hcC1tYXJrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFtYXAvIiwic291cmNlcyI6WyJkaXJlY3RpdmVzL2FtYXAtbWFya2VyL2FtYXAtbWFya2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxNQUFNLEVBQ04sWUFBWSxFQUdaLGVBQWUsRUFDZixTQUFTLEVBRVQsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztJQUVsRCxHQUFHLEdBQUcsYUFBYTs7SUFDbkIsV0FBVyxvQkFDWixjQUFjO0lBQ2pCLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGFBQWE7SUFDYixTQUFTO0lBQ1QsUUFB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MU9ZLG1CQUFtQjs7Ozs7O0lBTTlCLHVDQUFzQzs7Ozs7SUFJdEMscUNBQW9DOzs7OztJQUlwQyxxQ0FBcUM7Ozs7O0lBSXJDLG1DQUEwQzs7Ozs7SUFJMUMsc0NBQXVDOzs7OztJQUl2QywyQ0FBK0I7Ozs7O0lBSS9CLDBDQUE4Qjs7Ozs7SUFJOUIsc0NBQTBCOzs7OztJQUkxQixxQ0FBd0I7Ozs7O0lBSXhCLG9DQUF1Qjs7Ozs7SUFJdkIsMkNBQStCOzs7OztJQUkvQix3Q0FBdUM7Ozs7O0lBSXZDLHFDQUE0Qzs7Ozs7SUFJNUMsb0NBQXVCOzs7OztJQUl2QixvQ0FBaUM7Ozs7O0lBSWpDLG9DQUFpRDs7Ozs7SUFJakQsb0NBQXdCOzs7OztJQUl4QixxQ0FBd0I7Ozs7O0lBSXhCLHdDQUEyQjs7Ozs7SUFJM0IsNkNBQStCOztJQUcvQixzQ0FBdUM7O0lBQ3ZDLHlDQUF3Qzs7SUFDeEMsMENBQXlDOztJQUN6Qyx5Q0FBd0M7O0lBQ3hDLHdDQUF1Qzs7SUFDdkMsdUNBQXNDOztJQUN0Qyx3Q0FBdUM7O0lBQ3ZDLDBDQUF5Qzs7SUFHekMsa0RBQytEOzs7OztJQUUvRCxxQ0FBdUI7Ozs7O0lBQ3ZCLDJDQUFtQzs7Ozs7SUFHakMsaUNBQStCOzs7OztJQUMvQixxQ0FBb0M7Ozs7O0lBQ3BDLG9DQUEwQjs7Ozs7SUFDMUIscUNBQTRCOzs7OztJQUM1QixvQ0FBMEI7Ozs7O0lBQzFCLHNDQUFtQzs7Ozs7SUFDbkMscUNBQTZCOzs7OztJQUM3QixxQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkNoYW5nZXMsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgemlwLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFtYXBNYXJrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbWFwLW1hcmtlci5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2VyL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFNYXBPdmVybGF5LCBPdmVybGF5T3B0aW9ucyB9IGZyb20gJy4uLy4uL2Jhc2UvYW1hcC1vdmVybGF5JztcbmltcG9ydCB7IEV2ZW50QmluZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9ldmVudC1iaW5kZXIuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRPcHRpb25zLCBDaGFuZ2VGaWx0ZXIgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBJUGl4ZWwsIElJY29uLCBJTWFya2VyTGFiZWwgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBpeGVsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9waXhlbC5zZXJ2aWNlJztcbmltcG9ydCB7IEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXJrZXJMYWJlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbWFya2VyLWxhYmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW1hcEluZm9XaW5kb3dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FtYXAtaW5mby13aW5kb3cvYW1hcC1pbmZvLXdpbmRvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQU1hcFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvYW1hcC5zZXJ2aWNlJztcblxuY29uc3QgVEFHID0gJ2FtYXAtbWFya2VyJztcbmNvbnN0IEFMTF9PUFRJT05TID0gW1xuICAuLi5PdmVybGF5T3B0aW9ucyxcbiAgJ3Bvc2l0aW9uJyxcbiAgJ2FuY2hvcicsXG4gICdvZmZzZXQnLFxuICAnaWNvbicsXG4gICdjb250ZW50JyxcbiAgJ3RvcFdoZW5DbGljaycsXG4gICdyYWlzZU9uRHJhZycsXG4gICd2aXNpYmxlJyxcbiAgJ3pJbmRleCcsXG4gICdhbmdsZScsXG4gICdhdXRvUm90YXRpb24nLFxuICAnYW5pbWF0aW9uJyxcbiAgJ3NoYWRvdycsXG4gICd0aXRsZScsXG4gICdzaGFwZScsXG4gICdsYWJlbCcsXG5dO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdhbWFwLW1hcmtlcicsXG4gIGV4cG9ydEFzOiAnbWFya2VyJyxcbiAgcHJvdmlkZXJzOiBbQW1hcE1hcmtlclNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBBbWFwTWFya2VyRGlyZWN0aXZlIGV4dGVuZHMgQU1hcE92ZXJsYXk8QU1hcC5NYXJrZXI+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuICAvLyAtLS0tIE1hcmtlciBPcHRpb25zIC0tLS1cbiAgLyoqXG4gICAqIOeCueagh+iusOWcqOWcsOWbvuS4iuaYvuekuueahOS9jee9rlxuICAgKi9cbiAgQElucHV0KCkgcG9zaXRpb246IEFNYXAuTG9jYXRpb25WYWx1ZTtcbiAgLyoqXG4gICAqIOagh+iusOmUmueCuVxuICAgKi9cbiAgQElucHV0KCkgYW5jaG9yOiBBTWFwLk1hcmtlci5BbmNob3I7XG4gIC8qKlxuICAgKiDngrnmoIforrDmmL7npLrkvY3nva7lgY/np7vph49cbiAgICovXG4gIEBJbnB1dCgpIG9mZnNldDogQU1hcC5QaXhlbCB8IElQaXhlbDtcbiAgLyoqXG4gICAqIOmcgOWcqOeCueagh+iusOS4reaYvuekuueahOWbvuagh1xuICAgKi9cbiAgQElucHV0KCkgaWNvbjogc3RyaW5nIHwgQU1hcC5JY29uIHwgSUljb247XG4gIC8qKlxuICAgKiDngrnmoIforrDmmL7npLrlhoXlrrlcbiAgICovXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50O1xuICAvKipcbiAgICog6byg5qCH54K55Ye75pe2bWFya2Vy5piv5ZCm572u6aG2XG4gICAqL1xuICBASW5wdXQoKSB0b3BXaGVuQ2xpY2s6IGJvb2xlYW47XG4gIC8qKlxuICAgKiDmi5bmi73ngrnmoIforrDml7bmmK/lkKblvIDlkK/ngrnmoIforrDnprvlvIDlnLDlm77nmoTmlYjmnpxcbiAgICovXG4gIEBJbnB1dCgpIHJhaXNlT25EcmFnOiBib29sZWFuO1xuICAvKipcbiAgICog54K55qCH6K6w5piv5ZCm5Y+v6KeBXG4gICAqL1xuICBASW5wdXQoKSB2aXNpYmxlOiBib29sZWFuO1xuICAvKipcbiAgICog54K55qCH6K6w55qE5Y+g5Yqg6aG65bqPXG4gICAqL1xuICBASW5wdXQoKSB6SW5kZXg6IG51bWJlcjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOaXi+i9rOinkuW6plxuICAgKi9cbiAgQElucHV0KCkgYW5nbGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIOaYr+WQpuiHquWKqOaXi+i9rFxuICAgKi9cbiAgQElucHV0KCkgYXV0b1JvdGF0aW9uOiBib29sZWFuO1xuICAvKipcbiAgICog54K55qCH6K6w55qE5Yqo55S75pWI5p6cXG4gICAqL1xuICBASW5wdXQoKSBhbmltYXRpb246IEFNYXAuQW5pbWF0aW9uTmFtZTtcbiAgLyoqXG4gICAqIOeCueagh+iusOmYtOW9sVxuICAgKi9cbiAgQElucHV0KCkgc2hhZG93OiBBTWFwLkljb24gfCBzdHJpbmcgfCBJSWNvbjtcbiAgLyoqXG4gICAqIOm8oOagh+a7kei/h+eCueagh+iusOaXtueahOaWh+Wtl+aPkOekulxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIOWPr+eCueWHu+WMuuWfn1xuICAgKi9cbiAgQElucHV0KCkgc2hhcGU6IEFNYXAuTWFya2VyU2hhcGU7XG4gIC8qKlxuICAgKiDmlofmnKzmoIfms6hcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBBTWFwLk1hcmtlci5MYWJlbCB8IElNYXJrZXJMYWJlbDtcbiAgLyoqXG4gICAqIOmineWkljog5piv5ZCm572u6aG2XG4gICAqL1xuICBASW5wdXQoKSBpc1RvcDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOmineWkljog5piv5ZCm6ZqQ6JePXG4gICAqL1xuICBASW5wdXQoKSBoaWRkZW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIOmineWkljog5piv5ZCm5YyF5ZCr5Zyo54K56IGa5ZCI5LitXG4gICAqL1xuICBASW5wdXQoKSBpbkNsdXN0ZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIOmineWkljog54K55Ye75pe25piv5ZCm5pi+56S65L+h5oGv56qX5L2TXG4gICAqL1xuICBASW5wdXQoKSBvcGVuSW5mb1dpbmRvdyA9IHRydWU7XG5cbiAgLy8gYW1hcC1tYXJrZXIgZXZlbnRzOlxuICBAT3V0cHV0KCkgbmFSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG5hTW91c2VPdXQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFEcmFnU3RhcnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFEcmFnZ2luZzogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYURyYWdFbmQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFNb3Zpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFNb3ZlRW5kOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92ZUFsb25nOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICAvLyBhbWFwIGluZm8gd2luZG93OlxuICBAQ29udGVudENoaWxkcmVuKEFtYXBJbmZvV2luZG93Q29tcG9uZW50KVxuICBpbmZvV2luZG93Q29tcG9uZW50ID0gbmV3IFF1ZXJ5TGlzdDxBbWFwSW5mb1dpbmRvd0NvbXBvbmVudD4oKTtcblxuICBwcml2YXRlIGluaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvczogQW1hcE1hcmtlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGJpbmRlcjogRXZlbnRCaW5kZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYW1hcHM6IEFNYXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGl4ZWxzOiBQaXhlbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpY29uczogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtbGFiZWxzOiBNYXJrZXJMYWJlbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7XG4gICAgc3VwZXIob3MsIGJpbmRlcik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5vcy5nZXQoKTtcbiAgICB0aGlzLm5hTW91c2VPdXQgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnbW91c2VvdXQnKTtcbiAgICB0aGlzLm5hRHJhZ1N0YXJ0ID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ2RyYWdzdGFydCcpO1xuICAgIHRoaXMubmFEcmFnZ2luZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnZ2luZycpO1xuICAgIHRoaXMubmFEcmFnRW5kID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ2RyYWdlbmQnKTtcbiAgICB0aGlzLm5hTW92aW5nID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmluZycpO1xuICAgIHRoaXMubmFNb3ZlRW5kID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmVlbmQnKTtcbiAgICB0aGlzLm5hTW92ZUFsb25nID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdmVhbG9uZycpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9zLmRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBDaGFuZ2VGaWx0ZXIub2YoY2hhbmdlcyk7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5nZXQoKTtcbiAgICBpZiAoIXRoaXMuaW5pdGVkKSB7XG4gICAgICAvLyBkbyBub3QgZHJhdyBtYXJrZXIgd2hlbiBubyBwb2lzdGlvbiBkZWZpbmVkLlxuICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYW1hcHMuZ2V0KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZChUQUcsICdpbml0aWFsaXppbmcgLi4uJyk7XG4gICAgICAgIC8vIGJpbmQgaW5mbyB3aW5kb3cgZXZlbnRzOlxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuYmluZGVyLmJpbmRFdmVudChtYXJrZXIsICdjbGljaycpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub3BlbkluZm9XaW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKHcgPT4gdy5vcGVuKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zPEFNYXAuTWFya2VyLk9wdGlvbnM+KHRoaXMsIEFMTF9PUFRJT05TKTtcbiAgICAgICAgaWYgKHRoaXMuaWNvbikge1xuICAgICAgICAgIG9wdGlvbnMuaWNvbiA9IHRoaXMuaWNvbnMuY3JlYXRlKHRoaXMuaWNvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7XG4gICAgICAgICAgb3B0aW9ucy5zaGFkb3cgPSB0aGlzLmljb25zLmNyZWF0ZSh0aGlzLnNoYWRvdyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGFiZWwpIHtcbiAgICAgICAgICBvcHRpb25zLmxhYmVsID0gdGhpcy5tbGFiZWxzLmNyZWF0ZSh0aGlzLmxhYmVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICBvcHRpb25zLm9mZnNldCA9IHRoaXMucGl4ZWxzLmNyZWF0ZSh0aGlzLm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZChUQUcsICdvcHRpb25zOicsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9zLmNyZWF0ZShvcHRpb25zLCAhdGhpcy5pbkNsdXN0ZXIpLnN1YnNjcmliZShtID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5uYVJlYWR5LmVtaXQobSkpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnbWFya2VyIGlzIHJlYWR5LicpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmZvV2luZG93UG9zaXRpb24oKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB6aXAoZmlsdGVyLmhhczxzdHJpbmcgfCBBTWFwLkljb24gfCBJSWNvbj4oJ2ljb24nKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRJY29uKHRoaXMuaWNvbnMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxzdHJpbmcgfCBBTWFwLkljb24+KCdzaGFkb3cnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRTaGFkb3codGhpcy5pY29ucy5jcmVhdGUodikpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPEFNYXAuTWFya2VyLkxhYmVsIHwgSU1hcmtlckxhYmVsPignbGFiZWwnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRMYWJlbCh0aGlzLm1sYWJlbHMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxzdHJpbmc+KCd0aXRsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldFRpdGxlKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGFueT4oJ2NvbnRlbnQnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRDb250ZW50KHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGFueT4oJ2V4dERhdGEnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRFeHREYXRhKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCdjbGlja2FibGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRDbGlja2FibGUoISF2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignZHJhZ2dhYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0RHJhZ2dhYmxlKCEhdikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ3Zpc2libGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gKHYgPyBtLnNob3coKSA6IG0uaGlkZSgpKSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxzdHJpbmc+KCdjdXJzb3InKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRDdXJzb3IodikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8QU1hcC5BbmltYXRpb25OYW1lPignYW5pbWF0aW9uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0QW5pbWF0aW9uKHYpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPG51bWJlcj4oJ2FuZ2xlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0QW5nbGUodikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8bnVtYmVyPignekluZGV4JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0ekluZGV4KHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPEFNYXAuTWFya2VyU2hhcGU+KCdzaGFwZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldFNoYXBlKHYpKTtcbiAgICAgIHppcChmaWx0ZXIubm90RW1wdHk8QU1hcC5QaXhlbCB8IElQaXhlbD4oJ29mZnNldCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldE9mZnNldCh0aGlzLnBpeGVscy5jcmVhdGUodikpLFxuICAgICAgKTtcbiAgICAgIHppcChmaWx0ZXIubm90RW1wdHk8QU1hcC5Mb2NhdGlvblZhbHVlPigncG9zaXRpb24nKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRQb3NpdGlvbih2KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCdpc1RvcCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldFRvcCghIXYpKTtcbiAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignaGlkZGVuJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+ICh2ID8gbS5oaWRlKCkgOiBtLnNob3coKSkpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvdygpO1xuICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluZm9XaW5kb3coKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudCAmJiB0aGlzLmluaXRlZCkge1xuICAgICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmUoVEFHLCAnRXhwZWN0ZWQgbm8gbW9yZSB0aGFuIDEgaW5mbyB3aW5kb3cuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5vcy5nZXQoKTtcbiAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5ob3N0TWFya2VyID0gbWFya2VyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93UG9zaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudCAmJiB0aGlzLmluaXRlZCkge1xuICAgICAgdGhpcy5pbmZvV2luZG93Q29tcG9uZW50LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgY29tcG9uZW50LnRvZ2dsZU9wZW4oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blt7LliJvlu7rnmoQgQU1hcC5NYXJrZXIg5a+56LGhXG4gICAqL1xuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3MuZ2V0KCk7XG4gIH1cbn1cbiJdfQ==