dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
501 lines • 55.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, HostBinding, Inject, ViewChild } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { DomSanitizer } from '@angular/platform-browser';
import { CurrentService } from 'dbweb-core';
import { PortraitMaskComponent } from './portrait-mask/portrait-mask.component';
import { portraitDefault } from '../../const';
/**
* @record
*/
export function PortraitEditComponentData() { }
if (false) {
/** @type {?} */
PortraitEditComponentData.prototype.img;
/** @type {?} */
PortraitEditComponentData.prototype.default;
}
/**
* @record
*/
export function PortraitEditComponentResultData() { }
if (false) {
/** @type {?} */
PortraitEditComponentResultData.prototype.ok;
/** @type {?} */
PortraitEditComponentResultData.prototype.data;
}
/** @type {?} */
var ImageMaxWidth = 224;
/** @type {?} */
var ImageMaxHeight = 224;
/** @type {?} */
var PortraitSize = 224;
// 112;
var PortraitEditComponent = /** @class */ (function () {
function PortraitEditComponent(dialogRef, data, _sanitizer, curr) {
this.dialogRef = dialogRef;
this.data = data;
this._sanitizer = _sanitizer;
this.curr = curr;
this.hostClass = true;
this.translateX = 0;
this.translateY = 0;
this.rotateScope = 0;
this.modified = false;
this.afterInit = false;
this.default = false; // 是否是缺省的图片,缺省图片不需要保存
}
/**
* @return {?}
*/
PortraitEditComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.srcImage.nativeElement.onload = (/**
* @return {?}
*/
function () {
_this.realImageWidth = _this.srcImage.nativeElement.width;
_this.realImageHeight = _this.srcImage.nativeElement.height;
/** @type {?} */
var w = _this.srcImage.nativeElement.width;
/** @type {?} */
var h = _this.srcImage.nativeElement.height;
_this.minZoomFactor = _this.zoomFactor = 1;
if (w < h && h > ImageMaxHeight) {
_this.minZoomFactor = _this.zoomFactor = ImageMaxHeight / h;
w = w * _this.zoomFactor;
h = ImageMaxHeight;
}
else if (w > h && w > ImageMaxHeight) {
_this.minZoomFactor = _this.zoomFactor = ImageMaxWidth / w;
h = h * _this.zoomFactor;
w = ImageMaxWidth;
}
_this.portraitImage.nativeElement.width = w;
_this.portraitImage.nativeElement.height = h;
_this.translateX = Math.round((ImageMaxWidth - w) / 2);
_this.translateY = Math.round((ImageMaxHeight - h) / 2);
_this.rebuildImage();
});
this.srcImage.nativeElement.src = this.data.img.src;
this.default = this.data.default;
this.afterInit = true;
};
/**
* @return {?}
*/
PortraitEditComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
PortraitEditComponent.prototype.rebuildImage = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var c = document.createElement('canvas');
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
c.width = this.srcImage.nativeElement.width;
c.height = this.srcImage.nativeElement.height;
}
else {
c.width = this.srcImage.nativeElement.height;
c.height = this.srcImage.nativeElement.width;
}
/** @type {?} */
var ctx = c.getContext('2d');
ctx.clearRect(0, 0, c.width, c.height);
// move to the center of the canvas
ctx.translate(c.width / 2, c.height / 2);
// rotate the canvas to the specified degrees
ctx.rotate(this.rotateScope * 2 * Math.PI);
// draw the image
// since the context is rotated, the image will be rotated also
ctx.drawImage(this.srcImage.nativeElement, -this.srcImage.nativeElement.width / 2, -this.srcImage.nativeElement.height / 2);
this.portraitImage.nativeElement.src = c.toDataURL();
setTimeout((/**
* @return {?}
*/
function () {
_this.drawPreview();
}), 150);
};
/**
* @return {?}
*/
PortraitEditComponent.prototype.pimgLoad = /**
* @return {?}
*/
function () {
/** @type {?} */
var offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
};
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.startDragImage = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.dragStartPoint = { x: event.x, y: event.y };
this.dragStartTransformPosition = { x: this.translateX, y: this.translateY };
this.dragStartImageRound = this.portraitImage.nativeElement.getBoundingClientRect();
};
// 给定一个偏移,返回校正的结果
// 给定一个偏移,返回校正的结果
/**
* @param {?} dx
* @param {?} dy
* @param {?} imageRect
* @return {?}
*/
PortraitEditComponent.prototype.correctionOffset =
// 给定一个偏移,返回校正的结果
/**
* @param {?} dx
* @param {?} dy
* @param {?} imageRect
* @return {?}
*/
function (dx, dy, imageRect) {
/** @type {?} */
var containerRect = this.dragContainer.nativeElement.getBoundingClientRect();
/** @type {?} */
var lx;
/** @type {?} */
var hx;
/** @type {?} */
var ly;
/** @type {?} */
var hy;
// 如果图片宽度小于容器,则是左边框左移不能过容器左边框
if (containerRect.width > imageRect.width) {
lx = containerRect.left - imageRect.left;
hx = containerRect.right - imageRect.right;
}
else {
// 否则是右边框左移不能离开容器右边框
lx = containerRect.right - imageRect.right;
hx = containerRect.left - imageRect.left;
}
if (containerRect.height > imageRect.height) {
ly = containerRect.top - imageRect.top;
hy = containerRect.bottom - imageRect.bottom;
}
else {
ly = containerRect.bottom - imageRect.bottom;
hy = containerRect.top - imageRect.top;
}
return { x: Math.max(lx, Math.min(hx, dx)), y: Math.max(ly, Math.min(hy, dy)) };
};
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.draggingImage = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var offset = this.correctionOffset(event.x - this.dragStartPoint.x, event.y - this.dragStartPoint.y, this.dragStartImageRound);
this.translateX = this.dragStartTransformPosition.x + offset.x;
this.translateY = this.dragStartTransformPosition.y + offset.y;
this.drawPreview();
this.modified = true;
this.default = false;
};
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.zoomIn = /**
* @param {?} event
* @return {?}
*/
function (event) {
// 放大10%
this.zoomFactor = Math.min(1, this.zoomFactor * 1.1);
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor;
}
else {
this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor;
}
/** @type {?} */
var offset = this.correctionOffset(-(this.realImageWidth * this.zoomFactor - this.portraitImage.nativeElement.width) / 2, -(this.realImageHeight * this.zoomFactor - this.portraitImage.nativeElement.height) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
this.modified = true;
this.default = false;
this.drawPreview();
};
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.zoomOut = /**
* @param {?} event
* @return {?}
*/
function (event) {
// 缩小10%
this.zoomFactor = Math.max(this.minZoomFactor, this.zoomFactor * 0.9);
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor;
}
else {
this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor;
}
/** @type {?} */
var offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
this.modified = true;
this.default = false;
this.drawPreview();
};
/**
* @return {?}
*/
PortraitEditComponent.prototype.drawPreview = /**
* @return {?}
*/
function () {
/** @type {?} */
var imageRect = this.portraitImage.nativeElement.getBoundingClientRect();
// 交集
/** @type {?} */
var r = {
left: Math.max(imageRect.left, this.maskRect.left),
top: Math.max(imageRect.top, this.maskRect.top),
right: Math.min(imageRect.right, this.maskRect.right),
bottom: Math.min(imageRect.bottom, this.maskRect.bottom)
};
// 相对图片左上角的偏移
r.left = r.left - imageRect.left;
r.top = r.top - imageRect.top;
r.right = r.right - imageRect.left;
r.bottom = r.bottom - imageRect.top;
/** @type {?} */
var drawX = this.maskRect.left < imageRect.left ? (imageRect.left - this.maskRect.left) / this.zoomFactor : 0;
/** @type {?} */
var drawY = this.maskRect.top < imageRect.top ? (imageRect.top - this.maskRect.top) / this.zoomFactor : 0;
/** @type {?} */
var realWidth = ((r.right - r.left) / this.maskRect.width) * PortraitSize;
/** @type {?} */
var realHeight = ((r.bottom - r.top) / this.maskRect.height) * PortraitSize;
// 再缩放到实际图片中
r.left /= this.zoomFactor;
r.top /= this.zoomFactor;
r.right /= this.zoomFactor;
r.bottom /= this.zoomFactor;
/** @type {?} */
var ctx = this.preview.nativeElement.getContext('2d');
if (realWidth < PortraitSize || realHeight < PortraitSize) {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, this.preview.nativeElement.width, this.preview.nativeElement.height);
}
ctx.save();
/** @type {?} */
var sc = PortraitSize / (this.maskRect.width / this.zoomFactor);
ctx.scale(sc, sc);
ctx.drawImage(this.portraitImage.nativeElement, r.left, r.top, r.right - r.left, r.bottom - r.top, drawX, drawY, r.right - r.left, r.bottom - r.top);
ctx.restore();
};
/**
* @param {?} rect
* @return {?}
*/
PortraitEditComponent.prototype.maskChange = /**
* @param {?} rect
* @return {?}
*/
function (rect) {
this.maskRect = rect;
// 因为最开始就会触发一次,需要初始化过后才翻转状态
if (this.afterInit) {
this.default = false;
this.modified = true;
}
this.drawPreview();
};
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.rotate = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.rotateScope === 0) {
this.rotateScope = 0.75;
}
else {
this.rotateScope -= 0.25;
}
/** @type {?} */
var tmp = this.portraitImage.nativeElement.width;
this.portraitImage.nativeElement.width = this.portraitImage.nativeElement.height;
this.portraitImage.nativeElement.height = tmp;
this.modified = true;
this.default = false;
this.rebuildImage();
};
Object.defineProperty(PortraitEditComponent.prototype, "imageStyle", {
get: /**
* @return {?}
*/
function () {
return this._sanitizer.bypassSecurityTrustStyle('translate(' + this.translateX + 'px, ' + this.translateY + 'px)');
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
PortraitEditComponent.prototype.fileChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var reader = new FileReader();
/** @type {?} */
var self = this;
reader.onload = (/**
* @param {?} oFREvent
* @return {?}
*/
function (oFREvent) {
self.srcImage.nativeElement.src = (/** @type {?} */ (oFREvent.target.result));
});
this.modified = true;
this.default = false;
reader.readAsDataURL(event[0]);
};
/**
* @return {?}
*/
PortraitEditComponent.prototype.ok = /**
* @return {?}
*/
function () {
this.dialogRef.close((/** @type {?} */ ({
ok: true,
data: this.default ? null : this.preview.nativeElement.toDataURL('image/jpeg')
})));
};
/**
* @return {?}
*/
PortraitEditComponent.prototype.restoreDefault = /**
* @return {?}
*/
function () {
this.modified = true;
this.mask.reset();
this.srcImage.nativeElement.src = portraitDefault;
this.default = true;
};
PortraitEditComponent.decorators = [
{ type: Component, args: [{
selector: 'common-portrait-edit',
template: "<div class=\"main\">\r\n\t<div class=\"left\">\r\n\t\t<div class=\"picture-select\" #dragContainer>\r\n\t\t\t<img #srcImage class=\"hide\" crossOrigin=\"Anonymous\" />\r\n\t\t\t<img #portraitImage class=\"image\" [style.transform]=\"imageStyle\" (load)=\"pimgLoad()\" />\r\n\t\t\t<common-portrait-mask #mask\r\n\t\t\t\tclass=\"mask\"\r\n\t\t\t\t(startDrag)=\"startDragImage($event)\"\r\n\t\t\t\t(maskChange)=\"maskChange($event)\"\r\n\t\t\t\t(dragging)=\"draggingImage($event)\"\r\n\t\t\t></common-portrait-mask>\r\n\t\t</div>\r\n\t\t<div class=\"small-button\">\r\n\t\t\t<button mat-icon-button (click)=\"rotate($event)\">\r\n\t\t\t\t<mat-icon svgIcon=\"rotate_90_degrees_ccw\"></mat-icon>\r\n\t\t\t</button>\r\n\t\t\t<span>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomIn($event)\" [disabled]=\"zoomFactor >= 1\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"add_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomOut($event)\" [disabled]=\"zoomFactor <= minZoomFactor\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"remove_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t</span>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"right\">\r\n\t\t<div>\r\n\t\t\t<div class=\"\u9884\u89C8\u6807\u9898\">\u9884\u89C8</div>\r\n\t\t\t<div class=\"\u9884\u89C8\u56FE\u7247\">\r\n\t\t\t\t<canvas class=\"preview\" width=\"224\" height=\"224\" #preview></canvas>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF\" (click)=\"restoreDefault()\">\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF</div>\r\n\t\t</div>\r\n\t\t<div class=\"button-bottom\">\r\n\t\t\t<div class=\"upload-file\">\r\n\t\t\t\t<input type=\"file\" id=\"file\" name=\"file\" (change)=\"fileChange($event.target.files)\" />\r\n\t\t\t\t<span>\u9009\u62E9\u56FE\u7247</span>\r\n\t\t\t</div>\r\n\t\t\t<button\r\n\t\t\t\tclass=\"\u786E\u8BA4\u56FE\u7247\"\r\n\t\t\t\tmat-raised-button\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t(click)=\"ok()\"\r\n\t\t\t\t[disabled]=\"!modified\"\t\t\t\t\r\n\t\t\t>\r\n\t\t\t\t\u786E\u5B9A\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\t<mat-icon (click)=\"dialogRef.close()\" class=\"\u5173\u95ED\" svgIcon=\"close\"></mat-icon>\r\n</div>\r\n",
styles: ["@charset \"UTF-8\";.main{display:flex;height:100%;position:relative}.main .left{display:flex;flex-direction:column}.main .left .picture-select{width:224px;height:224px;background:url(/front/assets/userinfo/bg_picselect.png) 0 0/100% 100% no-repeat;overflow:hidden;position:relative}.main .left .picture-select .mask{width:100%;height:100%;position:absolute;left:0;top:0}.main .left .small-button{margin-top:8px;display:flex;justify-content:space-between}.main .right{flex-grow:1;height:247px;display:flex;flex-direction:column;justify-content:space-between}.main .right .\u9884\u89C8\u6807\u9898{margin-left:56px;font-size:12px}.main .right .\u9884\u89C8\u56FE\u7247{text-align:center;margin:8px 0 16px}.main .right .preview{width:112px;height:112px;border-radius:56px}.main .right .\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF{font-size:12px;margin-top:16px;text-align:center;cursor:pointer}.main .right .button-bottom{margin-left:24px;height:32px}.main .right .button-bottom .upload-file{display:inline-block;width:80px;height:32px;position:relative;margin-right:8px;font-size:16px;text-align:center;line-height:32px;border-radius:4px;overflow:hidden;vertical-align:bottom}.main .right .button-bottom .upload-file #file{opacity:0;height:100%;position:absolute;left:0;top:0}.main .right .button-bottom .\u786E\u8BA4\u56FE\u7247{width:80px;height:32px;font-size:16px;line-height:32px}.hide{display:none}.\u5173\u95ED{position:absolute;right:-16px;top:-16px;cursor:pointer}"]
}] }
];
/** @nocollapse */
PortraitEditComponent.ctorParameters = function () { return [
{ type: MatDialogRef },
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] },
{ type: DomSanitizer },
{ type: CurrentService }
]; };
PortraitEditComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.portrait-edit',] }],
portraitImage: [{ type: ViewChild, args: ['portraitImage', { static: true },] }],
srcImage: [{ type: ViewChild, args: ['srcImage', { static: true },] }],
dragContainer: [{ type: ViewChild, args: ['dragContainer', { static: true },] }],
preview: [{ type: ViewChild, args: ['preview', { static: true },] }],
mask: [{ type: ViewChild, args: ['mask', { static: true },] }]
};
return PortraitEditComponent;
}());
export { PortraitEditComponent };
if (false) {
/** @type {?} */
PortraitEditComponent.prototype.hostClass;
/** @type {?} */
PortraitEditComponent.prototype.portraitImage;
/** @type {?} */
PortraitEditComponent.prototype.srcImage;
/** @type {?} */
PortraitEditComponent.prototype.dragContainer;
/** @type {?} */
PortraitEditComponent.prototype.preview;
/** @type {?} */
PortraitEditComponent.prototype.mask;
/** @type {?} */
PortraitEditComponent.prototype.dragStartPoint;
/** @type {?} */
PortraitEditComponent.prototype.dragStartTransformPosition;
/** @type {?} */
PortraitEditComponent.prototype.dragStartImageRound;
/** @type {?} */
PortraitEditComponent.prototype.realImageWidth;
/** @type {?} */
PortraitEditComponent.prototype.realImageHeight;
/** @type {?} */
PortraitEditComponent.prototype.zoomFactor;
/** @type {?} */
PortraitEditComponent.prototype.minZoomFactor;
/** @type {?} */
PortraitEditComponent.prototype.maskRect;
/** @type {?} */
PortraitEditComponent.prototype.translateX;
/** @type {?} */
PortraitEditComponent.prototype.translateY;
/** @type {?} */
PortraitEditComponent.prototype.rotateScope;
/** @type {?} */
PortraitEditComponent.prototype.modified;
/** @type {?} */
PortraitEditComponent.prototype.afterInit;
/** @type {?} */
PortraitEditComponent.prototype.default;
/** @type {?} */
PortraitEditComponent.prototype.dialogRef;
/** @type {?} */
PortraitEditComponent.prototype.data;
/**
* @type {?}
* @private
*/
PortraitEditComponent.prototype._sanitizer;
/** @type {?} */
PortraitEditComponent.prototype.curr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7OztBQUU5QywrQ0FHQzs7O0lBRkEsd0NBQXNCOztJQUN0Qiw0Q0FBaUI7Ozs7O0FBRWxCLHFEQUdDOzs7SUFGQSw2Q0FBWTs7SUFDWiwrQ0FBYTs7O0lBRVIsYUFBYSxHQUFHLEdBQUc7O0lBQ25CLGNBQWMsR0FBRyxHQUFHOztJQUNwQixZQUFZLEdBQUcsR0FBRzs7QUFDeEI7SUEwQkMsK0JBQ1EsU0FBOEMsRUFDckIsSUFBK0IsRUFDdkQsVUFBd0IsRUFDekIsSUFBb0I7UUFIcEIsY0FBUyxHQUFULFNBQVMsQ0FBcUM7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDdkQsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXhCUSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBY3JELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxxQkFBcUI7SUFNbkMsQ0FBQzs7OztJQUNKLCtDQUFlOzs7SUFBZjtRQUFBLGlCQTBCQztRQXpCQSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7UUFBRztZQUNwQyxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN4RCxLQUFJLENBQUMsZUFBZSxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQzs7Z0JBQ3RELENBQUMsR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLOztnQkFDckMsQ0FBQyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDMUMsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsRUFBRTtnQkFDaEMsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7Z0JBQzFELENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQztnQkFDeEIsQ0FBQyxHQUFHLGNBQWMsQ0FBQzthQUNuQjtpQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsRUFBRTtnQkFDdkMsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQztnQkFDeEIsQ0FBQyxHQUFHLGFBQWEsQ0FBQzthQUNsQjtZQUNELEtBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDM0MsS0FBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUM1QyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXZELEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUEsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDOzs7O0lBQ0Qsd0NBQVE7OztJQUFSLGNBQVksQ0FBQzs7OztJQUNiLDRDQUFZOzs7SUFBWjtRQUFBLGlCQStCQzs7WUE5Qk0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxHQUFHLEVBQUU7WUFDdkQsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7U0FDOUM7YUFBTTtZQUNOLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1NBQzdDOztZQUVLLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM5QixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsbUNBQW1DO1FBQ25DLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6Qyw2Q0FBNkM7UUFDN0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0MsaUJBQWlCO1FBQ2pCLCtEQUErRDtRQUMvRCxHQUFHLENBQUMsU0FBUyxDQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUMzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQ3RDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdkMsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFckQsVUFBVTs7O1FBQUM7WUFDVixLQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsQ0FBQzs7OztJQUNELHdDQUFROzs7SUFBUjs7WUFDTyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNuQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQ3BGLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFDdEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FDeEQ7UUFDRCxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRUQsOENBQWM7Ozs7SUFBZCxVQUFlLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFN0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDckYsQ0FBQztJQUNELGlCQUFpQjs7Ozs7Ozs7SUFDakIsZ0RBQWdCOzs7Ozs7OztJQUFoQixVQUFpQixFQUFVLEVBQUUsRUFBVSxFQUFFLFNBQXFCOztZQUN2RCxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7O1lBQzFFLEVBQVU7O1lBQUUsRUFBVTs7WUFBRSxFQUFVOztZQUFFLEVBQVU7UUFDbEQsNkJBQTZCO1FBQzdCLElBQUksYUFBYSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQzFDLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDekMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUMzQzthQUFNO1lBQ04sb0JBQW9CO1lBQ3BCLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDM0MsRUFBRSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztTQUN6QztRQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzVDLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDdkMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztTQUM3QzthQUFNO1lBQ04sRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUM3QyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakYsQ0FBQzs7Ozs7SUFDRCw2Q0FBYTs7OztJQUFiLFVBQWMsS0FBWTs7WUFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFDL0IsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsRUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUN4QjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDOzs7OztJQUNELHNDQUFNOzs7O0lBQU4sVUFBTyxLQUFpQjtRQUN2QixRQUFRO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvRSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2pGO2FBQU07WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDaEY7O1lBQ0ssTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQ3JGLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUN4RDtRQUNELElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Ozs7O0lBQ0QsdUNBQU87Ozs7SUFBUCxVQUFRLEtBQWlCO1FBQ3hCLFFBQVE7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRXRFLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvRSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2pGO2FBQU07WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDaEY7O1lBRUssTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUNwRixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQ3hEO1FBQ0QsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7OztJQUVELDJDQUFXOzs7SUFBWDs7WUFDTyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7OztZQUVwRSxDQUFDLEdBQUc7WUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2xELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDL0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNyRCxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3hEO1FBQ0QsYUFBYTtRQUNiLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDOztZQUM5QixLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDekcsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXJHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZOztZQUNyRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWTtRQUM3RSxZQUFZO1FBQ1osQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDM0IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDOztZQUN0QixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUV2RCxJQUFJLFNBQVMsR0FBRyxZQUFZLElBQUksVUFBVSxHQUFHLFlBQVksRUFBRTtZQUMxRCxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUN4QixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDOztZQUNMLEVBQUUsR0FBRyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2pFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxTQUFTLENBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQ2hDLENBQUMsQ0FBQyxJQUFJLEVBQ04sQ0FBQyxDQUFDLEdBQUcsRUFDTCxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQ2hCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFDaEIsS0FBSyxFQUNMLEtBQUssRUFDTCxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQ2hCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FDaEIsQ0FBQztRQUNGLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUM7Ozs7O0lBQ0QsMENBQVU7Ozs7SUFBVixVQUFXLElBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLDJCQUEyQjtRQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFFckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFDRCxzQ0FBTTs7OztJQUFOLFVBQU8sS0FBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN4QjthQUFNO1lBQ04sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7U0FDekI7O1lBQ0ssR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUs7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNqRixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsc0JBQUksNkNBQVU7Ozs7UUFBZDtZQUNDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FDOUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUNqRSxDQUFDO1FBQ0gsQ0FBQzs7O09BQUE7Ozs7O0lBQ0QsMENBQVU7Ozs7SUFBVixVQUFXLEtBQWU7O1lBQ25CLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTs7WUFDekIsSUFBSSxHQUFHLElBQUk7UUFDakIsTUFBTSxDQUFDLE1BQU07Ozs7UUFBRyxVQUFTLFFBQWE7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLG1CQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFVLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFDRCxrQ0FBRTs7O0lBQUY7UUFDQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxtQkFBQTtZQUNwQixFQUFFLEVBQUUsSUFBSTtZQUNSLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7U0FDOUUsRUFBbUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Ozs7SUFDRCw4Q0FBYzs7O0lBQWQ7UUFDQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQzs7Z0JBL1JELFNBQVMsU0FBQztvQkFDVixRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxrb0VBQTZDOztpQkFFN0M7Ozs7Z0JBckJRLFlBQVk7Z0RBNkNsQixNQUFNLFNBQUMsZUFBZTtnQkE1Q2hCLFlBQVk7Z0JBQ1osY0FBYzs7OzRCQXFCckIsV0FBVyxTQUFDLHFCQUFxQjtnQ0FDakMsU0FBUyxTQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MkJBQzNDLFNBQVMsU0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dDQUN0QyxTQUFTLFNBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTswQkFDM0MsU0FBUyxTQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7dUJBQ3JDLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOztJQXFScEMsNEJBQUM7Q0FBQSxBQWhTRCxJQWdTQztTQTNSWSxxQkFBcUI7OztJQUNqQywwQ0FBcUQ7O0lBQ3JELDhDQUEwRjs7SUFDMUYseUNBQWdGOztJQUNoRiw4Q0FBcUY7O0lBQ3JGLHdDQUErRTs7SUFDL0UscUNBQWlFOztJQUNqRSwrQ0FBc0I7O0lBQ3RCLDJEQUFrQzs7SUFDbEMsb0RBQWdDOztJQUNoQywrQ0FBdUI7O0lBQ3ZCLGdEQUF3Qjs7SUFDeEIsMkNBQW1COztJQUNuQiw4Q0FBc0I7O0lBQ3RCLHlDQUFxQjs7SUFDckIsMkNBQWU7O0lBQ2YsMkNBQWU7O0lBQ2YsNENBQWdCOztJQUNoQix5Q0FBaUI7O0lBQ2pCLDBDQUFrQjs7SUFDbEIsd0NBQWdCOztJQUVmLDBDQUFxRDs7SUFDckQscUNBQStEOzs7OztJQUMvRCwyQ0FBZ0M7O0lBQ2hDLHFDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcC90eXBpbmdzL2RyYWctcmVmJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ3VycmVudFNlcnZpY2UgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgUG9ydHJhaXRNYXNrQ29tcG9uZW50IH0gZnJvbSAnLi9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50JztcclxuaW1wb3J0IHsgcG9ydHJhaXREZWZhdWx0IH0gZnJvbSAnLi4vLi4vY29uc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQb3J0cmFpdEVkaXRDb21wb25lbnREYXRhIHtcclxuXHRpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcblx0ZGVmYXVsdDogYm9vbGVhbjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRyYWl0RWRpdENvbXBvbmVudFJlc3VsdERhdGEge1xyXG5cdG9rOiBib29sZWFuO1xyXG5cdGRhdGE6IHN0cmluZztcclxufVxyXG5jb25zdCBJbWFnZU1heFdpZHRoID0gMjI0O1xyXG5jb25zdCBJbWFnZU1heEhlaWdodCA9IDIyNDtcclxuY29uc3QgUG9ydHJhaXRTaXplID0gMjI0OyAvLyAxMTI7XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLXBvcnRyYWl0LWVkaXQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBvcnRyYWl0RWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5wb3J0cmFpdC1lZGl0JykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdwb3J0cmFpdEltYWdlJywgeyBzdGF0aWM6IHRydWUgfSkgcG9ydHJhaXRJbWFnZTogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdzcmNJbWFnZScsIHsgc3RhdGljOiB0cnVlIH0pIHNyY0ltYWdlOiBFbGVtZW50UmVmPEhUTUxJbWFnZUVsZW1lbnQ+O1xyXG5cdEBWaWV3Q2hpbGQoJ2RyYWdDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdwcmV2aWV3JywgeyBzdGF0aWM6IHRydWUgfSkgcHJldmlldzogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XHJcblx0QFZpZXdDaGlsZCgnbWFzaycsIHsgc3RhdGljOiB0cnVlIH0pIG1hc2s6IFBvcnRyYWl0TWFza0NvbXBvbmVudDtcclxuXHRkcmFnU3RhcnRQb2ludDogUG9pbnQ7XHJcblx0ZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb246IFBvaW50O1xyXG5cdGRyYWdTdGFydEltYWdlUm91bmQ6IENsaWVudFJlY3Q7XHJcblx0cmVhbEltYWdlV2lkdGg6IG51bWJlcjtcclxuXHRyZWFsSW1hZ2VIZWlnaHQ6IG51bWJlcjtcclxuXHR6b29tRmFjdG9yOiBudW1iZXI7XHJcblx0bWluWm9vbUZhY3RvcjogbnVtYmVyO1xyXG5cdG1hc2tSZWN0OiBDbGllbnRSZWN0O1xyXG5cdHRyYW5zbGF0ZVggPSAwO1xyXG5cdHRyYW5zbGF0ZVkgPSAwO1xyXG5cdHJvdGF0ZVNjb3BlID0gMDtcclxuXHRtb2RpZmllZCA9IGZhbHNlO1xyXG5cdGFmdGVySW5pdCA9IGZhbHNlO1xyXG5cdGRlZmF1bHQgPSBmYWxzZTsgLy8g5piv5ZCm5piv57y655yB55qE5Zu+54mH77yM57y655yB5Zu+54mH5LiN6ZyA6KaB5L+d5a2YXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UG9ydHJhaXRFZGl0Q29tcG9uZW50PixcclxuXHRcdEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogUG9ydHJhaXRFZGl0Q29tcG9uZW50RGF0YSxcclxuXHRcdHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG5cdFx0cHVibGljIGN1cnI6IEN1cnJlbnRTZXJ2aWNlXHJcblx0KSB7fVxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlV2lkdGggPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlSGVpZ2h0ID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0bGV0IHcgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdGxldCBoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gMTtcclxuXHRcdFx0aWYgKHcgPCBoICYmIGggPiBJbWFnZU1heEhlaWdodCkge1xyXG5cdFx0XHRcdHRoaXMubWluWm9vbUZhY3RvciA9IHRoaXMuem9vbUZhY3RvciA9IEltYWdlTWF4SGVpZ2h0IC8gaDtcclxuXHRcdFx0XHR3ID0gdyAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0XHRoID0gSW1hZ2VNYXhIZWlnaHQ7XHJcblx0XHRcdH0gZWxzZSBpZiAodyA+IGggJiYgdyA+IEltYWdlTWF4SGVpZ2h0KSB7XHJcblx0XHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gSW1hZ2VNYXhXaWR0aCAvIHc7XHJcblx0XHRcdFx0aCA9IGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdFx0dyA9IEltYWdlTWF4V2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB3O1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSBoO1xyXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZVggPSBNYXRoLnJvdW5kKChJbWFnZU1heFdpZHRoIC0gdykgLyAyKTtcclxuXHRcdFx0dGhpcy50cmFuc2xhdGVZID0gTWF0aC5yb3VuZCgoSW1hZ2VNYXhIZWlnaHQgLSBoKSAvIDIpO1xyXG5cclxuXHRcdFx0dGhpcy5yZWJ1aWxkSW1hZ2UoKTtcclxuXHRcdH07XHJcblx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gdGhpcy5kYXRhLmltZy5zcmM7XHJcblx0XHR0aGlzLmRlZmF1bHQgPSB0aGlzLmRhdGEuZGVmYXVsdDtcclxuXHRcdHRoaXMuYWZ0ZXJJbml0ID0gdHJ1ZTtcclxuXHR9XHJcblx0bmdPbkluaXQoKSB7fVxyXG5cdHJlYnVpbGRJbWFnZSgpIHtcclxuXHRcdGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoO1xyXG5cdFx0XHRjLmhlaWdodCA9IHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0Yy5oZWlnaHQgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cdFx0Y3R4LmNsZWFyUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XHJcblx0XHQvLyBtb3ZlIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc1xyXG5cdFx0Y3R4LnRyYW5zbGF0ZShjLndpZHRoIC8gMiwgYy5oZWlnaHQgLyAyKTtcclxuXHJcblx0XHQvLyByb3RhdGUgdGhlIGNhbnZhcyB0byB0aGUgc3BlY2lmaWVkIGRlZ3JlZXNcclxuXHRcdGN0eC5yb3RhdGUodGhpcy5yb3RhdGVTY29wZSAqIDIgKiBNYXRoLlBJKTtcclxuXHJcblx0XHQvLyBkcmF3IHRoZSBpbWFnZVxyXG5cdFx0Ly8gc2luY2UgdGhlIGNvbnRleHQgaXMgcm90YXRlZCwgdGhlIGltYWdlIHdpbGwgYmUgcm90YXRlZCBhbHNvXHJcblx0XHRjdHguZHJhd0ltYWdlKFxyXG5cdFx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQsXHJcblx0XHRcdC10aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLyAyLFxyXG5cdFx0XHQtdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAvIDJcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gYy50b0RhdGFVUkwoKTtcclxuXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdFx0fSwgMTUwKTtcclxuXHR9XHJcblx0cGltZ0xvYWQoKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCAtIHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3IpIC8gMixcclxuXHRcdFx0KHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAtIHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcblx0XHQpO1xyXG5cdFx0dGhpcy50cmFuc2xhdGVYICs9IG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZICs9IG9mZnNldC55O1xyXG5cdH1cclxuXHJcblx0c3RhcnREcmFnSW1hZ2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQgPSB7IHg6IGV2ZW50LngsIHk6IGV2ZW50LnkgfTtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24gPSB7IHg6IHRoaXMudHJhbnNsYXRlWCwgeTogdGhpcy50cmFuc2xhdGVZIH07XHJcblxyXG5cdFx0dGhpcy5kcmFnU3RhcnRJbWFnZVJvdW5kID0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0fVxyXG5cdC8vIOe7meWumuS4gOS4quWBj+enu++8jOi/lOWbnuagoeato+eahOe7k+aenFxyXG5cdGNvcnJlY3Rpb25PZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlciwgaW1hZ2VSZWN0OiBDbGllbnRSZWN0KTogUG9pbnQge1xyXG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0bGV0IGx4OiBudW1iZXIsIGh4OiBudW1iZXIsIGx5OiBudW1iZXIsIGh5OiBudW1iZXI7XHJcblx0XHQvLyDlpoLmnpzlm77niYflrr3luqblsI/kuo7lrrnlmajvvIzliJnmmK/lt6bovrnmoYblt6bnp7vkuI3og73ov4flrrnlmajlt6bovrnmoYZcclxuXHRcdGlmIChjb250YWluZXJSZWN0LndpZHRoID4gaW1hZ2VSZWN0LndpZHRoKSB7XHJcblx0XHRcdGx4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGltYWdlUmVjdC5yaWdodDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIOWQpuWImeaYr+WPs+i+ueahhuW3puenu+S4jeiDveemu+W8gOWuueWZqOWPs+i+ueahhlxyXG5cdFx0XHRseCA9IGNvbnRhaW5lclJlY3QucmlnaHQgLSBpbWFnZVJlY3QucmlnaHQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHR9XHJcblx0XHRpZiAoY29udGFpbmVyUmVjdC5oZWlnaHQgPiBpbWFnZVJlY3QuaGVpZ2h0KSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC50b3AgLSBpbWFnZVJlY3QudG9wO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QuYm90dG9tIC0gaW1hZ2VSZWN0LmJvdHRvbTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC5ib3R0b20gLSBpbWFnZVJlY3QuYm90dG9tO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QudG9wIC0gaW1hZ2VSZWN0LnRvcDtcclxuXHRcdH1cclxuXHRcdHJldHVybiB7IHg6IE1hdGgubWF4KGx4LCBNYXRoLm1pbihoeCwgZHgpKSwgeTogTWF0aC5tYXgobHksIE1hdGgubWluKGh5LCBkeSkpIH07XHJcblx0fVxyXG5cdGRyYWdnaW5nSW1hZ2UoZXZlbnQ6IFBvaW50KSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdGV2ZW50LnggLSB0aGlzLmRyYWdTdGFydFBvaW50LngsXHJcblx0XHRcdGV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydFBvaW50LnksXHJcblx0XHRcdHRoaXMuZHJhZ1N0YXJ0SW1hZ2VSb3VuZFxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCA9IHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24ueCArIG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZID0gdGhpcy5kcmFnU3RhcnRUcmFuc2Zvcm1Qb3NpdGlvbi55ICsgb2Zmc2V0Lnk7XHJcblx0XHR0aGlzLmRyYXdQcmV2aWV3KCk7XHJcblx0XHR0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcclxuXHRcdHRoaXMuZGVmYXVsdCA9IGZhbHNlO1xyXG5cdH1cclxuXHR6b29tSW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdC8vIOaUvuWkpzEwJVxyXG5cdFx0dGhpcy56b29tRmFjdG9yID0gTWF0aC5taW4oMSwgdGhpcy56b29tRmFjdG9yICogMS4xKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gdGhpcy5yZWFsSW1hZ2VXaWR0aCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuY29ycmVjdGlvbk9mZnNldChcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yIC0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGgpIC8gMixcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvciAtIHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCkgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcdHRoaXMudHJhbnNsYXRlWSArPSBvZmZzZXQueTtcclxuXHRcdHRoaXMubW9kaWZpZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWZhdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdH1cclxuXHR6b29tT3V0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvLyDnvKnlsI8xMCVcclxuXHRcdHRoaXMuem9vbUZhY3RvciA9IE1hdGgubWF4KHRoaXMubWluWm9vbUZhY3RvciwgdGhpcy56b29tRmFjdG9yICogMC45KTtcclxuXHJcblx0XHRpZiAodGhpcy5yb3RhdGVTY29wZSA9PT0gMCB8fCB0aGlzLnJvdGF0ZVNjb3BlID09PSAwLjUpIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoID0gdGhpcy5yZWFsSW1hZ2VIZWlnaHQgKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdGhpcy5jb3JyZWN0aW9uT2Zmc2V0KFxyXG5cdFx0XHQodGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgLSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcikgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcd