dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
220 lines • 22.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { formatDate } from '@angular/common';
import { Component, HostBinding, HostListener } from '@angular/core';
import { CalendarDateFormatter, CalendarView } from 'angular-calendar';
import { IndexService } from '../index.service';
export class CustomDateFormatter extends CalendarDateFormatter {
/**
* @param {?} __0
* @return {?}
*/
monthViewColumnHeader({ date, locale }) {
// console.log(formatDate(date, 'EEEEE', locale));
// switch (date.getDay()) {
// case 0:
// return 'S';
// break;
// case 1:
// return 'M';
// break;
// case 2:
// return 'T';
// break;
// case 3:
// return 'W';
// break;
// case 4:
// return 'T';
// break;
// case 5:
// return 'F';
// break;
// case 6:
// return 'S';
// break;
// }
return formatDate(date, 'EEEEE', locale); // use short week days
}
}
export class CalendarComponent {
/**
* @param {?} svr
*/
constructor(svr) {
this.svr = svr;
this.hostClass = true;
this.navName = 'calendar';
this.view = CalendarView.Month;
this.viewDate = new Date();
this.isEdit = false;
this.activeDayIsOpen = true;
this.showDayHint = false;
this.navSize = this.svr.userSetting.Cards.find((/**
* @param {?} x
* @return {?}
*/
x => x.Type === this.navName)).Size;
// console.log(this.navSize);
}
/**
* @return {?}
*/
closeShowDayHint() {
this.showDayHint = false;
}
/**
* @return {?}
*/
get events() {
if (this.svr.userDiary) {
return this.svr.userDiary.map((/**
* @param {?} v
* @return {?}
*/
v => ({
start: new Date(v.Day),
title: v.Content
})));
}
return [];
}
/**
* @param {?} action
* @param {?} event
* @return {?}
*/
handleEvent(action, event) {
// 111;
console.log(action, event);
}
/**
* @return {?}
*/
ngOnInit() {
this.svr.initCalendar();
}
// ↓单击日期时
/**
* @param {?} event
* @return {?}
*/
dayClick(event) {
// console.log((event.sourceEvent.target as HTMLElement).getBoundingClientRect());
this.showDay = event.day;
this.isEdit = !this.showDay.isPast && this.showDay.events.length === 0;
this.showDayHint = true; // 日期备注是否显示
// 日期备注是否显示
// ↓ 获取备注信息栏的坐标(即 点击元素在屏幕中的位置)
/** @type {?} */
const posCircle = ((/** @type {?} */ (event.sourceEvent.target))).getBoundingClientRect();
/** @type {?} */
const distanceWidth = posCircle.width;
/** @type {?} */
const distanceRight = posCircle.right;
// 如果右侧距离不够,则往选择左侧显示
if (window.innerWidth - distanceRight < 320) {
this.disX = posCircle.left - 320 + 32;
}
else {
this.disX = posCircle.left + distanceWidth - 32;
}
this.disY = posCircle.bottom;
if (event.day.events && event.day.events.length > 0) {
this.editText = event.day.events[0].title;
}
else {
this.editText = '';
}
// console.log((this.innerWidth = window.innerWidth));
// console.log('showDay:', this.showDay);
// console.log('---');
// console.log('showDay:', this.showDay.isPast);
}
/**
* @return {?}
*/
editOk() {
this.svr.updateUserDiary(this.showDay.date, this.editText).subscribe((/**
* @return {?}
*/
() => {
this.showDayHint = false;
}));
}
/**
* @return {?}
*/
editCancel() {
this.editText === '' ? (this.showDayHint = false) : (this.isEdit = false);
}
/**
* @return {?}
*/
removeEvents() {
this.svr.removeUserDiary(this.showDay.date).subscribe((/**
* @return {?}
*/
() => {
this.showDayHint = false;
}));
}
}
CalendarComponent.decorators = [
{ type: Component, args: [{
selector: 'common-calendar',
template: "<div class=\"calendar-main mat-elevation-z2\">\r\n\t<div class=\"main-title\">\r\n\t\t<div class=\"title-left\">\r\n\t\t\t<mat-icon svgIcon=\"date_range\"></mat-icon>\r\n\t\t\t<span>\u65E5\u7A0B\u5B89\u6392</span>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"title-right\">\r\n\t\t\t<common-more-vert [typeName]=\"navName\" [theNavSize]=\"navSize\">\r\n\t\t\t</common-more-vert>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"cal-title\">\r\n\t\t<button mat-button color=\"primary\" class=\"btn btn-primary\"\r\n\t\t\tmwlCalendarPreviousView [view]=\"view\" [(viewDate)]=\"viewDate\">\r\n\t\t\t<mat-icon svgIcon=\"keyboard_arrow_left\"></mat-icon>\r\n\t\t</button>\r\n\t\t<div class=\"title-text\">\r\n\t\t\t{{ this.viewDate|date:'yyyy\u5E74MM\u6708'}}\r\n\t\t\t<!-- {{ viewDate | calendarDate:(view + 'ViewTitle'):'en' }} -->\r\n\t\t</div>\r\n\t\t<button mat-button color=\"primary\" class=\"btn btn-primary\"\r\n\t\t\tmwlCalendarNextView [view]=\"view\" [(viewDate)]=\"viewDate\">\r\n\t\t\t<mat-icon svgIcon=\"keyboard_arrow_right\"></mat-icon>\r\n\t\t</button>\r\n\t</div>\r\n\t<div class=\"dateCal\">\r\n\t\t<mwl-calendar-month-view [viewDate]=\"viewDate\" [events]=\"events\"\r\n\t\t\t[cellTemplate]=\"customCellTemplate\" (dayClicked)=\"dayClick($event)\">\r\n\t\t</mwl-calendar-month-view>\r\n\t</div>\r\n\t<ng-template #customCellTemplate let-day=\"day\" let-locale=\"locale\">\r\n\t\t<div class=\"per-day\">\r\n\t\t\t<div class=\"per-day-cricle\"\r\n\t\t\t\t[ngClass]=\"{'active':showDay?.date?.getTime() === day.date.getTime()}\">\r\n\t\t\t\t{{ day.date | calendarDate:'monthViewDayNumber':locale }}\r\n\t\t\t\t<mat-icon class=\"icon-circle\" svgIcon=\"fiber_manual_record\"\r\n\t\t\t\t\t*ngIf=\"day.badgeTotal>0\"></mat-icon>\r\n\t\t\t\t<!-- \u7B49\u4F1A\u63D2\u5165 -->\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t</ng-template>\r\n\r\n\r\n\t<div class=\"show-day mat-elevation-z2\"\r\n\t\t[ngStyle]=\"{'left.px': disX, 'top.px': disY}\" *ngIf=\"showDayHint\"\r\n\t\t(click)=\"$event.stopPropagation()\">\r\n\t\t<div *ngIf=\"isEdit;else readonly\" class=\"is-edit\">\r\n\t\t\t<div class=\"edit-title\">\r\n\t\t\t\t<b class=\"edit-left\">\r\n\t\t\t\t\t{{showDay.date|date:'yyyy.MM.dd'}}\r\n\t\t\t\t</b>\r\n\t\t\t\t<div class=\"edit-right\">\r\n\t\t\t\t\t<button mat-button>\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"clear\" (click)=\"editCancel()\">\r\n\t\t\t\t\t\t</mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button color=\"primary\" mat-button>\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"check\" (click)=\"editOk()\"></mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<textarea class=\"area\" matInput [(ngModel)]=\"editText\"></textarea>\r\n\t\t</div>\r\n\t\t<ng-template #readonly>\r\n\t\t\t<div class=\"is-read-only\">\r\n\t\t\t\t<div class=\"edit-title\">\r\n\t\t\t\t\t<b class=\"read-only-left\">\r\n\t\t\t\t\t\t{{showDay.date|date:'yyyy.MM.dd'}}\r\n\t\t\t\t\t</b>\r\n\t\t\t\t\t<div class=\"read-only-right\">\r\n\t\t\t\t\t\t<button mat-button (click)=\"removeEvents()\">\r\n\t\t\t\t\t\t\t<mat-icon svgIcon=\"delete_outline\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<button color=\"primary\" [disabled]=\"showDay.isPast\"\r\n\t\t\t\t\t\t\tmat-button (click)=\"isEdit=true\">\r\n\t\t\t\t\t\t\t<mat-icon svgIcon=\"create\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<button mat-button (click)=\"showDayHint=false\">\r\n\t\t\t\t\t\t\t<mat-icon svgIcon=\"cancel\"></mat-icon>\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"area\">{{showDay?.events[0]?.title}}</div>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\t</div>\r\n\r\n\r\n</div>",
providers: [
{
provide: CalendarDateFormatter,
useClass: CustomDateFormatter
}
],
styles: [".calendar-main{width:100%;height:100%;box-sizing:border-box;padding:8px;border-radius:4px}.main-title{display:flex;justify-content:space-between;align-items:center;width:100%;height:24px;box-sizing:border-box;margin-bottom:4px;color:#72aac9}.main-title .title-left,.main-title .title-right{align-items:center}.main-title .title-left{display:flex;align-items:center}.main-title .title-left span{margin-left:8px}.main-title .title-right{display:none}.calendar-main:hover .title-right{display:flex}.cal-title{display:flex;justify-content:space-between;width:100%;height:34px;line-height:34px;box-sizing:border-box}.cal-title .btn{display:flex;align-items:center;height:34px;line-height:34px}.dateCal{width:100%;height:195px;box-sizing:border-box;padding-left:8px;padding-right:8px;font-size:12px;overflow:auto}.per-day{position:relative;display:flex;justify-content:center;height:30px;line-height:30px;cursor:pointer}.per-day-cricle{position:relative;width:100%;max-width:30px;min-width:22px;height:30px;line-height:30px;box-sizing:border-box;border-radius:17px}.icon-circle{position:absolute;right:0;top:0;margin-top:-12px;width:8px;height:8px}.show-day{position:absolute;width:320px;height:184px;box-sizing:border-box;padding:0 8px 8px 12px;border-radius:4px;z-index:999}.active .show-day{display:block}.edit-title{display:flex;justify-content:space-between;align-items:center;flex-wrap:nowrap;width:100%;height:40px;font-size:18px}.edit-title button{width:40px;height:40px}.area{width:100%;height:136px;box-sizing:border-box}"]
}] }
];
/** @nocollapse */
CalendarComponent.ctorParameters = () => [
{ type: IndexService }
];
CalendarComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.c-index-calendar',] }],
closeShowDayHint: [{ type: HostListener, args: ['document:click',] }]
};
if (false) {
/** @type {?} */
CalendarComponent.prototype.hostClass;
/** @type {?} */
CalendarComponent.prototype.navName;
/** @type {?} */
CalendarComponent.prototype.navSize;
/** @type {?} */
CalendarComponent.prototype.view;
/** @type {?} */
CalendarComponent.prototype.viewDate;
/** @type {?} */
CalendarComponent.prototype.innerWidth;
/** @type {?} */
CalendarComponent.prototype.modalData;
/** @type {?} */
CalendarComponent.prototype.showDay;
/** @type {?} */
CalendarComponent.prototype.isEdit;
/** @type {?} */
CalendarComponent.prototype.activeDayIsOpen;
/** @type {?} */
CalendarComponent.prototype.editText;
/** @type {?} */
CalendarComponent.prototype.disX;
/** @type {?} */
CalendarComponent.prototype.disY;
/** @type {?} */
CalendarComponent.prototype.showDayHint;
/** @type {?} */
CalendarComponent.prototype.isEventsEmpty;
/** @type {?} */
CalendarComponent.prototype.svr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL2luZGV4L2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQWlCLFlBQVksRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLHFCQUFxQjs7Ozs7SUFDdEQscUJBQXFCLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUF1QjtRQUNqRSxrREFBa0Q7UUFDbEQsMkJBQTJCO1FBQzNCLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLElBQUk7UUFDSixPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsc0JBQXNCO0lBQ2pFLENBQUM7Q0FDRDtBQVlELE1BQU0sT0FBTyxpQkFBaUI7Ozs7SUFzQzdCLFlBQW1CLEdBQWlCO1FBQWpCLFFBQUcsR0FBSCxHQUFHLENBQWM7UUFyQ0csY0FBUyxHQUFHLElBQUksQ0FBQztRQUN4RCxZ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QUFhOztJQUNiLHdDQUFvQjs7SUFFcEIsMENBQXVCOztJQWdCWCxnQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJEYXRlRm9ybWF0dGVyLCBDYWxlbmRhckV2ZW50LCBDYWxlbmRhclZpZXcsIERhdGVGb3JtYXR0ZXJQYXJhbXMgfSBmcm9tICdhbmd1bGFyLWNhbGVuZGFyJztcclxuaW1wb3J0IHsgTW9udGhWaWV3RGF5IH0gZnJvbSAnY2FsZW5kYXItdXRpbHMnO1xyXG5pbXBvcnQgeyBJbmRleFNlcnZpY2UsIENhcmRTaXplIH0gZnJvbSAnLi4vaW5kZXguc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZUZvcm1hdHRlciBleHRlbmRzIENhbGVuZGFyRGF0ZUZvcm1hdHRlciB7XHJcblx0cHVibGljIG1vbnRoVmlld0NvbHVtbkhlYWRlcih7IGRhdGUsIGxvY2FsZSB9OiBEYXRlRm9ybWF0dGVyUGFyYW1zKTogc3RyaW5nIHtcclxuXHRcdC8vIGNvbnNvbGUubG9nKGZvcm1hdERhdGUoZGF0ZSwgJ0VFRUVFJywgbG9jYWxlKSk7XHJcblx0XHQvLyBzd2l0Y2ggKGRhdGUuZ2V0RGF5KCkpIHtcclxuXHRcdC8vIFx0Y2FzZSAwOlxyXG5cdFx0Ly8gXHRcdHJldHVybiAnUyc7XHJcblx0XHQvLyBcdFx0YnJlYWs7XHJcblx0XHQvLyBcdGNhc2UgMTpcclxuXHRcdC8vIFx0XHRyZXR1cm4gJ00nO1xyXG5cdFx0Ly8gXHRcdGJyZWFrO1xyXG5cdFx0Ly8gXHRjYXNlIDI6XHJcblx0XHQvLyBcdFx0cmV0dXJuICdUJztcclxuXHRcdC8vIFx0XHRicmVhaztcclxuXHRcdC8vIFx0Y2FzZSAzOlxyXG5cdFx0Ly8gXHRcdHJldHVybiAnVyc7XHJcblx0XHQvLyBcdFx0YnJlYWs7XHJcblx0XHQvLyBcdGNhc2UgNDpcclxuXHRcdC8vIFx0XHRyZXR1cm4gJ1QnO1xyXG5cdFx0Ly8gXHRcdGJyZWFrO1xyXG5cdFx0Ly8gXHRjYXNlIDU6XHJcblx0XHQvLyBcdFx0cmV0dXJuICdGJztcclxuXHRcdC8vIFx0XHRicmVhaztcclxuXHRcdC8vIFx0Y2FzZSA2OlxyXG5cdFx0Ly8gXHRcdHJldHVybiAnUyc7XHJcblx0XHQvLyBcdFx0YnJlYWs7XHJcblx0XHQvLyB9XHJcblx0XHRyZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCAnRUVFRUUnLCBsb2NhbGUpOyAvLyB1c2Ugc2hvcnQgd2VlayBkYXlzXHJcblx0fVxyXG59XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLWNhbGVuZGFyJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0cHJvdmlkZXJzOiBbXHJcblx0XHR7XHJcblx0XHRcdHByb3ZpZGU6IENhbGVuZGFyRGF0ZUZvcm1hdHRlcixcclxuXHRcdFx0dXNlQ2xhc3M6IEN1c3RvbURhdGVGb3JtYXR0ZXJcclxuXHRcdH1cclxuXHRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5jLWluZGV4LWNhbGVuZGFyJykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRuYXZOYW1lID0gJ2NhbGVuZGFyJztcclxuXHRuYXZTaXplOiBDYXJkU2l6ZTtcclxuXHJcblx0dmlldzogQ2FsZW5kYXJWaWV3ID0gQ2FsZW5kYXJWaWV3Lk1vbnRoO1xyXG5cdHZpZXdEYXRlID0gbmV3IERhdGUoKTtcclxuXHJcblx0cHVibGljIGlubmVyV2lkdGg6IGFueTtcclxuXHRtb2RhbERhdGE6IHtcclxuXHRcdGFjdGlvbjogc3RyaW5nO1xyXG5cdFx0ZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XHJcblx0fTtcclxuXHJcblx0c2hvd0RheTogTW9udGhWaWV3RGF5PGFueT47XHJcblx0aXNFZGl0ID0gZmFsc2U7XHJcblx0YWN0aXZlRGF5SXNPcGVuID0gdHJ1ZTtcclxuXHRlZGl0VGV4dDogc3RyaW5nO1xyXG5cdGRpc1g6IG51bWJlcjtcclxuXHRkaXNZOiBudW1iZXI7XHJcblx0c2hvd0RheUhpbnQgPSBmYWxzZTtcclxuXHJcblx0aXNFdmVudHNFbXB0eTogYm9vbGVhbjtcclxuXHJcblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG5cdGNsb3NlU2hvd0RheUhpbnQoKSB7XHJcblx0XHR0aGlzLnNob3dEYXlIaW50ID0gZmFsc2U7XHJcblx0fVxyXG5cdGdldCBldmVudHMoKTogQ2FsZW5kYXJFdmVudFtdIHtcclxuXHRcdGlmICh0aGlzLnN2ci51c2VyRGlhcnkpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc3ZyLnVzZXJEaWFyeS5tYXAodiA9PiAoe1xyXG5cdFx0XHRcdHN0YXJ0OiBuZXcgRGF0ZSh2LkRheSksXHJcblx0XHRcdFx0dGl0bGU6IHYuQ29udGVudFxyXG5cdFx0XHR9KSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gW107XHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgc3ZyOiBJbmRleFNlcnZpY2UpIHtcclxuXHRcdHRoaXMubmF2U2l6ZSA9IHRoaXMuc3ZyLnVzZXJTZXR0aW5nLkNhcmRzLmZpbmQoeCA9PiB4LlR5cGUgPT09IHRoaXMubmF2TmFtZSkuU2l6ZTtcclxuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMubmF2U2l6ZSk7XHJcblx0fVxyXG5cdGhhbmRsZUV2ZW50KGFjdGlvbjogc3RyaW5nLCBldmVudDogQ2FsZW5kYXJFdmVudCk6IHZvaWQge1xyXG5cdFx0Ly8gMTExO1xyXG5cdFx0Y29uc29sZS5sb2coYWN0aW9uLCBldmVudCk7XHJcblx0fVxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5zdnIuaW5pdENhbGVuZGFyKCk7XHJcblx0fVxyXG5cclxuXHQvLyDihpPljZXlh7vml6XmnJ/ml7ZcclxuXHRkYXlDbGljayhldmVudDogeyBkYXk6IE1vbnRoVmlld0RheTxhbnk+OyBzb3VyY2VFdmVudDogTW91c2VFdmVudCB9KSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZygoZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XHJcblx0XHR0aGlzLnNob3dEYXkgPSBldmVudC5kYXk7XHJcblx0XHR0aGlzLmlzRWRpdCA9ICF0aGlzLnNob3dEYXkuaXNQYXN0ICYmIHRoaXMuc2hvd0RheS5ldmVudHMubGVuZ3RoID09PSAwO1xyXG5cdFx0dGhpcy5zaG93RGF5SGludCA9IHRydWU7IC8vIOaXpeacn+Wkh+azqOaYr+WQpuaYvuekulxyXG5cdFx0Ly8g4oaTIOiOt+WPluWkh+azqOS/oeaBr+agj+eahOWdkOagh++8iOWNsyDngrnlh7vlhYPntKDlnKjlsY/luZXkuK3nmoTkvY3nva7vvIlcclxuXHRcdGNvbnN0IHBvc0NpcmNsZSA9IChldmVudC5zb3VyY2VFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0Y29uc3QgZGlzdGFuY2VXaWR0aCA9IHBvc0NpcmNsZS53aWR0aDtcclxuXHRcdGNvbnN0IGRpc3RhbmNlUmlnaHQgPSBwb3NDaXJjbGUucmlnaHQ7XHJcblx0XHQvLyDlpoLmnpzlj7Pkvqfot53nprvkuI3lpJ/vvIzliJnlvoDpgInmi6nlt6bkvqfmmL7npLpcclxuXHRcdGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIGRpc3RhbmNlUmlnaHQgPCAzMjApIHtcclxuXHRcdFx0dGhpcy5kaXNYID0gcG9zQ2lyY2xlLmxlZnQgLSAzMjAgKyAzMjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZGlzWCA9IHBvc0NpcmNsZS5sZWZ0ICsgZGlzdGFuY2VXaWR0aCAtIDMyO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5kaXNZID0gcG9zQ2lyY2xlLmJvdHRvbTtcclxuXHJcblx0XHRpZiAoZXZlbnQuZGF5LmV2ZW50cyAmJiBldmVudC5kYXkuZXZlbnRzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dGhpcy5lZGl0VGV4dCA9IGV2ZW50LmRheS5ldmVudHNbMF0udGl0bGU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmVkaXRUZXh0ID0gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coKHRoaXMuaW5uZXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoKSk7XHJcblx0XHQvLyBjb25zb2xlLmxvZygnc2hvd0RheTonLCB0aGlzLnNob3dEYXkpO1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJy0tLScpO1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJ3Nob3dEYXk6JywgdGhpcy5zaG93RGF5LmlzUGFzdCk7XHJcblx0fVxyXG5cdGVkaXRPaygpIHtcclxuXHRcdHRoaXMuc3ZyLnVwZGF0ZVVzZXJEaWFyeSh0aGlzLnNob3dEYXkuZGF0ZSwgdGhpcy5lZGl0VGV4dCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0dGhpcy5zaG93RGF5SGludCA9IGZhbHNlO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdGVkaXRDYW5jZWwoKSB7XHJcblx0XHR0aGlzLmVkaXRUZXh0ID09PSAnJyA/ICh0aGlzLnNob3dEYXlIaW50ID0gZmFsc2UpIDogKHRoaXMuaXNFZGl0ID0gZmFsc2UpO1xyXG5cdH1cclxuXHRyZW1vdmVFdmVudHMoKSB7XHJcblx0XHR0aGlzLnN2ci5yZW1vdmVVc2VyRGlhcnkodGhpcy5zaG93RGF5LmRhdGUpLnN1YnNjcmliZSgoKSA9PiB7XHJcblx0XHRcdHRoaXMuc2hvd0RheUhpbnQgPSBmYWxzZTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iXX0=